
    4j|                       d Z ddlmZ ddlZddlZddlZddlZddlmZm	Z	 ddl
mZ ddlmZ  ee      j                         j                   j                   j                   Zedz  dz  Zd	Zedz  d
z  Zedz  dz  Z ed      Z ed      ZdZdZddlmZmZmZ ddlmZ ddlm Z! ddlm"Z# ddlm$Z$ ddl%m&Z&m'Z'm(Z(m)Z)  G d d      Z* G d d      Z+ G d d      Z,d4dZ-d5dZ.d6dZ/d7dZ0d8d Z1d!d"d#ed$	 	 	 	 	 	 	 	 	 	 	 	 	 d9d%Z2d&d'ddd(	 	 	 	 	 	 	 	 	 d:d)Z3e G d* d+             Z4d,Z5d-Z6d;d.Z7	 	 	 	 	 	 	 	 	 	 	 	 d<d/Z8	 	 	 	 	 	 	 	 	 	 d=d0Z9	 	 	 	 	 	 d>d1Z:	 	 	 	 	 	 d?d2Z;g d3Z<y)@u	  tests/fixtures/cancel_on_success_live_observation_harness_2553plus41.py

task-2553+41 — TRACK D: +37 CANCEL-ON-SUCCESS LIVE OBSERVATION FIXTURE
(read-only observation only).

목적 (task-2553+41 §1 / §3.1, 회장 verbatim 의도):
  +37 wired entrypoint(``run_wired_normal_completion_callback_collector``)의
  cancel-on-success 동작을 **read-only 로 관측**하는 mock/fixture harness 를
  사전 구현한다. 향후 실 post-+37 task callback 사이클이 도래하면 본 harness
  로 6-step:

      ① normal success
      ② wired entrypoint
      ③ operational_collector_wiring (PRIMARY 경유)
      ④ run_operational_cancel_seam (operational=True)
      ⑤ live verifier 5조건 AND PASS
      ⑥ bound fallback cron-remove + cancel-audit

  을 결정적(passive)으로 검증할 수 있다. md 박제만 금지 — 실행 fixture·
  observation harness·regression 산출.

callback/collector 경로 추가 수정 0 (회장 §1 / §3.1 / §5):
  * 본 harness 는 +37 entrypoint·+25 wiring·+23 seam·+9a·verifier·frozen
    anchor 를 **read-only import / parse / reference only** 한다 (1 byte
    수정 0 — strict-additive 신규 모듈). 6-step 은 +37 공개 API
    ``run_wired_normal_completion_callback_collector`` 에 **주입 Fake/Spy +
    격리 sandbox FS** 만 물려 관측한다.

mock-only / 실 운영 무접촉 (§5 / §7 / 9-R):
  * 실 cron-list·실 cron-remove·실 schedule_history·실 callback 4-tuple·
    실 cron 발화 **무접촉**. contract/+37 산출은 read-only 참조만.
  * 격리 강제: ① subprocess 전면 차단 ② 실 cron API entrypoint
    (RealCokacdirCronLister/Remover) 차단 ③ ``/usr/local/bin/cokacdir``
    바이너리 접근 차단 ④ live schedule_history / live workspace mutation
    을 sandbox + read-only allowlist 로 제한.
  * exact-once = 명시 claim artifact/key (event_id 기반 격리 marker,
    ``O_CREAT|O_EXCL`` create-if-absent) + first-winner=1 invoke·
    second=즉시 no-op. 약한 in-memory mutex 대체 0.

본 모듈 자체는 실 cron/callback 을 1회도 등록·제거·발화하지 않는다. 실
task 적용 시에도 본 harness 는 passive observer — cron-list 1회(주입
fake)·schedule_history read-only(주입 spy) 만 수행하며 write/cron-remove/
dispatch 0. 실 cron-remove 는 결선완료·verifier 5조건 PASS 후 운영단계
동작이며 본 task 행위가 아니다 (+37 모듈 docstring §62~65 와 동형).
    )annotationsN)	dataclassfield)Path)Optionalutilsz%anu_delegation_completion_callback.py@83b3e307c8207c76a3e311c408aab4951373bd317896e51687d3007907b0c3d4z2normal_completion_callback_collector_entrypoint.pyzoperational_collector_wiring.pyz$/home/jay/.cokacdir/schedule_historyz/usr/local/bin/cokacdirl   L5: ztask-2553+41)CallbackInputCallbackTypeClassification)ANU_CHAT_ID)ANU_KEY)FALLBACK_ROLE)RemoverResult)NormalCallbackBindingWiredCollectorResult.run_wired_normal_completion_callback_collector validate_normal_callback_bindingc                  .    e Zd ZdZddddZddZd	dZy)
FakeCronListeruR  주입 fake cron-list. 실 ``cokacdir --cron-list`` 무호출.

    ``entries`` = +23 live verifier 가 보는 정규화 목록. ``drop_id_after_first``
    True 면 한 번 lister 가 호출된 *뒤* 두 번째 조회부터 대상 id 부재로
    응답하여 cron-remove 후 cron-list 교차확인을 결정적으로 재현한다.
    okN)statusdrop_id_after_firstc               t    |D cg c]  }t        |       c}| _        || _        || _        d| _        y c c}w Nr   )dictentriesr   r   calls)selfr   r   r   es        [/home/jay/workspace/tests/fixtures/cancel_on_success_live_observation_harness_2553plus41.py__init__zFakeCronLister.__init__s   s3    )01AQ1#6 
 2s   5c                h   | xj                   dz  c_         | j                  dk7  r| j                  g ddidS | j                  D cg c]  }t        |       }}| j                  =| j                   dkD  r.|D cg c]#  }|j                  d      | j                  k7  s"|% }}d|ddidS c c}w c c}w )N   r   fakeT)r   r   rawid)r   r   r   r   r   get)r   r    curs      r!   __call__zFakeCronLister.__call__y   s    

a
;;$"kkb&$PP $-1tAw--##/DJJN!MQUU4[D4L4L%L1MCM3~FF .Ms   B*8#B/B/c                Z     |        }t        fd|j                  dg       D              S )Nc              3  F   K   | ]  }|j                  d       k(    yw)r'   Nr(   ).0r    cron_ids     r!   	<genexpr>z,FakeCronLister.id_present.<locals>.<genexpr>   s     Ka155;')Ks   !r   )anyr(   )r   r/   snaps    ` r!   
id_presentzFakeCronLister.id_present   s&    vK488Ir3JKKK    returnr   )r/   strr6   bool)__name__
__module____qualname____doc__r"   r*   r3    r4   r!   r   r   k   s     +/D GLr4   r   c                  (    e Zd ZdZdddZddd	dZy)

SpyRemoveru@   주입 spy cron-remover. 실 cron 제거 0 — 호출만 기록.c                     || _         g | _        y N)r   r   )r   r   s     r!   r"   zSpyRemover.__init__   s    
r4   T)dry_runc                   | j                   j                  ||d       t        | j                  d| j                         S )N)r/   rB   zfake:)r   detail)r   appendr   r   )r   r/   rB   s      r!   r*   zSpyRemover.__call__   s5    

g'BCDKK%}8MNNr4   N)removed)r   r7   )r/   r7   rB   r8   r6   r   )r9   r:   r;   r<   r"   r*   r=   r4   r!   r?   r?      s    J 9= Or4   r?   c                  6    e Zd ZdZddddZd	dZd
dZddZy)SpyScheduleHistoryu  주입 spy schedule_history reader. 실 schedule_history 무접촉.

    실 운영에서 fallback 발화 확인은 ``<fallback_id>.log`` 무발화 검사다.
    본 spy 는 **격리 sandbox 내부** log 파일만 read-only 조회하며 (실
    ``/home/jay/.cokacdir/schedule_history`` 경로는 절대 열지 않음), 기본
    적으로 발화 0(빈 로그/파일부재) 을 반환한다.
    N)	fired_idsc               Z    t        |      | _        t        |xs g       | _        g | _        y rA   )r   sandboxsetrI   reads)r   rK   rI   s      r!   r"   zSpyScheduleHistory.__init__   s$    G}Y_"-
r4   c                    | j                   dz  | dz  j                         }t        |      j                  t        | j                   j                                     st	        d      |S )Nschedule_historyz.logu6   schedule_history 경로가 sandbox 밖 (격리 위반))rK   resolver7   
startswithAssertionError)r   fallback_idps      r!   	_log_pathzSpyScheduleHistory._log_path   sf     LL--;-t0DD
') 	
 1v  T\\%9%9%;!<= H  r4   c                    | j                   j                  |       || j                  v ry| j                  |      }|j	                         syt        d |j                  d      j                         D              S )Nr$   r   c              3  @   K   | ]  }|j                         rd   yw)r$   N)strip)r.   lns     r!   r0   z1SpyScheduleHistory.fired_count.<locals>.<genexpr>   s!      
xxz 
s   utf-8encoding)rM   rE   rI   rU   existssum	read_text
splitlines)r   rS   lps      r!   fired_countzSpyScheduleHistory.fired_count   sk    

+&$..(^^K(yy{ 
llGl4??A
 
 	
r4   c                *    | j                  |      dk(  S r   )rb   )r   rS   s     r!   	no_firingzSpyScheduleHistory.no_firing   s    ,11r4   )rK   r   )rS   r7   r6   r   )rS   r7   r6   int)rS   r7   r6   r8   )r9   r:   r;   r<   r"   rU   rb   rd   r=   r4   r!   rH   rH      s      48 
	
2r4   rH   c                J  	
 t              j                         d }| j                  t        d|       | j                  t        d|       | j                  t        d|       | j                  t        d|       | j                  t        d|       | j                  t        d|       dd	lm} dd	lm} | j                  |j                  d
|d       | j                  |j                  d
|d       t        j                  
t        j                  t        t        dz        t        t        dz        t        t        dz  dz        t        t              f	d	fdddd
fd	}fd}| j                  t        d|       | j                  t        d|       y	)uj  harness 실행 전 모든 라이브 경로를 monkeypatch/allowlist 로 차단한다.

    ① subprocess.run/Popen/call/check_output/check_call + os.system →
       즉시 AssertionError
    ② 실 cron API entrypoint: live_cron_state_verifier.RealCokacdirCronLister
       / completion_callback_fallback_cancel.RealCokacdirCronRemover __call__
       → 즉시 AssertionError (주입 Fake/Spy 만 허용)
    ③ callback 등록 entrypoint: ``/usr/local/bin/cokacdir`` 접근 차단
    ④ live schedule_history / live workspace mutation:
       open()/os.open 을 sandbox + read-only allowlist 로 제한.
    c                     t        d      )Nu}   실 subprocess/cron/callback 호출 금지 (§5 / 9-R) — 주입 Fake/Spy·격리 sandbox 만 허용 (read-only observation)rR   )aks     r!   _boomz'install_isolation_guards.<locals>._boom   s    Q
 	
r4   runPopencallcheck_output
check_callsystemr   Nr*   F)raisingr   testsmemoryfixturesc                   	 t        t        t        j                  |             j	                               }|j                  t                    ry|j                  t        t        j	                                     ry|j                  t        t                    ry|j                        ryy# t
        t        f$ r Y yw xY w)Ndenyrwro)
r7   r   osfspathrP   	TypeError
ValueErrorrQ   LIVE_SCHEDULE_HISTORYLIVE_COKACDIR_BIN)pathapallow_read_prefixesrK   s     r!   	_classifyz+install_isolation_guards.<locals>._classify   s    	T"))D/*2245B ==W&==2::<=>==./0==,- :& 		s   5B2 2CCc                ,     t         fddD              S )Nc              3  &   K   | ]  }|v  
 y wrA   r=   )r.   cmodes     r!   r0   z>install_isolation_guards.<locals>._is_write.<locals>.<genexpr>  s     ;19;   )wri   x+)r1   )r   s   `r!   	_is_writez+install_isolation_guards.<locals>._is_write  s    ;&:;;;r4   c                     |       }|dk(  r | |g|i |S |dk(  r |      s | |g|i |S t        d| d|d      )Nrx   ry   u   live-path 차단 (§5 / 9-R): z mode=u?    — harness 는 격리 sandbox·read-only allowlist 만 접근rh   )filer   ri   rj   clsr   r   	real_opens        r!   _guarded_openz/install_isolation_guards.<locals>._guarded_open  su    o$;T41!1q11$;yT41!1q11,THF4( CI I
 	
r4   c                "    |       }t        |t        j                  t        j                  z  t        j                  z  t        j
                  z  z        }|dk(  r | |g|i |S |dk(  r|s | |g|i |S t        d| d| d      )Nrx   ry   u&   live-path 차단 (§5 / 9-R): os.open z flags=u0    — harness 는 격리 sandbox 만 write 가능)r8   rz   O_WRONLYO_RDWRO_CREATO_APPENDrR   )r   flagsri   rj   r   wrr   real_os_opens         r!   _guarded_os_openz2install_isolation_guards.<locals>._guarded_os_open  s    oR[[299,rzz9BKKGH
 $;e5a5155$;re5a51554THGE7 K: :
 	
r4   open)r6   r7   )r   r7   r6   r8   )r)r   rP   setattr
subprocessrz   )utils.completion_callback_fallback_cancel#completion_callback_fallback_cancelutils.live_cron_state_verifierlive_cron_state_verifierRealCokacdirCronListerRealCokacdirCronRemoverbuiltinsr   r7   	WORKSPACEFROZEN_ANCHOR)monkeypatchrK   rk   _fc_lvr   r   r   r   r   r   r   s    `     @@@@@r!   install_isolation_guardsr      sc    7m##%G
 
E51
GU3
FE2
NE:
L%8He, <0""Ju   ##Z   I77LI I I :-.M	<	

 &-8F$45r4   c                    t          d|  dS )u@   exact-once 명시 claim key (event_id 기반 격리 marker 명).z.seam-claim.z.json)TASK_MARKER_PREFIX)event_ids    r!   	claim_keyr   %  s     !hZu==r4   c                   t        |       } | j                  dd       | t        |      z  }	 t        j                  t        |      t        j                  t        j                  z  t        j                  z  d      }t        j                  |dd      5 }t        j                  d|d	d
|d       ddd       y# t        $ r Y yw xY w# 1 sw Y   yxY w)ut  ``O_CREAT|O_EXCL|O_WRONLY`` 원자 선점 (실 FS, in-memory mutex 아님).

    +25 ``utils.operational_collector_wiring`` claim 의 의미를 충실 mirror:
    True = first-winner(seam 1회 진입 허용), False = 이미 선점
    (retries/duplicate/concurrent) → 즉시 no-op. claim artifact 는 격리
    sandbox 내부 ``task-2553+41.*`` 네임스페이스.
    Tparentsexist_oki  Fr   rZ   r[   ztask-2553+41.seam-claim_v1zO_CREAT|O_EXCL)schemar   atomic_create_method)ensure_asciiN)r   mkdirr   rz   r   r7   r   O_EXCLr   FileExistsErrorfdopenjsondump)	claim_dirr   cpfdfs        r!   attempt_exact_once_claimr   *  s     YIOOD4O0	Yx(	(BWWSWbjj2994r{{BEJ 
2sW	- 	
		6$(8
 	
	
   	
 s   AB< C<	CCCc                     g d
 fd} |d      } |d      }||t              rd   nd|du |du xr |du xr t              dk(  d	S )uC  동시 2호출 emulation — first-winner=1 invoke, second=즉시 no-op.

    각 호출이 동일 event_id 로 ``attempt_exact_once_claim`` 을 시도한다.
    O_EXCL 의미상 정확히 1개만 winner. invoke 카운터로 seam 1회·no-op 1회
    를 단언 가능하게 반환한다 (약한 mutex 대체 아님).
    c                F    t              }|rj                  |        |S rA   )r   rE   )tagclaimedr   r   invokess     r!   _onez(simulate_concurrent_double.<locals>._oneO  s#    *9h?NN3r4   firstsecondr   NFTr$   )first_claimedsecond_claimedseam_invoke_countwinnersecond_is_noopexact_once_ok)r   r7   )len)r   r   r   r   r   r   s   ``   @r!   simulate_concurrent_doubler   F  sj     G ME(^F  \ ''!*T!U?TMCfoC#g,!2C	 	r4   c                R    t        | ddt        j                  dddddddd	id

      S )u   frozen collector 가 PASS(durable-success) 를 산출하는 최소 입력.

    +37 regression ``_pass_input`` 과 동형 (frozen 공개 API). 실 4-tuple
    무사용 — 합성 격리 입력만.
    zdev5-sim-2553p41DISP2553P41NORM2553P41r   	completedT)result_jsonreportfrozen_anchormatch)
task_idexecutordispatch_cron_idcallback_typecallback_cron_idcron_statustask_statusrequired_closeout_markerspreservation_anchors
dev_sunset)r
   r   NORMAL)r   s    r!   pass_callback_inputr   f  s?     #&"))&26$"G-w7 r4   r   r   	__bound__)r   normal_collector_cron_idfallback_cron_idchat_idc               4    |dk(  r|n|}t        | ||||      S )uG  +37 NormalCallbackBinding 합성 (fallback_cron_id 필수 bound).

    ``fallback_cron_id == "__bound__"`` 면 ``target_cron_id`` 로 바인드되어
    dispatch-fired marker 와 일치(binding-valid) 한다. None/"" 또는 다른 값
    이면 binding-invalid (missing/marker mismatch) 경로를 결정적으로 재현.
    r   )r   r   r   r   r   )r   )r   target_cron_idr   r   r   r   fids          r!   make_bindingr   z  s/     -;.AQC )!9 r4   ztask-2553+41-obsFBOBS2553P41)r   r   verifier_entriesr   c                  t        |       } | j                  dd       | | dz  }|j                  t        j                  ddd|dd|t
        t        t        dd	      d
       | | dz  }|j                  t        j                  d|ddd      d
       | | dz  }|j                  d| dd
       | | dz  }|j                  t        j                  d|ddd      d
       |||t        ddddg}i d|d|d| d|d|d|d |d!| | d"z  d#| | d$z  d%| | d&z  d'| | d(z  d)| d*z  d+| | d,z  d-d.|d/d0|d1|S )2u  격리 sandbox 에 +37 6-step 관측용 fixture 파일을 만든다.

    실 schedule_history / 실 4-tuple / 실 cron 무사용 — 전부 sandbox 내부.
    dispatch-fired marker 의 ``callback_policy_a.fallback_callback_cron_id``
    = ``target_cron_id`` 로, binding-valid 경로에서 +37 binding cross-check
    가 통과하도록 합성한다 (전부 격리 mock — 실 callback 4-tuple 무사용).
    Tr   z.dispatch-fired.jsondispatch_fired_v1zdispatch firedr   r   )standardizednormal_callback_cron_idfallback_callback_cron_idfallback_roler   anu_key)r   marker_kindr   r   callback_policy_arZ   r[   .result.jsonanu_delegation_result_v1r   PASS)r   r   r   classificationz
.report.mdz# ut    report

normal collector PASS — durable-success, wired via operational_collector_wiring (read-only observation).
z.collector-result.jsoncallback_ack_dedupe_v1)r   r   r   ack_acquiredfallbackF)r'   r   r   rolefiredrF   r   r   rK   dispatch_fired_marker_pathresult_json_pathreport_pathcollector_result_marker_pathfallback_cancelled_marker_pathz.fallback-cancelled.jsoncancel_lock_pathz.cancel.lockseam_audit_pathz.plus23-cancel-audit.jsoncancel_audit_pathz.plus41-cancel-audit.jsonr   claimsack_pathz	.ack.jsoncallback_contractcompletion_callback_contract_v1)r   r   r   r   )	r   r   
write_textr   dumps_FC_FALLBACK_ROLE_FC_ANU_CHAT_ID_FC_ANU_KEYr   )	rK   r   r   r   r   dfmrjrepcrms	            r!   materialize_scenarior    s    7mGMM$M.
wi34
4CNN

-/$1"
 %)/<1?%6.*&	
& )  , 
gYl+	+BMM

4"%"(		
   
 wiz*
*CNN
WI L 	L  
 wi56
6CNN

2""( $		
   
  %"&" 	
7. 	7 	%c	
 	B 	s 	' 	)'I-
.+/ 	G	&>> 	7y0I%JJ 	W'2K'LL 	Wx' 	G	33 	7)7
& 	,'( 	2) r4   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<    ee      Zded<   dZded<    ee	      Z
ded<   ddZy)SixStepObservationuO   §3.1 6-step 관측 결과 (전부 mock/fixture 유래, +37 entrypoint 경유).r8   step1_normal_successstep2_wired_entrypoint"step3_operational_collector_wiring!step4_run_operational_cancel_seam!step5_live_verifier_five_and_pass%step6_bound_fallback_remove_and_auditall_passre   r   remove_call_countbinding_valid)default_factoryr   cancel_auditT	mock_onlylistnotesc                    | j                   | j                  | j                  | j                  | j                  | j
                  dS )N)step1step2step3step4step5step6)r  r  r  r  r  r  )r   s    r!   step_mapzSixStepObservation.step_map  sB    ..00<<;;;;??
 	
r4   Nr5   )r9   r:   r;   r<   __annotations__r   r   r$  r%  r&  r'  r/  r=   r4   r!   r  r    sm    Y  (,,'++'+++//Nt4L$4It-E4-
r4   r  )r   r   five_condition_resultsremove_attemptedremove_resultskip_reasonalready_removed_or_missingnormal_success_unchanged)c1_task_id_matchc2_chat_id_ownedc3_role_fallbackc4_marker_id_crosscheck c5_pending_not_fired_not_removedc                     t         fdt        D              sy j                  d      xs i t        fdt        D              sy j                  d      du S )Nc              3  &   K   | ]  }|v  
 y wrA   r=   )r.   rj   audits     r!   r0   z#_audit_schema_ok.<locals>.<genexpr>3  s     8aqEz8r   Fr1  c              3  &   K   | ]  }|v  
 y wrA   r=   r.   rj   fives     r!   r0   z#_audit_schema_ok.<locals>.<genexpr>6  s     -QqDy-r   r6  T)all_AUDIT_REQUIRED_KEYSr(   
_FIVE_KEYS)r>  rA  s   `@r!   _audit_schema_okrE  2  sO    8#78899-.4"D-*--99/0D88r4   c               x   t        t        | d         | d   || d   | d   | d   | d   | d   | d   ||| d	   | d
   | d   | d         }|j                  xs i }|j                  d      xs i |j                  j
                  t        j                  k(  xr t        |j                        }t        |j                        xr |j                   }t        |j                        xr |j                  du}	| d   }
t        |
      j                         r*t!        d t        |
      j#                  d      D              ng }t        |j$                        xr t'        |      dk(  }t              xr t)        fdt*        D              }t-        |j.                        }t'        |      dk(  xr0 |d   d   | d   k(  xr  |d   d   du xr |j                  d      dk(  }|j1                  | d          }t        |j2                        xr# |j4                  du xr |xr |xr t7        |      }|j9                  | d         }t)        |||	|||f      xr |}t;        |||	||||t'        |      t'        |      t        |j                        |dddd|j<                   dd | d!d"|j                  d#       g$      S )%u  §3.1 6-step 을 결정적으로 passive 관측한다 (mock-only).

    +37 표준 wired entrypoint ``run_wired_normal_completion_callback_collector``
    에 주입 Fake/Spy + 격리 FS 만 물려 1회 실행한 뒤, 그 공개 결과를
    §3.1 6-step 으로 매핑한다. 실 cron-list/cron-remove/schedule_history/
    4-tuple 무접촉, +37/+25/+23/frozen 무수정 (read-only consume).
    r   r  r  r  r  r  r   r	  r  r  r  r  )bindingr  r  r  r  r   r	  cron_listerremoverr  r  r  r  r1  Nc              3  4   K   | ]  }|j                     y wrA   )name)r.   rT   s     r!   r0   z#observe_six_step.<locals>.<genexpr>q  s     K!qvvKs   z*.seam-claim.*.jsonr$   c              3  D   K   | ]  }j                  |      d u   yw)TNr-   r@  s     r!   r0   z#observe_six_step.<locals>.<genexpr>w  s     DADHHQK4/Ds    r   r/   r   rB   Fr3  	CANCELLEDTu   +37 wired entrypoint(run_wired_normal_completion_callback_collector) 공개 API 에 주입 Fake/Spy — read-only consume, 1 byte 수정 0u   PRIMARY 경유: entrypoint → operational_collector_wiring(+25) → run_operational_cancel_seam(+23) → live verifier 5조건 ANDu[   실 cron-list/cron-remove/schedule_history/4-tuple 무접촉, fallback 발화 0 (spy reads=)zclaim artifact(O_EXCL) u    — exact-once 명시 keyu_   디커플: collector_result 는 seam/cron-remove 결과와 무관 — normal_success_unchanged=r6  )r  r  r  r  r  r  r   r   r!  r"  r$  r%  r'  )r   r   r$  r(   collector_resultr   r   r   r8   durable_successr"  binding_invalid_reasons&wired_via_operational_collector_wiringwiring_resultr   r]   sortedglobseam_invokedr   rB  rD  r&  r   r3   cron_remove_invokedfallback_preservedrE  rd   r  rM   )scenariorG  listerrI  historyresr>  s1s2s3r   claim_filess4s5remove_calls
removed_okcrosscheck_absents6no_firer   rA  s                       @r!   observe_six_steprh  ;  sD    !OHY/0#+,H#I!"45]+%-*&
 ;'"#67'/,(
 ""45 !23"#67'!C* "E99-.4"D 	++~/B/BB 	&$$% 
 
c	 	D)D)D%DB 	S778 	*T) 
 %I 	?!!# 	KtI334IJKK 
 
c		9C$4$9B	d	DDDDB&LLQ 	6OI&(3C*DD	6OI&%/	6 IIo&+5	  #--h7G.HIIS$$% 	$""e+	$	$ 	$ U#  )9 :;GBBB+,8H!+-*,*,.0k*l+3,,-M,,3MM?!=%k]2LM((-		2L(M'NP
 r4   c                   t        t        | d         | d   || d   | d   | d   | d   | d   | d   ||| d	   | d
   | d         S )u#  binding-invalid (missing/marker mismatch) 경로 passive 관측.

    +37 §2.5 — seam 미진입·cron-remove 0·fallback 보존·BINDING_* cancel-
    audit·디커플(collector_result 그대로) 을 read-only 로 확인하기 위한
    헬퍼. 실 cron 무접촉 (주입 Fake/Spy).
    r   r  r  r  r  r  r   r	  r  r  r  )rG  r  r  r  r  r   r	  rH  rI  r  r  r  )r   r   )rY  rG  rZ  rI  s       r!   observe_binding_invalidrj    s     :HY/0#+,H#I!"45]+%-*&
 ;'"#67'/,(
 ""45 !23% r4   c               .    t        | t        |            S )u   +37 ``validate_normal_callback_binding`` read-only 호출 (무수정).

    harness 가 binding 무결성을 사전 점검하는 passive reference 경로.
    )r  )r   r   )rG  r  s     r!   rQ  rQ    s     ,D1K,L r4   c               "   t        |       } | j                  dd       | t         dz  }| t         dz  }|j                  t	        j
                  |dd      d	       |j                  t         d
d	       t        |      t        |      dS )u  정상종료 시 result.json + .done 만 산출 (9-R / callback (a) +41 변형).

    executor 는 실 normal-collector cron 자가등록 0 — 회수는 ANU-registered
    fallback callback / normal completion callback 이 result.json/.done
    존재로 정상수렴 판정한다. 본 함수는 화이트리스트 경로
    (``task-2553+41.result.json`` / ``task-2553+41.done``) 만 기록하며
    실 cron 등록 0.
    Tr   r   z.doneF   )r   indentrZ   r[   u    DONE — normal convergence marker (real cron self-register 0; ANU normal/fallback callback recovers via result.json/.done presence)
)r   done)r   r   r   r  r   r  r7   )
events_dirresult_packetr  dns       r!   emit_normal_convergence_markersrs    s     j!JTD1	+,L9	9B	+,E2	2BMM

=uQ?   MM
 , 	, 	   r7CG44r4   )r   r   
FROZEN_SHAWIRED_ENTRYPOINT_SRCPLUS25_WIRING_SRCr~   r   r   r   r   r?   rH   r   r   r   r   r   r   r  r  rh  rj  rQ  rs  )rK   r   r6   None)r   r7   r6   r7   )r   r   r   r7   r6   r8   )r   r   r   r7   r6   r   )r   r7   r6   r
   )r   r7   r   r7   r   r7   r   r7   r   r7   r   re   r6   r   )
rK   r   r   r7   r   r7   r   zOptional[str]r6   r   )r>  r   r6   r8   )rY  r   rG  r   rZ  r   rI  r?   r[  rH   r6   r  )
rY  r   rG  r   rZ  r   rI  r?   r6   r   )rG  r   r  r   r6   r&  )rp  r   rq  r   r6   r   )=r<   
__future__r   r   r   rz   r   dataclassesr   r   pathlibr   typingr   __file__rP   parentr   r   rt  ru  rv  r~   r   r   r   (utils.anu_delegation_completion_callbackr
   r   r   r   r  r   r  r   r  r   5utils.normal_completion_callback_collector_entrypointr   r   r   r   r   r?   rH   r   r   r   r   r   r   r  r  rC  rD  rE  rh  rj  rQ  rs  __all__r=   r4   r!   <module>r     s  ,Z #   	  (  N""$++2299	G#&MMF  NN  '*KK  CD 23  $  
 L L8	O 	O'2 '2Z_6J>
8@0 *$1' 	
 "   8 &()-ii i 	i 'i 
i^ 
 
 
8	 
9jj #j 	j
 j  j jZ   #  	 
    F" !% 
	55(,5	58r4   