
     Ij                    >   d Z ddlm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mZ ddlZ ee      j'                         j(                  d   Z ee      ej.                  vr"ej.                  j1                  d ee              ee      j'                         j2                  j2                  dz  ZddZd	 Z	 	 	 	 d	 	 	 	 	 	 	 dd
Z	 	 	 	 	 d 	 	 	 	 	 	 	 	 	 d!dZddddd	 	 	 d"dZd Z d Z!d Z"d Z#d Z$d Z%d Z&d Z'd#dZ(d Z)d Z*d Z+d Z,d Z-y)$u  anu_v2.tests.test_gemini_stale_prevention_runner_2545 — 회귀 13건 (회장 §명시 1:1).

회귀 케이스 (task-2545.md "3. 회귀 10건" + task-2545+2 회귀 박제 #11~13):
  01. same-PR safe (false_positive only)             — fixture 5 → SAME_PR_SAFE / SAME_PR_RESOLVED
  02. same-PR blocked replacement required           — fixture 1 → SAME_PR_BLOCKED_REPLACEMENT_REQUIRED → pivot 호출
  03. PR #86 사고 재현 → replacement                 — 4단 head 변경 시뮬, 1단계에서 SAME_PR_BLOCKED 차단 어설션
  04. PR #88 mixed thread 분리                        — fixture 2 → code-changing 2 / non-code 2 분리
  05. PR #76 empty commit 차단                        — fixture 3 → block_empty_commit_attempt() + audit jsonl 박제
  06. scope expansion → Critical 7종 #3              — proposed_fixes에 expected_files 외 path → kind=3
  07. replacement PR clean path                       — fixture 4 → opened + 3분 내 evidence → REPLACEMENT_PR_OPENED
  08. PR_OPEN_HEALTH_GATE evidence 미도착             — fixture 4 변형 → MISSED 분류, long_polling_invoked=False 강제
  09. md/report fallback 금지                         — runner 코드에 .md / qc-result magic string 0건 어설션
  10. interface contract                              — 7 method 시그니처 + class 이름 보존
  11. REPLACEMENT_PR_CONTRACT_FRAMING_INCONSISTENT 박제 — PR #93 사고 reproduce → Critical 7종 #6
  12. contract framing OK when replacement matches effective diff — task-2545+2 정상 케이스
  13. contract framing OK when original PR merged    — state-aware exemption (MERGED → 축소 정당)

본 회귀는 anu_v2/* 모듈만 import 한다 (one-way isolation).
    )annotationsN)Path)Any   fixturesc                Z    t        j                  t        | z  j                  d            S )Nutf-8encoding)jsonloadsFIXTURES_DIR	read_text)names    L/home/jay/workspace/anu_v2/tests/test_gemini_stale_prevention_runner_2545.pyloadr   (   s$    ::|d*55w5GHH    c                     ddl m}  | S )Nr   GeminiStalePreventionRunner)%anu_v2.gemini_stale_prevention_runnerr   r   s    r   _import_runnerr   .   s     '&r   c                      fd}|S )Nc                D    j                  | ||||d       ddS )N)original_proriginal_branchoriginal_head_shaproposed_fixeschat_idT)replacement_pr_numberreplacement_branchreplacement_head_shaoriginal_pr_preservedappend)	r   r   r   r   r   recordr!   r"   r    s	        r   fakez+_make_fake_replacement_runner.<locals>.fake=   sA    MM#.'6):&4& &;"4$8%)	
 	
r    )r    r!   r"   r&   r'   s   ```` r   _make_fake_replacement_runnerr)   7   s    
$ Kr   c                "      fd}|S )Nc                @    j                  | ||d       dS )N)replacement_prr"   grace_secondsevidence_arrivedelapsed_secondsclassificationlong_polling_invokedr$   )r,   r"   r-   r1   r0   r/   r2   r&   s      r   r'   z$_make_fake_health_gate.<locals>.fakeY   s;    MM&4,@%2 !1.,$8	
 	
r   r(   )r/   r0   r1   r2   r&   r'   s   ````` r   _make_fake_health_gater3   R   s    
 
  Kr   2026-05-10T12:00:00Z)replacement_pr_runner_callablepr_open_health_gate_callableaudit_recordsnowc                ~    t               }ng fd} || xs
 t               |xs
 t               |fd      S )Nc                (    j                  |        y Nr$   )r&   r7   s    r   
fake_auditz!_build_runner.<locals>.fake_auditv   s    V$r   c                      S r;   r(   )r8   s   r   <lambda>z_build_runner.<locals>.<lambda>   s    C r   )r5   r6   audit_writernow_factory)r   r)   r3   )r5   r6   r7   r8   Runnerr<   s     ``  r   _build_runnerrB   l   sO     F%2%>MBM% 'E (+(*%A &$!# r   c                 	   t        d      } | d   d   }t               }|j                  | d   d   | d   d   | d   d   |      }|d   }d	}||k(  }|st        j                  d
|fd||f      t        j
                  |      t        j
                  |      dz  }t        j                  |      dz   d|iz  }t        t        j                  |            d x}x}}|d   }g }||k(  }|st        j                  d
|fd||f      t        j
                  |      t        j
                  |      dz  }t        j                  |      dz   d|iz  }t        t        j                  |            d x}x}}|d   }	t        |	      }g 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  }t        j                  |      dz   d|iz  }t        t        j                  |            d x}	x}x}}
|j                  | d   d   | d   d   | d   d   |d      }|d   }d}||k(  }|st        j                  d
|fd||f      t        j
                  |      t        j
                  |      dz  }t        j                  |      dz   d|iz  }t        t        j                  |            d x}x}}|d   }d }||u }|st        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }t        j                  |      dz   d|iz  }t        t        j                  |            d x}x}}|d   }d }||u }|st        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }t        j                  |      dz   d|iz  }t        t        j                  |            d x}x}}|d   }d }||u }|st        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }t        j                  |      dz   d|iz  }t        t        j                  |            d x}x}}y ) Nz4stale_prevention_false_positive_same_pr_resolve.jsoninputtriage_classifications	pr_numberhead_shagemini_review_commit_idrF   current_head_sharH   rE   decisionSAME_PR_SAFE==z%(py1)s == %(py4)spy1py4
>assert %(py6)spy6code_changing_threadsnon_code_changing_threads)   r      z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)ssortedpy0py2rR   py7
>assert %(py9)spy9task/task-XXXXrF   rJ   rH   rE   r   outcomeSAME_PR_RESOLVEDpivot_resultisz%(py1)s is %(py4)shealth_gate_resultcritical_seven_classification)r   rB   evaluate_push_safety
@pytest_ar_call_reprcompare	_saferepr_format_assertmsgAssertionError_format_explanationrZ   @py_builtinslocals_should_repr_global_namerun)fxtriagerunnereval_result@py_assert0@py_assert3@py_assert2@py_format5@py_format7@py_assert1@py_assert6@py_assert5@py_format8@py_format10
run_results                  r   (test_01_same_pr_safe_false_positive_onlyr      sk   	D	EB[12F_F--W+k*GZ0 "7,E F%	 . K z"AnA"n4AAA"nAAA"AAAnAAAkAAAAAAA./B2B/25BBB/2BBB/BBB2BBB{BBBBBBB9:U6:;UyU;yHUUU;yUUUUUU6UUU6UUU:UUU;UUUyUUU+UUUUUUUW+k*GZ0 "7,E F%(  J i B$6B $66BBB $6BBB BBB$6BBB
BBBBBBBn%99%-999%999%999999z9999999*+?t?+t3???+t???+???t???Z???????56J$J6$>JJJ6$JJJ6JJJ$JJJ
JJJJJJJr   c                    t        d      } dddddgddg}g }t        |	      }t        |
      }|j                  | d   | d   d   d   | d   d   d   |      }|d   }d}||k(  }|st	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }	t	        j                  |      dz   d|	iz  }
t        t	        j                  |
            d x}x}}|d   }dg}||k(  }|st	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }	t	        j                  |      dz   d|	iz  }
t        t	        j                  |
            d x}x}}|d   }d}||u }|st	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }	t	        j                  |      dz   d|	iz  }
t        t	        j                  |
            d x}x}}|j                  | d   d| d   d   d   dddgdg      }|d   }d}||k(  }|st	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }	t	        j                  |      dz   d|	iz  }
t        t	        j                  |
            d x}x}}|d    }d!}||u }|st	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }	t	        j                  |      dz   d|	iz  }
t        t	        j                  |
            d x}x}}t        |      }d}||k(  }|st	        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  }
t	        j                  |      d&z   d'|
iz  }t        t	        j                  |            d x}x}}|d   d(   }| d   }||k(  }|st	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }	t	        j                  |      dz   d|	iz  }
t        t	        j                  |
            d x}x}}|d   d)   }d*}||k(  }|st	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }	t	        j                  |      dz   d|	iz  }
t        t	        j                  |
            d x}x}}y )+N&stale_prevention_pr86_same_pr_fix.jsonrW   minor_fix_in_scopeanu_v2/some_module.py
      filelines	thread_idr1   proposed_fixr&   r5   rF   head_sequencer   sharI   rK   $SAME_PR_BLOCKED_REPLACEMENT_REQUIREDrM   rO   rP   rS   rT   rU   auto_retry_allowedFrf   rh   task/task-2537r   r   r   r   r      r#   Tz0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenpivot_callsr\   rQ   py3rT   
>assert %(py8)spy8r   r      L5: )r   r)   rB   rk   rl   rm   rn   ro   rp   rq   pivot_to_replacement_prr   rr   rs   rt   )rv   rw   r   fake_replacementrx   ry   rz   r{   r|   r}   r~   re   r   @py_assert4@py_format9s                  r   ,test_02_same_pr_blocked_replacement_requiredr      s   	6	7B 2%<BxP	
F K4KH:JKF--[/O,Q/6 "? 3A 6u =%	 . K z"Y&LY"&LLYYY"&LYYY"YYY&LYYYkYYYYYYY./CA3C/36CCC/3CCC/CCC3CCCCCCCCCC+,BB,5BBB,BBB,BBBBBB{BBBBBBB11{O(_-a07!8B8LM	 2 L /0FDF0D8FFF0DFFF0FFFDFFF,FFFFFFF/0FDF0D8FFF0DFFF0FFFDFFF,FFFFFFF{-q-q ---q------3---3------{---{------q---+-------q>-(HB{OH(O;HHH(OHHH(HHHOHHH[HHHHHHHq>)$?
?$
2???$
???$???
???K???????r   c                 <   t        d      } | d   }t        |      }d}||k(  }|st        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  }t        j                  d      d	z   d
|iz  }t        t        j                  |            d x}x}}dddddgddg}g }t        t        |            }	|d   d   }
|	j                  | d   |
|
|      }|d   }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j                  |      dz   d|iz  }t        t        j                  |            d x}x}}|	j                  | d   d|
dddgdg      }|d   }d }||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j                  |      dz   d|iz  }t        t        j                  |            d x}x}}|d!   }d"}||u }|st        j                  d#|fd$||f      t        j                  |      t        j                  |      dz  }t        j                  |      dz   d|iz  }t        t        j                  |            d x}x}}t        |      }d}||k(  }|st        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  }t        j                  |      d	z   d
|iz  }t        t        j                  |            d x}x}}|
h}|dd  D ch c]  }|d   	 }}|j                  } ||      }|st        j                  d&      d'z   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                  |      d*z  }t        t        j                  |            d x}}y c c}w )+Nr   r      rM   r   r   r   u+   PR #86 fixture는 4단 head sequence 박제r   r   rW   r   anu_v2/example.pyr   r   r   r   r   r   r   rF   rI   rK   r   rO   rP   rS   rT   r   r   r    r   r#   Trf   rh   r   u&   정책 적용 시 후속 head 변경 0zN
>assert %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.isdisjoint
}(%(py3)s)
}blocked_heads
used_heads)r\   r]   r   py5)r   r   rl   rm   rr   rs   rt   rn   ro   rp   rq   rB   r)   rk   r   
isdisjoint)rv   r   r|   r   r   r~   r   rw   r   rx   
first_head
eval_firstrz   r{   r}   pivotr   hr   r   @py_format6s                        r   8test_03_pr86_accident_reproduction_blocked_at_first_stepr      s   	6	7B'M}QQ"QQQQQQQQQ3QQQ3QQQQQQ}QQQ}QQQQQQQQQ$QQQQQQQQ 2%8Aq6J	
F K'DK'XF
 q!%(J
 ,,[/# *%	 - J j!W%KW!%KKWWW!%KWWW!WWW%KWWWZWWWWWWW **{O($!41vFG	 + E ()8T8)T1888)T888)888T88858888888()8T8)T1888)T888)888T88858888888 {-q-q ---q------3---3------{---{------q---+-------J'4QR'89!QuX9M9##Y#J/Y/YY1YYYYYYY=YYY=YYY#YYYYYYJYYYJYYY/YYYYYY :s   Vc                 
   t        d      } g }| d   D ].  }|d   |d   d}|d   dv r	ddgd	|d
<   |j                  |       0 t               }|j                  | d   | d   | d   |      }|d   }d}||k(  }|st	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }	t	        j                  |      dz   d|	iz  }
t        t	        j                  |
            d x}x}}|d   }t        |      }ddg}||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  }t	        j                  |      dz   d|iz  }t        t	        j                  |            d x}x}x}}|d   }t        |      }ddg}||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  }t	        j                  |      dz   d|iz  }t        t	        j                  |            d x}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  }t	        j                  |      dz   d|iz  }t        t	        j                  |            d x}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  }t	        j                  |      dz   d|iz  }t        t	        j                  |            d x}x}x}}y )!Nz*stale_prevention_pr88_unresolved_push.json(expected_decision_with_runner_per_threadthreadr1   )r   r1   )r   real_bug_in_scopezanu_v2/sample.pyrW   r   r   rF   current_headrH   rI   rK   r   rM   rO   rP   rS   rT   rU   r   rY   rZ   r[   r_   r`   rV   rX   r   r   )r   r%   rB   rk   rl   rm   rn   ro   rp   rq   rZ   rr   rs   rt   r   )rv   rw   entryitemrx   ry   rz   r{   r|   r}   r~   r   r   r   r   r   s                   r   $test_04_pr88_mixed_thread_separationr     s`   	:	;BF>? x#$45
 !"&QQ,>!#MD d _F--[/N+ "#< =%	 . K z"Y&LY"&LLYYY"&LYYY"YYY&LYYYkYYYYYYY56N667NAq6N76ANNN76NNNNNN6NNN6NNN6NNN7NNN6NNN;NNNNNNN9:R6:;R1vR;vERRR;vRRRRRR6RRR6RRR:RRR;RRRvRRR{RRRRRRR23F334FF49FFF4FFFFFF3FFF3FFF3FFF4FFFFFF;FFFFFFF67J378JAJ8A=JJJ8AJJJJJJ3JJJ3JJJ7JJJ8JJJAJJJ{JJJJJJJr   c            
        t        d      } g }t        |      }|j                  | d   d      }|d   }d}||u }|st        j                  d|fd	||f      t        j
                  |      t        j
                  |      d
z  }t        j                  |      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z   d|iz  }t        t        j                  |            d x}x}}d}|j                  }	d}
d} |	|
|      }||v }|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      ndt        j
                  |	      t        j
                  |
      t        j
                  |      t        j
                  |      dz  }t        j                  |      dz   d|iz  }t        t        j                  |            d x}x}x}	x}
x}}|d   }d}||k(  }|st        j                  d|fd||f      t        j
                  |      t        j
                  |      d
z  }t        j                  |      dz   d|iz  }t        t        j                  |            d x}x}}t        |      }d}||k\  }	|	st        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  }t        j                  |      d!z   d"|iz  }t        t        j                  |            d x}x}	}|d#   }|j                  }d} ||      }d}||k(  }|st        j                  d|fd$||f      d%t        j                         v st        j                  |      rt        j
                  |      nd%t        j
                  |      t        j
                  |      t        j
                  |      t        j
                  |      d&z  }t        j                  |      d'z   d(|iz  }t        t        j                  |            d x}x}x}x}}|j                  }d} ||      }| d   }||k(  }|st        j                  d|fd$||f      d%t        j                         v st        j                  |      rt        j
                  |      nd%t        j
                  |      t        j
                  |      t        j
                  |      t        j
                  |      d&z  }t        j                  |      d'z   d(|iz  }t        t        j                  |            d x}x}x}x}}t        t              j!                         j"                  j"                  d)z  }|j%                  d*+      }t&        j(                  }d,}t&        j*                  } ||||-      }| }|s]t        j                  d.      d/z   d0t        j                         v st        j                  t&              rt        j
                  t&              nd0t        j
                  |      t        j
                  |      d1t        j                         v st        j                  |      rt        j
                  |      nd1d0t        j                         v st        j                  t&              rt        j
                  t&              nd0t        j
                  |      t        j
                  |      d2z  }t        t        j                  |            d x}x}x}x}}t&        j(                  }d3}t&        j*                  } ||||-      }| }|s]t        j                  d.      d/z   d0t        j                         v st        j                  t&              rt        j
                  t&              nd0t        j
                  |      t        j
                  |      d1t        j                         v st        j                  |      rt        j
                  |      nd1d0t        j                         v st        j                  t&              rt        j
                  t&              nd0t        j
                  |      t        j
                  |      d2z  }t        t        j                  |            d x}x}x}x}}d4}||v}|st        j                  d5|fd6||f      t        j
                  |      d1t        j                         v st        j                  |      rt        j
                  |      nd1d7z  }t        j                  d8      d9z   d:|iz  }t        t        j                  |            d x}}d;}||v}|st        j                  d5|fd6||f      t        j
                  |      d1t        j                         v st        j                  |      rt        j
                  |      nd1d7z  }t        j                  d<      d9z   d:|iz  }t        t        j                  |            d x}}y )=Nz,stale_prevention_pr76_empty_commit_fail.jsonr7   rF   r4   )rF   tsblockedTrf   rh   rP   rS   rT   kind$EMPTY_COMMIT_TRIGGER_ATTEMPT_BLOCKEDrM   rO   z3memory/orchestration-audit/empty_commit_block.jsonlaudit_jsonl_path )in)zT%(py1)s in %(py11)s
{%(py11)s = %(py5)s
{%(py5)s = %(py3)s.get
}(%(py7)s, %(py9)s)
}result)rQ   r   r   r^   r`   py11z
>assert %(py13)spy13r   rW   )>=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sr   r7   r   r   r   )zI%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} == %(py9)slast)r\   r]   rR   rT   r`   z
>assert %(py11)sr   z!gemini_stale_prevention_runner.pyr	   r
   z^\s*import\s+subprocess)flagsu   subprocess import 금지z
>assert not %(py10)s
{%(py10)s = %(py2)s
{%(py2)s = %(py0)s.search
}(%(py4)s, %(py5)s, flags=%(py8)s
{%(py8)s = %(py6)s.MULTILINE
})
}resrc)r\   r]   rR   r   rT   r   py10z^\s*from\s+subprocess\s+importz	os.systemnot inz%(py1)s not in %(py3)srQ   r   u   os.system 호출 금지
>assert %(py5)sr   zos.popenu   os.popen 호출 금지)r   rB   block_empty_commit_attemptrl   rm   rn   ro   rp   rq   getrr   rs   rt   r   r   __file__resolveparentr   r   search	MULTILINE)rv   r7   rx   r   rz   r{   r|   r}   r~   r   r   @py_assert8@py_assert10@py_format12@py_format14r   r   r   r   @py_assert7r   runner_pathr   @py_assert9@py_assert11@py_format4r   s                              r   !test_05_pr76_empty_commit_blockedr   $  s;   	<	=BM7F..[/! / F
 ),,$,,,,,,,,,,,,f,,,,,,,&>KCK>CCKKK>CKKK>KKKCKKKVKKKKKKK@ FJJ JBE @ E   @ E  I A  v   EK  I EK  I EO  I 	 I  IE   v      $<919<11999<1999<999199969999999 }11"11111111131113111111}111}111111111M1111111D88KFK8FKEKEEKKKEKKKKKK4KKK4KKK8KKKFKKKKKKEKKKtKKKKKKK889K98K 9B{O9 O3999 O999999499949998999K999 999O999T9999999 	X ''..1TT  



1Cyy 3  y3SM MM M   	#                 4      69    69      AC    AC    AM    N       yy : r|| y:C|T TT T   	#                 ;      =@    =@      HJ    HJ    HT    U       <;c!<<<;c<<<;<<<<<<c<<<c<<<<#<<<<<<<::S ::::S::::::::::S:::S::::":::::::r   c            	     r	   t               } ddg}dddgdddgddd	gdg}| j                  d
||      }|d   }d	}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j
                  |      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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z   d|iz  }t        t        j                  |            d x}x}}|d   }	t        |	      }ddg}
t        |
      }||k(  }|s<t        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |	      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |
      t        j                  |      dz  }t        j
                  |      dz   d|iz  }t        t        j                  |            d x}	x}x}x}
}|d   }d}||u }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j
                  |      dz   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  }t        j
                  |      d#z   d$|iz  }t        t        j                  |            d x}}y )%Nr   z anu_v2/tests/test_some_module.pyrW   r   r   zutils/legacy_helper.pyr   zscripts/run_x.shrX     )rF   r   expected_files_originalcritical_seven_kindrM   rO   rP   rS   rT   	kind_nameEXPECTED_FILES_SCOPE_EXPANSIONrF   proposed_outside_files)zP%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py10)s
{%(py10)s = %(py6)s(%(py8)s)
}rZ   )r\   r]   rR   rT   r   r   z
>assert %(py12)spy12report_to_chairman_requiredTrf   rh   r   z%(py1)s == %(py3)sexpected_filesr   r   r   )rB   *classify_scope_expansion_as_critical_threerl   rm   rn   ro   rp   rq   rZ   rr   rs   rt   )rx   r   r   clsrz   r{   r|   r}   r~   r   r   r   r   @py_format11@py_format13r   r   s                    r   1test_06_scope_expansion_critical_seven_kind_threer   P  s   _F 	 *N
 )Aq6:)RD9#qc2N 
;
;% . < C $%//%*///%///%//////C///////{D?D??DDD?DDDDDD?DDDDDDDDDD{'s's"'''s''''''s'''C'''''''./ 6/0 	!#56F65 0 5    0 5  
F     
   
 0  
 1  
F   5;  
 5;  
 	7 
5   s      ,-::-5:::-:::-::::::s:::::::()@)^;@@@)^@@@)@@@@@@^@@@^@@@@S@@@@@@r   c                    t        d      } | d   }g }g }t        | d   d   | d   d   d|      }t        dd	d
d|      }t        ||      }|d   D cg c]  }|d   |d   ddgdd }}|j	                  |d   |d   |d   |d      }	|	d   }
d}|
|k(  }|st        j                  d|fd|
|f      t        j                  |
      t        j                  |      dz  }t        j                  |	      dz   d |iz  }t        t        j                  |            d x}
x}}|	d!   }
d }|
|u}|st        j                  d"|fd#|
|f      t        j                  |
      t        j                  |      dz  }t        j                  |	      dz   d |iz  }t        t        j                  |            d x}
x}}|	d!   d   }
| d   d   }|
|k(  }|st        j                  d|fd|
|f      t        j                  |
      t        j                  |      dz  }t        j                  |	      dz   d |iz  }t        t        j                  |            d x}
x}}|	d!   d$   }
d}|
|u }|st        j                  d%|fd&|
|f      t        j                  |
      t        j                  |      dz  }t        j                  |	      dz   d |iz  }t        t        j                  |            d x}
x}}|	d'   }
d }|
|u}|st        j                  d"|fd#|
|f      t        j                  |
      t        j                  |      dz  }t        j                  |	      dz   d |iz  }t        t        j                  |            d x}
x}}|	d'   d(   }
d}|
|u }|st        j                  d%|fd&|
|f      t        j                  |
      t        j                  |      dz  }t        j                  |	      dz   d |iz  }t        t        j                  |            d x}
x}}|	d'   d)   }
d}|
|u }|st        j                  d%|fd&|
|f      t        j                  |
      t        j                  |      dz  }t        j                  |	      dz   d |iz  }t        t        j                  |            d x}
x}}|	d'   d   }
d
}|
|k(  }|st        j                  d|fd|
|f      t        j                  |
      t        j                  |      dz  }t        j                  |	      dz   d |iz  }t        t        j                  |            d x}
x}}t        |      }d}||k(  }|st        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  }t        j                  |      d.z   d/|iz  }t        t        j                  |            d x}x}}t        |      }d}||k(  }|st        j                  d|fd*||f      d+t        j                         v st        j                  t              rt        j                  t              nd+d0t        j                         v st        j                  |      rt        j                  |      nd0t        j                  |      t        j                  |      d-z  }t        j                  |      d.z   d/|iz  }t        t        j                  |            d x}x}}|d1   d2   }
d3}|
|k(  }|st        j                  d|fd|
|f      t        j                  |
      t        j                  |      dz  }t        j                  |      dz   d |iz  }t        t        j                  |            d x}
x}}|d1   d4   }
d5}|
|k(  }|st        j                  d|fd|
|f      t        j                  |
      t        j                  |      dz  }t        j                  |      dz   d |iz  }t        t        j                  |            d x}
x}}y c c}w )6N/stale_prevention_replacement_pr_clean_path.jsonrD   expected_replacement_prr    r!   
newsha1234)r    r!   r"   r&   Tx   PR_OPEN_GEMINI_TRIGGER_OKF)r/   r0   r1   r2   r&   r5   r6   minor_fix_threadsr   r1   r   rW   r   r   r   original_headrH   ra   rb   rc   REPLACEMENT_PR_OPENEDrM   rO   rP   rS   rT   re   is notz%(py1)s is not %(py4)sr#   rf   rh   ri   r/   r2   r   r   r   r   r   r   health_callsr   r,   r   r-      )r   r)   r3   rB   ru   rl   rm   rn   ro   rp   rq   r   rr   rs   rt   )rv   inpr   r  r   fake_healthrx   trw   r   rz   r{   r|   r}   r~   r   r   r   s                     r   !test_07_replacement_pr_clean_pathr  p  s{   	?	@B
W+CKL4 !:;<ST789MN)	 )2"K '7%0F () 	 ; 01%8A3G	
F  m$_- #$= >%(  J i G$;G $;;GGG $;GGG GGG$;GGGZGGGGGGGn%=T=%T1===%T===%===T===:=======>"#:;'()@A;A	B  ;A  		 	<  		 B   z     n%&=>R$R>$FRRR>$RRR>RRR$RRR
RRRRRRR*+C4C+47CCC+4CCC+CCC4CCCCCCCCCC*+,>?S4S?4GSSS?4SSS?SSS4SSSSSSSSSS*+,BCXuXCuLXXXCuXXXCXXXuXXXjXXXXXXX'()9:>Y:>YY  :>Y 	 	; 	 ?Z   z     {-q-q ---q------3---3------{---{------q---+-------|//!/////////3///3//////|///|/////////<///////?+,BB,4BBB,BBB,BBBBBBlBBBBBBB??+@s@+s2@@@+s@@@+@@@s@@@L@@@@@@@Cs   cc                 h   t        d      } | d   }t               }t        dddd      }t        ||      }dd	d
dgddg}|j	                  |d   |d   |d   |d      }|d   }d }||u}	|	st        j                  d|	fd||f      t        j                  |      t        j                  |      dz  }
t        j                  |      dz   d|
iz  }t        t        j                  |            d x}x}	}|d   d   }d}||k(  }	|	st        j                  d|	fd||f      t        j                  |      t        j                  |      dz  }
t        j                  |      dz   d|
iz  }t        t        j                  |            d x}x}	}|d   d   }d}||u }	|	st        j                  d|	fd||f      t        j                  |      t        j                  |      dz  }
t        j                  |      dz   d|
iz  }t        t        j                  |            d x}x}	}|d   d   }d}||u }	|	st        j                  d|	fd||f      t        j                  |      t        j                  |      dz  }
t        j                  |      dz   d|
iz  }t        t        j                  |            d x}x}	}t        dddd       }t        ||      }t        j                  t        t        t        f      5  |j	                  |d   |d   |d   |d       d d d        y # 1 sw Y   y xY w)!Nr   rD   Fr  PR_OPEN_GEMINI_TRIGGER_MISSEDr.   r   rW   r   r   r   r   r   r   rH   ra   rb   ri   r   r  rP   rS   rT   r1   rM   rO   r/   rf   rh   r2   iX  T)r   r)   r3   rB   ru   rl   rm   rn   ro   rp   rq   pytestraises
ValueErrorRuntimeError)rv   r  r   fake_health_missedrx   rw   r   rz   r{   r|   r}   r~   fake_health_pollingrunner_violators                 r   ;test_08_pr_open_health_gate_evidence_missed_no_long_pollingr    s   	?	@B
W+C46/6"	 '7%7F 2%8A3G	
F m$_- #$= >%(  J *+C4C+47CCC+4CCC+CCC4CCCCCCCCCC'()9:>]:>]]  :>] 	 	; 	 ?^   z     *+,>?T5T?5HTTT?5TTT?TTT5TTT*TTTTTTT*+,BCXuXCuLXXXCuXXXCXXXuXXXjXXXXXXX 16!	 $'7%8O
 

NLA	B 
-( 1$'(A$B#), 	 	

 
 
s   ? L((L1c           
        ddl ddl}ddl}j                  |       }g fd |       | j	                         }dgt        |      z  }D ]1  \  }}t        |dz
  t        |t        |                  D ]  }d||<   	 3 t        |      D 	cg c]  \  }}	||   s|	 }
}}	dj                  |
      }g }	 |j                  |j                  |      j                        }|D ]-  }|j                  |j                  k(  r|j                  |       / |j!                  |      }|S c c}	}w # t"        $ r |}Y |S w xY w)uh   AST로 module/class/function docstring을 제거하고 # 주석을 제거하여 실행 코드만 반환.r   Nc                
   t        | j                  j                  j                  j                  f      rt        | dd       }|rt        |d   j                        rt        |d   j                  j                        rat        |d   j                  j                  t              r:|d   }j                  |j                  |j                  xs |j                  f       j                  |       D ]
  } |        y )Nbodyr   )
isinstanceModuleFunctionDefAsyncFunctionDefClassDefgetattrExprvalueConstantstrr%   lineno
end_linenoiter_child_nodes)noder  firstchildastdocstring_rangesvisits       r   r(  z-_strip_docstrings_and_comments.<locals>.visit  s    3::s0D0DcllS
 4.D
47CHH5*T!W]]TWT`T`:ad1gmm1137 GE$++U\\5;K;K;[u||,\]))$/ 	E%L	r   TrW   F
)r&  iotokenizeparse
splitlinesr   rangemin	enumeratejoingenerate_tokensStringIOreadlinetypeCOMMENTr%   
untokenize	Exception)r   r*  r+  treer   keepstartendilncode_only_lines	code_onlyouttokenstokr   r&  r'  r(  s                   @@@r   _strip_docstrings_and_commentsrD    sR    99S>D.0
 
$KNNE6CJD& 
suqy#c3u:"67 	ADG	 (1'7Cea47rCOC		/*I C	))"++i*@*I*IJ 	Cxx8+++JJsO	
 $$S) M D  Ms   D-#D->A-D3 3EEc                 
   t               } t        j                  t        j                  | j
                           }t        |      }t        j                  d|      }g }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        j                  dt!        |       d|d d        d	z   d
|iz  }t#        t        j$                  |            d x}}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}}t        j&                  }d}	 ||	|      }
|
 }|s t        j                  d      dz   dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |	      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |
      dz  }t#        t        j$                  |            d x}x}	x}
}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}}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}}g d}|D ]  }||v}|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      nd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 } y )!Nz\.md\brM   )z%(py0)s == %(py3)smd_hits)r\   r   u/   .md fallback path 금지 (코드 path에 found z):    r   r   z	qc-resultr   r   code_srcr   u:   qc-result 파일 참조 금지 (md/report fallback 차단)zread_text\([^)]*\.mdu   read_text(...md) 호출 금지zW
>assert not %(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.search
}(%(py4)s, %(py5)s)
}r   )r\   r]   rR   r   r^   zGemini PASSu&   Gemini PASS magic-string 매칭 금지z/gemini reviewu1   bot /gemini review 코멘트 금지 (코드 path))z--forcez--force-with-leasezgit push -fz
force-push)z%(py0)s not in %(py2)skwr\   r]   u   force-push 동사 금지: 
>assert %(py4)srR   )r   inspect	getsourcesysmodules
__module__rD  r   findallrl   rm   rr   rs   rt   rn   ro   r   rp   rq   r   )rA   full_srcrH  rF  r|   r   r   r   rz   r{   r   r   r   	forbiddenrI  @py_format3r}   s                    r   'test_09_no_md_report_fallback_in_runnerrU  "  s   F  V->->!?@H-h7H jjH-G 7b=  7b                  :#g,s7SUTU;-X    
  ;h&  ;h          '    '    	E    
 yy]0]y0(;];;];]]=]]]]]]]r]]]r]]]y]]]0]]]]]](]]](]]];]]]]]] R=(RRR=RRR=RRRRRRRRRRRRR*RRRRRRR `8+```8`````````8```8````-``````` OI E!DDDrDDDDDDrDDDrDDDDDDDDDDDDD%?t#DDDDDDDEr   c            
     F   t               } | j                  }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }t        j                  | j                        dz   d|iz  }t        t        j                  |            d x}x}}g d}|D ]  }t        | |      }|st        j                  d	|       d
z   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dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            d }t        | |      }t        |      }	|	syt        j                  d|       dz   dt	        j
                         v st        j                  t              rt        j                  t              nd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dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      dz  }t        t        j                  |            d x}}	 t        j                  | j                         }
h d}t#        |
j$                  j'                               dhz
  }||k  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      nddt	        j
                         v st        j                  |      rt        j                  |      nddz  }t        j                  d| d|       dz   d|iz  }t        t        j                  |            d }t        j                  | j(                        }h d}t#        |j$                  j'                               dhz
  }||k  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndd t	        j
                         v st        j                  |      rt        j                  |      nd dz  }t        j                  d!| d|       dz   d|iz  }t        t        j                  |            d }t        j                  | j*                        }d"d#h}t#        |j$                  j'                               dhz
  }||k  }|st        j                  d|fd||f      d$t	        j
                         v st        j                  |      rt        j                  |      nd$d%t	        j
                         v st        j                  |      rt        j                  |      nd%dz  }t        j                  d&| d|       dz   d|iz  }t        t        j                  |            d }t        j                  | j,                        }d'd(h}t#        |j$                  j'                               dhz
  }||k  }|st        j                  d|fd||f      d)t	        j
                         v st        j                  |      rt        j                  |      nd)d*t	        j
                         v st        j                  |      rt        j                  |      nd*dz  }t        j                  d+| d|       dz   d|iz  }t        t        j                  |            d }t        j                  | j.                        }h d,}t#        |j$                  j'                               dhz
  }||k  }|st        j                  d|fd||f      d-t	        j
                         v st        j                  |      rt        j                  |      nd-d.t	        j
                         v st        j                  |      rt        j                  |      nd.dz  }t        j                  d/| d|       dz   d|iz  }t        t        j                  |            d }t        j                  | j0                        }h d0}t#        |j$                  j'                               dhz
  }||k  }|st        j                  d|fd||f      d1t	        j
                         v st        j                  |      rt        j                  |      nd1d2t	        j
                         v st        j                  |      rt        j                  |      nd2dz  }t        j                  d3| d|       dz   d|iz  }t        t        j                  |            d }d4}t        | |      }|st        j                  d5      d6z   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                  |      d7z  }t        t        j                  |            d x}}| j2                  }d8}||k(  }|st        j                  d|fd9||f      dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }t        j                  d:| j2                         dz   d|iz  }t        t        j                  |            d x}x}}t        j                  | j4                        }h d;}t#        |j$                  j'                               dhz
  } || k  }|st        j                  d|fd|| f      d<t	        j
                         v st        j                  |      rt        j                  |      nd<d=t	        j
                         v st        j                  |       rt        j                  |       nd=dz  }t        j                  d>| d|        dz   d|iz  }t        t        j                  |            d }y )?Nr   rM   )z0%(py2)s
{%(py2)s = %(py0)s.__name__
} == %(py5)srA   )r\   r]   r   z
>assert %(py7)sr^   )rk   r   run_pr_open_health_gater   r   %classify_replacement_contract_framingru   zmissing method: z7
>assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}hasattrm)r\   rQ   r]   rR   znot callable: zU
>assert %(py7)s
{%(py7)s = %(py0)s(%(py5)s
{%(py5)s = %(py1)s(%(py2)s, %(py3)s)
})
}callabler  )r\   rQ   r]   r   r   r^   >   rF   rJ   rE   rH   self)<=)z%(py0)s <= %(py2)sexpected_paramsactual_paramsrJ  z.evaluate_push_safety params missing: expected z, got rK  rR   >   r   r   r   r   expected_pivotactual_pivotz1pivot_to_replacement_pr params missing: expected r,   r"   expected_gateactual_gatez1run_pr_open_health_gate params missing: expected rF   r   expected_blockactual_blockz4block_empty_commit_attempt params missing: expected >   rF   r   r   expected_scopeactual_scopezDclassify_scope_expansion_as_critical_three params missing: expected >   rF   r   rJ   rE   rH   expected_run
actual_runzrun params missing: expected GRACE_SECONDS_PR_OPEN_HEALTHu*   GRACE_SECONDS_PR_OPEN_HEALTH 상수 부재z7
>assert %(py5)s
{%(py5)s = %(py0)s(%(py1)s, %(py3)s)
})r\   rQ   r   r   r  )zD%(py2)s
{%(py2)s = %(py0)s.GRACE_SECONDS_PR_OPEN_HEALTH
} == %(py5)su$   grace = 180 (task-2544 동일), got >   original_pr_stateoriginal_pr_numberreplacement_task_idoriginal_pr_merged_atreplacement_expected_files origin_main_effective_diff_filesexpected_framingactual_framingz?classify_replacement_contract_framing params missing: expected )r   __name__rl   rm   rr   rs   rt   rn   ro   rp   rq   rY  r  r[  rL  	signaturerk   set
parameterskeysr   rW  r   r   ru   rj  rX  )!rA   r   r   r{   r   r   methodsrZ  r}   r   sigr^  r_  rT  	sig_pivotr`  ra  sig_gaterb  rc  	sig_blockrd  re  	sig_scoperf  rg  sig_runrh  ri  r|   sig_framingrq  rr  s!                                    r   test_10_interface_contractr  E  s
   F??L;L?;;LLL?;LLLLLL6LLL6LLL?LLL;LLLV__LLLLLLLG  Bvq!9!99%5aS#9999999w999w999999v999v999999q999q999!999999*Ax*+A+AA~aS-AAAAAAAxAAAxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA*AAA+AAAAAAB
 

F77
8CO ++-.&9Mm+  ?m                ,    ,    98IP]_    
 !!&"@"@AIN y++0023vh>L\)  >\                *    *    <N;K6R^Q_`    
   !?!?@H%'=>Mh))..01VH<KK'  =K                (    (    <M?&Q\P]^    
 !!&"C"CDI!4(Ny++0023vh>L\)  >\                *    *    ?~>NfUaTbc    
 !!&"S"STIONy++0023vh>L\)  >\                *    *   "#6,	9     

+GL W'',,./6(:J:%  <:                &    &    (~VJ<H    
 : 769: :   	5                       :    ;      .. # .#5  .#              /    36    /v/R/R.ST    
 ##F$P$PQK //44676(BN~-  ~                 .     .   $%VN+;	=    r   c            	        ddl m} m} g }t        |      }|j	                  dddddgg d	
      }|d   }d}||u }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j                  d|       dz   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}}|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}}|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}||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}||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}}|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  }t        j                  d'|d#          d(z   d)|iz  }t        t        j                  |            dx}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 cg c]  }|j                  d+      d,k(  r| }}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                  |      d0z  }	d1d2|	iz  }t        t        j                  |            dx}x}}|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   d3   }d4}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}yc c}w )5u  REPLACEMENT_PR_CONTRACT_FRAMING_INCONSISTENT_WITH_ORIGIN_MAIN_STATE 회귀 박제.

    PR #93 사고 reproduce: original PR OPEN + replacement expected_files 축소 →
    runner 가 contract_framing_inconsistent=True / Critical 7종 #6 보고 필요로 분류해야 한다.
    r   )0CRITICAL_SEVEN_KIND_REPLACEMENT_CONTRACT_FRAMING5CRITICAL_SEVEN_KIND_REPLACEMENT_CONTRACT_FRAMING_NAMEr   ztask-2545+1\   OPENN(anu_v2/gemini_stale_prevention_runner.pyr  z8anu_v2/tests/test_gemini_stale_prevention_runner_2545.pyzDanu_v2/fixtures/stale_prevention_false_positive_same_pr_resolve.jsonz<anu_v2/fixtures/stale_prevention_pr76_empty_commit_fail.jsonz6anu_v2/fixtures/stale_prevention_pr86_same_pr_fix.jsonz:anu_v2/fixtures/stale_prevention_pr88_unresolved_push.jsonz?anu_v2/fixtures/stale_prevention_replacement_pr_clean_path.jsonrm  rl  rk  rn  ro  rp  contract_framing_inconsistentTrf   rh   rP   uH   PR #93 사고 reproduce: contract_framing_inconsistent=True 기대, got rS   rT   r   rM   r   r  r   zassert %(py5)sr      rO   assert %(py6)sr   r  CREPLACEMENT_PR_CONTRACT_FRAMING_INCONSISTENT_WITH_ORIGIN_MAIN_STATEr   rk  original_pr_unmergedmissing_from_replacementrY   r   r[   z2missing files = 6 (7 effective - 1 declared), got r_   r`   r   
audit_kind+critical_seven_replacement_contract_framingrW   r   framing_auditsr   zassert %(py8)sr   r   r   )r   r  r  rB   rX  rl   rm   rn   ro   rp   rq   rr   rs   rt   r   r   )r  r  r7   rx   r   rz   r{   r|   r}   r~   r   r   r   r   r   r   r   rr  r   r   s                        r   ;test_11_contract_framing_inconsistent_when_original_pr_openr    sY   
 M7F 99) "6$
*
 : F& 12 d 2d:  2d    3    7;    SSYRZ[     '(\(,\\\\\(,\\\\(\\\\\\,\\\\,\\\\\\\\'(-A-(A----(A---(---A-------+W"WWWWW"WWWWWWWWWW"WWWW"WWWWWWWW+g"gg"ggggg"ggggggg"gggggggg- &B& B&&&& B&&& &&&B&&&&&&&%&0&0&&0000&&000&000&0000000()1T1)T1111)T111)111T111111101 312 a 2a7  2a              2    3    78    =VD^=_<`a      /08D80D88880D8880888D8888888 !55"OO 	
N  ~#!#!####!######3###3######~###~######!#######!238q83q88883q8883888q8888888!:;CtC;tCCCC;tCCC;CCCtCCCCCCC!Y'5:5':5555':555'555:5555555s   #cc                 P   g } t        |       }g d}|j                  ddd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	}||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}}|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)u   task-2545+2 corrected replacement 정상 케이스.

    replacement expected_files (7) == origin/main effective diff (7) →
    contract_framing_inconsistent=False / report_to_chairman_required=False.
    r   r  ztask-2545+2r  r  Nr  r  Frf   rh   rP   r  rT   r   r  rM   rO   r  TrB   rX  rl   rm   rn   rp   rq   )	r7   rx   seven_filesr   rz   r{   r|   r}   r~   s	            r   Ctest_12_contract_framing_ok_when_replacement_matches_effective_diffr    s    M7FK 99) "#.)4 : F 12;e;2e;;;;2e;;;2;;;e;;;;;;;/09E90E99990E9990999E9999999,-33-3333-333-3333333333()1T1)T1111)T111)111T1111111r   c            	     N   g } t        |       }|j                  dddddgddg      }|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   }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)u>  original PR 이 main 에 머지된 경우 expected_files 축소가 정당.

    예: original PR 머지 후 follow-up replacement 가 1 file 만 수정해도
    inconsistent 가 아니다. (origin/main 에는 이미 산출물이 반영되어 있으므로
    replacement 는 추가/수정분만 산정하면 됨)
    r   ztask-XXXX+1r   MERGEDr4   r   zanu_v2/some_other.pyr  r  Frf   rh   rP   r  rT   Nr  r   r  )r7   rx   r   rz   r{   r|   r}   r~   s           r   3test_13_contract_framing_ok_when_original_pr_mergedr  !  s@    M7F99)"4$;#<#"*
 : 
F ()2U2)U2222)U222)222U222222212;e;2e;;;;2e;;;2;;;e;;;;;;;/09E90E99990E9990999E9999999r   )r   r  returnzdict[str, Any])r   ztask/task-XXXX-replacement-1r   N)r    intr!   r  r"   r  r&   list | None)T<   r   FN)
r/   boolr0   r  r1   r  r2   r  r&   r  )r7   r  r8   r  )r   r  r  r  ).__doc__
__future__r   builtinsrr   _pytest.assertion.rewrite	assertionrewriterl   rL  r   r   rN  pathlibr   typingr   r  r   r   parentsWORKSPACE_ROOTr  pathinsertr   r   r   r   r)   r3   rB   r   r   r   r   r   r   r  r  rD  rU  r  r  r  r  r(   r   r   <module>r     s  ( #     	 
    h'')11!4~chh&HHOOAs>*+H~%%'..55
BI' "&< ,	  	8 "5!&  	
 8 $(!%!%% 	
 
4K@#@R0ZlK>&;XA@:A@<
D-`EFir96~2H:r   