
    jY                       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 ddl	Z	ddl
Z
 ee      j                         j                  j                  j                  Z ee      ej                   v r!ej                   j#                   ee             ej                   j%                  d ee             ddlmZ ddlmZ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'  ejP                  ed	z  d
z  jS                  d            Z*dZ+ddddddddddddZ,dZ-d=dZ. e
j^                  d      d        Z0d Z1 e
j^                  d      d         Z2 e
j^                  d      d!        Z3d>d"Z4d?d#Z5 e
j^                  d      d$        Z6d@d%Z7dAd&Z8dBd'Z9d(d)	 	 	 	 	 	 	 	 	 dCd*Z:d+dd,dDd-Z;d.d/ddd0d+d1	 	 	 dEd2Z<d3 Z=d4 Z>d5 Z?d6 Z@d7 ZAd8 ZBd9 ZCd: ZDd; ZEd< ZFy)Fu  tests/regression/test_cancel_on_success_live_adoption_2604.py

task-2604 Track A — CANCEL_ON_SUCCESS LIVE ADOPTION regression (§1~§12).

문서-only 금지: 본 regression 은 **실 모듈 + 실 entrypoint** 를 실행한다
(mock-only FAIL — 모듈/entrypoint 자체를 mock 으로 대체하면 §11 meta-가드가
FAIL). cron-list/remove DI 만 전용 격리 FakeCronWorld/WorldSpyRemover 주입
(실 cron-list·실 cron-remove·실 schedule_history 무접촉). 실 subprocess
즉시 FAIL 차단. 실 shared callback_4tuple_index.jsonl(track 미소유 공유
durable 인프라) 은 전 케이스 byte-0 — self-proof 는 격리 tmp ledger 만
구성. live /home/jay/workspace git tracked HEAD/branch/ref 전후 assertEqual.

§ 매핑:
  1  properly-bound 격리 ledger + 5조건 AND PASS → CANCEL_ADOPTED
     (cron-remove 실 호출[주입 spy]·fallback_cancelled·cron_removed)
  2  spy "failed" → +9a REMOVE_FAILED_WARNING → CANCEL_FAILED_CLASSIFIED
     (normal success decouple 유지 — 무효화 0)
  3  ownership mismatch(task_id) → unrelated cron 제거 방지 → NON_BLOCKING
  4  no ledger record → 미식별 → NON_BLOCKING (보존)
  5  live 5조건 미충족(entry fired) → seam SKIP_LIVE → NON_BLOCKING
  6  실 entrypoint CLI main() self-proof → exit0·audit/decision/result
     산출·schema valid·CANCEL_ADOPTED
  7  decouple 불변: 전 분류에서 normal_success_unchanged=True
  8  unrelated cron 미접촉: spy 는 bound target id 로만 호출
  9  frozen +9a/+23/+25/+44/+45/+48/anchor byte-0 무회귀
  10 shared callback_4tuple_index.jsonl track-scoped invariant — 이 track
     이 task-2604 row append 0 + pre-existing line 변조 0 + append-only
     성장(기존 prefix byte 보존). 정상 +53/+54 sanctioned cross-track
     append 는 무FAIL (글로벌 SHA 하드핀 폐기 — task-2604+1 HOLD remediation)
  11 mock-only FAIL meta-가드 (실 모듈/실 entrypoint 실행 입증)
  12 raw ANU key adoption-audit 노출 0
    )annotationsN)Path)ADOPT_CANCEL_ADOPTEDADOPT_CANCEL_FAILED_CLASSIFIEDADOPT_NON_BLOCKINGCancelOnSuccessAdoptionResult#run_cancel_on_success_live_adoption)Callback4TupleRegistry)FakeCronWorldProperlyBound4TupleWorldSpyRemoverbuild_properly_bound_4tuple)CallbackInputCallbackTypeschemasz0cancel_on_success_live_adoption_2604.schema.jsonutf-8encodingc119085addb0f8b7@ea33514d2289f0097a5344d2d5bbc0735b6385c3bbfe03aa5c6d9f24f970bf0a@774d550628410d36962c23a7663c4b6dbf72789de7c7fd940871e9ad8280e5ab@fa1421fef4faf2d6f4dc0cb1ce0d026f5c7086b046056e39dd343fb629b3af9b@0c5e10e616fe8919492f6c774045e8ff12f3ebfd203ecd25f35ad9ebd58c14d9@0f1900f46f60fe504ec89b5c84967506e15250d71d6f413b31d805c783a613fb@2ef661c49128ec6f1bd96bfbe6c1a227317e87ae31bf6deac025c66fd0e96d37@6bba56bd0dfc97e9155244251e00cdf3dcef2981a75dc5e2b966aa0b746d8d13@14d6a0fb29e9de9276fcbadde832fe348e02333d21d57f29bd583407f1542590@41af1b601f42f337301ca7a45c185349385dc625ca02df43810541baa9953db9@0636b99cf5d7e69d880c426bd03c0ff77e97987d1780912c05cc23899b832c6f@83b3e307c8207c76a3e311c408aab4951373bd317896e51687d3007907b0c3d4)z'anu_v3/cancel_on_success_live_wiring.pyz"anu_v3/callback_4tuple_registry.pyz$anu_v3/cancel_on_success_live_e2e.pyzanu_v3/cancel_audit_writer.pyz anu_v3/artifact_root_resolver.pyz,utils/completion_callback_fallback_cancel.pyz!utils/live_cron_state_verifier.pyz4utils/completion_callback_operational_cancel_seam.pyz8utils/normal_completion_callback_collector_entrypoint.pyz%utils/operational_collector_wiring.pyz+utils/anu_delegation_completion_callback.pyz)memory/events/callback_4tuple_index.jsonlc                r    t        j                  t        | z  j                               j	                         S )N)hashlibsha256	WORKSPACE
read_bytes	hexdigest)rels    Q/home/jay/workspace/tests/regression/test_cancel_on_success_live_adoption_2604.py_shar)   }   s'    >>9s?6689CCEE    T)autousec                8    d }| j                  t        d|       y )Nc                     t        d      )Nux   실 subprocess 호출 금지 (회장 §5) — 전용 격리 FakeCronWorld/WorldSpyRemover 만, 실 운영 cron 무접촉)AssertionError)aks     r(   _boomz%_block_real_subprocess.<locals>._boom   s    =
 	
r*   run)setattr
subprocess)monkeypatchr1   s     r(   _block_real_subprocessr6      s    
 
E51r*   c                 R   t         dz  } | dz  j                  d      j                         }|j                  d      r|j	                  dd      d   n|}|j                  d      r| |z  nd }|r3|j                         r#| |z  j                  d      j                         n|}|||fS )Nz.gitHEADr   r   zref:zref:    )r$   	read_textstrip
startswithsplitexists)git_dirhead_txtbranchref_pathshas        r(   _git_refrD      s    & G& ++W+=CCEH v& 	w"1% 
 $,#6#6v#>wDH ) 
6	$$g$6<<> 
 fc""r*   c               #  P   K   t               } d  t               | k(  sJ d       y w)Nu*   git HEAD/branch/ref 변경 감지 (위반))rD   )befores    r(   _git_ref_invariantrG      s&     ZF	:M!MMs   $&c               #     K   t         D  ci c]  } | t        |        }} d  t         j                         D ]/  \  } }||    |k(  s
J |  d       t        |       |k(  r'J |  d        y c c} w w)Nu    baseline drift (pre §9)u    byte-0 위반 (post §9))FROZEN_SHA256r)   items)r'   rF   pinneds      r(   _frozen_byte0_invariantrL      s     (56c49n6F6	$**, FVc{f$G-F&GG$CyF"Ese+D$EE"F 7s   	A0A+A A0A0c                 \    t         t        z  j                  d      j                  d      S )uP   실 shared ledger 의 현재 라인 스냅샷 (keepends — byte 단위 비교).r   r   T)keepends)r$   SHARED_INDEX_RELr:   
splitlines r*   r(   _shared_index_linesrR      s*     
%	%	G	$	T	"r*   c                    	 t        j                  |       }t	        |j                  dd            }|dk(  xs$ |j                  d      xs |j                  d      S # t        t        f$ r Y yw xY w)uv  이 track(task-2604) 소유 row 인가.

    공유 인프라(callback_4tuple_index.jsonl)엔 본 track 직접 write 0 이
    어야 하므로, append 된 라인 중 task_id 가 task-2604(또는 -ut/+N 변형)
    인 것이 1건이라도 있으면 track 직접 write 위반. 다른 track(2606/2607/
    2609 등)의 sanctioned +53/+54 durable-success append 는 비대상.Ftask_id z	task-2604z
task-2604-z
task-2604+)jsonloads
ValueError	TypeErrorstrgetr<   )linerectids      r(   _is_task2604_owned_rowr_      st    jj cggi$
%C{ 	(>>,'	(>>,' 	" s   A A/.A/c               #     K   t               } t        |       }d t               }t        |      |k\  sJ d       |d| | k(  sJ d       ||d D cg c]  }t        |      s| }}|rJ d|d       yc c}w w)u  §10 (task-2604+1 HOLD remediation) — track-scoped invariant.

    글로벌 callback_4tuple_index.jsonl SHA 동일성 하드핀을 폐기한다(정상
    +53/+54 sanctioned cross-track append 를 FAIL 처리하던 spec §4/§8
    9-R.1 자가모순 해소). 본 track 검증:

      (a) 이 track 이 shared ledger 에 task-2604 row 를 append 0
      (b) pre-existing line 변조 0 (기존 prefix byte 보존)
      (c) 파일은 append-only 로만 성장 (축소·prefix 변형 = FAIL)

    sibling/authorized +53/+54 durable-success append(다른 track 소유)는
    비대상 — 무FAIL. isolated /tmp ledger self-proof 는 본 fixture 와
    독립(테스트 본문 — cron_removed/spy_calls 그대로 유지).
    Nu   shared callback_4tuple_index.jsonl 축소/재작성 감지 — append-only 위반 (§10 / 회장 §3 — append-only 위반은 FAIL)uo   shared callback_4tuple_index.jsonl pre-existing line 변조 — 기존 prefix 보존 위반 (§10 / 회장 §3)ul   track 직접 write 0 위반 — task-2604 소유 row 가 shared callback_4tuple_index.jsonl 에 append 됨: uN    (§10 / 회장 §4 — track 미소유 공유 인프라, +53/+54 소관 only))rR   lenr_   )rF   n_beforeafterln	offendings        r(   $_shared_index_track_scoped_invariantrf      s       !"F6{H	!Eu:! 	P!
 (v% 	:%
 $HI.M2H2LMIM 	77@m DX	X=y Ns   AA;A6"A6&A;c                R    t        | ddt        j                  dddddddd	id

      S )Ndev-simDISP2604NORM2604ok	completedT)result_jsonreportfrozen_anchormatch)
rT   executordispatch_cron_idcallback_typecallback_cron_idcron_statustask_statusrequired_closeout_markerspreservation_anchors
dev_sunset)r   r   NORMAL)rT   s    r(   _inpr{      s=    #"))#26$"G-w7 r*   c           
     (    ddddd|ddt         d| d	S )
Nz2026-05-19T00:00:00Zzdispatch firedri   Trj   fallback   L5: )standardizednormal_callback_cron_idfallback_callback_cron_idfallback_rolechat_idanu_key)ts_utcmarker_kindrr   callback_policy_arT   )ANU_KEY_SECRET)rT   fb_crons     r(   _markerr      s1    ('& '1)0'!%
  r*   c           	        | j                  dd       | dz  }|j                  t        j                  t	        ||            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       ||||| dz  | dz  | dz  dS )NT)parentsexist_okzdispatch-fired.jsonr   r   zresult.jsonanu_delegation_result_v1rl   PASS)schemarT   statusclassificationz	report.mdz# z
PASS durable-success
zcollector-result.jsoncallback_ack_dedupe_v1)r   rT   r   ack_acquiredzfb-cancelled.jsonzcancel.lockzplus23-cancel-audit.json)dispatch_fired_marker_pathresult_json_pathreport_pathcollector_result_marker_pathfallback_cancelled_marker_pathcancel_lock_pathseam_audit_path)mkdir
write_textrV   dumpsr   )tmprT   r   dfmrjrepcrms          r(   _materializer     s   IIdTI*
%
%CNN4::ggw787NK	}	BMM

4"%"(		
   
 
CNNRy 89GNL
'
'CNN

2""( $		
   
 '*(+*-0C*C-/!;; r*   r}   )rolec          
     h    | dz  }t        |      }t        |ddddd||      }t        ||d	       |S )
u   격리 tmp ledger 에만 properly-bound 4-tuple 구성 (실 shared index
    무접촉 — +44 guard + +47 write-back, read-only consume API).z$isolated_callback_4tuple_index.jsonlzDSP-2604-PBri   rh   
6937032012rj   )rT   dispatch_idrr   rq   r   normal_collector_cron_idr   r   z2026-05-19 09:00 KST)ts_kst)r
   r   r   )r   rT   r   r   ledgerregistrytups          r(   _build_isolated_ledgerr   9  sO    
 99F%f-H
!#!+")	C  #6LMMr*   F)firedextrac               R    || dd|ddg}|r|j                  |       t        |      S )Nr~   r}   FidrT   r   r   r   removed)extendr   )rT   r   r   r   entriess        r(   _worldr   N  s>     !	
	G u!!r*   task-2604-utUT2604FBr   )rT   r   r   world
spy_statusworld_firedc                  t        | dz  ||      }|xs t        |||      }t        ||      }t        t	        |      | dz  |d   |d   |d   |d   | dz  || d	z  |j
                  ||d
   |d   |d   d|d      }	|	||fS )Nclaim)r   )r   z
ack.markerr   r   r   r   zadoption-audit.jsonr   r   r   completion_callback_contract_v1)r   r   )r   r   r   r   	claim_dirledger_pathadoption_audit_pathcron_listerremoverr   r   r   callback_contract)r   r   r   r	   r{   lister)
r   rT   r   r   r   r   r   pathsspyress
             r(   _runr   ^  s     w9E@VGWK@E
%

3C
-Wl#()E#F12-(%*+I%J-"77LL',-M'N12/07)0
C( U?r*   c                   t        | dd      }t        | |      \  }}}|j                  t        k(  sJ |j                  du sJ |j
                  j                  du sJ |j
                  j                  du sJ |j                  dk(  sJ |j                  du sJ |j                  du sJ |j                  du sJ t        |j                        dk(  sJ |j                  d   d   dk(  sJ t        d	 |j                  D              sJ |j                   du sJ |j"                  du sJ t%        j&                  |j(                  t*               y )
Nr   r   r   TLOOKUP_VERIFIEDr9   r   cron_idc              3  :   K   | ]  }|d    dk(  xr |d     yw)r   r   r   NrQ   .0es     r(   	<genexpr>z4test_s1_cancel_adopted_end_to_end.<locals>.<genexpr>  s*      34$:.!I,.   )r   r   adoption_classificationr   cancel_adoptedidentification
identifiedownership_all_satisfiedlookup_statusseam_invokedcron_remove_invokedfallback_cancelledra   callsanyr   normal_success_unchangeddecouple_invariant_held
jsonschemavalidateadoption_auditSCHEMAtmp_pathr   r   r   r   s        r(   !test_s1_cancel_adopted_end_to_endr     sd   #HnjIF8F3OCe&&*>>>>%%%((D00055=== 1111t###""d***!!T)))syy>Q99Q<	"j000 8=    ''4///&&$...**F3r*   c                   t        | dd      }t        | |d      \  }}}|j                  t        k(  sJ |j                  du sJ |j
                  dk(  sJ t        |j                        dk(  sJ |j                  du sJ |j                  du sJ |j                  du sJ t        j                  |j                  t               y )Nr   r   failed)r   r   TREMOVE_FAILED_CLASSIFIEDr9   )r   r   r   r   cancel_failed_classifiedremove_resultra   r   r   r   durable_successr   r   r   r   r   s        r(   *test_s2_remove_failed_classified_decoupledr     s    #HnjIF8FxHOCe&&*HHHH''4/// ::::syy>Q''4///&&$...$&&&**F3r*   c                h   t        | dd      }t        | d|      \  }}}|j                  t        k(  sJ |j                  du sJ |j
                  du sJ t        |j                        dk(  sJ |j                  du sJ |j                  du sJ t        j                  |j                  t               y )Nztask-2604-OTHERr   r   )rT   r   TFr   )r   r   r   r   non_blocking_markedr   ra   r   fallback_preservedr   r   r   r   r   r   s        r(   $test_s3_ownership_mismatch_preservesr     s    ##ZF 8^FKOCe&&*<<<<""d***""e+++syy>Q!!T)))''4///**F3r*   c                   | dz  }|j                  dd       t        | |      \  }}}|j                  t        k(  sJ |j                  j
                  du sJ |j                  j                  dk(  sJ t        |j                        dk(  sJ |j                  d	u sJ t        j                  |j                  t               y )
Nzempty_ledger.jsonlrU   r   r   r   FNO_LEDGER_RECORDr   T)r   r   r   r   r   r   ident_statusra   r   r   r   r   r   r   )r   emptyr   r   _s        r(   "test_s4_no_ledger_record_preservesr     s    ++E	R'*x.KCa&&*<<<<((E111**.@@@@syy>Q''4///**F3r*   c                H   t        | dd      }t        | |d      \  }}}|j                  t        k(  sJ |j                  du sJ t        |j                        dk(  sJ |j                  du sJ |j                  du sJ t        j                  |j                  t               y )Nr   r   T)r   r   Fr   )r   r   r   r   r   ra   r   r   r   r   r   r   r   r   s        r(   *test_s5_live_five_condition_fail_preservesr     s    #HnjIF8FEOCe&&*<<<<""e+++syy>Q!!T)))''4///**F3r*   c                   | dz  }| dz  }| dz  }|j                  t        d|       |j                  t        d|       |j                  t        d|       |j                  t        d|        t        j                  dd	d
t        |      g      }|dk(  sJ |j	                         r |j	                         r|j	                         sJ t        j                  |j                  d            }t        j                  |t               |d   t        k(  sJ |d   du sJ |d   du sJ t        j                  |j                  d            }|d   dk(  sJ |d   du sJ y )Nz$task-2604.cancel-adoption-audit.jsonztask-2604.decision.jsonztask-2604.result.jsonADOPTION_AUDIT_OUTDECISION_OUT
RESULT_OUTEVENTSz--modez
self-proofz--outr   r   r   r   r   Tr   r   rk   r   )r3   CLImainrZ   r>   rV   rW   r:   r   r   r   r   )r   r5   outdecisionresultrcauditr   s           r(   "test_s6_real_entrypoint_self_proofr    sZ   
;
;C33H//F137^X6\62Xx0	8\7CH=	>B7N7::<HOO-&--/AAJJs}}g}67Ev&*+/CCCC+,444*+t333	F$$g$6	7Bh<44'''r*   c                J   t        | dz  dd      }t        | dz  d|      \  }}}t        | dz  dd      }t        | dz  d|d      \  }}}t        | d	z  d
| d	z  dz        \  }}}|||fD ]5  }|j                  du sJ |j                  du sJ |j                  d   du r5J  y )Nr/   r   FB1)r   r   bFB2r   )r   r   r   cFB3znoledger.jsonlTr   )r   r   r   r   r   )r   ledr_adoptr   led2r_failr_nbrs           r(   &test_s7_decouple_invariant_all_classesr    s    
 C
GCCsCMGQ!(S..%HD3dxLFAq 33!11JD!Q
 vt$ D))T111((D000 :;tCCCDr*   c                $   t        | dd      }t        dddddddddg	      }t        | ||
      \  }}}|j                  t        k(  sJ |j
                  D cg c]  }|d   	 c}dgk(  sJ t        d |j                  D              rJ y c c}w )Nr   r   UNRELATED-CRON-9z
task-OTHERr~   r}   Fr   )r   )r   r   r   c              3  :   K   | ]  }|d    dk(  xr |d     yw)r   r  r   NrQ   r   s     r(   r   z3test_s8_unrelated_cron_untouched.<locals>.<genexpr>  s.       	
$%%6!I,6r   )r   r   r   r   r   r   r   r   )r   r   r   r   r   r  s         r(    test_s8_unrelated_cron_untouchedr    s    #HnjIF )'%" 	
E 8F%@OCe&&*>>>>"%)),QAiL,<<<      -s   Bc                   t        t        j                        j                         t        dz  dz  k(  sJ t        t
        j                        j                         t        dz  dz  k(  sJ t        | dd      }t        | |      \  }}}t        |t              sJ |j                  J |j                  j                  dd	      j                  d
      sJ t        |d      r|j                  sJ y y )Nanu_v3z'cancel_on_success_live_adoption_2604.pyscriptsz+run_cancel_on_success_live_adoption_2604.pyr   r   r   r   rU   ztask-2553+45&wired_via_operational_collector_wiring)r   	ADOPT_MOD__file__resolver$   r  r   r   
isinstancer   live_resultunderlying_cancel_auditr[   r<   hasattrr  )r   r   r   r   r   s        r(   test_s11_real_module_not_mockr%    s   	""#++-HHH   %%'I MM   $HnjIFx/KCac8999??&&&&&**8R8CC   :A5:355   6r*   c                    t        | dd      }t        | |      \  }}}|j                  j                         D ci c]  \  }}|dk7  r|| }}}t        t        j                  |d      vsJ y c c}}w )Nr   r   r   r#  F)ensure_ascii)r   r   r   rJ   r   rV   r   )r   r   r   r   r0   vadoption_views          r(   *test_s12_no_raw_anu_key_in_adoption_fieldsr*  +  s    #HnjIFXf-ICA &&,,.Aq)) 	
1M 
 M!NNNNs   A1)r'   rZ   returnrZ   )r+  z	list[str])r\   rZ   r+  bool)rT   rZ   r+  r   )rT   rZ   r   rZ   r+  dict)r   r   rT   rZ   r   rZ   r+  r-  )
r   r   rT   rZ   r   rZ   r   rZ   r+  r   )rT   rZ   r   rZ   r   r,  )r   r   r+  zDtuple[CancelOnSuccessAdoptionResult, WorldSpyRemover, FakeCronWorld])G__doc__
__future__r   r"   rV   r4   syspathlibr   r   pytestr  r   parentr$   rZ   pathremoveinsert+anu_v3.cancel_on_success_live_adoption_2604$cancel_on_success_live_adoption_2604r  r   r   r   r   r	   anu_v3.callback_4tuple_registryr
   !anu_v3.cancel_on_success_live_e2er   r   r   r   0scripts.run_cancel_on_success_live_adoption_2604(run_cancel_on_success_live_adoption_2604r  (utils.anu_delegation_completion_callbackr   r   rW   r:   r   r   rI   rO   r)   fixturer6   rD   rG   rL   rR   r_   rf   r{   r   r   r   r   r   r   r   r   r   r   r  r  r  r%  r*  rQ   r*   r(   <module>r?     s|  @ #    
   N""$++2299	y>SXXHHOOC	N# 3y> " ?   ?
 

	
<	= ii!
 $
 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	KA"P ? F 2 2#" N N F F& # #L"&T ;E	&)47	* 9>T "& 
!	! J!J4.44 	44(,D&4,	Or*   