
    ?# jS_                    >   d Z ddlmZ ddlZddlZddlZddlm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 ddlmZmZ ddlmZmZ d"d
Z d#dd	ddZ!d$d%dZ"d&dZ#d Z$d Z%d Z&d Z'd Z(d Z)d Z*d Z+d Z,d Z-d Z.d Z/d Z0d Z1d Z2d Z3d Z4d  Z5d! Z6y)'u   task-2510 회귀 테스트 — replacement_pr_runner 12 케이스.
QA 담당: 모리건(Morrigan)
대상: utils/replacement_pr_runner.py
    )annotationsN)asdict)Path)ReplacementPRRunnerassert_no_cherry_pickdetect_contaminationtransplant_expected_filesassert_clean_working_treeprecheck_local_replacement_diff)ReplacementResultCriticalEscalationType)TaskSpecassert_no_forbidden_git_flags c                4    t        j                  g | ||      S )N)args
returncodestdoutstderr)
subprocessCompletedProcess)r   r   r   s      a/home/jay/workspace/.worktrees/task-2537-dev4/tests/regression/test_replacement_pr_runner_2510.pycpr   (   s    &&B:f]cdd    default_returncodedefault_stdoutc               x    g | rt        | j                               ng dfd	}t        |d       |S )u7   fake runner — args 패턴 매칭으로 응답 inject.c                    j                  t        |       ||d       dj                  d | D              	D ]  \  }}t        fd|D              s|c S  t	              S )N)r   cwdtimeout c              3  2   K   | ]  }t        |        y wNstr.0as     r   	<genexpr>z.make_runner.<locals>.runner.<locals>.<genexpr>3   s     /Q#a&/   c              3  &   K   | ]  }|v  
 y wr$    )r(   tokjoineds     r   r*   z.make_runner.<locals>.runner.<locals>.<genexpr>5   s     3S3&=3s   r   r   )appendlistjoinallr   )
r   r    r!   tokensresponser/   callsr   r   routess
        @r   runnerzmake_runner.<locals>.runner1   se    d4jIJ/$// & 	 FH3F33	  /GGr   r7   )N<   )r2   itemssetattr)returns_by_argsr   r   r9   r7   r8   s    `` @@r   make_runnerr>   ,   s>    E.=T/'')*2FH H FGU#Mr   c           
     <    t        | |xs ddgd|xs g dddd      S )	Nutils/replacement_pr_runner.py3tests/regression/test_replacement_pr_runner_2510.pyreplacement_prserial_only   TF)task_idexpected_files	risk_area
dependencyparallel_policymerge_queue_positionstale_recheck_requiredcherry_pick_allowed)r   )rE   expectedrH   s      r   	make_specrN   =   s>     
,A$
 ##%#! r   c           
     F    | |d||xs g d| d|j                  dd      dS )uQ   fake pr metadata. **_extra: positional pr_number 등 호출자 ergonomics 흡수.main[z] test fixture	pr_numberr:   )head_refhead_shabase_refrE   filestitlenumber)get)rS   rT   rE   rV   _extras        r   fake_pr_metar[   M   s;     "WI^,**["- r   c                   t               }t        |j                        t        i       }t	        |d      }dd lm} | j                  |dfd       | j                  |dfd       |j                  d|	      }t        |t              sJ |j                  d
u sJ |j                  J |j                  d
u sJ t        |j                        t              k(  sJ |j                   g k(  sJ |j"                  J y )NFr9   dry_runr   fetch_pr_metadatac                    t              S N)rV   r[   )prrrM   s     r   <lambda>z)test_t01_clean_pr_no_op.<locals>.<lambda>b   s    S[@\ r   compute_effective_diffc                    t              S r$   r2   )metard   rM   s     r   re   z)test_t01_clean_pr_no_op.<locals>.<lambda>c   s    tH~ r   r:   	task_specT)rN   r2   rF   r>   r   utils.replacement_pr_runnerreplacement_pr_runnerr<   execute
isinstancer   successrB   original_pr_preservedsortedeffective_diff_filesforbidden_pathsfailure_reason)monkeypatchspecr9   rprmodresultrM   s         @r   test_t01_clean_pr_no_opr{   [   s    ;DD''(H_F
VU
;C-02\]57UV[[t[,Ff/000>>T!!!  (((''4///&--.&2BBBB!!R'''  (((r   c                 h    ddg} | ddgz   }t        ||       }|d   du sJ d|d   v sJ d|d   v sJ y )Nr@   rA   utils/rogue_extra_module.pyzscripts/unrelated_script.shcontaminatedTextra)r   )rM   contaminated_extrarz   s      r   test_t02_contaminated_detectionr   p   sc    02ghH!%BDa$bb!"4h?F.!T)))(F7O;;;(F7O;;;r   c                   t               }t        |j                        dt        i       }t	        |d      }dd lm} | j                  |dfd       | j                  |dfd       |j                  d	|
      }|j                  du sJ |j                  J t        j                  j                  |j                  v sJ |j                  v sJ y )Nz.github/workflows/ci.ymlFr]   r   r_   c                $    t        gz         S ra   rb   )rc   rd   rM   forbidden_files     r   re   z3test_t03_forbidden_path_intrusion.<locals>.<lambda>   s    S[_m^nSn@o r   rf   c                    gz   S r$   r-   )ri   rd   rM   r   s     r   re   z3test_t03_forbidden_path_intrusion.<locals>.<lambda>   s    xSaRbGb r   r:   rj   )rN   r2   rF   r>   r   rl   rm   r<   rn   rp   ru   r   FORBIDDEN_PATH_INTRUSIONvaluert   )rv   rw   r9   rx   ry   rz   rM   r   s         @@r   !test_t03_forbidden_path_intrusionr   z   s    ;DD''(H/N_F
VU
;C-02op57bc[[t[,F>>U"""  ,,,!::@@FDYDYYYYV33333r   c           	        ddg}d}t        dt        dd      id      }t        |||t        |       	       t	        |d
      }|D cg c]  }d|d   v sd|d   v s| }}t        |      t        |      k\  sJ |D cg c]"  }ddj                  d |d   D              v s!|$ }}|rJ |D ].  }| |z  j                         sJ d| |z  j                         v r.J  yc c}w c c}w )u1   ★ tmp_path 격리: 실제 source 손상 방지.zutils/sample.pyztests/regression/test_sample.py
abcdef1234)gitshowr   z# fake transplanted content
r0   r   repo_dirr7   r   r   r   cherry-pickr"   c              3  2   K   | ]  }t        |        y wr$   r%   r'   s     r   r*   zCtest_t04_transplant_expected_files_uses_git_show.<locals>.<genexpr>   s     MhYZcRSfMhr+   zfake transplanted contentN)	r>   r   r	   r&   getattrlenr3   exists	read_text)	tmp_pathrM   rT   r9   runner_callsc
show_callscherry_pick_callsfs	            r   0test_t04_transplant_expected_files_uses_git_showr      s#   !#DEHH	"2QRSF
 X	 67+L)XUai-?FaPViDW!XJXz?c(m+++ %1iqMSXXMh^_`f^gMhEh4hii     I1$$&&&*x!|.F.F.HHHHI Y js   	C"C"C""C'$C'c                   t               }t        |j                        }|dgz   t        i dd      }t	        |dt        |            }dd lm} | j                  |dfd       | j                  |d	fd
       | j                  |dd0d       | j                  |dd d dd       | j                  |dd dd       | j                  |dd dd       | j                  |dd dd       | j                  |dd dd       | j                  |dd dd       | j                  |dd        |j                  d|      }t        |d      }|D 	cg c]  }	d j                  d! |	d"   D               }
}	|
D ]+  }d#|vsJ d$|v r
d%|v rd&|v rJ d'|v rd(|v rJ d)|v s&d*|v s+J  |
D 	cg c]  }	d+|	v sd,|	v s|	 }}	|s
J d-|
        |j                  d.u sJ |j                  d.u sJ |j                  d/k(  sJ y c c}	w c c}	w )1Nr}   r   r   r   Fr9   r^   r   r_   c                    t        d      S Nr:   )rR   rV   rb   rc   rd   r~   s     r   re   z?test_t05_original_pr_preserved_comment_posted.<locals>.<lambda>       WYam@n r   rf   c                    S r$   r-   ri   rd   r~   s     r   re   z?test_t05_original_pr_preserved_comment_posted.<locals>.<lambda>       | r   r
   c                     y r$   r-   rd   r   s     r   re   z?test_t05_original_pr_preserved_comment_posted.<locals>.<lambda>       r   create_clean_replacement_branch	timestampr   c                    y)Nz#task/task-2510-replacement-20260508r-   rE   rd   r   r   s       r   re   z?test_t05_original_pr_preserved_comment_posted.<locals>.<lambda>   r   r   r	   r   c                   t        |       S r$   rh   expsrcrd   r   s       r   re   z?test_t05_original_pr_preserved_comment_posted.<locals>.<lambda>       `deh`i r   commit_localc                   t        d      S Nr   )r   r   rE   rd   r   s      r   re   z?test_t05_original_pr_preserved_comment_posted.<locals>.<lambda>       RT`aRb r   r   c                   dg g fS NTr-   branchr   rd   r   s       r   re   z?test_t05_original_pr_preserved_comment_posted.<locals>.<lambda>   s    jnprtviw r   push_branchc                   t        d      S r   r   )r   rd   r   s      r   re   z?test_t05_original_pr_preserved_comment_posted.<locals>.<lambda>   s    PR^_P` r   open_replacement_prc                    y)N=   r-   )rE   r   	source_prrd   r   s        r   re   z?test_t05_original_pr_preserved_comment_posted.<locals>.<lambda>   r   r   validate_replacement_diffc                    dg g fS r   r-   )rB   r   rd   s      r   re   z?test_t05_original_pr_preserved_comment_posted.<locals>.<lambda>   s    Z^`bdfYg r   r:   rj   r7   r"   c              3  2   K   | ]  }t        |        y wr$   r%   r'   s     r   r*   z@test_t05_original_pr_preserved_comment_posted.<locals>.<genexpr>   s      ;AQ ;r+   r   zgh pr closez
gh pr editz--stateclosedzgh apiDELETEzgit pushz--deletezgh pr commentz
[REPLACED]z.[REPLACED] comment must be posted, got calls: Tr   r$   )rN   r2   rF   r>   r   r&   rl   rm   r<   rn   r   r3   rq   rp   rB   )rv   r   rw   rM   r9   rx   ry   rz   r   r   all_calls_joinedcall_strcomment_callsr~   s                @r   -test_t05_original_pr_preserved_comment_postedr      s[   ;DD''(H<==L"EF
VUS]
SC-02no57ST8:WX>`dos  A[  \8Z^:ij^D-bc>cg@wx]$,`a2fj4no8:gh [[t[,F67+LEQR ;6 ;;RR % GH,,, H,h1F8W_K_``(X-ABB(*zX/EFF	G !1_1Oq4H\]^M^Q_M_]JK[J\]]=''4///>>T!!!  B&&& S `s   "H -	H7H<Hc                    dd l m}  ddg}t        j                  d|D cg c]  }d|i c}i      }t	        dt        d|      i      }| j                  d||      \  }}}|d	u sJ |g k(  sJ |g k(  sJ |d
gz   }t        j                  d|D cg c]  }d|i c}i      }	t	        dt        d|	      i      }
| j                  d||
      \  }}}|du sJ d
|v sJ y c c}w c c}w )Nr   r@   rA   rV   path)ghrc   viewr0   r   Tzutils/rogue_extra.pyF)rl   rm   jsondumpsr>   r   r   )ry   rM   pfiles_payload_ok	runner_okvalidr   missingextra_files_listfiles_payload_extrarunner_extravalid_eextra_e
_missing_es                 r   .test_t06_validate_replacement_diff_exact_matchr      s   -02ghHzz7(,KQfa[,K"LM12K[3\]^I99"h	RE5'D==B;;b==#9"::**gEU/V/V%WX 4bANa6bcdL#&#@#@X|#\ GWje!W,,, -L 0Ws   C
C#
c                  	 t               }t        |j                        		dgz   t        i d      }t	        |dt        |            }dd lm} | j                  |dfd       | j                  |dfd	       d
 }| j                  |dd        | j                  |dd        | j                  |d	fd       | j                  |dd        | j                  |dd        | j                  |d|       |j                  d|      }|j                  du sJ |j                  t        j                  j                  t        j                  j                  hv sJ y )Nzutils/rogue.pyr   r   Fr   r_   c                    t              S ra   rb   r   s     r   re   z7test_t07_replacement_failure_critical.<locals>.<lambda>   s    S_@` r   rf   c                    S r$   r-   r   s     r   re   z7test_t07_replacement_failure_critical.<locals>.<lambda>   r   r   c                     t        d      )NzPUSH_FAILED simulatedRuntimeErrorr)   ks     r   boomz3test_t07_replacement_failure_critical.<locals>.boom   s    233r   r
   c                      y r$   r-   r   s     r   re   z7test_t07_replacement_failure_critical.<locals>.<lambda>   r   r   r   c                      y)Nztask/task-2510-replacement-zzzr-   r   s     r   re   z7test_t07_replacement_failure_critical.<locals>.<lambda>   r   r   r	   c                     t              S r$   rh   )r)   r   rM   s     r   re   z7test_t07_replacement_failure_critical.<locals>.<lambda>   s    $x. r   r   c                     t        d      S r   r   r   s     r   re   z7test_t07_replacement_failure_critical.<locals>.<lambda>   s    R1=M r   r   c                     dg g fS r   r-   r   s     r   re   z7test_t07_replacement_failure_critical.<locals>.<lambda>   s    QUWY[]P^ r   r   r:   rj   )rN   r2   rF   r>   r   r&   rl   rm   r<   rn   rp   ru   r   9REPLACEMENT_PR_AUTO_CREATION_FAILED_FOR_CONTAMINATED_DIFFr   REPLACEMENT_PR_FAILED)
rv   r   rw   r9   rx   ry   r   rz   r~   rM   s
           @@r   %test_t07_replacement_failure_criticalr      sJ   ;DD''(H/00L2F
VUS]
SC-02`a57ST48:NO>@pq8:XY^-MN>@^_]D1[[t[,F>>U"""  XX^^44::%   r   c            	        ddg} t        |       }dD ]B  }t        d      D ]2  }|j                  d| d| d       |j                  d| d	| d       4 D t        d
      D ],  }|j                  d| d       |j                  d| d       . t        t        j	                  |            }t        |      dk\  sJ t        ||       }|d   du sJ t        |d         dk\  sJ y )Nr@   rA   )ztask-2487+1z	task-2503ztask-2485+1z	task-2488z	task-2489z	task-2493
   zutils/_module_.pyztests/regression/test__   zscripts/poc_script_z.shztests/POC/poc_test_N   r~   Tr      )r2   ranger1   dictfromkeysr   r   )rM   contaminated_filesprefixirz   s        r   +test_t08_pr54_fixture_78_files_contaminatedr   
  s!   02ghHhd Pr 	PA%%vhhqc&EF%%(>vhas#&NO	PP 1X @!!$7s#">?!!$7s#">?@ dmm,>?@!"b(((!"4h?F.!T)))vg1$$$r   c                 8   ddg} t        |       }t        d      D ],  }|j                  d| d       |j                  d| d       . |j                  d       |j                  d       t        t        j	                  |            }t        ||       }|d	   d
u sJ ddg}t        |      }t        d      D ],  }|j                  d| d       |j                  d| d       . t        t        j	                  |            }t        ||      }|d	   d
u sJ y )Nzutils/auto_gemini_triage.pyz0tests/regression/test_auto_gemini_triage_2506.py9   z!utils/task-2479-dev1_accumulated_r   ztests/regression/test_task2479_zscripts/dev1_bootstrap.shztests/POC/poc_gemini.pyr~   Tr@   rA   '   zutils/task-2507_base_acc_z#tests/regression/test_task2507_acc_)r2   r   r1   r   r   r   )expected_2506contaminated_2506r   r2506expected_2507contaminated_2507r2507s          r   (test_t09_task2506_117_files_contaminatedr    sD   24fgM]+2Y K  #DQCs!KL  #B1#S!IJK 8967T]]+<=> !2MBE D(((57lmM]+2Y O  #<QCs!CD  #Fqc!MNO T]]+<=> !2MBE D(((r   c                     t        j                  t              5 } t        g d       d d d        dt	         j
                        v sJ y # 1 sw Y   #xY w)N)r   r   abcCHERRY_PICK_FORBIDDEN)pytestraisesr   r   r&   r   )excinfos    r   %test_t10_assert_no_cherry_pick_raisesr  4  sE    	|	$ =;<="c'--&8888= =s   A

Ac                 8    t        g d       t        g d       y )N)r   merger	  )r   r   zabc:file.py)r   r-   r   r   )test_t10_assert_no_cherry_pick_safe_merger  :  s    1289r   c                 z    t        j                  t              5  t        g d       d d d        y # 1 sw Y   y xY w)N)r   pushz--forcer  r  r   r   r-   r   r   test_t11_force_flag_raisesr  A  s0    	|	$ B%&@AB B B   1:c                 z    t        j                  t              5  t        g d       d d d        y # 1 sw Y   y xY w)N)r   rc   r  z--adminr  r-   r   r   test_t11_admin_flag_raisesr  F  s0    	|	$ H%&FGH H Hr  c                 z    t        j                  t              5  t        g d       d d d        y # 1 sw Y   y xY w)N)r   rebaserP   r  r-   r   r   test_t11_rebase_raisesr  K  s0    	|	$ A%&?@A A Ar  c            
     6   t        dddddgddgg dd       } t        j                  t        |             }t        j                  |      }t        di |}|j
                  du sJ |j                  dk(  sJ t        dd ddgg g dt        j                  j                        }t        j                  t        |            }t        j                  |      }t        di |}|j
                  du sJ |j                  t        j                  j                  k(  sJ y )	N6   r   Tr@   rA   )r   rB   rq   rF   rs   rt   rp   ru   Fr-   )r   r   r   r   loadsrp   rB   r   r   r   ru   )ok
payload_ok	parsed_ok
rebuilt_okfailpayload_failparsed_failrebuilt_fails           r   *test_t12_replacement_result_json_roundtripr'  Q  s   	Rt8:op>@uvD	
B F2J'J

:&I"/Y/J%%%$$*** T89PRE-CCII	D ::fTl+L**\*K$3{3L5(((&&*@*V*V*\*\\\\r   c                >   t               }t        |j                        }|dgz   t        dt	        dd      idd      }t        |dt        |      	      }dd
lm} | j                  |dfd       | j                  |dfd       |j                  d|      }|j                  du sJ |j                  t        j                  j                  k(  sJ |j                   du sJ |j"                  J |j"                  j$                  t        j                  k(  sJ y
)uM   dirty working tree 감지 시 replacement 흐름 진입 전에 실패 반환.zutils/rogue_dirty.py)r   statusz--porcelainr   z M utils/dirty_file.py
r0   r   r   Fr   Nr_   c                    t        d      S r   rb   r   s     r   re   z3test_t13_dirty_working_tree_fails.<locals>.<lambda>}  r   r   rf   c                    S r$   r-   r   s     r   re   z3test_t13_dirty_working_tree_fails.<locals>.<lambda>~  r   r   r:   rj   T)rN   r2   rF   r>   r   r   r&   rl   rm   r<   rn   rp   ru   r   r   r   rq   last_escalation_packetescalation_type)	rv   r   rw   rM   dirty_runnerrx   ry   rz   r~   s	           @r   !test_t13_dirty_working_tree_failsr/  n  s$   ;DD''(H566L 	)2C]+^_L
 \53x=
YC-02no57ST[[t[,F>>U"""  $:$t$t$z$zzzz''4///%%111%%559O  :J  :J  J  J  Jr   c                0  	
 t               }t        |j                        }|dgz   	t        i dd      }t	        |dt        |            }ddlm} | j                  |d	fd	       | j                  |d
	fd       | j                  |ddd       | j                  |ddddd       | j                  |dddd       | j                  |dddd       | j                  |dddd       g 

fd}| j                  |d|       |j                  d|      }|j                  du sJ |j                  t        j                  j                  k(  sJ 
rJ d       |j                  J |j                  j                   t        j                  k(  sJ y)u]   로컬 diff 사전 검증 실패 시 gh pr create 호출 없이 REPLACEMENT_PR_FAILED 반환.zutils/rogue_precheck.pyr   r   r   Fr   Nr_   c                    t        d      S r   rb   r   s     r   re   z7test_t14_precheck_mismatch_no_pr_open.<locals>.<lambda>  r   r   rf   c                    S r$   r-   r   s     r   re   z7test_t14_precheck_mismatch_no_pr_open.<locals>.<lambda>  r   r   r
   c                     y r$   r-   r   s     r   re   z7test_t14_precheck_mismatch_no_pr_open.<locals>.<lambda>  r   r   r   r   c                    y)Nz#task/task-2510-replacement-precheckr-   r   s       r   re   z7test_t14_precheck_mismatch_no_pr_open.<locals>.<lambda>  r   r   r	   r   c                   t        |       S r$   rh   r   s       r   re   z7test_t14_precheck_mismatch_no_pr_open.<locals>.<lambda>  r   r   r   c                   t        d      S r   r   r   s      r   re   z7test_t14_precheck_mismatch_no_pr_open.<locals>.<lambda>  r   r   r   c                   ddgg fS )NFzutils/unexpected_extra.pyr-   r   s       r   re   z7test_t14_precheck_mismatch_no_pr_open.<locals>.<lambda>  s#    jo  sN  rO  QS  jT r   c                 (    j                  d       y)NTc   )r1   )r)   r   pr_open_calleds     r   fail_if_calledz=test_t14_precheck_mismatch_no_pr_open.<locals>.fail_if_called  s    d#r   r   r:   rj   z3gh pr create must NOT be called when precheck failsr$   )rN   r2   rF   r>   r   r&   rl   rm   r<   rn   rp   ru   r   r   r   r,  r-  )rv   r   rw   rM   r9   rx   ry   r;  rz   r~   r:  s            @@r   %test_t14_precheck_mismatch_no_pr_openr<    s   ;DD''(H899L "EF
VUS]
SC-02no57ST8:WX>`dos  A[  \8Z^:ij^D-bc>cg  AT  U N 2NC[[t[,F>>U"""  $:$P$P$V$VVVVTTT%%111%%559O9e9eeeer   c                V  
 t               }t        |j                        }|dgz   
t        i dd      }t	        |dt        |            }ddlm} | j                  |d
fd	       | j                  |d

fd       | j                  |ddd       | j                  |ddddd       | j                  |dddd       d }| j                  |d|       |j                  J |j                  d|      }|j                  du sJ |j                  J |j                  }	|	j                  dk(  sJ |	j                  |j                  k(  sJ |	j                  t        j                   t        j"                  fv sJ |	j$                  dk7  sJ t'        |	j(                  t*              sJ y)uL   실패 경로에서 runner.last_escalation_packet이 채워지는지 검증.zutils/rogue_escalation.pyr   r   r   Fr   Nr_   c                    t        d      S r   rb   r   s     r   re   zAtest_t15_escalation_packet_populated_on_failure.<locals>.<lambda>  r   r   rf   c                    S r$   r-   r   s     r   re   zAtest_t15_escalation_packet_populated_on_failure.<locals>.<lambda>  r   r   r
   c                     y r$   r-   r   s     r   re   zAtest_t15_escalation_packet_populated_on_failure.<locals>.<lambda>  r   r   r   r   c                    y)Nztask/task-2510-replacement-escr-   r   s       r   re   zAtest_t15_escalation_packet_populated_on_failure.<locals>.<lambda>  r   r   r	   r   c                   t        |       S r$   rh   r   s       r   re   zAtest_t15_escalation_packet_populated_on_failure.<locals>.<lambda>  r   r   c                     t        d      )NzCOMMIT_FAILED simulated for T15r   r   s     r   boom_commitzDtest_t15_escalation_packet_populated_on_failure.<locals>.boom_commit  s    <==r   r   r:   rj   r$   )rN   r2   rF   r>   r   r&   rl   rm   r<   r,  rn   rp   rR   rE   r-  r   r   r   reasonro   evidencer   )rv   r   rw   rM   r9   rx   ry   rD  rz   pktr~   s             @r   /test_t15_escalation_packet_populated_on_failurerH    s   ;DD''(H:;;L"EF
VUS]
SC-02no57ST8:WX>`dos  AV  W8Z^:ij>^[9 %%---[[t[,F>>U"""%%111

$
$C==B;;$,,&&&XX44#    ::cllD)))r   c                 J   ddl } dD ]&  }|t        j                  v st        j                  |= ( | j                  d      }|j                  du sJ d       |j
                  J d       | j                  d      }|j                  d	gd	g      \  }}}|du sJ |g k(  r|g k(  sJ y)
u   task-2516: replacement_pr_runner 모듈의 top-level import에서 merge_queue_executor와의
    circular import가 제거되어 default wiring path(_WIRING_AVAILABLE=True)가 활성화되는지 회귀 검증.
    r   N)utils.merge_queue_executorutils.replacement_pr_runnerrJ  TuS   W1 wiring 비활성 — replacement_pr_runner.py에 circular import가 남아있음u-   ReplacementPRRunner가 None — wiring 누락rK  za.py)	importlibsysmodulesimport_module_WIRING_AVAILABLEr   compare_effective_diff)rL  mod_namemqerx   equalr   r   s          r   /test_wiring_activated_default_runtime_path_2516rU    s     Q &s{{"H%& 
!
!">
?C  D( ]( ""._0__.

!
!"?
@C66x&JE5'D==B;7b=((=r   )r   r   r   r$   )z	task-2510NN)returnr   )ztask/task-2507-dev5abcdef1z	task-2507N)7__doc__
__future__r   r   r   rM  dataclassesr   pathlibr   r  __file__resolveparent	WORKSPACEr&   r   removeinsertrl   r   r   r   r	   r
   r   utils.automation_contractsr   r   utils.merge_queue_executorr   r   r   r>   rN   r[   r{   r   r   r   r   r   r   r   r  r  r  r  r  r  r'  r/  r<  rH  rU  r-   r   r   <module>rd     s   #   
   N""$++2299	y>SXXHHOOC	N# 3y> " eAb " 
)*<4(I@&'T-(<%&).9:B
H
A]:J<#fN$*P)r   