
    Ej                    L   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mZ ddlmZ ddlmZ ddlZ ee      j)                         j*                  d   Z ee      ej0                  vr"ej0                  j3                  d ee             ddlmZmZmZmZ dd	lm Z m!Z!m"Z" dd
l#m$Z$ ddl%m&Z&m'Z' ddl(m)Z)m*Z* ddl+m,Z,m-Z- edz  dz  dz  Z.edz  dz  dz  Z/edz  dz  Z0edz  dz  Z1 ejd                  d      dFd       Z3 ejd                  d      dFd       Z4dFdZ5dGdZ6d Z7d Z8d Z9d Z:d  Z;d! Z<d" Z=d# Z>d$ Z?d% Z@d& ZAd' ZBd( ZCd) ZDd* ZEd+ ZFd, ZGd- ZHd. ZId/ ZJd0 ZKd1 ZLd2 ZMd3 ZNd4 ZOd5 ZPd6 ZQd7 ZRd8 ZSd9 ZTd: ZUd; ZVd< ZWd= ZXd> ZYd? ZZd@ Z[dA Z\dB Z]dC Z^dD Z_dE Z`y)Hu0  test_goal_activation_controller_2553plus7.py — task-2553+7 regression.

GOAL_DRIVEN_ACTIVATION_CONTROLLER_V0 — 18 required regression tests.

전부 부작용 0 (실 git mutation/PR open 0 — monkeypatch stub + 정적 AST/grep).
스타일: test_pre_authorized_activation_runner_2553plus6.py 踏袭.
    )annotationsN)Path)Any)patch   )GOAL_CONTRACT_SCHEMAGOAL_RESULT_SCHEMAGoalContractErrorparse_goal_contract)validate_boundaryparse_success_conditionparse_hold_conditions)run_goal_activation)STATUS_DRY_RUN_VERIFIEDSTATUS_HOLD)DECISION_ALLOWDECISION_HOLD)TASK_2553P1_EFFECTIVE_DIFF_6#TASK_2553P6_FORBIDDEN_WRITE_TARGETSmemoryfixturesz%task-2553+1.f1solo.goal-contract.jsonz2task-2553+1.f1solo.activation-evidence-bundle.jsonanu_v3zgoal_activation_controller.pyscriptsz!run_goal_activation_controller.pymodule)scopec                 T    t        j                  t        j                  d            S Nutf-8encoding)jsonloadsGOAL_CONTRACT_FIXTURE	read_text     Q/home/jay/workspace/tests/regression/test_goal_activation_controller_2553plus7.pygoal_contractr(   E   s     ::+55w5GHHr&   c                 T    t        j                  t        j                  d            S r   )r!   r"   ACTIVATION_BUNDLE_FIXTUREr$   r%   r&   r'   evidence_bundler+   J   s     ::/9979KLLr&   c            	     J   i ddddddddd	d
dt         di ddd	d
ddddddddddddt        t              dt        t              dg ddddddddddd dd!dd"dd#ddd$dddd%d&t        d'd(d)ddddd*d+dd,dd-g d.d/dd0dd1dd2d3d4diS )5uK   6조건 전부 통과시키는 mock run_activation 결과 (dry-run 전용).schemaz*anu_v3.pre_authorized_activation_result.v1runner_module'anu_v3.pre_authorized_activation_runnerrunner_versionz1.0.0ts_utc2026-05-16T00:00:00Ztask_idtask-2553+1statusderived_contractz(anu_v3.pre_authorized_action_contract.v1action_typeclean_replacement_pr_open	source_prTf   task/task-2553-dev5	preservednumberbranchsame_branch_pushF
fresh_baseexpected_fileseffective_diff_filesforbidden_paths_touchedeffective_diff_contamination
critical_7credential_change_requiredowner_pat_touch_requiredactual_api_call_requiredreal_write_required!limited_real_write_entry_requiredscope_expansionPASS)normalfallback)codex_verdictcallbackmerge_requiredauto_closeoutdev_status_changegate_decisionbinding_preflight_statusDRY_RUN_PLAN_ONLYfour_conditionsderiver_status_derivedgate_decision_allowbinding_preflight_dry_run_plan.provenance_and_sha_and_decision_machine_4fieldall_four_conditions_metactivate_flagallowed_write_primitives)branch_create_fresh_basecommit_six_effective_diff_filespush_new_branch_onlyclean_replacement_pr_open_oncereal_write_performedgithub_mutation_performedmerge_performed	pr_numberNreport_to_chair)r   listr   r   r%   r&   r'   _all_pass_activation_resultrk   P   s   4>4B4 	'4 	(	4
 	=4 	)4 	 
@
}
 6
 tsF[\	

 
 $
 d#?@
 #D)E$F
 &r
 +E
 %
 )%
 '
 '
 "5
  0!
" u#
$ $#'T:#"!&-
4> 	?4@ 	#$7A4B 	&*#'.2>B	
C4N 	"4O4P 	Q4R 	# %
S4^ 	_4` 	$Ua4b 	5c4d 	Te4f 	5g4 4r&   c                B    ddddt         d| gdddt        ddddddd	dd
S )u   HOLD 결과 mock.z(anu_v3.pre_authorized_activation_hold.v1r/   r2   r4   mockFTNrY   )r-   r.   r1   r3   r5   stagehold_reasonsre   rf   ri   rU   rV   r6   rX   r^   )r   r   )reasons    r'   _hold_activation_resultrq      sM     =B(  %%*&$( &+#(.3>C	
 $)) r&   c                   t               }t        d|      5  t        | t        |dz  |dz  |dz        }ddd       j	                  di       j	                  d	i       }|j                  }d
} ||      }d}||u }	|	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  }
dd|
iz  }t        t        j                  |            dx}x}x}x}	}|j                  }d} ||      }d}||u }	|	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  }
dd|
iz  }t        t        j                  |            dx}x}x}x}	}|j                  }d} ||      }d}||u }	|	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  }
dd|
iz  }t        t        j                  |            dx}x}x}x}	}|j                  }d} ||      }d}||u }	|	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  }
dd|
iz  }t        t        j                  |            dx}x}x}x}	}|j                  }d} ||      }d}||u }	|	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  }
dd|
iz  }t        t        j                  |            dx}x}x}x}	}|j                  }d} ||      }d}||u }	|	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  }
dd|
iz  }t        t        j                  |            dx}x}x}x}	}|j                  }d}i } |||      }	|	j                  }d} ||      }d}||u }|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                  |      t        j                  |	      t        j                  |      t        j                  |      t        j                  |      t        j                  |      d	z  }dd|iz  }t        t        j                  |            dx}x}x}x}	x}x}x}x}}y# 1 sw Y   xY w)u   1. goal contract allows clean_replacement_pr_open + gate ALLOW
       → activation proceeds (all 6 conditions True, activation_permitted True
       if not force_dry_run).0anu_v3.goal_activation_controller.run_activationreturn_valuedec.jsonres.json	hold.jsonr(   	repo_pathdecision_out_pathresult_out_pathhold_out_pathNactivation_decisionsix_conditions0cond1_allowed_actions_contains_clean_replacementTiszI%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} is %(py9)ssixpy0py2py4py6py9assert %(py11)spy11cond2_gate_decision_allowcond3_boundary_validator_pass$cond4_binding_preflight_dry_run_plancond5_hold_conditions_zerocond6_callback_collector_readyactivation_permitted)z%(py14)s
{%(py14)s = %(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s, %(py6)s)
}.get
}(%(py12)s)
} is %(py17)sresult)	r   r   r   r   py8py10py12py14py17zassert %(py19)spy19rk   r   r   	WORKSPACEget
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation)r(   tmp_pathall_passr   r   @py_assert1@py_assert3@py_assert5@py_assert8@py_assert7@py_format10@py_format12@py_assert9@py_assert11@py_assert13@py_assert16@py_assert15@py_format18@py_format20s                      r'   :test_01_goal_contract_allow_gate_allow_activation_proceedsr      s    +,H 
:
 
 %'&3$z1"[0
	
 ***B
/
3
34Db
IC77NEN7EFN$NF$NNNNF$NNNNNN3NNN3NNN7NNNENNNFNNN$NNNNNNN777.77./747/47777/4777777377737777777.777/7774777777777;2;723;t;3t;;;;3t;;;;;;3;;;3;;;7;;;2;;;3;;;t;;;;;;;77B9B79:BdB:dBBBB:dBBBBBB3BBB3BBB7BBB9BBB:BBBdBBBBBBB778/87/08D80D88880D888888388838887888/8880888D888888877<3<734<<4<<<<4<<<<<<3<<<3<<<7<<<3<<<4<<<<<<<<<<::T+TRT:+R0T044T5KT45KLTPTTLPTTTTTLPTTTTTTT6TTT6TTT:TTT+TTTRTTT0TTT4TTT5KTTTLTTTPTTTTTTTTTT-
 
s   ^>>_c           	        t         dddddgg dg d}t               }t        d|      5  t        |t        | d	z  | d
z  | dz        }ddd       j
                  }d} ||      }d}||u }|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  }	dd|	iz  }
t        t        j                  |
            dx}x}x}x}}|j                  d      xs i }|j
                  }d} ||      }d}||u }|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  }	dd|	iz  }
t        t        j                  |
            dx}x}x}x}}y# 1 sw Y   xY w)u8   2. action not in goal contract allowed_actions → HOLD.ztest-2r4   testcommitpushr-   goal_idtarget_task_idgoalallowed_actionsforbidden_actionssuccess_conditionhold_conditionsrs   rt   rv   rw   rx   ry   Nhold_for_chairTr   r   r   r   r   r   r~   r   Fact_decr   rk   r   r   r   r   r   r   r   r   r   r   r   r   )r   gcr   r   r   r   r   r   r   r   r   r   s               r'   *test_02_action_not_in_allowed_actions_holdr      s    ''$f-#	
B +,H	:
 

 %&3$z1"[0
	

 ::/&/:&'/4/'4////'4//////6///6///:///&///'///4///////jj./52G;;7-7;-.7%7.%7777.%77777777777777;777-777.777%77777777

 

s   II)c           	        t         dddg ddgdg d}t               }t        d|      5  t        |t        | d	z  | d
z  | dz        }ddd       j
                  }d} ||      }d}||u }|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  }	dd|	iz  }
t        t        j                  |
            dx}x}x}x}}y# 1 sw Y   xY w)u1   3. planned action ∈ forbidden_actions → HOLD.ztest-3r4   r   )clean_replacement_branch_creater   r   r8   r   r   rs   rt   rv   rw   rx   ry   Nr   Tr   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   s              r'   'test_03_forbidden_actions_conflict_holdr      s    ''
 'Z#
B  +,H	:
 

 %&3$z1"[0
	

 ::/&/:&'/4/'4////'4//////6///6///:///&///'///4////////

 

s   EEc           	        t        d      }t        d|      5  t        | t        |dz  |dz  |dz        }ddd       j                  }d	} ||      }d
}||u }|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  }	dd|	iz  }
t        t        j                  |
            dx}x}x}x}}|j                  }d} ||      }d}||u }|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  }	dd|	iz  }
t        t        j                  |
            dx}x}x}x}}|j	                  d      xs i }|j                  }d} ||      }d}||u }|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  }	dd|	iz  }
t        t        j                  |
            dx}x}x}x}}y# 1 sw Y   xY w)uH   4. gate HOLD → activation refuses (activate stays False, HOLD packet).zgate decision HOLD (mock)rs   rt   rv   rw   rx   ry   Nr   Tr   r   r   r   r   r   re   Fr~   r   r   rq   r   r   r   r   r   r   r   r   r   r   r   r   )r(   r   hold_resultr   r   r   r   r   r   r   r   r   s               r'   $test_04_gate_hold_activation_refusesr     s;   )*EFK	: 
 

 %'&3$z1"[0
	

 ::/&/:&'/4/'4////'4//////6///6///:///&///'///4///////::6,6:,-66-6666-66666666666666:666,666-6666666666jj./52G;;7-7;-.7%7.%7777.%77777777777777;777-777.777%77777777

 

s   MMc           	        t        t                     }ddddd|d<   d|d<   t        |d<   t        d|      5  t	        | t
        |d	z  |d
z  |dz        }ddd       j                  }d} ||      }d}||u }|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  }	dd|	iz  }
t        t        j                  |
            dx}x}x}x}}|j                  }d} ||      }d}||u }|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  }	dd|	iz  }
t        t        j                  |
            dx}x}x}x}}y# 1 sw Y   xY w)u    5. provenance mismatch → HOLD.TFrY   rX   r^   rV   rs   rt   rv   rw   rx   ry   Nr   r   r   r   r   r   r   re   )dictrk   r   r   r   r   r   r   r   r   r   r   r   r   r   )r(   r   	prov_failr   r   r   r   r   r   r   r   s              r'    test_05_provenance_mismatch_holdr   !  s   023I"&#*/:?	$I  ,1I'(,7I()	:
 

 %'&3$z1"[0
	

 ::/&/:&'/4/'4////'4//////6///6///:///&///'///4///////::6,6:,-66-6666-66666666666666:666,666-66666666666

 

s   II$c           	        t        d      }t        d|      5  t        | t        |dz  |dz  |dz        }ddd       j                  }d	} ||      }d
}||u }|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  }	dd|	iz  }
t        t        j                  |
            dx}x}x}x}}y# 1 sw Y   xY w)u8   6. evidence mismatch → HOLD (gate HOLD from mismatch).z)evidence mismatch mock (fresh_base false)rs   rt   rv   rw   rx   ry   Nr   Tr   r   r   r   r   r   r   )r(   r   ev_failr   r   r   r   r   r   r   r   s              r'   test_06_evidence_mismatch_holdr   <  s    %&QRG	:
 

 %'&3$z1"[0
	

 ::/&/:&'/4/'4////'4//////6///6///:///&///'///4////////

 

s   D==Ec           	     (   t        t                     }t        |d         |d<   ddg|d   d<   t        t              |d   d<   t        |d<   t
        |d<   t        d|	      5  t        | t        |d
z  |dz  |dz        }ddd       j                  }d} ||      }d}||u }|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  }	dd|	iz  }
t!        t        j"                  |
            dx}x}x}x}}y# 1 sw Y   xY w)u$   7. expected_files mismatch → HOLD.r6   zanu_v2/owner_trigger_pat.pyzsome/unexpected/file.pyrC   rB   rU   r5   rs   rt   rv   rw   rx   ry   Nr   Tr   r   r   r   r   r   r   rk   rj   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r(   r   mismatchr   r   r   r   r   r   r   r   s              r'   $test_07_expected_files_mismatch_holdr   N  sV   /12H#'1C(D#EH %!<H !78 6::V5WH !12 -H_$HX	:
 

 %'&3$z1"[0
	

 ::/&/:&'/4/'4////'4//////6///6///:///&///'///4////////

 

s   #FFc           	        t        t                     }t        |d         |d<   dddd|d   d<   t        |d<   t        |d<   t	        d	|
      5  t        | t        |dz  |dz  |dz        }ddd       j                  }d} ||      }d}||u }|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  }	dd|	iz  }
t        t        j                  |
            dx}x}x}x}}y# 1 sw Y   xY w)uI   8. PR#102 preserved=false → HOLD (gate HOLD because source PR changed).r6   Fr:   r;   r<   r9   rU   r5   rs   rt   rv   rw   rx   ry   Nr   Tr   r   r   r   r   r   r   rk   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r(   r   pr_failr   r   r   r   r   r   r   r   s              r'   "test_08_pr102_preserved_false_holdr   i  sA   .01G"&w/A'B"CG'0G,
  -GO#GH	:
 

 %'&3$z1"[0
	

 ::/&/:&'/4/'4////'4//////6///6///:///&///'///4////////

 

s   E44E>c           	        t        t                     }t        |d         |d<   d|d   d<   t        |d<   t        |d<   t	        d|      5  t        | t        |dz  |d	z  |d
z        }ddd       j                  }d} ||      }d}||u }|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  }	dd|	iz  }
t        t        j                  |
            dx}x}x}x}}y# 1 sw Y   xY w)u"   9. same_branch_push=true → HOLD.r6   Tr@   rU   r5   rs   rt   rv   rw   rx   ry   Nr   r   r   r   r   r   r   r   )r(   r   sbp_failr   r   r   r   r   r   r   r   s              r'   "test_09_same_branch_push_true_holdr     s5   /12H#'1C(D#EH 7;H !34 -H_$HX	:
 

 %'&3$z1"[0
	

 ::/&/:&'/4/'4////'4//////6///6///:///&///'///4////////

 

   E00E:c           	     ,   t        t                     }t        |d         |d<   t        t              dgz   |d   d<   d|d   d<   t        |d<   t
        |d<   t        d|	      5  t        | t        |d
z  |dz  |dz        }ddd       j                  }d} ||      }d}||u }|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  }	dd|	iz  }
t!        t        j"                  |
            dx}x}x}x}}y# 1 sw Y   xY w)u<   10. F2 changed → HOLD (scope expansion / unexpected diff).r6   zanu_v2/token_transport.pyrC   TrL   rU   r5   rs   rt   rv   rw   rx   ry   Nr   r   r   r   r   r   r   r   )r(   r   f2_failr   r   r   r   r   r   r   r   s              r'   test_10_f2_changed_holdr     s[   .01G"&w/A'B"CG:>$;	$%;&G 67 6:G 12,GO#GH	:
 

 %'&3$z1"[0
	

 ::/&/:&'/4/'4////'4//////6///6///:///&///'///4////////

 

s   %F		Fc           	     .   t        t                     }t        |d         |d<   t        t              dgz   |d   d<   dg|d   d<   t        |d<   t
        |d<   t        d|      5  t        | t        |d	z  |d
z  |dz        }ddd       j                  }d} ||      }d}||u }|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  }	dd|	iz  }
t!        t        j"                  |
            dx}x}x}x}}y# 1 sw Y   xY w)uC   11. phase3/mqe changed → HOLD (forbidden path / scope expansion).r6   zmerge_queue_executor.pyrC   rD   rU   r5   rs   rt   rv   rw   rx   ry   Nr   Tr   r   r   r   r   r   r   )r(   r   mqe_failr   r   r   r   r   r   r   r   s              r'   test_11_phase3_mqe_changed_holdr     s`   /12H#'1C(D#EH ;?$<	"#<$H !78 @Y>YH !:; -H_$HX	:
 

 %'&3$z1"[0
	

 ::/&/:&'/4/'4////'4//////6///6///:///&///'///4////////

 

s   &F

Fc           	        t        t                     }t        |d         |d<   d|d   d<   t        |d<   t        |d<   t	        d|      5  t        | t        |dz  |d	z  |d
z        }ddd       j                  }d} ||      }d}||u }|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  }	dd|	iz  }
t        t        j                  |
            dx}x}x}x}}y# 1 sw Y   xY w)u!   12. merge_required=true → HOLD.r6   TrR   rU   r5   rs   rt   rv   rw   rx   ry   Nr   r   r   r   r   r   r   r   )r(   r   
merge_failr   r   r   r   r   r   r   r   s              r'    test_12_merge_required_true_holdr     s5   134J%)*5G*H%IJ!"7;J!"#34"/J&Jx	:
 

 %'&3$z1"[0
	

 ::/&/:&'/4/'4////'4//////6///6///:///&///'///4////////

 

r   c           	        t        t                     }t        |d         |d<   d|d   d<   t        |d<   t        |d<   t	        d|      5  t        | t        |dz  |d	z  |d
z        }ddd       j                  }d} ||      }d}||u }|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  }	dd|	iz  }
t        t        j                  |
            dx}x}x}x}}y# 1 sw Y   xY w)u4   13. credential/API beyond PR-open required → HOLD.r6   TrG   rU   r5   rs   rt   rv   rw   rx   ry   Nr   r   r   r   r   r   r   r   )r(   r   	cred_failr   r   r   r   r   r   r   r   s              r'   $test_13_credential_api_required_holdr     s5   023I$(3E)F$GI !BFI !">?!.Io%Ih	:
 

 %'&3$z1"[0
	

 ::/&/:&'/4/'4////'4//////6///6///:///&///'///4////////

 

r   c           
        t               }dddddgd}t        d|      5  t        | t        ||d	z  |d
z  |dz        }ddd       j                  }d} ||      }d}||u }	|	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  }
dd|
iz  }t        t        j                  |            dx}x}x}x}	}|j	                  di       }|j                  }d} ||      }d}||u }	|	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  }
dd|
iz  }t        t        j                  |            dx}x}x}x}	}y# 1 sw Y   xY w)u#   14. Codex HIGH unresolved → HOLD.PASS_WITH_RECOMMENDATIONSF1HIGHzmock HIGH findingidseveritydescriptionverdictunresolved_findingsrs   rt   rv   rw   rx   r(   rz   codex_auditr{   r|   r}   Nr   Tr   r   r   r   r   r   codex_post_result_audit
force_holdcar   )r(   r   r   r   r   r   r   r   r   r   r   r   r   s                r'   "test_14_codex_high_unresolved_holdr     s   *,H.V<OP 
K 
:
 
 %'#&3$z1"[0
	
 ::/&/:&'/4/'4////'4//////6///6///:///&///'///4///////	-r	2B66','6,'4'4''''4''''''2'''2'''6''',''''''4''''''''
 
   II c           
        t               }ddddddddd}t        d|      5  t        d|      5  t        | t        |d	z  |d
z  |dz        }ddd       ddd       j                  }d} ||      }d}||u }	|	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  }
dd|
iz  }t        t        j                  |            dx}x}x}x}	}y# 1 sw Y   xY w# 1 sw Y   xY w)u;   15. callback contract missing (invalid collector) → HOLD.z anu_v3.goal_callback_contract.v1FTcollector_only)r-   rN   rO   	authorityno_writeno_dev_reactivationno_dispatchno_closeoutrs   rt   z:anu_v3.goal_activation_controller._build_callback_contractrv   rw   rx   ry   Nr   r   r   r   r   r   r   r   )r(   r   r   bad_cbr   r   r   r   r   r   r   r   s               r'   &test_15_callback_contract_missing_holdr    s<   *,H 5%#	F 
:
  H
 
	 )+#"*Z"7 (: 5&4F	
		 ::/&/:&'/4/'4////'4//////6///6///:///&///'///4////////
	 
		 s"   E*EE*E'	"E**E4c                 	   t         j                  d      } t        j                  |       }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} t        j                  |      D ]S  }t        |t        j                        sdj!                  d t        j                  |      D              }|j#                  dd      }	d}
|
|	v}|st	        j
                  d|fd|
|	f      t	        j                  |
      dt        j                         v st	        j                  |	      rt	        j                  |	      nddz  }t	        j                  d|d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}
}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 s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}
}V y) a^  16. controller source has zero merge/auto/merge_pull_request/same_branch_push
       as string literals in Call expressions (static grep).

    Finding fix: forbidden_strings are now asserted against the raw source text
    as well as per-Call AST node literals to ensure merge-related strings are
    entirely absent from the controller module.
    r   r   )zgh pr merge--automerge_pull_requestnot in)z%(py0)s not in %(py2)s	forbiddensrc)r   r   z-controller source contains forbidden string: z
>assert %(py4)sr   N c              3     K   | ]R  }t        |t        j                        r6t        |j                  t              r|j                  j                          T y wN)
isinstanceastConstantvaluestrlower).0as     r'   	<genexpr>zBtest_16_only_allowed_pr_open_reaches_write_path.<locals>.<genexpr>P  s=      a.:aggs3K s   AA 	ghprmerge)z%(py1)s not in %(py3)sjoinedpy1py3u'   controller: gh pr merge 호출 발견: P   z
>assert %(py5)spy5r	  litsu)   controller: --auto merge 플래그 발견r
  u%   controller: merge_pull_request 발견r   r;   u%   controller: source-branch push 발견)CONTROLLER_SRCr$   r  parser   r   r   r   r   r   _format_assertmsgr   r   walkr  Calljoinreplace)r  treeforbidden_stringsr  r   @py_format3@py_format5noder#  r  @py_assert0@py_assert2@py_format4@py_format6s                 r'   /test_16_only_allowed_pr_open_reaches_write_pathr4  4  s    
"
"G
"
4C99S>D ' 
	# 	
 	
y 	
 	
	6	
 	
   	
 	
 		  	
 	
	6	
 	
  !$ 	
 	
 		 !$ 	
 	
  <I=I	
 	
 	
 	
 	

  dCHH%88 $ D
 \\#r*F ;f,  ;f  I   v   '-  I '-    :$s)E     T84'TTT84TTT8TTTTTT4TTT4TTTT)TTTTTTT' 'v5  'v  I (  v   06  I 06    8     , ,D8   ,D  	 -  6   59  	 59     <    !r&   c           	        t               }t        d|      5  t        | t        |dz  |dz  |dz  d      }ddd       j	                  d	i       }|j                  }d
} ||      }d}||u }	|	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  }
dd|
iz  }t        t        j                  |            dx}x}x}x}	}|j                  }d} ||      }d}||u }	|	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  }
dd|
iz  }t        t        j                  |            dx}x}x}x}	}|j                  }d}d} |||      }	d}|	|u }|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                  |	      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}x}	x}}y# 1 sw Y   -xY w)uL   17. merge path unreachable — even all-pass fixture: merge_performed=False.rs   rt   rv   rw   rx   Tr(   rz   r{   r|   r}   _force_dry_runNmerge_possibility_judgmentmerge_permittedFr   r   mpr   r   r   rg   re   )zS%(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s, %(py6)s)
} is %(py11)sr   )r   r   r   r   r   r   zassert %(py13)spy13r   )r(   r   r   r   r:  r   r   r   r   r   r   r   @py_assert10r   @py_format14s                  r'   test_17_merge_path_unreachabler>  d  sJ   *,H	:
 
 %'&3$z1"[0
	
 
0"	5B66-#-6#$--$----$------2---2---6---#---$----------66-#-6#$--$----$------2---2---6---#---$----------::=,=e=:,e4==4====4======6===6===:===,===e===4===========!
 
s   M""M,c           	        t               }t        d|      5  t        | t        |dz  |dz  |dz  d      }ddd       j                  }d	} ||      }|t
        k(  }|st        j                  d
|fd|t
        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dz  }dd|i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  }d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  }d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  }d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  }d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  }d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  }d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  }d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  }d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  }d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  }d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  }d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  }d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  }d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  }dd|iz  }t        t        j                  |            dx}
}|j	                  d      xs i }t        |t              }|s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                  t              rt        j                  t              nd't        j                  |      d(z  }t        t        j                  |            d}d)}
|
|v }|st        j                  d|fd|
|f      t        j                  |
      d&t        j                         v st        j                  |      rt        j                  |      nd&dz  }dd|iz  }t        t        j                  |            dx}
}|j	                  d      xs i }|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  }d/d0|iz  }t        t        j                  |            dx}x}x}x}}y# 1 sw Y   6xY w)1u   18. WITHOUT chair 1~13 procedure, goal contract ALONE is sufficient.

    Only goal_contract fixture + stubbed all-pass run_activation →
    complete final packet with activation decision (no extra procedural input).
    rs   rt   rv   rw   rx   Tr6  Nr-   ==zI%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} == %(py8)sr   r	   r   r   r   r   r   zassert %(py10)sr   implementation_filesinz%(py1)s in %(py3)sr  assert %(py5)sr"  r(   rU   r~   effective_diff_6_file_matchpr_102_preservation_evidencef2_byte_identical_evidencephase3_mqe_unchanged_evidenceregression_resultr   anu_codex_adjudicationcallback_collector_resultr8  r   5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}r  r   r   r   r  r   r   r   r   ztask-2553+1-f1solo-pr-openzI%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} == %(py9)sgc_in_resultr   r   r   )rk   r   r   r   r   r	   r   r   r   r   r   r   r   r   r  r   )r(   r   r   r   r   r   r   r   @py_format9@py_format11r0  r1  r2  r3  r   r.  rS  r   r   r   s                       r'   &test_18_goal_contract_alone_sufficientrV  {  s    +,H	:
 
 %' '3$z1"[0	
	
  ::5h5:h5#55555#555555565556555:555h555555555#5555#55555555!+!V++++!V+++!++++++V+++V+++++++$?f$$$$?f$$$?$$$$$$f$$$f$$$$$$$$?f$$$$?f$$$?$$$$$$f$$$f$$$$$$$ * F**** F*** ******F***F*******(2(F2222(F222(222222F222F2222222)3)V3333)V333)333333V333V3333333'1'61111'6111'111111611161111111*4*f4444*f444*444444f444f4444444(&((((&(((((((((&(((&((((((($.$....$...$................#-#v----#v---#------v---v-------&0&&0000&&000&000000&000&0000000'1'61111'6111'111111611161111111%v%%%%v%%%%%%%%%v%%%v%%%%%%% jj./52Ggt$$$$$$$$:$$$:$$$$$$g$$$g$$$$$$t$$$t$$$$$$$$$$!,!W,,,,!W,,,!,,,,,,W,,,W,,,,,,, ::o.4"LFIFI&F*FF&*FFFFF&*FFFFFFF<FFF<FFFFFFIFFF&FFF*FFFFFFFFFO
 
s   u++u5c           
        t               }dddddg dd}t        d|	      5  t        | t        ||d
z  |dz  |dz  d      }ddd       j	                  di       }|j                  }d} ||      }d}	||	u }
|
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|       dz   d|iz  }t        t        j                  |            dx}x}x}x}
}	|j                  }d} ||      }d}	||	u }
|
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  }d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  }dd|iz  }t        t        j                  |            dx}x}x}x}
}	|j                  }d} ||      }d}	||	u }
|
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  }dd|iz  }t        t        j                  |            dx}x}x}x}
}	y# 1 sw Y   +xY w)!uP   Finding 1: codex_audit param provided → codex_post_result_audit.attached=True.z!anu_v3.codex_post_result_audit.v1codexr   r   r   zround-1 findings remediated)r-   auditorroundr   unresolved_high_or_criticalfindingsnoters   rt   task-2553+7.dec.jsontask-2553+7.res.jsontask-2553+7.hold.jsonTr(   rz   r   r{   r|   r}   r7  Nr   attachedr   r   r   r   zExpected attached=True, got: 
>assert %(py11)sr   r   Fr   r   r@  rR  r   r   rk   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   s                r'   0test_finding1_codex_audit_attached_when_providedrf    s   *,H 6.'(-K 
:
 
 %'#&)??$'=="%<<
	
 
-r	2B66K*K6*KK%KKKKKKKKK2KKK2KKK6KKK*KKKKKKKKK)Frd'KKKKKKKK66(,(6,(5(5((((5((((((2(((2(((6(((,((((((5(((((((66;);6); ;; ;;;;; ;;;;;;;2;;;2;;;6;;;);;;;;; ;;;;;;;;::0&0:&'050'50000'500000060006000:000&000'000500000000#
 
s    Q++Q5c           
        t               }dddddgd}t        d|      5  t        | t        ||d	z  |d
z  |dz        }ddd       j	                  di       }|j                  }d} ||      }d}	||	u }
|
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  }dd|iz  }t        t        j                  |            dx}x}x}x}
}	|j                  }d} ||      }d}	||	u }
|
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  }dd|iz  }t        t        j                  |            dx}x}x}x}
}	y# 1 sw Y   xY w)uT   Finding 1: codex_audit with unresolved HIGH → force HOLD even on all-pass dry-run.NEEDS_REFINEMENTzF-HIGHr   zunresolved HIGHr   r   rs   rt   r^  r_  r`  r   Nr   rb  Tr   r   r   r   r   r   r   r   re  s                r'   :test_finding1_codex_high_unresolved_forces_hold_on_dry_runri    s   *,H%@QR 
K 
:
 
 %'#&)??$'=="%<<
	
 
-r	2B66%*%6*%%%%%%%%%%%%2%%%2%%%6%%%*%%%%%%%%%%%%%66','6,'4'4''''4''''''2'''2'''6''',''''''4''''''''
 
r   c           
     R   t               }t        d|      5  t        | t        d|dz  |dz  |dz  d      }d	d	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|j	                  d
            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|j	                  d            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  }	dd|	iz  }
t        t        j                  |
            d	x}x}x}x}}|j	                  d      xs i }|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  }	d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  }	dd|	iz  }
t        t        j                  |
            d	x}x}x}x}}y	# 1 sw Y   fxY w)zLFinding 2: result packet has separate controller_task_id and target_task_id.rs   rt   task-2553+7r^  r_  r`  T)r(   rz   controller_task_idr{   r|   r}   r7  Nrl  r@  rR  r   r   zcontroller_task_id mismatch: rc  r   r   r4   ztarget_task_id mismatch: r3   r   r~   decrd  )r(   r   r   r   r   r   r   r   r   r   r   rm  s               r'   5test_finding2_controller_task_id_target_task_id_splitrn    sV   *,H	:
 
 %',&)??$'=="%<<
	
 :: * :*+ } +}<  +}                  +    ,    0=    (

3G(H'KL      :: & :&' = '=8  '=                  '    (    ,9    $FJJ/?$@#CD      ::1i1:i 1M1 M1111 M11111161116111:111i111 111M1111111
***
+
1rC779'97'(9M9(M9999(M999999399939997999'999(999M9999999775#57#$55$5555$555555355535557555#555$555555555551
 
s    VV&c                    ddl m} | dz  }t        j                  t        d      5   ||d       ddd       y# 1 sw Y   yxY w)z<Finding 2: mismatched output path task id raises ValueError.r   _validate_output_path_task_idztask-9999.result.jsonr   matchrk  N!anu_v3.goal_activation_controllerrq  pytestraises
ValueError)r   rq  bad_paths      r'   )test_finding2_output_path_mismatch_raisesrz    s=    O11H	z	4 ?%h>? ? ?s	   
:Ac                ,    ddl m} | dz  } ||d       y)zCFinding 2: matching output path task id passes validation silently.r   rp  ztask-2553+7.result.jsonrk  N)ru  rq  )r   rq  	good_paths      r'   "test_finding2_output_path_match_okr}    s    O44I!)];r&   c           
     j
   t               }dddddd}t        d|      5  t        | t        ||dz  |d	z  |d
z  d      }ddd       j	                  di       }|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  }d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  }d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  }dd|iz  }t        t        j                  |            dx}x}x}x}
}	g }d}||v}|}|s|j                  }d} ||      }d}||v}|}|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }|j                  |       |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  }d!d"|iz  }|j                  |       t        j                  |d#      i z  }d$d%|iz  }t        t        j                  |            dx}x}x}x}x}x}x}x}}y# 1 sw Y   xY w)&zFFinding 3: --regression-result path populates field 11 with real data.   r   z2026-05-16T10:00:00ZzGpytest tests/regression/test_goal_activation_controller_2553plus7.py -q)passedfailedtotalr1   commandrs   rt   r^  r_  r`  T)r(   rz   rM  r{   r|   r}   r7  NrM  r  r@  rR  rrr   r   r   r  r  r5   )RUN_SEPARATELYNOT_PROVIDEDr  )z%(py3)s not in %(py5)s)r   r"  %(py7)spy7)zS%(py15)s
{%(py15)s = %(py11)s
{%(py11)s = %(py9)s.get
}(%(py13)s)
} not in %(py18)s)r   r   r;  py15py18z%(py20)spy20   zassert %(py23)spy23)rk   r   r   r   r   r   r   r   r   r   r   r   r   append_format_boolop)r(   r   r   real_regr   r  r   r   r   r   r   r   r   r1  @py_assert4r0  r<  @py_assert12@py_assert14@py_assert17r   r3  @py_format8@py_format19@py_format21@py_format22@py_format24s                              r'   (test_finding3_regression_result_providedr    sN   *,H(\H 
:
 
 %'&&)??$'=="%<<
	
 
'	,B66!(!6(!r!r!!!!r!!!!!!2!!!2!!!6!!!(!!!!!!r!!!!!!!66 ( 6( q q    q      2   2   6   (      q       66 ' 6'? b ?b    ?b      2   2   6   '   ?   b       [8[82[[[!1[9[[!19[![[[[[82[[[8[[[[[[2[[[2[[[[[[[!19[[[[[[[[[[[[[[[[[[[!1[[[9[[[[[[[[[[[[[[[[#
 
s    T((T2c           	     
   t               }t        d|      5  t        | t        |dz  |dz  |dz  d      }ddd       j	                  d	i       }|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|j	                  d
            dz   d|
iz  }t        t        j                  |            dx}x}x}x}	}y# 1 sw Y   CxY w)uX   Finding 3: no --regression-result → field 11 status=NOT_PROVIDED (not RUN_SEPARATELY).rs   rt   r^  r_  r`  Tr6  NrM  r5   r  r@  rR  r  r   zExpected NOT_PROVIDED, got: rc  r   rd  )r(   r   r   r   r  r   r   r   r   r   r   r   s               r'   6test_finding3_regression_result_absent_is_not_providedr  6  sw   *,H	:
 
 %'&)??$'=="%<<
	
 
'	,B66 ( 6( ~ ~-  ~                           .    'rvvh'7&:;     
 
s   E88Fc           	     	   t               }t        d|      5  t        | t        |dz  |dz  |dz  d      }ddd       j	                  d	      }g }d}||u}|}|r(t        |t              }	|	}|	rt        |      }
d
}|
|kD  }|}|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  }|j                  |       |rd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                  t              rt        j                  t              ndt        j                  	      dz  }|j                  |       |	rt        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  }|j                  |       t        j                  |d
      i z  }t        j                   d|      dz   d|iz  }t#        t        j$                  |            dx}x}x}x}x}	x}
x}}|j	                  d      xs i }|j                  }d	} ||      }||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                  |      rt        j                  |      nd	d!z  }t        j                   d"|j	                  d	      d#|d$      d%z   d&|iz  }t#        t        j$                  |            dx}x}x}}y# 1 sw Y   xY w)'zFFinding 4: run_id (uuid4) is stamped into result and decision packets.rs   rt   r^  r_  r`  Tr6  Nrun_idr   )is not)z%(py2)s is not %(py5)s)r   r"  r  r  z2%(py13)s
{%(py13)s = %(py9)s(%(py10)s, %(py11)s)
}r  r  )r   r   r   r;  )>)z4%(py18)s
{%(py18)s = %(py15)s(%(py16)s)
} > %(py21)slen)r  py16r  py21z%(py23)sr  z*run_id missing or empty in result packet: z
>assert %(py26)spy26r~   r@  rB  rm  rC  zrun_id in decision (z) != result ()
>assert %(py10)sr   )rk   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   r0  r  r  @py_assert20@py_assert19r3  r  r=  r  r  @py_format25@py_format27rm  r   r   rT  rU  s                            r'   +test_finding4_run_id_present_in_all_packetsr  M  sH   *,H	:
 
 %'&)??$'=="%<<
	
 ZZ!F 6 *VS"9 "9 "9c&k A kAo   6                       #-    #-      .4    .4      69    69    #:    #:  kA      ?B    ?B      CI    CI    ?J    MN        5VJ?       ***
+
1rC77 8 78 &                               !'    !'    swwx03=
!L     '
 
s   SSc           
        t               }|dz  }|j                  dd       |j                  } |       }|st        j                  d      dz   dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d	x}}t        d
|      5  t        | t        |dz  |dz  t        |      d      }d	d	d	       j                  }d} ||      }d}	||	u }
|
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  }dd|iz  }t        t        j                  |            d	x}x}x}x}
}	|j                  } |       }| }|st        j                  d      dz   dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d	x}x}}y	# 1 sw Y   xY w)zYFinding 4: pre-existing hold.json is deleted when outcome is non-HOLD (DRY_RUN_VERIFIED).r`  z?{"schema": "stale", "status": "HOLD_FOR_CHAIR", "stale": true}
r   r   z+pre-condition: stale hold.json should existzC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}	hold_pathr   r   r   Nrs   rt   r^  r_  Tr6  r   Fr   r   r   r   r   r   z<stale hold.json should have been deleted on non-HOLD outcomeG
>assert not %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
})rk   
write_textexistsr   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   r3  s                 r'   ,test_finding4_stale_hold_deleted_on_non_holdr  h  s7   *,H22IJ   LLLLLLLLLLL9LLL9LLLLLLLLLLLL	:
 
 %'&)??$'==i.
	
 ::0&0:&'050'50000'500000060006000:000&000'00050000000 ! !! !   	G                  "      
 
s   ,%KK"c           
     
   t               }dddddgd}t        d|      5  t        | t        ||d	z  |d
z  |dz  d      }ddd       j                  }d} ||      }d}||u }	|	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|j	                  d            dz   d|
iz  }t        t        j                  |            dx}x}x}x}	}|j                  }d} ||      }|t        k(  }	|	s6t        j                  d|	fd|t        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dz  }t        j                  d|j	                  d            dz   d|iz  }t        t        j                  |            dx}x}x}}	|j	                  di       }|j                  }d } ||      }d}||u }	|	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"|       dz   d|
iz  }t        t        j                  |            dx}x}x}x}	}y# 1 sw Y   xY w)#u   HIGH-1 fix: --dry-run + all-six-pass + codex_audit with unresolved HIGH
    → result status HOLD_FOR_CHAIR, hold_for_chair=True (bypass was present before fix).
    rh  z
HIGH-1-BUGr   zgenuine fail-closed bypassr   r   rs   rt   r^  r_  r`  Tra  Nr   r   r   r   r   z6Expected hold_for_chair=True (HIGH-1 fix), got status=r5   rc  r   r@  rB  r   rC  zExpected HOLD status, got: r  r   r   r   r   z(codex_result.force_hold should be True: )rk   r   r   r   r   r   r   r   r   r   r   r&  r   r   r   )r(   r   r   codex_audit_highr   r   r   r   r   r   r   r   rT  rU  r   s                  r'   9test_r2_high1_dry_run_all_six_pass_codex_high_forces_holdr    sr    +,H &VD`a 
 
:
 
 %'(&)??$'=="%<<
	
 :: & :&' 4 '4/  '4                  '    (    ,0    AHAU@XY      :: h :h ;.   ;                             $/    $/    &fjj&:%=>      
-r	2B66X,X6,X4X4'XXX4XXXXXX2XXX2XXX6XXX,XXXXXX4XXX+STVSW)XXXXXXXX+
 
s    O88Pc           
        t               }ddg d}t        d|      5  t        | t        ||dz  |dz  |dz  d	
      }ddd       j                  }d} ||      }d	}||u }	|	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      dz   d|
iz  }t        t        j                  |            dx}x}x}x}	}|j	                  di       }|j                  }d} ||      }d	}||u }	|	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|       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  }
dd|
iz  }t        t        j                  |            dx}x}x}x}	}y# 1 sw Y   DxY w)u   HIGH-2 fix: codex_audit with verdict=PASS_WITH_RECOMMENDATIONS but
    unresolved_high_or_critical=2 scalar field → force_hold / HOLD_FOR_CHAIR.
    Previously auto-continued incorrectly.
    r   r   r   r[  r   rs   rt   r^  r_  r`  Tra  Nr   r   r   r   r   zIPASS_WITH_RECOMMENDATIONS + unresolved_high_or_critical=2 must force HOLDrc  r   r   r   r   z'force_hold should be True from scalar: r[  r@  rR  r   rd  )r(   r   r   codex_audit_scalarr   r   r   r   r   r   r   r   r   s                r'   <test_r2_high2_scalar_unresolved_high_or_critical_forces_holdr    s   
 +,H /'(!
 
:
 
 %'*&)??$'=="%<<
	
 :: & :&' 4 '4/  '4                  '    (    ,0    	T      
-r	2B66W,W6,W4W4'WWW4WWWWWW2WWW2WWW6WWW,WWWWWW4WWW+RSURV)WWWWWWWW665/56/05A50A55550A555555255525556555/5550555A55555555%
 
s    N  N
c           
        t               }ddg d}t        d|      5  t        | t        ||dz  |dz  |dz  d	
      }ddd       j                  }d} ||      }d	}||u }	|	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      dz   d|
iz  }t        t        j                  |            dx}x}x}x}	}|j	                  di       }|j                  }d} ||      }d	}||u }	|	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  }
d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  }
dd|
iz  }t        t        j                  |            dx}x}x}x}	}y# 1 sw Y   +xY w)u   HIGH-2 fix: codex_audit verdict=NEEDS_REFINEMENT → force_hold=True / HOLD.
    NEEDS_REFINEMENT is not a pass verdict and must never auto-continue.
    rh  r   r  rs   rt   r^  r_  r`  Tra  Nr   r   r   r   r   z2verdict=NEEDS_REFINEMENT must force HOLD_FOR_CHAIRrc  r   r   r   r   r   r   r@  rR  rd  )r(   r   r   codex_needs_refinementr   r   r   r   r   r   r   r   r   s                r'   2test_r2_high2_needs_refinement_verdict_forces_holdr    s    +,H%'(!
 
:
 
 %'.&)??$'=="%<<
	
 :: & :&' 4 '4/  '4                  '    (    ,0    	=      
-r	2B66','6,'4'4''''4''''''2'''2'''6''',''''''4'''''''662)26)2 22 22222 2222222222222226222)222222 222222222%
 
s    M''M1c           
        t               }ddg d}t        d|      5  t        | t        ||dz  |dz  |dz  d	
      }ddd       j	                  di       }|j                  }d} ||      }d}	||	u }
|
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|       dz   d|iz  }t        t        j                  |            dx}x}x}x}
}	|j                  }d} ||      }d}	||	u }
|
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      dz   d|iz  }t        t        j                  |            dx}x}x}x}
}	y# 1 sw Y   FxY w)u   HIGH-2 fix: codex_audit verdict=PASS_WITH_RECOMMENDATIONS,
    unresolved_high_or_critical=0, no HIGH/CRITICAL findings → NOT force_hold.
    Auto-continue is allowed in this exact configuration.
    r   r   r  rs   rt   r^  r_  r`  Tra  Nr   r   Fr   r   r   r   z@PASS_WITH_RECOMMENDATIONS + 0 unresolved should NOT force_hold: rc  r   r   r   z8PASS_WITH_RECOMMENDATIONS + 0 unresolved should not HOLDrd  )r(   r   r   
codex_passr   r   r   r   r   r   r   r   r   s                r'   ?test_r2_high2_pass_with_recommendations_zero_unresolved_no_holdr    s   
 +,H.'(!J
 
:
 
 %'"&)??$'=="%<<
	
 
-r	2B66 , 6, 5 5(  5                           $)    K2$O      :: & :&' 5 '50  '5                  '    (    ,1    	C     #
 
s    JJc                    ddl m} | dz  }t        j                  t        d      5   ||d       ddd       | dz  } ||d       y# 1 sw Y   xY w)	zMEDIUM-4 fix: hold_path default derived from controller_task_id.
    A mismatched controller_task_id in hold_out_path should raise ValueError.
    r   rp  ztask-WRONG.hold.jsonr   rr  rk  Nr`  rt  )r   rq  bad_hold	good_holds       r'   9test_r2_medium4_hold_path_derived_from_controller_task_idr    sY     P 00H	z	4 ?%h>? 22I!)];? ?s   
AAc                   t               }|dz  }t        d|      5  t        j                  t        d      5  t        | t        |dz  |dz  t        |      dd	
       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)zMEDIUM-4 fix: running with controller_task_id != hold_path task_id raises ValueError
    during run_goal_activation (early validation).
    ztask-9999.hold.jsonrs   rt   r   rr  r^  r_  rk  T)r(   rz   r{   r|   r}   rl  r7  N)rk   r   rv  rw  rx  r   r   r  )r(   r   r   r  s       r'   :test_r2_medium4_hold_path_wrong_controller_id_raises_earlyr    s     +,H//H	:
  ]]:Z8 		+#"*-C"C (+A A!(m#0#			 		 			 s"   A<&A0A<0A9	5A<<Bc           
     b   ddd}| dz  }| dz  }| dz  }t        j                  t        d      5  t        |t        ||t        |      d	
       ddd       |j                  } |       }| }|st        j                  d|       dz   dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            dx}x}}|j                  } |       }| }|st        j                  d|       dz   dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            dx}x}}|j                  } |       }| }|st        j                  d|       dz   dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            dx}x}}y# 1 sw Y   WxY w)u  LOW-1 regression: invalid goal contract (schema mismatch) AND a mismatched
    hold_out_path (task id != controller_task_id) → controller raises ValueError
    BEFORE writing ANY packet (decision/result/hold must not be created at wrong path).

    This exercises the parse-failure + bad-path combination introduced by the MEDIUM fix:
    path validation now runs BEFORE parse_goal_contract, so a mis-routed hold_out_path
    must be rejected even when the contract itself is invalid.
    zwrong.schema.that.will.failbar)r-   fooztask-WRONG-ID.hold.jsonr^  r_  r   rr  rk  )r(   rz   r{   r|   r}   rl  Nz:Bad hold path must NOT be written before path validation: r  r  r  z>Decision path must NOT be written when path validation fails: bad_decz<Result path must NOT be written when path validation fails: bad_res)rv  rw  rx  r   r   r  r  r   r&  r   r   r   r   r   r   )	r   invalid_contractr  r  r  r   r   r   r3  s	            r'   :test_low1_parse_failure_bad_hold_path_rejects_before_writer  4  s    #@N33H//G//G	z	4 
*%#h-,	

           EXJO                 !      ~~ ~     I	R                        ~~ ~     GwiP                        %
 
s   J$$J.c                   t        |       }|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }dd|iz  }t        t        j                  |            d 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@  )z%(py1)s == %(py3)sr   r  rH  r"  r8   r   rE  )z%(py1)s in %(py4)sr  r   assert %(py6)sr   )
r   r   r   r   r   r   r   r   r   r   )	r(   r   r0  r1  r2  r3  r   r.  @py_format7s	            r'   test_parse_goal_contract_validr  Z  s    	]	+Bh</</////<////<//////////////////&?"->*??&*?????&*????&???*????????r&   c                 L   t        j                  t              5 } t        ddi       d d d        d} j                  }|j
                  }||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                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}}y # 1 sw Y   xY w)	Nr-   zwrong.schemarE  )zG%(py1)s in %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.value
}.code
}exc_infor  r   r"  r  assert %(py9)sr   )rv  rw  r
   r   r  coder   r   r   r   r   r   r   r   )r  r0  r  @py_assert6r1  r  r   s          r'   (test_parse_goal_contract_schema_mismatchr  `  s    	(	) 8XX~678*x~~*~***8*****8****8******x***x***~***********8 8s   DD#c                    t        t                     dgd} t        | t        t                     t        t              t        t                    }g }||k(  }|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}}y )
Nmerge)r   r   )planned_effective_actionsrC   forbidden_write_targetsr@  )z%(py0)s == %(py3)s
violations)r   r   rH  r"  )rj   _PLANNED_VALID_ACTIONSr   r   r   r   r   r   r   r   r   r   r   )r   r  r1  r   r2  r3  s         r'   test_validate_boundary_passr  f  s     6 89%Y
B #
"&'='?"@!">? $%H I	J ::::r&   c                      y)N)
r   r   r   r8   result_marker_writereport_writenormal_callback_registerfallback_callback_registerr   rN  r%   r%   r&   r'   r  r  t  s    r&   c                	   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  }d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  }d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  }dd|iz  }t        t        j                  |            dx}}|d	   }t        |t              }|sddt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            dx}}|d
   }|d	   }t        |      }||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}}|d   }t        |t              }|sddt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            dx}}y)uV   parse_success_condition: 공개 API — raw / parts / part_count 구조 반환 검증.rawrE  rG  parsedr  rH  r"  Nparts
part_countz5assert %(py5)s
{%(py5)s = %(py0)s(%(py2)s, %(py3)s)
}r  rj   )r   r   r   r"  r@  )z0%(py1)s == %(py7)s
{%(py7)s = %(py3)s(%(py5)s)
}r  r  r  r   r  )r   r   r   r   r   r   r   r   r   r  rj   r  r  )r(   r  r0  r1  r2  r3  r   r  r  r  r   s              r'   "test_parse_success_condition_partsr    s   $]3F5F?5F5FF7f7f7ff!<6!!!!<6!!!<!!!!!!6!!!6!!!!!!!Wo,:ot,,,,,,,,:,,,:,,,o,,,,,,t,,,t,,,,,,,,,,,7vg73#77#77777#7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7Um):mS)))))))):))):)))m))))))S)))S))))))))))r&   c                    t        i       } | 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	   }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}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            dx}x}}y)uJ   parse_success_condition: success_condition 없는 경우 빈 parts 반환.r  r  r@  )z%(py1)s == %(py4)sr  r  r   Nr  r  r   )r   r   r   r   r   r   )r  r0  r   r1  r.  r  s         r'   "test_parse_success_condition_emptyr    s    $R(F%=B=B=B=B'? b ?b    ?b   ?   b       ,$1$1$$$$1$$$$$$1$$$$$$$r&   c                   t        |       }t        |t              }|s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                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d}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)uX   parse_hold_conditions: 공개 API — hold_conditions 리스트 정규화 반환 검증.rP  r  condsrj   rQ  Nc              3  <   K   | ]  }t        |t                y wr  )r  r  )r  cs     r'   r  z2test_parse_hold_conditions_list.<locals>.<genexpr>  s     1az!S!1s   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}allr  )r   r  rj   r   r   r   r   r   r   r   r  )r(   r  r   r.  r   s        r'   test_parse_hold_conditions_listr    s    !-0EeT"""""""":""":""""""e"""e""""""T"""T""""""""""15113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1r&   c                 v   i } t        |       }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  }dd|iz  }t        t        j                  |            dx} x}x}}dd	i} t        |       }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  }dd|iz  }t        t        j                  |            dx} x}x}}ddi} t        |       }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  }dd|iz  }t        t        j                  |            dx} x}x}}y)
uN   parse_hold_conditions: hold_conditions 가 list 아닌 경우 빈 list 반환.r@  )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sr   )r   r   r   r  r  r   Nr   z
not-a-list)	r   r   r   r   r   r   r   r   r   )r   r   r  r   r  r   s         r'   #test_parse_hold_conditions_non_listr    s   !#* $**$****$****** *** ******$**********"3\!BI !BCIrICrIIIICrIIIIII III III!BIIICIIIrIIIIIII"3T!:A !:;ArA;rAAAA;rAAAAAA AAA AAA!:AAA;AAArAAAAAAAr&   )returndict[str, Any])rp   r  r  r  )a__doc__
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   r  r!   syspathlibr   typingr   unittest.mockr   rv  __file__resolveparentsr   r  pathinsertanu_v3.goal_execution_contractr   r	   r
   r   anu_v3.goal_boundary_validatorr   r   r   ru  r   'anu_v3.pre_authorized_activation_runnerr   r   !anu_v3.pre_authorized_action_gater   r   -anu_v3.pre_authorized_evidence_bundle_builderr   r   r#   r*   r$  CLI_SRCfixturer(   r+   rk   rq   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r4  r>  rV  rf  ri  rn  rz  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r%   r&   r'   <module>r     s,   #   
  
    N""$,,Q/	y>!HHOOAs9~&  
  ..   ;;  X%(GG
i
"E
E hI  I hM  M
6r6#UN8<0F8*760$06040,04020,0,(60B,`>..Gd1B(66<?<\<.6>!YH6B3>B< 0"L@+	*%2Br&   