
    +j7                        d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
Z
ddlmZ  ee      j                         j                  d   Zedz  dz  ZddZ G d	 d
      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Zy)u  task-2729+16 회귀 테스트 — finish-task.sh CODE_ROOT evidence env-fix.

테스터: 닌기르수(Ningirsu), 개발5팀 마르둑(Marduk) 팀
대상 스크립트: scripts/finish-task.sh
작업 참조: task-2729+16 (env-fix 3 hunk: H1/H2/H3)

검증 방식:
  - 정적 소스 검증 (grep/regex) 위주 — 전체 실행 부작용 없음
  - bash 문법 검사 (bash -n)
  - H2 tier③ 블록 행동 특성은 정적 가드 소스 확인으로 대체
    (사유: bash 함수 내 embedded python heredoc(_detect_task_worktree)을
     독립 bash subprocess에서 source 실행하려면 WORKSPACE/TASK_ID 전역변수가
     필요하며, 격리 실행 시 python3 heredoc 탈출 시퀀스 파싱이 복잡해
     결정적이지 않음. 정적 검증으로 충분히 동치 보장.)

동료 엔키(Enki)가 동시 구현 중 — H1~H3 중 일부 미적용 시 관련 테스트 FAIL.
테스트 강도를 약화시키지 말 것 (절대 금지).
    )annotationsN)Path   scriptszfinish-task.shc                 .    t         j                  d      S )uR   finish-task.sh 전체 소스 캐시 없이 읽기. 테스트 간 독립성 유지.zutf-8)encoding)_FINISH_TASK	read_text     Z/home/jay/workspace/tests/regression/test_finish_task_coderoot_evidence_env_fix_2729p16.py_srcr       s    !!7!33r   c                      e Zd ZdZddZy)TestH1WorkspaceOverrideuB   H1 hunk: WORKSPACE 정의에 FINISH_TASK_WORKSPACE_OVERRIDE 포함c                   t               }|j                         D cg c](  }t        j                  d|j	                               r|* }}|s{t        j                  d      dz   ddt        j                         v st        j                  |      rt        j                  |      ndiz  }t        t        j                  |            |d   }d}||v }|st        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }t        j                  d|      dz   d|iz  }	t        t        j                  |	            dx}}d}||v }|st        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }t        j                  d|      dz   d|iz  }	t        t        j                  |	            dx}}t        j                  d      }
|
j                  } ||      }|st        j                  d      dz   dt        j                         v st        j                  |
      rt        j                  |
      ndt        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }	t        t        j                  |	            dx}}yc c}w )ul  H1: WORKSPACE 정의가 FINISH_TASK_WORKSPACE_OVERRIDE 를 최우선 fallback으로 포함.

        검증:
          1. `FINISH_TASK_WORKSPACE_OVERRIDE` 가 WORKSPACE 정의 라인에 존재.
          2. 기존 `${WORKSPACE:-` fallback 도 보존(backward-compat).
          3. 삼중 중첩 형태: ${FINISH_TASK_WORKSPACE_OVERRIDE:-${WORKSPACE:-...}}
        z^WORKSPACE\s*=u3   WORKSPACE 정의 라인이 finish-task.sh에 없음z
>assert %(py0)spy0workspace_def_linesr   FINISH_TASK_WORKSPACE_OVERRIDEinz%(py1)s in %(py3)sworkspace_defpy1py3u;   WORKSPACE 정의에 FINISH_TASK_WORKSPACE_OVERRIDE 없음: 
>assert %(py5)spy5Nz${WORKSPACE:-uX   WORKSPACE 정의에 기존 fallback ${WORKSPACE:-} 가 없음 (backward-compat 파손): zDWORKSPACE\s*=\s*"\$\{FINISH_TASK_WORKSPACE_OVERRIDE:-\$\{WORKSPACE:-uj   WORKSPACE 정의가 삼중 중첩 형태 '${FINISH_TASK_WORKSPACE_OVERRIDE:-${WORKSPACE:-...}}' 가 아님J
>assert %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.search
}(%(py3)s)
}patternsrcr   py2r   r   )r   
splitlinesresearchstrip
@pytest_ar_format_assertmsg@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation_call_reprcomparecompile)selfr    lnr   @py_format1r   @py_assert0@py_assert2@py_format4@py_format6r   @py_assert1@py_assert4s                r   test_workspace_override_presentz7TestH1WorkspaceOverride.test_workspace_override_present,   s    f )
yy*BHHJ7 
 
 #YY$YYYYYYY"YYY"YYYYY+A. 0 	
/=@ 	
 	
/= 	
 	
 		 0 	
 	
	6	
 	
  4A 	
 	
 		 4A 	
 	
  J-IZ[	
 	
 	
 	
 	

  	
-/ 	
 	
- 	
 	
 		  	
 	
	6	
 	
  #0 	
 	
 		 #0 	
 	
  iivhyz	
 	
 	
 	
 	

 **S
 ~~ 	
~c" 	
" 	
 P	
 	
 
6	
 	
   	
 	
 
	  	
 	
 
	  	
 	
 
6	
 	
  " 	
 	
 
	 " 	
 	
 
	 # 	
 	
 	
 	
 	
-
s   -MNreturnNone)__name__
__module____qualname____doc__r:   r   r   r   r   r   )   s
    L#
r   r   c                      e Zd ZdZddZy)TestH1DetectTaskWorktreeFuncu5   H1 hunk: _detect_task_worktree() 함수 정의 검증c                `   t               }d}||v }|st        j                  d|fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }t        j                  d      dz   d|iz  }t        t        j                  |            d	x}}g }d
}||v }|}|sd}||v }	|	}|	sd}
|
|v }|}|st        j                  d|fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }|j                  |       |st        j                  d	fd|f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }|j                  |       |	st        j                  dfd
|f      t        j                  |
      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }|j                  |       t        j                  |d      i z  }t        j                  d      dz   d|iz  }t        t        j                  |            d	x}x}x}x}x}x}	x}
}d}||v }|st        j                  d|fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }t        j                  d      dz   d|iz  }t        t        j                  |            d	x}}y	)u4  H1: _detect_task_worktree() 함수 정의 존재 + 핵심 git 명령 포함.

        검증:
          1. 함수 정의 `_detect_task_worktree()` 존재.
          2. `git worktree list --porcelain` 호출 코드 포함.
          3. `--fixed-strings` 플래그 사용 (grep/git log 보안 패턴).
        _detect_task_worktree()r   r   r    r   uP   _detect_task_worktree() 함수 정의가 finish-task.sh에 없음 (H1 미적용)r   r   Nz worktree", "list", "--porcelain"z!"worktree", "list", "--porcelain"zworktree list --porcelain)z%(py3)s in %(py5)s)r   r   z%(py7)spy7)z%(py10)s in %(py12)s)py10py12z%(py14)spy14)z%(py17)s in %(py19)s)py17py19z%(py21)spy21   uG   _detect_task_worktree 내 'git worktree list --porcelain' 호출 없음z
>assert %(py24)spy24z--fixed-stringsuv   _detect_task_worktree 내 '--fixed-strings' 사용 없음 (task_id 가 특수문자 포함 시 regex injection 위험))r   r'   r/   r,   r)   r*   r+   r(   r-   r.   append_format_boolop)r1   r    r4   r5   r6   r7   r8   r9   @py_assert9@py_assert11@py_assert16@py_assert18@py_format8@py_format13@py_format15@py_format20@py_format22@py_format23@py_format25s                      r   &test_detect_task_worktree_func_definedzCTestH1DetectTaskWorktreeFunc.test_detect_task_worktree_func_definedY   sb    f ) 	
(C/ 	
 	
(C 	
 	
 		 ) 	
 	
	6	
 	
  -0 	
 	
 		 -0 	
 	
  _	
 	
 	
 	
 	

	
1 	
1S8 	
2	
2c9	
*	
*c1	
 	
 		
1S 	
 	
 
		 2 	
 	
 
6		
 	
 	 69 	
 	
 
		 69 	
 	
 	
 
6		
 
		
 		
2c	
 	
 
	 3	
 	
 
6		
 	
  7:	
 	
 
	 7:	
 	
 	
 
6		
 
		
 		
*c	
 	
 
	 +	
 	
 
6		
 	
  /2	
 	
 
	 /2	
 	
 	
 
6		
 
		
 		
 	
  V	
 	
 	
 		
 	
 	
 	
 ! 	
 C' 	
 	
 C 	
 	
 
	 ! 	
 	
 
6	
 	
  %( 	
 	
 
	 %( 	
 	
 K	
 	
 	
 	
 	
r   Nr;   )r>   r?   r@   rA   r\   r   r   r   rC   rC   V   s
    ?
r   rC   c                      e Zd ZdZddZy)TestH2Tier3Blocku3   H2 hunk: tier③ 자동 탐지 블록 존재 검증c                   t               }d}||v }|st        j                  d|fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }t        j                  d      dz   d|iz  }t        t        j                  |            d	x}}d
}||v }|st        j                  d|fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }t        j                  d      dz   d|iz  }t        t        j                  |            d	x}}|j                  d      }|j                  d
      }||k  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      nddt	        j
                         v st        j                  |      rt        j                  |      nddz  }	t        j                  d      dz   d|	iz  }
t        t        j                  |
            d	}y	)uK  H2: tier③ 블록(_WT_DETECTED 패턴 + PROJECT_PATH 승격) 존재.

        검증:
          1. `_WT_DETECTED="$(_detect_task_worktree)"` 패턴 존재.
          2. `PROJECT_PATH="$_WT_DETECTED"` 대입 존재.
          3. 두 패턴이 같은 if 블록 안에 연속 위치 (소스 순서로 tier③ 블록 구성).
        z'_WT_DETECTED="$(_detect_task_worktree)"r   r   r    r   uT   tier③ 블록: _WT_DETECTED="$(_detect_task_worktree)" 패턴 없음 (H2 미적용)r   r   NzPROJECT_PATH="$_WT_DETECTED"uI   tier③ 블록: PROJECT_PATH="$_WT_DETECTED" 대입 없음 (H2 미적용)<)z%(py0)s < %(py2)s
idx_detect
idx_assign)r   r"   uV   tier③ 블록 순서 오류: _WT_DETECTED 탐지가 PROJECT_PATH 대입 앞에 없음z
>assert %(py4)spy4)r   r'   r/   r,   r)   r*   r+   r(   r-   r.   index)r1   r    r4   r5   r6   r7   rb   rc   r8   @py_format3@py_format5s              r   test_tier3_block_presentz)TestH2Tier3Block.test_tier3_block_present}   s$    f 9 	
8C? 	
 	
8C 	
 	
 		 9 	
 	
	6	
 	
  =@ 	
 	
 		 =@ 	
 	
  c	
 	
 	
 	
 	

 . 	
-4 	
 	
- 	
 	
 		 . 	
 	
	6	
 	
  25 	
 	
 		 25 	
 	
  X	
 	
 	
 	
 	

 YYHI
YY=>
J& 	
 	
zJ 	
 	
	6	
 	
   	
 	
 		  	
 	
	6	
 	
  ' 	
 	
 		 ' 	
 	
  e	
 	
 	
 	
 	
r   Nr;   )r>   r?   r@   rA   rh   r   r   r   r^   r^   z   s
    =
r   r^   c                       e Zd ZdZddZddZy)TestH3QcEvidenceRootuP   H3 hunk: QC_EVIDENCE_ROOT 정의 및 QC 호출 양 분기에 환경변수 전파c                B   t               }d}||v }|st        j                  d|fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }t        j                  d      dz   d|iz  }t        t        j                  |            d	x}}t        j                  d
      }|j                  |      }t        |      }d}||k\  }	|	st        j                  d|	fd||f      dt	        j
                         v st        j                  t              rt        j                  t              nddt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }
t        j                  dt        |       d      dz   d|
iz  }t        t        j                  |            d	x}x}	}y	)ud  H3: QC_EVIDENCE_ROOT 정의 + QC python3 호출 2분기 모두에 env prefix.

        검증:
          1. `QC_EVIDENCE_ROOT="${PROJECT_PATH:-$WORKSPACE}"` 정의 존재.
          2. QC python3 호출 라인 2개 모두 `PROJECT_PATH="$QC_EVIDENCE_ROOT" WORKTREE_PATH="$QC_EVIDENCE_ROOT"` prefix.
          3. 정규식으로 2건 매칭 확인.
        .QC_EVIDENCE_ROOT="${PROJECT_PATH:-$WORKSPACE}"r   r   r    r   uO   H3: QC_EVIDENCE_ROOT="${PROJECT_PATH:-$WORKSPACE}" 정의 없음 (H3 미적용)r   r   NPPROJECT_PATH="\$QC_EVIDENCE_ROOT"\s+WORKTREE_PATH="\$QC_EVIDENCE_ROOT"\s+python3r   )>=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)slenmatches)r   r   r   py6uC   H3: QC python3 호출에 PROJECT_PATH/WORKTREE_PATH env prefix 가 uz   개만 있음 (2개 필요 — team 분기, no-team 분기). finish-task.sh QC 실행 분기 2개 모두에 prefix 필요.
>assert %(py8)spy8)r   r'   r/   r,   r)   r*   r+   r(   r-   r.   r$   r0   findallro   )r1   r    r4   r5   r6   r7   qc_env_prefix_patternrp   @py_assert5r9   @py_format7@py_format9s               r   !test_qc_evidence_root_propagationz6TestH3QcEvidenceRoot.test_qc_evidence_root_propagation   s    f @ 	
?3F 	
 	
?3 	
 	
 		 @ 	
 	
	6	
 	
  DG 	
 	
 		 DG 	
 	
  ^	
 	
 	
 	
 	
 !#

_!
 (//47| 	
q 	
|q  	
 	
 		
|q 	
 	
 
6		
 	
 	  	
 	
 
		  	
 	
 
6		
 	
 	  	
 	
 
		  	
 	
 
		  	
 	
 
		  ! 	
 	
  R7|n LL	
 	
 	
 		
 	
 	
r   c                   t               }d}||v }|st        j                  d|fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }t        j                  d      dz   d|iz  }t        t        j                  |            d	x}}|j                  d      }t        j                  d
      }|j                  |      }d	}||u}	|	st        j                  d|	fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        j                  d      dz   d|iz  }t        t        j                  |            d	x}	}|j                  }
 |
       }||k  }	|	st        j                  d|	fd||f      dt	        j
                         v st        j                  |      rt        j                  |      nddt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |
      t        j                  |      dz  }t        j                  d      dz   d|iz  }t        t        j                  |            d	x}	x}
}y	)uV   H3: QC_EVIDENCE_ROOT 정의가 QC python3 호출보다 소스 순서상 앞에 위치.rl   r   r   r    r   uY   QC_EVIDENCE_ROOT 정의 없음 — test_qc_evidence_root_propagation 도 실패해야 함r   r   Nrm   )is not)z%(py0)s is not %(py3)smr   r   u&   QC env-prefix python3 호출 미발견r`   )zC%(py0)s < %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s.start
}()
}idx_def)r   r"   rd   rq   uP   QC_EVIDENCE_ROOT 정의가 QC python3 호출보다 뒤에 있음 (순서 오류)rr   rs   )r   r'   r/   r,   r)   r*   r+   r(   r-   r.   re   r$   r0   r%   start)r1   r    r4   r5   r6   r7   r~   qc_call_patternr|   r8   @py_assert3rv   rw   rx   s                 r   -test_qc_evidence_root_defined_before_qc_callszBTestH3QcEvidenceRoot.test_qc_evidence_root_defined_before_qc_calls   s@   f? 	
?3F 	
 	
?3 	
 	
 		 @ 	
 	
	6	
 	
  DG 	
 	
 		 DG 	
 	
  h	
 	
 	
 	
 	
 ))LM **_
 ""3'Fq}FFFqFFFFFFqFFFqFFFFFFFFFFFFF 	
 	
w" 	
 	
 	
w 	
 	
	6	
 	
   	
 	
 		  	
 	
	6	
 	
   	
 	
 		  	
 	
 		 ! 	
 	
 		 # 	
 	
  _	
 	
 	
 	
 	
 	
r   Nr;   )r>   r?   r@   rA   ry   r   r   r   r   rj   rj      s    Z
6
r   rj   c                      e Zd ZdZddZy)TestBashSyntaxu5   bash -n 으로 finish-task.sh 문법 유효성 검증c                F   t        j                  ddt        t              gddd      }|j                  }d}||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      d
z  }t        j                  d|j                   d|j                         dz   d|iz  }t        t        j                  |            dx}x}}y)u?   bash -n finish-task.sh 가 returncode 0 (파싱 오류 없음).bashz-nT   )capture_outputtexttimeoutr   )==)z2%(py2)s
{%(py2)s = %(py0)s.returncode
} == %(py5)sresult)r   r"   r   u6   bash -n finish-task.sh 실패 (syntax error):
stdout: z	
stderr: z
>assert %(py7)srF   N)
subprocessrunstrr	   
returncoder'   r/   r)   r*   r+   r,   r(   stdoutstderrr-   r.   )r1   r   r8   r9   r   r7   rU   s          r   test_bash_syntax_validz%TestBashSyntax.test_bash_syntax_valid   s   T3|,-	
    	
A 	
 A% 	
 	
 A 	
 	
 
6	
 	
   	
 	
 
	  	
 	
 
	 ! 	
 	
 
	 %& 	
 	
 }}oZ@	
 	
 	
 	
 	
 	
r   Nr;   )r>   r?   r@   rA   r   r   r   r   r   r      s
    ?
r   r   c                       e Zd ZdZddZddZy)#TestCanonicalGuardAndBackwardCompatuR   _detect_task_worktree 내 canonical 가드 + tier③ 빈 문자열 backward-compatc                	   t               }d}||v }|st        j                  d|fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }t        j                  d      dz   d|iz  }t        t        j                  |            d	x}}|j                  d
      }d}| }||k7  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }	t        j                  d      dz   d|	iz  }
t        t        j                  |
            d	x}x}}|j                  d|      }d}| }||k7  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }	t        j                  d      dz   d|	iz  }
t        t        j                  |
            d	x}x}}|j                  d|t        d      z         }d}| }||k7  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }	t        j                  d      dz   d|	iz  }
t        t        j                  |
            d	x}x}}|j                  d|      }d}| }||k7  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }	t        j                  d      dz   d|	iz  }
t        t        j                  |
            d	x}x}}|||dz    }d}||v }|st        j                  d|fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }t        j                  d|d	d       dz   d|iz  }t        t        j                  |            d	x}}y	)u  _detect_task_worktree 내 canonical 경로 제외 가드 정적 확인.

        실제 bash 격리 실행 대신 정적 소스 검증으로 대체.
        사유: _detect_task_worktree 는 내부적으로 python3 heredoc(PYEOF_DETECT_WT)을 사용하며,
        bash -c 로 함수만 추출 실행 시 WORKSPACE/TASK_ID 전역변수 주입 및
        heredoc 탈출 처리가 복잡해 결정적 격리 실행이 어렵다.
        소스에서 `os.path.realpath(cur) == canon` 가드가 존재함을 확인하는 것이
        동치(canonical worktree 탐지 제외)를 충분히 보장한다.

        함수 범위 추출 전략:
          `_detect_task_worktree()` 정의 이후 heredoc 종료 마커(PYEOF_DETECT_WT)를 찾고,
          그 다음 줄의 `}` 까지 포함시킨다. bash heredoc은 내부에 `{`/`}` 를 포함할 수
          있어 단순 brace-counting이 오작동하므로, PYEOF 마커 이후 닫힘 `}` 라인까지
          슬라이싱하는 방식을 사용한다.
        zos.path.realpath(cur) == canonr   r   r    r   u   _detect_task_worktree 내 'os.path.realpath(cur) == canon' 가드 없음 — canonical worktree 가 탐지 결과에 포함될 위험r   r   NrE   rM   )!=)z%(py0)s != -%(py3)s
func_startr}   u,   _detect_task_worktree() 함수 정의 없음z
>assert %(py6)srq   PYEOF_DETECT_WTfirst_pyeofu!   PYEOF_DETECT_WT 첫 등장 없음second_pyeofu?   PYEOF_DETECT_WT 두 번째 등장(heredoc 종료 마커) 없음}closing_braceu,   _detect_task_worktree 함수 닫힘 } 없음	func_bodyu}   os.path.realpath(cur) == canon 가드가 _detect_task_worktree 함수 바깥에 있음.
추출된 함수 바디(첫 200자):    )r   r'   r/   r,   r)   r*   r+   r(   r-   r.   findro   )r1   r    r4   r5   r6   r7   r   r9   r8   rg   rw   r   r   r   r   s                  r   +test_detect_task_worktree_isolated_behaviorzOTestCanonicalGuardAndBackwardCompat.test_detect_task_worktree_isolated_behavior   sy     f 0 	
/36 	
 	
/3 	
 	
 
	 0 	
 	
 
6	
 	
  47 	
 	
 
	 47 	
 	
 G	
 	
 	
 	
 	
 XX78
OaROzROOOzROOOOOOzOOOzOOOaOOO!OOOOOOOO
 hh0*= EqbE{b EEE{bEEEEEE{EEE{EEEqEEE"EEEEEEEExx 1;EVAW3WX !drd|r!ddd|rdddddd|ddd|dddddd#dddddddd l3!"RR}"RRR}RRRRRR}RRR}RRRRRR$RRRRRRRR
=1#45	/ 	
/9< 	
 	
/9 	
 	
 
	 0 	
 	
 
6	
 	
  4= 	
 	
 
	 4= 	
 	
 44=dsO3FH	
 	
 	
 	
 	
r   c                   t               }t        j                  d      }|j                  } ||      }|st	        j
                  d      dz   dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dz  }t        t	        j                  |            dx}}d}||v }|st	        j                  d	|fd
||f      t	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      nddz  }t	        j
                  d      dz   d|iz  }t        t	        j                  |            dx}}y)ua  tier③ 블록이 빈 문자열 반환 시 PROJECT_PATH 미변경을 소스에서 확인.

        tier③ 블록은 `[ -n "$_WT_DETECTED" ]` 가드를 포함해야 한다.
        canonical-path task 는 _detect_task_worktree 가 빈 문자열을 반환하므로
        PROJECT_PATH 가 변경되지 않아야 한다 (backward-compat 보장).
        z\[\s*-n\s*"\$_WT_DETECTED"\s*\]u   tier③ 블록에 [ -n "$_WT_DETECTED" ] 가드 없음 — 빈 문자열 반환 시 PROJECT_PATH 가 오염될 위험 (backward-compat 파손)r   nonempty_guard_patternr    r!   Nzunset _WT_DETECTEDr   r   r   uG   tier③ 블록 후 'unset _WT_DETECTED' 없음 — 변수 누출 위험r   r   )r   r$   r0   r%   r'   r(   r)   r*   r+   r,   r-   r.   r/   )	r1   r    r   r8   r9   r7   r4   r5   r6   s	            r   #test_backward_compat_canonical_pathzGTestCanonicalGuardAndBackwardCompat.test_backward_compat_canonical_path  s    f
 "$."
 &,, 	
,S1 	
1 	
 b	
 	
 
6	
 	
  & 	
 	
 
	 & 	
 	
 
	 - 	
 	
 
6	
 	
  .1 	
 	
 
	 .1 	
 	
 
	 2 	
 	
 	
 	
 	
 $ 	
#s* 	
 	
#s 	
 	
 		 $ 	
 	
	6	
 	
  (+ 	
 	
 		 (+ 	
 	
  V	
 	
 	
 	
 	
r   Nr;   )r>   r?   r@   rA   r   r   r   r   r   r   r      s    \/
b
r   r   )r<   r   )rA   
__future__r   builtinsr)   _pytest.assertion.rewrite	assertionrewriter'   r$   r   pathlibr   __file__resolveparents_REPOr	   r   r   rC   r^   rj   r   r   r   r   r   <module>r      s   $ #   	  
 	X ((+y #334&
 &
Z
 
H
 
F0
 0
n
 
*K
 K
r   