
     j|                    N   d Z ddl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                  j                  j                  Z ee      ej                  v r!ej                  j!                   ee             ej                  j#                  d ee             ddlmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& ddl'm(Z( ddl)m*Z* ddl+m,Z,m-Z- dd	l'm.Z. dd
l/m0Z0 ddl1m2Z2  ee
      j                  dz  dz  Z3d.dZ4d/dZ5h dZ6d Z7d Z8d Z9d Z:d Z;d Z<d Z=d Z>d Z?d Z@d ZA e	j                  d      d        ZCd ZDd  ZEd! ZFd" ZGd# ZHd$ ZId% ZJd& ZKd' ZLd( ZMd) ZNd* ZOd0d+ZPd, ZQeRd-k(  r ej                   eP              yy)1u   task-2515 e2e auto-merge replay harness — 9 PR × 12 verifications.
회장 명시: 본 task = end-to-end 검증 + replay harness (신규 기능 X).
    )annotationsN)Path)AUTO_MERGE_ALLOWEDAUTO_MERGE_SUCCESSBLOCKED_WITH_REASONDIFF_CONTAMINATION_REPLACEMENTGEMINI_UNRESOLVED_BLOCKCRITICAL_FORBIDDEN_PATH CRITICAL_DIFF_REPLACEMENT_FAILEDCRITICAL_GEMINI_SCOPE_EXPANSIONCRITICAL_BLOCK_OVERRIDECRITICAL_DEPENDENCY_CYCLECRITICAL_REPLACEMENT_FAILEDCRITICAL_POST_MERGE_SMOKEExecutorContextTaskSpecevaluate_prverify_head_lock_then_mergecompare_effective_diffdetect_forbidden_pathscheck_predecessor_mergedrecheck_following_prs)ReplacementResult)	triage_pr)PostMergeSmokeRunSmokeStatus)SmokeResult)process_eventReplacementPRRunnerfixtureszauto_merge_replay_2515.jsonc                 T    t        j                  t        j                  d            S )Nutf-8encoding)jsonloadsFIXTURE_PATH	read_text     @/home/jay/workspace/tests/e2e/test_auto_merge_e2e_replay_2515.py_load_fixturesr-   .   s    ::l,,g,>??r+   c                4    t        j                  g | ||      S )N)args
returncodestdoutstderr)
subprocessCompletedProcess)r0   r1   r2   s      r,   _cpr5   2   s    &&B:f]cddr+   >   -f--admin--force--no-verifycherry-pick--force-with-leasec                *     g d fd	}|_         |S )uZ   시나리오 fixture로부터 fake subprocess runner 합성. forbidden flag 호출 차단.c           	         	j                  t               ||d       t        D ]#  t        fd D              sJ d d          d v r!d v rt	        
j                  dd      d	
      S 
j                  d      xs g }|r4t         fd|d d D              rt	        
j                  dd      d
      S 
j                  d      xs g D ]  }t        |d         }| v sd v s|j                  dd      |j                  dd      d|j                  dg       D cg c]  }d|i c}d}t	        dt        j                  |      
      c S  t	               S c c}w )N)r/   cwdtimeoutc              3  \   K   | ]#  }|k(  xs |j                  d d      d   k(   % yw)=   r   N)split).0argtoks     r,   	<genexpr>z4_make_fake_runner.<locals>.runner.<locals>.<genexpr>B   s:       s
9ciiQ/2c99s   ),zFORBIDDEN_TOKEN detected: z in mergez--squashmerge_runner_returncoder   merged)r0   r1   smoke_commandc              3  &   K   | ]  }|v  
 y wNr*   )rD   tr/   s     r,   rG   z4_make_fake_runner.<locals>.runner.<locals>.<genexpr>K   s     0Aa4i0s   rB   smoke_runner_returncodezsmoke outputfollowing_queue	pr_numberz--jsonmergeStateStatusCLEAN
headRefOid maineffective_filespath)rR   rT   baseRefNamefiles)
appendlistFORBIDDEN_TOKENSanyr5   getallstrr&   dumps)r/   r>   r?   scfppnppayloadrF   callsscenarios   `       @r,   runnerz!_make_fake_runner.<locals>.runner>   st   d4jIJ# 	<C   < ,C5TF;< 	< d?zT1(,,/H!"LU]^^\\/*0b#0BQ00(,,/H!"LUcdd,,017R 		EBR_%BTzh$.(*/A7(K"$&&r":#)3566:KR3PQavqkQ	 a

70CDD		E u Rs   %E")N<   )rh   )ri   rj   rh   s   ` @r,   _make_fake_runnerrl   :   s    E8 FLMr+   c                   t        | d   t        | d         dt        | j                  dg             | j                  dd      | j                  dd      | j                  d	d
      | j                  dd      | j                  d      	      S )Ntask_idexpected_filesauto_merge_e2e_replay
dependencyparallel_policyserial_onlymerge_queue_positionrB   stale_recheck_requiredTcherry_pick_allowedFrK   )	rn   ro   	risk_arearq   rr   rt   ru   rv   rK   )r   r\   r_   ss    r,   _make_task_specrz   ^   s    )A./0)lB/0/?UU#91= uu%=tDEE"7?eeO,
 
r+   c                d      d   }|dk(  rt        |d      S |dk(  r G  fdd      } |       S y)	u6  시나리오 expected_replacement_used에 맞춰 ReplacementPRRunner 또는 fake runner 반환.
    PR57_contamination_replacement → ReplacementPRRunner(dry_run=True) (success=True 합성).
    critical_diff_contamination_replacement_failed → fake runner returning success=False.
    그 외 → None.
    idPR57_contamination_replacementT)rj   dry_run.critical_diff_contamination_replacement_failedc                      e Zd Zd fd	Zy)-_make_replacement_runner.<locals>._FailRunnerNc           
     p    t        |d d|rt        |j                        ng t        d         g dd      S )NTrW   F9REPLACEMENT_PR_AUTO_CREATION_FAILED_FOR_CONTAMINATED_DIFF)	source_prreplacement_proriginal_pr_preservedro   effective_diff_filesforbidden_pathssuccessfailure_reason)r   r\   ro   )selfrQ   	task_specry   s      r,   executez5_make_replacement_runner.<locals>._FailRunner.executew   sB    ('*.EN4	(@(@#ATV)-a0A.B)C$&!#^ r+   rM   )__name__
__module____qualname__r   rx   s   r,   _FailRunnerr   v   s    	r+   r   Nr   )ry   rj   sidr   s   `   r,   _make_replacement_runnerr   l   sD     D'C
.."&$??
>>
	 
	 }r+   c                      j                  dd       j                  d      xs g rdj                        nd fd}|S )u   task-2514 W1 circular import으로 run_pm_smoke_v2 가 None이라 직접 envelope 합성 fn 주입.

    fixture 의 smoke_runner_returncode 에 따라 PASS/FAIL envelope 반환.
    rO   r   rK    rU   c                $   
dk(  rDt        	ddddd       }t        |xs dd   t        j                  |dt	              dd d|	
      S t        	d
dd
d
       }t        |xs dd   t        j
                  |dt	              dd d|	
      S )Nr   TrU   )commandpassed	exit_codestdout_tailstderr_tailr   zfixture-merge-sharn   d   F)
merge_commitrn   statussmoke_resultduration_msrK   allow_continuation
escalationstaler~   zsmoke fail simulatedEXIT_)r   r   r   PASSr\   FAIL)	task_filer   r~   rj   rQ   skip_stale_check_kwsrcmdcmd_strrcri   s           r,   _envelope_fnz-_make_smoke_envelope_fn.<locals>._envelope_fn   s    7BtB %)@-@ +"''"3i#'  ER(>"2$<

 !%<)<Y'##s)$
 	
r+   )r_   join)ri   r   r   r   r   s   ` @@@r,   _make_smoke_envelope_fnr      sH    
 
/	3B
,,
'
-2C"chhsmG"
F r+   c                $    g fd}|_         |S )u   ctx.triage_fn 으로 주입할 spy. evaluate_pr W3 호출 여부를 외부에서 관찰 가능.

    실제 triage_pr 을 위임 호출. wiring 활성화 검증용.
    c           
     d    j                  | t        |      |d       t        | |||||||      S )N)rQ   thread_countrn   )r[   lenr   )	rQ   threadspr_head_shafix_commitsro   r   applyrn   observeds	           r,   spyz_make_triage_spy.<locals>.spy   sB    "L
 	
 w[OUG
 	
r+   r   ri   r   r   s     @r,   _make_triage_spyr      s    
 H

 CLJr+   c                (     g  fd}|_         |S )u   ctx.reporter_hook 으로 주입할 spy. evaluate_pr emit_critical_escalation 활성 검증.

    실제 process_event 호출 후 decision.escalations 에 결과를 직접 push.
    W1 circular import 으로 default report_critical_event=None 이지만, hook 명시 주입 시 작동.
    c                $   |j                   |j                  | t        d         d}t        d   d   | d|ddd      }j	                  | |d	       t        |d
      r|j                  g |_        |j                  j	                  |       y )NrW   )decisionreasoncritical_coderW   rn   rQ   e2e_reporter_hook_spyrn   rQ   
event_typesourceevidenceTno_auditr~   )coderesultescalations)r   r   r\   r   r[   hasattrr   )r   r   r   r   r   ri   s       r,   r   z$_make_reporter_hook_spy.<locals>.spy   s     ))oo!#H->$?@	
 #I.%k2"1$ 

 	89x/83G3G3O#%H ##F+r+   r   r   s   ` @r,   _make_reporter_hook_spyr      s     H,, CLJr+   c                b   | j                  d      rt        |       nd }| j                  d      dk(  rt        |       nd }| j                  d      rt        |       nd }t	        || j                  d      d| j                  dd      t        | |      || j                  d      xs d | j                  d      xs d | j                  d	      | j                  d
      rd nd ||      }|t        t              |_        | j                  d      rt        | d         |_
        ||_        ||_        |S )Ntriage_threadsexpected_classificationcriticalrK   Tfixture_main_shazfixture-main-shar   r   main_log_grep_returns_truec                     yNTr*   _ts    r,   <lambda>z(_make_executor_context.<locals>.<lambda>       r+   )rj   rK   r   r   replacement_runner	triage_fnr   triage_fix_commitstriage_pr_head_shamain_log_grepreporter_hooksmoke_envelope_fnrP   )r_   r   r   r   r   r   r   __file__r   r\   rP   
triage_spyreporter_spy)ry   rj   r   r   smoke_env_fnctxs         r,   _make_executor_contextr      s   ().>(?!!$TJ127P1QU_1_*1-eiL121G*1-TL
eeO,13EF3Av>uu-.6$55/7455/+,551M+NTX"&C Xuu"1%6#78CN#CJr+   c                @    t         t        t        t        t        d|    S )Nr   r   r   r   r	   r   names    r,   _resolve_expected_decisionr   	  s%    002*H#:  r+   c                Z    | y t         t        t        t        t        t
        t        d|    S )Nr
   r   r   r   r   r   r   r   r   s    r,   _resolve_critical_coder     s3    |#:,L+J#:%>'B%>  r+   c           
     $    t               }t               }t         |      }t         d   | d   t	         d          d    d    d   |      } j                  d      r)|j                  t        k(  rt        | d   | fd	d
      }||||fS )u_   evaluate_pr → (필요 시) verify_head_lock_then_merge 호출 → final QueueDecision 반환.rQ   r   rW   merge_stateci_stategemini_state)rQ   r   r   rW   r   r   r   r   verify_mergec                    d   S )Nr   r*   )_nri   s    r,   r   z_run_pipeline.<locals>.<lambda>5  s    h}.E r+   F)r   rQ   r   fetch_pr_head_at_merger~   )	rl   rz   r   r   r\   r_   r   r   r   )ri   rj   specr   r   s   `    r,   _run_pipeliner   !  s    x(F8$D
 6
2C;']+X&789]+*%n-	H ||N#(9(9=O(O.{+#E
 S&$&&r+   c                   | d   }| j                  d      rd nd}t        | j                  d      xs g ||      \  }}|du r|g k(  sJ | d|        t        | d	   | d
         \  }	}
}|	t        | d         k(  sJ | d|	 d|
 d| d| d    	       t	        | d	   | d
         }t        |      t        | d         k(  sJ | d| d| d           |j                  t        | d         k(  sJ | d|j                   d| d           t        |dd      }| j                  d      rq|
J | d       t        |j                        dk(  sJ | dt        |j                                |j                  d   d   | d   k(  s"J | d|j                          |
J | d       | j                  d      xs g }|rt        | d   | d   xs g | d    | j                  d!      xs g t        | d
         g d"| d#   $      }|j                  D cg c]  }|j                  j                   }}||k(  sJ | d%| d|        | j                  d&      }| j                  d'd"      }| j                  d(d"      }||j                  xs |j                   }|t        |      k(  s&J | d)|j                   d*|j                    d|        |j"                  t        |      k(  sJ | d+|j"                   d|        |rb|j                   t        |      k(  sJJ | d,|j                    d|        |j"                  t        |      k(  sJ | d-|j"                   d|        t%        | d.         }|j&                  |k(  sJ | d/|j&                   d|        t)        | j                  d0            }|j*                  |k(  sJ | d1|j*                   d|        | j                  d2      }||j,                  |k(  sJ | d3|j,                   d|        |j.                  J | d4|j,                          |j.                  j                  d5      |k(  s%J | d6|j.                  j                  d5              |d7k(  }|j.                  j                  d8      |u sYJ | d9|j.                  j                  d8       d|        |j,                  d:k(  s"|j.                  J | d;|j.                          | j                  d<      xs g }| j                  d=      xs g }|r@t1        ||      }t        |      t        |      k(  s!J | d>t        |       dt        |              t3        ||      D ]d  \  }}|j5                         D ]L  \  }} |j                  |      | k(  rJ | d?|j                  d       d@| dA|j                  |       d|  	        f | j                  dB      r|j&                  t6        k(  r|j8                  }!|!rt        |!      dk\  sJ | dC|!        |!D "ch c]  }"|"j                  d       }#}"|D ]  }$|$d   |#v rJ | dD|$d    dE        n1|j8                  g k(  s"|j8                  J | dF|j8                          | j                  dG      }%| dH   }&t        |dId      }'|&dJk(  r|'
J | dK       t        |'j                        dk\  sJ | dLt        |'j                                |'j                  d   }(|(dM   dN   dJk(  sJ | dO|(dM   dN           |(dM   dP   
J | dQ       |(dM   dR   |%k(  sJ | dS|(dM   dR    d|%        |j:                  rt        |j:                        dk\  sJ | dT|j:                          |'7t        |'j                        dk(  sJ | dUt        |'j                                t=        | d#   | d   dVdWi dXddY      })|)dN   dZk(  sJ | d[|)dN           |)dP   
J | d\       |&dZk(  rE|j*                  J | d]|j*                          |j>                  J | d^|j>                          y|j*                  |j>                  
J | d_       yyc c}w c c}"w )`u   12 항목을 순서대로 검증. 모든 assertion이 PASS여야 함.

    ctx 는 spy(triage_spy/reporter_spy) 관찰 + smoke_envelope_fn 활성화 검증 시 사용.
    _spec 은 호출 측 signature 호환 (직접 참조 X).
    r|   r   c                     yr   r*   r   s    r,   r   z"_verify_12_items.<locals>.<lambda>D  r   r+   Nrq   )r   Tu     §1 queue head failed: pending=rW   ro   expected_diff_equalu    §2 diff mismatch: diff_ok=z extra=z	 missing=z expected_equal=expected_forbidden_countu    §3 forbidden mismatch: got=z expected_count=expected_replacement_usedu$    §4 replacement_used mismatch: got=z
 expected=r   r   u5    §5 triage_spy must be injected for triage scenariosrB   u1    §5 triage_fn must be invoked exactly once, got r   rQ   u#    §5 triage_fn pr_number mismatch: u'    §5 no triage scenario but spy presentexpected_triage_verdictsr   r   Frn   )rQ   r   r   r   ro   r   r   rn   u    §6 verdict mismatch: actual=expected_review_gate_passedfallback_review_used_expectedfallback_review_passed_expectedu&    §7 review_gate_passed mismatch: got=z
 fallback=u(    §7 fallback_review_used mismatch: got=u*    §7 fallback_review_passed mismatch: got=u*    §7 N/A path fallback_used mismatch: got=expected_decisionu    §8 decision mismatch: got=expected_critical_codeu!    §8 critical_code mismatch: got=expected_smoke_statusu     §9 smoke_status mismatch: got=uK    §9 smoke_envelope must be populated when verify_merge=true; smoke_status=r   u#    §9 envelope status mismatch: got=r   r   u/    §9 envelope allow_continuation mismatch: got=rU   uK    §9 envelope must remain unpopulated for non-smoke scenario, got envelope=expected_following_statesrP   u$    §10 following count mismatch: got=u    §10 following PR#z field z: got=r   uP    §10 verify_head_lock_then_merge must populate decision.fixture_pr_replay, got u	    §10 PR#z( missing from decision.fixture_pr_replayu4    §10 N/A path expects empty fixture_pr_replay, got expected_escalation_typer   r   r   u(    §11 reporter_hook spy must be injectedu>    §11 reporter_hook must be called for critical scenario, got r   classificationu#    §11 spy classification mismatch: packetu    §11 packet must be setescalation_typeu$    §11 escalation_type mismatch: got=u>    §11 decision.escalations must contain at least 1 entry, got u?    §11 auto-handled scenario must not invoke reporter_hook, got AUTO_HANDLED_DUMMY_EVENT
e2e_replayr   r   auto-handledu!    §11 expected auto-handled, got u*    §11 packet must be None for auto-handledu7    §12 critical_code must be None for auto-handled, got u=    §12 critical_escalation must be None for auto-handled, got uE    §12 critical scenario must set critical_code or critical_escalation) r_   r   r   boolr   r   intreplacement_usedgetattrr   r   r\   r   verdictvaluereview_gate_passedfallback_review_passedfallback_review_usedr   r   r   r   smoke_statussmoke_enveloper   zipitemsr   fixture_pr_replayr   r   critical_escalation)*ri   r   r   rj   _specr   	main_grephead_okpendingdiff_okextramissing	forbiddenr   expected_verdictsreportoactualexpected_rgpexpected_fb_usedexpected_fb_passed
actual_rgpexpected_decexpected_critexpected_smokeexpected_allowexpected_statesfqstatess_actual
s_expectedkvreplay_statesry   recorded_pr_numbersefexpected_escexpected_clsr   	first_obsr   s*                                             r,   _verify_12_itemsr>  ;  s    4.C &.\\2N%OUYI/\"(b&	GW d?w"}_5UV]U^.__, 5"#X.>%?GUG d8$9:;; %+G9GE7)G9Tdem  oD  fE  eF  	G;
 '"#X.>%?I y>S*D!EFF %,YK7GQkHlGmnF
 $$X6Q-R(SS %3H4M4M3NjYab}Y~X  	AS
 lD1J||$%%d#.c'dd%:&&'1, 	
eDSI\I\E]D^_	
, ""1%k2h{6KK 	
e6z7J7J6KL	
K
 ! 	
e:;	
!
 !%?@FB{+-.4" / ]39r)9 :;Y'	
 ,2>>:a!))//::** 	
e1&DUCVW	
* << =>L||$CUK!&GO00SH4S4S
T,// 	
e9(:U:U9VV`ai  bA  bA  aB  BL  MY  LZ  [	
/ ,,5E0FF 	
e;H<Y<Y;ZZdeudvw	
F 22d;M6NN %A(BaBaAbblm  mA  BN ,,5E0FF 	
e=h>[>[=\\fgwfxy	
F
 .h7J.KLL, %+H,=,=+>jW, +8<<8P+QRM!!]2 %01G1G0H
S`Rab2
 \\"9:N!$$6 	
e3H4I4I3J*UcTde	
6
 &&2 	
e $1124	
2 &&**84F 	
e6x7N7N7R7RS[7\6]^	
F )F2&&**+?@NR 	
e **../CDEZP^O_a	
R $$*h.E.E.M 	
e^_g_v_v^wx	
M
 ll#>?E2O	'	(	.BB	&r626{c/22 	
e7F}JsSbOcNde	
2 %($@ 	 Hj"((* 1||A!+ e.x||K/H.IQRPSSYZbZfZfghZiYjjtuvtwx+	 <<'H,=,=AS,S$66M S%71%< %ghugvw< @M"M!155#5"M"M +*== e9R_$55]^= ))R/83M3M3U 	
eGHbHbGcd	
U
 << :;L56L35Lz!'YC50X)YY'<(()Q. 	
eQRUVbVkVkRlQmn	
. !))!,	"#34
B 	
e6y7JK[7\6]^	
B "8,8ZSEAY:ZZ8"#45E 	
e7	(8KL]8^7__ijviwx	
E ##H,@,@(AQ(F 	
eQRZRfRfQgh	
F
 #|,,-2 %VWZ[g[p[pWqVrs2  +(;:O5 4	
 &'>9 	
e4V<L5M4NO	
9 h'[C50Z)[[' ~%%%- 	
eJ8KaKaJbc	
- ++3 	
ePQYQmQmPno	
3
 %%1X5Q5Q5] 	
eXY	
]5]1g ;l #Ns   a3a8module)scopec                     t               S rM   )r-   r*   r+   r,   replayrB    s    r+   c                D    | d   D ]  }|d   |k(  s|c S  t        |      )N	scenariosr|   )KeyError)rB  r   ry   s      r,   _scenario_by_idrF    s2    K  T7c>H 3-r+   c                Z    t        | d      }t        |      \  }}}}t        |||||       y )NPR55_clean_auto_mergerF  r   r>  rB  ry   r   r   rj   r   s         r,   test_e2e_pr55_clean_auto_mergerK  #  s2     78A"/"2Hc64Q#vt4r+   c                Z    t        | d      }t        |      \  }}}}t        |||||       y )NPR57_false_positive_triagerI  rJ  s         r,   #test_e2e_pr57_false_positive_triagerN  )  2     <=A"/"2Hc64Q#vt4r+   c                Z    t        | d      }t        |      \  }}}}t        |||||       y )NPR58_gemini_quota_fallbackrI  rJ  s         r,   #test_e2e_pr58_gemini_quota_fallbackrR  /  rO  r+   c                Z    t        | d      }t        |      \  }}}}t        |||||       y )NPR64_smoke_passrI  rJ  s         r,   test_e2e_pr64_smoke_passrU  5  s2     12A"/"2Hc64Q#vt4r+   c                Z    t        | d      }t        |      \  }}}}t        |||||       y )Nr}   rI  rJ  s         r,   'test_e2e_pr57_contamination_replacementrW  ;  s2     @AA"/"2Hc64Q#vt4r+   c                Z    t        | d      }t        |      \  }}}}t        |||||       y )NPR61_review_thread_blockerrI  rJ  s         r,   #test_e2e_pr61_review_thread_blockerrZ  A  rO  r+   c                Z    t        | d      }t        |      \  }}}}t        |||||       y )Ncritical_smoke_failurerI  rJ  s         r,   test_e2e_critical_smoke_failurer]  G  s2     89A"/"2Hc64Q#vt4r+   c                Z    t        | d      }t        |      \  }}}}t        |||||       y )Ncritical_forbidden_pathrI  rJ  s         r,    test_e2e_critical_forbidden_pathr`  M  s2     9:A"/"2Hc64Q#vt4r+   c                Z    t        | d      }t        |      \  }}}}t        |||||       y )Nr   rI  rJ  s         r,   7test_e2e_critical_diff_contamination_replacement_failedrb  S  s2     PQA"/"2Hc64Q#vt4r+   c                   | }t        ddddddgid|dd	
      }|d   dk(  sJ |d   d	u sJ |dz  dz  dz  }|j                         s
J d|        |j                  d      j                         }|sJ d       t	        j
                  |j                         d         }|d   dk(  sJ |d   dk(  sJ |d   dk(  sJ y)u_   Critical 시나리오에서 process_event(no_audit=False) 호출 시 audit JSONL 실재 박제.	task-2515i'  FORBIDDEN_PATH_INTRUSIONtest_audit_appendrW   z.github/workflows/foo.ymlr   FTworkspace_rootr   r~   r  r   audit_appendedmemoryorchestration-auditcritical-escalations.jsonlaudit JSONL must exist at r#   r$   (audit JSONL must contain at least 1 linern   r
  Nr   existsr)   stripr&   r'   
splitlinestmp_path
audit_rootr   	audit_lograwlasts         r,   'test_audit_append_critical_writes_jsonlrz  [  s   J"4)*-H,IJ	
 "F "#z111"#t+++X%(==@\\IG!;I;GG


w

/
5
5
7C:::3::cnn&r*+D	?k))) !Z///!"&@@@@r+   c                x   | }t        ddddi d|dd      }|d	   d
k(  sJ |d   J |d   du sJ |dz  dz  dz  }|j                         sJ d| d       |j                  d      j                         }|sJ d       t	        j
                  |j                         d         }|d   dk(  sJ |d	   d
k(  sJ y)ua   auto-handled 시나리오에서 process_event(no_audit=False) 호출 시 audit-only JSONL 박제.rd  i'  r  rf  r   FTrg  r  r  r	  Nri  rj  rk  rl  rm  z (auto-handled append)r#   r$   rn  ro  rn   rp  rt  s         r,   +test_audit_append_auto_handled_writes_jsonlr|  v  s   J"4)	
 "F "#~555(###"#t+++X%(==@\\I]!;I;F\]]


w

/
5
5
7C:::3::cnn&r*+D	?k))) !^333r+   c                   t        j                  d      }|j                  dt        d       |j                  ddd	       |j	                  |       }t               }|j                  r0|d
   D ]'  }t        d|d   dd|d   dd|d    d|d           ) y|j                  r|d
   D ]{  }|d   |j                  k(  st        |      \  }}}}t        t        j                  |j                         ddt                     t        |||||       t        d|d    d        y t        d|j                   d       y|j                          y)Nztask-2515 e2e replay harness)descriptionz--pru   단일 PR 번호 replay)typehelpz--list
store_trueu   9 시나리오 목록)actionr  rD  z  PR#rQ   z>3z  r|   z<55z  [categoryu   ]  → r  r      F)indentensure_asciidefaultz
[PASS] u    — 12/12 verificationszPR #z not found in fixtures)argparseArgumentParseradd_argumentr  
parse_argsr-   r\   printprr   r&   rb   to_dictra   r>  
print_help)	argvparserr/   r!   ry   r   r   rj   r   s	            r,   	_cli_mainr    sc   $$1OPF
S/HI
<STT"DHyy+& 	oAE!K.,Bqwsm3q}oWUVWjUkTlmn	oww+& 	A~(.;A.>+#vtdjj!1!1!3AE[^_` Hc64@	!D'*BCD	 	TWWI345
r+   c                    ddl } dD ]&  }|t        j                  v st        j                  |= ( | j                  d      }|j                  du sJ d       |j
                  J |j                  J |j                  J |j                  J y)u   task-2516: ctx hook 미주입 상태에서 default runtime path가 W1 wiring chain
    (_WIRING_AVAILABLE=True 경로의 ReplacementPRRunner / triage_pr / run_pm_smoke_v2 등)을
    실제로 사용하는지 검증. circular import fix 회귀 방지.
    r   N)utils.merge_queue_executorzutils.replacement_pr_runnerr  Tu,   W1 wiring 비활성 — task-2516 fix 회귀)		importlibsysmodulesimport_module_WIRING_AVAILABLEr    r   run_pm_smoke_v2report_critical_event)r  mod_namemqes      r,   +test_default_runtime_path_no_ctx_hooks_2516r    s    
 Q &s{{"H%& 
!
!">
?C  D(X*XX( ""...==$$$***$$000r+   __main__)returndict)r   rU   rU   rM   )T__doc__
__future__r   r  r&   r3   r  pathlibr   pytestr   resolveparent	WORKSPACEra   rX   removeinsertutils.merge_queue_executorr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   utils.automation_contractsr   utils.auto_gemini_triager   utils.post_merge_smoke_runnerr   r   r   "utils.critical_escalation_reporterr   utils.replacement_pr_runnerr    r(   r-   r5   r]   rl   rz   r   r   r   r   r   r   r   r   r>  fixturerB  rF  rK  rN  rR  rU  rW  rZ  r]  r`  rb  rz  r|  r  r  r   exitr*   r+   r,   <module>r     s   #    
  N""$++2299	y>SXXHHOOC	N# 3y> "      9 = ;H~$$z14QQ@e
 d !H2,^,D:'4W
x h  555555555A64:01( zCHHY[ r+   