
    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mZ  ed       G d	 d
             Z G d d      Zy)u  anu_v3.task_artifact_detector — read-only task artifact presence detector.

task-2553+31 ANU_RUNTIME_RECONCILE_CHECKPOINT leaf module (구현목표 3·4·5).

Detects, for a given task_id, the presence of:
  * result.json            (구현목표 3)
  * .done marker           (구현목표 4)
  * report / decision / activation artifacts (구현목표 5)

NO-CRON / read-only invariant (§7/§10/9-R.1): this module performs ZERO write,
ZERO cron, ZERO merge, ZERO dispatch. It only stats / reads files. Existing
task 산출물(+26/+27/+30 …) are read/parse/reference only — never modified,
registered, or overwritten (§9, fixture verbs §5).
    )annotationsN)	dataclassfield)Path)DictListOptionalT)frozenc                      e Zd ZU dZded<   ded<   ded<   ded<   ded<   ded	<   d
Zded<   d
Zded<    ee      Z	ded<   ddZ
y
)ArtifactObservationz:Read-only artifact presence snapshot for a single task_id.strtask_idboolresult_presentdone_presentreport_presentdecision_presentactivation_presentNOptional[str]result_path	done_path)default_factoryzDict[str, str]extra_pathsc                    | j                   | j                  | j                  | j                  | j                  | j
                  | j                  | j                  t        | j                        d	S )N	r   r   r   r   r   r   r   r   r   )
r   r   r   r   r   r   r   r   dictr   )selfs    4/home/jay/workspace/anu_v3/task_artifact_detector.pyto_jsonzArtifactObservation.to_json&   s^    ||"11 --"11 $ 5 5"&"9"9++ 0 01

 
	
    )returnzDict[str, object])__name__
__module____qualname____doc____annotations__r   r   r   r   r   r    r    r   r   r      sP    DL!%K%#I}#"'"=K=
r    r   c                  T    e Zd ZdZ	 	 d		 	 	 	 	 	 	 d
dZddZddZddZddZddZ	y)TaskArtifactDetectorzRead-only detector over a repo-root layout.

    events_dir defaults to ``<repo>/memory/events`` and reports_dir to
    ``<repo>/memory/reports``. All accesses are stat/read only.
    c                t    t        |      | _        | j                  |z  | _        | j                  |z  | _        y N)r   	repo_root
events_dirreports_dir)r   r,   events_subdirreports_subdirs       r   __init__zTaskArtifactDetector.__init__;   s0     i..=8>>N:r    c                B    	 |j                         S # t        $ r Y yw xY w)NF)is_fileOSError)r   paths     r   _existszTaskArtifactDetector._existsF   s%    	<<>! 		s    	c                    t        |      }| j                  |      sy	 t        j                  |j	                  d            S # t
        t        f$ r Y yw xY w)z:Read-only JSON parse. Returns None on absence/parse error.Nzutf-8)encoding)r   r6   jsonloads	read_textr4   
ValueError)r   r5   ps      r   	read_jsonzTaskArtifactDetector.read_jsonL   sO    J||A	::akk7k;<<$ 		s   $A AAc                *   | j                   | dz  }| j                   | dz  }| j                   | dz  }| j                   | dz  }| j                  | dz  }i }| j                  |      rt        |      |d<   | j                  |      rt        |      |d<   | j                  |      rt        |      |d<   | j                  |      rt        |      |d	<   | j                  |      rt        |      |d
<   t	        || j                  |      | j                  |      | j                  |      | j                  |      | j                  |      | j                  |      rt        |      nd| j                  |      rt        |      |	      S d|	      S )u@   Detect artifact presence for ``task_id`` (구현목표 3·4·5)..result.jsonz.donez.decision.jsonz.activation-decision.jsonz.mdresultdonedecision
activationreportNr   )r-   r.   r6   r   r   )r   r   result_pdone_p
decision_pactivation_preport_pextras           r   detectzTaskArtifactDetector.detectW   s{   ??y%==gYe#44__'.'AA
G94M)NN##	o5 "<<!!(mE(O<<KE&M<<
# #JE*<<%"%l"3E,<<!!(mE(O"<<1f-<<1!\\*5#||L9)-h)?HT%)\\&%9c&k

 
	
 @D

 
	
r    c                L    |D ci c]  }|| j                  |       c}S c c}w r+   )rL   )r   task_idstids      r   detect_manyz TaskArtifactDetector.detect_manyw   s$    19:#T[[%%:::s   !c                    | j                  | j                  | dz        }t        |t              sydD ]F  }|j	                  |      }t        |t
              s%|j                         s6|j                         c S  y)zRead the terminal verdict/outcome from result.json (read-only).

        Mirrors actual statuses (regression 20): +26 MERGED/COMPLETE_MERGED,
        +27 PASS/DONE, +30 DONE. Returns None if unreadable.
        r@   N)verdictclassificationoutcomefinal_status)r>   r-   
isinstancer   getr   strip)r   r   dockeyvals        r   terminal_outcome_hintz*TaskArtifactDetector.terminal_outcome_hintz   sn     nnT__',/GGH#t$K 	#C''#,C#s#		yy{"	# r    N)zmemory/eventszmemory/reports)r,   r   r/   r   r0   r   r!   None)r5   r   r!   r   )r5   r   r!   zOptional[dict])r   r   r!   r   )rN   z	List[str]r!   zDict[str, ArtifactObservation])r   r   r!   r   )
r"   r#   r$   r%   r1   r6   r>   rL   rP   r\   r'   r    r   r)   r)   4   sT     -.	;; ; 	;
 
;
@;r    r)   )r%   
__future__r   r9   dataclassesr   r   pathlibr   typingr   r   r	   r   r)   r'   r    r   <module>rb      sH    #  (  ' ' $
 
 
6S Sr    