
    4jB                       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ddlZddlZddlmZ  ee      j'                         j(                  j(                  j(                  Z ee      ej.                  vr"ej.                  j1                  d ee             d/dZ edd        edd	        ed
d        edd        edd      Z edd      Z edd        edd        edd        edd      Z edd      Zej<                  Zej>                  Zej@                  Z ejB                  Z!ejD                  Z"ejF                  Z#dZ$dZ%dZ&dZ'dZ(dZ)d Z*d!Z+d"Z,d#Z-d$Z.d0d%Z/d& Z0d' Z1 G d( d)ejd                        Z3 G d* d+ejd                        Z4 G d, d-ejd                        Z5e6d.k(  r ejn                          yy)1u~  task-2553+49 AUTHORITATIVE — callback owner/key/role runtime validation,
real-entrypoint regression (§8 reg 1~10, 21, 22, 23, 25, 26, 30).

회장 §5 중요: mock-only "그럴 것이다" 금지. 모든 케이스는 실 runtime
entrypoint (``dispatch.core`` 재노출 + ``anu_v3`` runtime guard +
narrow helper ``build_anu_owned_callback_request``) 를 **직접 호출** 한다.
    )annotationsN)Pathc                r   | t         j                  v rt         j                  |    S t        j                  j	                  | t
        |z        }g }d}||u}|}|r|j                  }d}||u}	|	}|slt        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                  |      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}	}t        j                  j#                  |      }|t         j                  | <   |j                  j%                  |       |S )zuHermetic file-path import (collision-proof vs tests/dispatch shadow);
    identical strategy to the narrow +49 suite.N)is not)z%(py2)s is not %(py5)sspec)py2py5z%(py7)spy7)z5%(py11)s
{%(py11)s = %(py9)s.loader
} is not %(py14)s)py9py11py14z%(py16)spy16r   zassert %(py19)spy19)sysmodules	importlibutilspec_from_file_location_ROOTloader
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprappend_format_boolopAssertionError_format_explanationmodule_from_specexec_module)modnamerelpathr   @py_assert1@py_assert4@py_assert3@py_assert0@py_assert10@py_assert13@py_assert12@py_format6@py_format8@py_format15@py_format17@py_format18@py_format20mods                    Q/home/jay/workspace/tests/regression/test_callback_owner_validation_2553plus49.py_loadr4      sK    #++{{7##>>11'57?KD7t74t77474 777774t77777747774777t77777774777777777777777477777777777777
..
)
)$
/CCKKKKC J    z%dispatch.executor_completion_contract(dispatch/executor_completion_contract.pyz dispatch.spec_template_validatorz#dispatch/spec_template_validator.pyzanu_v3.callback_4tuple_registry"anu_v3/callback_4tuple_registry.pyz dispatch.callback_owner_enforcerz#dispatch/callback_owner_enforcer.pyz(dispatch.normal_fallback_callback_helperz+dispatch/normal_fallback_callback_helper.pyzanu_v3.callback_owner_validator"anu_v3/callback_owner_validator.pyz%anu_v3.authoritative_verdict_selector(anu_v3/authoritative_verdict_selector.pyzanu_v3.self_collector_guardanu_v3/self_collector_guard.pyz'anu_v3.writeback_binding_conflict_guard*anu_v3/writeback_binding_conflict_guard.pyzdispatch.cron_dispatch_guardzdispatch/cron_dispatch_guard.py1e41a2324a3ccdd0fedf78d1d09509f5c119085addb0f8b7
6937032012(20456b5f83fc039f2fd6f50f4b94095c29b41bfbz%task/task-2553p1-f1-clean-replacement@774d550628410d36962c23a7663c4b6dbf72789de7c7fd940871e9ad8280e5ab@364caa11904285657abd716d78c5493b1f8b519318387d0f864fb6a136dca0b4@352ad0f570e55040e7c1e4a32cbfe0f076cbd53529b4db6222a8da1a4bee9cc5@83b3e307c8207c76a3e311c408aab4951373bd317896e51687d3007907b0c3d4u   [EXECUTOR COMPLETION CALLBACK — MANDATORY] executor 는 ANU 에 normal completion callback cron 을 반드시 발사해야 한다.c                r    t        j                  t        | z  j                               j	                         S )N)hashlibsha256r   
read_bytes	hexdigest)rels    r3   _sharK   \   s'    >>53;2245??AAr5   c                     t        j                  ddt        t              g| ddd      j                  j                         S )Ngitz-CT)capture_outputtextcheck)
subprocessrunstrr   stdoutstrip)as    r3   _gitrW   `   s:    >>	c%j%1%$d fUUWr5   c                     t        dt        t        t        ddddt        ddt        f      }|j	                  |        t        d	i |S )
Ntask-2553+49ANUNCFBDTcokacdir_cron_direct)task_idexecutor_keycollector_keycollector_owner_keycollector_rolenormal_collector_cron_idfallback_callback_cron_iddispatch_cron_idchat_idprompt_claims_anu_collector
entry_pathanu_keys )dictEXEC_KEYANU_KEYCHATupdatevalidate_callback_owner_runtime)overbases     r3   _valrt   g   sN    #!%"&$()D 	KK*2T22r5   c                  L    e 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y)OwnerValidationRegressionuB   §8 회장 verbatim regression 1~10 — real validator entrypoint.c                    t               }| j                  |j                  d       | j                  |j                         | j                  |j
                         y )NPASS)rt   assertEqualverdict
assertTrueregistration_allowedowner_is_independent_anuselfrs     r3   #test_01_executor_to_anu_normal_passz=OwnerValidationRegression.test_01_executor_to_anu_normal_pass}   sA    FF+../223r5   c                    t        t        t              }| j                  |j                  d       | j	                  |j
                         | j                  d|j                         y )Nra   rb   FAILSELF_COLLECTOR_FORBIDDEN)rt   rm   ry   rz   assertFalser|   assertInclassificationsr~   s     r3   %test_02_executor_self_key_normal_failz?OwnerValidationRegression.test_02_executor_self_key_normal_fail   sK    xXFF+//00!2C2CDr5   c                    t        t        t        dd      }| j                  |j                  d       | j	                  d|j
                         y )Nr[   zFB-self)ra   rb   rd   re   r   r   )rt   rm   ry   rz   r   r   r~   s     r3   'test_03_executor_self_key_fallback_failzAOwnerValidationRegression.test_03_executor_self_key_fallback_fail   sC    " (%)&/	
 	F+0!2C2CDr5   c                    t        t        t        d      }| j                  |j                  d       | j	                  ddht        |j                        z         y )NT)ra   rb   rh   r   CALLBACK_OWNER_MISMATCHr   )rt   rm   ry   rz   r{   setr   r~   s     r3   /test_04_prompt_says_anu_but_owner_executor_failzIOwnerValidationRegression.test_04_prompt_says_anu_but_owner_executor_fail   sS    " ((,

 	F+&(BC!##$%	
r5   c                    t        t        t        t              }| j                  |j                  d       | j	                  d|j
                         y Nr`   ra   rb   r   r   )rt   rn   ry   rz   r   r   r~   s     r3   *test_05_executor_key_eq_collector_key_failzDOwnerValidationRegression.test_05_executor_key_eq_collector_key_fail   s?      '
 	F+0!2C2CDr5   c                    t        d      }| j                  |j                  d       | j                  d|j                         y )N rc   r   CALLBACK_COLLECTOR_NOT_ANUrt   ry   rz   r   r   r~   s     r3   #test_06_collector_role_missing_failz=OwnerValidationRegression.test_06_collector_role_missing_fail   s5    #F+2A4E4EFr5   c                    t        d      }| j                  |j                  d       | j                  d|j                         y )Nexecutorr   r   r   r   r~   s     r3   #test_07_collector_role_not_anu_failz=OwnerValidationRegression.test_07_collector_role_not_anu_fail   s5    
+F+2A4E4EFr5   c                    t        d       }| j                  |j                  d       | j                  d|j                         y )N)rd   r   CALLBACK_4TUPLE_INVALIDr   r~   s     r3   'test_08_4tuple_normal_cron_missing_failzAOwnerValidationRegression.test_08_4tuple_normal_cron_missing_fail   s5    $/F+/1B1BCr5   c                    t        dd      }| j                  |j                  d       | j                  |j                         y )Nr   r   r   )rt   ry   rz   r   r|   r~   s     r3   )test_09_4tuple_collector_key_missing_failzCOwnerValidationRegression.test_09_4tuple_collector_key_missing_fail   s6    rr:F+//0r5   c                    t        d      }| j                  |j                  d       t        ddd      }| j                  |j                  d       | j                  d|j                         y )Nr   )r`   rx   zzzr   r   r   r   )r   okbads      r3   8test_10_4tuple_executor_key_missing_still_blocks_non_anuzROwnerValidationRegression.test_10_4tuple_executor_key_missing_still_blocks_non_anu   s\     r"V,%(-/f-/1D1DEr5   N)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   r   r   rk   r5   r3   rv   rv   z   s>    L4E	E

EG
G
D
1Fr5   rv   c                  .    e Zd ZdZd Zd Zd Zd Zd Zy)RealPathGuardWiringu   §8 reg 21/22/23 — real dispatch / cokacdir-direct / registration
    helper guard 가 실제로 호출되어 fail-closed 됨을 실 entrypoint 직접
    호출로 검증 (mock-only 금지).c                    t        dddd      }t        t        d|t        t        t        ddddt        dt
        f	      \  }}}| j                  |d
       | j                  |j                  d
       y )NrY   r]   r[   r\   )r_   rf   rd   re   zdispatch.core.mainrZ   T)	spec_textri   tuple_r`   ra   rb   rc   rf   rd   re   rg   rh   rj   r   )Callback4Tupleguard_dispatch_with_owner_CLAUSErm   ro   rn   ry   rz   )r   trs   owner	composites        r3   %test_21_dispatch_py_path_guard_calledz9RealPathGuardWiring.test_21_dispatch_py_path_guard_called   s|     " %)&*	
 ";+!" (  %)&*(,Z"
eY 	F+/r5   c                   t        ddt        t        t        dddddddt        f	      }| j	                  |j
                  d
       | j                  |j                         t        ddt        t        t        dddddddt        f	      }| j	                  |j
                  d       | j                  |j                         | j                  t        |j                         | j                  t        |j                         y )NnormalrY   zANU Result Collector10mr[   r]   r\   r^   )kindr_   r`   	owner_keyrg   promptatcron_idrf   rd   re   ri   rj   r   rx   ) build_anu_owned_callback_requestrm   ro   rn   ry   rz   assertIsNoneargvassertIsNotNoner   assertNotIn)r   r   goods      r3   )test_22_cokacdir_direct_path_guard_calledz=RealPathGuardWiring.test_22_cokacdir_direct_path_guard_called   s     /"!) %)&*-Z
 	f-#((#/"!) %)&*-Z
 	v.TYY'gtyy)499-r5   c                   | j                  t              5  t        dt        t        t        ddddt        ddt
        f       d d d        t        dt        t
        t
        ddddt        ddt
        f      \  }}}| j                  |       | j                  |j                  d	       | j                  |j                  d	       y # 1 sw Y   xY w)
NrY   rZ   r]   r[   r\   Tr^   )r_   r`   ra   rb   rc   rf   rd   re   rg   rh   ri   rj   rx   )	assertRaisesCallbackRegistrationBlockedguard_callback_registrationrm   ro   rn   r{   ry   rz   )r   valsgalloweds       r3   3test_23_registration_helper_guard_called_and_raiseszGRealPathGuardWiring.test_23_registration_helper_guard_called_and_raises  s     :; 	'&%&$,$!$)-*.,01!	 7"!! '  %)&*(,-Z
R 	 f-V,?	 	s   -CCc                4   dt         dt         dt         dt        dt        d}t        j                  t
        j                  d|gt        t              ddd	
      }| j                  |j                  dd|j                   d|j                  dd          y )Na  from dispatch.core import (guard_callback_registration,guard_dispatch_runtime_authoritative,select_runtime_authoritative_verdict);from anu_v3.callback_owner_validator import CallbackRegistrationBlocked;import sys;ok=False
try:
    guard_callback_registration(task_id='t',executor_key='z',collector_key='z',collector_owner_key='zr',collector_role='ANU',dispatch_cron_id='D',normal_collector_cron_id='NC',fallback_callback_cron_id='FB',chat_id='zP',prompt_claims_anu_collector=True,entry_path='cokacdir_cron_direct',anu_keys=('zM',))
except CallbackRegistrationBlocked:
    ok=True
sys.exit(0 if ok else 3)z-cTx   cwdrN   rO   timeoutr   z5real dispatch.core entrypoint did not block self key

i$)rm   ro   rn   rQ   rR   r   
executablerS   r   ry   
returncoderT   stderr)r   codeps      r3   1test_21b_dispatch_core_real_entrypoint_subprocesszERealPathGuardWiring.test_21b_dispatch_core_real_entrypoint_subprocess6  s}    , x4%:& NN^^T4(E
4dC
 	LL!Dxxj188EF+,.	
r5   c                    t        t        t        t              }| j                  |j                  d       | j	                  d|j
                         y r   )rt   DEV2_EXEC_KEYry   rz   r   r   r~   s     r3   (test_dev2_executor_self_key_also_blockedz<RealPathGuardWiring.test_dev2_executor_self_key_also_blockedW  sB     &' -

 	F+0!2C2CDr5   N)	r   r   r   r   r   r   r   r   r   rk   r5   r3   r   r      s$    ,08'.R"-H
B
Er5   r   c                  (    e Zd ZdZd Zd Zd Zd Zy)NoRegressionAndInvariantsu)   §8 reg 25/26/30 + byte-0/git invariants.c                   dD ]|  }t        j                  t        j                  dddt	        t
        |z        gt	        t
              ddd      }| j                  |j                  dd	| d
|j                  dd          ~ y )N)zJtests/regression/test_executor_completion_callback_mandatory_2553plus32.pyz<tests/regression/test_callback_4tuple_registry_2553plus44.pyz>tests/regression/test_callback_owner_enforcement_2553plus49.pyz-mpytestz-qTiX  r   r   zno-regression FAILED for r   i0)	rQ   rR   r   r   rS   r   ry   r   rT   )r   suiter   s      r3   &test_25_26_plus32_plus44_no_regressionz@NoRegressionAndInvariants.test_25_26_plus32_plus44_no_regressiong  s    
 	E xs55=7IJJt$A a+E7"QXXef5E4FG	r5   c                    dd l }|j                  d      }dD ]?  }t        |z  j                  d      }| j	                  |j                  |      d|        A y )Nr   z+gh[ps]_[A-Za-z0-9]{20,}|ghp_[A-Za-z0-9]{36})r8   r9   r:   r;   z)scripts/verify_callback_owner_contract.pyutf-8encodingztoken-like string in )recompiler   	read_textr   search)r   r   patrJ   txts        r3   "test_30_no_raw_credential_exposurez<NoRegressionAndInvariants.test_30_no_raw_credential_exposurez  s`    jjGH
 	NC 3;))7);Ccjjo1Fse/LM	Nr5   c                ~   | j                  t        dd      t               | j                  t        ddd      t               | j                  t	        d      t
               | j                  t	        d      t               | j                  t	        d      t               | j                  t	        d      t               y )Nz	rev-parseHEADz--abbrev-refr7   r6   z anu_v3/callback_event_trigger.pyz+utils/anu_delegation_completion_callback.py)	ry   rW   GIT_HEAD_PREGIT_BRANCH_PRErK   REG_SHAECC_SHACET_SHAFROZEN_ANCHOR_SHA)r   s    r3   test_git_and_byte0_invariantsz7NoRegressionAndInvariants.test_git_and_byte0_invariants  s    k62LAnf5~	
 	56	
 	;<g	
 	@A7K>?	
r5   c                    dD ]I  }t        j                  t        dz  | dz  j                  d            }| j	                  |d   d       K y )N)callback_owner_validationauthoritative_verdict_selectionself_collector_guardwriteback_binding_conflictschemasz.schema.jsonr   r   z$schemaz'http://json-schema.org/draft-07/schema#)jsonloadsr   r   ry   )r   sds      r3   test_schemas_valid_jsonz1NoRegressionAndInvariants.test_schemas_valid_json  sd    
 	VA 

"s,%77BB$ C A
 Qy\+TU	Vr5   N)r   r   r   r   r   r   r   r  rk   r5   r3   r   r   d  s    3&N
"Vr5   r   __main__)r#   rS   r$   rS   )rJ   rS   returnrS   )8r   
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   rF   importlib.utilr   r   rQ   r   unittestpathlibr   __file__resolveparentr   rS   pathinsertr4   _hlp_valmod_grd_eccr   r   r   r   rq   r   rm   r   rn   ro   r   r   r   r   r   r   r   rK   rW   rt   TestCaserv   r   r   r   mainrk   r5   r3   <module>r     s   #       
  X ''..55u:SXXHHOOAs5z"
 -02 (+- '*, (+-7:<
146 -02 #%E F /24+.0479 #>>  :: #'#H#H  %AA ")"I"I $$"
98 M
L
LF 
B B3&KF 1 1 KF\YE(++ YExAV 1 1 AVH zHMMO r5   