
    |.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	m
Z
 dZ eeh      Zded<   ddZd	Zd
ZdZdZdZdZdZdZe G d d             Z ee      d	 	 	 	 	 	 	 	 	 ddZg dZy)uE  utils.callback_authority_validator — envelope vs actual owner authority gate.

task-2646 CALLBACK_REGISTRATION_AUTHORITY_GATE.

Validates whether the actual schedule owner key matches the envelope
collector_key and is an independent ANU key.

Layer A / NO-CRON / NO-WRITE / NO-SUBPROCESS: pure function, zero side-effects.
    )annotations)	dataclassfield)ListOptionalSequenceTuplec119085addb0f8b7	frozensetDEFAULT_ANU_KEYSc                6    t        |       xr | t        |      v S )z;True iff key is a non-empty configured independent ANU key.)boolset)keyanu_keyss     S/home/jay/workspace/.worktrees/task-2646-dev3/utils/callback_authority_validator.py
is_anu_keyr      s    9-H--    z%utils.callback_authority_validator.v1PASSFAIL*AUTHORITATIVE_CALLBACK_COLLECTOR_PROCESSED NON_AUTHORITATIVE_SELF_COLLECTOROWNER_KEY_MISMATCHOWNER_KEY_VERIFIEDc                      e Zd ZU dZ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	ddZ
y)AuthorityVerdictz(Result of an authority validation check.strschemaverdictstateenvelope_collector_keyactual_owner_keyexecutor_keyzOptional[str]authority_marker)default_factoryz	List[str]reasonsc                (    | j                   t        k(  S )N)r   r   selfs    r   okzAuthorityVerdict.ok8   s    ||t##r   c           
         | j                   | j                  | j                  | j                  | j                  | j
                  | j                  t        | j                        dS )Nr   r   r    r!   r"   r#   r$   r&   )	r   r   r    r!   r"   r#   r$   listr&   r(   s    r   to_jsonzAuthorityVerdict.to_json<   sQ    kk||ZZ&*&A&A $ 5 5 -- $ 5 5DLL)	
 		
r   Nreturnr   )r0   dict)__name__
__module____qualname____doc____annotations__r   r-   r&   propertyr*   r.    r   r   r   r   +   sR    2KLJ##t4GY4$ $

r   r   )r   c           
     R   g }t        | |      }t        ||      }||k(  rS|r|j                  d| d|d       n|j                  d|d       t        t        t        t
        | ||t        |      S |r=|s;|j                  d| d|d       t        t        t        t        | ||t        |      S |s@|j                  d|d	t        |       d
       t        t        t        t        | ||d|      S |r@| |k(  r;|j                  d|d| d       t        t        t        t        | ||t        |      S |r9|s7|j                  d|d| d       t        t        t        t        | ||d|      S |j                  d|d       t        t        t        t        | ||t        |      S )u  Gate: validate callback registration authority.

    Decision logic (in priority order):

    1. actual == executor_key
       → state=NON_AUTHORITATIVE_SELF_COLLECTOR, verdict=FAIL,
         marker=NON_AUTHORITATIVE_SELF_COLLECTOR
         (self-key callback is always forbidden, regardless of envelope)
         If envelope=ANU, reason includes "ENVELOPE_ACTUAL_MISMATCH" (ANCHOR-1)

    2. envelope_collector_key ∈ anu_keys BUT actual_owner_key ∉ anu_keys
       (actual != executor — handled above)
       → state=OWNER_KEY_MISMATCH, verdict=FAIL,
         marker=NON_AUTHORITATIVE_SELF_COLLECTOR
         reason includes "ENVELOPE_ACTUAL_MISMATCH" (ANCHOR-1)

    3. envelope_collector_key ∉ anu_keys AND actual_owner_key ∉ anu_keys
       → state=OWNER_KEY_MISMATCH, verdict=FAIL

    4. actual_owner_key ∈ anu_keys AND envelope_collector_key == actual_owner_key
       → state=OWNER_KEY_VERIFIED, verdict=PASS,
         marker=AUTHORITATIVE_CALLBACK_COLLECTOR_PROCESSED
    z=ENVELOPE_ACTUAL_MISMATCH: envelope.collector_key is ANU key (z) but actual_owner_key uz    == executor_key → NON_AUTHORITATIVE_SELF_COLLECTOR (self-key + ANU envelope mismatch; ANCHOR-1 + ANCHOR-5 fail-closed).zactual_owner_key ua    == executor_key → NON_AUTHORITATIVE_SELF_COLLECTOR (self-key callback forbidden, fail-closed).r,   z) but actual schedule owner z* is not an ANU key (ANCHOR-1 fail-closed).z is not an ANU key (anu_keys=u   ) → OWNER_KEY_MISMATCH.Nu)    ∈ anu_keys AND envelope_collector_key uO    == actual → OWNER_KEY_VERIFIED / AUTHORITATIVE_CALLBACK_COLLECTOR_PROCESSED.u)    ∈ anu_keys but envelope_collector_key u@    is not ANU → OWNER_KEY_MISMATCH (envelope not authoritative).uY    ∈ anu_keys (PASS — envelope/actual key difference within ANU key set is acceptable).)r   appendr   SCHEMAr   &STATE_NON_AUTHORITATIVE_SELF_COLLECTORMARKER_NON_AUTHORITATIVESTATE_OWNER_KEY_MISMATCHr-   r   STATE_OWNER_KEY_VERIFIEDMARKER_AUTHORITATIVE)r!   r"   r#   r   r&   envelope_is_anuactual_is_anus          r   validate_authorityrC   I   sW   < G !7BO/:M
 <'NN*--D#& '>> NN#$4#7 8+ +
  8#9-%5	
 		
 }&))E""LN	

  *#9-%5	
 		
  03 4h((AC	
  *#9-%!	
 		
 /3CC 03 4&&<%? @OO	

  *#9-%1	
 		
 _ 03 4&&<%? @??	

  *#9-%!	
 		
 NN
,/ 0L 	L &5)!-	 	r   )r;   r   r   r@   r=   r   rC   Nr/   )
r!   r   r"   r   r#   r   r   zSequence[str]r0   r   )r5   
__future__r   dataclassesr   r   typingr   r   r   r	   _ANU_KEY_2553r   r   r6   r   r;   r   r   r@   r=   r<   r>   r?   r   tuplerC   __all__r8   r   r   <module>rJ      s    # ( 2 2
 #'8 ) 8. 
1 D =  *L &/ /  
 
 
D $$45UU U 	U
 U Upr   