
    3j")                       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 ddlmZmZ ddlmZmZmZmZ d	Zd
ZdZdZdZ eedh      Z ed       G d d             ZddZ	 	 	 	 	 	 ddZddddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZy)u  anu_v3.collector_artifact_lookup — canonical-root, registry-first lookup.

task-2553+44/+46 (구현목표 B fail-safe + 구현목표 C integration). Standalone,
read-only, pure stdlib.

The normal / fallback / dead-man collector verdict pipeline:

  1. registry-first (§3.B): consult the durable callback_4tuple ledger. A
     COMPLETED record => NORMAL_COLLECTOR_COMPLETED even if the one-shot
     cron + spawn session are gone (regression 8/9).
  2. canonical-root artifact re-check (§3.C): if the ledger is absent /
     incomplete, look for result/collector-result/.done UNDER THE CANONICAL
     ROOT (not the autoset cwd) via artifact_root_resolver. An autoset-cwd
     false-miss must NEVER alone yield RESULT_MISSING (regression 10/11).
  3. schedule_history + stale fail-safe (§3.B): only when the canonical
     root has nothing AND schedule_history shows nothing for this
     chat_id AND the dispatch is stale -> RESULT_MISSING / BOT_STALE
     candidate (regression 12). Chat isolation enforced (chat_id).

Layer A / NO-CRON (9-R.1): ZERO write, ZERO cron register/remove, ZERO
dispatch, ZERO merge, ZERO ``cokacdir``/``subprocess`` exec. Pure
stat/read classification.
    )annotationsN)	dataclassfield)Path)ListOptional)RESOLVER_SCHEMAresolve_roots)NORMAL_CALLBACK_COMPLETEDTRACK_MISMATCHCallback4TupleRegistrydefault_ledger_pathz#anu_v3.collector_artifact_lookup.v1NORMAL_COLLECTOR_COMPLETEDRESULT_PRESENTRESULT_MISSING	BOT_STALEDISPATCH_NOT_RECEIVEDT)frozenc                      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<    ee      Zded<   ddZy)CollectorLookupResultstrschematask_idverdictregistry_verdictcanonical_root
events_dirboolresult_present_canonical"collector_result_present_canonicaldone_present_canonicalautoset_cwd_rootautoset_only_miss_blockedschedule_history_seendispatch_stale)default_factoryz	List[str]reasonsc                X   | j                   | j                  | j                  | j                  | j                  | j
                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  t        t        | j                        dS )N)r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   resolver_schemar'   )r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r	   listr'   )selfs    7/home/jay/workspace/anu_v3/collector_artifact_lookup.pyto_jsonzCollectorLookupResult.to_jsonH   s    kk|||| $ 5 5"11//(,(E(E77&*&A&A $ 5 5)-)G)G%)%?%?"11.DLL)#
 	
    N)returndict)__name__
__module____qualname____annotations__r   r*   r'   r-    r.   r,   r   r   7   s`    KLLO""(,,  ##t4GY4
r.   r   c                B    	 | j                         S # t        $ r Y yw xY w)NF)is_fileOSError)ps    r,   _isfiler:   ^   s%    yy{ s    	c                   	 | j                         syt        | j                  d            }t	        |      }|D ]t  }	 |j                  dd      }|j                         D ]K  }|j                         }|s	 t        j                  |      }t	        |j                  d            |k(  sJ  y v y# t        $ r Y yw xY w# t        $ r Y w xY w# t        j                  $ r Y w xY w)zRead-only: is there ANY history line for this chat_id?

    Chat isolation: lines whose ``chat_id`` differs are skipped and never
    cited (shared cross-chat folder).Fz*.logzutf-8ignore)encodingerrorschat_idT)is_dirr*   globr8   r   	read_text
splitlinesstripjsonloadsJSONDecodeErrorget)schedule_history_dirr?   logswantlogtextrawrecs           r,   _schedule_history_seen_for_chatrP   e   s    #**,(--g67
 w<D 	=='(=CD ??$ 		C))+Cjjo 3779%&$.		 )     		 '' s9   B2 B2 C8C2	B>=B>	CCC&%C&F)expected_dispatch_idexpected_dispatch_cron_idautoset_cwdr%   result_basenamerI   c                V   t        ||      }t        |j                        }	g }
t        t	        |j
                              }|j                  | |||      }|t        k(  r|
j                  d       |xs |  d}|	|z  }|	|  dz  }|	|  dz  }|	|  dz  }t        |      }t        |      }t        |      xs t        |      }|j                   }|r|
j                  d       |t        k(  rt        }n|t        k(  rt        }|
j                  d	       n|r&t        }|
j                  d
|j                   d       n|s|rt        }|
j                  d|	 d       nt        t        |j                         |      }|s|rt"        }|
j                  d       n|rt$        nd}|
j                  d       t'        t(        | |||j
                  |j                  ||||j*                  ||||
      S t'        t(        | |||j
                  |j                  ||||j*                  |d||
      S )aU  Registry-first, canonical-root-re-check collector classification.

    ``result_basename`` overrides the default ``<task_id>.result.json`` (the
    +44/+46 result is ``task-2553+44_46.result.json``; +39 is
    ``task-2553+39.result.json``). ``schedule_history_dir`` overrides the
    default shared history dir (hermetic regression 12).
    )rS   rI   )r   rQ   expected_chat_idrR   us   durable ledger identity mismatch (task/dispatch/chat) -> TRACK_MISMATCH; unrelated-task callback not cited (§3.B).z.result.jsonz.collector-result.jsonz.donez.done.ackedu|   autoset/current cwd has no memory/events; canonical root re-checked FIRST before any missing verdict (§3.C, regression 11).uq   durable ledger COMPLETED record present — normal callback completed survives one-shot cron auto-delete (§3.B).z
canonical u    present (§3.C re-check).z!canonical artifact present under u<    (§3.C); autoset-cwd false-miss overridden (regression 10).u   canonical root absent + no schedule_history for chat + stale dispatch -> RESULT_MISSING / BOT_STALE candidate (§3.B, regression 12).PENDING_FAILSAFEuz   canonical artifact absent but schedule_history/registry inconclusive — fail-safe defer, no false RESULT_MISSING (§3.B).)r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r'   F)r
   r   r   r   r   r   classifyr   appendr:   autoset_events_dir_presentr   r   namer   rP   rI   r   r   r   LOOKUP_SCHEMAr"   )r   r?   rQ   rR   rS   r%   rT   rI   rootsr   r'   ledgerreg_verdictbaseresult_pcollector_pdone_pdone_acked_presult_presentcollector_presentdone_presentr#   r   sh_seens                           r,   rX   rX      s   $ 6JE e&&'JG $E001F //1 ";	 " K n$L	
 6	6DD H'*@AAKWIU++F7); 77LX&N,6?;gl&;L
 %*$D$D D 	
 n$ 	1	1,D	
 
,))**DE	
 
< /
| <A A	
 2++,g
 ^$GNN* $2i7IGNN
 % ( //''%3/@#/"33&?"))
 	
" !$++##!/+<+//";#% r.   )r9   r   r/   r   )rI   r   r?   r   r/   r   )r   r   r?   r   rQ   Optional[str]rR   ri   rS   Optional[Path]r%   r   rT   ri   rI   rj   r/   r   )__doc__
__future__r   rE   dataclassesr   r   pathlibr   typingr   r   anu_v3.artifact_root_resolverr	   r
   anu_v3.callback_4tuple_registryr   r   r   r   r\   r   r   r   r   	frozenset FORBIDDEN_WHEN_CANONICAL_PRESENTr   r:   rP   rX   r5   r.   r,   <module>rt      s  . #  (  !  6 : !!	 $-n>U-V#W   $#
 #
 #
L),	L +//3"& %)+/EE E (	E
  -E  E E #E )E Er.   