
    3j                    x    d Z ddlmZ ddlmZ ddlmZmZmZ dZ	 ed       G d d	             Z
 G d
 d      Zy)us  anu_v3.callback_4tuple_index — deterministic 4-tuple ownership index.

Standalone module for task-2553+29 (NO-CRON variant, 9-R.1/9-R.3).
Zero import/mutation of anu_v3.parallel_batch_coordinator and zero edit of
the frozen anu_v3.batch_join_policy anchor. File-level contract only.

A track's callback 4-tuple is:

    (task_id, dispatch_cron_id, normal_collector_cron_id, fallback_callback_cron_id)

This index lets the registry decide, when a normal-collector or fallback
event is observed, whether that event actually belongs to the claimed track.
Any cross-tuple ownership violation -> TRACK_MISMATCH (regression 7-10).
    )annotations)	dataclass)DictListOptionalTRACK_MISMATCHT)frozenc                  6    e Zd ZU ded<   ded<   ded<   ded<   y)Tuple4strtask_iddispatch_cron_idOptional[str]normal_collector_cron_idfallback_callback_cron_idN)__name__
__module____qualname____annotations__     >/home/jay/workspace/scripts/../anu_v3/callback_4tuple_index.pyr   r      s    L++""r   r   c                  R    e Zd ZdZd	dZd
dZddZddZddd	 	 	 	 	 	 	 	 	 ddZy)Callback4TupleIndexzCBuilds reverse maps cron_id -> owning task_id and validates events.c                <    i | _         i | _        i | _        i | _        y N)_by_task_dispatch_owner_normal_owner_fallback_owner)selfs    r   __init__zCallback4TupleIndex.__init__#   s!    +-/1-//1r   c                R   || j                   |j                  <   |j                  r#|j                  | j                  |j                  <   |j                  r#|j                  | j
                  |j                  <   |j                  r$|j                  | j                  |j                  <   y y r   )r   r   r   r   r   r   r   r    )r!   ts     r   registerzCallback4TupleIndex.register)   s    #$aii 78yyD  !3!34%%=>YYDq99:&&@A		D  !<!<= 'r   c                8    | j                   j                  |      S r   )r   get)r!   r   s     r   	tuple_forzCallback4TupleIndex.tuple_for2   s    }}  ))r   c                0   g }| j                   j                  |      }|| dgS |j                  |k7  r!|j                  d|j                   d|        |j                  s|j                  | d       |j
                  s|j                  | d       |S )z.Internal consistency of a track's own 4-tuple.z: no 4-tuple registeredztask_id mismatch: tuple=	 claimed=z: dispatch_cron_id emptyz!: fallback_callback_cron_id empty)r   r'   r   appendr   r   )r!   r   reasonsr$   s       r   validate_tuplez"Callback4TupleIndex.validate_tuple5   s    MMg&9i678899NN5aii[	'ST!!NNgY&>?@**NNgY&GHIr   N)event_task_idevent_cron_idc          	        g }| j                   j                  |      }|	| d| dgS |||k7  r|j                  | d| d|        | j                  | j                  | j
                  dj                  |i       }|M|j                  |      }||j                  | d| d       |S ||k7  r|j                  | d| d| d	|        |S )
zReturn TRACK_MISMATCH reasons (empty list == owned correctly).

        event_kind in {"normal_collector", "fallback", "dispatch"}.
        Checks both the carried task_id and the cron_id ownership.
        z: unregistered track for z eventz task_id mismatch: event=r*   )dispatchnormal_collectorfallbackz	 cron_id z owned by no registered trackz belongs to z, not )r   r'   r+   r   r   r    )	r!   claimed_task_id
event_kindr.   r/   r,   r$   	owner_mapowners	            r   classify_eventz"Callback4TupleIndex.classify_eventC   s#     MMo.9&''@FSTT$/)INN,7 G*+- ,, $ 2 2,,
 #j"
	 	 $MM-0E}!l)M?:WX  /)!l)M?,ug N*+- r   )returnNone)r$   r   r9   r:   )r   r   r9   zOptional[Tuple4])r   r   r9   	List[str])
r4   r   r5   r   r.   r   r/   r   r9   r;   )	r   r   r   __doc__r"   r%   r(   r-   r8   r   r   r   r   r       sY    M2J*& (,'+) ) 	)
 %) %) 
)r   r   N)r<   
__future__r   dataclassesr   typingr   r   r   r   r   r   r   r   r   <module>r@      sG    # ! ' '! $# # #L Lr   