
    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ZddlZddl	m
Z
 ddlmZ ddlmZmZmZmZmZ  ee      j)                         Zej,                  j,                  Z ee      ej2                  vr"ej2                  j5                  d ee             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% dZ&dZ'dZ(dZ)dZ*ddddddZ+edz  dz  Z,e,dz  e,dz  e,dz  e,dz  dZ-e,dz  Z.edz  dz  d z  Z/d.d!Z0d/d"Z1d0d#Z2d0d$Z3d1d%Z4d1d&Z5d2d'Z6d1d(Z7d1d)Z8d1d*Z9d3d4d+Z:e;d,k(  r	  e:       Z< e=e<      y# e=$ r  e>$ r  ej~                          d-Z<Y (w xY w)5u  scripts/run_batch_hold_adjudicator — Track F integration_dogfood (task-2615).

회장 BATCH_LEVEL_HOLD 시스템화 Track F 의 *런타임 entrypoint*. Track A~E
산출물(`anu_v3.batch_hold_adjudicator`, `anu_v3.auto_remediation_planner`,
`anu_v3.critical7_classifier`, `anu_v3.batch_dependency_classifier`,
`anu_v3.dispatch_callback_contract`) 를 import / read-only 결선하여 6 track
batch 의 consolidated adjudication 을 *실증* 한다. 문서-only / mock-only /
disposition-only 금지 (task-2615 §6·§6b).

산출 (allowlist DISJOINT):

  * ``memory/events/sample.batch-hold-adjudication.result.json``
    — 6 track batch 의 adjudicator 실 호출 결과 + trace.
  * ``memory/events/sample.callback-gap-recovery.dogfood.json``
    — §6b callback-gap recovery watcher end-to-end 실증 결과.

기존 Track A~E 모듈·스키마·fixture·regression·anchor 산출물은 **byte-0**
(read-only consume·import/CLI only). git HEAD / branch 전후 EQUAL.

이 entrypoint 가 검증·실증하는 8 개 단언 (task-2615.md verbatim):

  1. 2604 = AUTO_REMEDIATION_HOLD (non-Critical hold_candidate)
  2. 2605 = AUTO_REMEDIATION_HOLD (non-Critical hold_candidate)
  3. 2608 = NOT_STARTED_BY_DESIGN / WAITING_FOR_DEPENDENCY (event-gated)
  4. 2606/2607/2609 = PASS (independent-ANU AUTHORITATIVE_PASS)
  5. Critical7 = 0 (Track B 분류)
  6. chair_required = false (회장 보고 0)
  7. §6b callback-gap recovery: DISPATCH_CONTRACT_VIOLATION → idempotent
     1회 spawn · 무조율 dead-man/fixed-time 진행트리거 아님 · self-key
     fail-closed
  8. 기존 task-2614 regression fixture 재현 PASS (무회귀)

데몬 안전원칙 / Layer A:

  * NO cron register/remove · NO subprocess · NO cokacdir · NO network
  * NO file write 외 ``--out-*`` 명시 경로만 (allowlist 산출 2 종)
  * callback owner = 독립 ANU key (c119085addb0f8b7) — executor self-key
    절대 금지 (+49 정본).
    )annotationsN)asdict)Path)AnyDictListOptionalTuple)batch_hold_adjudicator)auto_remediation_planner)critical7_classifier)batch_dependency_classifier)dispatch_callback_contractc119085addb0f8b7109fa85250c6d46bz	task-2615z)anu_v3.batch_hold_adjudication.dogfood.v1z'anu_v3.callback_gap_recovery.dogfood.v1@dc4e299fdc25108a5e87afd5c8602294c460f0a4a43903c824b840a1484b26fd@0cdc1259f2eb3fae5e77393620f6ea90edde6391bd384a31b8154e0ef6856f56@dc62a81223117f68c7404672800cae9a5e0649dd54abcb1bad0c5a4cdab66d5e@576ac7996e47d8b388776e127d7439a377ea1b3a03e31e288e50a0127b210f3c@1c9d8c54d407c4c1dacb9e23d90b30cb809e6f1fc5b46e917cbb802edf9abe39)A_task-2610B_task-2611+2C_task-2612+3D_task-2613E_task-2614memoryfixturesztask-2614.case-2604.jsonztask-2614.case-2605.jsonztask-2614.case-2608.jsonztask-2614.case-2609.json)2604260526082609z task-2614.case-callback-gap.jsoneventszcallback_4tuple_index.jsonlc                d    t        j                  | j                               j                         S N)hashlibsha256
read_bytes	hexdigest)ps    9/home/jay/workspace/scripts/run_batch_hold_adjudicator.py_sha256_filer+   a   s     >>!,,.)3355    c                 R    t        j                  dt        j                               S )Nz%Y-%m-%dT%H:%M:%SZ)timestrftimegmtime r,   r*   _now_kstr2   e   s    ==-t{{}==r,   c            
         t         dz  t         dz  t         dz  t         dz  t         dz  d} | j                         D ci c]0  \  }}|t        |j                  t                     t	        |      d2 c}}S c c}}w )u4   Track A~E 모듈 byte-pin (read-only 결선 증거).z anu_v3/batch_hold_adjudicator.pyz"anu_v3/auto_remediation_planner.pyzanu_v3/critical7_classifier.pyz%anu_v3/batch_dependency_classifier.pyz$anu_v3/dispatch_callback_contract.py)track_A_batch_hold_adjudicator track_B_auto_remediation_plannertrack_C_critical7_classifier#track_D_batch_dependency_classifier"track_E_dispatch_callback_contractpathr&   )
_REPO_ROOTitemsstrrelative_tor+   )modskvs      r*   _module_provenancerB   j   s     +57Y*Y,69],](25U(U/9<c/c.8;a.aD 

&1 AMM*56,q/RR & & &s   5A8c                    i } t         j                         D ]2  \  }}t        |j                  t                    t        |      d| |<   4 t        t        j                  t                    t        t              d| d<   | S )Nr9   callback_gap)FIXTURE_FILESr<   r=   r>   r;   r+   CALLBACK_GAP_FIXTURE)outr@   r)   s      r*   _fixture_provenancerH   w   sx    %'C##% U1ammJ78LQROTAU (44Z@A34C Jr,   c            
     t   t         d   t         d   t         d   t         d   t         d   d} | D ci c]  }|d }}t        j                         st        dt         d	      t        j	                  d
d      5 }|D ]  }|j                         }|s	 t        j                  |      }|j                  d      dk7  rA|j                  d      dk7  rV|j                  d      }||v sl|j                  d      ||<    	 ddd       |j                         D cg c]
  \  }}|r	| }}}|rt        d| d      | D cg c]  }||   | |   k7  r|||   | |   f }	}|	 | ||	 |	t        t        j                  t                    dddS c c}w # t        $ r Y "w xY w# 1 sw Y   xY wc c}}w c c}w )u   Track A~E all-settled durable-success EVENT 확인 (event-driven, 회장 §3).

    fail-closed: ledger 에 5건의 durable_success_writeback 이 모두 없으면
    Track F 는 *시작하지 않는다*. fixed-time/dead-man 진행트리거 아님.
    r   r   r   r   r   )z	task-2610ztask-2611+2ztask-2612+3z	task-2613z	task-2614Nzacceptance ledger missing: uE    — gate cannot fire (event-driven; no fixed-time/dead-man fallback)rutf-8encodingschemazdurable_success_writeback.v1writeback_classificationDURABLE_SUCCESS_WRITTENtask_idwriteback_idu7   acceptance gate FAILED — missing durable-success for z?; Track F refuses to run (event-priority; no fallback dead-man)EVENT_GATEDF)all_settledneededobservedwriteback_id_match
mismatchedledger_path	gate_kindfixed_time_or_dead_man)ACCEPTANCE_LEDGERLEDGER_PATHexistsRuntimeErroropenstripjsonloads	Exceptiongetr<   r=   r>   r;   )
rU   r@   rV   fhlinerectidrA   missingrX   s
             r*   verify_acceptance_gaterk      s
    '}5(9(9&}5&}5F <B)Ba!T')BH)B)+ 7> >
 	
 
		#		0 8B 	8D::<Djj& wwx $BBww126OO'')$Ch # 7	88$ &^^-7TQQq7G7EgY OL L
 	
 A;&)# 
HQK#J  &~",n ;22:>?""'	 	I *C  8 8$ 8sM   
F:F#F)?F#)F#
F/&F/F5	F F#F  F##F,c                 $   i dg d} t         j                         D ]q  \  }}t        j                  |j	                  d            }|d   }|dv r|d   }t        j                  |d   |d	   t        |j                  d
d            t        |j                  dd            |j                  d      |j                  dd      |j                  dd      |j                  dd      |j                  d      t        |j                  dd            t        |j                  dd            t        |j                  dd            |j                  dd      |j                  dd            }t        j                  |      }|d   d   }|j                  |k(  }	|d|j                  ||j                  |j                  |	d| d   |<   |d   }
t        j                  |
      }|d   d   }d |j                  ||j                   |j"                  |j$                  t'        |j(                        d!d"| d   |   d#<   |	rd| d$<   | d%   j+                  |       9|d&   }t-        j.                  |d   |d	   |d'   t'        |j                  d(      xs g       t'        |j                  d)      xs g       t        |j                  d*d            t        |j                  d+d            t        |j                  d,d            -      }t-        j0                  |      }|d   d.   }|j                   |k(  }	|d/|j                   ||j2                  |j4                  t'        |j6                        |	d0| d   |<   |	rYd| d$<   | d%   j+                  |       t | S )1uD  4 fixtures 를 read-only consume 하여 각 expected vs 모듈 실호출 비교.

    Track A 의 ``adjudicate_track`` 으로 2604/2605/2609 의 hold_candidate
    분류 재현; Track D 의 ``classify_track`` 으로 2608 의 dependency 분류
    재현. 단 하나라도 mismatch 면 무회귀 위반 — fail-closed.
    T)per_case	all_match
mismatchesrK   rL   case_id)r   r   r!   track_a_inputtrack_idrQ   dispatch_receivedhold_candidateFcollector_recordedcollector_key executor_keycollector_roleauthoritative_verdict authoritative_is_independent_anuclassifier_presentclassifier_is_critical7classifier_categorydetail)rr   rQ   rs   rt   ru   rv   rx   ry   rz   r{   r|   r}   r~   r   expectedtrack_a_classificationz.anu_v3.batch_hold_adjudicator.adjudicate_track)rp   modulegotwantchair_escalationauto_remediationmatchrm   track_b_findingtrack_b_is_critical7z.anu_v3.critical7_classifier.classify_critical7u2  fixture rebuttal 산문에 'credential' 키워드 포함 → is_critical7=True (literal match) · dogfood batch 입력 에서는 classifier_is_critical7 플래그를 명시적으로 False 로 전달하므로 Track A consolidated adjudication 은 AUTO_REMEDIATION_HOLD 로 수렴 — 기존 baseline 일치.)r   is_critical7intended_is_critical7verdictmatched_rule_idfamilymatched_termsnote	critical7rn   ro   track_d_contextrZ   declared_upstreamupstream_durable_successdispatch_fireddispatch_receiptterminal_result_presentrr   rQ   rZ   r   r   r   r   r   track_d_verdict1anu_v3.batch_dependency_classifier.classify_track)rp   r   r   r   is_incidentis_blocking_for_adjudicatorupstream_unmetr   )rE   r<   rb   rc   	read_textbhaTrackHoldInputboolre   adjudicate_trackclassificationr   r   c7cclassify_critical7r   r   r   r   listr   appendbdcTrackContextclassify_trackr   r   r   )rG   keyr)   datarp   inpttar   okfindingc7c7_intendedctx_inctxtdwant_ds                    r*   replay_2614_fixturesr      s    (*BOC%%' a.Qzz!++w+78y/**'C""ZI"&sww/BD'I"J#CGG,<e$DE#&77+?#@!ggor: WW^R8"ww'7<&)gg.E&F15GG>F2 $(0De(L#M(,SWW5NPU-V(W$'GG,A2$Fwwx,!A$ %%a(B
#$<=D""d*B"J(($&$7$7$&$7$7$C
OC $ ,-G''0Bz*+ABKJ ")4::#%#5#5))!%b&6&6!7W1C
OC -  #(K L!((-+,F""
+y) -"&vzz2E'F'L""M)-JJ9:@b*  $FJJ/?$GH!%fjj1CU&K!L(,JJ8%@)C ##C(B*%&78Fv%B"Mzz!~~/1/M/M"&r'8'8"9	$C
OC  #(K L!((-Ca.D Jr,   c                    dd} dd}t        j                  dddddddd      } | d	       | d
       |dd       |dd      | |dd      g}t        g|D cg c]  }t        |       c}d}|D cg c]q  }|j                  |j
                  |j                  dv rdn|j                  rdnd|j                  |j                  |j                  |j                  |j                  ds c}ddddddddddd}||fS c c}w c c}w )u6  6 track batch payload + composition trace.

    스펙 결과:

      * 2604 / 2605 = AUTO_REMEDIATION_HOLD (hold_candidate · classifier
        non-Critical7) — fixture 의 track_a_input 그대로 사용.
      * 2606 / 2607 / 2609 = AUTHORITATIVE_PASS (PASS) — independent ANU
        verdict=PASS 합성 입력 (collector_key=ANU · executor_key 분리 ·
        role=ANU · 비-self session).
      * 2608 = NOT_STARTED_BY_DESIGN — event-gated track (gate 미진입).
        (fixture 의 dependency_unmet 와 등가 → 회장 §6 "사고 아님".)
    c                `   t        j                  t        |    j                  d            }|d   }t	        j
                  |d   |d   ddd|j                  dt              |j                  d	d
      |j                  dd      ddddd|j                  dd      |j                  dd            S )NrK   rL   rq   rr   rQ   THOLD_CANDIDATErv   rx   z	exec-stubry   ANUFHOLDr~   testr   rw   rr   rQ   rs   rt   ru   rv   rx   ry   "collector_session_is_executor_selfrz   r{   r|   r}   r~   r   )rb   rc   rE   r   r   r   re   INDEPENDENT_ANU_KEY)fixture_keyr   r   s      r*   _from_fixture_holdz/build_dogfood_batch.<locals>._from_fixture_hold=  s    zz-4>>>PQ?#!!_	N"/''/3FG=77#3U;/4"(-1#$) #(=v F778R(
 	
r,   c                h    t        j                  d|  dd|  ddd t        |dddddddd|  d	      S )
Nztask-z-integration-dogfoodTFr   PASSresolvedz1 independent-ANU PASS (integration dogfood synth)r   )r   r   r   )task_suffixexec_keys     r*   _pass_trackz(build_dogfood_batch.<locals>._pass_trackS  s]    !![M)=>K=)" #-! /4"(-1#$) *;-'XY
 	
r,   task-2608-dependency-wait	task-2608TFuC   event-gated track, gate not yet entered (회장 §6: 사고 아님))rr   rQ   rs   not_started_by_designrt   r|   r}   r   r   r   2606zexec-2606-stub2607zexec-2607-stubr!   zexec-2609-stub)anu_keystracks)	task-2604	task-2605zfixture(2614)zsynthetic NOT_STARTED_BY_DESIGNzsynthetic AUTHORITATIVE_PASS)rQ   rr   sourcert   r   r}   rz   r{   AUTO_REMEDIATION_HOLDAUTHORITATIVE_PASSNOT_STARTED_BY_DESIGN)r   r   	task-2606	task-2607r   	task-2609)critical7_presentchair_escalation_required)compositionexpected_per_taskexpected_batch)r   r=   returnbha.TrackHoldInput)r   r=   r   r=   r   r   )r   r   r   r   rQ   rr   r   rt   r}   rz   r{   )r   r   t2608r   r   payloadtraces          r*   build_dogfood_batchr   /  sL   
,
( ,"  %T	E 	6"6"F,-F,-F,-F ))&,-6!9-G  
  		qzz*+))7Q*Q898O8O46 //&'&=&=()(A(A&'&=&=121S1SU
 10--0-
 "').
+E4 E>; .
s   C?4A6Dc                    t               \  } }t        j                  |       }|j                  D ci c]  }|j                  | }}i }|d   j                         D ]  \  }}|j                  |      }|r|j                  nd }||||k(  |rt        |j                        nd |rt        |j                        nd |rt        |j                        nd |rt        |j                        ng d||<    |j                  du |j                  du |j                   dk7  d}	i }
|j                  D ]  }|j                  dk(  st"        j$                  t"        j&                  t"        j(                  d}t#        j*                  |j                  |j                  |j                  t"        j&                        ddd|j                   d	
      }t#        j,                  |      }d||t"        j.                  k(  d|
|j                  <    t1        j2                  ddt0        j4                  ddgdgddd      }t1        j6                  |      }d|j                   |j8                  |j:                  t        |j<                        |j                   dv d}t?        d |jA                         D              }t?        |	jA                               }| |g d|jC                         ||	|
|||d
S c c}w )Nr   )r   r   r   r   r   settledreasonsFHOLD_FOR_CHAIR)r   r   verdict_no_chairr   )r   r   r   HIGHu1    non-Critical HOLD → AUTO_REMEDIATION (dogfood))source_task
issue_typeseverityr   shared_invariant_brokensummary4anu_v3.auto_remediation_planner.classify_disposition)r   disposition
match_autor   r   r   r   r   r   )WAITING_FOR_DEPENDENCYr   )r   r   r   r   r   8semantically_equivalent_to_track_a_NOT_STARTED_BY_DESIGNc              3  &   K   | ]	  }|d      yw)r   Nr1   ).0cs     r*   	<genexpr>z)run_batch_adjudication.<locals>.<genexpr>  s     GAQwZGs   )z5anu_v3.batch_hold_adjudicator.adjudicate_from_payloadr   r   zHanu_v3.critical7_classifier.classify_critical7 (in replay_2614_fixtures)
input_payloadcomposition_tracemodule_callsadjudicator_resultcell_by_cellbatch_invariantsauto_remediation_dispositionstrack_d_dependency_checkall_per_cell_matchall_batch_invariant_match)"r   r   adjudicate_from_payloadr   rQ   r<   re   r   r   r   r   r   r   r   r   r   r   arp%TYPE_GLOBAL_LEDGER_SHA_FALSE_POSITIVETYPE_STAGE_CLAIM_TEST_MISMATCHTYPE_COVERAGE_GAPIssueClassificationclassify_dispositionDISPOSITION_AUTOr   r   GATE_DEPENDSr   r   r   r   allvaluesto_dict)r   r   resultr   per_taskr   ri   r   r   batch_expectedarp_dispositionsissue_type_mapissuer   ctx_2608	td_resulttrack_d_checkr  all_batch_matchs                      r*   run_batch_adjudicationr    s   (*NGU((1F *072

B7H7.0L./557 
	T\\##%b4D[=?R%8%8 9T=?R%8%8 9T+-tBJJ'4+-tBJJ'2
S
 $55>%+%E%E%N"NN.>>N (*mm  77 FF ?? 22N
 ++JJ)--JJ B B  "(-::,&WX	E 2259KP*)S-A-AA,RZZ(%2 ,""&4"- %	H ""8,IE$$ ,,'0'L'Ly778  "; ;M G1D1D1FGG.//12O !"
 %nn.$*)9$10%4 [ 8s   K!c                    g dt        t        j                  t                    t	        t              i dg dd-fd} t        j                  dddd      } | ddddd|j                  |j                  |j                  t
        j                  |j                  t
        j                  k(  xr |j                  du xr |j                  d	u d
       t        j                  dd	dd      } | dd	ddd|j                  |j                  |j                  t
        j                  |j                  t
        j                  k(  xr |j                  d	u xr |j                  d	u d       t        j                  t        j                  d            }|d   }t        j                   |      }|d   } | dt        t        j                  t                    ||j                  |j                  |j                  |j"                  |j$                  ||j                  |d   k(  xrN |j                  |d   k(  xr: |j                  |d   k(  xr& |j"                  |d   k(  xr |j$                  |d   k(  d	       g d.fd}t        j&                  |      }|j)                  |      }	|j)                  |      }
 | d|	d   |	d   |	d   d|
d   |
d   |
d   dt+              d|j,                  |	d   du xr) |
d   d	u xr  |
d   du xr t+              dk(  xr |	d   d	u d        g t        j&                  fd!      }d"dd	dt.        d#}|j)                  |      } | d$||d   |d   |d   t+              d%|d   d	u xr |d   d	u xr t+              d%k(  d&       d	}d'}	 t        j                  d(dddt
        j0                  #       d	}d'}	 t        j                  d*dddt4        #        | d+t
        j0                  ||t4        |||xr |d,       S # t
        j2                  $ r}d}t        |      }Y d)}~qd)}~ww xY w# t
        j2                  $ r}d}t        |      }Y d)}~{d)}~ww xY w)/u  task-2614 §7b dispatch_callback_contract 를 import 결선하여 6 케이스를
    실 호출로 검증한다 (회장 §6b — mock-only FAIL).

      (a) normal present → CONTRACT_OK · fallback cancel-on-success
      (b) normal missing · fallback present → FALLBACK_RECOVERY
      (c) callback-gap fixture: result+normal-missing+fallback-missing
          → DISPATCH_CONTRACT_VIOLATION · recovery_required=True
      (d) idempotent — 동일 task 2회 spawn → 정확히 1회 실제 spawn (중복 0)
      (e) 조건 미충족 → no-op (진행트리거화 0 · fixed-time/dead-man 아님)
      (f) executor self-key → ExecutorSelfKeyForbidden fail-closed
    )z<anu_v3.dispatch_callback_contract.classify_dispatch_contractz*anu_v3.dispatch_callback_contract.evaluatez=anu_v3.dispatch_callback_contract.RecoveryWatcher.maybe_spawnzIanu_v3.dispatch_callback_contract.assert_collector_key_is_independent_anuT)r   fixture_usedfixture_sha256cases
all_passedfailuresc                n    |d   | <   |j                  dd      sdd<   d   j                  |        y y )Nr  r   Fr  r   )re   r   )namer   rG   s     r*   _recordz*run_callback_gap_recovery.<locals>._record  s@    $GT{{7E* %C
O""4( +r,   ztask-2615.dogfood.a)rQ   normal_callback_presentfallback_presentresult_presenta_contract_ok)normalfallbackr  F)inputr   fallback_cancel_on_successrecovery_requiredwant_classificationr   ztask-2615.dogfood.bb_fallback_recovery)r*  r   r,  "recovery_is_fixed_time_or_dead_manr-  r   rK   rL   observationr   %c_dispatch_contract_violation_fixturer   r,  r/  rv   executor_self_key_forbidden)	fixturer0  r   r,  r/  rv   r2  r   r   c                :    j                  | |f       d|  d| S )Nzspawned::r   )rQ   rv   spawn_calls_ds     r*   _spawn_dz+run_callback_gap_recovery.<locals>._spawn_dc  s)    g}56'!M?33r,   d_idempotent_single_spawnspawnedduplicate_suppressed)r:  r;  r      r[   )
first_callsecond_callactual_spawn_countwant_actual_spawn_countspawn_targetswatcher_seen_keysr   c                *    j                  | |f      S r$   r6  )r   r@   spawn_calls_es     r*   <lambda>z+run_callback_gap_recovery.<locals>.<lambda>  s    ]))1a&1 r,   ztask-2615.dogfood.e)rQ   r$  r%  r&  rv   e_no_op_condition_not_metr   )r*  r:  r   r[   r?  r@  r   rw   ztask-2615.dogfood.fNztask-2615.dogfood.f2f_self_key_fail_closed)case_canonical_self_keycase_canonical_caughtcase_canonical_errorcase_executor_self_keycase_executor_caughtcase_executor_errorr   )r"  r=   r   Dict[str, Any]r   None)rQ   r=   rv   r=   r   r=   )r=   rF   r>   r;   r+   dccclassify_dispatch_contractr   r+  r,  CONTRACT_OKr/  FALLBACK_RECOVERYrb   rc   r   evaluaterv   r2  RecoveryWatchermaybe_spawnlenspawned_keysr   EXECUTOR_SELF_KEY_FORBIDDENExecutorSelfKeyForbiddenEXECUTOR_SELF_KEY)r#  abr3  obsr   r   r8  	watcher_dr1r2	watcher_enoop_innoopself_key_caughtself_key_errorexcself_executor_caughtself_executor_errorrG   r7  rD  s                      @@@r*   run_callback_gap_recoveryrj    s   
 0<<ZHI&';<C) 	&&% $		A O ddC**&'&B&B00"""coo5 322d:3))U2	 	 	&&% %		A !!ttD**00./.R.R"44""c&;&;; D))U2D::eC	$ 	 jj-777IJG
-
 CSAz"H3+77
CD**00./.R.R'('D'D""h/?&@@ A))X6I-JJA::!"FGHA oo/)BB	A
 33!"?@A6 & ,.M4 ##H-I			s	#B			s	#B'"$Y-/12H/I)+,<)=? $&i=023I0J*,-=*>@ "-0#$&&33Y-4' <mu,</0D8< -(A-< 12e;* & ,.M##1I
 )#'!,G   )D'	?/0"&'?"@!-0#$y/U* .34=.-(A-
* 
 ON
"&&)$(!99	
 !
'&&*$(!+	
 $#&#B#B!0 ."3 42 9%9'  J7 '' "S" '' '#!#h's0   !(P Q P?(P::P?Q,Q''Q,c                     g dddS )u  선언적 hook: pytest 호출은 본 entrypoint 외부(스킬 invoke 단)에서 별도
    실행 — 본 함수는 baseline 의 *증거* 로 fixtures sha256 + module sha256
    을 박제한다. 실제 pytest 결과는 별도 stdout 트레이스로 첨부된다.
    )z0tests/regression/test_batch_hold_adjudication.pyz-tests/regression/test_critical7_classifier.pyz1tests/regression/test_auto_remediation_planner.pyz7tests/regression/test_dependency_wait_classification.pyz3tests/regression/test_dispatch_callback_contract.pyuF   pytest -q 별도 실행 — 본 entrypoint 는 read-only 결선만 함)regression_filesr   r1   r1   r,   r*   regression_hookrm    s    
 Y	 	r,   c                @
   t        j                  dd      }|j                  dt        t        dz               |j                  dt        t        dz               |j                  d	d
d       |j                  dd
       |j                  |       }t               }g }|j                  rddd}n?t               }|j                  d      s$t        t        j                  d|dd             yt               }|d   s|j                  d|d           t               }|d   s|j                  d       |d   s|j                  d       t!               }|d   s|j                  d|d            dg d!}		 d"d l}
t        d#z  }t        j$                  |j'                  d$%            }|
j)                  |d&   |       dt        |j+                  t                    t-        |      g d'}	t               }i d*t6        d+t8        d,d-d.d/d0|d1|d2t:        dt<        d3d4d5|d6t?               d7tA               d8|d9|d:   |d;   |d<   |d&   |d=   |d>   |d?   |d@   |d   |d   dA
dB|	dCtC               dD|d| }tD        t8        dEdF||t:        t<        dGdH|t?               tA               |d|d   dI}tG        |jH                        }tG        |jJ                        }|jL                  jO                  ddJ       |jL                  jO                  ddJ       |jQ                  t        j                  |ddK      d$%       |jQ                  t        j                  |ddK      d$%       |sdLndM| |t        |j+                  t                    tS        jT                  |jW                               jY                         t        |j+                  t                    tS        jT                  |jW                               jY                         dN|d=   dO   dP   |d=   dQ   dP   |d=   dR   dP   |d=   dS   dP   |d=   dT   dP   |d=   dU   dP   |d&   dV   |d&   dW   |d&   dX   |d&   dY   |d&   dZ   d[|d   d\}t        t        j                  |ddK             |sd"S d]S # 
j.                  $ r8}dt        |      gd!}	|j                  d(|j0                          Y d }~d }~wt2        $ r.}dt5        |      gd!}	|j                  d)|       Y d }~*d }~ww xY w)^Nrun_batch_hold_adjudicatoru   task-2615 Track F integration_dogfood — batch_hold_adjudicator / auto_remediation_planner / critical7_classifier / batch_dependency_classifier / dispatch_callback_contract 결선 실증 (문서-only · mock-only 금지).)progdescriptionz--out-batchz8memory/events/sample.batch-hold-adjudication.result.json)defaultz--out-callback-gapz7memory/events/sample.callback-gap-recovery.dogfood.jsonz--skip-acceptance-gate
store_trueuV   (허용 안 됨) — 본 플래그는 dry-run 진단용. 실제 prod 경로에선 OFF.)actionhelpz--quiet)rt  FT)rT   skippedrT   GATE_NOT_FIRED)statusgate   )indentrn   z2614 regression mismatches: ro   r  z"per-cell mismatch in dogfood batchr  zbatch invariant mismatchr  zcallback-gap cases failed: r   )	validatederrorsr   z+schemas/batch_hold_adjudication.schema.jsonrK   rL   r   )r|  schema_pathschema_sha256r}  zschema validation error: zschema validation hook error: rN   rQ   trackFpurposeu   회장 BATCH_LEVEL_HOLD 시스템화 Track F integration_dogfood 의 런타임 실 호출 결과 — Track A~E 모듈 결선 증거.started_at_utcfinished_at_utccallback_owner_policyuM   +49 정본 / 회장 §5.D / 회장 §7b · §7b 회장 야간 정정 verbatim)must_use_independent_anu_key5executor_self_key_forbidden_for_collector_or_dispatchexecutor_self_key_valuepolicy_doctrineacceptance_gatemodule_provenancefixture_provenancetask_2614_regression_replayintegration_dogfoodr   r   r   r   r   r   r  r   schema_validationrm  pipeline_failuresu   F.§6bu   회장 §6b 야간 필수 보강 — callback-gap recovery watcher end-to-end 실증 산출 (mock-only FAIL · 진행트리거화 0 · self-key fail-closed).u!   +49 정본 / §7b 야간 verbatim)r  r2  doctrine)rN   rQ   r  r  r  r  r  r  r  r  	scenariosanti_pattern_640665C8_blockedr  )parentsexist_ok)ensure_asciir{  
DOGFOOD_OKDOGFOOD_FAILED)batch_resultbatch_result_sha256rD   callback_gap_sha256r   r   r   r   r   r   r   r   r   auto_remediation_requiredbatch_classificationr   )r   r   r   r   r   r   r   r   r  r  batch_verdict)rx  r  r  outputsverdict_summarycallback_gap_cases_passedr<  )-argparseArgumentParseradd_argumentr=   r;   
parse_argsr2   skip_acceptance_gaterk   re   printrb   dumpsr   r   r  rj  
jsonschemarc   r   validater>   r+   ValidationErrormessagerd   reprDOGFOOD_SCHEMATASK_IDr   r[  rB   rH   rm  CALLBACK_GAP_SCHEMAr   	out_batchout_callback_gapparentmkdir
write_textr%   r&   r'   r(   )argvparserargs
started_atr  ry  replaybatchcgrr  r  r~  rN   rg  finished_atbatch_out_doccallback_gap_docout_batch_pathout_cgr_pathr   s                       r*   mainr    s;   $$)8F sSS 
  
 cRR'
  
  e   	,7T"DJ#%   $6%'xx&$**(8$GPQRS "#F+  #?|@T?U!VW #$E%&  !EF,-  !;< $
%C|  #>s:>O!PQ ',r:K #PPK1171CDE"67@{66zBC)+6	
 *K$.$7$ 	$ 	N$ 	*$ 	;$ 	 ,?EI'8n	"
$  	4!$" 	/1#$$ 	13%$& 	&v'$( 	"?3!&':!;!.1"'(<"=!.1 %&8 9-23R-S(-.H(I"'(<"=)./J)K 
)$@ 	.A$B 	?,C$D 	.E$F 	++G$MN &% %&,?+<;"

  /113)-,'+2 $..)N--.Lt<dT:

=uQ?'   

#%BW  
 '8,=M++. : :: FG#*>>))+$ik 8 8 DE#*>>'')$ik	
 ~.{;EB~.{;EB~.{;EB~.{;EB~.{;EB~.{;EB!&';!<=P!Q*+,GH*+,GH*+,BC"#78C
  &)%6=G@ 
$**W5
;<%1,1,i %% L*/CH:F  #<S[[M!JKK K*/DI;G  #A#!IJJKs%   ;A3R! !T0-S##T/#TT__main__   )r)   r   r   r=   )r   r=   )r   zDict[str, Dict[str, str]])r   rN  )r   z%Tuple[Dict[str, Any], Dict[str, Any]]r$   )r  zOptional[List[str]]r   int)@__doc__
__future__r   r  r%   rb   sysr.   	tracebackdataclassesr   pathlibr   typingr   r   r   r	   r
   __file__resolve_THISr  r;   r=   r:   insertanu_v3r   r   r   r  r   r   r   r   r   rP  r   r[  r  r  r  r\   FIXTURE_DIRrE   rF   r]   r+   r2   rB   rH   rk   r   r   r  rj  rm  r  __name__rc
SystemExitrd   	print_excr1   r,   r*   <module>r     s  &N #    
     3 3 	X \\  
z?#(("HHOOAs:' 1 2 . 5 4 ) & 
<?  VWWUU  8#j044444444	 #%GG 8#h.1NN6>

&:|j\k^cNwv$y-x zV R.    	s   +D; ;EE