
    #"j#                        U d Z ddlmZ ddlmZmZ ddlmZmZm	Z	 ddl
mZmZmZmZmZmZmZmZ dZdZdZd	Zd
ZdZdZdZdZded<   e G d d             ZddZe ee      dd	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ g dZ!y)u3  dispatch.spawn_callback_contract_validator — pre-spawn contract validator.

task-2640 Track A 신규 helper (회장 verbatim unfork #1/#2).

봇 spawn 직전 호출되어 callback contract 가 ANU-owned 정합 상태인지 fail-closed
검증한다. SELF_COLLECTOR / SENDFILE_ONLY / NOT_REGISTERED 변종을 dispatch 진입
시점에 차단하여 prompt 텍스트만으로 callback 정책 전달되는 구조적 결함을 봉쇄.

검증 5축 (task md ANCHOR-3 verbatim):
  1. executor_key 비공란 + ≠ anu_key (self-key 차단)
  2. anu_key 가 DEFAULT_ANU_KEYS 에 포함 (independent ANU 정합)
  3. prompt_text 에 anu_key 텍스트 포함 (코드 contract 와 prompt 일치)
  4. prompt_text 에 collector_role=ANU doctrine 포함
  5. prompt_text 에 SELF_COLLECTOR / SENDFILE_ONLY / NOT_REGISTERED 차단
     verbatim block 포함

이 모듈은 Layer A / NO-CRON: subprocess / cokacdir / merge / cron register 0.
순수 데이터 검증만 수행하고 verdict 를 반환한다. 실패 시 호출자가 spawn 진입
자체를 차단해야 한다 (fail-closed).
    )annotations)	dataclassfield)ListOptionalSequence)ANU_KEY_2553COLLECTOR_ROLE_ANUDEFAULT_ANU_KEYSFAILHOLDPASSSELF_COLLECTOR_FORBIDDEN
is_anu_keyz-dispatch.spawn_callback_contract_validator.v1NO_OP_SPAWN_CONTRACT_FAILEDPROMPT_DOCTRINE_MISSINGPROMPT_ANU_KEY_MISSINGPROMPT_COLLECTOR_ROLE_MISSINGEXECUTOR_KEY_MISSINGANU_KEY_NOT_INDEPENDENTTASK_ID_MISSING)SELF_COLLECTORSENDFILE_ONLYNOT_REGISTEREDtupleREQUIRED_DOCTRINE_TOKENSc                      e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   d	ed
<   d	ed<   d	ed<    ee      Zded<   edd       Zedd       Z	ddZ
y)ContractValidationResultstrschemaverdictz	List[str]classificationstask_idexecutor_keyanu_keyboolprompt_has_anu_keyprompt_has_collector_roleprompt_has_required_doctrine)default_factoryreasonsc                (    | j                   t        k(  S N)r!   r   selfs    ]/home/jay/workspace/.worktrees/task-2729+4-dev4/dispatch/spawn_callback_contract_validator.pyokzContractValidationResult.okD   s    ||t##    c                <    | j                   r| j                   d   S d S )Nr   )r"   r.   s    r0   primary_classificationz/ContractValidationResult.primary_classificationH   s     *.*>*>t##A&HDHr2   c                   | j                   | j                  t        | j                        | j                  | j
                  | j                  | j                  | j                  | j                  | j                  t        | j                        dS )N)r    r!   r"   r4   r#   r$   r%   r'   r(   r)   r+   )r    r!   listr"   r4   r#   r$   r%   r'   r(   r)   r+   r.   s    r0   to_jsonz ContractValidationResult.to_jsonL   so    kk||#D$8$89&*&A&A|| --||"&"9"9)-)G)G11DLL)
 	
r2   N)returnr&   )r8   zOptional[str])r8   dict)__name__
__module____qualname____annotations__r   r6   r+   propertyr1   r4   r7    r2   r0   r   r   7   sp    KLLL##"&&t4GY4$ $ I I
r2   r   c                :      syt         fdt        D              S )NFc              3  &   K   | ]  }|v  
 y wr-   r?   ).0tprompt_texts     r0   	<genexpr>z2_prompt_has_all_doctrine_tokens.<locals>.<genexpr>a   s     BAqKBs   )allr   )rD   s   `r0   _prompt_has_all_doctrine_tokensrG   ^   s    B)ABBBr2   T)r%   anu_keysanu_keys_resolvablec                   g }g }|r||s*t        t        t        g | xs d|xs d|xs dddddg
      S | s&|j                  t               |j                  d       |s&|j                  t
               |j                  d       |r1|r/||k(  r*|j                  t               |j                  d|d       t        ||      s*|j                  t               |j                  d	|d
       t        |      xr t        |      xr ||v }|s&|j                  t               |j                  d       t        |      xr t        |v xs d|v }	|	s&|j                  t               |j                  d       t        |      }
|
s.|j                  t               |j                  dt        d       t!               }g }|D ])  }||vs|j#                  |       |j                  |       + |st$        nt&        }|t$        k(  r|j                  d       n?t        |v r7|d   t        k7  r+|j)                  t               |j+                  dt               t        t        ||| xs d|xs d|xs d||	|
|
      S )u  봇 spawn 직전 호출되는 fail-closed contract validator.

    검증 실패 시 verdict=FAIL · 호출자(dispatch.core.dispatch_to_bot)는
    subprocess(cokacdir --cron) 발사를 차단해야 함.

    Args:
        task_id: spawn 대상 task id (non-empty 필수)
        executor_key: spawn 대상 봇의 self key (ANU key 와 달라야 함)
        anu_key: independent ANU collector key (DEFAULT_ANU_KEYS 포함 필수)
        prompt_text: build_prompt 산출 prompt 본문
        anu_keys: 허용 ANU key 집합 (override 가능)
        anu_keys_resolvable: ANU key 집합 resolution 가능 여부 (HOLD 경로)

    Returns:
        ContractValidationResult — verdict 와 classification list, reasons.
     Fu   ANU key set unresolvable — spawn contract validation cannot fail-closed enforce owner pin in this environment (HOLD_FOR_CHAIR). NO silent pass.)
r    r!   r"   r#   r$   r%   r'   r(   r)   r+   u7   task_id empty — spawn contract requires non-empty id.u>   executor_key empty — spawn contract cannot verify owner pin.zexecutor_key == anu_key (ul   ) — SELF_COLLECTOR_FORBIDDEN; the executor bot must NEVER be its own callback collector (회장 §2/§10).zanu_key ug    not in configured DEFAULT_ANU_KEYS — the collector key must be an independent ANU key (회장 §10).u   prompt body does NOT contain the ANU key text — code contract (spawn validator) and prompt text are out-of-sync; SELF_COLLECTOR 변종 재발 차단을 위해 텍스트+코드 이중 단언 필요.zcollector_role=ANUum   prompt body does NOT mention collector_role=ANU — collector role doctrine must be explicit at prompt-level.z9prompt body missing one or more required doctrine tokens uE    — verbatim doctrine block 자동 주입 누락 (task md ANCHOR-4).u   spawn callback contract PASS — executor_key != anu_key, anu_key is an independent ANU key, prompt contains anu_key + collector_role=ANU + SELF_COLLECTOR/SENDFILE_ONLY/NOT_REGISTERED doctrine tokens. dispatch subprocess gated through.r   )r   VALIDATOR_SCHEMAr   appendr   r   r   r   r   r&   r   r
   r   rG   r   r   setaddr   r   removeinsert)r#   r$   r%   rD   rH   rI   clsr+   r'   r(   r)   seenorderedcr!   s                  r0    validate_spawn_callback_contractrV   d   s   2 CG("2('#Mr%+Mr$&+).4
 	
" 

?#PQ

'(L	
 LG$;

+,''7 8+ +	
 gx(

*+wk "N N	

 k*WtG}WKAW

)*T	
 !%[ 1 !k)P-A[-P  %

01>	

 $C;#O '

*+G'* +00	
 DG D=HHQKNN1
 "dtG$B	
 $w.71:AY3YNN34NN167#2!'R2-";%A r2   )rL   r   r   r   r   r   r   r   r   r   rV   N)rD   r   r8   r&   )r#   r   r$   r   r%   r   rD   r   rH   zSequence[str]rI   r&   r8   r   )"__doc__
__future__r   dataclassesr   r   typingr   r   r    dispatch.callback_owner_enforcerr	   r
   r   r   r   r   r   r   rL   r   r   r   r   r   r   r   r   r=   r   rG   r   rV   __all__r?   r2   r0   <module>r]      s   ( # ( + +	 	 	 C ; 3 1  ? - 3 ## %  #
 #
 #
LC  #$45 $DD D 	D
 D D D DNr2   