
    1jL	                        U d Z ddlmZ ddl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Zded	<    ed
      dz  dz  ZdZddZddZ	 	 	 	 	 	 	 	 	 	 ddZy)u?   finish-task.sh 18단계 stage 경과시간 JSONL 로깅 헬퍼.    )annotationsN)datetimetimezone)Path)DictUnion)	qc_verifyscope_guardworktree_manager_finishgh_pr_checkgit_gateimpact_scannerci_preflight
bg_cleanupg3_verifierg4_gemini_gate	lv4_audit
codex_gateunresolved_gategoal_assertionstask_timer_endtoken_trackernotify_completionextract_followuptupleVALID_STAGESmemorylogszfinish-task-timing.jsonlFINISH_TASK_TIMING_LOG_PATHc                 d    t        t              j                         j                  j                  S )ud   utils/finish_task_timing_logger.py 기준 한 단계 위 디렉토리를 workspace 루트로 본다.)r   __file__resolveparent     P/home/jay/workspace/.worktrees/task-2691-dev8/utils/finish_task_timing_logger.py_detect_workspace_rootr'   $   s!    >!!#**111r%   c                     t         j                  j                  t              } | rt	        |       j                         S t               t        z  j                         S )N)osenvironget_ENV_OVERRIDE_KEYr   r"   r'   _DEFAULT_RELATIVE_LOG_PATH)overrides    r&   _resolve_log_pathr/   )   sC    zz~~/0HH~%%''"$'AAJJLLr%   c                2   | t         vrt        d| d      	 t        |      }|dk  rt        d|       t	               }|j
                  j                  dd       t        j                  t        j                        j                  d	      dd
 dz   ||| |d}t        j                  |dd      }|j                  dd      5 }	|	j                  |dz          ddd       |S # t        t        f$ r}t        d|      |d}~ww xY w# 1 sw Y   |S xY w)ub   18개 stage 중 하나의 경과시간을 JSONL 한 줄로 append 하고 row dict를 반환한다.zinvalid stage_name=z; must be one of VALID_STAGESz!elapsed_sec must be numeric, got Nr   zelapsed_sec must be >= 0, got T)parentsexist_okz%Y-%m-%dT%H:%M:%S.%fZ)tstask_idteam_idstageelapsed_secF),:)ensure_ascii
separatorsazutf-8)encoding
)r   
ValueErrorfloat	TypeErrorr/   r#   mkdirr   nowr   utcstrftimejsondumpsopenwrite)

stage_namer9   r6   r7   elapsed_floatexclog_pathrowlinefhs
             r&   record_stage_elapsedrS   0   s3    %!*/LM
 	
Wk* q9-IJJ "HOO$6 ll8<<(112HI#2NQTT$C ::c*ED	sW	- 
 J+ z" W<[OLMSVVW$ Js#   C& D&D	5DD	D)returnr   )
rL   strr9   zUnion[float, int]r6   rU   r7   rU   rT   zDict[str, object])__doc__
__future__r   rH   r)   r   r   pathlibr   typingr   r   r   __annotations__r-   r,   r'   r/   rS   r$   r%   r&   <module>r[      s    E "  	 '  e * "(^f47QQ 1 2
M##"# # 	#
 #r%   