
    3jz                       d Z ddlmZ ddlZddlmZmZ ddlmZ ddl	m
Z
mZmZmZ dZdZd	Z ed
      ZdZdZdZdZdZdZdZdZdZ eeeeeh      Z eeh      Z G d de      Z ed       G d d             Z  ed       G d d             Z!d-dZ"d.dZ#	 	 	 	 	 	 d/dZ$ eh d      Z%d Z& ed!d"h      Z'd0d#Z(d1d$Z)d1d%Z*d1d&Z+d1d'Z,d2d(Z-efd3d)Z.d4d*Z/d5d6d+Z0e1d,k(  r e2 e0             y)7u  anu_v3.batch_dependency_classifier — Track D (task-2613).

목표 (회장 verbatim): batch 전체 context에서 upstream gate 미충족으로 아직
dispatch되지 않은 상태를 정확히 분류한다.

핵심 분리 (★ 혼동 절대 금지):
  * NOT_STARTED_BY_DESIGN  — design-phase gate(EVENT_GATED / AUTO_SEQUENCED,
    upstream 진행 0)로 dispatch 보류가 SPEC 상 정상. 사고 아님.
  * WAITING_FOR_DEPENDENCY — 선언된 dependency edge 가 부분 충족(일부 upstream
    durable-success, 전부는 아님)이라 dispatch 보류. 2608 유형. 사고 아님.
  * DISPATCH_NOT_RECEIVED  — gate 가 *충족*(또는 gate 없음)되고 dispatch 가
    fired 됐으나 봇이 미수신한 **사고**. 위 둘과 별개 상태.
  * ELIGIBLE_NOT_YET_DISPATCHED — gate 충족/없음이나 아직 dispatch fired 전인
    정상 전이 구간 (fired 아님 → 미수신 사고 아님).
  * TERMINAL_PRESENT — result.json 존재. not-started 대상 아님.

ANTI-CONFLATION INVARIANT (코드+스키마+regression 강제):
  I1. verdict==DISPATCH_NOT_RECEIVED ⟹ gate_satisfied ∧ dispatch_fired ∧ ¬receipt
  I2. ¬gate_satisfied ⟹ verdict ∈ {NOT_STARTED_BY_DESIGN, WAITING_FOR_DEPENDENCY}
      (gate 미충족은 dispatch 자체가 SPEC 상 보류 — fired 가 아니므로 봇
       미수신 사고가 성립 불가. 전제조건이 상호배타.)
  I3. 정상 보류/진행 4종(NOT_STARTED_BY_DESIGN, WAITING_FOR_DEPENDENCY,
      ELIGIBLE_NOT_YET_DISPATCHED, TERMINAL_PRESENT)은 is_incident=False ∧
      is_blocking_for_adjudicator=False.

출력은 Track A ``anu_v3.batch_hold_adjudicator`` 의 입력
(schemas/dependency_wait_state.schema.json). blocking_verdicts 는
DISPATCH_NOT_RECEIVED 단 하나 — adjudicator 는 정상 보류를 HOLD 로 격상하지
않는다(Critical7 만 회장 보고 · non-Critical 은 AUTO_REMEDIATION_HOLD 수렴).

NO-CRON / Layer A (9-R): 본 모듈은 ZERO write(호출자가 result 를 기록),
ZERO cron register/remove, ZERO dispatch, ZERO merge, ZERO credential.
순수 stdlib 결정 함수 + read-only batch-context 스캔.

executor self-* 금지(+49 정본): 본 모듈은 callback/collector/adjudication/
dispatch 를 수행하지 않는다 — 분류만 한다.
    )annotationsN)	dataclassfield)Path)DictListOptionalSequencezdependency_wait_state.v1znot_started_by_design.v1z1.0.0z/home/jay/workspaceTERMINAL_PRESENTNOT_STARTED_BY_DESIGNWAITING_FOR_DEPENDENCYELIGIBLE_NOT_YET_DISPATCHEDDISPATCH_NOT_RECEIVEDNONEEVENT_GATEDAUTO_SEQUENCED
DEPENDS_ONc                      e Zd ZdZy)ConflationErroruV   gate 미충족 정상보류 ↔ DISPATCH_NOT_RECEIVED 혼동 시도 — 산출 거부.N)__name__
__module____qualname____doc__     9/home/jay/workspace/anu_v3/batch_dependency_classifier.pyr   r   L   s    `r   r   T)frozenc                      e Zd ZU dZded<   ded<   eZded<    ee      Z	ded<    ee      Z
ded	<   d
Zded<   d
Zded<   d
Zded<   ddZddZy)TrackContextuF   단일 track 의 batch-context 증거 (read-only로 수집된 사실).strtrack_idtask_id	gate_kinddefault_factory	List[str]declared_upstreamupstream_durable_successFbooldispatch_fireddispatch_receiptterminal_result_presentc                t    t        | j                        }| j                  D cg c]	  }||vs| c}S c c}w N)setr(   r'   )selfdoneus      r   upstream_unmetzTrackContext.upstream_unmet]   s2    400111CaQd]CCCs   	55c                d    | j                   t        k(  r| j                  sy| j                          S )NT)r#   	GATE_NONEr'   r3   r0   s    r   gate_satisfiedzTrackContext.gate_satisfieda   s+    >>Y&t/E/E&&(((r   N)returnr&   )r8   r)   )r   r   r   r   __annotations__r5   r#   r   listr'   r(   r*   r+   r,   r3   r7   r   r   r   r   r   P   sd    PMLIs#(#>y>*/*EiE ND "d"$)T)D)r   r   c                      e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   ded
<   ded<   ded<   ded<   ded<   ded<   ded<    ee      Zded<   ddZddZy)TrackClassificationr    r!   r"   verdictr#   r)   r7   r&   r'   r(   r3   r*   r+   r,   is_incidentis_blocking_for_adjudicatorr$   reasonsc                   | j                   | j                  | j                  | j                  | j                  t        | j                        t        | j                        t        | j                        | j                  | j                  | j                  | j                  | j                  t        | j                        dS )Nr!   r"   r=   r#   r7   r'   r(   r3   r*   r+   r,   r>   r?   r@   )r!   r"   r=   r#   r7   r:   r'   r(   r3   r*   r+   r,   r>   r?   r@   r6   s    r   to_jsonzTrackClassification.to_jsonx   s    ||||"11!%d&<&<!=(,T-J-J(K"4#6#67"11 $ 5 5'+'C'C+++/+K+KDLL)
 	
r   c                d   | j                   t        t        fvr%t        | j                   d| j                   d      | j
                  du r| j                  du r| j                  du s?t        | j                   d| j
                  d| j                  d| j                  d      t        | j                  | j                  | j                   | j                  ddt        | j                        t        | j                        t        | j                        |dd	d
t        | j                        dS )u!  NOT_STARTED_BY_DESIGN/WAITING_FOR_DEPENDENCY → 단일 by-design 기록.

        schemas/not_started_by_design.schema.json 준수. DISPATCH_NOT_RECEIVED
        에는 호출 불가(ConflationError) — 별개 상태이므로 by-design 레코드로
        표현 자체가 금지된다.z
: verdict=u    은 by-design 정상 보류가 아님 — not_started_by_design 레코드 생성 금지 (DISPATCH_NOT_RECEIVED 봇 미수신 사고와 혼동 불가)Fu:   : by-design 레코드 재검증 실패 — gate_satisfied=z is_incident=z is_blocking_for_adjudicator=u    (정상 보류는 gate 미충족 ∧ ¬incident ∧ ¬blocking 이어야 함; classify_track 우회 객체 직렬화 금지 — I2/I3 우회 차단)Tu
  gate 미충족 → dispatch 자체가 SPEC 상 보류(fired 아님). DISPATCH_NOT_RECEIVED 는 gate 충족·dispatch fired 후 봇이 미수신한 사고로 전제조건(gate_satisfied ∧ dispatch_fired) 자체가 상호배타 — 동일 레코드로 표현 불가.)asserted	rationale)schemar!   r"   r=   r#   r7   r>   r'   r(   r3   by_design_basis#distinct_from_dispatch_not_receivedr@   )r=   r   r   r   r"   r7   r>   r?   NOT_STARTED_SCHEMAr!   r#   r:   r'   r(   r3   r@   )r0   rH   s     r   as_not_started_recordz)TrackClassification.as_not_started_record   s?    << 57MNN!<<.
4<<*: ;Q Q  5(  E)00E9!<<. !""&"5"5!8 9#//2 3/336 7K	K  )||||# !%d&<&<!=(,T-J-J(K"4#6#67. U4 DLL)+
 	
r   N)r8   dict)rH   r    r8   rL   )	r   r   r   r9   r   r:   r@   rC   rK   r   r   r   r<   r<   g   se    MLLN  ''!!!%%t4GY4
$3
r   r<   c                   g }| j                         }| j                         }| j                  rt        }|j	                  d       n|s| j
                  r|j	                  d       | j                  t        fv s| j                  t        k(  r5| j                  s)t        }|j	                  d| j                   d| d       nt        }|j	                  d| j                   d| d       nw| j
                  r$| j                  st        }|j	                  d	       nG| j
                  r$| j                  rt        }|j	                  d
       nt        }|j	                  d       |t        k(  }|t        v }t!        | j"                  | j$                  || j                  |t'        | j(                        t'        | j                        || j
                  | j                  | j                  |||      }t+        |       |S )uM   단일 track 의 not-started 상태 분류. ANTI-CONFLATION INVARIANT 강제.u:   terminal result.json present — not-started 대상 아님u   WARN: gate 미충족인데 dispatch_fired=True 입력 모순 — 미수신 사고로 격상하지 않음(정상 보류 우선, I2 보존)zdesign-phase gate=u    미충족(unmet=u7   ) — dispatch 보류가 SPEC 상 정상. 사고 아님u-   선언된 dependency edge 부분 충족(done=z, unmet=u;   ) — 2608 유형 event-driven 정상 보류. 사고 아님u   gate 충족 ∧ dispatch fired ∧ 봇 미수신 — 봇 미수신 *사고*. 정상 gate 보류와 별개 상태(INCIDENT, adjudicator HOLD 후보)uV   dispatch fired ∧ 봇 수신 — 실행 진행/완료 경로(미수신 사고 아님)ur   gate 충족이나 아직 dispatch fired 전 — 정상 전이 구간. fired 아님 → 봇 미수신 사고 아님rB   )r7   r3   r,   r   appendr*   r#   
GATE_EVENTGATE_AUTOSEQr(   r   r   r+   r   r   	_BLOCKINGr<   r!   r"   r:   r'   _assert_invariants)ctxr@   gate_okunmetr=   r>   is_blockingtcs           r   classify_trackrX      s   G  "G E
"""ST  NN\ ==ZM)MM\)00+GNN$S]]O3DUG LE E
 -GNN556hug FII c&:&:+GNNZ C$8$8&GNNh 2GNN@
 22KY&K	--s445!%c&B&B!C))-- # ; ;$/
B  rIr   c                
   | j                   t        k(  rU| j                  r0| j                  r$| j                  s| j
                  r| j                  st        d| j                   d      | j                  s>| j                   t        t        fvr&t        d| j                   d| j                   d      | j                   t        v r?| j
                  s| j                  r&t        d| j                   d| j                   d      y	y	)
uD   ANTI-CONFLATION INVARIANT 하드 강제. 위반 시 ConflationError.u
   I1 위반 ux   : DISPATCH_NOT_RECEIVED 는 gate 충족 ∧ dispatch fired ∧ 봇 미수신 ∧ incident ∧ blocking 일 때만 가능u
   I2 위반 u   : gate 미충족인데 verdict=uo    — gate 미충족은 NOT_STARTED_BY_DESIGN/WAITING_FOR_DEPENDENCY 만 (봇 미수신 사고와 혼동 금지)u
   I3 위반 u   : 정상 보류 u'    가 incident/blocking 으로 표시됨N)r=   r   r7   r*   r+   r>   r?   r   r"   r   r   _NORMAL_HOLD)rW   s    r   rR   rR     s    
zz**!!''..!RZZL )` ` 
 4 " $CBJJ> R7 7
 	
 
zz\!
"88$4RZZN C( (
 	
 9 "r   c                   | D cg c]  }t        |       }}i }|D ].  }|j                  |j                  d      dz   ||j                  <   0 t        d |D              }t        d |D              }t        t
        d|ddt        gt        t        t        t        gd|D cg c]  }|j                          c}t        |      |||d	d
dgd	S c c}w c c}w )uF   batch 전체 분류 → dependency_wait_state.v1 (adjudicator 입력).r      c              3  :   K   | ]  }|j                   sd   ywr\   N)r>   .0rs     r   	<genexpr>z!classify_batch.<locals>.<genexpr>:  s     4amm14   c              3  :   K   | ]  }|j                   sd   ywr^   )r?   r_   s     r   rb   z!classify_batch.<locals>.<genexpr>;  s     Da&C&C1Drc   batch_context_scanTzanu_v3.batch_hold_adjudicator)consumerblocking_verdictsnon_blocking_verdicts)total
by_verdictincident_countblocking_for_adjudicator_countu   gate 미충족 정상보류(NOT_STARTED_BY_DESIGN/WAITING_FOR_DEPENDENCY) 와 봇 미수신 사고(DISPATCH_NOT_RECEIVED)는 ENUM 차원 분리·상호배타 전제조건으로 보존uv   blocking_verdicts=[DISPATCH_NOT_RECEIVED] 단 하나 — adjudicator 는 정상 보류를 HOLD 로 격상하지 않음)	rG   classifier_versiongenerated_at_basisbatch_idanti_conflation_invariant_heldadjudicator_input_contracttrackssummaryr@   )rX   getr=   sumCLASSIFIER_SCHEMACLASSIFIER_VERSIONr   r   r   r   r   rC   len)contextsro   crowsrj   ra   incidentblockings           r   classify_batchr~   2  s     (00!N10D0!#J A *qyy! <q @
199A4d44HDdDDH#02*.7"7!8%&+ 	&	'
 )--1199;-Y$&.6	
5=	
/  1, .s   C!C>   DONESETTLED	COMPLETEDPASSr   ACCEPTc                    | dz  dz  S )Nmemoryeventsr   )ws_roots    r   _events_dirr   i  s    X((r   c                .    | | dz  j                         S )N.result.json)exists)r   r"   s     r   _has_terminal_resultr   m  s    y--5577r   c                   | | dz  }|j                         sy	 t        j                  |j                  d            }t        |j                  dd            j                         }t        |j                  dd            j                         }t        |j                  dd            j                         |t        v xs/ |j                  t              xs t        fd	t        D              S # t        t
        f$ r Y yw xY w)
ut  task_id 가 durable-success result 를 가졌는지(gate 충족 인식 술어).

    인식 폭(명시·감사 가능):
      * status ∈ _DURABLE_STATUS ({COMPLETED, DONE, SETTLED}), 또는
      * result 가 _DURABLE_RESULT_PREFIX ('PASS') 로 시작, 또는
      * outcome 에 _DURABLE_OUTCOME_TOKENS ({SETTLED, ACCEPT}) 중 하나 포함.
    회장 규칙2 'all-settled' 보다 엄격한 fail-closed 보수 부분집합. 미인식
    upstream → gate 미충족 → 다운스트림 정상 보류(절대 미수신 사고 아님;
    I2·C4 불변). 인식 폭은 gate 충족 방향만 작용 — 분리장벽 byte-불변.r   Futf-8encodingstatus resultoutcomec              3  &   K   | ]  }|v  
 y wr.   r   )r`   tokr   s     r   rb   z#_durable_success.<locals>.<genexpr>  s     A#sg~As   )r   jsonloads	read_text
ValueErrorOSErrorr    rt   upper_DURABLE_STATUS
startswith_DURABLE_RESULT_PREFIXany_DURABLE_OUTCOME_TOKENS)r   r"   rpdr   resr   s         @r   _durable_successr   q  s     
WI\*	*B99;JJr||W|56 x$%++-F
aeeHb!
"
(
(
*C!%%	2&'--/G/! 	B>>01	BA)@AA   s   %C5 5DDc                    | | dz  j                         ry| j                  | d      D ]  }|j                         s y y)Nz.dispatch-fired.jsonTz*dispatch-fired*.jsonFr   glob)r   r"   ps      r   _dispatch_firedr     sO    G901199;[[G9$9:; 88: r   c                    dD ]  }| | | z  j                         s y | j                  | d      D ]  }|j                         s y y)u~   봇 수신 증거: result / collector-result / activation-decision /
    independent-collector-result 중 하나라도 존재.)r   z".independent-collector-result.jsonz.collector-result.jsonz.activation-decision.jsonz+0.activation-decision.jsonTz*activation-decision*.jsonFr   )r   r"   suffixr   s       r   _dispatch_receiptr     se      y))113 [[G9$>?@ 88: r   c                    t        |       dz  }|j                         sy	 t        j                  |j	                  d            S # t
        t        f$ r Y yw xY w)uF   task-2610 batch-hold-system preflight 에서 6-track 정의를 로드.z:task-2610-batch-hold-system-preflight-decision_260519.jsonNr   r   )r   r   r   r   r   r   r   )r   r   s     r   _load_preflight_batchr     sX    GD	A 88:zz!++w+788  s   $A AAc                b   t        |       }t        |       }g }|s|S |j                  di       }|j                  dd      j                         d   }|j                  dd      j                         d   }|j                  dd      j                         d   }|j                  d	d
      j                         d   }|j                  dd      j                         d   }	|j                  dd      j                         d   }
d|t        g fd|t        g fd|t        g fd|t        g fd|	t
        ||||gfd|
t        |||||	gfg}|D ]c  \  }}}}|D cg c]  }t        ||      s| }}|j                  t        |||||t        ||      t        ||      t        ||                   e |S c c}w )u   실 workspace(preflight + memory/events) 스캔으로 6-track context 구성.

    mock 아님 — 실제 디스크의 task-26NN.result/dispatch-fired/activation 증거를
    읽어 gate 충족 여부를 사실 기반으로 계산한다.task_idsTrackA	task-2610r   TrackB	task-2611TrackC	task-2612TrackD	task-2613TrackE	task-2614TrackF	task-2615ABCDEF)r!   r"   r#   r'   r(   r*   r+   r,   )r   r   rt   splitr5   rP   rO   r   rN   r   r   r   r   )r   r   pfoutr   r   r   r   r   r   r   specr!   tidgateupsr2   ups_dones                     r   build_real_contextsr     s   
 !F	w	'B C
vvj"%H 	X{+113A6AX{+113A6AX{+113A6AX{+113A6AX{+113A6AX{+113A6A 
aB	aB	aB	aB	a1a|,	aaAq!_-D %) 
 #tS"B!&6vq&AABB

!"%)1.vs;!263!?(<VS(I		

 J Cs   F,"F,c                    g } t        t        ddt        g dddg            }|j                  t        k(  sJ |j                         |j
                  s|j                  rJ | j                  d|j                  dd       t        t        d	d
t        g dg             }|j                  t        k(  sJ |j                         |j
                  rJ | j                  d|j                  dd       t        t        ddt        g g dd            }|j                  t        k(  sJ |j                         |j
                  r|j                  sJ | j                  d|j                  dd       t        t        ddt        dgg dd            }|j                  t        k(  sJ |j                         |j
                  rJ d       | j                  d|j                  dd       d}	 |j                  d       |sJ d       | j                  ddd       t        t        ddt        g g dd            }|j                  t        k(  r|j
                  rJ | j                  d|j                  dd       t        t        ddt        g ddg            }t        t        d	d
t        g dg             }|j                  s|j                  t        t        fv sJ |j                         |j
                  s|j                  rJ |j                  s|j                  t        k(  sJ |j
                  s|j                  rJ | j                  d|j                  |j                  gdd       t        t        ddt        d d!gd d!gdd            }	t        t        d"d#t        d d!gd gdd            }
|	j                  t        k(  sJ |	j                         |	j
                  r|	j                  sJ |
j                  t        t        fv sJ |
j                         |
j
                  rJ d$       | j                  d%|	j                  |
j                  gdd       t!        d&d't        t        dd gg d gdddddg (      }t!        d&d)t        t        dd gg d gdddddg (      }dx}}	 |j                  d*       	 |j                  d*       |sJ d+       |sJ d,       | j                  d-dd       d.d/l}	 |j%                  d0      }t+        j,                  t.        d2z  d3z  j1                  d45            }t3        t        ddt        ddgdg      gd6      }|j5                  ||       t+        j,                  t+        j6                  |            }t        |d7   d.   d8<   d|d7   d.   d9<   d|d7   d.   d:<   d|d7   d.   d;<   d|d7   d.   d<<   d|d7   d.   d=<   d}	 |j5                  ||       |sJ d>       | j                  d?dd       | S # t        $ r d}Y w xY w# t        $ r d}Y rw xY w# t        $ r d}Y rw xY w# t&        $ r}t)        d1      |d/}~ww xY w# |j8                  $ r d}Y w xY w)@u   결정적 회귀 케이스. mock-only 통과가 아니라 실 entrypoint 의
    동작 명세 — 특히 2608 유형 vs DISPATCH_NOT_RECEIVED 분리를 강제한다.r   r   )r   r   r   r   r   r   C1_2608_partial_depT)caser=   passr   r   )r   r   r   r   r   C2_event_gated_designXz	task-9001F)r*   r+   !C3_dispatch_not_received_incidentYz	task-9002u:   gate 미충족은 절대 미수신 사고로 격상 불가)C4_anticonflation_gate_unmet_not_incidentzshould failu9   DISPATCH_NOT_RECEIVED→by-design 레코드 차단 실패!C5_dnr_cannot_be_by_design_record)r   r   Zz	task-9003C6_fired_received_not_incidentC7_gate_align_I2_preservedGz	task-9101u1u2Hz	task-9102u)   gate 미충족+fired 모순 비격상(C4)#C8_recognition_breadth_C4_invariantRz	task-9201rB   z	task-9202rogueu<   gate_satisfied=True 우회 by-design 직렬화 차단 실패u6   incident=True 우회 by-design 직렬화 차단 실패C9_as_not_started_revalidationr   N
jsonschemau0   C10 requires jsonschema (draft-07 reject 실증)schemasz!dependency_wait_state.schema.jsonr   r   z	c10-batchrr   r=   r7   r*   r+   r>   r?   u1   DNR+¬incident 출력을 schema 가 reject 못함#C10_schema_forward_invariant_reject)rX   r   rP   r=   r   r>   r?   rN   rO   r   r5   r   rK   r   r   r7   r<   	importlibimport_moduleImportErrorAssertionErrorr   r   CANONICAL_WS_ROOTr   r~   validatedumpsValidationError)casesc1c2c3c4conflation_blockedc6c7ac7bc8_dnr	c8_contra
rogue_gaterogue_incident	blocked_g	blocked_ir   _js_e_schemavalid_batchbadrejecteds                         r   regression_casesr    s    E 
l@+&	

B :://;;/~~b&D&DDD	LL/BJJPTUV 
jM	

B ::..:

:.~~	LL1bjjRVWX 
iR%	

B ::..:

:.>>b<<<<	LL="**^bcd 
j;-%	

B ::..:

:.~~[[[	LLERTR\R\fjkl "
  / ZZZ	LL=tLM 
iR$	

B ::))"..@@	LL:rzz[_`a l@M	
C jM	
C !!ckk567 '7 D8;D 7s'F'FFF!!ckk5J&JJJs'F'FFF	LL6!kk3;;7G H
 lT4L4,%	
F lT4L4&%	
I >>22BFNNB2&"D"DDD5!7 7 J8A8I8IJ 7$$Q&QQ$	LL?$nni.?.?@  ! %k3HT&2vee %5$)2J )k3Iu&2vee %4$("N "!I	((1,,W5 TTT9NNN9	LL:DIJ %%l3
 jj	Y	&.
/09	7	0KG !	c;"K0;-
A 	BK
 LLg&
**TZZ,
-C"7CM!Y)-CM!%&)-CM!%&+0CM!'(&+CM!]#6;CM!23HS'" HHH8	LL?  ! LA  "!"f  	  	  >
	0  s`   $W; X *X &X1 
Y ;X
	X
XXX.-X.1	Y:YYY"!Y"c                p   ddl }|j                  d      }|j                  dt        t                     |j                  dg dd	
       |j                  dd       |j                  dd       |j                  |       }t        |j                        }i }|j                  dv rMt               }t        d |D              |dd|d<   |d   d   s"t        t        j                  |dd             y|j                  dv rMt        |      }t        ||j                         }t        |      t#        |      dut%        |      dd|d<   ||d<   t        j                  |dd      dz   }	|j&                  r4ddlm}
  |
|j&                  |	d       t        d|j&                          yt        |	       y) u9  실 entrypoint. --mode classify|regression|both (default both).

    classify: 실 workspace(preflight+events) 스캔 → dependency_wait_state.v1.
    regression: 결정적 회귀(2608 유형 vs DISPATCH_NOT_RECEIVED 분리 강제).
    both: regression PASS 를 게이트로 실 분류 실행(mock-only 불가).r   Nz8anu_v3.batch_dependency_classifier (Track D / task-2613))descriptionz	--ws-root)defaultz--mode)classify
regressionbothr  )choicesr  z
--batch-idzbatch-hold-system-2610..2615z--outr   )r  r  c              3  >   K   | ]  }|j                  d         yw)r   N)rt   )r`   rz   s     r   rb   zmain.<locals>.<genexpr>  s     9aAEE&M9s   F)all_passr   	mock_onlyr  r     )ensure_asciiindentr\   )r  r  )r   preflight_presenttracks_scannedr  real_contextclassification
)atomic_guarded_write)r"   u    batch_dependency_classifier → )argparseArgumentParseradd_argumentr    r   
parse_argsr   r   moder  allprintr   r   r   r~   ro   r   rx   r   anu_v3.cli_output_path_guardr  )argvr  r   argswsr   r   ctxsrealtextr  s              r   mainr$    s    N 	  	A NN;,=(>N?NN<f   NN<)GNHNN7BN'<<D	dll	BCyy** "9599
L
 < ,$**SuQ?@yy(("2&dDMM22w!6r!:$!F!$i	 
^ !%::ca84?Dxx 	FTXXtT:0
;<  	dr   __main__)rS   r   r8   r<   )rW   r<   r8   None)ry   zSequence[TrackContext]ro   r    r8   rL   )r   r   r8   r   )r   r   r"   r    r8   r)   )r   r   r8   zOptional[dict])r   r   r8   zList[TrackContext])r8   z
List[dict]r.   )r  zOptional[Sequence[str]]r8   int)3r   
__future__r   r   dataclassesr   r   pathlibr   typingr   r   r	   r
   rv   rJ   rw   r   r   r   r   r   r   r5   rO   rP   GATE_DEPENDS	frozensetrZ   rQ   r   r   r   r<   rX   rR   r~   r   r   r   r   r   r   r   r   r   r   r  r$  r   
SystemExitr   r   r   <module>r/     s  $J #  (  1 1. /  ./  & / 1 ; /  	
#	 ,-.	aj a $) ) ), $U
 U
 U
rK\ 
F($(03(	(d <= #Y$9: )86$
 ): 4pxv5p z
TV
 r   