
    {j              
          U d Z ddlmZ ddlZddlZdZdZdZdZdddd	d
dd	ddd	ddd	ddd	ddd	dddddd	d	d	d	dddZ	de
d<   ddZddd	 	 	 	 	 	 	 	 	 ddZddZdddZedk(  r e        yy)u   callback_cause_classifier.py — callback 미발사 원인 구분 + finish profile(task_mode) 연결.

task-2700 Phase 1 모듈 3.
    )annotationsNNORMAL_CALLBACK_MISSINGFINISH_TASK_GIT_GATE_BLOCKEDEXTERNAL_DIRTY_BLOCKEROWN_DIRTY_FAILFTu5   관찰 전용 — .done 미생성, GIT-GATE 미적용)create_donegit_gatemergecallbackdescu#   진단 — 마커만, 머지 없음u(   콜백 전용 — 머지 없이 callbacku   종결 마커 전용u/   기본 코드 task — GIT-GATE+머지+callback)read_only_watcher	diagnosiscallback_onlycloseout_marker_onlycodezdict[str, dict]FINISH_PROFILESc                X    t         j                  |       }|	t         d   }t        |      S )u[   task_mode 에 해당하는 FINISH_PROFILES 항목 반환. 미지정 키는 "code" fallback.r   )r   getdict)	task_modeprofiles     P/home/jay/workspace/.worktrees/task-2717-dev1/utils/callback_cause_classifier.pyresolve_finish_profiler   =   s+    !!),G!&)=    r   )blocker_classificationr   c                    t        |      }|r.| s,|xs d}|t        k(  rd}n|t        k(  rd}nd}t        ||||dS t        dd||dS )u  callback 미발사 원인 분류.

    git_gate_blocked=True 이고 done_exists=False
      → FINISH_TASK_GIT_GATE_BLOCKED
      sub_cause = blocker_classification
        EXTERNAL_DIRTY_BLOCKER → 환경 책임 (task 재실행 불필요)
        OWN_DIRTY_FAIL         → task 책임 (own dirty 커밋 후 재실행)

    그 외(done_exists=True 인데 callback 미발사)
      → NORMAL_CALLBACK_MISSING

    반환: {"cause", "sub_cause", "remediation", "finish_profile", "task_mode"}
    UNKNOWNuH   origin/main sync 또는 무관 dirty 정리 — task 재실행 불필요u*   own dirty 커밋 후 finish-task 재실행uH   git 상태 점검 후 dirty 정리 또는 sync 후 finish-task 재실행)cause	sub_causeremediationfinish_profiler   NuA   callback runner/네트워크 점검 — .done은 정상 생성됨)r   _EXTERNAL_DIRTY_BLOCKER_OWN_DIRTY_FAILr   r   )done_existsgit_gate_blockedr   r   r!   r   r    s          r   classify_callback_missingr&   I   s~    ( ,I6N*7i	!%<<Z  $6FK [ 
 2"&,"
 	
 )Z( r   c                     t        j                  d      } | j                  ddd       | j                  ddd       | j                  d	d d
       | j                  ddd       | S )Nz$Classify why callback was not fired.)descriptionz--done-exists
store_truezpass if .done marker exists)actionhelpz--git-gate-blockedz(pass if finish-task GIT-GATE was blockedz--blocker-classificationz/EXTERNAL_DIRTY_BLOCKER | OWN_DIRTY_FAIL | CLEAN)defaultr+   z--task-moder   z#finish profile mode (default: code))argparseArgumentParseradd_argument)ps    r   _build_parserr1      s    :	A NN?<5  7NN'B  DNN-tI  KNN=&=  ?Hr   c                    t               }|j                  |       }t        |j                  |j                  |j
                  |j                        }t        t        j                  |dd             y )N)r$   r%   r   r      F)indentensure_ascii)
r1   
parse_argsr&   r$   r%   r   r   printjsondumps)argvparserargsresults       r   mainr>      s\    _FT"D&$$..#::..	F 
$**VAE
:;r   __main__)r   strreturnr   )
r$   boolr%   rB   r   z
str | Noner   r@   rA   r   )rA   zargparse.ArgumentParser)N)r:   zlist[str] | NonerA   None)__doc__
__future__r   r-   r8   r   r   r"   r#   r   __annotations__r   r&   r1   r>   __name__ r   r   <module>rI      s   #  3 =  3 " G 5 : & A;$$ $V  *.33 3 '	3
 3 
3t
< zF r   