
     j              
         d Z ddlmZ ddlZddlmZ ddlmZmZ ddl	m
Z
mZmZ ddlmZ dZd	Z ej"                  e      Z	 	 d	 	 	 	 	 dd
Zdddd	 	 	 	 	 	 	 	 	 ddZdddddddded		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZy)u>  utils/normal_completion_callback_collector_entrypoint.py
task-2728 — normal completion callback collector entrypoint (registry-based idempotent prune wiring).
normal callback/result 수집/envelope CONFIRMED/terminal marker 중 하나라도 성립 시 동일 (task_id·round·head) pending fallback을 즉시 prune.
    )annotationsN)Path)CallableOptional)prune_fallbacks_for_keydetect_unwired_fallback_now_utcCANONICAL_ROOT_DEFAULTz2normal_completion_callback_collector_entrypoint.v1*RESULT_JSON_MISSING_RECOVERED_BY_COLLECTORc                *    ||dfS | | dfS t         dfS )un   canonical_root/worktree_path 주입 우선, autoset 추측 금지.

    Returns (root: str, source: str).
    worktree_pathcanonical_root_injecteddefaultr
   )canonical_rootr   s     f/home/jay/workspace/.worktrees/task-2729-dev6/utils/normal_completion_callback_collector_entrypoint.pyresolve_canonical_rootr      s2      //		# 9::&	22    r   r   result_json_pathc               h    |t        |      S t        ||      \  }}t        |      dz  dz  |  dz  S )u   result_json_path 우선, 아니면 resolve_canonical_root로 root 구한 뒤
    Path(root)/"memory"/"results"/f"{task_id}.result.json".
    autoset 추측 금지.
    memoryresultsz.result.json)r   r   )task_idr   r   r   root_s         r   resolve_result_json_pathr   (   sF     #$%%$^]CGD!: 9,',/GGGr   T)	r   r   r   registry_pathremoverdry_runnormal_callback_collecteddispatch_firednow_fnc                   t        ||      \  }}t        | |||      }|j                         }d}|rd}n&t        }d}t        j                  d| |||t               t        | |||||	|||	      }d}|st        | ||||||      }t        | |||t        |
      ||t        |      |||D cg c]  }|j                          c}|r|j                         nd |       d	S c c}w )
u   normal callback/result 수집 후 동일 (task_id·round·head) pending fallback을 즉시 prune.

    trigger ∈ {"normal_callback_collected","result_collected","envelope_confirmed","terminal_marker"}
    (검증은 느슨하게 — 그냥 기록).
    r   FOKTuC   RESULT_JSON_MISSING: task_id=%s round=%s head_sha=%s path=%s — %s)	r   roundhead_shatriggerr   r    r   r   r#   N)r   r&   r'   r"   r   r   r#   )schemar   r&   r'   r(   r!   r   canonical_root_sourceresult_json_existsresult_json_statusfollow_up_requiredprune_outcomesunwiredts_utc)r   r   existsRESULT_JSON_MISSING_RECOVEREDloggerwarningr   r   COLLECTOR_ENTRYPOINT_SCHEMAboolto_dict)r   r&   r'   r(   r   r   r   r   r   r    r!   r"   r#   r   root_sourcerjpr+   r-   r,   outcomesr/   os                         r   collect_and_pruner<   9   s&   * /~}MD+ #%#)	C !:!QUHc+H	
 '%#
H G)))'
 .%)*C%D!,"#56000891199;9)0GOO%d(  :s   +C )NN)r   Optional[str]r   r=   returntuple)
r   strr   r=   r   r=   r   r=   r>   r   )r   r@   r&   intr'   r@   r(   r@   r   r=   r   r=   r   r=   r   r=   r    r6   r!   r6   r"   r6   r#   zCallable[[], str]r>   dict)__doc__
__future__r   loggingpathlibr   typingr   r   )utils.completion_callback_fallback_cancelr   r   r	   utils.callback_envelope_schemar   r5   r2   	getLogger__name__r3   r   r   r<    r   r   <module>rM      sc   #   % 
 BR  L 			8	$ %)#'3!3 3 3& %)#'&*HH "H !	H
 $H 
H. %)#'&*#'&* (SS S 	S
 S "S !S $S !S S  $S S S 
Sr   