
    3j                        d Z ddlmZ ddlmZmZ ddlmZmZm	Z	 dZ
dZdZh dZe G d	 d
             Ze G d d             Zdd	 	 	 	 	 ddZddZy)u  anu_v3.batch_runtime_join_policy — +29 standalone batch join policy.

DISTINCT from the frozen anchor anu_v3.batch_join_policy (byte-0, §9). This is
a NEW standalone module for task-2553+29; the frozen file is neither imported
nor edited (9-R.3 file-level contract, §8 forbidden-target collision avoided by
using a separate path).

Join rules implemented:
  * 구현목표 11 / regression 11 — one track HOLD does not block independent
    DONE tracks (tracks are joined by independence, not by worst-case).
  * regression 2 — a track whose result is ready but whose fallback is still
    PENDING is NON-blocking: it still contributes its terminal outcome.
  * 구현목표 12 / regression 14 — closeout eligibility is *derived* from the
    batch state (never from chat memory) and only ever PROPOSED, never
    confirmed (§7: closeout 확정 금지).
  * regression 12 — any cross-task artifact contamination -> BATCH_HOLD.
    )annotations)	dataclassfield)DictListSequenceBATCH_ACCEPT
BATCH_HOLDWAIT_FOR_FALLBACK>   DONEPASSMERGEDc                  J    e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   y	)
TrackJoinViewstrtask_idterminal_outcomeclassificationboolhold_for_chairfallback_state
has_resultN)__name__
__module____qualname____annotations__     7/home/jay/workspace/anu_v3/batch_runtime_join_policy.pyr   r       s%    Lr   r   c                      e Zd ZU  ee      Zded<    ee      Zded<    ee      Zded<   e	Z
ded<    ee      Zded<   y	)

JoinResult)default_factoryz	List[str]independent_done_tracksheld_trackswaiting_tracksr   batch_next_actionblocking_relationsN)r   r   r   r   listr#   r   r$   r%   r	   r&   r'   r   r   r   r!   r!   *   sK    ).t)DYD"48K8 %d ;NI;)s)$)$$?	?r   r!   r   )contaminationc               0   t               }|rt        |_        | D ]k  }|j                  t        v r2|j
                  s&|j                  j                  |j                         G|j                  j                  |j                         m |j                  j                  d       |S | D ]  }|j
                  s|j                  dk(  r&|j                  j                  |j                         D|j                  t        v r&|j                  j                  |j                         ||j                  s5|j                  dk(  r&|j                  j                  |j                         |j                  j                  |j                          |j                  rB|j                  r6|j                  j                  d|j                  d|j                  d       |j                  rt        |_        |S |j                  rt        |_        |S t        |_        |S )z5Apply the independence join policy across all tracks.z&cross_task_contamination -> BATCH_HOLDHOLDPENDINGzheld=z do NOT block independent done=z (join by independence))r!   r
   r&   r   _SETTLEDr   r#   appendr   r$   r'   r   r   r%   r   r	   )viewsr)   resvs       r   joinr2   3   s    ,C * 	2A!!X-a6F6F++22199=&&qyy1		2
 	%%&NO
 -q11V;OO""199-)''..qyy9|| 0 0I =%%aii0!!!)),-  366%% ; ;=	

  *
 J	 
		 1 J !-Jr   c                   | j                  di       xs i }| j                  dg       xs g }| j                  d      }t        |      xr  t        d |j                         D              }|xr | xr	 |t        k(  }|sd}nY|rd}nT|sP|j                         D cg c]/  \  }}|j                  d      t        vs|j                  d      r|1 }	}}d	|	 }nd
}t        |      dd|dS c c}}w )u   Derive (PROPOSE, never confirm) closeout eligibility from batch_state.

    구현목표 12 / regression 14: input is the batch_state dict ONLY — no chat
    memory, no external signal. §7: confirmed is hard-pinned False.
    tracksr)   r&   c              3  r   K   | ]/  }|j                  d       t        v xr |j                  d        1 yw)r   r   N)getr-   ).0recs     r   	<genexpr>z+derive_closeout_proposal.<locals>.<genexpr>o   s<      ' 
#	$	0S#''BR:S6SS's   57zno tracks in batch_statez.cross-task contamination present -> ineligibler   r   ztracks not all settled: uw   all tracks settled (MERGED/PASS/DONE), no contamination — closeout PROPOSED; chair confirmation still required (§7).batch_stateF)eligiblederived_from	confirmedreason)r6   r   allvaluesr	   itemsr-   )
r:   r4   r)   next_actionall_settledr;   r>   tidr8   	unsettleds
             r   derive_closeout_proposalrF   e   s    __Xr*0bFOOOR8>BM//"56Kv, 3 '==?' $K P=0P[L5PH+	A &
Cww)*(:cggFV>W 
	 
 ,I;7J 	 N%	 
s   4C+N)r/   zSequence[TrackJoinView]r)   zSequence[object]returnr!   )r:   Dict[str, object]rG   rH   )__doc__
__future__r   dataclassesr   r   typingr   r   r   r	   r
   r   r-   r   r!   r2   rF   r   r   r   <module>rM      s   " # ( ' '
'  &    @ @ @ ')/"/ $/ 	/d%r   