
    4jG(                    b   d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
Z
ddlZddlZej                  j                  ej                  j                  ej                  j!                  e      dd            Zej                  j                  edd      Zej                  j                  edd      Zej                  j                  edd      Zej                  j                  ed	d
      ZdZdZdZg dZdddddZd Zd Zd(dZ G d dej>                        Z  G d dej>                        Z! G d dej>                        Z" G d dej>                        Z# G d d ej>                        Z$ G d! d"ej>                        Z% G d# d$ej>                        Z&e'd%k(  r ejP                  d&'       yy))u  Regression — task-2553+36 TRACK C PHASE-B RECONCILIATION.

C1 settled engine (task-2553+33 ACCEPT) 을 정본으로, C1↔C2↔C3 interface
contract 를 코드로 정합화한다. 회장 verbatim §6 regression 1~10 을 그대로
이행한다. C1 core(anu_v3/policy_profile_engine.py) 무접촉 — byte-0 (§6.8).

정본 API (변경 불가):
    parse_goal_request(obj, *, schema_dir) ->
    resolve_policy(goal_request, *, profile_json_dir, ...) -> PolicyResolution
금지 API: resolve_policy(goal_type=..., boundary=...)  (§6.2 FAIL)

이 파일은 expected_files allowlist (tests/regression/test_*_2553plus36*.py)
이며 git-untracked batch-internal — tracked HEAD(20456b5f) 무변.
    )annotationsNz..memoryeventsfixturespolicy_profilesanu_v3zpolicy_profile_engine.pyzanu_v3.policy_profile_engine@2363e291a0a43884892f5e554f115481a077322bd5caa3000fb75bf5b72bc6beim  )z"task-2553+34.profile-mismatch.jsonz!task-2553+34.missing-profile.jsonztask-2553+34.stale-profile.jsonz$task-2553+34.forbidden-boundary.jsonz*task-2553+34.allow-vs-forbid-conflict.json)merge_clean_replacement_prclean_replacement_pr_merge_v1F)merge_test_only_hardening_prtest_only_hardening_pr_merge_v1T) gemini_thread_resolution_limitedgemini_thread_resolve_v1F)"post_merge_smoke_artifact_closeoutpost_merge_artifact_closeout_v1F)PR#128 clean replacement merge PR#129 test-only hardening mergeGemini thread resolve*post-merge smoke harness artifact closeoutc                t    t        | dd      5 }t        j                  |      cd d d        S # 1 sw Y   y xY w)Nrutf-8encoding)openjsonload)pathfhs     J/home/jay/workspace/tests/regression/test_interface_contract_2553plus36.py_loadr!   D   s0    	dC'	* byy}  s   .7c                 4    t        j                  t              S N)	importlibimport_moduleENGINE_MODULE     r    _enginer)   I   s    ""=11r(   c                     | |d|i|xs g ddS )Nname)dry_runno_real_mergeno_github_write)goal_idgoal_statementpolicy_profileboundaryr'   )r+   	statementprofile_namer2   s       r    _goal_requestr5   M   s#    #!<0O O	 r(   c                      e Zd ZdZd Zy)R1_CanonicalHappyPathuD   §6.1 — parse_goal_request -> resolve_policy(goal_request) 정상.c                P   t               }t        ddd      }|j                  |      }| j                  |d   |d          |j	                  |t
              }| j                  |j                  d       | j                  t        |d             | j                  t        |d             | j                  |j                  t               | j                  |j                  t               |j	                  |t
              }| j                  |j                  |j                         y )	Nr1zcanonical pathr   r2   profile_json_dirRESOLVEDHOLD_FOR_CHAIRgatehold_conditions)r)   r5   parse_goal_requestassertEqualresolve_policyPROFILE_DIRassertInstatus
assertTruehasattrassertIsInstancecompletion_packet_schemadictevidence_schema)selfenggrparsedresres2s         r    !test_canonical_parse_then_resolvez7R1_CanonicalHappyPath.test_canonical_parse_then_resolveY   s    i"$E
 ''+
+R
^<  + Fcjj"@AV,-%678c::DAc1148!!"{!Ccjj1r(   N)__name__
__module____qualname____doc__rS   r'   r(   r    r7   r7   V   s
    N2r(   r7   c                      e Zd ZdZd Zd Zy)R2_ForbiddenApiFailsuF   §6.2 — resolve_policy(goal_type=..., boundary=...) 사용 시 FAIL.c                    t               }| j                  t              5  |j                  dddi       d d d        y # 1 sw Y   y xY w)Nmerger,   T)	goal_typer2   )r)   assertRaises	TypeErrorrC   rM   rN   s     r    test_forbidden_kwargs_raisez0R2_ForbiddenApiFails.test_forbidden_kwargs_raisen   sH    iy) 	NIt;LM	N 	N 	Ns	   ?Ac                    t               }| j                  |j                        5  |j                  d       d d d        y # 1 sw Y   y xY w)Nr   )r)   r]   PolicyEngineErrorrC   r_   s     r    ,test_forbidden_positional_misuse_fail_closedzAR2_ForbiddenApiFails.test_forbidden_positional_misuse_fail_closeds   sA    is445 	?=>	? 	? 	?s   AA
N)rT   rU   rV   rW   r`   rc   r'   r(   r    rY   rY   k   s    PN
?r(   rY   c                      e Zd ZdZd Zy)$R3_C2AdversarialReRunVsSettledEngineu   §6.3 — C2 adversarial fixtures 가 C1 settled engine 기준으로 재실행.

    Reconciled C1-canonical invariant: 모든 adversarial 입력에 대해 권한확대
    0 — hard fail-closed(PolicyEngineError) 또는 allowed∩forbidden=∅.
    c                   t               }i }t        D ]  }t        t        j                  j                  t        |            }|d   d   }	 |j                  |t              }t        t        |j                        t        |j                        z        }| j                  |g | d       |j                   d||<    | j                  t%        |      t%        t                     | j!                  t'        d |j)                         D              |       y # |j                  $ r<}| j!                  |j"                  | d       d|j"                   ||<   Y d }~Md }~ww xY w)	Ninputgoal_requestr:   u$   : 권한 누수 (fail-closed 위반)z/leak=[]u   : error code 부재zFAIL-CLOSED:c              3  >   K   | ]  }|j                  d         yw)zFAIL-CLOSEDN)
startswith).0vs     r    	<genexpr>zcR3_C2AdversarialReRunVsSettledEngine.test_all_c2_fixtures_no_privilege_expansion.<locals>.<genexpr>   s     F]+Fs   )r)   C2_FIXTURESr!   osr   joinFIXTURESrC   rD   sortedsetallowed_actionsforbidden_actionsrB   rF   rb   rG   codelenanyvalues)	rM   rN   resultsfnamedatarO   rQ   leakexcs	            r    +test_all_c2_fixtures_no_privilege_expansionzPR3_C2AdversarialReRunVsSettledEngine.test_all_c2_fixtures_no_privilege_expansion   s@   i  	;Eh67Dg~.B;((k(J++,s33H3H/II   "'KL %(JJ<x!8	;  	Ws;'78FW^^5EFF	
 (( ;UG3F*GH#/z!:;s   A3DE%)1E  E%N)rT   rU   rV   rW   r   r'   r(   r    re   re   z   s    
r(   re   c                  4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	R4to7_DryRunApplicationReRunu0  §6.4~6.7 — 4 dry-run application targets 재실행 (실 side-effect 0).

    settled engine = contract deriver: profile instance 有 -> 결정론적
    RESOLVED/HOLD_FOR_CHAIR, profile instance 無 -> 결정론적 fail-closed.
    어떤 경우에도 실 merge / GitHub write / thread resolve 0.
    c                   t               }t        |   d   t        |   d   }}t        d|d d  ||      }|r|j                  |t              }| j                  |j                  d|       | j                  t        t        |j                        t        |j                        z        g |       d|j                  fS | j                  |j                        5 }|j                  |t               d d d        | j                  j                  j                   |       d|j                  j                   fS # 1 sw Y   GxY w)	N      zdry-   r:   r<   RESOLVED_CONTRACTFAIL_CLOSED)r)   TARGETSr5   rC   rD   rE   rF   rB   rr   rs   rt   ru   r]   rb   rG   	exceptionrv   )rM   targetrN   r4   presentrO   rQ   ctxs           r    _dry_runz%R4to7_DryRunApplicationReRun._dry_run   s#   i ' 2GFOA4FgT&"+/F$$R+$FCMM#**&DfMs3../#c6K6K2LLM
 (44s445 	ArK@	A**F3s}}1122	A 	As   D88Ec                P    | j                  d      \  }}| j                  |d       y )Nr   r   r   rB   rM   kind_s      r    test_r4_pr128_clean_replacementz<R4to7_DryRunApplicationReRun.test_r4_pr128_clean_replacement   s%    -- @Aa}-r(   c                t    | j                  d      \  }}| j                  |d       | j                  |d       y )Nr   r   r<   )r   rB   rE   )rM   r   rF   s      r    !test_r5_pr129_test_only_hardeningz>R4to7_DryRunApplicationReRun.test_r5_pr129_test_only_hardening   s5    }}%GHf23f<=r(   c                P    | j                  d      \  }}| j                  |d       y )Nr   r   r   r   s      r    test_r6_gemini_thread_resolvez:R4to7_DryRunApplicationReRun.test_r6_gemini_thread_resolve   s%    -- 78a}-r(   c                P    | j                  d      \  }}| j                  |d       y )Nr   r   r   r   s      r    !test_r7_post_merge_smoke_closeoutz>R4to7_DryRunApplicationReRun.test_r7_post_merge_smoke_closeout   s)    --8
a 	}-r(   c                    t        t        dd      5 }|j                         }ddd       dD ]  }| j                  |d|         y# 1 sw Y   'xY w)uP   엔진 모듈 소스에 GitHub/merge/network/file-write 부작용 토큰 부재.r   r   r   N)zrequests.postzsubprocess.zgh pr mergezopen(zurllib.requestu    엔진 부작용 토큰 발견: )r   ENGINE_PATHreadassertNotIn)rM   r   srcbads       r    'test_no_real_side_effect_engine_is_purezDR4to7_DryRunApplicationReRun.test_no_real_side_effect_engine_is_pure   s_    +sW5 	'')C	
 	QC S#)I#'OP	Q	 	s   A

AN)
rT   rU   rV   rW   r   r   r   r   r   r   r'   r(   r    r   r      s&    3$.>
..Qr(   r   c                      e Zd ZdZd Zy)R8_C1CoreByte0u0   §6.8 — C1 core byte-0 (전후 sha256 동일).c                   t        t        d      5 }|j                         }d d d        dd l}| j	                  t              t               | j	                  |j                  |      j                         t               y # 1 sw Y   `xY w)Nrbr   )
r   r   r   hashlibrB   rw   C1_BASELINE_BYTESsha256	hexdigestC1_BASELINE_SHA256)rM   r   blobr   s       r    %test_engine_sha256_and_size_unchangedz4R8_C1CoreByte0.test_engine_sha256_and_size_unchanged   sl    +t$ 	779D	T$56NN4 **,.@	
	 	s   BB
N)rT   rU   rV   rW   r   r'   r(   r    r   r      s
    :
r(   r   c                      e Zd ZdZd Zd Zy)R9_CrossTrackContaminationZerouF   §6.9 — C2/C3 cross-track contamination 0 (namespace 단독 소유).c                   t        t        j                  j                  t        d            }| j                  |d   d       t        t        j                  j                  t        d            }| j                  |d   d       t        t        j                  j                  t        d            }| j                  |d   d       y )Nz$task-2553+35.dry-run-comparison.jsontaskztask-2553+35ztask-2553+34.result.jsonrF   DEFERRED_PENDING_C1ztask-2553+35.result.json)r!   ro   r   rp   EVENTSrB   )rM   c35r34r35s       r    -test_c2_c3_originals_unmodified_additive_onlyzLR9_CrossTrackContaminationZero.test_c2_c3_originals_unmodified_additive_only   s     GGLL!GH
 	Vn5BGGLL)CDEX(=>BGGLL)CDEX(=>r(   c                    t        t        j                  j                  t        d            }| j                  |d   d   d       | j                  |d   d          | j                  |d   d       y )Nz$task-2553+36.interface-contract.json	ownershipc2_c3_crosswriter   contaminationr   task-2553+36)r!   ro   r   rp   rq   rB   assertFalse)rM   ics     r    "test_plus36_namespace_single_ownerzAR9_CrossTrackContaminationZero.test_plus36_namespace_single_owner   sf    GGLL#IJ
 	K);<a@K9:F^4r(   N)rT   rU   rV   rW   r   r   r'   r(   r    r   r      s    P
?5r(   r   c                      e Zd ZdZd Zy)R10_TrackCConsolidatedPassHoldu1   §6.10 — Track C consolidated PASS/HOLD 산출.c                \   t         j                  j                  t        d      }| j	                  t         j                  j                  |      d       t        |      }| j                  |d   d       | j                  |d   d       | j                  d|       | j                  d|       y )	Nztask-2553+36.result.jsonu   consolidated result 부재r   r   track_c_consolidated)PASSHOLDhold_for_chair
regression)	ro   r   rp   r   rG   isfiler!   rB   rE   )rM   r   rQ   s      r    .test_consolidated_result_present_and_decidablezMR10_TrackCConsolidatedPassHold.test_consolidated_result_present_and_decidable   s    ww||F$>?t,.JKDkVn5c013CD&,lC(r(   N)rT   rU   rV   rW   r   r'   r(   r    r   r      s
    ;)r(   r   __main__r   )	verbosityr#   ))rW   
__future__r   builtins@py_builtins_pytest.assertion.rewrite	assertionrewrite
@pytest_arr$   r   ro   unittestr   abspathrp   dirname__file__	REPO_ROOTr   rq   rD   r   r&   r   r   rn   r   r!   r)   r5   TestCaser7   rY   re   r   r   r   r   rT   mainr'   r(   r    <module>r      s   #      	 GGOOBGGLL)BD$OP		i8	477<<	8Z8ggll9h0ABggll9h0JK. G   '
)

3!0
22H-- 2*?8,, ?
8+<+< 
D8Q8#4#4 8Qv
X&& 
5X%6%6 50
)X%6%6 
) zHMMA r(   