
    j                    $   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mZ  ee      j                         j                   d   Z eedz        Zej(                  D  cg c]
  } | ek7  s	|  c} ej(                  dd  ee      ej(                  vr"ej(                  j+                  d ee              eej.                        D cg c]  }|dk(  s|j1                  d      s| c}D ]B  Zej.                  j5                  e      Z eed	d
      xs d
Zdev sed
k(  s6ej.                  e= D ddZ edd        edd        edd        edd        edd        edd       d dZd dZ d dZ!d dZ"d dZ#d dZ$d dZ%yc c} w c c}w )!u  tests.regression.test_dispatch_entrypoint_wiring — task-2640 Track A.

회장 verbatim unfork #1/#2/#3 결선 단언:
  - dispatch/__init__.py 가 enforcer/helper/validator 를 import 했는가 (결선만)
  - dispatch/core.py 가 dispatch_to_bot_with_contract 를 노출하는가
  - dispatch/prompt.py 가 build_prompt_with_contract guard 를 노출하는가
  - 봇 spawn 직전 validator 호출 결과가 fail-closed 인가

Layer A / NO-CRON: subprocess / cokacdir / merge / cron 호출 0.
    )annotationsN)Path   testsdispatchz	dispatch.__file__ z/tests/dispatchc                   t         j                  j                  |       }|3t        |dd      r&t	        |j
                        j                  |      r|S t        j                  j                  | t        |z        }g }d }||u}|}|r|j                  }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  }|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  }t        j(                  d|       dz   d|iz  }t+        t        j,                  |            d x}x}x}x}x}x}
}	t        j                  j/                  |      }|t         j                  | <   |j                  j1                  |       |S )Nr   r	   )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spec not found: z
>assert %(py19)spy19)sysmodulesgetgetattrstrr   endswith	importlibutilspec_from_file_location_ROOTloader
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprappend_format_boolop_format_assertmsgAssertionError_format_explanationmodule_from_specexec_module)modnamerelpathexistingr   @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                     G/home/jay/workspace/tests/regression/test_dispatch_entrypoint_wiring.py
_load_realr?       s   {{w'H*b Ac(J[J[F\FeFefmFn>>11'57?KDUtU4tUU4U4 7UUUU4tUUUUUU4UUU4UUUtUUUUUUU4UUUUUUUUUUUUUUU4UUUUUUUUUU;KG99UUUUUUUUU
..
)
)$
/CCKKKKC J    zdispatch/__init__.pyz dispatch.callback_owner_enforcerz#dispatch/callback_owner_enforcer.pyz(dispatch.normal_fallback_callback_helperz+dispatch/normal_fallback_callback_helper.pyz*dispatch.spawn_callback_contract_validatorz-dispatch/spawn_callback_contract_validator.pyzdispatch.corezdispatch/core.pyzdispatch.promptzdispatch/prompt.pyc                    ddl } d}t        | |      }|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                  |      dz  }t        t	        j                  |            dx}}d}t        | |      }|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                  |      dz  }t        t	        j                  |            dx}}d	}t        | |      }|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                  |      dz  }t        t	        j                  |            dx}}d
}t        | |      }|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                  |      dz  }t        t	        j                  |            dx}}d}t        | |      }|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                  |      dz  }t        t	        j                  |            dx}}d}t        | |      }|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                  |      dz  }t        t	        j                  |            dx}}d}t        | |      }|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                  |      dz  }t        t	        j                  |            dx}}d}t        | |      }|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                  |      dz  }t        t	        j                  |            dx}}d}t        | |      }|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                  |      dz  }t        t	        j                  |            dx}}y)uX   dispatch/__init__.py public surface 결선 — import 가 결성에 노출되어야 함.r   Nenforce_callback_ownerz5assert %(py5)s
{%(py5)s = %(py0)s(%(py1)s, %(py3)s)
}hasattr_dispatch_pkgpy0py1py3r   SELF_COLLECTOR_FORBIDDENCOLLECTOR_ROLE_ANUDEFAULT_ANU_KEYSANU_KEY_2553 build_anu_owned_callback_request validate_spawn_callback_contractContractValidationResultNO_OP_SPAWN_CONTRACT_FAILED)	r   rC   r"   r#   r    r$   r%   r)   r*   )rD   @py_assert2r1   r7   s       r>   4test_dispatch_init_imports_enforcer_helper_validatorrR   7   sX   $ #;;7=":;;;;;;;;7;;;7;;;;;;=;;;=;;;":;;;;;;;;;;"<=7="<========7===7=============="<=========="677="67777777777777777777=777=777"67777777777"457="45555555575557555555=555=555"45555555555"017=.1111111171117111111=111=111.1111111111"DE7="DEEEEEEEE7EEE7EEEEEE=EEE=EEE"DEEEEEEEEEE"DE7="DEEEEEEEE7EEE7EEEEEE=EEE=EEE"DEEEEEEEEEE"<=7="<========7===7=============="<=========="?@7="?@@@@@@@@7@@@7@@@@@@=@@@=@@@"?@@@@@@@@@@r@   c                    ddl m}  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                  }t        |      }|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
                  |      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}}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
)uS   dispatch/core.py 가 dispatch_to_bot_with_contract 를 노출 — 회장 unfork #2.r   coredispatch_to_bot_with_contractinz/%(py1)s in %(py5)s
{%(py5)s = %(py3)s.__all__
}dcrG   rH   r   assert %(py7)sr   Nz_assert %(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.dispatch_to_bot_with_contract
})
}callablerE   rN   rP   )r   rU   __all__r    r!   r%   r"   r#   r$   r)   r*   rV   r]   )rZ   r3   r1   rQ   r7   r8   s         r>   .test_dispatch_core_exposes_spawn_contract_gater_   I   s   #*8bjj8*j8888*j888*888888b888b888j8888888445845555555585558555555B555B55545555555555-;;-;;;;-;;;-;;;;;;;;;;;;;;;;;;;(6BJJ6(J6666(J666(666666B666B666J6666666r@   c                    ddl m}  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                  }t        |      }|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
                  |      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
)uX   dispatch/prompt.py 가 build_prompt_with_contract guard 를 노출 — 회장 unfork #3.r   promptbuild_prompt_with_contractrW   rY   dpr[   r\   r   Nz\assert %(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.build_prompt_with_contract
})
}r]   rE   build_prompt)r   rb   r^   r    r!   r%   r"   r#   r$   r)   r*   rc   r]   )rd   r3   r1   rQ   r7   r8   s         r>   6test_dispatch_prompt_exposes_build_with_contract_guardrf   S   sa   %'52::5':5555':555'55555525552555:5555555112812222222282228222222B222B22212222222222'RZZ'>Z''''>Z'''>''''''R'''R'''Z'''''''r@   c                 ~   ddl m} m}  |dddd      }|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   }|| 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   }d}||k(  }|slt        j                  d	|fd
||f      t        j
                  |      t        j
                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)uJ   spawn 직전 validator 가 executor self-key 를 fail-closed 차단한다.r   )rP   rV   ztask-2640-wiring-self-keyc119085addb0f8b7k   ANU_KEY: c119085addb0f8b7
collector_role=ANU
## SELF_COLLECTOR / SENDFILE_ONLY / NOT_REGISTERED 차단
bodytask_idexecutor_keyrb   anu_keystatusblocked==z%(py1)s == %(py4)srG   py4assert %(py6)spy6Nno_op_reason)z%(py1)s == %(py3)srP   )rG   rH   zassert %(py5)sr   primary_classificationrI   )dispatch.corerP   rV   r    r!   r%   r)   r*   r"   r#   r$   )
rP   rV   outr3   r2   rQ   @py_format5@py_format7@py_format4r7   s
             r>   8test_dispatch_to_bot_with_contract_blocks_self_collectorr~   ]   s0   
 (+'N #C x=%I%=I%%%%=I%%%=%%%I%%%%%%%~="====="=========="===="========'(F,FF(,FFFFF(,FFFF(FFF,FFFFFFFFr@   c                 (   ddl m}   | dddd      }|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}}y)u8   정상 ANU key + doctrine 정합 prompt 는 PASS 통과.r   )rV   ztask-2640-wiring-pass1e41a2324a3ccdd0ri   rh   rj   rn   okrp   rr   rs   ru   rv   NverdictPASS)ry   rV   r    r!   r%   r)   r*   )rV   rz   r3   r2   rQ   r{   r|   s          r>   3test_dispatch_to_bot_with_contract_pass_normal_pathr   r   s    ;
'''N #C x= D =D    =D   =   D       y>#V#>V####>V###>###V#######r@   c            	        ddl m}   | ddddddd	      }|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}}|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 |j                  dg       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)uG   prompt 빌드 전 enforce guard 가 executor self-key 를 차단한다.r   )rc   z	dev6-teamz?dummy task desc for wiring test (executor == anu key forbidden)ztask-2640-wiring-prompt-blocknormalcodingrh   )team_id	task_descrk   level	task_typerl   rm   rn   ro   rp   rr   rs   ru   rv   Nrb   )is)z%(py1)s is %(py4)senforce_verdictFAILcontract_verdictc              3  $   K   | ]  }d |v  
 yw)rI   N ).0cs     r>   	<genexpr>zQtest_build_prompt_with_contract_blocks_self_collector_self_key.<locals>.<genexpr>   s       	#a's   classificationsz,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}any)rF   r   rt   )dispatch.promptrc   r    r!   r%   r)   r*   r   r   r"   r#   r$   )rc   rz   r3   r2   rQ   r{   r|   r0   s           r>   >test_build_prompt_with_contract_blocks_self_collector_self_keyr      s   :
$S/'"C x=%I%=I%%%%=I%%%=%%%I%%%%%%%x= D =D    =D   =   D        !+V+!V++++!V+++!+++V+++++++!"*d*"d****"d***"***d********B/ 3                        r@   c                    ddl m}  ddl m} | j                  j                  j
                  }|j                  j                  j
                  }|j                  }d} ||      }|sd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	} ||      }|sd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}}ddlm} d}	t#        |      }|	|v}
|
st        j$                  d|
fd|	|f      t        j                  |	      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                  |      dz  }dd|iz  }t        t        j                  |            dx}	x}
}y)uh   본 wiring 검증에서 dispatch 모듈 subprocess 호출은 발생하지 않는다 (Layer A / NO-CRON).r   rT   ra   zcore.pyzJassert %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.endswith
}(%(py4)s)
}src_core)rF   r   rt   rv   Nz	prompt.py
src_prompt
subprocess)not in)z4%(py1)s not in %(py6)s
{%(py6)s = %(py3)s(%(py4)s)
}dirscv)rG   rH   rt   rv   zassert %(py8)spy8)r   rU   rb   rV   __code__co_filenamerc   r   r"   r#   r    r$   r%   r)   r*   *dispatch.spawn_callback_contract_validator!spawn_callback_contract_validatorr   r!   )rZ   rd   r   r   r0   r2   @py_assert5r|   r   r3   rQ   @py_format9s               r>   +test_dispatch_module_subprocess_not_invokedr      s   
 $%//88DDH..77CCJ'Y'Y''''''''8'''8''''''Y''''''''''+{+{++++++++:+++:++++++{++++++++++<'s3x'<x''''<x'''<''''''s'''s''''''3'''3'''x'''''''r@   )r-   r   r.   r   )returnNone)&__doc__
__future__r   builtinsr"   _pytest.assertion.rewrite	assertionrewriter    importlib.utilr   r   pathlibr   r   resolveparentsr   r   
_TESTS_DIRpathinsertlistr   
startswith_mr   _cachedr   _fr?   rR   r_   rf   r~   r   r   r   )pks   00r>   <module>r      s  	 #     
  	X ((+!
((6Qa:oq6u:SXXHHOOAs5z"3;;'
X1
?all;>W1
X Bkkoob!G	*b	)	/RBB"(KKO		 :- . 
-/T U 
57d e 
03 ?. / 
2 3A$7(G*$"0(K 7 Ys    
F+F	F%F