
    4j/              	         d Z ddlmZ ddl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 ddlmZmZmZmZmZ dd	lmZmZ dd
Ze G d d             ZddZddddddded	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZy)u+  utils/completion_callback_operational_cancel_seam.py

task-2553+23 — CALLBACK_CANCEL_ON_SUCCESS_OPERATIONAL_INTEGRATION.

운영 collector 통합 seam: normal completion-callback collector 가 durable
evidence 성공 판정을 낸 **직후**, 사전등록 fallback callback cron 을 운영
경로로 자동 취소한다. (normal 성공 → fallback cron remove → 불필요 fallback
발화 0)

결선 순서 (task-2553+23 §4.3):
  1. durable-evidence 성공 게이트 (task-2553+9a evaluate_durable_evidence 상속)
       └ 미충족 → SKIP, fallback 보존, normal 성공 불변
  2. **신규** live cron-state verifier (utils/live_cron_state_verifier)
       └ VERIFIED 아님 → SKIP, 실 remove 0, fallback 보존
  3. VERIFIED → task-2553+9a cancel_fallback_on_success 호출
       (운영 remover DI = utils.completion_callback_fallback_cancel.
        RealCokacdirCronRemover, 운영 런타임은 dry_run=False)
       └ +9a 가 §9-R.1 safe-remove 5조건 + §9-R.2 durable 재확인 후 실 remove
  4. audit trail JSON 기록 (모든 remove 결정·5조건·invoked/skip·사유)
  5. outcome 반환 — **normal collector 성공/보고는 본 결과와 독립**
       (remove 실패·skip 이어도 normal 성공 유지, collector 실패 처리 0)

설계 규율:
  * frozen anchor utils/anu_delegation_completion_callback.py 무접촉 —
    import/호출 0 (AST 정적 증명 대상).
  * task-2553+9a 분리 모듈을 **수정 없이 사용**. 운영 remover 는 +9a 가 이미
    제공하는 RealCokacdirCronRemover(dry_run=False) 주입점을 재사용한다
    (§4.1 "신규 옵션/주입점만, 기존 dry-run 시그니처·동작 무회귀" →
    +9a 무변경으로 strict-additive 충족, 본 seam 이 운영 결선).
  * 본 task 구현/테스트는 실 운영 cron 절대 비접촉(§6 9-R.4): 기본
    operational=False(dry_run 경로). 운영 collector 만 operational=True.
  * 디커플: 어떤 분기에서도 예외를 collector 로 전파하지 않는다 — 항상
    OperationalCancelOutcome 반환, normal_success_preserved=True.
    )annotationsN)	dataclassfield)datetimetimezone)Path)CallableOptional)CancelClassificationRealCokacdirCronRemoverRemovercancel_fallback_on_successevaluate_durable_evidence)
CronListerverify_live_cron_statec                 f    t        j                  t        j                        j	                  d      S )Nz%Y-%m-%dT%H:%M:%SZ)r   nowr   utcstrftime     H/home/jay/workspace/utils/completion_callback_operational_cancel_seam.py_now_utcr   8   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ed
<   ded<   ded<    ee      Z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<   ddZy)OperationalCancelOutcomeuA   seam 결과. normal collector 성공은 본 결과와 **독립**.strstageseam_classificationtask_idtarget_cron_idboolcron_remove_invokedfallback_cancelledremove_allowed_by_live_verifiernormal_success_preservedskip_reason)default_factorydictdurable_evidencelive_verificationNOptional[dict]plus9a_decisionOptional[str]
audit_pathlistnotes ts_utcc                   i ddd| j                   d| j                  d| j                  d| j                  d| j                  d| j
                  d	| j                  d
| j                  d| j                  d| j                  d| j                  d| j                  d| j                  d| j                  d| j                  S )Nschema"operational_cancel_seam_outcome_v1r   r    r   r   r"   r#   r$   r%   r&   r)   r*   r,   r.   r0   r2   )r   r    r   r   r"   r#   r$   r%   r&   r)   r*   r,   r.   r0   r2   )selfs    r   to_dictz OperationalCancelOutcome.to_dictP   s   
:
t||
 d11
 TZZ	

 "4#;#;
 "4#;#;
 !$"9"9
 .t/S/S
 '(E(E
 4++
  5 5
  !7!7
 t33
 $//
 TZZ
  dkk!
 	
r   )returnr(   )__name__
__module____qualname____doc____annotations__r   r(   r)   r*   r,   r.   r/   r0   r2   r7   r   r   r   r   r   <   s    KJL%))"""48d8#D9t9&*O^* $J$-E4-FC
r   r   c                    | y 	 | j                   j                  dd       | j                  t        j                  |dd      d       t        |       S # t        $ r Y y w xY w)NT)parentsexist_okF   )ensure_asciiindentzutf-8)encoding)parentmkdir
write_textjsondumpsr   OSError)r.   records     r   _write_auditrL   e   sl    t<JJvE!<w 	 	
 : s   AA 	A"!A"F)r.   cron_listerremoverfallback_cancelled_marker_pathcancel_lock_pathcallback_contractoperationalnow_fnc                \    dfd} |        }d  fd}	 t        |||      }|d   s# |t        dd ddddd	|d
    |dg            S t         ||      }|j                  sM |t        dd|j                  j
                    dddd|j                  ||j                         dg            S |xs
 t               }t         |||||	|
|d||      }|j                  t        j                  k(  } |t        dd|j                  j
                    |j                  |j                  dd|j                  ||j                         |j                         d|rdndg            S # t        $ r)} |t        dd ddddd| dg
            cY d}~S d}~ww xY w)!u  운영 collector 통합 seam 진입점.

    normal collector 성공/보고는 본 함수 결과와 **독립**이다. 본 함수는 어떤
    경우에도 예외를 호출자(collector)로 전파하지 않으며 항상
    ``normal_success_preserved=True`` 인 outcome 을 반환한다.

    operational=False(기본) → +9a 에 dry_run=True 전달(실 cron 비접촉, 본 task
    구현/테스트 안전 기본값). 운영 collector 만 operational=True(dry_run=False).
    c                 2    	          S # t         $ r Y yw xY w)Nz0000-00-00T00:00:00Z)	Exception)rS   s   r   _safe_tsz-run_operational_cancel_seam.<locals>._safe_ts   s!    	*8O 	*)	*s   
 	c                t    d| _         | _        d| j                         d}t        |      | _        | S )NTztask-2553+23.cancel-audit_v1)r4   r   r    decisionrR   r2   )r%   r2   r7   rL   r.   )outcomerK   r.   rR   r    r   tss     r   _finishz,run_operational_cancel_seam.<locals>._finish   sH    +/(4,)&
 **f=r   )result_json_pathreport_pathcollector_result_marker_path	satisfieddurable_gateSKIP_DURABLE_NOT_SATISFIEDFTuV   normal collector durable evidence 미충족 → fallback 보존(예정대로 발화): reasonuU   디커플: durable 미충족은 normal 성공과 무관 — collector 실패 처리 0)r   r   r   r    r"   r#   r$   r%   r&   r)   r0   )r   r    dispatch_fired_marker_pathrM   rS   live_verify
SKIP_LIVE_ub   live 조회 권위 — 5조건 미충족/조회실패/idempotent 시 실 remove 0, fallback 보존)r   r   r   r    r"   r#   r$   r%   r&   r)   r*   r0   )r   r    rd   r]   r^   r_   rO   rP   rQ   normal_collector_successrN   dry_runrS   plus9a_cancelPLUS9A_u_   live verifier VERIFIED 후 +9a 가 §9-R.1/§9-R.2 재확인 후 실 remove (운영 remover DI)uA   fallback cron 자동취소 성공 → 불필요 fallback 발화 0u:   remove 비성공이어도 normal 성공 불변 (디커플))r   r   r   r    r"   r#   r$   r%   r&   r)   r*   r,   r0   exception_guardSKIP_SEAM_EXCEPTIONu>   seam 내부 예외 → fallback 보존, normal 성공 불변: u6   디커플: seam 예외는 collector 실패로 전파 0)
r   r   r   r    r"   r#   r$   r%   r&   r0   Nr8   r   )rZ   r   r8   r   )r   r   r   remove_allowedclassificationvaluer&   r7   r   r   r   	CANCELLEDr"   r#   cancel_skipped_reasonrV   )r   r    rd   r]   r^   r_   r.   rM   rN   rO   rP   rQ   rR   rS   rW   rh   r\   evlvactive_removerrY   	cancelledexcr[   s   ``    `     ``         @r   run_operational_cancel_seamrx   r   sI   8* 
BoG t
&-#)E

 +(((D##1(-',49-188:8~G &(* . $)'A#
   ('*4R5F5F5L5L4M(N##1(-',49-1 "%'&(jjl4 * #*"F-D-F-)'A-#)E+I-/%)"
 ++/C/M/MM	$%&-h.E.E.K.K-L$M-$,$@$@#+#>#>04)-$::!#"$**, ( 0 0 25 % \Y
 	
2  
$'$9-$)#(05)-\]`\abOP
 	

s+   5E9 A(E9 B7E9 9	F+F& F+&F+rm   )r.   Optional[Path]rK   r(   r8   r-   )r   r   r    r   rd   r   r]   r   r^   r   r_   r   r.   ry   rM   zOptional[CronLister]rN   zOptional[Remover]rO   ry   rP   ry   rQ   r+   rR   r!   rS   zCallable[[], str]r8   r   )r<   
__future__r   rH   dataclassesr   r   r   r   pathlibr   typingr	   r
   )utils.completion_callback_fallback_cancelr   r   r   r   r   utils.live_cron_state_verifierr   r   r   r   rL   rx   r   r   r   <module>r      s  !D #  ( '  % E %
 %
 %
P
* "&(,!%59'+(, (g
g
 g
 !%	g

 g
 g
 #'g
 g
 &g
 g
 %3g
 %g
 &g
 g
 g
  !g
r   