
    4jD                       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Z ee      j!                         j"                  j"                  j"                  Z ee      ej(                  v r!ej(                  j+                   ee             ej(                  j-                  d ee             ddlmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z* edz  Z+edz  dz  Z,edz  dz  Z-d	Z.d
 Z/d Z0d Z1d Z2d Z3d Z4d Z5d 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% ZJd& ZKd' ZLd( ZMd) ZNd* ZOePd+k(  r eQ ej                  ed,g            y)-u  tests/regression/test_policy_profile_engine_2553plus33.py — task-2553+33 Track C1 회귀.

Spec: memory/tasks/task-2553+33.md
(sha256 8c120eb9f03429a9e03ba30f1e5e1a66a7919b430d31bef9988a17e6932244dd).

회장 §3 필수구현 10건 + §8 HOLD + §7 invariant 검증:

 1. goal_request parser (정적 meta-schema 검증, fail-closed)
 2. policy_profile loader (read-only, 이중 검증)
 3. goal_type resolver
 4. boundary resolver
 5. gate expansion (기존 단일 profile 의미 보존)
 6. HOLD expansion
 7. allowed / forbidden expansion (universal forbidden 박제)
 8. completion packet schema resolver (정적 meta-schema 참조)
 9. evidence schema resolver (정적 meta-schema 참조)
10. decision JSON 산출 + batch coordinator 연결 어댑터
11. §8 HOLD: gate 부재 / allowed∩forbidden 충돌
12. 기존 단일 profile(test_only_hardening_pr_merge_v1) mutation 0 (semantic preserve §8)

모든 테스트 100% offline — network / git / GitHub API 호출 0건, profile write 0건.
    )annotationsN)Path)ENGINE_MODULEMETA_COMPLETION_PACKETMETA_EVIDENCEUNIVERSAL_FORBIDDEN_ACTIONSPolicyEngineError build_completion_packet_skeletonbuild_evidence_skeletonevaluate_holdexpand_forbidden_actionsexpand_gateexpand_holdload_meta_schemaload_policy_profilenormalize_boundary_denyparse_goal_requestresolve_boundaryresolve_goal_typeresolve_policyvalidate_against_metaschemasmemorypolicy_profilestest_only_hardening_pr_merge_v1c                 F    ddddgdt         id}|j                  |        |S )Ntask-2553+33-c1z4auto-derive gate/HOLD/allowed/forbidden from profileforbid:production_code_changeno:pr_branch_main_writename)goal_idgoal_statementboundarypolicy_profile)PROFILE_NAMEupdate)overbases     M/home/jay/workspace/tests/regression/test_policy_profile_engine_2553plus33.py_goal_requestr*   C   s3    $P46OP!<0	D 	KKK    c                 J    t        t        di | t        t        t              S )Nprofile_json_dirprofile_schema_dir
schema_dir )r   r*   PROFILE_JSON_DIRPROFILE_SCHEMA_DIR
SCHEMA_DIR)r'   s    r)   _resolver5   N   s#    )-	 r+   c                 (   t        t               t              } | 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	   }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 )Nr0   r!   r   ==z%(py1)s == %(py4)spy1py4assert %(py6)spy6r#   5assert %(py5)s
{%(py5)s = %(py0)s(%(py2)s, %(py3)s)
}
isinstancelistpy0py2py3py5)r   r*   r4   
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanationrA   rB   @py_builtinslocals_should_repr_global_name)	gr@py_assert0@py_assert3@py_assert2@py_format5@py_format7@py_assert1@py_assert4@py_format6s	            r)   test_parse_goal_request_okrY   Z   s    	MO
	CBi=---=-----=----=-----------n+:nd++++++++:+++:+++n++++++d+++d++++++++++r+   c                 Z   t        j                  t              5 } t        ddit               d d d         j
                  }|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      t        j                  |      dz  }d	d
|iz  }t        t        j                  |            d x}x}x}}y # 1 sw Y   xY w)Nr!   xr7   goal_request_schema_failr8   zG%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.value
}.code
} == %(py7)seirD   rE   r=   py7assert %(py9)spy9pytestraisesr	   r   r4   valuecoderH   rI   rM   rN   rO   rJ   rK   rL   r^   rV   rR   @py_assert6@py_assert5@py_format8@py_format10s          r)   #test_parse_goal_request_fail_closedrm   `   s    	(	) DRIs+
CD8868==666=66666=6666666266626668666=66666666666D Ds   D!!D*c                 V   t        j                  t              5 } t        dt               d d d         j
                  }|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}x}x}}y # 1 sw Y   xY w)
Nz
not-a-dictr7   goal_request_not_mappingr8   r]   r^   r_   ra   rb   rc   rh   s          r)   #test_parse_goal_request_not_mappingrp   f   s    	(	) @R<J?@8868==666=66666=6666666266626668666=66666666666@ @s   DD(c                    t        t        t        t        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
}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )Nr-   
profile_idr8   z%(py1)s == %(py3)sr%   r<   rF   assert %(py5)srG   versionv1r:   r;   r>   r?   )r   r%   r2   r3   r4   rH   rI   rJ   rM   rN   rO   rK   rL   )prQ   rS   @py_format4rX   rR   rT   rU   s           r)   test_load_policy_profile_okrz   o   s    )-		A \?*?l****?l***?******l***l*******Y<4<4<4<4r+   c                 j   t        j                  t              5 } t        dt        t
        t               d d d         j                  }|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                   |            d x}x}x}}y # 1 sw Y   xY w)
Nno_such_profiler-   profile_load_failr8   r]   r^   r_   ra   rb   )rd   re   r	   r   r2   r3   r4   rf   rg   rH   rI   rM   rN   rO   rJ   rK   rL   rh   s          r)    test_load_policy_profile_missingr~   z   s    	(	) 
R-1!		

 88/8==///=/////=///////2///2///8///=///////////
 
s   D))D2c                 l   ddi} dt         i}t        | |      }d}||k(  }|s
t        j                  d|fd||f      dt	        j
                         v st        j                  t              rt        j                  t              nddt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      t        j                  |      dz  }d	d
|iz  }t        t        j                  |            d x}x}x}}y )N	goal_typecustom_lifecyclerr   r8   )z9%(py5)s
{%(py5)s = %(py0)s(%(py1)s, %(py3)s)
} == %(py8)sr   rP   )rD   r<   rF   rG   py8assert %(py10)spy10
r%   r   rH   rI   rM   rN   rO   rJ   rK   rL   )rP   rS   rW   @py_assert7ri   @py_format9@py_format11s          r)   $test_resolve_goal_type_explicit_winsr      s    
)	*B".!=TR!=>TBTT>BTTTTT>BTTTTTTTTTTTTTTTTRTTTRTTT!=TTT>TTTBTTTTTTTTr+   c                    i } dt         i}t        | |      }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x} x}x}x}}i } dd	i}t        | |      }d
}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x} x}x}x}}y )Nrr   pr_merge_lifecycler8   )z9%(py6)s
{%(py6)s = %(py0)s(%(py2)s, %(py4)s)
} == %(py9)sr   )rD   rE   r=   r?   rb   zassert %(py11)spy11something_elsegeneric_goalr   )rV   rR   rj   @py_assert8r   rl   @py_format12s          r)   test_resolve_goal_type_inferredr      sD   V,!=VR!=>VBVV>BVVVVV>BVVVVVVVVVVVVVRVVV!=VVV>VVVBVVVVVVVVT,0@!ATR!ABTnTBnTTTTBnTTTTTTTTTTTTRTTT!ATTTBTTTnTTTTTTTTr+   c                    t        t        t        t        t              } t        t               |       }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}}|d	   }d
}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}d |d   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 )Nr-   r   explicitinz%(py1)s in %(py4)sr;   r>   r?   live_ws_pathz/home/jay/workspacer8   r:   live_ws_sanctioned_commit(20456b5f83fc039f2fd6f50f4b94095c29b41bfbc              3  $   K   | ]  }d |v  
 ywowner_trigger_patNr1   ).0rs     r)   	<genexpr>z=test_resolve_boundary_merges_profile_scope.<locals>.<genexpr>   s     LA"a'L   forbidden_paths_regex,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}anyrD   rE   r=   )r   r%   r2   r3   r4   r   r*   rH   rI   rJ   rK   rL   r   rM   rN   rO   )rx   brQ   rR   rS   rT   rU   rV   s           r)   *test_resolve_boundary_merges_profile_scoper      s   )-		A 	!,A*;a
m;*m;;;;*m;;;*;;;m;;;;;;;^5 55 55555 5555555 55555555()W-WW)-WWWWW)-WWWW)WWW-WWWWWWWWL3J1KLL3LLLLLLLLL3LLL3LLLLLLLLLLLLLLr+   c                 4   t        t        t        t        t              } t        |       }|D ch c]  }|j                   }}h d}||k(  }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d x}}|D ci c]  }|j                  |j                   }}|d	   }d
}	||	k(  }|slt        j                  d|fd||	f      t        j                  |      t        j                  |	      dz  }
dd|
iz  }t        t        j                  |            d x}x}}	|d   }d}	||	u }|slt        j                  d|fd||	f      t        j                  |      t        j                  |	      dz  }
dd|
iz  }t        t        j                  |            d x}x}}	|d   }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 c c}w c c}w )Nr-   >   mergeable_eqci_all_successproduction_byte0merge_state_status_inhead_sha_eq_sanctionedeffective_diff_test_onlyreview_decision_allowlistunresolved_review_threads_eqr8   rs   namesrt   ru   rG   r   	MERGEABLEr:   r;   r>   r?   r   Tis)z%(py1)s is %(py4)sr   r   )r   r%   r2   r3   r4   r   r    rH   rI   rJ   rM   rN   rO   rK   rL   expected)rx   gategr   rQ   rS   ry   rX   byrR   rT   rU   s               r)   +test_expand_gate_preserves_existing_profiler      s   )-		A q>D!"QVV"E"	 	 	 
	 	 	 	 
	 	 Y	 	 	 		 	 	 	 Y	 	 	 	 	 	 '+	+!&&!**
	+B	+n,,,,,,,,,,,,,,,,,,,'4'4''''4''''''4''''''',-22-2222-222-2222222222 # 
,s   J0Jc                 \   t        ddiddid      } | D cg c]  }|j                   }}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}}y c c}w )Nr[      y   )gate_predicatemerge_ready_predicater8   r:   r;   r>   r?   )r   r    rH   rI   rJ   rK   rL   )r   r   rQ   rR   rS   rT   rU   s          r)   /test_expand_gate_prefers_generic_gate_predicater      s~    3(cSTXVWD !qAFF!*!cU*!U****!U***!***U*******!s   B)c                 6   t        t        t        t        t              } 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}}y )Nr-   codex_high_or_criticalr   z%(py1)s in %(py3)sholdrt   ru   rG   	critical7"credential_or_permission_expansion)r   r%   r2   r3   r4   r   rH   rI   rJ   rM   rN   rO   rK   rL   )rx   r   rQ   rS   ry   rX   s         r)   test_expand_hold_any_truer      s4   )-		A q>D#+#t++++#t+++#++++++t+++t+++++++;$;$;$$/7/47777/4777/777777477747777777r+   c                 F   t               } t        D ]  }| j                  }||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t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}} d}| j                  }||v }|st        j                  d|fd	||f      t        j                  |      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      d
z  }	dd|	iz  }
t        t        j                  |
            d x}x}}d}| j                  }||v }|st        j                  d|fd	||f      t        j                  |      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      d
z  }	dd|	iz  }
t        t        j                  |
            d x}x}}d}| j                  }||v }|st        j                  d|fd	||f      t        j                  |      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      d
z  }	dd|	iz  }
t        t        j                  |
            d x}x}}d}| j                  }||v }|st        j                  d|fd	||f      t        j                  |      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      d
z  }	dd|	iz  }
t        t        j                  |
            d x}x}}y )Nr   )z9%(py0)s in %(py4)s
{%(py4)s = %(py2)s.forbidden_actions
}fr   r   r>   r?   production_code_changez9%(py1)s in %(py5)s
{%(py5)s = %(py3)s.forbidden_actions
}r<   rF   rG   assert %(py7)sr`   merge_without_gate_passcallback_mandatory_rule_weaken"batch_coordinator_original_destroy)r5   r   forbidden_actionsrH   rI   rM   rN   rO   rJ   rK   rL   )r   r   rR   rV   rT   rU   rQ   rW   rS   rX   rk   s              r)   )test_universal_forbidden_verbatim_presentr      sm   
A( ('''q'''''q'''''''q'''q''''''A'''A'''''''''''(#:q':'::#':::::#'::::#::::::q:::q:::'::::::::$;(;(;;$(;;;;;$(;;;;$;;;;;;;;;;;;(;;;;;;;;+Bq/B/BB+/BBBBB+/BBBB+BBBBBBqBBBqBBB/BBBBBBBB/F13F3FF/3FFFFF/3FFFF/FFFFFF1FFF1FFF3FFFFFFFFr+   c                    t        t        t        t        t              } t        t               |       }t        | |      }d |D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}y )Nr-   c              3  $   K   | ]  }d |v  
 ywr   r1   )r   r   s     r)   r   z>test_forbidden_includes_profile_scope_regex.<locals>.<genexpr>   s     6A"a'6r   r   r   r   )r   r%   r2   r3   r4   r   r*   r   r   rM   rN   rH   rO   rJ   rK   rL   )rx   r   forbrV   rR   rT   s         r)   +test_forbidden_includes_profile_scope_regexr      s    )-		A 	!,A#Aq)D66636666666663666366666666666666r+   c                 4   t               } d}| j                  }||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}d}| j                  }||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}d	 | j                  D        }t        |      }|sd
dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}d}| j                  }||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )Ngate_evaluater   )z7%(py1)s in %(py5)s
{%(py5)s = %(py3)s.allowed_actions
}r   r   r   r`   completion_packet_emitc              3  >   K   | ]  }|j                  d         yw)zpost_merge:N)
startswith)r   as     r)   r   z/test_allowed_actions_derived.<locals>.<genexpr>   s     Fqq||M*Fs   r   r   r   zreview_thread_resolve:bounded)r5   allowed_actionsrH   rI   rJ   rM   rN   rO   rK   rL   r   )	r   rQ   rW   rS   rX   rk   rV   rR   rT   s	            r)   test_allowed_actions_derivedr      s   
A/a///?/////?////?//////a///a///////////#8q'8'88#'88888#'8888#888888q888q888'88888888FA4E4EFF3FFFFFFFFF3FFF3FFFFFFFFFFFFFF*?a.?.??*.?????*.????*??????a???a???.????????r+   c                    t               } | j                  d   }|j                  } |t              }|sddt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d x}}t        |      }|j                  } |       }|sd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                  |      t        j                  |      dz  }t        t        j                  |            d x}x}}| j                  d	   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}}y )Nmeta_schema_refJassert %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.endswith
}(%(py3)s)
}refr   rC   _assert %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py0)s(%(py1)s)
}.exists
}()
}r   rD   r<   rF   rG   r`   concreterr   r8   rs   r%   rt   ru   rG   )r5   completion_packet_schemaendswithr   rM   rN   rH   rO   rJ   rK   rL   r   existsr%   rI   
r   r   rV   rW   rX   rS   ri   rk   rQ   ry   s
             r)   *test_completion_packet_resolver_static_refr      s   
A

$
$%6
7C<</<.////////3///3///<//////.///.//////////99449%%j1,?O?<OOOO?<OOO?OOOOOO<OOO<OOOOOOOr+   c                    t               } | j                  d   }|j                  } |t              }|sddt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d x}}t        |      }|j                  } |       }|sd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                  |      t        j                  |      dz  }t        t        j                  |            d x}x}}| j                  d	   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}}y )Nr   r   r   r   rC   r   r   r   r   rr   r8   rs   r%   rt   ru   rG   )r5   evidence_schemar   r   rM   rN   rH   rO   rJ   rK   rL   r   r   r%   rI   r   s
             r)   !test_evidence_resolver_static_refr     s   
A


-
.C<<&<&&&&&&&&3&&&3&&&<&&&&&&&&&&&&&&&&&&&99449Z(6F6,FFFF6,FFF6FFFFFF,FFF,FFFFFFFr+   c                    t               } | j                         }|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   }|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}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|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   }|j                  }d}	 ||	      }
|
stdt        j                  |      t        j                  |      t        j                  |	      t        j                  |
      dz  }t        t        j                  |            d x}x}x}	}
d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }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}}t        j                  |       y )Nschemaz(anu_v3.policy_profile_engine.decision.v1r8   r:   r;   r>   r?   enginers   r   rt   ru   rG   statusRESOLVEDrr   r%   gate_semanticsANDzLassert %(py7)s
{%(py7)s = %(py3)s
{%(py3)s = %(py1)s.startswith
}(%(py5)s)
})r<   rF   rG   r`   hold_trigger_conditionsr   r   dHOLDhold_semanticsr   )r5   to_decision_dictrH   rI   rJ   rK   rL   r   rM   rN   rO   r%   r   jsondumps)r   r   rQ   rR   rS   rT   rU   ry   rX   rW   ri   rk   s               r)   .test_decision_dict_shape_and_json_serializabler     s   
A	AX;DDD;DDDDD;DDDD;DDDDDDDDDDDX;';-'''';-''';''''''-'''-'''''''X;$*$;*$$$$;*$$$;$$$*$$$$$$$\?*?l****?l***?******l***l*******0))0%0)%00000000)000%0000000000$)$))))$)))$))))))))))))))))(Q'((6(((((6((((6(((((((((((JJqMr+   c                    t               } | j                         }|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	}||k(  }|slt        j                  d|fd
||f      t        j
                  |      t        j
                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}g }	|d   }t        |t              }
|
}|
r|d   }|}|s<d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  }|	j                  |       |
r+ddt        j
                        iz  }|	j                  |       t        j                  |	d      i z  }dd|iz  }t        t        j                  |            d x}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}	}t        j                   |       y )Nrr   r8   rs   r%   rt   ru   rG   r   r   r:   r;   r>   r?   gate_condition_namesz.%(py7)s
{%(py7)s = %(py2)s(%(py4)s, %(py5)s)
}rA   rB   )rE   r=   rG   r`   %(py10)sr   r   zassert %(py13)spy13r   r@   rC   )r5   to_coordinator_bindingr%   rH   rI   rJ   rM   rN   rO   rK   rL   rA   rB   append_format_boolopr   r   )r   cbrQ   rS   ry   rX   rR   rT   rU   rV   ri   @py_assert9rk   r   r   @py_format14rW   s                    r)   "test_coordinator_binding_pure_dictr    s   
A	
	!	!	#Bl+|++++|+++++++++|+++|+++++++h<%:%<:%%%%<:%%%<%%%:%%%%%%%Vb/0V:0$7V7V7B?U<VV<VVVVVVV:VVV:VVV0VVVVVV$VVV$VVV7VVVV7VVV<VVVVVVVVVVVVVV,-4:-t44444444:444:444-444444t444t4444444444JJrNr+   c                   | dz  dz  }|j                  d       |dz  j                  t        j                  ddd      d	
       t	        t        ddi      || dz  t              }|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}d}g }|j                   }	|	}|	sd}
|
}||v }|sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      dz  }|j#                  |       |	s+ddt        j                  
      iz  }|j#                  |       t        j$                  |d      i z  }t        j                  d|fd||f      t        j                  |      |dz  }d d!|iz  }t        t        j                  |            d x}x}x}x}x}	}
y )"Nr   r   Tparentszno_gate_v1.json
no_gate_v1rw   )rr   rv   utf-8encodingr    r$   	noschemasr-   HOLD_FOR_CHAIRr8   z.%(py2)s
{%(py2)s = %(py0)s.status
} == %(py5)sr   rD   rE   rG   r   r`   zgate predicate (%(py7)s
{%(py7)s = %(py5)s.hold_reason
}rG   r`   r   r   r   r   z%(py1)s in (%(py13)s)r<   r   assert %(py15)spy15mkdir
write_textr   r   r   r*   r4   r   rH   rI   rM   rN   rO   rJ   rK   rL   hold_reasonr  r  tmp_pathpjr   rV   rW   rR   rX   rk   rQ   ri   r  rS   r   r   r  @py_format16s                   r)   test_hold_when_no_gater"  '  s   	H	0	0BHHTH
''

,4@AG (  	fl%;<#k1		A 88'''8'''''8'''''''1'''1'''8'''''''''''4444444444444444444444444444444444444444444444r+   c           
        | dz  dz  }|j                  d       |dz  j                  t        j                  ddddid	gd	gd
      d       t	        t        ddi      || dz  t              }|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}d}g }|j                   }	|	}|	sd}
|
}||v }|sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      dz  }|j#                  |       |	s+ddt        j                  
      iz  }|j#                  |       t        j$                  |d      i z  }t        j                  d|fd ||f      t        j                  |      |d!z  }d"d#|iz  }t        t        j                  |            d x}x}x}x}x}	}
y )$Nr   r   Tr  zconflict_v1.jsonconflict_v1rw   okr   )rr   rv   r   r   r   r  r  r    r  r  r-   r  r8   r  r   r  r   r`      충돌r  r  r  r   r   r   r   r  r  r  r  r  r  s                   r)   )test_hold_when_allowed_forbidden_conflictr'  8  s   	H	0	0BHHTH
((

+#',$<#=&>%?	
  )  	fm%<=#k1		A 88'''8'''''8'''''''1'''1'''8''''''''''',,,,,8,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8,,,8,,,,,,,,r+   c                 ,   t         t         dz  } t        t         dz  }| j                         }|j                         }t	                | j                  } |       }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      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}x}}|j                  } |       }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      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}x}}y )N.jsonz.schema.jsonr8   )zI%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.read_bytes
}()
} == %(py6)sr   before_j)rD   rE   r=   r?   u+   profile JSON mutation 발생 — §7 위반z
>assert %(py8)sr   psbefore_su-   profile schema mutation 발생 — §7 위반)r2   r%   r3   
read_bytesr5   rH   rI   rM   rN   rO   rJ   _format_assertmsgrK   rL   )	r   r+  r*  r,  rV   rR   rj   rU   r   s	            r)   )test_existing_profile_byte0_after_resolver/  T  sy   	|nE2	2B	l;	;B}}H}}HJ==U=?U?h&UUU?hUUUUUU2UUU2UUU=UUU?UUUUUUhUUUhUUUU(UUUUUUUU==W=?W?h&WWW?hWWWWWW2WWW2WWW=WWW?WWWWWWhWWWhWWWW(WWWWWWWWr+   c                 Z   t        j                  t        t         dz  j	                               } t        dt              }t        | |      }g }||k(  }|sMt        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dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      d	z  }t        j                  d
      dz   d|iz  }t        t        j                   |            d x}x}}y )Nr)  z%policy_profile_2553plus33.schema.jsonr7   r8   z9%(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
} == %(py7)sr   profilemetarD   r<   rE   r=   r`   u8   generic meta 가 기존 profile 거부 — 의미 파괴
>assert %(py9)srb   )r   loadsr2   r%   	read_textr   r4   r   rH   rI   rM   rN   rO   rJ   r.  rK   rL   )r2  r3  rR   ri   rj   rk   rl   s          r)   ,test_generic_meta_validates_existing_profiler8  ^  s    jj*~U-CCNNPQGCPZ[D $/q2q/25qqq/2qqqqqq qqq qqqqqqqqqqqqqqq$qqq$qqq/qqq2qqq7qqqqqqqqr+   c                 &   ddgdddddid} ddi}t        ||       }g }||k(  }|s
t        j                  d|fd	||f      d
t        j                         v st        j
                  t               rt        j                  t               nd
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}}ddi}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
                  |       rt        j                  |       ndt        j                  |      dz  }t        t        j                  |            d x}}ddi}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
                  |       rt        j                  |       ndt        j                  |      dz  }t        t        j                  |            d x}}y )Nobjectr   Fstringr[   )typeconst)r<  requiredadditionalProperties
propertiesr8   )z9%(py5)s
{%(py5)s = %(py0)s(%(py2)s, %(py3)s)
} == %(py8)sr   r3  )rD   rE   rF   rG   r   r   r   r   r@   rC   r   r   )	r   rH   rI   rM   rN   rO   rJ   rK   rL   )r3  rV   rW   r   ri   r   r   rX   s           r)   'test_subset_validator_catches_violationrA  d  s   E %X<=	D #&s8 T28b82b88882b888888 888 888888888T888T8882888b8888888"%s2 T22222222 222 222222222T222T2222222222"%q0 400000000 000 000000000400040000000000r+   c                 B   t               } t        j                  |       }t        | t        t
        t               | |k(  }|st        j                  d|fd| |f      dt        j                         v st        j                  |       rt        j                  |       nddt        j                         v st        j                  |      rt        j                  |      nddz  }t        j                  d      dz   d	|iz  }t        t        j                  |            d }y )
Nr-   r8   )z%(py0)s == %(py2)srP   snap)rD   rE   uB   resolve_policy 가 입력 goal_request mutate — 순수성 위반z
>assert %(py4)sr=   )r*   copydeepcopyr   r2   r3   r4   rH   rI   rM   rN   rO   rJ   r.  rK   rL   )rP   rC  rV   @py_format3rT   s        r)   *test_resolve_does_not_mutate_input_requestrG  p  s    	B==D
)-	 :[[[2[[[[[[2[[[2[[[[[[[[[[[[[[[[[[[[r+   c                 	   d} t        |       }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x} x}x}}d	} t        |       }d
}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x} x}x}}d} t        |       }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x} x}x}}d} t        |       }d }||u }|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} t        |       }d }||u }|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 )Nforbid:completion_packet_emitr   r8   )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sr   r_   ra   rb   zNO: gate_evaluater   zdeny:xr[   plain_actionr   )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} is %(py7)szforbid:)	r   rH   rI   rM   rN   rO   rJ   rK   rL   )rV   rR   ri   rj   rk   rl   s         r)   test_normalize_boundary_denyrK    s   #B_"#BC_G__CG_____CG_______"___"___#B___C___G________#6J"#67J?J7?JJJJ7?JJJJJJ"JJJ"JJJ#6JJJ7JJJ?JJJJJJJ#+3"8,33,3333,333333"333"3338333,3333333333#1:">2:d:2d::::2d::::::":::":::>:::2:::d:::::::#,5"9-55-5555-555555"555"5559555-5555555555r+   c                 b   t        dg      } d}| j                  }||v}|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dz  }t        j                  d      d	z   d
|iz  }t        t        j                  |            d x}x}}d}| j                  }||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dz  }dd
|iz  }t        t        j                  |            d x}x}}| j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }dd
|iz  }t        t        j                  |            d x}x}}d}g }| j                  }|}|sd}	|	}||v }|sddt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dz  }|j                  |       |s+ddt        j                  	      iz  }
|j                  |
       t        j                  |d      i z  }t        j                  d|fd||f      t        j                  |      |dz  }dd|iz  }t        t        j                  |            d x}x}x}x}x}}	y )NrI  r#   r   )not in)z;%(py1)s not in %(py5)s
{%(py5)s = %(py3)s.allowed_actions
}r   r   u&   boundary 우회됨 — CRITICAL 회귀z
>assert %(py7)sr`   r   r   r   r  r8   r  r  r&  r  r  r  r   r   r   r  r  r  r  )r5   r   rH   rI   rJ   rM   rN   rO   r.  rK   rL   r   r   r  r  r  )r   rQ   rW   rS   rX   rk   rV   rR   ri   r  r   r   r  r!  s                 r)   test_boundary_deny_not_bypassedrO    s"   :;<A#f1+<+<f#+<<fff#+<fff#ffffff1fff1fff+<fff>ffffffff#:q':'::#':::::#'::::#::::::q:::q:::'::::::::88'''8'''''8'''''''1'''1'''8''''''''''',,,,,8,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8,,,8,,,,,,,,r+   c                 >   t        ddg      } | j                  }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }d	d
|iz  }t        t        j                  |            d x}x}}d}| j                  }||v }|st        j                  d|fd||f      t        j                  |      dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      dz  }d	d
|iz  }t        t        j                  |            d x}x}}y )Nr   r   rM  r   r8   r  r   r  r   r`   r   r   r   r   )r5   r   rH   rI   rM   rN   rO   rJ   rK   rL   r   )r   rV   rW   rR   rX   rk   rQ   rS   s           r)   &test_boundary_tightening_no_false_holdrQ    s    :<UVWA88!z!8z!!!!8z!!!!!!1!!!1!!!8!!!z!!!!!!!#:q':'::#':::::#'::::#::::::q:::q:::'::::::::r+   c                    t               } | j                  }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}t        | j                  dd	i      \  }}d	}||u }|st        j                  d
|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }	dd|	iz  }t        t        j                  |            d x}}d}
|
|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}
}t        | j                  i       \  }}g }d}||u }|}
|r	g }||k(  }|}
|
sXt        j                  d
|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }|j                  |       |rt        j                  dfd|f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd |iz  }t        t        j                  |            d x}
x}x}x}x}}y )!Nr   r8   r  r   r  r   r`   r   Tr   )z%(py0)s is %(py3)sr   )rD   rF   ru   rG   r   r   firedrt   F)z%(py2)s is %(py5)shold2)rE   rG   z%(py7)s)z%(py9)s == %(py12)sfired2)rb   py12z%(py14)spy14r   zassert %(py17)spy17)r5   r   rH   rI   rM   rN   rO   rJ   rK   rL   r   hold_conditionsr  r  )r   rV   rW   rR   rX   rk   r   rS  rS   ry   rQ   rT  rU  @py_assert11@py_assert10@py_format13@py_format15r!  @py_format18s                      r)   *test_evaluate_hold_runtime_signal_triggersr_    s   
A88!z!8z!!!!8z!!!!!!1!!!1!!!8!!!z!!!!!!! 1 1K3FGKD%44<44444;%;%;%%!!"3"3R8ME6*E*5E>**fl****5E******5***5***E*******f******f***f*****************r+   c                 ~   t               } | j                         }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}|d	   }||v }|slt        j                  d|fd
||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}d}|d	   }||v }|slt        j                  d|fd
||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )Nr   r   r   r   rt   ru   rG   zdefinition-timer   r   r;   r>   r?   r   )
r5   r   rH   rI   rJ   rM   rN   rO   rK   rL   )	r   r   rQ   rS   ry   rX   rR   rT   rU   s	            r)   (test_decision_dict_hold_labeling_precisera    s   
A	A$)$))))$)))$))))))))))))))))3"2 33 33333 3333333 333333331a 011?11111?1111?11111111111r+   c            	     \   t               } t        | ddddddi      }t        dt        	      }t	        ||      }g }||k(  }|sMt        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dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        j                  d      dz   d|iz  }t        t        j                  |            d x}x}}t        j                  |       y )Nztask-2553+33r   2026-05-18T00:00Zz(memory/events/task-2553+33.evidence.jsonALL_PASST)task_idfinal_statusgenerated_at_utcevidence_refgate_resultz(completion_packet_2553plus33.schema.jsonr7   r8   r1  r   pktr3  r4  u-   completion packet skeleton 이 meta 미충족r5  rb   )r5   r
   r   r4   r   rH   rI   rM   rN   rO   rJ   r.  rK   rL   r   r   )r   rj  r3  rR   ri   rj   rk   rl   s           r)   .test_completion_packet_skeleton_satisfies_metark    s   
A
*	,?&C FS]^D d+brb+r1bbb+rbbbbbb bbb bbbbbbbbbbbbbbbdbbbdbbb+bbbrbbb3bbbbbbbbJJsOr+   c                 $   t               } t        | d      }t        dt              }t	        ||      }g }||k(  }|sMt        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d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      d
z  }t        j                  d      dz   d|iz  }t        t        j                  |            d x}x}}|d   }t        |      }d}||k\  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}}t        j                   |       y )Nrc  )collected_at_utczevidence_2553plus33.schema.jsonr7   r8   r1  r   evr3  r4  u$   evidence skeleton 이 meta 미충족r5  rb   fieldsr   )>=)z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} >= %(py7)slenr_   ra   )r5   r   r   r4   r   rH   rI   rM   rN   rO   rJ   r.  rK   rL   rq  r   r   )	r   rn  r3  rR   ri   rj   rk   rl   rV   s	            r)   %test_evidence_skeleton_satisfies_metarr    sr   
A	 5H	IB=*UD T*XbX*b0XXX*bXXXXXX XXX XXXXXXXXXXXXXXXTXXXTXXX*XXXbXXX2XXXXXXXX(|!3|!!!!!!!!!!!!3!!!3!!!|!!!!!!!!!!!!!JJrNr+   __main__z-q)S__doc__
__future__r   builtinsrM   _pytest.assertion.rewrite	assertionrewriterH   rD  r   syspathlibr   rd   __file__resolveparent	WORKSPACEstrpathremoveinsertanu_v3.policy_profile_enginer   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r4   r2   r3   r%   r*   r5   rY   rm   rp   rz   r~   r   r   r   r   r   r   r   r   r   r   r   r   r  r"  r'  r/  r8  rA  rG  rK  rO  rQ  r_  ra  rk  rr  __name__
SystemExitmainr1   r+   r)   <module>r     s  . #     
   N""$++2299	y>SXXHHOOC	N# 3y> "     , "
x'*;; *->> 0,77 0U
UM"34+
8 G	7@PG5"-8Xr	1	\6-;
+2 z
[V[[(D!12
33 r+   