
    3j[j                       d Z ddlmZ ddlmZmZ ddlmZmZ ddlm	Z	 ddl
mZmZmZmZ ddlmZ ddlmZmZmZmZ dd	lmZ dd
lmZmZmZ ddlmZmZ ddl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#dZ-e G d d             Z.e G d d             Z/eedd	 	 	 	 	 	 	 	 	 d$dZ0	 	 	 	 	 	 d%dZ1ddddddddddeee#ddddd 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d&d!Z2g d"Z3y)'u  anu_v3.cancel_on_success_live_adoption_2604 — CANCEL_ON_SUCCESS LIVE ADOPTION.

task-2604 Track A (회장 5-track 배치, 독립 task — task-2553 +N 아님).
Strict-additive 신규 orchestration. 기존 frozen 모듈 **read-only consume**
(byte-0 무수정). 신규 cron/cancel 로직 0 — +45/+9a/+23 권위 그대로 경유.

목표 (회장 verbatim §1):
  normal callback durable-success 이후 bound fallback 을 live verifier
  5조건으로 안전 확인하고, 실제 cancel/remove 또는 명시적 NON_BLOCKING /
  CANCEL_FAILED_CLASSIFIED 로 처리한다.

필수 (회장 verbatim §2):
  bound fallback 식별 · live verifier 5조건 · unrelated cron 제거 방지 ·
  cancel-audit JSON · normal success decouple · remove 실패 안전 분류.

구현 방향 (회장 §3 — read-only consume):
  본 orchestration 은 기존 frozen 모듈을 **read-only import 만** 하여 결선:

    * utils/completion_callback_fallback_cancel.py   (+9a cancel·분류)
    * utils/live_cron_state_verifier.py              (+23 5조건 AND)
    * utils/completion_callback_operational_cancel_seam.py (+23 seam)
    * anu_v3/cancel_on_success_live_wiring.py        (+45 durable lookup)
    * anu_v3/cancel_on_success_live_e2e.py           (+48 — 미사용 import 0)
    * anu_v3/callback_4tuple_registry.py             (+44)
    * memory/events/callback_4tuple_index.jsonl      (durable·track 미소유)

  절차:
    1. durable 4-tuple registry(+44) 에서 normal-callback durable-success
       **1건 식별** (classify == NORMAL_CALLBACK_COMPLETED · 최신 record
       status==COMPLETED).
    2. bound fallback_callback_cron_id **안전 lookup** — +45
       ``lookup_fallback_from_durable_registry`` (LOOKUP_VERIFIED 만 진행).
    3. **unrelated cron 제거 방지** — task_id + cron_id 4-tuple ownership
       일치 교차검증(durable record task_id/chat_id/role/fallback_cron_id
       == 처리 대상). 불일치 → NON_BLOCKING (실 remove 0).
    4. +45 ``run_cancel_on_success_live_wiring`` **경유** (PRIMARY) →
       +37→+25→+23 seam(operational) → live verifier 5조건 AND →
       +9a remover 1건.
    5. 결과를 task-2604 채택 분류로 사상:
       ① 5조건 통과 + 실제 cancel/remove(또는 idempotent already-gone/
          fired) → ``CANCEL_ADOPTED``.
       ② remove 실패(+9a REMOVE_FAILED_WARNING) → ``CANCEL_FAILED_
          CLASSIFIED`` (안전 분류 — normal success 무효화 0).
       ③ verifier 미충족 / durable-success 미식별 / lookup 불가 /
          ownership mismatch → registry ``NON_BLOCKING`` 명시 마크
          (fallback 은 안전망·진행 트리거 아님 — 보존이 비차단).
    6. normal success 판정은 cancel 결과와 **decouple** —
       ``normal_success_unchanged`` 절대불변 True. 채택 분류·remove
       실패·skip·예외 무엇이든 durable_success 무변.
    7. 전 결과 ``memory/events/task-2604.cancel-adoption-audit.json``
       (다중 후보 보장 기록 — +45 ``guaranteed_write_audit`` 재사용).

금지 (회장 §5 / HOLD §6):
  기존 task-2553 산출물·+9a/+23/+25/+44~+55·frozen anchor byte-0 ·
  callback_4tuple_index.jsonl track 직접 write 0(read-only consume·
  +53/+54 소관 공유 durable 인프라) · unrelated cron 제거 0 · PR/branch/
  main write 0 · self-callback/self-collector/self-adjudication/self-
  dispatch 0 · ANU authoritative 약화 0 · fallback/dead-man/fixed-time
  진행트리거 0 · 문서-only 0(실 entrypoint+regression·mock-only FAIL).
    )annotations)	dataclassfield)datetimetimezone)Path)CallableListOptionalUnion)canonical_root)NO_LEDGER_RECORDNORMAL_CALLBACK_COMPLETEDCallback4TupleRegistrydefault_ledger_path)guaranteed_write_audit)LOOKUP_VERIFIEDCancelOnSuccessLiveResult!run_cancel_on_success_live_wiring)ANU_CHAT_IDFALLBACK_ROLE)CallbackInputClassificationPostResultReview no_real_codex_post_result_reviewz	task-2604z2task-2604.cancel-on-success-live-adoption-audit_v1CANCEL_ADOPTEDCANCEL_FAILED_CLASSIFIEDNON_BLOCKINGNORMAL_CALLBACK_DURABLE_SUCCESSr   NOT_COMPLETED_PENDINGTRACK_MISMATCHc                 f    t        j                  t        j                        j	                  d      S )Nz%Y-%m-%dT%H:%M:%SZ)r   nowr   utcstrftime     B/home/jay/workspace/anu_v3/cancel_on_success_live_adoption_2604.py_now_utcr)   ~   s!    <<%../CDDr'   c                      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Zded<   dZ	ded<   dZ
ded<   dZded<   dZded<   dZded<   dZded<   ddZy)DurableSuccessIdentificationu  durable 4-tuple registry 에서 normal-callback durable-success 1건 식별
    + unrelated cron 제거 방지용 4-tuple ownership 교차검증.

    ``identified=True`` AND ``ownership_all_satisfied=True`` 일 때만 실제
    cancel 진행. 그 외 모든 경로 → cron-remove 0, fallback 보존(NON_
    BLOCKING). durable record 의 task_id / chat_id / role / fallback_cron_id
    가 처리 대상과 정확히 일치해야 한다(타 task cron 미인용 — 회장 §2).
    bool
identifiedstrident_statusledger_classificationOptional[str]record_statustask_idbound_fallback_cron_idFown_task_id_matchown_chat_id_ownedown_role_fallbackown_cron_id_boundownership_all_satisfiedNchat_idroleledger_pathr    reasonc                n   d| j                   | j                  | j                  | j                  | j                  | j
                  | j                  | j                  | j                  | j                  | j                  d| j                  | j                  | j                  | j                  | j                  dS )Nz+task-2604.durable_success_identification_v1)r5   r6   r7   r8   r9   )schemar-   r/   r0   r2   r3   r4   ownership_crosscheckr:   r;   r<   r   r>   )r-   r/   r0   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r   r>   )selfs    r(   to_dictz$DurableSuccessIdentification.to_dict   s    C// --%)%?%?!//||&*&A&A%)%;%;%)%;%;%)%;%;%)%;%;+/+G+G% ||II++"11kk'
 	
r'   )returndict)__name__
__module____qualname____doc____annotations__r5   r6   r7   r8   r9   r:   r;   r<   r   r>   rC   r&   r'   r(   r+   r+      s       L))#t##t##t##t#$)T)!G]!D-!%K%$(NM(FC
r'   r+   c                  F   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<   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<   ded<   ded<   ded<   ded<    ee      Zded<   dZd ed!<   d"Z	ded#<    ee
      Zd$ed%<   d"Zded&<   y)'CancelOnSuccessAdoptionResultu  task-2604 cancel-on-success live adoption 1회 실행 결과.

    ``normal_success_unchanged`` 는 디커플 절대불변 True — 채택 분류·
    cancel 실패·skip·예외 무엇이 와도 normal collector durable-success 를
    뒤집지 않는다(회장 §3 decouple).
    r.   adoption_classificationr+   identificationr,   durable_successnormal_success_unchangeddecouple_invariant_heldcancel_adoptedcancel_failed_classifiednon_blocking_markedlookup_statusseam_invokedr1   seam_classificationcron_remove_invokedfallback_cancelledremove_attemptedremove_resultfallback_preservedOptional[dict]five_condition_resultstarget_cron_idevent_idrE   adoption_auditadoption_audit_path)default_factoryunderlying_cancel_auditNz#Optional[CancelOnSuccessLiveResult]live_resultr=   skip_reasonz	List[str]notests_utc)rF   rG   rH   rI   rJ   r   rE   rd   re   rf   listrg   rh   r&   r'   r(   rL   rL      s     ! 00""!!""&&**M&&$)$$?T?7;K4;KT2E92FCr'   rL   N)expected_chat_idexpected_roler<   c                   t               }|t        |      n
t        |      }	 t        |      }|j	                  | |       }|j                  |       }|	|t        k(  r*t        dt        |d| dt        |      t        |      d	      S |t        k7  s|j                  dk7  rt        d|t        fvr|j                  | k7  rt        nt        ||j                  | |j                   |j"                  |j$                  t        |      t        |      d	| d
|j                  d      S |j                  | k(  }
t        |j"                        t        |      k(  }|j$                  xs d|k(  }t'        |j                         }|
xr
 |xr |xr |}t        d$i d|d|rt(        nt        d|d|j                  d| d|j                   d|
d|d|d|d|d|j"                  d|j$                  dt        |      dt        |      d|rdS d|
 d | d!| d"| d#	S # t        $ r7}	t        dt        dd| dt        |      t        |      d|	 	      cY d}	~	S d}	~	ww xY w)%u4  durable 4-tuple registry(+44) 에서 normal-callback durable-success
    1건 식별 + unrelated cron 제거 방지 4-tuple ownership 교차검증.

    callback_4tuple_index.jsonl 은 track 미소유 공유 durable 인프라 —
    본 함수는 **read-only query 만** 수행한다(append/rewrite 0).
    N)r3   expected_task_idFLEDGER_READ_ERRORuj   durable registry read 예외 → durable-success 미식별, cron-remove 0, fallback 보존(NON_BLOCKING): )	r-   r/   r0   r2   r3   r4   r<   r   r>   u{   durable 4-tuple ledger 에 record 부재 → normal-callback durable-success 미식별, cron-remove 0, 보존(NON_BLOCKING)	COMPLETEDuO   durable record 가 normal-callback durable-success(COMPLETED) 아님 (classify=z	, status=u)   ) → cron-remove 0, 보존(NON_BLOCKING))r-   r/   r0   r2   r3   r4   r:   r;   r<   r   r>   r=   r-   r/   r0   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r   r>   u   normal-callback durable-success 1건 식별 + 4-tuple ownership 일치(task_id/chat_id/role/fallback_cron_id) — bound fallback 안전 cancel 진행 가능u@   durable-success 는 있으나 4-tuple ownership 불일치 (task=z,chat=z,role=z,cron=uG   ) → unrelated cron 제거 방지, cron-remove 0, 보존(NON_BLOCKING)r&   )r   r   r   r   classify
latest_for	Exceptionr+   IDENT_NO_LEDGER_RECORDr.   r   r   statusr3   IDENT_TRACK_MISMATCHIDENT_NOT_COMPLETEDfallback_callback_cron_idr:   r;   r,   IDENT_DURABLE_SUCCESS)r3   rj   rk   r<   crootlpregistryverdictrecexcown_taskown_chatown_roleown_cronall_oks                  r(   (identify_normal_callback_durable_successr      s    E " 	[ ' 

)"-##$ $ 
 !!'*" {g!11+/")#'Bu:Q
 	
 ++szz[/H+ #<">>KK7* % )")**#&#@#@KKBu:%%,IYszzn E66#
 	
0 {{g%H3;;3'7#88HB=0HC112H<(<x<HF'  &,!1E
 & jj   #<< # # # # !'  XX  G!" 5z#, *' 0!
&
&
 C z "**1 }  
+/"5#'Bu:AADG
 	

s   /H 	I$,IIIc                Z   | j                   st        | j                  dfS |j                  j                  t
        k7  r7t        d|j                  j                   d|j                  j                   dfS |j                  }|"|j                  |j                  j                  nd}|	t        ddfS |j                  xs d}|j                  d      rB|t        d      d }|dv r	t        d|fS |dk(  r	t        d	|fS t        d
| d|j                   |fS t        d| d|j                   |fS )u   +45 live 결과 + 식별 결과 → task-2604 채택 분류(3종).

    반환: (adoption_classification, skip_reason, seam_classification)
    Nzdurable lookup z: uC   seam outcome 부재 → cron-remove 미진입, 보존(NON_BLOCKING)r=   PLUS9A_)	CANCELLEDALREADY_GONEALREADY_FIREDREMOVE_FAILED_WARNINGu   cron remove 시도 실패 → 안전 분류 (CANCEL_FAILED_CLASSIFIED). normal collector durable-success 무효화 0 — fallback 은 DUPLICATE 경로 음소거(디커플)z+9a u6    → 추정 remove 0, fallback 보존 (NON_BLOCKING): u   live verifier/seam 미충족(u4   ) → cron-remove 0, fallback 보존(NON_BLOCKING): )r-   ADOPT_NON_BLOCKINGr>   lookuprt   r   wired_resultwiring_resultseam_outcomerW   
startswithlenADOPT_CANCEL_ADOPTEDADOPT_CANCEL_FAILED_CLASSIFIEDrf   )rN   livewiredsoscccs         r(   _classify_adoptionr   V  s    $$!!
 	

 {{_,dkk001DKK4F4F3GH
 	
 E !4!4!@ 	(( 
 
zQ
 	

 
			%2B 
}}YI ??$ 
 ((.+
 	 	 rd ##%>>"24 
 	
 	+B4 0%%'^^$46 	 r'   r=   )r<   autoset_cwdrb   cancel_audit_pathcron_listerremoverfallback_cancelled_marker_pathcancel_lock_pathseam_audit_pathcallback_contractrj   rk   post_result_review_fnduplicate_callback_seenevidence_pathspost_result_review_marker_pathrh   c                  |xs
 t               }t        | j                  |||      }t        | |fi d|d|d|d|d|d|d|d	|
d
|d|d|d|d|d|d|d|d|d|d|d|}t	        ||      \  }}}|j
                  }|"|j                  |j                  j                  nd}|rt        |j                        nd} |rt        |j                        nd}!|r|j                  xs i j                  d      nd}"| }#|t        k(  r|!rdnd}$n|t        k(  rd}$nd}$t        |j                        }%|%du }&|j                   j"                  xs |j$                  xs d}'| j                   d |' d | d |j&                   }(i d!t(        d"|(d#| j                  d$|'d%|d&|j*                  d'|j-                         d(d)d*|j                   j.                  d+|"xs i j                  d,      |"xs i j                  d-      |"xs i j                  d.      |"xs i j                  d/      |"xs i j                  d0      d1d2t        |j0                        d3|d4t        |#      d5|$d6| d7|!d8|t        k(  |t        k(  |t2        k(  t        |j4                        d|&t        |j6                        t        |j8                        |j:                  |j<                  |j>                  |j@                  |g d9|d:})|	tC        |	      ntC        |      tD         d;z  }*tC        |      tD         d;z  tC        t?                     d<z  d=z  tD         d;z  g}+tG        |)|*|+>      },tI        dLi d%|d'|d?t        |j6                        d@ddA|&d8|t        k(  dB|t        k(  dC|t2        k(  d*|j                   j.                  d2t        |j0                        d3|d6| d7|!d4t        |#      d5|$dDt        |j4                        d+|"d$|'d"|(dE|)dF|,dG|j:                  dH|dI|dJtK        |)dJ         dK|S )Mu  task-2604 cancel-on-success live adoption 진입점 (회장 §3 결선).

    신규 cron/cancel 로직 0 — durable-success 식별 + ownership 교차검증
    가드를 얹고 +45 ``run_cancel_on_success_live_wiring`` (PRIMARY)
    경유한다. 어떤 seam/cron-remove 예외·skip·실패도 normal collector
    durable-success 를 변경하지 않는다(디커플 — +45/+25/+37 권위 그대로).
    )r3   rj   rk   r<   dispatch_fired_marker_pathresult_json_pathreport_pathcollector_result_marker_path	claim_dirr<   r   r   r   r   r   r   r   r   rj   rk   r   r   r   r   )rN   r   NFchecksr   REMOVE_IDEMPOTENTREMOVE_FAILED_CLASSIFIEDNOT_ATTEMPTEDTz	<UNBOUND>|r@   r`   r3   r_   rM   *normal_callback_durable_success_identifiedrN   lookup_sourcedurable_4tuple_registryrU   r^   c1_task_id_matchc2_chat_id_ownedc3_role_fallbackc4_marker_id_crosscheck c5_pending_not_fired_not_removed)r   r   r   r   r   rV   rW   rZ   r[   rX   rY   rR   )up   task-2604 Track A — read-only consume(+9a/+23/+25/+44~+55 byte-0) + +45 PRIMARY 경유, 신규 cancel 로직 0uz   callback_4tuple_index.jsonl track 미소유 공유 durable 인프라 — 본 모듈 read-only query only(append/rewrite 0)u}   unrelated cron 제거 방지: durable 4-tuple ownership(task_id/chat_id/role/fallback_cron_id) 일치 시에만 cancel 진행u~   decouple: cancel 분류/실패/skip/예외 무엇이든 normal collector durable-success 무변(normal_success_unchanged=True))rS   rT   r\   rP   rQ   rO   &wired_via_operational_collector_wiringrd   underlying_cancel_audit_pathr   r<   rf   rg   rh   z.cancel-adoption-audit.jsonmemoryevents)primary	fallbacksrO   rP   rQ   rS   rT   r\   ra   rb   rd   re   rf   rg   rh   r&   )&r)   r   r3   r   r   r   r   r   r,   rX   rY   live_verificationgetr   r   rP   r   fallback_cron_idr4   r`   ADOPTION_AUDIT_SCHEMAr-   rC   rt   rV   r   r\   rO   r   cancel_auditr   r   r<   r   TASK_MARKERr   rL   ri   )-inpack_pathr   r   r   r   r   r<   r   rb   r   r   r   r   r   r   r   rj   rk   r   r   r   r   rh   tsrN   r   adoption_clsrf   seam_clsr   r   rX   rY   fiverZ   r[   rP   decouple_heldtarget_cronr`   auditr   r   audit_writtens-                                                r(   #run_cancel_on_success_live_adoptionr     s   H 
	8:B >)#	N - $> *	
   &B      ,    (F * (  ,!" *#$ $%& 4'( !8)* &+, (F-D4 +=%D+'L+x E !4!4!@ 	(( 
 ;=$r556%8:b3349;B  &B++H5D*++'9?R	7	72'  $D$A$AB,4M 	$$ 	00	 
 ++a}Al^1T]]OLH9'9H9 	3;;9 	+	9
 	"<9 	5%%9 	.0029 	29 	++9 	!!% 0 01C D!% 0 01C D!% 0 01C D(,
'7'7)( 260@0@21
#
9. 	T..//90 	x192 	D!12394 	596 	2798 	099: 	,*>>;9> ::+/AA"4#:#:;$(#0 4 4526773
 $(#4#4(,(>(>(77%11"	
 q9E| * 	 !)_+.IJJ  	Y[M)DEE^
	
	 M4
5	6I +w)M )  ,% T112 "&	
 !. $';; :: ),>> kk(( $++, % 0 .  ./!" $#$   7 78%&  $'( #)* +, -. */0 !% 1 112 34  56 5>"78 9 r'   )r   r   r   r   r+   rL   r   r   )rD   r.   )
r3   r.   rj   Union[int, str]rk   r.   r<   Optional[Union[str, Path]]rD   r+   )rN   r+   r   r   rD   ztuple[str, str, Optional[str]])2r   r   r   Union[str, Path]r   r   r   r   r   r   r   r   r   r   r<   r   r   r   rb   r   r   r   r   zOptional[Callable[[], dict]]r   zOptional[Callable[..., object]]r   r   r   r   r   r   r   r]   rj   r   rk   r.   r   z2Callable[[dict, Classification], PostResultReview]r   Optional[list]r   r   r   r   rh   r.   rD   rL   )4rI   
__future__r   dataclassesr   r   r   r   pathlibr   typingr	   r
   r   r   anu_v3.artifact_root_resolverr   anu_v3.callback_4tuple_registryr   r   r   r   anu_v3.cancel_audit_writerr   $anu_v3.cancel_on_success_live_wiringr   r   r   utils.live_cron_state_verifierr   r   (utils.anu_delegation_completion_callbackr   r   r   r   r   r   r   r   r   rx   rs   rv   ru   r)   r+   rL   r   r   r   __all__r&   r'   r(   <module>r      s  ;x # ( '  2 2
 
   L  ( !; #  : + - ' E
 1
 1
 1
h ! ! !N )4&.2vv &v 	v
 ,v "vrJ0J $J $	Jl /3.26:4804/3AE3726(,(3& 	).2%)AE7Y	YY !1	Y
 'Y "Y #3Y  Y ,Y ,Y 4Y 2Y .Y -Y %?Y  1!Y" 0#Y$ &%Y& &'Y( )Y*+Y0 ,1Y2 #3Y4 %?5Y6 7Y8 #9Yx	r'   