
    ?# j$                       d Z ddlmZ ddlZddlZddlmZ  ee      j                         j                  j                  Z ee      ej                  v r!ej                  j                   ee             ej                  j                  d ee             ddZd Zd Zd Zd	 Zed
k(  r ej,                   e              yy)um  scripts/verify_task_id_hardening.py — task-2485 dry-run 검증.

local/CI 어디서나 다음을 한 번에 검증:
- task_id parser valid/invalid matrix
- browser_verify task-N+M acceptance
- git_evidence worktree 기준 판단 가능 여부
- legacy task-N backward compatibility

종료 코드:
- 0: PASS (모든 체크 통과)
- 1: FAIL (하나라도 실패)
    )annotationsN)Pathc                `   t         j                  j                  | t        |            }||j                  y t         j                  j                  |      }|t        j                  | <   	 |j                  j                  |       |S # t        $ r}t        d| d|        Y d }~y d }~ww xY w)Nz  [LOAD FAIL] z: )	importlibutilspec_from_file_locationstrloadermodule_from_specsysmodulesexec_module	Exceptionprint)namepathspecmodes        Q/home/jay/workspace/.worktrees/task-2537-dev4/scripts/verify_task_id_hardening.py_loadr      s    >>11$D	BD|t{{*
..
)
)$
/CCKK$ J  tfBqc*+s   ,B	 		B-B((B-c            
        t        d       d} 	 ddlm}m}m}m} g d}g d}|D ]  } ||      rt        d	|       | dz  }   |D ]  } ||      st        d
|       | dz  }   g d}	|	D ]-  \  }
} ||
      }||k7  st        d|
d|d|d       | dz  } / ddl}t        ||j                        st        d       | dz  } t        |t              st        d       | dz  } | dk(  r3t        dt        |      t        |      z   t        |	      z   dz    d       | S # t        $ r}t        d|        Y d}~yd}~ww xY w)z utils.task_id_parser API matrix.z*== Check 1: utils.task_id_parser matrix ==r   )is_valid_task_idextract_task_id
TASK_ID_RETASK_ID_PATTERNz  FAIL import: N   )z	task-2472task-2472+1task-2472+2task-2467+3)task-abcz
task-2472+ztask-2472++1ztask- z  FAIL valid z  FAIL invalid (accepted) ))zfoo-task-2472+1-barr   )ztask/task-2467+3-dev6r    )zmemory/tasks/task-2472+2.mdr   z  FAIL extract u    → z (expected )z&  FAIL TASK_ID_RE not compiled Patternz  FAIL TASK_ID_PATTERN not strz  PASS: parser API matrix (   z cases))r   utils.task_id_parserr   r   r   r   ImportErrorre
isinstancePatternr	   len)failedr   r   r   r   r   valid_casesinvalid_casestidextract_casestextexpectedactualr'   s                 r   check_parserr3   *   s   	
67F		
 	
 MKKM $M#)*aKF  C .sg67aKF
M
 ( h &XOD85
+h\QRSTaKF	 j"**-67!os+./!{+C,<S=O,OPSTaPb,bcd,d+eelmnMK  s#$s   D# #	E,D??Ec                    t        d       d} dt        dz  fdt        dz  ffD ]  \  }}t        d| d|      }|t        d	|        | d
z  } ,|j                  dd      }t	        d |d   D              rt        d| d       | d
z  } nt        d| d       |j                  dd      }t	        d |d   D              rt        d| d       | d
z  }  | S )u2   browser_verify가 task-N+M을 거부하지 않음.z1== Check 2: browser_verify task-N+M acceptance ==r   sharedz(teams/shared/verifiers/browser_verify.pydev1z)teams/dev1/qc/verifiers/browser_verify.pybv__v  FAIL load r   r   z /tmp/nonexistent_workspace_t2485c              3  $   K   | ]  }d |v  
 ywu   잘못된 task_id 형식N .0ds     r   	<genexpr>z'check_browser_verify.<locals>.<genexpr>l   s     J1)Q.J   details  FAIL u   : task-2472+2 거부됨  PASS u   : task-2472+2 통과r!   c              3  $   K   | ]  }d |v  
 ywr;   r<   r=   s     r   r@   z'check_browser_verify.<locals>.<genexpr>s   s     Nq-2NrA   u&   : invalid 'task-abc'를 거부 안 함)r   	WORKSPACEr   verifyany)r+   kindr   r   results        r   check_browser_verifyrK   ]   s   	
=>F	9IIJ	HHI 
d c$rND);L'(aKFM+MNJy8IJJGD6!89:aKFGD6!567J(JKNF9<MNNGD6!GHIaKF)* M    c            
     6	   t        d       ddl} ddl}ddl}d}dt        dz  fdt        dz  ffD ]  \  }}t        d| d	|      }|t        d
|        |dz  }-t        |d      st        d| d       |dz  }t        |d      st        d| d       |dz  }n|j                  g dd      }d|v rt        d| d       |dz  }nEd|v rt        d| d       |dz  }n,d|vsd|vrt        d| d       |dz  }nt        d| d       |j                         5 }| j                  j                  |d      }	| j                  |	d       	 |j                  g d|	d        |j                  g d!|	d        |j                  g d"|	d        | j                  | j                  j                  |	d#d$      d       t        | j                  j                  |	d#d$d%      d&      5 }
|
j                  d'       ddd       t        | j                  j                  |	d(      d&      5 }
|
j                  d)       ddd       |j                  g d*|	d        |j                  g d+|	d        t        | j                  j                  |	d,      d&      5 }
|
j                  d-       ddd       | j                  j!                  d.d       | j                  j!                  d/d       |j#                  d0|	      }|d1   d2k(  r*t%        d3 |d4   D              rt        d| d5       |dz  }nt        d| d6       | j                  j                  |	d(      }t        |d&      5 }
|
j                  d7       ddd       |	| j                  d.<   	 |j#                  d0|	      }| j                  j!                  d.d       |d1   d2k7  st%        d8 |d4   D              st        d| d9       |dz  }nt        d| d:       ddd        |S # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   }xY w# 1 sw Y   xY w# | j                  j!                  d.d       w xY w# |j&                  $ r }t        d| d;|        |dz  }Y d}~d}~ww xY w# 1 sw Y   hxY w)<u1   git_evidence가 worktree/main repo 분리 판단.z9== Check 3: git_evidence worktree/main repo separation ==r   Nr5   z&teams/shared/verifiers/git_evidence.pyr6   z'teams/dev1/qc/verifiers/git_evidence.pyge_r8   r9   r    _resolve_project_dir_with_sourcerC   u,   : _resolve_project_dir_with_source 미정의_filter_dirty_to_task_scopeu'   : _filter_dirty_to_task_scope 미정의)memory/tasks/task-2472+1.mdmemory/tasks/task-2472+10.mdmemory/tasks/task-2472.mdmemory/tasks/task-9999.mdr   rR   uE   : 경계 검사 미흡 — task-2472+10 이 task-2472+1 으로 오인rT   u%   : filter가 무관 task 파일 포함rQ   rS   u+   : filter가 본 task scope 파일을 제외rD   u   : filter 경계 매칭 정상	main_repoT)exist_ok)gitinit-q)cwdcheck)rW   configz
user.emailzt@t)rW   r\   z	user.nametmemorytasksztask-vsh+1.mdwz# task-vsh+1ztask-vsh+1-impl.pyzx = 1)rW   add.)rW   commitrY   z-mz[task-vsh+1] addzother_task_file.pyzfrom_other = TruePROJECT_PATHWORKTREE_PATHz
task-vsh+1statusFAILc              3  $   K   | ]  }d |v  
 ywzFAIL NO_UNCOMMITTEDNr<   r=   s     r   r@   z%check_git_evidence.<locals>.<genexpr>   s      634)Q.6rA   rB   u:   : main repo 다른 task dirty 가 본 task 를 FAIL 시킴u4   : main repo fallback 에서 다른 task dirty 무시zx = 2  # modifiedc              3  $   K   | ]  }d |v  
 ywri   r<   r=   s     r   r@   z%check_git_evidence.<locals>.<genexpr>   s      <34)Q.<rA   u<   : worktree 자체 dirty 인데 NO_UNCOMMITTED FAIL 미발생u#   : worktree dirty 는 여전히 FAILu*   : 임시 git repo 시나리오 실패 — )r   os
subprocesstempfilerF   r   hasattrrP   TemporaryDirectoryr   joinmakedirsrunopenwriteenvironpoprG   rH   CalledProcessError)_os_subp_tmpr+   rI   r   r   scopedtdrepofprJ   	impl_file	result_wtr   s                  r   check_git_evidencer   y   s   	
EFF 
9GGH	FFG ^
d c$rND);L'(aKFs>?GD6!MNOaKFs9:GD6!HIJaKF00 
 *V3GD6!fghaKF(F2GD6!FGHaKF*&8<W_e<eGD6!LMNaKFGD6!>?@ $$& 6	"88==[1DLLL-3		/T	F		@dRV	W		=4t	TSXX]]47CdS#((--hQSVW -[]HH^,-#((--.BCSI &RHHW%&		-4t	D		E4W[   #((--.BCSI 2RHH012 56L$7(#v-# 68>y8I6 3 GD6)cdeaKFGD6)]^_  HHMM$0DE	)S) 2RHH012 /3N+: #

< >IKKOOND9X&&0 <8A)8L< 9 GD6)efgaKFGD6)LMNg6	 6	Q^~ M]- -& &2 2&2 2 KKOOND9 ++ v%OPQsST!i6	 6	s    0RBQ)P;.Q)P;AQP"'B;Q"P/4QP;AQPQPQ"P,'Q/P84Q;QQR+RRRRR	c                     d} | t               z  } | t               z  } | t               z  } t                | dk(  rt        d       yt        d|  d       y)Nr   z'[verify_task_id_hardening] OVERALL PASSz)[verify_task_id_hardening] OVERALL FAIL (u    항목)r   )r3   rK   r   r   )r+   s    r   mainr      s\    F
lnF
"$$F
 ""F	G{78	5fXX
FGrL   __main__)r   r	   r   r   )__doc__
__future__r   importlib.utilr   r   pathlibr   __file__resolveparentrF   r	   r   removeinsertr   r3   rK   r   r   __name__exitr<   rL   r   <module>r      s    #  
 N""$++22	 y>SXXHHOOC	N# 3y> "0f8gT zCHHTV rL   