
    3jy$                        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 ddlmZmZ ddlmZmZmZmZmZmZ e G d	 d
             Z G d d      Zy)u  anu_v3.parallel_runtime_registry — code/file-level runtime registry.

task-2553+29 NO-CRON variant (9-R.1). The registry auto-registers a track at
dispatch, then reconciles dispatch / result / normal-callback / fallback /
collector / closeout state purely by reading files — it registers/removes
ZERO crons (§7, 9-R.1). Self-completion of +29 itself is recognised by the
existence of result.json + .done (dogfooding, §12).

Standalone (9-R.3): zero import/mutation of anu_v3.parallel_batch_coordinator;
the frozen anu_v3.batch_join_policy / parallel_batch_state durable v1 files are
read-only inputs only. batch_state authority == the NEW writable file
memory/events/task-2553.parallel-runtime-registry.batch-state.json.
    )annotationsN)	dataclassfield)Path)DictListOptional)Callback4TupleIndexTuple4)RuntimeObservationclassify_runtimeclassify_fallback_fireis_recovery_eligiblerecovery_notecan_recover_nowc                  >   e Zd ZU dZded<   ded<   ded<   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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<   dZded<   dZded<    ee      Zded <   d"d!Zy)#TaskRuntimeRecorduI   구현목표 1·2 — the record written at dispatch time and reconciled.strtask_idexecutordispatch_cron_idfallback_callback_cron_id)default_factory	List[str]expected_artifactsokdispatch_statusNOptional[str]!expected_normal_collector_cron_idFboolnormal_collector_registerednormal_collector_executedby_design_no_normal_collectorresult_presentdone_presentPENDINGfallback_statefallback_fire_kstUNKNOWNterminal_outcomehold_for_chair classificationrecovery_eligiblerecovery_note_texttrack_mismatch_reasonsc                ,   i d| j                   d| j                  d| j                  d| j                  d| j                  d| j
                  dt        | j                        d| j                  d	| j                  d
| j                  d| j                  d| j                  d| j                  d| j                  d| j                  d| j                   d| j"                  | j$                  | j&                  t        | j(                        dS )Nr   r   r   r   r   r   r   r!   r"   r#   r$   r%   r'   r(   r-   r.   r   )r*   r+   r0   )r   r   r   r   r   r   listr   r!   r"   r#   r$   r%   r'   r(   r-   r.   r/   r*   r+   r0   selfs    B/home/jay/workspace/scripts/../anu_v3/parallel_runtime_registry.pyto_jsonzTaskRuntimeRecord.to_json;   sb   
t||

  5 5
 t33	

 01W1W
 ()G)G
 !$t'>'>"?
 *4+K+K
 ()G)G
 ,T-O-O
 d11
 D--
 d11
  !7!7
 d11
   !7!7!
" T44#
$ !% 5 5"11&*4+F+F&G)
 	
    )returnzDict[str, object])__name__
__module____qualname____doc____annotations__r   r2   r   r   r   r!   r"   r#   r$   r%   r'   r(   r*   r+   r-   r.   r/   r0   r6    r7   r5   r   r   !   s    SLM""$)$$?	?OS7;%};(--&+t+*/!4/ ND L$#NC#'+}+%c% ND NC#t#  (-d(CIC
r7   r   c                      e Zd ZdZddZddZddZddZddZddZ	dd		 	 	 	 	 	 	 dd
Z
ddZddZe	 	 	 	 	 	 dd       ZddZedd       Zy)ParallelRuntimeRegistryzCIn-memory authority registry; emits the authority batch-state file.c                0    i | _         t               | _        y N)_recordsr
   _indexr3   s    r5   __init__z ParallelRuntimeRegistry.__init__W   s    68)+r7   c                    || j                   |j                  <   | j                  j                  t	        |j                  |j
                  |j                  |j                               y )N)r   r   normal_collector_cron_idr   )rC   r   rD   registerr   r   r   r   r4   recs     r5   register_dispatchz)ParallelRuntimeRegistry.register_dispatch]   sP    %(ckk"!$!5!5),)N)N*-*G*G		
r7   c                8    | j                   j                  |      S rB   )rC   get)r4   r   s     r5   rM   zParallelRuntimeRegistry.geth   s    }}  ))r7   c                    t        |j                  dk(  |j                  |j                  |j                  |j
                  |j                        S )Nr   )dispatch_okr$   r%   r"   r#   r'   )r   r   r$   r%   r"   r#   r'   rI   s     r5   _obszParallelRuntimeRegistry._obsm   sJ    !,,4--))&)&C&C*-*K*K--
 	
r7   c                ^   | j                   |   }| j                  j                  |      }t        |      |_        |rd|_        d|_        |S | j                  |      }t        |      |_        t        |j
                        |_        t        |j
                  |j                        |_        |S )NTRACK_MISMATCHF)rC   rD   validate_tupler2   r0   r-   r.   rP   r   r   r   r#   r/   )r4   r   rJ   reasonsobss        r5   reconcile_trackz'ParallelRuntimeRegistry.reconcile_tracky   s    mmG$ ++,,W5%)']"!1C$)C!Jiin-c2 4S5G5G H!. A A"
 
r7   c                    t        | j                        D ]  }| j                  |        t        | j                        S rB   )r2   rC   rV   dict)r4   tids     r5   reconcile_allz%ParallelRuntimeRegistry.reconcile_all   s7    & 	&C  %	&DMM""r7   N)fallback_task_idc                   | j                   j                  |d||      }| j                  j                  |      }|yt	        | j                  |      t        |            S )Nfallback)claimed_task_id
event_kindevent_task_idevent_cron_idrR   )track_mismatch)rD   classify_eventrC   rM   r   rP   r    )r4   r^   fallback_cron_idr[   mismatchrJ   s         r5   classify_fallbackz)ParallelRuntimeRegistry.classify_fallback   s`     ;;--+!**	 . 
 mm0;#%diinT(^TTr7   c                T    | j                   |   }t        | j                  |            S rB   )rC   r   rP   )r4   r   rJ   s      r5   collector_recovery_possiblez3ParallelRuntimeRegistry.collector_recovery_possible   s#    mmG$tyy~..r7   c                    g }| j                   j                         D ]0  \  }}|j                  r|j                  r |j	                  |       2 t        |      S rB   )rC   itemsr#   r"   appendsorted)r4   outrY   rJ   s       r5   missing_normal_collectorsz1ParallelRuntimeRegistry.missing_normal_collectors   sS    ++- 	 HC0000

3		 
 c{r7   c                F    | j                         xr |j                         S )u   +29 recognises its own completion by result.json + .done existence.

        No cron callback is registered or removed (§7, 9-R.1). The registry
        reconciles its own terminal state the same way it reconciles tracks.
        )is_file)result_path	done_paths     r5   self_completion_recognizedz2ParallelRuntimeRegistry.self_completion_recognized   s!     ""$<):):)<<r7   c                    | j                   j                         D ci c]  \  }}||j                          c}}S c c}}w rB   )rC   rj   r6   )r4   rY   rJ   s      r5   records_jsonz$ParallelRuntimeRegistry.records_json   s2    37==3F3F3HIxsCS[[]"IIIs   =c                   t        j                  t        |       j                  d            }t	               }|j                  dg       D ]+  }|j                  t        di d|d   d|j                  dd      d|d   d|d   d	t        |j                  d	g             d
|j                  d
d      d|j                  d      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  d      d|j                  dd      d|j                  dd             . |S )Nzutf-8)encodingtracksr   r   r,   r   r   r   r   r   r   r!   Fr"   r#   r$   r%   r'   r&   r(   r*   r)   r+   r>   )	jsonloadsr   	read_textr@   rM   rK   r   r2   )pathdataregts       r5   load_fixturez$ParallelRuntimeRegistry.load_fixture   s   zz$t*...@A%'(B' 	A!!! iLUU:r2 &''9%: /00K.L	
 (,AEE2F,K'L %&EE*;T$B 78ee;7 125u1 /0ee3U/  34%%73!& $%55)95#A'( "#~u!=)* $%55)99#E+, '(ee,?&@-. &'UU+=y%I/0 $%55)95#A1	: 
r7   )r8   None)rJ   r   r8   r   )r   r   r8   zOptional[TaskRuntimeRecord])rJ   r   r8   r   )r   r   r8   r   )r8   zDict[str, TaskRuntimeRecord])r^   r   rd   r   r[   r   r8   r   )r   r   r8   r    )r8   r   )rq   r   rr   r   r8   r    )r8   zDict[str, Dict[str, object]])r|   r   r8   z'ParallelRuntimeRegistry')r9   r:   r;   r<   rE   rK   rM   rP   rV   rZ   rf   rh   rn   staticmethodrs   ru   r   r>   r7   r5   r@   r@   T   s    M,	
*

&# +/U U 	U
 (U 
U(/ ==&*=	= =J    r7   r@   )r<   
__future__r   ry   dataclassesr   r   pathlibr   typingr   r   r	   anu_v3.callback_4tuple_indexr
   r   anu_v3.result_ready_recoveryr   r   r   r   r   r   r   r@   r>   r7   r5   <module>r      sQ    #  (  ' ' D  /
 /
 /
dS Sr7   