
     j)                        d Z ddlZddlZddlZddlmZ ddlZ ee      j                         j                  d   Z ee      ej                  vr"ej                  j                  d ee             ddlmZmZmZmZmZ g dZdefdZd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&d Z'd Z(d Z)d Z*d Z+d Z,d Z-d Z.d  Z/e0d!k(  r e1 ejd                  ed"g            y)#u  test_pre_authorized_action_gate.py — task-2553+4 회장 필수 테스트 10 + schema + fixture.

회장 verbatim 필수 테스트:
  1. task-2553+1 F1-solo clean replacement PR contract → ALLOW
  2. merge=true → HOLD
  3. same_branch_push=true → HOLD
  4. expected_files mismatch → HOLD
  5. credential_required=true → HOLD
  6. critical_7=true → HOLD
  7. codex_verdict=FAIL → HOLD
  8. callback normal/fallback 누락 → HOLD
  9. source_pr_preserved=false → HOLD
 10. action_type unknown → HOLD

추가: schema validation fail → HOLD / GO-ready packet 정규화 / decision schema 정합 /
expected_files exact-match / fail-closed all-true 이중 안전.
    N)Path   )CONTRACT_SCHEMA_NAMEDECISION_ALLOWDECISION_HOLDDECISION_SCHEMA_NAMEevaluate)zanu_v2/owner_trigger_pat.pyz4tests/regression/test_owner_trigger_2553_plus1_f1.pyzmemory/reports/task-2553+1.mdz%memory/events/task-2553+1.result.jsonz*memory/events/task-2553+1.red-evidence.logz,memory/events/task-2553+1.green-evidence.logreturnc                      i dt         d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S )uP   task-2553+1 F1-solo clean replacement PR open canonical contract (ALLOW 대상).schematask_idtask-2553+1action_typeclean_replacement_pr_open	source_prf   (bd5ad74f5d443b354319fc8b3cb006816b8a9025ztask/task-2553-dev5T)numberhead_shabranch	preservedsame_branch_pushF
fresh_basebase_sha(7346df8260803308df30a6d04ec32d66d4cdfa5b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PASS_WITH_RECOMMENDATIONSnormalfallback)scope_expansioncodex_verdictcallbackmerge_requiredauto_closeoutdev_status_change)r   listF1_SOLO_EXPECTED_FILES     G/home/jay/workspace/tests/regression/test_pre_authorized_action_gate.py_f1_solo_contractr5   2   s   &= 	2 	B+	
	 	E 	d 	> 	$56 	%; < 	"2  	'!" 	e#$ 	%e%& 	#E'( 	#E)* 	u+, 	,U-. !4#6"9 r3   c                      t        t                     } | d   t        k(  s
J | d          | d   t        k(  sJ | d   du sJ d| d   v sJ t	        | d   j                               sJ y )	Ndecisionreasonsr   no_github_write_performedTr   auto_allowed_actionschecks)r	   r5   r   r   allvaluesds    r4   4test_01_f1_solo_clean_replacement_pr_contract_allowsr@   V   s    "$%AZ=N*8AiL8*X;....()T111&!,B*CCCCq{!!#$$$r3   c                  f    t               } d| d<   t        |       }|d   t        k(  sJ d|d   v sJ y )NTr-   r7   u   merge 필요r8   r5   r	   r   cr?   s     r4   test_02_merge_true_holdsrE   a   sB    AAAZ=M)))Qy\)))r3   c                  f    t               } d| d<   t        |       }|d   t        k(  sJ d|d   v sJ y )NTr   r7   u   same-branch push 필요r8   rB   rC   s     r4   #test_03_same_branch_push_true_holdsrG   i   sB    A AAZ=M)))$)444r3   c                  t    t               } | d   dgz   | d<   t        |       }|d   t        k(  sJ d|d   v sJ y )Nr   scripts/finish-task.shr   r7   u   expected_files 밖 diff 필요r8   rB   rC   s     r4   %test_04_expected_files_mismatch_holdsrJ   q   sQ    A !"2 37O6P PAAZ=M)))+q|;;;r3   c                  f    t               } d| d<   t        |       }|d   t        k(  sJ d|d   v sJ y )NTr!   r7   u   credential 필요r8   rB   rC   s     r4   !test_05_credential_required_holdsrL   y   sB    A&*A"#AZ=M)))!I,...r3   c                  f    t               } d| d<   t        |       }|d   t        k(  sJ d|d   v sJ y )NTr    r7   z
Critical 7r8   rB   rC   s     r4   test_06_critical_7_true_holdsrN      s@    AAlOAZ=M)))1Y<'''r3   c                  f    t               } d| d<   t        |       }|d   t        k(  sJ d|d   v sJ y )NFAILr+   r7   zCodex FAIL / HIGH / CRITICALr8   rB   rC   s     r4    test_07_codex_verdict_fail_holdsrQ      sA    AAoAZ=M))))Qy\999r3   c                  l    t               } ddd| d<   t        |       }|d   t        k(  sJ d|d   v sJ y )NTFr'   r,   r7   u   callback contract 누락r8   rB   rC   s     r4   test_08_callback_missing_holdsrS      sE    A#7AjMAZ=M)))%9555r3   c                  l    t               } d| d   d<   t        |       }|d   t        k(  sJ d|d   v sJ y )NFr   r   r7   u   source PR 원본 변경 필요r8   rB   rC   s     r4   %test_09_source_pr_not_preserved_holdsrU      sE    A"'AkN;AZ=M)))+q|;;;r3   c                  f    t               } d| d<   t        |       }|d   t        k(  sJ d|d   v sJ y )Nmerge_prr   r7   zaction_type unknownr8   rB   rC   s     r4   !test_10_action_type_unknown_holdsrX      sA    A!AmAZ=M))) AiL000r3   c                  ^    dD ](  } t               }| |d<   t        |      d   t        k(  r(J  y )N)HIGHCRITICALPASS_BUT_HIGH r+   r7   rB   )vrD   s     r4   !test_codex_high_and_critical_holdr_      s:    6 8/{:&-7778r3   c                      t               } d| d<   t        |       d   t        k(  sJ d| d<   t        |       d   t        k(  sJ y )NPASSr+   r7   GO_READY_WITH_RECOMMENDATIONS)r5   r	   r   r   )rD   s    r4   =test_pass_with_recommendations_allows_but_plain_unknown_holdsrc      sL    AAoA;z"n4448AoA;z"m333r3   c                  j    t        ddd      } | d   t        k(  sJ t        d | d   D              sJ y )Nwrongx)r   r   r7   c              3   $   K   | ]  }d |v  
 ywzschema validation failNr2   .0rs     r4   	<genexpr>z4test_schema_validation_fail_holds.<locals>.<genexpr>        C'1,C   r8   )r	   r   anyr>   s    r4   !test_schema_validation_fail_holdsrp      s;    G45AZ=M)))Ca	lCCCCr3   c                  R    d ddddgdfD ]  } t        |       }|d   t        k(  rJ  y )N*   str   r   Tr7   r	   r   )badr?   s     r4   test_non_mapping_input_holdsrw      s;    b%!Q. .SM}---.r3   c                      t               } d| d<   t        |       }|d   t        k(  sJ t        d |d   D              sJ y )Nr   r-   r7   c              3   $   K   | ]  }d |v  
 ywrh   r2   ri   s     r4   rl   z:test_bool_key_must_be_strict_bool_holds.<locals>.<genexpr>   rm   rn   r8   )r5   r	   r   ro   rC   s     r4   'test_bool_key_must_be_strict_bool_holdsrz      sH    AAAZ=M)))Ca	lCCCCr3   c                  ^    dD ](  } t               }d|| <   t        |      d   t        k(  r(J  y )N)r$   r%   Tr7   rB   krD   s     r4   +test_real_write_and_limited_real_write_holdr~      s9    I 8!{:&-7778r3   c                      t               } d| d<   t        |       d   t        k(  sJ t               } dg| d<   t        |       }|d   t        k(  sJ d|d   v sJ y )NTr*   r7   rI   r   zforbidden pathr8   rB   rC   s     r4   ,test_scope_expansion_and_forbidden_path_holdr      so    AAA;z"m333A$<#=A AZ=M)))q|+++r3   c                  ^    dD ](  } t               }d|| <   t        |      d   t        k(  r(J  y )N)r.   r/   Tr7   rB   r|   s     r4   &test_auto_closeout_and_dev_status_holdr      s9    3 8!{:&-7778r3   c                  f    t               } d| d<   t        |       }|d   t        k(  sJ d|d   v sJ y )NFr   r7   u   fresh base 미충족r8   rB   rC   s     r4   test_fresh_base_false_holdsr      s@    AAlOAZ=M)))!Qy\111r3   c                  d    dddt               d} t        |       }|d   t        k(  s
J |d          y )Nz Option 1 F1-solo GO-ready packetr   GO_READY)marker_kindr   	readiness pre_authorized_clean_replacementr7   r8   )r5   r	   r   packetr?   s     r4   )test_go_ready_packet_normalization_allowsr      s?    9 ,=,?	F 	AZ=N*8AiL8*r3   c                  B    dddd} t        |       }|d   t        k(  sJ y )Nrf   r   r   )r   r   r   r7   ru   r   s     r4   (test_go_ready_packet_without_block_holdsr      s*     ]TFAZ=M)))r3   c                      t        j                  t        dz  dz  j                  d            } t	        t                     }t        |j                               t        | d         k(  sJ | d   du sJ y )Nschemasz*pre_authorized_action_decision.schema.jsonutf-8encodingrequiredadditionalPropertiesF)jsonloads	WORKSPACE	read_textr	   r5   sortedkeys)r   r?   s     r4   )test_decision_schema_matches_emitted_keysr      sy    ZZ	Y	!M	MXX 	Y 	
F
 	"$%A!&&(vfZ&89999()U222r3   c                      ddl m}  t        j                  t        dz  dz  j                  d            }t        |d         t        |       k(  sJ y )Nr   )_REQUIRED_KEYSr   z*pre_authorized_action_contract.schema.jsonr   r   r   )!anu_v3.pre_authorized_action_gater   r   r   r   r   r   )r   r   s     r4   /test_contract_schema_required_keys_match_moduler     sT    @ZZ	Y	!M	MXX 	Y 	
F
 &$%)????r3   c                 R   t         dz  dz  }t        j                  j                  d|      }|r|j                  sJ t        j                  j                  |      }|j                  j                  |       | dz  }|j                  t        j                  t                     d       | dz  }|j                  dt        |      d	t        |      g      }|d
k(  sJ t        j                  |j                               d   t        k(  sJ t               }d|d<   | dz  }|j                  t        j                  |      d       | dz  }	|j                  dt        |      d	t        |	      g      }|dk(  sJ t        j                  |	j                               d   t         k(  sJ y)uU   scripts/run_pre_authorized_action_gate.py: ALLOW=0 / HOLD=2 + decision 파일 생성.scriptsz!run_pre_authorized_action_gate.pyrpagz
allow.jsonr   r   zallow-decision.jsonz--inputz--outr   r7   Tr-   z	hold.jsonzhold-decision.jsonr   N)r   	importlibutilspec_from_file_locationloadermodule_from_specexec_module
write_textr   dumpsr5   mainrs   r   r   r   r   )
tmp_pathrunnerspecmodallow_in	allow_outrchold_chold_inhold_outs
             r4   .test_cli_runner_writes_decision_and_exit_codesr     st   "%HHF>>11&&ADDKK
..
)
)$
/CKKC ,&H

#4#67'J00I	9c(mWc)nE	FB7N7::i))+,Z8NJJJ F#F$Gtzz&)G<..H	9c'lGS]C	DB7N7::h((*+J7=HHHr3   __main__z-q)3__doc__importlib.utilr   r   syspathlibr   pytest__file__resolveparentsr   rs   pathinsertr   r   r   r   r   r	   r1   dictr5   r@   rE   rG   rJ   rL   rN   rQ   rS   rU   rX   r_   rc   rp   rw   rz   r~   r   r   r   r   r   r   r   r   __name__
SystemExitr   r2   r3   r4   <module>r      s#  "   
  N""$,,Q/	y>!HHOOAs9~&  4 H%*5</(:6<184D.D8,829*3@I2 z
[V[[(D!12
33 r3   