
    3j                        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 dZdZdZe G d	 d
             Zdd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZg dZy)u  anu_v3.writeback_binding_conflict_guard — write-back role/fallback binding
conflict 실 runtime hardening (task-2553+49 AUTHORITATIVE §5.E).

회장 §5.E verbatim: "같은 collector identity 라도 role/fallback binding/owner
key 불일치 시 silent skip 금지 -> WRITEBACK_BINDING_CONFLICT 기록 / valid
duplicate write-back 만 idempotent SKIP / self-chain write-back 은 completed
불인정."

narrow +49 ``audit_writeback_binding_conflict`` 는 role/fallback 만 비교했다.
본 guard 는 그 위에 **owner key 불일치** 와 **self-chain write-back 의
completed 불인정** 을 추가 결선해, write-back 단계가 반드시 경유하는
fail-closed 게이트로 만든다. silent idempotent skip 은 binding 이 완전 일치할
때만 허용.

reuse: role/fallback 충돌 판정은 비-frozen
``dispatch.callback_owner_enforcer.audit_writeback_binding_conflict`` 단일
진실원 호출. +44 read-only ledger 는 byte-0 유지.

Layer A / NO-CRON: 순수 감사. ZERO cron / dispatch / subprocess / cokacdir.
    )annotations)	dataclassfield)ListOptionalSequence)FAILPASSWRITEBACK_BINDING_CONFLICTWRITEBACK_IDEMPOTENT_SKIPWRITEBACK_NO_CONFLICT audit_writeback_binding_conflict
is_anu_keyz$anu_v3.writeback_binding_conflict.v1"WRITEBACK_SELF_CHAIN_NOT_COMPLETEDWRITEBACK_OWNER_KEY_CONFLICTc                      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
<    ee      Zd	ed<   edd       ZddZ	y)WritebackBindingGuardResultstrschemaverdictclassificationtask_idboolconflictcompleted_acknowledgedz	List[str]conflicting_fields)default_factoryreasonsc                (    | j                   t        k(  S )N)r   r
   selfs    >/home/jay/workspace/anu_v3/writeback_binding_conflict_guard.pyokzWritebackBindingGuardResult.ok7   s    ||t##    c           
         | j                   | j                  | j                  | j                  | j                  | j
                  t        | j                        t        | j                        dS )Nr   r   r   r   r   r   r   r   )	r   r   r   r   r   r   listr   r   r    s    r"   to_jsonz#WritebackBindingGuardResult.to_json;   sT    kk||"11||&*&A&A"&t'>'>"?DLL)	
 		
r$   N)returnr   )r)   dict)
__name__
__module____qualname____annotations__r   r'   r   propertyr#   r(    r$   r"   r   r   ,   sN    KLLN  !!t4GY4$ $

r$   r   F)"candidate_session_is_executor_selfc       
        f   t        ||	      }t        |      xr ||k(  }|
s|s|s!t        t        t        t
        |dddgdg      S t        | ||||||      }|j                  t        k(  rIt        t        t        t        |ddt        |j                        t        |j                        dgz         S |j                  t        k(  r6t        t        t        t        |ddg t        |j                        dgz         S t        t        t        t        |ddg t        |j                        d	gz         S )
uE  write-back 단계 fail-closed (§5.E).

    Order of checks (every violation RECORDED, never silent — §5.E):

      1. self-chain write-back (owner == executor key, OR owner not an ANU
         key, OR the producing session is the executor self-session) ->
         ``WRITEBACK_SELF_CHAIN_NOT_COMPLETED`` (FAIL): a self-chain
         write-back is NOT acknowledged as completed (회장 §5.E).
      2. role / fallback binding conflict over the +44 read-only ledger ->
         ``WRITEBACK_BINDING_CONFLICT`` (FAIL, conflicting_fields recorded —
         NOT a silent idempotent skip; §5.E / regression 19).
      3. identical idempotency key AND identical binding -> ``WRITEBACK_
         IDEMPOTENT_SKIP`` (PASS, valid duplicate; regression 20).
      4. no match -> ``WRITEBACK_NO_CONFLICT`` (PASS, normal new write-back).
    TFzowner_key/self_sessionu   self-chain write-back (owner key == executor key / not an independent ANU key / executor self-session) — NOT acknowledged as completed; recorded, never a silent skip (회장 §5.E).r&   )r   dispatch_idchat_idnormal_collector_cron_idcandidate_rolecandidate_fallback_cron_idu{   binding conflict is RECORDED as WRITEBACK_BINDING_CONFLICT — silent idempotent skip is FORBIDDEN (§5.E / regression 19).u   valid duplicate write-back (identical idempotency key AND identical role/fallback binding, owner=independent ANU) — idempotent SKIP only (§5.E / regression 20).z;normal new write-back, owner=independent ANU (no conflict).)r   r   r   GUARD_SCHEMAr	   r   r   r   r   r'   r   r   r   r
   r   )historyr   r3   r4   r5   r6   r7   candidate_owner_keyexecutor_keyanu_keysr1   owner_is_anuowner_is_executorbases                 r"   guard_writeback_bindingr@   H   sj   : 18<L !I&9\&I  	+*=#( 89"
 	
  ,!9%#=D 88*5#(#D$;$;<&S
 	
 77*4#'!&@
 	
 ',#T\\"H
IJ
 
r$   )
r8   r
   r	   r   r   r   r   r   r   r@   N)r9   zSequence[object]r   r   r3   r   r4   r   r5   Optional[str]r6   r   r7   rA   r:   r   r;   r   r<   zSequence[str]r1   r   r)   r   )__doc__
__future__r   dataclassesr   r   typingr   r   r    dispatch.callback_owner_enforcerr	   r
   r   r   r   r   r   r8   r   r   r   r@   __all__r0   r$   r"   <module>rH      s   ( # ( + +   6 &J "=  
 
 
N 05hh h 	h
 h ,h h !.h h h h )-h !hVr$   