
    jM                       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mZ ddlZ ee      j                         j                   j                   j                   Z ee      e
j&                  v r!e
j&                  j)                   ee             e
j&                  j+                  d ee             ddlmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(  ee      j                         j                   dz  dz  Z)dd	d
dgdddZ*d9dZ+d:d;dZ,d Z-d Z.d Z/ G d d      Z0d<dZ1d Z2ejf                  ji                  d e2       d       d        Z5d Z6d Z7d Z8d Z9ejf                  ji                  d g d!      d"        Z:d# Z;ejf                  ji                  d e2       d$       d%        Z<d& Z=d' Z>d( Z?d) Z@d* ZAd+ ZBd, ZCd- ZDd. ZEd/ ZFd0 ZGd1 ZHd2 ZId3 ZJd4 ZKd5 ZLd6 ZMd7 ZNd8 ZOy)=u  tests/regression/test_anu_codex_bounded_loop_2592.py — task-2592 Phase 2 회귀.

Phase 1 LOCKED spec: memory/tasks/task-2592.md
(v4 LOCKED, sha256 23d0bc4d74793e1f4886020f5528d01a28d562a9efbd60088c4510df532a91bc).

회장 Phase 2 §7 verification conditions 8건 + spec §3~§9 검증:

1. fixture tests PASS
2. Critical 7 classifier 7/7 정확 분류
3. non-critical + no-write + no-forbidden-action → auto_execute_allowed=true
4. Critical 7 케이스 → HOLD_FOR_CHAIR
5. loop limit 초과 → HOLD_FOR_CHAIR
6. Codex CC 는 실행하지 않고 검토/판정/제안만 (boundary)
7. ANU 만 실행 주체 (boundary)
8. 실제 자동화 모듈 호출은 mock/fixture 로만 검증

모든 테스트 100% offline — 실제 자동화 모듈 / network / git 호출 0건.
    )annotationsN)Path)ALLOWED_AUTOMATION_MODULESBoundedReviewLoop	Critical7LoopVerdictModuleInvocationNoRealExecutionErrorSignalsStateany_critical_7auto_execute_allowedclassify_critical_7codex_boundary_okcritical_7_hitshold_for_chairno_real_execution_invokervalidate_decision_digestvalidate_review_requestvalidate_review_responsefixturesanu_codex_bounded_loop_2592u)   merge_queue ready PR 자동 머지 판단merge_queue_executormockza.pyzcontract@sha256:deadbeefz+non-critical, no write, no forbidden action)intenttarget_modulemodeexpected_filescontract_ref	rationalec                     t               S N)r        H/home/jay/workspace/tests/regression/test_anu_codex_bounded_loop_2592.py_clean_signalsr&   G   s
    9r$   c                      fd}|S )Nc                 .     xs t        t              fS r"   )dictGOOD_PROPOSAL)proposalsignalss   r%   fnz_propose.<locals>.fnL   s    8T-%899r$   r#   )r,   r+   r-   s   `` r%   _proposer.   K   s    : Ir$   c           	     $    dd| d   |dddi ddd	S )
Nanu_codex_review_response_v12026-05-15T11:30:00Zloop_idr   review_roundrepair_roundPASSTFschemats_utcr2   roundverdictcritical_7_assessmentcodex_anu_verdict_agreementexecution_performedr#   digestr4   s     r%   _codex_passrA   R   s.    0()$".B!#'+$	 	r$   c           	     $    dd| d   |dddi dddS )	Nr0   r1   r2   r   r3   NEEDS_REVISIONFr7   r#   r?   s     r%   _codex_needs_revision_foreverrD   _   s.    0()$".B#!#',$	 	r$   c                    | S r"   r#   r,   _resps     r%   _no_revisionrH   l   s    Nr$   c                      e Zd ZdZd ZddZy)
SpyInvokeruP   ANU 전용 실행 spy — S5 에서만 호출돼야 한다 (boundary 검증용).c                    g | _         y r"   )calls)selfs    r%   __init__zSpyInvoker.__init__s   s	    ,.
r$   c                Z    | j                   j                  ||f       t        ||dd      S )NTu   mock — no real execution)moduler   	performednote)rL   appendr	   )rM   rP   r   s      r%   __call__zSpyInvoker.__call__v   s/    

64.);W
 	
r$   N)rP   strr   rU   returnr	   )__name__
__module____qualname____doc__rN   rT   r#   r$   r%   rJ   rJ   p   s    Z/
r$   rJ   c                   t         j                  | j                  dkD  t         j                  | j                  xr | j
                  t         j                  | j                  xr | j                   xs | j                  t         j                  | j                  xs | j                  t         j                  | j                  xs | j                  t         j                   | j
                  t         j"                  | j$                  iS )uJ   spec §6 표 verbatim 의 독립 reference 구현 (classifier 와 별도).r   )r   C1_FORBIDDEN_PATH_INTRUSIONforbidden_path_count<C2_REPLACEMENT_PR_AUTO_CREATION_FAILED_FOR_CONTAMINATED_DIFFcontract_mismatchreplacement_pr_failed+C3_GEMINI_REAL_BUG_REQUIRES_SCOPE_EXPANSIONgemini_real_bugexpected_files_matchscope_expansion1C4_BLOCK_OVERRIDE_REQUIRED_OR_REASON_INSUFFICIENTblock_override_neededoverride_reason_insufficient,C5_DEPENDENCY_CYCLE_OR_SERIAL_ONLY_COLLISIONdependency_cycleserial_only_collisionC6_REPLACEMENT_PR_FAILEDC7_POST_MERGE_SMOKE_FAILEDpost_merge_smoke_failed)ss    r%   _ref_classifyro      s     	--q/E/E/INN;A$;$;==U(>(>$>#T1CTCTCC##Eq'E'E>>9!"9"9**A,C,C,,a.G.G r$   c                 `    t        j                  t        dz  j                               } | d   S )Nzcritical7_cases.jsoncases)jsonloadsFIXTURES	read_text)datas    r%   _load_c7_casesrw      s)    ::x"88CCEFD=r$   casec                    | d   S Nnamer#   cs    r%   <lambda>r~      
    6 r$   )idsc                   t        di | d   }t        |      }| 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| d    d	|       d
z   d|iz  }t        t        j                  |            d x}}y )Nr,   
expect_hitin)z%(py1)s in %(py3)shits)py1py3r{   z: expected z in z
>assert %(py5)spy5r#   )r   r   
@pytest_ar_call_reprcompare	_saferepr@py_builtinslocals_should_repr_global_name_format_assertmsgAssertionError_format_explanation)rx   rn   r   @py_assert0@py_assert2@py_format4@py_format6s          r%   1test_critical7_classifier_each_case_hits_expectedr      s    "$y/"A1D %            "&    "&    <.D$6#7tD6B    r$   c            
        t               D ]  } t        di | d   }t        |      }t        |      }||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                  |      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                  |      dz  }t	        j                  | d         d	z   d
|iz  }t        t	        j                  |            dx}x}} y)u\   7 케이스 전부에서 classifier 출력이 spec §6 reference 와 정확히 일치 (7/7).r,   ==)zN%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py8)s
{%(py8)s = %(py5)s(%(py6)s)
}r   rn   ro   )py0r   r   r   py6py8r{   z
>assert %(py10)spy10Nr#   )rw   r   r   ro   r   r   r   r   r   r   r   r   r   )rx   rn   r   @py_assert7@py_assert4@py_format9@py_format11s          r%   >test_critical7_classifier_matches_spec_reference_for_all_casesr      s     H&d9o&"1%Gq)9G%)99GGG%)9GGGGGG"GGG"GGGGGG1GGG1GGG%GGGGGGGGGGGGGGGqGGGqGGG)9GGG4<GGGGGGGHr$   c                    t               } t        |       }g }||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                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x} x}x}}t               } t        |       }d}||u }|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                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x} x}x}}y )Nr   )zG%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s()
})
} == %(py8)sr   r&   r   r   r   r   r   assert %(py10)sr   FiszG%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s()
})
} is %(py8)sr   )r&   r   r   r   r   r   r   r   r   r   r   )r   r   r   @py_assert6r   r   s         r%   #test_critical7_clean_signals_no_hitr      sL   )+2?+,22,2222,222222?222?222222>222>222+222,2222222222(*4>*+4u4+u4444+u444444>444>444444.444.444*444+444u4444444r$   c                    t        dd      } t        |       }t        j                  }|j                  }||v }|st        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                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d
x}x}}t        j                  }|j                  }||v }|st        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                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d
x}x}}y
)uN   spec §6 정의상 C2(contract_mismatch&&replacement_pr_failed) 는 C6 동반.T)r_   r`   r   )z%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.C2_REPLACEMENT_PR_AUTO_CREATION_FAILED_FOR_CONTAMINATED_DIFF
}.value
} in %(py6)sr   r   r   py2py4r   assert %(py8)sr   N)z[%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.C6_REPLACEMENT_PR_FAILED
}.value
} in %(py6)s)r   r   r   r^   valuer   r   r   r   r   r   r   r   rk   )rn   r   @py_assert1@py_assert3@py_assert5@py_format7r   s          r%   5test_critical7_c2_implies_c6_is_intended_spec_mappingr      sN   $dCA1DQQ_QWW_W[_____W[_______9___9___Q___W______[____[________--;-33;3t;;;;3t;;;;;;9;;;9;;;-;;;3;;;;;;t;;;t;;;;;;;r$   c                    t               } t        |       }d}||u }|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                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x} x}x}}t        t                     \  }}g }d	}||u }	|	}
|	r	g }||k(  }|}
|
sXt        j                  d|	fd
||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }|j                  |       |	rt        j                  dfd|f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            d x}
x}x}	x}x}}y )NTr   r   r   r&   r   r   r   F)z%(py2)s is %(py5)sheld)r   r   z%(py7)spy7r   )z%(py9)s == %(py12)sreasons)py9py12z%(py14)spy14r   zassert %(py17)spy17)r&   r   r   r   r   r   r   r   r   r   r   rS   _format_boolop)r   r   r   r   r   r   r   r   r   r   r   @py_assert11@py_assert10r   @py_format8@py_format13@py_format15@py_format16@py_format18s                      r%   -test_auto_execute_allowed_true_for_clean_caser      s~    . 09 019T91T99991T999999999999999999999 09991999T9999999">#34MD'*5*45=**W]****45******4***4***5*******W******W***W*****************r$   field)permission_escalation$forbidden_write_target_change_neededreal_write_mode_neededgithub_write_neededgit_mutation_neededdev_bot_reactivation_neededc                `   t               }t        || d       t        |      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}x}}t        |      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 )NTFr   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} is %(py6)sr   rn   r   r   r   r   r   r   r   )z%(py1)s is %(py4)sr   r   assert %(py6)sr   )r&   setattrr   r   r   r   r   r   r   r   r   r   )
r   rn   r   r   r   r   r   r   r   @py_format5s
             r%   @test_auto_execute_allowed_false_when_any_write_or_forbidden_flagr      s    	AAud"+e+"e++++"e+++++++++++++++++++++"+++e+++++++!Q'4'4''''4''''''4'''''''r$   c                 D   t               } d| _        t        |       }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )	NFr   r   r   rn   r   r   r   )r&   rc   r   r   r   r   r   r   r   r   r   )rn   r   r   r   r   r   s         r%   :test_auto_execute_allowed_false_on_expected_files_mismatchr      s    A"A"+e+"e++++"e+++++++++++++++++++++"+++e+++++++r$   c                    | d   S rz   r#   r|   s    r%   r~   r~      r   r$   c                   t        d"i | d   }t        |      }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  t              rt        j                  t              nddt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}x}}t        |      \  }}d
}||u }	|	st        j                  d|	fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }
dd|
iz  }t        t        j                  |            d x}	}d |D        }	t        |	      }|sddt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |	      t        j                  |      dz  }t        t        j                  |            d x}	}t        t        |      t        t        t!                     }|j#                         }|j$                  }	t&        j(                  }|	|k(  }|st        j                  d|fd|	|f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |	      dt	        j
                         v st        j                  t&              rt        j                  t&              ndt        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}	x}}|j*                  }	t,        j.                  }|	|k(  }|st        j                  d|fd|	|f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |	      dt	        j
                         v st        j                  t,              rt        j                  t,              ndt        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}	x}}| d   }|j0                  }||v }|st        j                  d|fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }d d!|iz  }t        t        j                  |            d x}x}}y )#Nr,   Fr   r   r   rn   r   r   r   T)z%(py0)s is %(py3)sr   )r   r   zassert %(py5)sr   c              3  >   K   | ]  }|j                  d         yw)zcritical_7:N
startswith.0rs     r%   	<genexpr>z@test_critical7_case_results_in_hold_for_chair.<locals>.<genexpr>   s     <qq||M*<   ,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}anyr   r   r   
propose_fncodex_review_fnanu_revise_fnmodule_invokerr   zS%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py6)s
{%(py6)s = %(py4)s.HOLD_FOR_CHAIR
}resultr   r   zZ%(py2)s
{%(py2)s = %(py0)s.final_state
} == %(py6)s
{%(py6)s = %(py4)s.S6_HOLD_FOR_CHAIR
}r   r   r   )z6%(py1)s in %(py5)s
{%(py5)s = %(py3)s.critical_7_hit
}r   r   r   assert %(py7)sr   r#   )r   r   r   r   r   r   r   r   r   r   r   r   r   r.   rA   rH   rJ   runr;   r   HOLD_FOR_CHAIRfinal_stater   S6_HOLD_FOR_CHAIRcritical_7_hit)rx   rn   r   r   r   r   r   r   r   r   r   r   r   r   loopr   r   r   s                     r%   -test_critical7_case_results_in_hold_for_chairr      s<   "$y/"A"+e+"e++++"e+++++++++++++++++++++"+++e+++++++"1%MD'44<44444<G<<3<<<<<<<<<3<<<3<<<<<<<<<<<<<<A;#"!|	D XXZF>>7[777>77777>777777767776777>777777[777[777777777778!8!88!88888!888888868886888888888888888!888888886!6!66!66666!6666666666666666!66666666r$   c                 Z
   t               } t        t        t                     t        t
        | dd      }|j                         }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }d	d
|iz  }t!        t        j"                  |            d x}x}}|j$                  }t&        j(                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t&              rt        j                  t&              ndt        j                  |      dz  }d	d
|iz  }t!        t        j"                  |            d x}x}}d}|j*                  }	||	v }
|
st        j                  d|
fd||	f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      dz  }dd|iz  }t!        t        j"                  |            d x}x}
}	|j,                  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}
}|j,                  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}
}| j.                  }g }	||	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  }dd|iz  }t!        t        j"                  |            d x}x}}	y )N      )r   r   r   r   max_review_roundsmax_repair_roundsr   r   r   r   r   r   r   r   r   loop_limit_exceededr   z4%(py1)s in %(py5)s
{%(py5)s = %(py3)s.hold_reasons
}r   r   r   r:   r4   )<=)z%(py1)s <= %(py4)sr   r   r   r5   z-%(py2)s
{%(py2)s = %(py0)s.calls
} == %(py5)sspyr   r   r   )rJ   r   r.   r&   rD   rH   r   r;   r   r   r   r   r   r   r   r   r   r   r   r   r   hold_reasonsr@   rL   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   s                 r%   (test_loop_limit_exceeded_holds_for_chairr     s    
,CN,-5"D XXZF>>7[777>77777>777777767776777>777777[777[777777777778!8!88!88888!888888868886888888888888888!88888888 7F$7$77 $77777 $7777 777777F777F777$77777777==!.16Q61Q66661Q6661666Q6666666==!.16Q61Q66661Q6661666Q6666666999?9339r$   c                 P   t        t        t                     t        t        t                     } | j                         }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }t!        t        j"                  |            d x}x}}d	}|j$                  }||v }	|	st        j                  d
|	fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }
dd|
iz  }t!        t        j"                  |            d x}x}	}y )Nr   r   r   r   r   r   r   r   verdict_disagreement_persistentr   r   r   r   r   )r   r.   r&   rD   rH   rJ   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   s               r%   *test_persistent_verdict_disagreement_holdsr    s9   N,-5"!|	D XXZF>>7[777>77777>777777767776777>777777[777[77777777777,C0C0CC,0CCCCC,0CCCC,CCCCCCCCCCCC0CCCCCCCCr$   c            	        dddddddi ddd	} t        |       }d
}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               nddt        j                         v st        j
                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}d t        |       D        }t        |      }|sddt        j                         v st        j
                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}y )Nr0   r1   xr   r   r3   r6   Tr7   Fr   r   r   badr   r   r   c              3  $   K   | ]  }d |v  
 ywBOUNDARY_VIOLATIONNr#   r   es     r%   r   zLtest_codex_boundary_execution_performed_true_is_violation.<locals>.<genexpr>"  s     PQ#q(P   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   )	r  r   r   r   r   r   r   r   r   s	            r%   9test_codex_boundary_execution_performed_true_is_violationr    s   0("#Q7!#'+#	C S!*U*!U****!U***************S***S***!***U*******P2J32OPP3PPPPPPPPP3PPP3PPPPPPPPPPPPPPr$   c                    d } t               }t        t        t                     | t        |      }|j                         }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd	|iz  }t        t        j                   |            d x}x}}d
 |j"                  D        }t%        |      }|sddt        j                         v st        j                  t$              rt        j                  t$              ndt        j                  |      t        j                  |      dz  }	t        t        j                   |	            d x}}|j&                  }g }
||
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  }dd|iz  }t        t        j                   |            d x}x}}
y )Nc                (    t        | |      }d|d<   |S )NTr>   rA   r@   r4   r   s      r%   codex_executeszNtest_loop_holds_when_codex_reports_execution_performed.<locals>.codex_executes&  s    -#'
 r$   r   r   r   r   r   r   r   r   c              3  $   K   | ]  }d |v  
 ywr
  r#   r   s     r%   r   zItest_loop_holds_when_codex_reports_execution_performed.<locals>.<genexpr>4  s     FQ#q(Fr  r   r   r   r   r   r   r   r   )rJ   r   r.   r&   rH   r   r;   r   r   r   r   r   r   r   r   r   r   r  r   rL   )r  r   r   r   r   r   r   r   r   r   r   r   r   s                r%   6test_loop_holds_when_codex_reports_execution_performedr  %  s   
 ,CN,-&"	D XXZF>>7[777>77777>777777767776777>777777[777[77777777777F&2E2EFF3FFFFFFFFF3FFF3FFFFFFFFFFFFFF999?9339r$   c                 ~   i fd} t        t        t                     | t        t	                     j                          t              }dh}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                        rt        j                        ndt        j                  |      t        j                  |      dz  }d	d
|iz  }t        t        j                  |            dx}x}}d   }t        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}x}x}}y)uN   Codex review fn 시그니처에 module invoker 미전달 (구조적 boundary).c                *    | |fd<   t        | |      S )Nargsr  )r@   r4   captureds     r%   codexzAtest_codex_review_fn_never_receives_module_invoker.<locals>.codex<  s    "L16<00r$   r   r  r   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)ssetr  r   r   r   Nr   )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)slen)r   r   r   r   assert %(py9)sr   )r   r.   r&   rH   rJ   r   r  r   r   r   r   r   r   r   r   r  )r  r   r   r   r   r   r   r   r   r   @py_format10r  s              @r%   2test_codex_review_fn_never_receives_module_invokerr!  8  sL   H1 N,-"!|	
 
cex=$VH$=H$$$$=H$$$$$$3$$$3$$$$$$x$$$x$$$=$$$H$$$$$$$%3 %A% A%%%% A%%%%%%3%%%3%%%%%% %%%A%%%%%%%r$   c                    t               } t        t        t                     t        t
        |       }|j                         }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }t!        t        j"                  |            d x}x}}|j$                  }t&        j(                  }||k(  }|st        j                  d|fd	||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d
t        j                         v st        j                  t&              rt        j                  t&              nd
t        j                  |      dz  }dd|iz  }t!        t        j"                  |            d x}x}}| j*                  }dg}||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  }	dd|	iz  }
t!        t        j"                  |
            d x}x}}|j,                  d   }t        j                  }|j.                  }||k(  }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }
dd|
iz  }t!        t        j"                  |            d x}x}x}}t        j0                  }|j.                  }|j,                  }||v }|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                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t!        t        j"                  |            d x}x}x}}y )Nr   r   zP%(py2)s
{%(py2)s = %(py0)s.final_state
} == %(py6)s
{%(py6)s = %(py4)s.S7_DONE
}r   r   r   r   r   )zQ%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py6)s
{%(py6)s = %(py4)s.AUTO_EXECUTE
}r   )r   r   r   r   r   r   r   zJ%(py1)s == %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.S7_DONE
}.value
}r   r   r   r   r  r   r   )zs%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.S5_AUTO_EXECUTE
}.value
} in %(py8)s
{%(py8)s = %(py6)s.transitions
})r   r   r   r   r   r   r   )rJ   r   r.   r&   rA   rH   r   r   r   S7_DONEr   r   r   r   r   r   r   r   r;   r   AUTO_EXECUTErL   transitionsr   S5_AUTO_EXECUTE)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s                    r%   1test_anu_only_executes_module_in_s5_on_clean_pathr+  N  s   
,CN,-#"	D XXZF............6...6......................>>5[555>55555>555555565556555>555555[555[5555555555599:9::9:::::9:::::::3:::3:::9:::::::::::b!8U]]8]%8%88!%88888!%8888!888888U888U888]888%88888888  < &&<&*<*<<&*<<<<<&*<<<<<<<5<<<5<<< <<<&<<<<<<&<<<&<<<*<<<<<<<<r$   c                 v   t        t              } d| d<   t        t        t	               |       t
        t        t                     }d t        ddddd	d
| i i dg d	      D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                   |            d x}}|j#                         }|j$                  }t&        j(                  }||k(  }|st        j*                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t&              rt        j                  t&              ndt        j                  |      dz  }dd|iz  }t        t        j                   |            d x}x}}y )Nsome_new_unauthorized_moduler   r   c              3  $   K   | ]  }d |v  
 yw)u   §9Nr#   r  s     r%   r   z3test_unknown_target_module_holds.<locals>.<genexpr>i  s      auz r  anu_codex_decision_digest_v1tlr   r   r3   r(  )	r8   r9   r2   r:   r+   r,   classificationr;   evidence_pathsr   r   r   r   r   r   r   r   r   r   )r)   r*   r   r.   r&   rA   rH   rJ   r   r   r   r   r   r   r   r   r   r   r;   r   r   r   )	bad_proposalr   r   r   r   r   r   r   r   s	            r%    test_unknown_target_module_holdsr5  _  s   &L$BL!N,l;#"!|	D#;4&';$ % 
	
$  3                         XXZF>>7[777>77777>777777767776777>777777[777[77777777777r$   c            
        t        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                  t              rt        j                  t              ndt        j                  |       t        j                  |      dz  }dd|iz  }t        t        j                  |            d x} x}}t        D ]  }t        t              }||d	<   t        t        t               |      t        t         t#               
      }|j$                  } |       }	|	j&                  }t(        j*                  }
||
k(  }|st        j                  d|fd||
f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      t        j                  |      dt	        j
                         v st        j                  t(              rt        j                  t(              ndt        j                  |
      dz  }dd|iz  }t        t        j                  |            d x}x}	x}x}}
 y )N   r   r  r  r   r   r   r   r   r   )z%(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.run
}()
}.final_state
} == %(py10)s
{%(py10)s = %(py8)s.S7_DONE
}r   r   )r   r   r   r   r   r   zassert %(py12)sr   )r  r   r   r   r   r   r   r   r   r   r)   r*   r   r.   r&   rA   rH   rJ   r   r   r   r'  )r   r   r   r   r   modpr   r   r   @py_assert9r   r   r   s                 r%   'test_all_six_allowed_modules_recognizedr;  z  s   )*/a/*a////*a//////3///3//////)///)///*///a///////) 	7 /  0!4'&%<	
 xx6xz6z%%66%6666%666666t666t666x666z666%66666666666666666666	7r$   c                 x    t        j                  t              5  t        dd       d d d        y # 1 sw Y   y xY w)N/replacement_pr_runner_dry_run_operational_pilotzdry-run)pytestraisesr
   r   r#   r$   r%   +test_default_invoker_refuses_real_executionr@    s4    	+	, `!"SU^_` ` `s   09c                    t        t        t                     t        t              } | j                         }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }t        t        j                   |            d	x}x}}d
 |j"                  D        }t%        |      }|sddt        j                         v st        j                  t$              rt        j                  t$              ndt        j                  |      t        j                  |      dz  }t        t        j                   |            d	x}}|j&                  }d	}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                   |
            d	x}x}}y	)uH   기본 invoker 사용 시 실제 실행 0건 + 안전하게 HOLD 종료.)r   r   r   r   r   r   r   r   r   r   Nc              3  $   K   | ]  }d |v  
 yw)no_real_executionNr#   r   s     r%   r   zRtest_loop_with_default_invoker_holds_never_executes_real_module.<locals>.<genexpr>  s     EA"a'Er  r   r   r   r   )z9%(py2)s
{%(py2)s = %(py0)s.module_invocation
} is %(py5)sr   r   r   )r   r.   r&   rA   rH   r   r;   r   r   r   r   r   r   r   r   r   r   r  r   module_invocation)r   r   r   r   r   r   r   r   r   r   r   s              r%   ?test_loop_with_default_invoker_holds_never_executes_real_modulerE    s   N,-#"D XXZF>>7[777>77777>777777767776777>777777[777[77777777777E1D1DEE3EEEEEEEEE3EEE3EEEEEEEEEEEEEE##+t+#t++++#t++++++6+++6+++#+++t+++++++r$   c            
     t   h d} | j                   }t        j                  }t        |      } ||      }|szt	        j
                  d| t        t        j                        z         dz   dt        j                         v st	        j                  |       rt	        j                  |       ndt	        j                  |      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t	        j                  |      t	        j                  |      t	        j                  |      dz  }t        t	        j                  |            dx}x}x}}y)	uX   본 테스트 import 그래프에 실제 자동화 모듈 미포함 (mock/fixture only).>   utils.auto_gemini_triageutils.merge_queue_executorutils.replacement_pr_runnerutils.post_merge_smoke_runner"utils.critical_escalation_reporteru'   실제 자동화 모듈이 import 됨: z
>assert %(py10)s
{%(py10)s = %(py2)s
{%(py2)s = %(py0)s.isdisjoint
}(%(py8)s
{%(py8)s = %(py3)s(%(py6)s
{%(py6)s = %(py4)s.modules
})
})
}real_modulesr  sys)r   r   r   r   r   r   r   N)
isdisjointrM  modulesr  r   r   r   r   r   r   r   r   )rL  r   r   r   r:  r   s         r%   'test_no_real_automation_module_importedrP    so   L "" s{{ 3{#3 "#34 4   2,S[[AQ2Q1RS             #      $'    $'      (+    (+    (3    $4    5      r$   c                    t               } t        t        t                     t        t
        |       }|j                         j                  }t        |      }g }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                   |            d x}x}}|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}	||	v }|slt        j                  d|fd||	f      t        j                  |      t        j                  |	      dz  }
dd|
iz  }t        t        j                   |            d x}x}}	y )Nr   r   r  r   r@   r   r   r   r8   r/  z%(py1)s == %(py4)sr   r   r   r;   )r(  r   r   )z%(py1)s in %(py4)s)rJ   r   r.   r&   rA   rH   r   r@   r   r   r   r   r   r   r   r   r   )r   r   r@   r   r   r   r   r   r   r   r   s              r%   !test_valid_decision_digest_passesrS    sx   
,CN,-#"	D XXZF#F+1r1+r1111+r111111#111#111111F111F111+111r1111111(=======================)B BB BBBBB BBBBBBB BBBBBBBBr$   c                    t        ddi      } d | D        }t        |      }|sddt        j                         v st	        j
                  t              rt	        j                  t              ndt	        j                  |      t	        j                  |      dz  }t        t	        j                  |            d x}}d | D        }t        |      }|sddt        j                         v st	        j
                  t              rt	        j                  t              ndt	        j                  |      t	        j                  |      dz  }t        t	        j                  |            d x}}y )Nr8   wrongc              3  $   K   | ]  }d |v  
 yw)r8   Nr#   r  s     r%   r   z8test_invalid_decision_digest_detected.<locals>.<genexpr>  s     +x1}+r  r   r   r   c              3  >   K   | ]  }|j                  d         yw)zmissing:Nr   r  s     r%   r   z8test_invalid_decision_digest_detected.<locals>.<genexpr>  s     6Aq||J'6r   )	r   r   r   r   r   r   r   r   r   )errsr   r   r   s       r%   %test_invalid_decision_digest_detectedrY    s    #Xw$78D+d++3+++++++++3+++3++++++++++++++66636666666663666366666666666666r$   c            	        ddddddi dgdd	d
d} t        |       }d |D        }t        |      }|sddt        j                         v st	        j
                  t              rt	        j                  t              ndt	        j                  |      t	        j                  |      dz  }t        t	        j                  |            d x}}y )Nanu_codex_review_request_v1r0  r1  r   r   r3   critical_7_classificationFT)codex_no_executionanu_only_executesr8   r9   r2   r:   r@   review_scopeconstraints_reminderc              3  $   K   | ]  }d |v  
 yw)r]  Nr#   r  s     r%   r   zMtest_review_request_requires_codex_no_execution_constraint.<locals>.<genexpr>  s     7Q#q(7r  r   r   r   )	r   r   r   r   r   r   r   r   r   )reqrX  r   r   r   s        r%   :test_review_request_requires_codex_no_execution_constraintrd    s    /"#Q7457<SW XC #3'D7$7737777777773777377777777777777r$   c                 N   ddddddi dgddd	dd
dd} t        |       }g }||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               nddt        j                         v st        j
                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )Nr[  r0  r1  r   r   r3   r\  Tr   )r   r   )r]  r^  boundedr_  r   r  r   rc  r   r   r   )	r   r   r   r   r   r   r   r   r   )rc  r   r   r   r   r   s         r%   test_review_request_validrg    s    /"#Q745"&!%-.QG!
C #3'-2-'2----'2------"---"------3---3---'---2-------r$   c                 @   t        ddid      } t        |       }g }||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  t              rt        j                  t              nddt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }d	d
|iz  }t        t        j                  |            d x}x}}y )Nr2   r1  r   r   r  r   respr   r   r   )
rA   r   r   r   r   r   r   r   r   r   )ri  r   r   r   r   r   s         r%   test_review_response_valid_passrj    s    	3'+D#D)/R/)R////)R//////#///#//////D///D///)///R///////r$   c                 0   t        t        t                     t        t        t                     } | j                         j                  }|d   }t        j                  }|j                  }||k(  }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                   t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }dd|iz  }t#        t        j$                  |            d x}x}x}}t        j&                  }|j                  }	|	|v }
|
st        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                   |      rt        j                  |      nddz  }dd|iz  }t#        t        j$                  |            d x}x}	}
t        j(                  }|j                  }	|	|v }
|
st        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                   |      rt        j                  |      nddz  }dd|iz  }t#        t        j$                  |            d x}x}	}
t        j*                  }|j                  }	|	|v }
|
st        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                   |      rt        j                  |      nddz  }dd|iz  }t#        t        j$                  |            d x}x}	}
|d   }t        j,                  }|j                  }||k(  }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                   t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }dd|iz  }t#        t        j$                  |            d x}x}x}}y )Nr   r   r   )zN%(py1)s == %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.S0_PROPOSAL
}.value
}r   r&  r  r   r   )zR%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.S1_CODEX_REVIEW
}.value
} in %(py6)sr0  r   r   r   )zN%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.S4_CLASSIFY
}.value
} in %(py6)s)zR%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.S5_AUTO_EXECUTE
}.value
} in %(py6)sr$  r%  )r   r.   r&   rA   rH   rJ   r   r)  r   S0_PROPOSALr   r   r   r   r   r   r   r   r   S1_CODEX_REVIEWS4_CLASSIFYr*  r'  )r   r0  r   r   r   r   r   r   r   r   r   r   r   s                r%   )test_state_machine_clean_path_transitionsro    s   N,-#"!|	D 	
AQ4*5$$*$***4*****4****4******5***5***$***********  + &&+&!++++&!++++++5+++5+++ +++&++++++!+++!+++++++'""'"a''''"a''''''5'''5''''''"''''''a'''a'''''''  + &&+&!++++&!++++++5+++5+++ +++&++++++!+++!+++++++R5'EMM'M'''5'''''5''''5''''''E'''E'''M'''''''''''r$   c                 	   ddifd} d }t        t        t                     | |t                     }|j	                         }|j
                  }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d	t        j                         v st        j                  t              rt        j                  t              nd	t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}|j                   }	t        j"                  }|j$                  }||	v }|st        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                  |	      rt        j                  |	      ndd
z  }dd|iz  }t        t        j                  |            dx}x}}t        j&                  }|j$                  }||	v }|st        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                  |	      rt        j                  |	      ndd
z  }dd|iz  }t        t        j                  |            dx}x}}|j(                  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}}|j(                  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}}y)uO   S1 NEEDS_REVISION → S2 → S3 PASS → S4 → S5 → S7 (bounded 내 수렴).nr   c                v    dxx   dz  cc<   d   dk(  rt        | |      }d|d<   d|d<   |S t        | |      S )Nrq  r   rC   r;   Tr=   r  )r@   r4   r   rL   s      r%   r  z6test_state_machine_one_repair_then_pass.<locals>.codex  sM    c
a
:?FL1A+AiL/3A+,H6<00r$   c                    | S r"   r#   rF   s     r%   revisez7test_state_machine_one_repair_then_pass.<locals>.revise  s    r$   r   r   r#  r   r   r   r   r   Nr   )zR%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.S2_ANU_REVISION
}.value
} in %(py6)sr0  )zU%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.S3_CODEX_RE_REVIEW
}.value
} in %(py6)sr:   r5   r   rR  r   r   r   r4   r   )r   r.   r&   rJ   r   r   r   r'  r   r   r   r   r   r   r   r   r)  S2_ANU_REVISIONr   S3_CODEX_RE_REVIEWr@   )r  rt  r   r   r   r   r   r   r   r0  r   r   r   rL   s                @r%   'test_state_machine_one_repair_then_passrw    s   !HE1 N,-!|	D XXZF............6...6......................A  + &&+&!++++&!++++++5+++5+++ +++&++++++!+++!+++++++##.#)).)Q....)Q......5...5...#...)......Q...Q.......==!.16Q61Q66661Q6661666Q6666666==!.16Q61Q66661Q6661666Q6666666r$   c                 N   d } t        t        t                     | t        t	                     }|j                         }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd	|iz  }t        t        j                   |            d x}x}}d
}|j"                  }	||	v }
|
st        j                  d|
fd||	f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      dz  }dd|iz  }t        t        j                   |            d x}x}
}	y )Nc                (    t        | |      }d|d<   |S )Nr   r;   r  r  s      r%   
codex_holdz:test_codex_hold_verdict_short_circuits.<locals>.codex_hold  s    -')r$   r   r   r   r   r   r   r   r   codex_verdict_hold_for_chairr   r   r   r   r   )r   r.   r&   rH   rJ   r   r;   r   r   r   r   r   r   r   r   r   r   r  )rz  r   r   r   r   r   r   r   r   r   r   r   r   s                r%   &test_codex_hold_verdict_short_circuitsr|    s@   
 N,-""!|	D XXZF>>7[777>77777>777777767776777>777777[777[77777777777)@V-@-@@)-@@@@@)-@@@@)@@@@@@V@@@V@@@-@@@@@@@@r$   )rV   r   r"   )r,   r   r+   zdict | None)rn   r   rV   r)   )PrZ   
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   rr   rM  pathlibr   r>  __file__resolveparent	WORKSPACErU   pathremoveinsertutils.anu_codex_bounded_loopr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   rt   r*   r&   r.   rA   rD   rH   rJ   ro   rw   markparametrizer   r   r   r   r   r   r   r   r  r  r  r  r!  r+  r5  r;  r@  rE  rP  rS  rY  rd  rg  rj  ro  rw  r|  r#   r$   r%   <module>r     s  & #    
   N""$++2299	y>SXXHHOOC	N# 3y> "    * >!!#**Z7:WW :+h.>



 

 *
 !17JK LH5
<+ 
(
(, !17JK7 L7,*	DQ&&,="867"`
,"C78."0(7>Ar$   