
    4jD                    X   d Z ddlmZ ddlZddlmc 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 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mZmZ ddlmZ ddlmZm Z m!Z! edz  d	z  Z"ed
z  dz  Z#dZ$d)dZ% G d d      Z& G d d      Z' ejP                  d      d        Z)d Z* ejP                  d      d        Z+d*dZ,d+dZ-ej\                  dd,dZ/d Z0d Z1ejd                  jg                  dg d      d        Z4d  Z5d! Z6d" Z7d# Z8d$ Z9d% Z:d& Z;e<d'k(  r e= ej|                  ed(g            y)-u  tests/regression/test_operational_collector_wiring_2553plus25.py

task-2553+25 — OPERATIONAL COLLECTOR WIRING regression.

§5.3 결선 경로 단위 ①~⑦ — 전건 PASS:
  ① durable-success → seam 1회 호출
  ② verifier 5조건 PASS → remove called
  ③ 각 mismatch/SKIP → preserve, remove 0
  ④ cron-remove 실패 → normal collector success 불변 (디커플)
  ⑤ 기존 DUPLICATE_CALLBACK_IGNORED 무회귀 + 비-PASS seam 미진입
  ⑥ frozen anchor byte-0 (sha 전후 동일) + wiring 모듈 frozen 무수정 import
  ⑦ seam 중복호출 0 / idempotent (동시 2호출 → 1 invoke · 1 no-op)

100% offline. 실 callback cron / cokacdir subprocess / network / git mutation 0.
모든 cron-list = 주입 fake lister, 모든 cron-remove = 주입 fake remover.
실 subprocess 호출 시 즉시 FAIL (차단 spy). 실 운영 cron 실제 삭제 0
(§6 / 9-R.4). live `/home/jay/workspace` git tracked HEAD/branch/ref 전후
assertEqual (§6 / 9-R.5 — repo root 기준).
    )annotationsN)Path)CallbackInputCallbackTypeClassification)RemoverResult)OperationalSeamParamscompute_event_id-run_operational_completion_callback_collectormemoryfixturesutilsz%anu_delegation_completion_callback.py@83b3e307c8207c76a3e311c408aab4951373bd317896e51687d3007907b0c3d4c                `    t        j                  t        |  dz  j                  d            S )Nz.jsonutf-8encoding)jsonloadsFIXDIR	read_text)names    T/home/jay/workspace/tests/regression/test_operational_collector_wiring_2553plus25.py_fxr   4   s*    ::v4&.9979KLL    c                      e Zd ZddZddZy)FakeCronListerc                .    || _         || _        d| _        y )Nr   )entriesstatuscalls)selfr   r    s      r   __init__zFakeCronLister.__init__9   s    
r   c                    | xj                   dz  c_         | j                  dk7  r| j                  g i dS dt        | j                        ddidS )N   ok)r    r   rawfakeT)r!   r    listr   )r"   s    r   __call__zFakeCronLister.__call__>   sF    

a
;;$"kkbDD4+=vtnUUr   N)r&   )returndict__name__
__module____qualname__r#   r*    r   r   r   r   8   s    
Vr   r   c                  $    e Zd ZdddZddddZy)	
SpyRemoverc                     || _         g | _        y )N)r    r!   )r"   r    s     r   r#   zSpyRemover.__init__F   s    
r   T)dry_runc                   | j                   j                  ||d       t        | j                  d| j                         S )Ncron_idr5   zfake:)r    detail)r!   appendr   r    )r"   r8   r5   s      r   r*   zSpyRemover.__call__J   s5    

g'BCDKK%}8MNNr   N)removed)r    str)r8   r<   r5   boolr+   r   r-   r1   r   r   r3   r3   E   s     9= Or   r3   T)autousec                8    d }| j                  t        d|       y )Nc                     t        d      )NuK   실 subprocess 호출 금지 (§6 9-R.4) — 주입 fake lister/remover 만)AssertionError)aks     r   _boomz%_block_real_subprocess.<locals>._boomQ   s    Y
 	
r   run)setattr
subprocess)monkeypatchrD   s     r   _block_real_subprocessrI   O   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%   )	WORKSPACEr   strip
startswithsplitexists)git_dirhead_txtbranchref_pathshas        r   _git_refrV   Y   s    & G& ++W+=CCEH.6.A.A&.IX^^GQ'*xF#+#6#6v#>wDH ) 
6	$$g$6<<> 
 fc""r   c               #  B  K   t               } d  t               }|| k(  }|st        j                  d|fd|| f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      dt        j                         v st        j
                  |       rt        j                  |       nddz  }t        j                  d      dz   d|iz  }t        t        j                  |            d x}}y w)	N==)z)%(py2)s
{%(py2)s = %(py0)s()
} == %(py4)srV   beforepy0py2py4u.   git HEAD/branch/ref 변경 감지 (§6 위반)z
>assert %(py6)spy6)
rV   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgrA   _format_explanation)rZ   @py_assert1@py_assert3@py_format5@py_format7s        r   _git_ref_invariantrl   f   s     ZF	:Q:QQQ:QQQQQQ8QQQ8QQQ:QQQQQQQQQQQQQ!QQQQQQQs   DDc                @   |j                  dd       i }|| d    dz  }|j                  t        j                  | d         d       ||d<   || d    d	z  }|j                  t        j                  | d
         d       ||d<   || d    dz  }|j                  | j	                  dd      d       ||d<   || d    dz  }|j                  t        j                  | d         d       ||d<   || d    dz  |d<   || d    dz  |d<   || d    dz  |d<   |S )NT)parentsexist_oktask_idz.dispatch-fired.jsondispatch_fired_markerr   r   dispatch_fired_marker_pathz.result.jsonresult_jsonresult_json_pathz
.report.mdreport_text report_pathz.collector-result.jsoncollector_result_markercollector_result_marker_pathz.fallback-cancelled.jsonfallback_cancelled_marker_pathz.cancel.lockcancel_lock_pathz.plus23-cancel-audit.json
audit_path)mkdir
write_textr   dumpsget)fxtmppathsdfmrjrepcrms          r   _materializer   m   sk   IIdTI*E
2i=/!56
6CNN4::b!89:WNM*-E
&'	"Y--	-BMM$**R./'MB "E

2i=/,
,CNN266-,wN?E-
2i=/!78
8CNN4::b!:;<wNO,/E
()I788 

*+ !$I|&D DE
2i=/1J KKE,Lr   c                   t        | |      }t        | d   |d   |d   |d   |d   |d   |||d   |d   | j                  d	      
      S )Ntarget_cron_idrr   rt   rw   ry   r|   rz   r{   callback_contract)r   rr   rt   rw   ry   r|   cron_listerremoverrz   r{   r   )r   r	   r   )r   r   listerr   ps        r   _seam_paramsr      ss    RA *+#$%A#B-.m$%&'E%F\?'()I'J-.&&!45 r   callback_typec               6    t        | dd|dddddddd	id

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

    ack 획득 + NORMAL + fallback-only 아님 + 필수 marker 부재 0 + Critical7
    0 + forbidden action 0 + anchor match + chair_gated False + dev_sunset
    True → §9 우선순위 6 PASS.
    zdev2-simDISP2500NORM2500r&   	completedT)rs   reportfrozen_anchormatch)
rp   executordispatch_cron_idr   callback_cron_idcron_statustask_statusrequired_closeout_markerspreservation_anchors
dev_sunset)r   )rp   r   s     r   _pass_inputr      s9     ###26$"G-w7 r   c           	        t        d      }t        d      }t        |d         }t        || ||      }t	        t        |d         | dz  || dz        }|j                  }|j                  }t        j                  }||k(  }	|	s
t        j                  d	|	fd
||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }
dd|
iz  }t!        t        j"                  |            d x}x}x}	}|j$                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t!        t        j"                  |            d x}x}}|j&                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t!        t        j"                  |            d x}x}}|j(                  }d }||u}|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t!        t        j"                  |            d x}x}}|j*                  }d}||k(  }|st        j                  d	|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t!        t        j"                  |            d x}x}}|j,                  }t/        |      }|j0                  } |       }|sddt        j                         v st        j                  t.              rt        j                  t.              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t!        t        j"                  |            d x}x}x}}y )Ntask-2553+25.dry-runr;   live_cron_entriesr   r   rp   ack.jsonclaimsseam_params	claim_dirrX   zv%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.collector_result
}.classification
} == %(py8)s
{%(py8)s = %(py6)s.PASS
}resr   r\   r]   r^   r_   py8assert %(py10)spy10Tisz7%(py2)s
{%(py2)s = %(py0)s.durable_success
} is %(py5)sr\   r]   py5assert %(py7)spy7z4%(py2)s
{%(py2)s = %(py0)s.seam_invoked
} is %(py5)s)is not)z8%(py2)s
{%(py2)s = %(py0)s.seam_outcome
} is not %(py5)sr%   z-%(py2)s
{%(py2)s = %(py0)s.calls
} == %(py5)sr   zassert %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.claim_marker_path
})
}.exists
}()
}r   )r\   py1py3r   r   py9)r   r3   r   r   r   r   collector_resultclassificationr   PASSr`   ra   rb   rc   rd   re   rA   rg   durable_successseam_invokedseam_outcomer!   claim_marker_pathr   rP   )tmp_pathr   spyr   spr   rh   ri   @py_assert7@py_assert5@py_format9@py_format11@py_assert4@py_format6@py_format8@py_assert2@py_assert6@py_assert8@py_format10s                      r   )test_01_durable_success_invokes_seam_oncer      s   	#	$B
Y
CB234F	b(63	?B
7ByM":X%	C E..E.2E2EE.2EEEEE.2EEEEEEE3EEE3EEEEEE.EEEEEE.EEE.EEE2EEEEEEEE&$&$&&&&$&&&&&&3&&&3&&&&&&$&&&&&&&#t#t####t######3###3######t#######'4'4''''4''''''3'''3''''''4'''''''<<1<1<166<1%%/4%&/&--/-////////4///4////////////%///&///-//////////r   c                L   t        d      }t        d      }t        || t        |d         |      }t	        t        |d         | dz  || dz        }|j                  }|j                  }d	}||k(  }|st        j                  d
|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}}|j                   }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}}|j"                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}}|j$                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}}|j&                  }dddg}||k(  }|st        j                  d
|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}}|j(                  d   fddD        }t+        |      }|sddt        j                         v st        j                  t*              rt        j                  t*              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}|j(                  d    }d}||u }|slt        j                  d|fd!||f      t        j                  |      t        j                  |      d"z  }d#d$|iz  }t        t        j                  |            d x}x}}|j(                  d%   }d&}||k(  }|slt        j                  d
|fd'||f      t        j                  |      t        j                  |      d"z  }d#d$|iz  }t        t        j                  |            d x}x}}|j(                  d(   }d}||u }|slt        j                  d|fd!||f      t        j                  |      t        j                  |      d"z  }d#d$|iz  }t        t        j                  |            d x}x}}y ))Nr   r;   r   r   rp   r   r   r   PLUS9A_CANCELLEDrX   )z;%(py2)s
{%(py2)s = %(py0)s.seam_classification
} == %(py5)soutr   r   r   Tr   )zG%(py2)s
{%(py2)s = %(py0)s.remove_allowed_by_live_verifier
} is %(py5)s)z;%(py2)s
{%(py2)s = %(py0)s.cron_remove_invoked
} is %(py5)s)z:%(py2)s
{%(py2)s = %(py0)s.fallback_cancelled
} is %(py5)sz	FB25-0001Fr7   r   r   five_condition_resultsc              3  ,   K   | ]  }|   d u   yw)TNr1   ).0rC   fives     r   	<genexpr>z=test_02_five_conditions_pass_remove_called.<locals>.<genexpr>   s!      	 	Q4	s   )c1_task_id_matchc2_chat_id_ownedc3_role_fallbackc4_marker_id_crosscheck c5_pending_not_fired_not_removedz,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}allr[   remove_attemptedz%(py1)s is %(py4)sr   r^   assert %(py6)sr_   remove_result	CANCELLEDz%(py1)s == %(py4)snormal_success_unchanged)r   r3   r   r   r   r   r   seam_classificationr`   ra   rb   rc   rd   re   rA   rg   remove_allowed_by_live_verifiercron_remove_invokedfallback_cancelledr!   cancel_auditr   )r   r   r   r   r   r   rh   r   ri   r   r   rj   @py_assert0r   rk   r   s                  @r   *test_02_five_conditions_pass_remove_calledr      sk   	#	$B
Y
C	
H^B/B,CDc
B 8ByM":X%	C 

C""8&88"&88888"&888888838883888"888&88888888..6$6.$6666.$66666636663666.666$6666666""*d*"d****"d******3***3***"***d*******!!)T)!T))))!T))))))3)))3)))!)))T)))))))99D[UCDD9DDDDD9DDDDDDD3DDD3DDD9DDDDDDDDDDD45D	
	 	3 	 	 	 	 	 	 	   	 	   	 	 	 	 	 	 	 	 	 	 	 ./747/47777/4777/77747777777O,;;,;;;;,;;;,;;;;;;;;;;67?4?74????74???7???4???????r   zname,expect_sc))ztask-2553+23.task-id-mismatchSKIP_LIVE_SKIP_MISMATCH)ztask-2553+23.chat-id-mismatchr   )ztask-2553+23.role-not-fallbackr   )ztask-2553+23.marker-id-mismatchr   )ztask-2553+23.live-missingSKIP_LIVE_SKIP_ALREADY_REMOVED)ztask-2553+23.already-removedr   )ztask-2553+23.already-firedSKIP_LIVE_SKIP_ALREADY_FIREDc                z   t        |      }t        d      }t        || t        |d         |      }t	        t        |d         | dz  || dz        }|j                  }d}||u }	|	st        j                  d	|	fd
||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            d x}x}	}|j                  }|j                   }	|	|k(  }|st        j                  d|fd|	|f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d x}x}	}|j                  }|j"                  }	d}|	|u }|st        j                  d	|fd|	|f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}	x}}|j$                  }g }||k(  }	|	st        j                  d|	fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            d x}x}	}|j&                  d   }d}	||	u }|slt        j                  d	|fd||	f      t        j                  |      t        j                  |	      dz  }dd |iz  }t        t        j                  |            d x}x}}	|j&                  d!   }d"}	||	k(  }|slt        j                  d|fd#||	f      t        j                  |      t        j                  |	      dz  }dd |iz  }t        t        j                  |            d x}x}}	|j&                  d$   }d}	||	u }|slt        j                  d	|fd||	f      t        j                  |      t        j                  |	      dz  }dd |iz  }t        t        j                  |            d x}x}}	|j(                  }|j*                  }	t,        j.                  }|	|k(  }|s
t        j                  d|fd%|	|f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      d&t        j                         v st        j                  t,              rt        j                  t,              nd&t        j                  |      d'z  }d(d)|iz  }t        t        j                  |            d x}x}	x}}y )*Nr;   r   r   rp   r   r   r   Tr   r   r   r   r   r   rX   )z]%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.seam_outcome
}.seam_classification
} == %(py6)s	expect_scr\   r]   r^   r_   assert %(py8)sr   F)z]%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.seam_outcome
}.cron_remove_invoked
} is %(py7)sr\   r]   r^   r   assert %(py9)sr   r   r   r   r   r   r   r_   r   NOT_ATTEMPTEDr   r   r   r   r   r   r   )r   r3   r   r   r   r   r   r`   ra   rb   rc   rd   re   rA   rg   r   r   r   r!   r   r   r   r   r   )r   r   r   r   r   r   r   rh   r   ri   r   r   r   rk   r   r   r   r   r   rj   r   r   s                         r   (test_03_mismatch_skip_preserves_fallbackr      s    
TB
Y
C	
H^B/B,CDc
B 8ByM":X%	C #t#t####t######3###3######t#######<//</9<<<</9<<<<<<3<<<3<<<<<</<<<<<<9<<<9<<<<<<<8//858/58888/588888838883888888/88858888888999?9339./858/58888/5888/88858888888O,??,????,???,??????????67?4?74????74???7???4???????E..E.2E2EE.2EEEEE.2EEEEEEE3EEE3EEEEEE.EEEEEE.EEE.EEE2EEEEEEEEr   c                   t        d      }t        d      }t        || t        |d         |      }t	        t        |d         | dz  || dz        }|j                  }|j                  }t        j                  }||k(  }|s
t        j                  d	|fd
||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }	dd|	iz  }
t!        t        j"                  |
            d x}x}x}}|j                  }|j$                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t!        t        j"                  |            d x}x}x}}|j&                  }|j(                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t!        t        j"                  |            d x}x}x}}|j*                  d   }d}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t!        t        j"                  |            d x}x}}|j*                  d   }d}||v }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t!        t        j"                  |            d x}x}}y ) Nr   errorr   r   rp   r   r   r   rX   r   r   r   r   r   r   Tr   z`%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.collector_result
}.closeout_candidate
} is %(py7)sr   r   r   )zb%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.seam_outcome
}.normal_success_preserved
} is %(py7)sr   r   r   r   r_   r   )REMOVE_NONFATALr   in)z%(py1)s in %(py4)s)r   r3   r   r   r   r   r   r   r   r   r`   ra   rb   rc   rd   re   rA   rg   closeout_candidater   normal_success_preservedr   )r   r   r   r   r   rh   ri   r   r   r   r   r   r   r   r   r   rj   rk   s                     r   7test_04_remove_failure_decoupled_from_collector_successr    s   	#	$B
W
C	
H^B/B,CDc
B 8ByM":X%	C E..E.2E2EE.2EEEEE.2EEEEEEE3EEE3EEEEEE.EEEEEE.EEE.EEE2EEEEEEEE:22:d:2d::::2d::::::3:::3::::::2:::d:::::::<44<<4<<<<4<<<<<<3<<<3<<<<<<4<<<<<<<<<<67?4?74????74???7???4???????O,P0PP,0PPPPP,0PPPP,PPP0PPPPPPPPr   c                   t        d      }t        || t        |d         t        d            }ddlm} d }|j                  |d|       |j                  t        |d	         | d
z  || dz        }|j                  }|j                  }t        j                  }	||	k(  }
|
s
t        j                  d|
fd||	f      dt        j                          v st        j"                  |      rt        j$                  |      ndt        j$                  |      t        j$                  |      dt        j                          v st        j"                  t              rt        j$                  t              ndt        j$                  |	      dz  }dd|iz  }t'        t        j(                  |            dx}x}x}
}	|j*                  }d}||u }|st        j                  d|fd||f      dt        j                          v st        j"                  |      rt        j$                  |      ndt        j$                  |      t        j$                  |      dz  }dd|iz  }t'        t        j(                  |            dx}x}}d}|j,                  }||v }|st        j                  d|fd||f      t        j$                  |      dt        j                          v st        j"                  |      rt        j$                  |      ndt        j$                  |      dz  }dd|iz  }t'        t        j(                  |            dx}x}}|j.                  d   }d}||u }|slt        j                  d|fd ||f      t        j$                  |      t        j$                  |      d!z  }d"d#|iz  }t'        t        j(                  |            dx}x}}y)$uQ   seam 자체가 예외를 던져도 collector 결과 그대로 유지 (디커플).r   r   r;   r   r   Nc                     t        d      )Nzseam blew up)RuntimeError)rC   s    r   rD   z0test_04b_seam_exception_decoupled.<locals>._boom%  s    >**r   run_operational_cancel_seamrp   r   r   r   rX   r   r   r   r   r   r   Fr   r   r   r   r   u	   디커플r  )z;%(py1)s in %(py5)s
{%(py5)s = %(py3)s.seam_skipped_reason
})r   r   r   r   Tr   r   r   r_   )r   r   r   r3   "utils.operational_collector_wiringoperational_collector_wiringrF   r   r   r   r   r   r   r`   ra   rb   rc   rd   re   rA   rg   r   seam_skipped_reasonr   )r   rH   r   r   wiringrD   r   rh   ri   r   r   r   r   r   r   r   r   r   rj   rk   s                       r   !test_04b_seam_exception_decoupledr    sw   	#	$B	
b!4569%	
B 8+  =uE

>
>ByM":X%	 ? C E..E.2E2EE.2EEEEE.2EEEEEEE3EEE3EEEEEE.EEEEEE.EEE.EEE2EEEEEEEE$u$u$$$$u$$$$$$3$$$3$$$$$$u$$$$$$$1#111;11111;1111;111111#111#1111111111167?4?74????74???7???4???????r   c                   t        d      }| dz  }| dz  }t        || dz  t        |d         t        d            }t	        t        |d   t        j                  	      |||
      }t        d      }t        || dz  t        |d         |      }t	        t        |d   t        j                  	      |||
      }|j                  }	|	j                  }
t        j                  }|
|k(  }|s
t        j                  d|fd|
|f      dt        j                          v st        j"                  |      rt        j$                  |      ndt        j$                  |	      t        j$                  |
      dt        j                          v st        j"                  t              rt        j$                  t              ndt        j$                  |      dz  }dd|iz  }t'        t        j(                  |            d x}	x}
x}}|j*                  }	d}|	|u }
|
st        j                  d|
fd|	|f      dt        j                          v st        j"                  |      rt        j$                  |      ndt        j$                  |	      t        j$                  |      dz  }dd|iz  }t'        t        j(                  |            d x}	x}
}|j                  }	|	j                  }
t        j,                  }|
|k(  }|s
t        j                  d|fd|
|f      dt        j                          v st        j"                  |      rt        j$                  |      ndt        j$                  |	      t        j$                  |
      dt        j                          v st        j"                  t              rt        j$                  t              ndt        j$                  |      dz  }dd|iz  }t'        t        j(                  |            d x}	x}
x}}|j                  }	|	j.                  }
d}|
|u }|st        j                  d|fd|
|f      dt        j                          v st        j"                  |      rt        j$                  |      ndt        j$                  |	      t        j$                  |
      t        j$                  |      dz  }dd|iz  }t'        t        j(                  |            d x}	x}
x}}|j0                  }	d}|	|u }
|
st        j                  d|
fd |	|f      dt        j                          v st        j"                  |      rt        j$                  |      ndt        j$                  |	      t        j$                  |      dz  }dd|iz  }t'        t        j(                  |            d x}	x}
}|j*                  }	d}|	|u }
|
st        j                  d|
fd|	|f      dt        j                          v st        j"                  |      rt        j$                  |      ndt        j$                  |	      t        j$                  |      dz  }dd|iz  }t'        t        j(                  |            d x}	x}
}|j2                  }	g }|	|k(  }
|
st        j                  d|
fd!|	|f      d"t        j                          v st        j"                  |      rt        j$                  |      nd"t        j$                  |	      t        j$                  |      dz  }dd|iz  }t'        t        j(                  |            d x}	x}
}y )#Nr   zshared-ack.jsonr   rB   r   r;   r   rp   r   r   brX   r   firstr   r   r   r   Tr   r   r   r   r   )z%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.collector_result
}.classification
} == %(py8)s
{%(py8)s = %(py6)s.DUPLICATE_CALLBACK_IGNORED
}secondFr   r   r   r   r   r   spy2)r   r   r   r3   r   r   r   NORMALFALLBACK_STALEr   r   r   r   r`   ra   rb   rc   rd   re   rA   rg   r   DUPLICATE_CALLBACK_IGNOREDr  r   r!   )r   r   ackclaimsp1r  r  sp2r  rh   ri   r   r   r   r   r   r   r   r   r   s                       r   0test_05_duplicate_callback_no_regression_no_seamr  6  s   	#	$B
&
&CxE

3b!4569%	C :ByM1D1DE	E i D

HsN>"5H2I#JTXC ;ByM1L1LM	F !!G!00GN4G4GG04GGGGG04GGGGGGG5GGG5GGG!GGG0GGGGGGNGGGNGGG4GGGGGGGG%%%%%%%%%%%%5%%%5%%%%%%%%%%%%% 	..44.4	5  .4     	   	   	    	/           5       "">"55>>5>>>>5>>>>>>6>>>6>>>">>>5>>>>>>>>>>!!*U*!U****!U******6***6***!***U*******'%'%''''%''''''6'''6''''''%'''''''::::44:r   c                 ^   t        j                  t        j                               j	                         } | t
        k(  }|st        j                  d|fd| t
        f      dt        j                         v st        j                  |       rt        j                  |       nddt        j                         v st        j                  t
              rt        j                  t
              nddz  }t        j                  d|        dz   d|iz  }t        t        j                  |            d }y )	NrX   z%(py0)s == %(py2)srU   
FROZEN_SHAr\   r]   u   frozen anchor 변경 감지: z
>assert %(py4)sr^   )hashlibsha256FROZEN
read_bytes	hexdigestr  r`   ra   rb   rc   rd   re   rf   rA   rg   )rU   rh   @py_format3rj   s       r   test_06_frozen_anchor_byte0r&  _  s    
..**,
-
7
7
9C*CCC3*CCCCCC3CCC3CCCCCC*CCC*CCCC =cUCCCCCCCr   c                 <   ddl } t        dz  dz  j                  d      }| j                  |      }| j	                  |      D cg c]0  }t        || j                        r|j                  r|j                  2 }}d}||v }|st        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }t        t        j                  |            dx}}t         j"                  }	t$        j&                  }
 |
       } |	|      }|j(                  } |       }|t*        k(  }|st        j                  d|fd|t*        f      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |	      dt        j                         v st        j                  t$              rt        j                  t$              ndt        j                  |
      t        j                  |      t        j                  |      t        j                  |      t        j                  |      dt        j                         v st        j                  t*              rt        j                  t*              ndd	z  }dd|iz  }t        t        j                  |            dx}	x}
x}x}x}x}}yc c}w )uP   wiring 모듈은 frozen 을 read-only import 만 — frozen 무수정 재확인.r   Nr   zoperational_collector_wiring.pyr   r   z(utils.anu_delegation_completion_callbackr  )z%(py1)s in %(py3)sfroms)r   r   zassert %(py5)sr   rX   )z%(py13)s
{%(py13)s = %(py11)s
{%(py11)s = %(py9)s
{%(py9)s = %(py2)s
{%(py2)s = %(py0)s.sha256
}(%(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.read_bytes
}()
})
}.hexdigest
}()
} == %(py15)sr   r"  r  )	r\   r]   r   r   r   r   py11py13py15zassert %(py17)spy17)astrL   r   parsewalk
isinstance
ImportFrommoduler`   ra   re   rb   rc   rd   rA   rg   r   r!  r"  r#  r$  r  )r-  srctreenr(  r   r   @py_format4r   rh   r   r   r   @py_assert10@py_assert12@py_assert14@py_format16@py_format18s                     r   3test_06b_wiring_imports_frozen_readonly_no_mutationr<  d  s   w!BB
M
M N C 99S>D $a(QXX 	
E 
 6>5>>>>5>>>5>>>>>>>>>>>>>>>>>>H&++H+-H>-.H.88H8:H:jHHHH:jHHHHHH7HHH7HHH>HHHHHH&HHH&HHH+HHH-HHH.HHH8HHH:HHHHHHjHHHjHHHHHHHHs   5Lc                B   t        d      }| dz  }t        |d         }t        || dz  t        |d         t	        d            }t        || dz  ||	      }t        || d
z  ||	      }|j                  }|j                  }||k(  }	|	st        j                  d|	fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }
dd|
iz  }t        t        j                  |            d x}x}	}|j                  |j                  g}|j                   }d}	 ||	      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      t        j                  |      t        j                  |      dz  }t        j"                  d      dz   d|iz  }t        t        j                  |            d x}x}	x}x}}|j                   }d}	 ||	      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}	x}x}}|j                  s|n|}g }d}|j$                  }||v }|}|sd}|j$                  }||v }|}|st        j                  d|fd||f      t        j                  |      d t        j                         v st        j                  |      rt        j                  |      nd t        j                  |      d!z  }d"d#|iz  }|j'                  |       |st        j                  dfd$f      t        j                  |      d t        j                         v st        j                  |      rt        j                  |      nd t        j                  |      d%z  }d&d'|iz  }|j'                  |       t        j(                  |d      i z  }d(d)|iz  }t        t        j                  |            d x}x}x}x}x}x}x}}t+        |j-                  d*            }t/        |      }d}||k(  }|st        j                  d|fd+||f      d,t        j                         v st        j                  t.              rt        j                  t.              nd,dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      d-z  }
dd|
iz  }t        t        j                  |            d x}x}}y ).Nr   r   rp   sharedr   r;   r   z	ack1.jsonr   z	ack2.jsonrX   )zN%(py2)s
{%(py2)s = %(py0)s.event_id
} == %(py6)s
{%(py6)s = %(py4)s.event_id
}r1r2r   r   r   Tr%   )zK%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.count
}(%(py4)s)
} == %(py9)sinvoked)r\   r]   r^   r_   r   u&   exact-once 위반 — seam 2회 진입z
>assert %(py11)sr)  Fzassert %(py11)sz
exact-oncer  r  )z;%(py3)s in %(py7)s
{%(py7)s = %(py5)s.seam_skipped_reason
}noop)r   r   r   z%(py9)sr   )z?%(py12)s in %(py16)s
{%(py16)s = %(py14)s.seam_skipped_reason
})py12py14py16z%(py18)spy18zassert %(py21)spy21ztask-2553+25.seam-claim.*.json)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slen)r\   r   r   r_   )r   r   r   r   r3   r   event_idr`   ra   rb   rc   rd   re   rA   rg   r   countrf   r  r:   _format_boolopr)   globrH  )r   r   r  inpr   r?  r@  rh   r   ri   rk   r   rA  r   r   r   @py_format12rB  r   r   r   r   @py_assert11@py_assert15@py_assert13r   @py_format17@py_format19@py_format20@py_format22r   s                                  r   test_07_exact_once_atomic_claimrV  w  s   	#	$BxE bm
$C
 

Hxr:M7N(O9%
B 
7X#u
B 
7X#u
B ;;%"++%;+%%%%;+%%%%%%2%%%2%%%;%%%%%%"%%%"%%%+%%%%%%%0G==MM=M!M!#MMM!MMMMMM7MMM7MMM=MMMMMMMMM!MMM%MMMMMMMM==$$=$1$1$$$$1$$$$$$7$$$7$$$=$$$$$$$$$1$$$$$$$__2"D< 433 <33 w   w 8   <3                    4     w    8?      	   	   	!            %**=>?Fv;!;!;!33vv;!r   c                   t        d      }t        || t        |d         t        d            }t	        t        |d         | dz  || dz        }|j                  }|j                  j                          t        |d   |d	   |j                  |j                  
      }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                   |      rt        j"                  |      nddt        j                         v st        j                   |      rt        j"                  |      nddz  }dd|iz  }t%        t        j&                  |            d}y)u   9-R.3 — event_id 는 in-hand 입력만으로 도출, result.json 재독 0.

    result.json 파일을 삭제해도 동일 collector 결과로 동일 event_id 가
    재현됨을 보여 pre-seam 안정성/비재독을 입증한다.
    r   r   r;   r   rp   r   r   r   r   )rp   fallback_cron_idrr   resultrX   r  eid_runtimeeid_recomputer  zassert %(py4)sr^   N)r   r   r   r3   r   r   rI  rt   unlinkr
   rr   r   r`   ra   rb   rc   rd   re   rA   rg   )	r   r   r   r   rZ  r[  rh   r%  rj   s	            r   6test_07b_event_id_pre_seam_stable_no_resultjson_rereadr]    s    
#	$B	
H^B/B,CD9%
B 8ByM":X%	C ,,K $9,-#%#@#@##	M -'''';-'''''';''';''''''-'''-'''''''r   __main__z-q)r   r<   r+   r,   )r   r,   r   r   r+   r,   )r   r,   r   r   r+   r	   )rp   r<   r+   r   )?__doc__
__future__r   builtinsrb   _pytest.assertion.rewrite	assertionrewriter`   r   r   rG   syspathlibr   pytest__file__resolveparentrL   r<   pathremoveinsert(utils.anu_delegation_completion_callbackr   r   r   )utils.completion_callback_fallback_cancelr   r
  r	   r
   r   r   r"  r  r   r   r3   fixturerI   rV   rl   r   r   r  r   r   r   markparametrizer   r  r  r  r&  r<  rV  r]  r.   
SystemExitmainr1   r   r   <module>ru     s  & #      
  N""$++2299	y>SXXHHOOC	N# 3y> " 
 D  
X	
	*	W	F	FO
M
V 
VO O 2 2
# R R." 0</B/B ,0(@F FF0Q(@8%RD
I&B(: z
[V[[(D!12
33 r   