
    4j3                        d Z ddlZddlmc mZ ddlZddl	Z	ddl
Z
ddlZddlmZ ddlZ ee      j!                         j"                  d   Zedz  dz  Zedz  dz  d	z  Zd
 Z ej,                  d      d        Z ej,                  d      d        Zd Zej4                  j7                  d ed            d        Zd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&e'dk(  r% ejP                   ejR                  edg             yy)u$  task-2609 Track F regression — mock-only, FAIL on any live write.

Drives scripts/run_auto_pr_merge_readiness_dry_run_2609.py purely against
the mock fixture. The suite hard-fails if the engine exposes any GitHub /
git mutation surface (no PR open, no branch/push, no merge, no raw token).
    N)Path   scriptsz+run_auto_pr_merge_readiness_dry_run_2609.pymemoryfixturesztask-2609.critical7-cases.jsonc                      t         j                  j                  dt              } t         j                  j	                  |       }| j
                  j                  |       |S )Nt2609_engine)	importlibutilspec_from_file_locationENTRYmodule_from_specloaderexec_module)specmods     Q/home/jay/workspace/tests/regression/test_auto_pr_merge_readiness_dry_run_2609.py_load_enginer      sC    >>11.%HD
..
)
)$
/CKKC J    module)scopec                      t               S N)r    r   r   enginer      s
    >r   c                  Z    t        j                  t        j                  d            d   S )Nutf-8encodingcases)jsonloadsFIXTURE	read_textr   r   r   r    r        s$    ::g'''9:7CCr   c                 $   t        |       }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               nddt        j                         v st        j
                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )	N   ==)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenr    )py0py1py3py6zassert %(py8)spy8)	r)   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation)r    @py_assert2@py_assert5@py_assert4@py_format7@py_format9s         r   test_fixture_has_15_casesr<   %   s    u:::33uu:r   idxr&   c                    ||   }| j                  |      }|d   }|d   }||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j                  d|d    d|d    d	|d    d
|d    d	      dz   d|iz  }	t        t        j                  |	            d x}x}}|d   }|d   }||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j                  d|d    d|d    d	|d          dz   d|iz  }	t        t        j                  |	            d x}x}}|d   }d}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            d x}x}}y )Nverdictexpected_verdictr'   z%(py1)s == %(py4)sr+   py4zcase namez: got z
 expected z (reasons)z
>assert %(py6)sr-   critical7_typeexpected_critical7z: critical7 matchTisz%(py1)s is %(py4)sassert %(py6)s)
judge_caser/   r0   r4   _format_assertmsgr5   r6   )
r   r    r=   caseout@py_assert0@py_assert3r7   @py_format5r:   s
             r   %test_each_regression_matches_expectedrU   )   s   :D


D
!Cy> CT"45 C>55 C1B1BC>5 C C9B  C C9B 6 C C1B1B V~VC	N#3 4+,-RI/?q	BC C C/B/BC C   2D)=$> 2 $>> 2 1 12 $> 2 2(1	 ! 2 2(1	 %? 2 2 1 1 V~\#.>*?)@ A-./	12 2 2112 2 w<4<4<4<4r   c                 H   t        d |D              }| j                  |      }|d   }d}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|d	   }d
}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )Nc              3   2   K   | ]  }|d    dk(  s|  yw)rD   
all14_trueNr   ).0xs     r   	<genexpr>z;test_all14_true_is_merge_candidate_ready.<locals>.<genexpr>7   s     ;16l!:Q;s   conditions_all_trueTrJ   rL   rB   rM   r-   r?   MERGE_CANDIDATE_READYr'   rA   nextrN   r/   r0   r4   r5   r6   )	r   r    crQ   rR   rS   r7   rT   r:   s	            r   (test_all14_true_is_merge_candidate_readyra   6   s    ;;;A


A
C$%--%----%---%----------y>444>44444>4444>44444444444r   c                 Z   dD ]  t        fd|D              }| j                  |      d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}x}} y )
N)head_sha_mismatchowner_pat_detectedc              3   4   K   | ]  }|d    k(  s|  ywrD   Nr   rY   rZ   rD   s     r   r[   z6test_security_cases_are_fail_closed.<locals>.<genexpr>?        7qQvY$%67   r?   FAIL_CLOSEDr'   rA   rB   rM   r-   r^   )	r   r    r`   rR   rS   r7   rT   r:   rD   s	           @r   #test_security_cases_are_fail_closedrk   =   s    ; @7E77  #I.?-?.-????.-???.???-???????@r   c                    ddddd}|j                         D ]T  \  }t        fd|D              }| j                  |      }|d   }d}||k(  }|slt        j                  d	|fd
||f      t        j
                  |      t        j
                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}}|d   }||k(  }|st        j                  d	|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd|iz  }t        t        j                  |            d x}}W y )NFORBIDDEN_PATH_INTRUSION)DEPENDENCY_CYCLE_OR_SERIAL_ONLY_COLLISIONREPLACEMENT_PR_FAILEDPOST_MERGE_SMOKE_FAILED)forbidden_path_gt_zerodependency_cyclereplacement_pr_failurepost_merge_smoke_failurec              3   4   K   | ]  }|d    k(  s|  ywrf   r   rg   s     r   r[   z2test_critical7_cases_classified.<locals>.<genexpr>K   rh   ri   r?   	CRITICAL7r'   rA   rB   rM   r-   rG   )z%(py1)s == %(py3)sc7r+   r,   zassert %(py5)spy5)itemsr_   rN   r/   r0   r4   r5   r6   r1   r2   r3   )r   r    expectrw   r`   rQ   rR   rS   r7   rT   r:   @py_format4@py_format6rD   s                @r   test_critical7_cases_classifiedr~   C   s   "<G"9$=	F LLN +b7E77"9~,,~,,,,~,,,~,,,,,,,,,,#$*$****$***$****************	+r   c                    | j                         }|d   }d}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            d x}x}}|d   }d}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            d x}x}}|d	   }t        |      }d
}||k(  }	|	st        j                  d|	fd||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |      dz  }
dd|
iz  }t	        t        j
                  |            d x}x}x}	}|d	   D ]_  }g }|d   }|}|r|d   }t        |      }d}||k(  }|}|s'ddt        j                  |      iz  }|j                  |       |rt        j                  dfdf      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t	        t        j
                  |            d x}x}x}x}x}x}}b y )Nall_presentTrJ   rL   rB   rM   r-   all_symbols_okmodules
   r'   )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sr)   )r*   py2rC   py7zassert %(py9)spy9sha256@   z%(py3)sr,   )z1%(py9)s
{%(py9)s = %(py5)s(%(py7)s)
} == %(py12)s)ry   r   r   py12z%(py14)spy14r   zassert %(py17)spy17)consume_modules_readonlyr/   r0   r4   r5   r6   r)   r1   r2   r3   append_format_boolop)r   reprR   rS   r7   rT   r:   @py_assert1@py_assert6r8   @py_format8@py_format10m@py_assert8@py_assert11@py_assert10r|   @py_format13@py_format15@py_format16@py_format18s                        r   .test_consume_modules_byte0_present_and_symbolsr   Q   s   

)
)
+C}%%%%%%%%%%%%%%%%%%% (D( D(((( D((( (((D(((((((9~$3~$"$"$$$$"$$$$$$3$$$3$$$~$$$$$$"$$$$$$$^ 65q{5{5{1X;5s;/525/25555{5555{555/2555555s555s555;555/5552555555555555556r   c                    | j                  ddi      }|d   }d}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd	|iz  }t	        t        j
                  |            d x}x}}d}t        j                  } ||      }||v}|s
t        j                  d
|fd||f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }	dd|	iz  }
t	        t        j
                  |
            d x}x}x}}|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd	|iz  }t	        t        j
                  |            d x}x}}|d   }d}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd	|iz  }t	        t        j
                  |            d x}x}}| j                  ddi      }|d   }d}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd	|iz  }t	        t        j
                  |            d x}x}}|d   }d}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd	|iz  }t	        t        j
                  |            d x}x}}y )NBOT_GITHUB_TOKENghs_FAKEvalue123raw_exposedFrJ   rL   rB   rM   r-   )not in)zO%(py1)s not in %(py8)s
{%(py8)s = %(py5)s
{%(py5)s = %(py3)s.dumps
}(%(py6)s)
}r!   pf)r+   r,   ry   r-   r.   zassert %(py10)spy10classified_sourceGITHUB_APP_INSTALLATION_TOKENr'   rA   is_ghs_app_tokenTghp_ownerPATrd   )redacted_token_preflightr/   r0   r4   r5   r6   r!   dumpsr1   r2   r3   )r   r   rR   rS   r7   rT   r:   r9   @py_assert7r;   @py_format11pf2s               r   test_token_preflight_never_rawr   Z   ss   		(	(*<>P)Q	RBm%%%%%%%%%%%%%%%%%%%3TZZ3Z^3^3333^333333333T333T333Z333333333333^3333333!"E&EE"&EEEEE"&EEEE"EEE&EEEEEEEE !)T)!T))))!T)))!)))T)))))))

)
)+=~*N
OC#$,,$,,,,$,,,$,,,,,,,,,,}&&&&&&&&&&&&&&&&&&&r   c                 "   | j                         }|d   }d}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            d x}x}}|d   }g }||k(  }|slt        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            d x}x}}y )Nno_live_write_surfaceTrJ   rL   rB   rM   r-   
violationsr'   rA   )assert_no_live_write_surfacer/   r0   r4   r5   r6   )r   grR   rS   r7   rT   r:   s          r   test_no_live_write_surfacer   f   s    ++-A$%--%----%---%----------\? b ?b    ?b   ?   b       r   c            	         t         j                  d      } g d}|D ]D  }| j                  } ||      }d}||k  }|st        j                  d|fd||f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      d	z  }t        j                  d
|       dz   d|iz  }t        t        j                  |            dx}x}x}}G y)zCmock-only invariant: a live PR/merge/push token implies real write.r   r   )
zgh pr mergezgh pr createz
gh pr editzgit pushz
git commitz	git mergez
git rebasez
os.system(zsubprocess.run(zsubprocess.Popen(   )<=)zK%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.count
}(%(py3)s)
} <= %(py8)ssrctok)r*   r   r,   ry   r.   z!live-write token used in engine: z
>assert %(py10)sr   N)r   r$   countr/   r0   r1   r2   r3   r4   rO   r5   r6   )	r   bannedr   r   r9   r   r   r;   r   s	            r   /test_engine_source_has_no_github_mutation_callsr   l   s    
//7/
+CDF  N yyMy~MM~"MMM~MMMMMMsMMMsMMMyMMMMMMMMMMMM~MMMMMM&Gu$MMMMMMMMNr   c                    g | j                   fd}|j                  | d|       | j                  d      }|d   d   }d}||k(  }|slt        j                  d|fd	||f      t        j
                  |      t        j
                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}|d   d   }d}||u }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}D ]  }	d}||	v }|st        j                  d|fd||	f      t        j
                  |      dt        j                         v st        j                  |	      rt        j
                  |	      nddz  }
t        j                  d|	       dz   d|
iz  }t        t        j                  |            dx}}|	j                  }d} ||      }|st        j                  |	      dz   dt        j                         v st        j                  |	      rt        j
                  |	      ndt        j
                  |      t        j
                  |      t        j
                  |      dz  }t        t        j                  |            dx}x}} y)zFRun with emit and assert every written path is task-2609.* (additive).c                 8    j                  |         | |      S r   )r   )relobjreal_wwrittens     r   spyz8test_run_emit_writes_only_allowlisted_paths.<locals>.spy}   s    sc3r   _wT)emitsummaryreal_write_or_merge_attemptsr   r'   rA   rB   rM   r-   Nowner_pat_usedFrJ   rL   z	task-2609)in)z%(py1)s in %(py3)sr   rx   znon-allowlisted write: z
>assert %(py5)sry   )zmemory/events/zmemory/reports/zN
>assert %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.startswith
}(%(py4)s)
})r*   r   rC   r-   )r   setattrrunr/   r0   r4   r5   r6   r1   r2   r3   rO   
startswith)r   monkeypatchr   rQ   rR   rS   r7   rT   r:   r   r|   r}   r   r8   r   r   s                 @@r   +test_run_emit_writes_only_allowlisted_pathsr   x   s   GYYF  c*
**$*
Cy>89>Q>9Q>>>>9Q>>>9>>>Q>>>>>>>y>*+4u4+u4444+u444+444u4444444 JB{c!BBB{cBBB{BBBBBBcBBBcBBBB%<SE#BBBBBBB~~ICI~CDIDIIcIIIIIIsIIIsIII~IIICIIIDIIIIIIJr   c                     d }|j                  t        d|       |j                  t        d|       |D ]  }| j                  |        y)zAJudging fixtures must never shell out (proves dry-run isolation).c                      t        d      )Nz,engine attempted a subprocess during dry-run)r5   )aks     r   boomz2test_subprocess_not_invoked_by_judge.<locals>.boom   s    KLLr   r   PopenN)r   
subprocessrN   )r   r    r   r   r`   s        r   $test_subprocess_not_invoked_by_judger      sK    M 
E40
GT2 !r   __main__z-q)*__doc__builtinsr1   _pytest.assertion.rewrite	assertionrewriter/   importlib.utilr
   r!   r   syspathlibr   pytest__file__resolveparents	REPO_ROOTr   r#   r   fixturer   r    r<   markparametrizerangerU   ra   rk   r~   r   r   r   r   r   r   __name__exitmainr   r   r   <module>r      s5        
  N""$,,Q/	I MM
h

+.N
N h   hD  D b	*	  +	 5@+6	'!	NJ$ zCHH[V[[(D)*+ r   