
    3j^                       d Z ddlmZ ddl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 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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+e G d d             Z,e G d d             Z-eeddd	 	 	 	 	 	 	 	 	 	 	 ddZ.dddddddddeeedddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d dZ/	 	 	 	 	 	 	 	 	 	 d!dZ0g dZ1y)"uZ	  anu_v3.cancel_on_success_live_wiring — cancel-on-success LIVE integration.

task-2553+45 (회장 지시 2 §1~§3). Strict-additive 신규 모듈.

문제 (회장 §2 verbatim):
  +41 / +39 는 normal completion callback 이 성공하고 collector adjudication
  도 끝났지만, fallback/dead-man cron 이 뒤늦게 발화했다. 이는 중복 fallback
  이 안전하게 무시된 사례일 뿐 cancel-on-success **live remove 성공** 사례가
  아니다. +37 에서 wiring 은 mock/격리 검증됐으나, 실제 live normal collector
  path 가 fallback_cron_id 를 **durable** 하게 lookup 해 seam 을 경유하도록
  결선되지 않았다(세션 불연속 — one-shot cron auto-delete + spawn 분리).

목표 (회장 §3 verbatim):
  실제 normal collector 경로가
  ``operational_collector_wiring::run_operational_completion_callback_collector``
  를 경유하게 한다. normal collector durable-success 후
  ``run_operational_cancel_seam(operational=True)`` 1회. fallback_cron_id 는
  **durable 4-tuple registry(+44)** 에서 lookup 한다. binding 부재면
  cron-remove 0·fallback 보존. live cron-state verifier 5조건 AND PASS 일
  때만 bound fallback 1건 제거. mismatch/missing → cron-remove 0. cancel
  -audit JSON 생성. cron-remove 실패/skip/exception 이 normal collector
  success 를 실패로 바꾸지 않게 decouple.

결선 (9-R.1 2-layer):
  * Layer A — 본 모듈은 cron 을 자체 로직으로 추가/제거하지 않는다. durable
    registry(+44) read-only lookup + artifact root(+46) read-only resolve +
    +37 standard wired entrypoint **경유**(이미 +25 → +23 seam → live
    verifier 5조건 → +9a remover 로 결선됨). ZERO ``cokacdir``/
    ``subprocess`` exec. 테스트는 Fake/Spy 격리, 실 운영 cron 무접촉.
  * Layer B — cron-remove 대상은 (i) +44 durable registry 에서 안전 lookup
    된 fallback_callback_cron_id 1건, (ii) registry record 의 chat/role
    정합, (iii) +23 live cron-state verifier 5조건 AND PASS — 이 단일
    bound·verified 1건만. 본 task 의 목표 자체(회장 §1).

선행 게이트 (회장 §4 / 9-R.1):
  fallback_cron_id 를 durable registry 에서 **안전 lookup** 할 수 없는
  상태에서는 live cron-remove 를 시도하지 않는다(보존). 본 모듈은 +44/+46
  산출물을 read-only/additive 재사용한다 (원본 무변).
    )annotations)	dataclassfield)Path)CallableOptionalUnion)canonical_rootresolve_roots)NO_LEDGER_RECORDCallback4TupleRegistrydefault_ledger_path)build_cancel_on_success_auditguaranteed_write_auditnormalize_audit)ANU_CHAT_IDFALLBACK_ROLE)CallbackInputClassificationPostResultReview no_real_codex_post_result_review!run_completion_callback_collector)NormalCallbackBindingWiredCollectorResult.run_wired_normal_completion_callback_collectorztask-2553+45LOOKUP_VERIFIEDLOOKUP_NO_LEDGER_RECORDLOOKUP_NO_FALLBACK_BOUNDLOOKUP_TRACK_MISMATCHLOOKUP_CHAT_MISMATCHLOOKUP_ROLE_MISMATCHLOOKUP_ERRORc                      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dZ
y)DurableFallbackLookupu  durable 4-tuple registry lookup 결과 (Layer B 안전 lookup).

    ``ok=True`` AND ``status==LOOKUP_VERIFIED`` 일 때만 binding 진행.
    그 외 모든 경로(no record / no fallback / track·chat·role mismatch /
    error) → cron-remove 0, fallback 보존(회장 §3).
    boolokstrstatustask_idOptional[str]fallback_cron_iddispatch_cron_idnormal_collector_cron_idNchat_idroleledger_pathr
    reasonc                    d| j                   | j                  | j                  | j                  | j                  | j
                  | j                  | j                  | j                  | j                  | j                  dS )Nz'task-2553+45.durable_fallback_lookup_v1)schemar&   r(   r)   r+   r,   r-   r.   r/   r0   r
   r2   r&   r(   r)   r+   r,   r-   r.   r/   r0   r
   r2   )selfs    ;/home/jay/workspace/anu_v3/cancel_on_success_live_wiring.pyto_dictzDurableFallbackLookup.to_dict~   sf    ?''kk|| $ 5 5 $ 5 5(,(E(E||II++"11kk
 	
    )returndict)__name__
__module____qualname____doc____annotations__r.   r/   r0   r
   r2   r8    r9   r7   r$   r$   i   sa     	HKL####++!G]!D-!%K%$(NM(FC
r9   r$   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ed
<   ded<   ded<   ded<   dZded<   dZded<    ee      Z	ded<   y)CancelOnSuccessLiveResultu   live cancel-on-success wiring 1회 실행 결과.

    ``collector_result`` 는 +37/+25 가 반환한 값 그대로(디커플 — registry
    lookup / seam / cron-remove 결과로 변경 0).
    r%   durable_successr$   lookup&wired_via_operational_collector_wiringseam_invokedcron_remove_invokedfallback_preservednormal_success_unchangedr'   event_idr;   cancel_auditr*   cancel_audit_pathNzOptional[object]collector_resultzOptional[WiredCollectorResult]wired_result)default_factorylistnotes)
r<   r=   r>   r?   r@   rN   rO   r   rQ   rR   rA   r9   r7   rC   rC      sj     !!,00""M$$)-&-37L07-E4-r9   rC   N)expected_chat_idexpected_roler0   autoset_cwdc                   t        |      }t               }|t        |      n
t        |      }	 t	        |      }|j                  | |       }	|j                  |       }
|
	|	t        k(  r+t        dt        | dddt        |      |j                  d	      S |	dk(  s|
j                  | k7  rUt        dt        | d|
j                  |
j                   |
j"                  |
j$                  t        |      |j                  d	
      S t        |
j"                        t        |      k7  rft        dt&        | d|
j                  |
j                   |
j"                  |
j$                  t        |      |j                  d|
j"                   d| d
      S |
j$                  xs d|k7  rft        dt(        | d|
j                  |
j                   |
j"                  |
j$                  t        |      |j                  d|
j$                  d|d
      S |
j*                  sUt        dt,        | d|
j                  |
j                   |
j"                  |
j$                  t        |      |j                  d
      S t        dt.        | |
j*                  |
j                  |
j                   |
j"                  |
j$                  t        |      |j                  d
      S # t        $ r8}t        dt        | dddt        |      |j                  d| 	      cY d}~S d}~ww xY w)u  +44 durable 4-tuple registry 에서 fallback_cron_id 안전 lookup.

    회장 §3/§4: fallback_cron_id 를 **durable** 하게 lookup 하지 못하면
    (no ledger record / no fallback bound / track·chat·role mismatch /
    error) live cron-remove 를 시도하지 않는다 — 보존.

    +46 canonical-first 로 ledger root 를 resolve 한다 (autoset-cwd 단독
    false-negative 금지 — +39 계열 원인 해소).
    )rU   N)r)   expected_task_idFu:   durable registry lookup 예외 → 보존, cron-remove 0: )	r&   r(   r)   r+   r,   r-   r0   r
   r2   u   durable 4-tuple ledger 에 record 부재 → fallback_cron_id 안전 lookup 불가, cron-remove 0, fallback 보존 (회장 §4)TRACK_MISMATCHud   durable record track mismatch (task_id) → unrelated cron 미인용, cron-remove 0, fallback 보존r5   zdurable record chat_id=z != ANU u#    → cron-remove 0, fallback 보존r1   zdurable record role=z != u   durable record 에 fallback_callback_cron_id binding 부재 (no_fallback 계약) → cron-remove 0, fallback 보존 (회장 §3)Tu>   durable 4-tuple registry lookup 성공 — bound fallback 1건)r   r
   r   r   r   classify
latest_for	Exceptionr$   r"   r'   r   r   r)   r   r,   r-   r.   r/   r    r!   fallback_callback_cron_idr   r   )r)   rS   rT   r0   rU   rootscrootlpregistryverdictrecexcs               r7   %lookup_fallback_from_durable_registryrd      s   " k2EE " 	[ ' 

)"-
 ##$ $ 
 !!'* {g!11$*!!%)B //T
 	
  ""ckkW&<$(! 11%(%A%AKKB //<
 	
$ 3;;3/00$'! 11%(%A%AKKB //)#++h#$$GI
 	
$ 	B=($'! 11%(%A%AKKB //&sxxl$}6G H1 1
 	
$ (($+! 11%(%A%AKKB //W
 	
" !66--!$!=!=XXG++O S  
$!!%)B //OPSuU

 
	

s   /J> >	K?-K:4K?:K?)r0   rU   rM   cron_listerremoverfallback_cancelled_marker_pathcancel_lock_pathseam_audit_pathcallback_contractrS   rT   post_result_review_fnduplicate_callback_seenevidence_pathspost_result_review_marker_pathc                  t        |      }t        | j                  ||||      }|j                  s*|j                  xs d}t        | |||||      }t        |j                  t        j                  k(  xr |j                  du xr |j                  du       }| j                   d| d|j                   }t        t        || j                  ||j                  ddd|j                  d|j                   |j"                  dd	g
      || j                  |      }t%        |||	|      }t'        ||ddddd||||dd|j                   d|j                   dg      S t)        | j                  |j*                  xs d|j,                  |j                  t/        |            }t1        | |||t        |      t        |      t        |      ||
|||||      }|j2                  r|j2                  j4                  nd} d}!d}"d}#| Q| j6                  xs i }$|$j9                  d      }!| j:                  xs d}%|%dv }#| j<                  r| j>                  rdnd}"t        t        |j@                  | j                  |j                  xs dtB        |jD                  | rt        | j<                        nd|"| rt        | j>                        nd|!| r| jF                  nd|#|j                   |j"                  ddg      |j@                  | j                  |j                  xs d      }t%        |||	|j@                        }t        |jH                  j                  t        j                  k(  xr2 |jH                  j                  du xr |jH                  j                  du       }t'        |||jJ                  |jD                  |j<                  |jL                  d|j@                  |||jH                  |ddg      S )u{  live cancel-on-success wiring 진입점 (회장 §3 결선).

    절차:
      1. +44 durable 4-tuple registry 에서 fallback_cron_id 안전 lookup
         (+46 canonical-first root). lookup 불가/mismatch/no-binding →
         seam 미진입, cron-remove 0, fallback 보존, cancel-audit 기록.
      2. lookup VERIFIED → durable record 의 4-tuple 로
         ``NormalCallbackBinding`` 구성.
      3. +37 ``run_wired_normal_completion_callback_collector`` **경유**
         (PRIMARY — 이미 +25 → +23 seam(operational=True) 1회 → live
         cron-state verifier 5조건 AND → bound fallback cron-remove).
      4. cancel-audit JSON 생성·보장 기록. seam/cron-remove 의 어떤 예외·
         skip·실패도 collector_result 를 변경하지 않는다 (디커플 — +37/+25
         권위 그대로 + 본 모듈도 collector_result 무변 반환).
    )r)   rS   rT   r0   rU   z	<UNBOUND>)rk   rl   rm   rn   T|FNOT_ATTEMPTEDus   durable 4-tuple registry lookup 불가/mismatch → seam 미진입, cron-remove 0, fallback 보존 (회장 §3/§4)u=   디커플: lookup 실패는 normal collector 성공과 무관)rK   r)   target_cron_idlookup_statusrG   remove_attemptedremove_resultskip_reasonalready_removed_or_missingr
   r0   rR   )rK   r)   rr   )	claim_dirrM   rK   Nzdurable lookup z: u   callback mandatory rule 유지: lookup 실패에도 normal completion collector 1회 실행(frozen byte-0) — seam/cron-remove 만 skip (회장 §3, Codex HIGH 수용))rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rR   r1   )r)   r,   r-   r+   r.   )bindingdispatch_fired_marker_pathresult_json_pathreport_pathcollector_result_marker_pathrx   re   rf   rg   rh   ri   rj   checks)SKIP_LIVE_SKIP_ALREADY_REMOVEDSKIP_LIVE_SKIP_ALREADY_FIREDSKIP_LIVE_SKIP_NOT_FOUND	CANCELLEDREMOVE_NONFATALu   live collector path → durable 4-tuple registry lookup → +37 wired entrypoint → +25 → +23 seam(operational=True) → live verifier 5조건 → bound fallback cron-removeui   디커플: seam/cron-remove 결과와 무관하게 collector_result 불변, normal_success_unchanged=True)rK   r)   rr   rs   rG   rt   ru   fallback_cancelledfive_condition_resultsrv   rw   r
   r0   rR   uz   COLLECTOR_PATH live-wired: durable 4-tuple registry lookup (+44) + canonical-first root (+46) → +37 → +25 → +23 seamu   Layer A: 본 모듈 임의 cron 조작 0 / Layer B: durable lookup + 5조건 verified single bound cancel 1건 (회장 §1 목표 자체))'r   rd   r)   r&   r+   r   r%   classificationr   PASScloseout_candidateack_acquiredr(   r   r   r2   r
   r0   _write_auditrC   r   r,   r-   intr   wiring_resultseam_outcomelive_verificationgetseam_classificationrH   r   rK   r   rG   rv   rN   rF   rI   )&inpack_pathrz   r{   r|   r}   rx   r0   rU   rM   re   rf   rg   rh   ri   rj   rS   rT   rk   rl   rm   rn   dfmrE   targetrN   rD   rK   auditaudit_writtenry   wiredsofiveru   alreadylvscs&                                         r7   !run_cancel_on_success_live_wiringr   A  s?   T )
*C2)#F 99((7K<"7$;)+I
 ++~/B/BB 6 33t;6 --5
 {{m1VHAfmm_5 	  )!%$mm"!&-"MM+0%44"..VS$ KK!+
. %Y:K
 )+37 %#%)+-!&--6==/BG
 	
, $006B!'!@!@00$%G ;#&./%%)*F%G'E)'+E$ .3-@-@			)	)dBD#MG	~!!'Rvvh##)r 
 

 !!!44:K  %^^KK!228b)++=?T""8"89U'/1R**+u#'+-2'.!00**K8	!	
0 ..4"7E: !6GM
 --1D1DD 	8""55=	8""//47O
 %'88''!55 33!%'//NU
 r9   c          	         |t        |      nt        |      t         dz  }dj                  d |D              dd }t        | |t        |      t         d| dz  g      S )	u?   cancel-audit 다중 후보 보장 기록 (Layer A — NO-CRON).Nz.cancel-audit.jsonr1   c              3  D   K   | ]  }|j                         r|nd   yw)_N)isalnum).0cs     r7   	<genexpr>z_write_audit.<locals>.<genexpr>7  s     CQAIIKqS0Cs    P   z.cancel-audit.z.json)primary	fallbacks)r   TASK_MARKER_PREFIXjoinr   )r   rx   rM   rK   r   safe_eids         r7   r   r   *  s     ( 	)_"4!55GHH 
 wwC(CCCRHH!O#$N8*EBC
 r9   )r   r   r   r   r   r    r!   r"   r$   rC   rd   r   )r)   r'   rS   Union[int, str]rT   r'   r0   Optional[Union[str, Path]]rU   r   r:   r$   ).r   r   r   Union[str, Path]rz   r   r{   r   r|   r   r}   r   rx   r   r0   r   rU   r   rM   r   re   zOptional[Callable[[], dict]]rf   zOptional[Callable[..., object]]rg   r   rh   r   ri   r   rj   zOptional[dict]rS   r   rT   r'   rk   z2Callable[[dict, Classification], PostResultReview]rl   Optional[list]rm   r   rn   r   r:   rC   )
r   r;   rx   r   rM   r   rK   r'   r:   r*   )2r?   
__future__r   dataclassesr   r   pathlibr   typingr   r   r	   anu_v3.artifact_root_resolverr
   r   anu_v3.callback_4tuple_registryr   r   r   anu_v3.cancel_audit_writerr   r   r   utils.live_cron_state_verifierr   r   (utils.anu_delegation_completion_callbackr   r   r   r   r   5utils.normal_completion_callback_collector_entrypointr   r   r   r   r   r   r   r   r    r!   r"   r$   rC   rd   r   r   __all__rA   r9   r7   <module>r      su  &N # (  , ,     $  $3 5 / - -  "
 "
 "
J . . .2 )4&.2.2XX &X 	X
 ,X ,X XH /3.24804/3AE3726(,(3& 	).2%)AE3f	ff !1	f
 'f "f #3f  f ,f ,f 2f .f -f %?f 1f  0!f" &#f$ &%f& 'f()f. ,/f0 #1f2 %?3f4 5fR   2	
  0r9   