
    3j"                       U 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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eeeeeeeefZded<    ee      dk(  sJ d       eeefZded<   ededediZded<   e
eefeeefeeefeeefeeefeeeeeefeeeefeeefeeefeeefededediZded<   d&dZd'd Zd(d!Ze G d" d#             Z d)d$Z!y%)*uK  anu_v3.track_loop_state — track-level loop state machine (task-2553+17, 9-R.3).

13-state transition table for a single track inside a parallel batch.

Authority: task-2553+17.md §4(9) + §12 9-R.3.

States (13)
-----------
PLANNED, DISPATCHED, RUNNING, NORMAL_COLLECTOR_COMPLETED, CODEX_AUDIT_PENDING,
ANU_ADJUDICATION_PENDING, AUTO_MICRO_FIX, RETRY_WITHIN_SCOPE, ACCEPTED,
LANDING_PENDING, MERGE_READY, MERGED, HOLD_FOR_CHAIR.

Terminal       : ACCEPTED, MERGED, HOLD_FOR_CHAIR.
Retry ceiling  : RETRY_WITHIN_SCOPE may be entered at most ``retry_ceiling``
                 times (per profile/goal); over the ceiling the only legal
                 successor is HOLD_FOR_CHAIR.
Precedence     : HOLD_FOR_CHAIR > RETRY_WITHIN_SCOPE > AUTO_MICRO_FIX.
Callback prec. : if NORMAL_COLLECTOR_COMPLETED has already been reached, a
                 later fallback callback is classified DUPLICATE_CALLBACK_IGNORED
                 (the state machine never regresses out of / past it for a
                 fallback event).

This module is pure (stdlib only) and never mutates any existing tracked file.
    )annotations)	dataclassfield)DictListTuplePLANNED
DISPATCHEDRUNNINGNORMAL_COLLECTOR_COMPLETEDCODEX_AUDIT_PENDINGANU_ADJUDICATION_PENDINGAUTO_MICRO_FIXRETRY_WITHIN_SCOPEACCEPTEDLANDING_PENDINGMERGE_READYMERGEDHOLD_FOR_CHAIRTuple[str, ...]
ALL_STATES   z"13-state machine invariant (9-R.3)TERMINAL_STATES         zDict[str, int]
PRECEDENCE zDict[str, Tuple[str, ...]]TRANSITIONSc                    | t         v S )N)r   states    9/home/jay/workspace/scripts/../anu_v3/track_loop_state.pyis_terminalr$   g   s    O##    c                @    | t         vrt        d|       t         |    S )Nzunknown state: )r   KeyErrorr!   s    r#   legal_successorsr(   k   s'    K	233ur%   c                2    |t         j                  | d      v S )Nr   )r   get)srcdsts     r#   is_legal_transitionr-   q   s    +//#r***r%   c                      e Zd ZU dZded<   eZded<   dZded<   dZded	<   d
Z	ded<    e
e      Zded<    e
e      Zded<   ddZddZddZddZddZddZy)TrackLoopStatea  Mutable per-track loop position with audited history.

    ``retry_ceiling`` defaults to 2 and is normally supplied from the
    track goal / policy_profile (Track3). Over the ceiling the machine
    refuses any RETRY_WITHIN_SCOPE entry and forces HOLD_FOR_CHAIR.
    strtrack_idr"   r   intretry_ceilingr   retry_countFboolnormal_collector_reached)default_factory	List[str]historyzList[Tuple[str, str, str]]rejectedc                    | j                   t        vrt        d| j                         | j                  s%| j                  j	                  | j                          | j                   t
        k(  rd| _        y y )Nzinvalid initial state T)r"   r   
ValueErrorr9   appendr   r6   )selfs    r#   __post_init__zTrackLoopState.__post_init__   s\    ::Z'5djj^DEE||LL

+::33,0D) 4r%   c                \   | j                  |      \  }}|sF| j                  j                  | j                  ||f       t	        d| j                  d|d|       || _        |t
        k(  rd| _        |t        k(  r| xj                  dz  c_        | j                  j                  |       y)z=Apply a transition or raise ValueError if illegal (rejected).zillegal transition z->z: Tr   N)
can_transitionr:   r=   r"   r<   r   r6   r   r4   r9   )r>   r,   okreasons       r#   
transitionzTrackLoopState.transition   s    ((-
FMM  $**c6!:;%djj^2cWBvhG  
,,,0D)$$!C r%   c                B   |t         vrdd|fS t        | j                        rd| j                   dfS t        | j                  |      sd| d| j                   fS |t        k(  r8| j
                  | j                  k\  rdd| j                   d| j
                   dfS y)	NFzunknown target state u    is terminal — no successorsz not in legal successors of zretry ceiling z reached (count=u   ) — only HOLD_FOR_CHAIR legal)TrB   )r   r$   r"   r-   r   r4   r3   )r>   r,   s     r#   rA   zTrackLoopState.can_transition   s    j 1#999tzz"TZZL(FGGG"4::s3SE!=djj\JJJ$$)9)9T=O=O)O !3!3 4 5**++JL 
 r%   c                   |D cg c]  }t        | j                  |      s| }}|st        d| d| j                         t        |d d      }|d   }|t        k(  r| j
                  | j                  k\  rt        S |S c c}w )a  Pick the highest-precedence legal successor among *candidates*.

        Implements 9-R.3 precedence HOLD_FOR_CHAIR > RETRY_WITHIN_SCOPE >
        AUTO_MICRO_FIX. Candidates outside PRECEDENCE keep insertion order
        and rank below the three precedence states. If a precedence pick is
        RETRY_WITHIN_SCOPE but the ceiling is exhausted it falls back to
        HOLD_FOR_CHAIR (still highest), guaranteeing forward progress.
        zno legal candidate among z from c                .    t         j                  | d      S )Nr   )r   r*   )cs    r#   <lambda>z-TrackLoopState.resolve_next.<locals>.<lambda>   s    *..A. r%   T)keyreverser   )r-   r"   r<   sortedr   r4   r3   r   )r>   
candidatesrH   legalrankedpicks         r#   resolve_nextzTrackLoopState.resolve_next   s     'Mq*=djj!*LMM+J<vdjj\J  .

 ay%%$*:*:d>P>P*P!! Ns
   BBc                Z    |dk(  r| j                   ry|dk(  ry|dk(  ryt        d|      )zClassify an incoming callback event for this track.

        ``kind`` is "normal" or "fallback". If the normal collector has
        already completed, any later fallback is DUPLICATE_CALLBACK_IGNORED.
        fallbackDUPLICATE_CALLBACK_IGNOREDnormalNORMAL_COLLECTOR_ACCEPTEDCALLBACK_PENDINGzunknown callback kind )r6   r<   )r>   kinds     r#   classify_callbackz TrackLoopState.classify_callback   s@     :$"?"?/8.:%1$:;;r%   c                   | j                   | j                  t        | j                        | j                  | j                  | j
                  t        | j                        | j                  D cg c]  \  }}}|||d c}}}dS c c}}}w )N)fromtorC   )r1   r"   terminalr3   r4   r6   r9   rejected_transitions)	r1   r"   r$   r3   r4   r6   listr9   r:   )r>   abrs       r#   to_dictzTrackLoopState.to_dict   s{    ZZ#DJJ/!//++(,(E(EDLL)CG==% %6?q!Q!q1%
 	
%s   0BN)returnNone)r,   r0   rd   re   )r,   r0   rd   zTuple[bool, str])rM   r8   rd   r0   )rX   r0   rd   r0   rd   zDict[str, object])__name__
__module____qualname____doc____annotations__r	   r"   r3   r4   r6   r   r_   r9   r:   r?   rD   rA   rQ   rY   rc   r   r%   r#   r/   r/   u   st     ME3M3K%*d*t4GY4+0+FH(F1! 2<
r%   r/   c                     t        t              t        t              t        t              t
        j                         D  ci c]  \  } }| t        |       c}} ddS c c}} w )zDStatic, serialisable description of the table (regression evidence).zQNORMAL_COLLECTOR_COMPLETED reached => later fallback = DUPLICATE_CALLBACK_IGNORED)statesr]   
precedencetransitionscallback_precedence)r_   r   r   dictr   r   items)sts     r#   transition_table_specru      sT     z"):&/:/@/@/BCtq!47
C)	 	 Ds   AN)r"   r0   rd   r5   )r"   r0   rd   r   )r+   r0   r,   r0   rd   r5   rf   )"rj   
__future__r   dataclassesr   r   typingr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   rk   lenr   r   r   r$   r(   r-   r/   ru   r   r%   r#   <module>rz      s  2 # ( $ $ 

9 + 5 !) #	! 

O   :" BB B$,fn#E E
 AA
N  j.).)(.9!4n E2NC -/A>R^4k>2&.)b
BB)+' 0$+ k
 k
 k
\r%   