
    8#j                        d Z ddlmZ ddlmZ ddlmZ dZdZdZ	dZ
d	Ze G d
 d             Zde
d	 	 	 	 	 	 	 ddZddd	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZddZg dZy)u4  dispatch.progress_watcher_gate — dispatch 직후 progress watcher 등록 게이트.

task-2729 Phase 1 — progress watcher dispatch gate.

회장 목표:
  dispatch() 가 성공 반환하기 직전, 해당 task 의 progress watcher
  (CI_WATCH_HANDOFF runner) 가 등록되었는지를 검증하는 record-only 게이트.

  ★ ACTIVE=false (Phase 1):
    본 게이트는 record-only 로만 결선된다. annotate_dispatch_result(active=False)
    경로에서는 기존 dispatch result["status"] 를 절대 변경하지 않는다 (기존 behavior 무손상).
    progress_watcher_registered 필드와 incomplete reason 만 기록한다.
    active=True 운영 전환은 별도 회장 승인 대상이다.

  ★ fallback 은 progress trigger 아님:
    callback_fallback_prune fallback 은 dead-man safety-net 일 뿐 progress trigger 가
    아니다. progress watcher 부재 시 fallback 만 등록되어 있어도 게이트는 incomplete
    으로 판정한다 (fallback_only).

본 모듈은 stdlib(typing, dataclasses)만 import 한다. 무거운 import 금지.
    )annotations)	dataclass)DictDISPATCH_INCOMPLETE#WATCHER_TERMINAL_CALLBACK_NOT_WIREDprogress_watcher_registered
dispatched)head_changenon_force_pushcifinish_donenormal_callbackfallback_prunec                  P    e Zd ZU dZded<   ded<   dZded<   dZded	<   dZded
<   y)
GateResultu)   progress watcher 게이트 판정 결과.strdispatch_statusboolr   F
incomplete incomplete_reasonfallback_onlyN)__name__
__module____qualname____doc____annotations__r   r   r        Q/home/jay/workspace/.worktrees/task-2729+7-dev1/dispatch/progress_watcher_gate.pyr   r   0   s0    3!%%JsM4r   r   F)fallback_registeredbase_statusc                t    | rt        |dd      S |rt        t        dddd      S t        t        ddd      S )u  progress watcher 등록 여부로 게이트 결과를 판정.

    - watcher_registered=True → 정상 (incomplete=False, base_status 유지).
    - watcher_registered=False · fallback_registered=True → fallback-only.
        ★ fallback 은 progress trigger 아님 → DISPATCH_INCOMPLETE.
    - watcher_registered=False · fallback_registered=False → no progress watcher.
    TF)r   r   r   !fallback_only_no_progress_watcher)r   r   r   r   r   no_progress_watcher)r   r   r   r   )r   r   watcher_registeredr!   r"   s      r    evaluate_progress_watcher_gater(   ;   sY     '(,
 	
 /(-A
 	
 +$)/	 r   )r!   activec                   t        | t              s| S t        |      | t        <   | j	                  dt
              }t        |||      }|j                  r#t        | d<   |j                  | d<   |r	t        | d<   | S )u  dispatch() 반환 dict 에 게이트 결과를 기록 (같은 dict 반환).

    - result[PROGRESS_WATCHER_REGISTERED_KEY] = bool(watcher_registered) 항상 기록.
    - incomplete 면 progress_watcher_gate / progress_watcher_incomplete_reason 기록.
    - ★ active=False (Phase 1 기본) → result["status"] 변경 금지 (기존 behavior 무손상).
    - active=True 일 때만 incomplete 시 result["status"] = DISPATCH_INCOMPLETE.
    statusr&   progress_watcher_gate"progress_watcher_incomplete_reason)

isinstancedictr   PROGRESS_WATCHER_REGISTERED_KEYgetDISPATCH_OKr(   r   r   r   )resultr'   r!   r)   r"   grs         r    annotate_dispatch_resultr5   `   s~      fd#.23E.FF*+**X{3K	'-/
B 
}}*=&'797K7K342F8Mr   c                "    | r|st         S | r|ryy)u!  watcher terminal 도달 시 ANU normal callback 결선 상태 분류.

    - terminal 도달 · callback 미발사 → WATCHER_TERMINAL_CALLBACK_NOT_WIRED.
    - terminal 도달 · callback 발사 → WATCHER_TERMINAL_CALLBACK_WIRED.
    - terminal 미도달 → WATCHER_NON_TERMINAL.
    WATCHER_TERMINAL_CALLBACK_WIREDWATCHER_NON_TERMINAL)r   )terminal_reachedcallback_fireds     r     watcher_terminal_callback_statusr;      s     22N0!r   c                4     t         fdt        D              S )uH   WATCHER_TRACKED_STATES 의 모든 키가 tracked 에 True 로 있는지.c              3  R   K   | ]  }t        j                  |               y w)N)r   r1   ).0statetrackeds     r    	<genexpr>z%all_states_tracked.<locals>.<genexpr>   s     LEtGKK&'Ls   $')allWATCHER_TRACKED_STATES)r@   s   `r    all_states_trackedrD      s    L5KLLLr   )
r   r   r0   r2   rC   r   r(   r5   r;   rD   N)r'   r   r!   r   r"   r   returnr   )
r3   r/   r'   r   r!   r   r)   r   rE   r/   )r9   r   r:   r   rE   r   )r@   zDict[str, bool]rE   r   )r   
__future__r   dataclassesr   typingr   r   r   r0   r2   rC   r   r(   r5   r;   rD   __all__r   r   r    <module>rJ      s   * # ! 
 , &K #"?         !&"	"" " 	"
 "R !&"" " 	"
 " 
"J"" " 		"$M
r   