
    3j                       U d Z ddlmZ ddlZddlmZmZ ddlmZm	Z	m
Z
mZmZ ddlmZmZmZmZ ddlmZmZmZ ddlmZ dd	lmZmZmZmZmZmZ dd
lm Z  dZ!dZ"e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Z0dZ1	 ddl2m3Z4  e5 e6e4            Z3de7d<   d.dZ9 ed !       G d" d#             Z: ed !       G d$ d%             Z;e G d& d'             Z< G d( d)      Z=d*d+	 	 	 	 	 d/d,Z>g d-Z?y# e8$ r dZ3Y cw xY w)0um  anu_v3.runtime_event_loop — ANU runtime event loop driven by the durable
4-tuple registry (task-2553+54, 회장 정정·결정).

회장 §1 verbatim: "우리가 원하는 것은 사후 복원이 아니라 즉시 진행이다.
normal callback durable-success → registry write-back → ANU runtime event
loop가 즉시 감지 → batch coordinator 취합 → 다음 작업 dispatch 또는
consolidated summary 생성까지 자동 진행."

Problem (회장 §2 diagnosis): +44 durable registry, +47 read-only event
trigger, +49 self-chain quarantine selector and +53 durable-success
write-back / batch-settle evaluator each exist, but there was no single
*runtime event loop* that interprets a durable-registry append/update as a
progress event and immediately drives the next step (single-task next_action
/ batch all-settled / consolidated summary candidate / next-phase ANU-key
dispatch candidate) without waiting for a fixed-time gate or a dead-man
fallback.

This module is that loop. It is a pure, read-only consumer (9-R.1):

  * ``callback_4tuple_index.jsonl`` is the **state source** — read-only.
    This module NEVER writes the registry; the durable-success write-back
    is +53's sole responsibility (no new write-back logic here).
  * ``schedule_history`` is an audit log — it is NEVER a progress trigger.
  * ``cron-list`` is the current reservation state — NEVER an authority.
  * a fixed-time gate / dead-man fallback is a missed-callback safety net —
    NEVER a progress trigger. Offering one as the progress trigger is a
    hard FAIL (``FORBIDDEN_TRIGGER_SOURCE``, 회장 §3/§5 verbatim).
  * the ONLY accepted progress trigger is a durable-registry
    ``registry_completed_event`` (a normal-callback durable-success
    append/update).

Reuse, not re-implement (회장 §10 9-R.1):

  * +44 ``anu_v3.callback_4tuple_registry`` — read-only registry scan.
  * +47 ``anu_v3.callback_event_trigger.CallbackEventTrigger`` — the
    single-task next_action resolver (already registry-event-driven).
  * +49 ``anu_v3.authoritative_verdict_selector`` /
    ``anu_v3.self_collector_guard`` — self-chain verdict is permanently
    quarantined; a non-ANU collector record is HOLD.
  * +53 ``anu_v3.batch_settle_writeback.evaluate_batch_settle`` — batch
    all-settled over the durable-success write-back lines.

Authority boundary (회장 §2.12 / §8): the loop only *detects / evaluates /
proposes*. It has NO dispatch / merge / write authority. Every next-phase
ANU-key dispatch and every consolidated summary is emitted as a **proposal
JSON only** — zero auto-dispatch / auto-merge / auto-closeout.

Idempotency (회장 §2.9 / §2.10): the loop is a pure deterministic function
of the registry state. Each progress event has a deterministic ``event_id``;
duplicate events (e.g. a dead-man-fired duplicate COMPLETED line, or the
same event scanned twice) are de-duplicated so the loop yields exactly one
next_action / one consolidated summary / one dispatch candidate per
task/batch and never a duplicate.

Layer A / NO-CRON: ZERO cron register/remove, ZERO dispatch, ZERO merge,
ZERO ``cokacdir`` / ``subprocess`` exec, ZERO registry write.
    )annotationsN)	dataclassfield)DictListOptionalSequenceTuple)AUTHORITATIVE_PASSCOLLECTOR_ROLE_ANUVerdictRecordselect_authoritative_verdict)TERMINAL_WRITEBACK_VERDICTS DURABLE_SUCCESS_WRITEBACK_SCHEMAevaluate_batch_settle)Callback4TupleRegistry)CallbackEventTriggerFORBIDDEN_PROGRESS_TRIGGERSNEXT_ACTION_READYTRIGGER_DEAD_MANTRIGGER_FIXED_TIMETRIGGER_REGISTRY_COMPLETED)guard_self_collector_sessionzanu_v3.runtime_event_loop.v1zruntime_event_loop_result.v1normal_callback_durable_successdurable_success_writebackregistered_no_progressself_chain_quarantined_ignorednon_anu_collector_holdr   WAITALL_SETTLEDNO_REGISTRY_NO_ACTIONFORBIDDEN_TRIGGER_SOURCETRACK_MISMATCHHOLD_FOR_CHAIRnoneproposal)DEFAULT_ANU_KEYSzTuple[str, ...]r'    c                     t        j                  dj                  d | D              j                  d            j	                         S )N|c              3  :   K   | ]  }|dn
t        |        y w)N str).0ps     0/home/jay/workspace/anu_v3/runtime_event_loop.py	<genexpr>z_sha.<locals>.<genexpr>   s     <qyc!f,<s   utf-8)hashlibsha256joinencode	hexdigest)partss    r1   _shar:      s7    >><e<<CCGLik    T)frozenc                      e Zd ZU dZded<   dZded<   dZded<   dZded<   d	Zded
<   dZ	ded<   dZ
ded<   dZded<   dZded<   y)SingleTaskSpecuG  A single (non-parallel) task watched by the loop.

    ``next_phase`` (optional) declares a follow-up ANU-key dispatch — it is
    emitted as a proposal only (회장 §2.6 / §8). ``collector_key`` /
    ``executor_key`` (optional) let the loop run the +49 self-chain
    quarantine over a single-task durable-success record.r.   task_idNOptional[str]expected_dispatch_idexpected_chat_idexpected_dispatch_cron_iddispatch_next_tasknext_action_kindOptional[Dict[str, object]]next_action_payload
next_phasecollector_keyexecutor_key)__name__
__module____qualname____doc____annotations__rA   rB   rC   rE   rG   rH   rI   rJ   r(   r;   r1   r>   r>      se    = L*.-.&*m*/3}30c07;4;.2J+2#'M='"&L-&r;   r>   c                  B    e Zd ZU dZded<   ded<   dZded<   dZd	ed
<   y)	BatchSpecu   A parallel batch watched by the loop. ``expected_tracks`` =
    sequence of (track_id, task_id). ``next_phase`` (optional) declares the
    post-consolidation ANU-key dispatch — proposal only.r.   batch_idzSequence[Tuple[str, str]]expected_tracksNr@   this_track_idrF   rH   )rK   rL   rM   rN   rO   rT   rH   r(   r;   r1   rQ   rQ      s)    > M..#'M='.2J+2r;   rQ   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<   ded<   ded<   ded<   ded<   ded<   ded<    ee      Zded<   edd       Zd dZ	y)!RuntimeEventLoopResultr.   schemagenerated_at_kstregistry_pathr@   progress_triggerverdictboolfixed_time_useddead_man_useddead_man_signal_observedfallback_pending_non_blocking	authorityaction_modeList[Dict[str, object]]events_observedintduplicate_events_suppressedsingle_task_resultsbatch_resultsconsolidated_summary_candidatesdispatch_candidatesquarantined_eventshold_for_chair)default_factoryz	List[str]reasonsc                2    | j                   t        t        fvS N)r[   LOOP_FORBIDDEN_TRIGGERLOOP_HOLD_FOR_CHAIRselfs    r1   okzRuntimeEventLoopResult.ok   s    ||"$
 
 	
r;   c                   i d| j                   d| j                  d| j                  d| j                  d| j                  d| j
                  d| j                  d| j                  d	| j                  d
| j                  d| j                  dt        | j                        d| j                  dt        | j                        dt        | j                        dt        | j                         dt        | j"                        t        | j$                        | j&                  t        | j(                        dS )NrW   rX   rY   rZ   r[   r]   r^   r_   r`   ra   rb   rd   rf   rg   rh   ri   rj   )rk   rl   rn   )rW   rX   rY   rZ   r[   r]   r^   r_   r`   ra   rb   listrd   rf   rg   rh   ri   rj   rk   rl   rn   rs   s    r1   to_jsonzRuntimeEventLoopResult.to_json   s{   
dkk
 5 5
 T//
  5 5	

 t||
 t33
 T//
 '(E(E
 ,22
 
 4++
 tD$8$89
 *4+K+K
  "4(@(@#A!
" T$"4"45#
$ .t440%
* "4(@(@#A+
, #'t'>'>"?"11DLL)1
 	
r;   Nreturnr\   )rz   Dict[str, object])
rK   rL   rM   rO   r   rw   rn   propertyru   rx   r(   r;   r1   rV   rV      s    K##L""#''N,,!$$00**%<<00//t4GY4
 

r;   rV   c                      e Zd ZdZed	 	 	 	 	 ddZddZddZ	 	 	 	 ddZ	 	 ddZ		 	 	 	 	 	 	 	 	 	 ddZ
	 	 	 	 	 	 dd	Zd
d
eddd	 	 	 	 	 	 	 	 	 	 	 ddZy)RuntimeEventLoopa"  Durable-registry-driven runtime event loop (read-only consumer).

    The loop never writes the registry, never registers/cancels a cron,
    never dispatches/merges. ``run`` is idempotent: repeated runs over the
    same registry state yield an identical result and zero side-effects.
    )anu_keysc               `    || _         t        d |D              | _        t        |      | _        y )Nc              3  &   K   | ]	  }|s|  y wrp   r(   )r/   ks     r1   r2   z,RuntimeEventLoop.__init__.<locals>.<genexpr>   s     7AQa7s   )registrytupler   r   _trigger)rt   r   r   s      r1   __init__zRuntimeEventLoop.__init__   s)     !777,X6r;   c                j    	 | j                   j                  j                         S # t        $ r Y yw xY w)NF)r   ledger_pathis_fileOSErrorrs   s    r1   _registry_presentz"RuntimeEventLoop._registry_present   s2    	==,,4466 		s   #& 	22c                   ddl }g }	 | j                  j                  j                         s|S | j                  j                  j	                  d      }|j                         D ]I  }|j                         }|s	 |j                  |      }t        |t              s9|j                  |       K |S # t
        $ r |cY S w xY w# t        $ r Y jw xY w)u   All raw JSONL lines (fail-safe; corrupt lines skipped). The
        loop only READS — it never appends here (no +53 write-back).r   Nr3   )encoding)jsonr   r   r   	read_textr   
splitlinesstriploads
ValueError
isinstancedictappend)rt   r   outtextrawds         r1   
_all_lineszRuntimeEventLoop._all_lines   s     	')	==,,446
==,,666HD ??$ 		C))+CJJsO !T"

1		 
  	J	  s(   %B2 &B2 ;C2C ?C 	CCc                   t        |j                  d      xs d      }t        |j                  d      xs d      }t        |j                  d      xs d      }t        |j                  d      xs d      }t        |j                  d      xs d      }t        |      xr ||k(  }|r|t        k7  rt        | d|dgfS t        |||xs t        |	      }t        t        d
|t        v rdn|xs d||||xs t        |d|	      g|| j                        }	|j                  r"|	j                  t        k7  s|	j                  dk  r&t        | d|	j                  d|j                   dgfS t        | dgfS )a  Interpret a +53 durable_success_writeback line as a progress
        event, routing self-chain / non-ANU collectors through +49.

        Returns (event_kind, reasons). Self-chain origin -> permanently
        quarantined (ignored as a progress trigger). collector_role != ANU
        -> HOLD. Independent-ANU AUTHORITATIVE_PASS -> a valid durable-
        success progress event.
        r?   r,   rI   rJ   collector_roleauthoritative_verdictz: collector_role=ut    != 'ANU' — non-ANU collector record is NOT a progress trigger; routed to HOLD via +49 guard (회장 §8 / reg 9).)rJ   rI   r   is_executor_self_sessioncollector_resultPASSFAILindependent_anu)	kindr[   r?   rJ   rI   r   session_is_executor_selfclaimed_origindetail)r?   r      zU: +49 selector/guard did NOT confirm an independent-ANU AUTHORITATIVE_PASS (selector=z, guard_ok=ug   ) — self-chain verdict permanently QUARANTINED, ignored as a progress trigger (회장 §5.D / reg 8).uq   : independent-ANU AUTHORITATIVE_PASS durable-success write-back — valid registry progress event (회장 §2.1).)r.   getr\   r   EVENT_NON_ANU_HOLDr   r   r   r   r   ru   classificationr   independent_anu_countEVENT_SELF_CHAIN_QUARANTINEDEVENT_DURABLE_SUCCESS_WRITEBACK)
rt   liner?   rI   rJ   r   r[   self_sessiongsels
             r1   _classify_writeback_eventz*RuntimeEventLoop._classify_writeback_event  s    dhhy)/R0DHH_5;<488N39r:TXX&67=2>dhh67=2>M*L}/Ln0BB%),^,> ?E E(   )%')?-?%1	
 ++"== #!+V#!-"/#1#G5G-9#4" ]]#
& tts))-??%%)/) @%%(ADD6 :222   /i K K1
 
 	
r;   c                J   g }g }t               }d}| j                         D ]  }t        |j                  d      xs d      }|t        k(  r| j                  |      \  }}t        ||j                  d      |j                  d      |j                  d      |j                  d      |      }	|	|||j                  d      |j                  d      |j                  d      |j                  d	      |j                  d      |d
	}
|	|v r|dz  }|j                  |	       |t        t        fv r|j                  |
       |j                  |
       2t        |j                  d      xs d      }|dk(  rt        nt        }t        |xs d|j                  d      |j                  d      |j                  d      ||      }	|	||xs d|j                  d      d||j                  d      g d}
|	|v r|dz  }|j                  |	       |j                  |
        |||fS )u  Scan the registry and build the de-duplicated progress-event
        list (+ quarantined list + duplicate-suppressed count).

        Idempotency (회장 §2.10): each event has a deterministic
        ``event_id``; an identical event observed again (a dead-man-fired
        duplicate COMPLETED line, or the same registry scanned twice) is
        suppressed — counted once, never re-driven.r   rW   r,   r?   rR   writeback_idwriteback_classificationtrack_idr   )	event_id
event_kindschema_kindr?   rR   r   r   r   rn   r   status	COMPLETEDz callback_4tuple_ledger_record.v1dispatch_idnormal_collector_cron_idNrole)r   r   r   r?   rR   r   r   rn   )setr   r.   r   r   r   r:   addr   r   r   %EVENT_NORMAL_CALLBACK_DURABLE_SUCCESSEVENT_REGISTERED_NO_PROGRESS)rt   eventsquarantinedseen
suppressedlnrW   r   whyeidrecr   s               r1   _build_eventszRuntimeEventLoop._build_eventsW  s8    +-/1
//# H	#B)/R0F99 ::2>	cFF9%FF:&FF>*FF56 !$"&#)!vvi0 "z 2 "z 2-/VV/. 1321  # $;!OJ0&   &&s+MM#&
 RVVH-34 , :5 
 @@FF9%FF=)FF56 !$"&D"D!vvi0 $$FF6N! $;!OJc"QH	#R {J..r;   c                   t        | j                        }dt        t        d||dt	        | j                        |t        |      t        |      ddS )uO  Build a next-phase ANU-key dispatch **candidate** (proposal).

        The loop has NO dispatch authority. The candidate names the
        independent-ANU key set as the only legitimate owner; an
        unresolvable ANU key set is surfaced (never a silent self-dispatch
        — 회장 §5 verbatim forbids executor self-dispatch).z/anu_v3.runtime_event_loop.dispatch_candidate.v1FTu   PROPOSAL ONLY — next-phase dispatch must be enacted by an independent ANU-key session; the event loop performs ZERO auto-dispatch / merge / closeout (회장 §2.6/§2.12/§8). executor self-dispatch is forbidden (회장 §5).)rW   ra   rb   auto_executedsource	source_idanu_key_owner_requiredr   anu_keys_resolvablerH   gate_evidencenote)r\   r   AUTHORITY_NONEACTION_MODE_PROPOSALrw   r   )rt   r   r   rH   r   anu_resolvables         r1   _dispatch_candidatez$RuntimeEventLoop._dispatch_candidate  sV     dmm,G'/""&*T]]+#1z*!-0D
 	
r;   c                    dt         t        ddd||j                  d      |j                  d      |j                  d      |j                  d      d	d
S )Nz;anu_v3.runtime_event_loop.consolidated_summary_candidate.v1F	CANDIDATE$CONSOLIDATED_SUMMARY_CANDIDATE_READYevaluated_at_basisall_settledall_authoritative_passtrack_statesu   PROPOSAL ONLY — consolidated summary candidate generated by the runtime event loop on the normal-callback durable-success event (회장 §2.5). No auto-closeout.)rW   ra   rb   r   r   r   rR   generated_basisr   r   r   r   )r   r   r   )rt   rR   settle_jsons      r1   _summary_candidatez#RuntimeEventLoop._summary_candidate  s_    '/"< */CD&??=9&1oo(' (OON;B!
 	
r;   r(   Fr,   )single_tasksbatchesprogress_trigger_sourcedead_man_signalrX   c               R   g }|t         v r|j                  d|dt        dt        dt        d	       t        d1i dt        d|dt        | j                  j                        d	d
dt        d|t        k(  d|t        k(  d|dddt        dt        dg dddg dg dg dg dg ddd|S | j                         s|j                  d       t        d1i dt        d|dt        | j                  j                        d	t        dt        ddddd|dddt        dt        dg dddg dg dg dg dg ddd|S |r|j                  d       | j                         \  }}}	|	r|j                  |	 d        |D ]=  }
|
j!                  dg       }t#        |t$              s&|j'                  d! |D               ? g }g }g }d}t)               }|D ]  }|j*                  |v r|j-                  |j*                         | j.                  j1                  |j*                  |j2                  |j4                  |j6                  t        |j8                  |j:                  |"      }|j=                         }|j                  |       |j                  |j>                         |j>                  d#k(  r d}|j                  |j*                   d$       |j@                  s
|j>                  tB        k(  s|jD                  s-|j                  | jG                  d%|j*                  |jD                  |jH                  |jJ                  |jL                  d&'              g }g }t)               }|D ]  }|jN                  |v r|j-                  |jN                         tQ        |jN                  t%        |jR                        | j                  j                  |jT                  (      }|j=                         }|j                  |       |jV                  r|jX                  r|j                  tZ               |j                  | j]                  |jN                  |             |j                  d)|jN                   d*       |jD                  s|j                  | jG                  d+|jN                  |jD                  |j^                  |jV                  |jX                  d,'             z|j                  t`               |j                  d)|jN                   d-tc        |jd                         dtc        t%        |jR                               d.        |rtf        }n>tZ        |v rtZ        }n/tB        |v rth        }n |rt`        }nt`        }|j                  d/       |j                  d0       t        d1i dt        d|dt        | j                  j                        d	t        d|ddddd|dddt        dt        d|d|	d|d|d|d|d|d|d|S )2u  Interpret durable-registry append/update as progress events and
        immediately drive the next step (회장 §2 1~12).

        * ``progress_trigger_source`` MUST be ``registry_completed_event``.
          A ``fixed_time_gate`` / ``dead_man_fallback`` -> hard FAIL
          (``FORBIDDEN_TRIGGER_SOURCE``; 회장 §3/§5 verbatim, reg 10).
        * a ``dead_man_signal`` is recorded as observed but is NEVER
          promoted to a progress trigger (회장 §3, reg 6).
        * a missing registry -> ``NO_REGISTRY_NO_ACTION`` recovery state,
          no action (reg 11).
        * single task: +47 ``CallbackEventTrigger.scan`` -> READY/WAIT;
          identity mismatch -> ``TRACK_MISMATCH`` (reg 1/12).
        * batch: +53 ``evaluate_batch_settle`` -> WAIT (partial) /
          ALL_SETTLED (every track durable-success). all-settled &
          all-AUTHORITATIVE_PASS -> consolidated summary candidate (reg
          2/3/4/15/16).
        * a declared ``next_phase`` -> ANU-key dispatch **candidate**
          (proposal only, reg 13/14; 회장 §2.12/§8).
        * fallback/dead-man pending is NON-blocking (reg 5).
        * idempotent across repeated runs and duplicate events (reg 6/7).
        zprogress_trigger_source=z is a /u9   -class trigger — FORBIDDEN as a progress trigger; only uV    (a durable-registry append/update) drives progress (회장 §3/§5 verbatim, reg 10).rW   rX   rY   rZ   Nr[   r]   r^   r_   r`   Tra   rb   rd   rf   r   rg   rh   ri   rj   rk   rl   Frn   u   durable registry absent — NO action; this is the correct fail-safe recovery state (defer to schedule_history audit + canonical artifact, never a misjudged progress). The registry is the state source; its absence is not a trigger (회장 §3, reg 11).u   a dead-man signal was OBSERVED but is EXPLICITLY NOT promoted to a progress trigger — missed-callback safety net only (회장 §3, reg 6).u    duplicate registry event(s) suppressed (deterministic event_id) — idempotent: a re-scanned / dead-man-duplicated event is counted once, never re-driven (회장 §2.10, reg 6/7).c              3  2   K   | ]  }t        |        y wrp   r-   )r/   xs     r1   r2   z'RuntimeEventLoop.run.<locals>.<genexpr>f  s     9!s1v9s   )r?   rA   rB   rC   dependency_trigger_sourcerE   rG   r   r#   u   : registry identity mismatch -> TRACK_MISMATCH/HOLD (an unrelated track's callback is never cited as progress; 회장 §6, reg 12).single_task)trigger_sourcer]   r^   )r   r   rH   r   )rR   rS   r   rT   zbatch u   : 3/3 (all) tracks durable-success settled & every verdict AUTHORITATIVE_PASS — consolidated summary candidate generated immediately on the normal-callback durable-success event (회장 §2.4/§2.5, reg 3/4/15/16).batch)r   r   r   z: u    tracks settled — WAIT (not all-settled). A fallback/dead-man pending state does NOT block a completed track's progress (회장 §2.7, reg 2/5).u   no single-task / batch spec supplied — loop scanned the registry, recorded progress events, took no action (read-only consumer).u   schedule_history=audit only · cron-list≠authority · durable registry=state source · event loop=progress trigger · fallback/dead-man=safety net (NOT a progress trigger). All outputs are proposals (NO auto-dispatch/merge/write — 회장 §2.12/§8).r(   )5r   r   r   r   PROGRESS_TRIGGERrV   RESULT_SCHEMAr.   r   r   rq   r   r   r   LOOP_NO_REGISTRYr   r   r   rw   extendr   r?   r   r   scanrA   rB   rC   rE   rG   rx   r[   readyr   rH   r   r   r]   r^   rR   r   rS   rT   r   r   LOOP_ALL_SETTLEDr   r   	LOOP_WAITlentracks_settledLOOP_TRACK_MISMATCHLOOP_NEXT_ACTION_READY)rt   r   r   r   r   rX   rn   r   r   r   q	q_reasonssingle_resultsrj   verdictshold	seen_taskspecrrjrh   summary_candidates
seen_batchbsettlesjr[   s                              r1   runzRuntimeEventLoop.run  s   <   #&AANN*+B*EV%(*:)= >=#& 'EE * $!1 "$--";";< "&	
 / ,/AA ,/?? *9 /3 ) 1  !#!" -.#$ %'%& !'( 13)* %'+, $&-.  %/0  1 8 %%'NN0 * $!1 "$--";";< "2	
 ) !& $ *9 /3 ) 1 !# -. %' !  13!" %'#$ $&%&  %'(  ) . NN0 +/*<*<*>'ZNN, 3 3  	:Ai,I)T*9y99	: 3579 !e	  (	D||y(MM$,,'""%)%>%>!%!6!6*.*H*H*:!%!6!6$($<$< / # 	A B!!"%OOAII&yy,,||n %D D II!22OO#**,,,"&,,#'??./.>.>/0/@/@-.__'	 - 	;(	V 2468"u
 0	AzzZ'NN1::&* $Q%6%6 7 MM55oo	F !B  $!!f&C&C 01"))++AJJ; QZZL )3 3 <<'..00#*&'jj'(||6<6O6O/5/A/A$*$A$A	+	 1  	*QZZL60012!4 1 1234 5''S0	f )G)&G(*,GGGNN" 		
 & 
 
-
 dmm778
 .	

 
 "
  
 &5
 +/
 %
 -
 #
 )3
 !/
 (
  -?!
" !4#
$  +%
&  '
( )
 	
r;   N)r   r   r   zSequence[str]rz   Nonery   )rz   rc   )r   r{   rz   zTuple[str, List[str]])rz   z<Tuple[List[Dict[str, object]], List[Dict[str, object]], int])
r   r.   r   r.   rH   r{   r   r{   rz   r{   )rR   r.   r   r{   rz   r{   )r   zSequence[SingleTaskSpec]r   zSequence[BatchSpec]r   r.   r   r\   rX   r.   rz   rV   )rK   rL   rM   rN   r'   r   r   r   r   r   r   r   r   r	  r(   r;   r1   r~   r~      s    #3	7(7  	7
 
72?
%?
	?
BW/	EW/t!
 !
 	!

 &!
 )!
 
!
F

*;
	
: 24')'7 % "M
 /M
 %	M

 "%M
 M
 M
 
 M
r;   r~   r,   )rX   c               \    d|xs | j                   t        t        d| j                         dS )um   Serialize a loop result as the standalone runtime-event-loop-result
    artifact (회장 §7 expected_files).z)task-2553+54.runtime-event-loop-result.v1F)rW   rX   ra   rb   r   result)rX   r   r   rx   )r  rX   s     r1   loop_result_enveloper    s5     >, #""#+.." r;   )LOOP_SCHEMAr   r   r   r   r   r   r   r   r   r   r   rq   r   rr   r   r   r>   rQ   rV   r~   r  )r9   objectrz   r.   )r  rV   rX   r.   rz   r{   )@rN   
__future__r   r4   dataclassesr   r   typingr   r   r   r	   r
   %anu_v3.authoritative_verdict_selectorr   r   r   r   anu_v3.batch_settle_writebackr   r   r   anu_v3.callback_4tuple_registryr   anu_v3.callback_event_triggerr   r   r   r   r   r   anu_v3.self_collector_guardr   r  r   r   r   r   r   r   r   r   r   r   r   rq   r   rr   r   r    dispatch.callback_owner_enforcerr'   	_ANU_KEYSr   sortedrO   	Exceptionr:   r>   rQ   rV   r~   r  __all__r(   r;   r1   <module>r     s}  8r #  ( 8 8  
  -. .  )J %"= 7 ? -  - 	  * 3 & &  ! 
 ).fY.?(@o@
 $' ' '& $3 3 3 7
 7
 7
tW
 W
v @B"9< c  s   9C, ,C65C6