
    wj                        U d Z ddlmZ ddlmZmZ dZded<   dZded<   d	Z	ded
<   dZ
ded<   eeeeeeeeeeedZded<    G d de      ZddZddZddddZy)uo  anu_v2.owner_trigger_decision — OWNER_TRIGGER_ONLY_CAPABILITY decision JSON schema validator (task-2554).

회장 §명시 14장 §5 1:1 박제 (2026-05-11 KST):
  schema 이름: ``anu_v2.owner_trigger_decision.v1``
  8 실행 조건 모두 PASS 필수, fail-closed. JSON Schema ``additionalProperties: false`` 강제.

본 모듈 한정 책임:
  - decision JSON v1 schema 정적 검증 (key 집합 / 타입 / 8 PASS 조건)
  - 외부 입력으로 schema 우회 불가
  - 본 모듈은 GitHub API 호출 0, token 접근 0, 파일 쓰기 0 — 순수 검증 함수만.

one-way isolation: anu_v2/ 외부 import 금지.
    )annotations)FinalMappingz anu_v2.owner_trigger_decision.v1z
Final[str]SCHEMA_NAME"POST_GEMINI_REVIEW_TRIGGER_COMMENTALLOWED_ACTIONz/gemini reviewALLOWED_COMMENT_BODY)schematask_idprcurrent_head
queue_headcurrent_head_confirmedgemini_evidence_freshnudge_count_for_pr_headallowed_actioncomment_bodyallowedzFinal[tuple[str, ...]]REQUIRED_KEYSz,Final[Mapping[str, type | tuple[type, ...]]]
_KEY_TYPESc                  $     e Zd ZdZd fdZ xZS )DecisionInvalidErroru   Raised when an owner_trigger_decision JSON fails validation.

    fail-closed: 호출자는 본 예외를 catch 후 절대 trigger를 실행해서는 안 된다.
    실패 사유 코드는 ``self.code`` 에 noted.
    c                L    t         |   d| d|        || _        || _        y )N[z] )super__init__codemessage)selfr   r   	__class__s      4/home/jay/workspace/anu_v2/owner_trigger_decision.pyr   zDecisionInvalidError.__init__=   s+    1TF"WI./	    )r   strr   r#   returnNone)__name__
__module____qualname____doc__r   __classcell__)r    s   @r!   r   r   6   s     r"   r   c                "    t        | t              S N)
isinstanceboolvalues    r!   _is_boolr1   C   s     eT""r"   c                H    t        | t              xr t        | t               S r,   )r-   intr.   r/   s    r!   _is_strict_intr4   I   s    eS!A*UD*A&AAr"   N)current_head_actualc          	        t        | t              st        dd      | j                  d      }|t        k7  rt        ddt        d|      t        | j                               t        t              z
  }|rt        ddt        |             t        t              t        | j                               z
  }|rt        d	d
t        |             t        j                         D ]  \  }}| |   }|t        u r0t        |      rt        d| dt        |      j                         |t        u r0t!        |      rWt        d| dt        |      j                         |t"        u st        |t"              rt        d| dt        |      j                          | d   }t%        |      dk7  s t'        d |j)                         D              rt        dd      | d   durt        dd      | d   t*        k7  rt        ddt*              | d   t,        k7  rt        ddt,              | d   durt        dd       | d!   durt        d"d#      | d$   d%urt        d&d'      | d(   d)k7  rt        d*d+      |Zt        |t"              rt%        |      dk7  rt        d,d-      | d   j)                         |j)                         k7  rt        d.d/      | S )0u
  Validate decision dict against owner_trigger_decision.v1 schema.

    Args:
      decision: parsed JSON dict.
      current_head_actual: optional 실제 PR current head SHA. 제공되면
        ``decision['current_head']`` 와 1:1 일치 검사 (회장 §5 실행조건).

    Returns:
      검증 통과된 decision dict (원본 동일).

    Raises:
      DecisionInvalidError: 8 조건 중 하나라도 실패.

    fail-closed: 어떤 분기에서도 ``allowed=True`` 를 무시하고 통과시키지 않는다.
    
E_NOT_DICTzdecision must be a JSON objectr
   E_SCHEMAzschema must be z, got E_ADDITIONAL_PROPERTIESz2additionalProperties: false violated, extra keys: E_MISSING_KEYSzmissing keys: E_TYPEz must be bool, got z must be int, got z must be str, got r   (   c              3  $   K   | ]  }|d v 
 yw)0123456789abcdefN ).0cs     r!   	<genexpr>z$validate_decision.<locals>.<genexpr>   s     Paa'99Ps   E_HEAD_FORMATz$current_head must be 40-char hex SHAr   TE_NOT_ALLOWEDzallowed must be truer   E_ACTIONzallowed_action must be r   E_COMMENT_BODYzcomment_body must be r   E_QUEUE_HEADzqueue_head must be truer   E_HEAD_NOT_CONFIRMEDz#current_head_confirmed must be truer   FE_GEMINI_FRESHz=gemini_evidence_fresh must be false (trigger only when stale)r   r   E_NUDGE_COUNTu;   nudge_count_for_pr_head must be 0 (PR/head당 1회 trigger)E_ACTUAL_HEAD_FORMATz+current_head_actual must be 40-char hex SHAE_HEAD_MISMATCHz3decision.current_head != actual PR current head SHA)r-   dictr   getr   setkeysr   sortedr   itemsr.   r1   typer&   r3   r4   r#   lenanylowerr   r	   )	decisionr5   
schema_valextramissingkeyexpectedr0   heads	            r!   validate_decisionr^   M   s-     h%"<1QRR h'J[ ":vV`Uc/dee  3}#55E"%@P
 	
 - 3x}}#77G"#3~fWoEV5WXX $))+ 
gXtE?*8u<OPTUZP[PdPdOe5fgg_!%(*8u<NtTY{OcOcNd5eff_eS)*8u<NtTY{OcOcNd5eff
g N#D
4yB#P4::<PP"?4Z[[ 	$&"?4JKK !^3"1.1CD
 	
 #77" 56J5MN
 	
 T)">3LMM()5""$I
 	
 '(5"]
 	
 )*a/"I
 	
 &-s3s;N7OSU7U&&(U  N#))+/B/H/H/JJ&!E 
 Or"   )r0   objectr$   r.   )rW   r_   r5   z
str | Noner$   rM   )r)   
__future__r   typingr   r   r   __annotations__r   r	   r   r#   r3   r.   r   
ValueErrorr   r1   r4   r^   r?   r"   r!   <module>rd      s    # ! =Z <A
 A#3 j 3)%  
"!"<
8 
: 
#B NR \r"   