
    j22                        d Z ddlmZ ddlmZmZ ddl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ZdZdZdZdZdZ ed       G d d             Ze G d d             Zdd	 	 	 	 	 	 	 	 	 ddZg dZy)u<  anu_v3.authoritative_verdict_selector — self-chain verdict 영구 비권위 +
independent ANU verdict 만 authoritative 선택 (task-2553+49 AUTHORITATIVE §5.D).

회장 §2.5/§2.6/§5.D verbatim:

  * self-chain verdict 는 authoritative verdict 가 될 수 없다.
  * independent ANU verification verdict 가 있으면 그것이 authoritative verdict.
  * executor self-session 산출 collector-result / Codex audit / adjudication 은
    authoritative 로 선택 불가 -> ``SELF_CHAIN_QUARANTINED``.
  * dead-man ``DUPLICATE_CALLBACK_IGNORED`` 판정은 *self-chain collector 정당성*
    근거가 아니라 *authoritative verdict 존재 여부* 근거로만 유효.
  * self-chain verdict 만 존재 -> ``AUTHORITATIVE_VERDICT_PENDING`` (HOLD 후보).
  * independent ANU verdict 없이 self-chain 만으로 PASS 확정 -> FAIL
    (``AUTHORITATIVE_PASS`` 절대 부여 금지).

이 모듈은 **runtime 결선** 대상이다. dispatch/cron_dispatch_guard 의
``select_runtime_authoritative_verdict`` 결선부 및 collector 회수단계에서
실제 verdict 선택 시 호출된다 — narrow +49 enforcer 가 빠뜨린 §5.D 권위
선택 경로를 코드로 강제.

Layer A / NO-CRON: 순수 분류·선택. ZERO cron / dispatch / subprocess /
cokacdir. verdict 레코드를 *선택* 만 한다 (회수·발사·등록 0).
    )annotations)	dataclassfield)ListOptionalSequencez)anu_v3.authoritative_verdict_selection.v1SELF_CHAIN_QUARANTINEDAUTHORITATIVE_VERDICT_PENDINGAUTHORITATIVE_PASS$EXECUTOR_SELF_ADJUDICATION_FORBIDDENPASSFAILHOLD_FOR_CHAIRANUindependent_anu
self_chaincollector_resultcodex_auditadjudicationdeadman_duplicate_callbackT)frozenc                      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	Zd
ed<   dZded<   dZded<   ddZy)VerdictRecordun  A single verdict candidate presented to the authoritative selector.

    ``origin`` is *derived* — never trusted from a free-text claim. The
    selector recomputes it from owner identity (executor_key vs collector_key,
    collector_role, anu_keys) so a self-session that *claims* independence is
    still quarantined (회장 §5.D / prompt-text 무권위).
    strkindverdicttask_idexecutor_keycollector_keycollector_roleFboolsession_is_executor_self claimed_origindetailc                
   t        d |D              }t        | j                        xrM | j                  |v xr= | j                  | j                  k7  xr" | j                  t
        k(  xr | j                   }|rt        S t        S )a!  Recompute origin from owner identity (claim is ignored).

        Independent-ANU iff: collector_key is a configured ANU key AND
        collector_key != executor_key AND collector_role == 'ANU' AND the
        session is NOT the executor self-session. Anything else = self_chain.
        c              3  &   K   | ]	  }|s|  y wN ).0ks     </home/jay/workspace/anu_v3/authoritative_verdict_selector.py	<genexpr>z/VerdictRecord.derived_origin.<locals>.<genexpr>R   s     .1AQ.s   )	setr!   r   r   r    COLLECTOR_ROLE_ANUr"   ORIGIN_INDEPENDENT_ANUORIGIN_SELF_CHAIN)selfanu_keyskeysetindependents       r,   derived_originzVerdictRecord.derived_originK   s     ...##$ 2""f,2""d&7&772 ##'992 111 	 *5%K:KK    N)r3   Sequence[str]returnr   )	__name__
__module____qualname____doc____annotations__r"   r$   r%   r6   r)   r7   r,   r   r   7   sO     ILL%*d*NCFCLr7   r   c                      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<   ded<    ee      Zded<   edd       ZddZ	y)AuthoritativeSelectionResultr   schemar   classificationr   zOptional[str]authoritative_verdictauthoritative_source_kindintquarantined_countindependent_anu_countr!   deadman_duplicate_seendeadman_valid)default_factoryz	List[str]reasonsc                (    | j                   t        k(  S r(   )r   r   r2   s    r,   okzAuthoritativeSelectionResult.okk   s    ||t##r7   c                   | j                   | j                  | j                  | j                  | j                  | j
                  | j                  | j                  | j                  | j                  t        | j                        dS )NrA   r   rB   r   rC   rD   rF   rG   rH   rI   rK   )rA   r   rB   r   rC   rD   rF   rG   rH   rI   listrK   rM   s    r,   to_jsonz$AuthoritativeSelectionResult.to_jsono   sl    kk||"11||%)%?%?)-)G)G!%!7!7%)%?%?&*&A&A!//DLL)
 	
r7   N)r9   r!   )r9   dict)
r:   r;   r<   r>   r   rQ   rK   propertyrN   rR   r)   r7   r,   r@   r@   ]   sa    KLL((,,  t4GY4$ $
r7   r@   )anu_keys_resolvablec                  |rt        |      s#t        t        t        t        |dddddddg      S g }g }g }d}| D ]  }|j
                  t        k(  s|j                  dk(  rd}|j                  |      }	|	t        k(  r%|j
                  t        k7  r|j                  |       f|j                  |       |j                  r8|j
                  t        t        fv r |j                  d|j
                   d	       |j                  |j
                   d
|j                  d        t        |      }
t        |      }|
dk(  rHd}|r|j                  d       |j                  d       t        t        t        t        |dd|d|||      S ddt!        |fd      }|}|r|j                  d       |j                  d|j
                  d|j                  d|j"                  d       |j                  t$        k(  rt&        }t$        }n,|j                  t        k(  rt        }t        }nt        }t        }t        t        ||||j                  |j
                  ||
|||      S )u  회장 §5.D 권위 verdict 선택 — fail-closed.

    Verdict logic:

      * ANU key set unresolvable                 -> HOLD_FOR_CHAIR (§11; the
                                                    only conditional escalation)
      * every record is self-chain               -> SELF_CHAIN_QUARANTINED,
                                                    classification PENDING,
                                                    verdict FAIL (independent
                                                    ANU verdict 없이 self-chain
                                                    만으로 PASS 확정 금지 — §5.D
                                                    / regression 13)
      * >=1 independent-ANU verdict present       -> that verdict is
                                                    AUTHORITATIVE (regression
                                                    14/17). Its PASS yields
                                                    AUTHORITATIVE_PASS; its
                                                    FAIL/HOLD propagates.
      * dead-man DUPLICATE_CALLBACK_IGNORED       -> only counts as a valid
                                                    disposition when an
                                                    authoritative (independent
                                                    -ANU) verdict also exists
                                                    (regression 15); never on
                                                    its own legitimises a
                                                    self-chain collector.

    self-session collector-result / Codex audit / adjudication are ALL
    quarantined regardless of producer kind (회장 §5.D — executor self-session
    산출은 무권위).
    Nr   Fu   ANU key set unresolvable — independent-ANU origin cannot be code-derived; authoritative selection cannot be automated (§11 HOLD_FOR_CHAIR; the only conditional escalation).rP   DUPLICATE_CALLBACK_IGNOREDTzexecutor self-session ut    quarantined — self-adjudication/self-Codex is never authoritative (§5.D / EXECUTOR_SELF_ADJUDICATION_FORBIDDEN).z
 (verdict=uM   ) is self-chain origin -> QUARANTINED, permanently non-authoritative (§5.D).u   dead-man DUPLICATE_CALLBACK_IGNORED present but NO independent-ANU authoritative verdict exists — the dead-man disposition is judged on authoritative-verdict existence, NOT on self-chain collector legitimacy; it is NOT valid here (§5.D / regression 15).u   only self-chain verdict(s) exist — authoritative verdict is PENDING; confirming PASS from a self-chain verdict alone is FORBIDDEN (회장 §5.D / regression 13). AUTHORITATIVE_PASS NOT granted.c                J    t         dt        dt        dij                  | d      S )N         r   )r   HOLDr   get)vs    r,   _rankz+select_authoritative_verdict.<locals>._rank   s"    aq$*..q!44r7   c                (     | j                         S r(   )r   )rr_   s    r,   <lambda>z.select_authoritative_verdict.<locals>.<lambda>   s    E!)),< r7   )keyu   dead-man DUPLICATE_CALLBACK_IGNORED is valid here ONLY because an independent-ANU authoritative verdict also exists (§5.D / regression 15).z8independent-ANU verdict selected as authoritative: kind=z	 verdict=z (collector_key=u>   , role=ANU, != executor) (회장 §2.6/§5.D / regression 14).)r^   r   r9   rE   )rQ   r@   SELECTOR_SCHEMAr\   r
   r   KIND_DEADMANr   r6   r0   appendr"   KIND_CODEX_AUDITKIND_ADJUDICATIONlenr   maxr   r   r   )recordsr   r3   rU   rK   r5   quarantineddeadman_seenrecoriginrG   rF   rI   chosenrB   r   r_   s                   @r,   select_authoritative_verdictrq      s   H d8n+"8"&&*"##(J
 	
$ G')K')KL 88|#KK77L##H-++L0Hs#s#++ != 1 ,SXXJ 7F F xxj
3;;/ : )4  ,K(! NN0 		
 ,"8"&&*/"##/'
 	
"5 "<=F M	

 NNi'9 : ..1 20	0 ~~+	4	66'%$nn"(+++3+# r7   )rd   r	   r
   r   r   r   r   r\   r/   r0   r1   KIND_COLLECTOR_RESULTrg   rh   re   r   r@   rq   N)
rk   zSequence[VerdictRecord]r   r   r3   r8   rU   r!   r9   r@   )r=   
__future__r   dataclassesr   r   typingr   r   r   rd   r	   r
   r   r   r   r   r\   r/   r0   r1   rr   rg   rh   re   r   r@   rq   __all__r)   r7   r,   <module>rw      s   . # ( + += 2  ? ) 'M $  +    +   " + $"L "L "LJ 
 
 
L !%e$e e 	e
 e "ePr7   