
    Ki5                        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ZddlZddlmZ  ed      Zedz  dz  Zedz  d	z  d
z  ZdZde dZdZddZ	 d	 	 	 	 	 	 	 ddZddZddZeeef	 	 	 	 	 ddZd dZd dZd dZd dZd dZd dZy)!u  tests/taskctl/test_takeover.py
taskctl.py takeover 서브커맨드 테스트 (task-2458 Phase 2-B)

테스트 케이스:
- test_takeover_handoff_missing         — handoff 없음 → exit 1
- test_takeover_schema_invalid          — handoff schema invalid → exit 1
- test_takeover_from_branch_missing     — --from 가 존재하지 않는 branch → exit 1
- test_takeover_head_sha_mismatch       — handoff.head_sha != from-branch HEAD → exit 1
- test_takeover_changed_paths_violation — changed_paths ⊄ allowed_paths → exit 1
- test_takeover_pass                    — 정상 경로 → exit 0 + worktree + evidence 생성

fixture 패턴 (PASS 케이스):
1. tmp_path/repo 내 git repo 초기화
2. 초기 commit → task 브랜치 생성 → 추가 commit
3. refs/remotes/origin/main 을 설정 (origin/main 시뮬레이션)
4. valid handoff JSON 작성 (head_sha = task 브랜치 HEAD)
5. WORKSPACE_ROOT=tmp_path/repo 로 taskctl takeover 실행
    )annotationsN)Pathz-/home/jay/workspace/.worktrees/task-2458-dev4scriptsz
taskctl.pymemoryspecshandoff-schema.jsonz	task-9020ztask/z-dev4dev5c                8    t         ddt        d| dgddgg i ddd	d
S )Nz1.0dev4abc1234tests/taskctl/test_takeover.pytests/taskctl/zscripts/takeover_requestz2026-05-05T12:00:00Zu   takeover 테스트 진행 중)task_idschema_versionprevious_botcurrent_branchbase_shahead_shachanged_pathsallowed_pathsforbidden_pathstest_resultshandoff_reason
created_atpending_work)TEST_TASK_IDTEST_TASK_BRANCH)r   s    2/home/jay/workspace/tests/taskctl/test_takeover.py_make_valid_handoffr    *   s;    *:;*J7,,7     c                    t        t        j                        }t        |      |d<   |r|j	                  |       t        j                  dt        t              g| z   t        |      ddd|      S )u   taskctl.py 실행 헬퍼.WORKSPACE_ROOTpython3T<   )cwdcapture_outputtexttimeoutenv)dictosenvironstrupdate
subprocessrunTASKCTL_SCRIPT)argsworkspace_root	extra_envr*   s       r   _run_taskctlr6   @   sh     rzz
C/C

9>>	C'(4/ r!   c                   | dz  j                  dd       ddfd
} |dd        |dd	d
        |ddd       dz  j                  d        |dd        |ddd        |ddd        |ddt               dz  j                  d        |dd        |dddt         d        |dd      j                  j                         } |dd       |fS )uA  base_dir/repo 내에 임시 git repo를 설정하고 (repo_path, task_branch_head_sha) 반환.

    절차:
    1. git init --initial-branch=main
    2. 초기 commit (origin/main 역할)
    3. task 브랜치 checkout → 추가 commit
    4. git update-ref refs/remotes/origin/main main (origin/main 참조 생성)
    repoTparentsexist_ok)checkc                d    t        j                  dgt        |      z   t              dd|       S )NgitT)r&   r'   r(   r<   )r0   r1   listr.   )r<   r3   r8   s     r   _gitz_setup_git_repo.<locals>._git`   s2    ~~Gd4j D	
 	
r!   initz--initial-branch=mainconfigz
user.emailztest@test.comz	user.namezTest Botz	README.mdadd.commitz-mzinit: main basez
update-refzrefs/remotes/origin/mainHEADcheckoutz-bztask_file.txtz	task workzfeat: z work	rev-parsemain)mkdir
write_textr   r   stdoutstrip)base_dirr@   r   r8   s      @r   _setup_git_reporO   T   s     fDJJtdJ+ 
 	()<1;
+ 
K##F+4*+ 	16: 	T+,	O''446,u56 K(//557H 	V>r!   c                P   | dz  dz  }|j                  dd       |dz  }|j                         s#|j                  t        j	                                | dz  }|j                  dd       dD ]e  }t
        dz  |z  }||z  }|j                         s%|j                         r6|j                  |j	                                |j                  d       g | dz  d	z  }|j                  dd       |t         d
z  }	|	j                  t        j                  |dd      d       |	S )uJ   repo/memory/handoffs/<task_id>.json 기록 + 스키마/start_guard 복사.r   r   Tr9   r   r   )zstart_task_guard.pyzvalidate_handoff.pyi  handoffsz.jsonF   )ensure_asciiindentutf-8encoding)rJ   existswrite_bytesSCHEMA_PATH
read_bytesWORKTREEchmodr   rK   jsondumps)
r8   dataspec_dir
schema_dstscripts_dstsnamesrcdsthdirhpaths
             r   _write_handoff_in_repori      s   h(HNN4$N/11J{5578 "KdT2? "U*E!::<

OOCNN,-IIe (?Z'DJJtdJ+l^5))E	TZZ5CgVLr!   c                    d| d|d|gS )Ntakeoverz--fromz--bot )r   from_branchnew_bots      r   _takeover_argsro      s     ;IIr!   c                	   t        |       \  }}|dz  dz  }|j                  dd       |dz  j                  t        j	                                t        t               |      }|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}}|j                   |j                  z   }
g }d}|
j&                  } |       }||v }|}|s/d}||
v }|}|s%d}|
j&                  } |       }||v }|}|sd}||
v }|}|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |
      rt        j                  |
      ndt        j                  |      t        j                  |      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)                  |       |sBt        j                  dfdf      t        j                  |      dt        j                         v st        j                  |
      rt        j                  |
      ndt        j                        t        j                  |      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'|j                    d(|j                         d)z   d*|iz  } t#        t        j$                  |             dx}x}x}x}x}x}x}x}x}x}x}x}x}}y)+u;   handoff JSON이 존재하지 않으면 takeover → exit 1.r   r   Tr9   r   r4      ==z2%(py2)s
{%(py2)s = %(py0)s.returncode
} == %(py5)sresultpy0py2py5u!   handoff 없는데 exit 0
stdout: 	
stderr: 
>assert %(py7)spy7Nhandoffu   없음	not foundFAILinzD%(py3)s in %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s.lower
}()
}combinedpy3rz   r}   py9%(py11)spy11z%(py14)s in %(py16)spy14py16%(py18)spy18zJ%(py21)s in %(py27)s
{%(py27)s = %(py25)s
{%(py25)s = %(py23)s.lower
}()
}py21py23py25py27%(py29)spy29z%(py32)s in %(py34)spy32py34%(py36)spy36u    에러 메시지 없음
stderr: 	
stdout: 
>assert %(py39)spy39)rO   rJ   rY   rZ   r[   r6   ro   
returncode
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgrL   stderrAssertionError_format_explanationlowerappend_format_boolop)!tmp_pathr8   _ra   rv   @py_assert1@py_assert4@py_assert3@py_format6@py_format8r   @py_assert2@py_assert6@py_assert8@py_assert0@py_assert13@py_assert15@py_assert20@py_assert24@py_assert26@py_assert22@py_assert31@py_assert33@py_format10@py_format12@py_format17@py_format19@py_format28@py_format30@py_format35@py_format37@py_format38@py_format40s!                                    r   test_takeover_handoff_missingr      s\   h'GD!h(HNN4$N/%%22;3I3I3KL.*4@F  !                    !"    -V]]O:fmm_U     }}v}},HTT^^T#%T%%TTxT T #..T )*T **T 	T X	T T
 CTBST%T T
 KT)	 	T T
 NTVT T
 <T;S	 T T
 KT)	 T T
 KT)	 $T T
 KT)	 &T T T
 NTVT
 NTT
 CTBSTxT T
 KT) T T
 NTVT T
 <T;S  T T
 KT)  T T T
 NTVT
 NTT
 CTBST *T T
 KT) T T
 NTVT T
 <T;S #T T
 KT) #T T
 KT) )T T
 KT) +T T T
 NTVT
 NTT
 CTBST X	T T
 KT) 	T T
 NTVT T
 <T;S 	T T
 KT) 	T T T
 NTVT
 NTT
 FT^T T
 CTBS	*6==/FMM?ST T T
 AT@ST T T T Tr!   c                .	   t        |       \  }}t        dd}t        ||       t        t	               |      }|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}}|j                  |j                  z   }
g }d}|
j"                  } |       }||v }|}|s/d}||
v }|}|s%d}|
j"                  } |       }||v }|}|sd}||
v }|}|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |
      rt        j                  |
      ndt        j                  |      t        j                  |      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%                  |       |sBt        j                  dfdf      t        j                  |      dt        j                         v st        j                  |
      rt        j                  |
      ndt        j                        t        j                  |      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}x}x}x}x}x}x}}y)'uE   handoff JSON이 schema를 만족하지 않으면 takeover → exit 1.r   )r   r   rq   rr   rs   ru   rv   rw   u$   schema invalid인데 exit 0
stdout: r{   r|   r}   Nschemar   invalidu   검증r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   u,   스키마 에러 메시지 없음
combined: r   r   )rO   r   ri   r6   ro   r   r   r   r   r   r   r   r   rL   r   r   r   r   r   r   )!r   r8   r   invalid_datarv   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   s!                                    r   test_takeover_schema_invalidr      s   h'GD!  ,L
 4..*4@F  !                    !"    0jX     }}v}},HBBNNB"$B$$BBXB B !B '(B ((B 	B x	B B
 1B0AB$B B
 9B		 	B B
 <B6B B
 *B)A	 B B
 9B		 B B
 9B		 #B B
 9B		 %B B B
 <B6B
 <BB
 1B0ABXB B
 9B	 B B
 <B6B B
 *B)A B B
 9B	 B B B
 <B6B
 <BB
 1B0AB (B B
 9B	 B B
 <B6B B
 *B)A !B B
 9B	 !B B
 9B	 'B B
 9B	 )B B B
 <B6B
 <BB
 1B0AB x	B B
 9B	 	B B
 <B6B B
 *B)A  	B B
 9B	  	B B B
 <B6B
 <BB
 4B>B B
 1B0A	6xjAB B B
 /B.AB B B B Br!   c                t
   t        |       \  }}t        |      }t        ||       d}t        t	        |      |      }|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}}|j                  |j                  z   }g }d}|j"                  } |       }||v }|}|s9d}||v }|}|s/d}||v }|}|s%d}||v }|}|sd}|j"                  } |       }||v }|}|snt        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      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%                  |       |sBt        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t        j                        t        j                  |      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}x}x}x}x}x}x}x}x}}y),u8   --from 에 존재하지 않는 branch 지정 → exit 1.ztask/task-9999-devX)rm   rq   rr   rs   ru   rv   rw   u0   존재하지 않는 branch인데 exit 0
stdout: r{   r|   r}   NbranchrH   r   u   없r   r   r   r   r   r   r   r   r   r   r   z%(py21)s in %(py23)sr   r   %(py25)sr   z%(py28)s in %(py30)spy28py30%(py32)sr   zJ%(py35)s in %(py41)s
{%(py41)s = %(py39)s
{%(py39)s = %(py37)s.lower
}()
}py35py37r   py41%(py43)spy43u0   branch 없음 에러 메시지 없음
combined: 
>assert %(py46)spy46rO   r    ri   r6   ro   r   r   r   r   r   r   r   r   rL   r   r   r   r   r   r   )&r   r8   r   r`   nonexistent_branchrv   r   r   r   r   r   r   r   r   r   r   r   r   r   r   @py_assert27@py_assert29@py_assert34@py_assert38@py_assert40@py_assert36r   r   r   r   @py_format24@py_format26@py_format31@py_format33@py_format42@py_format44@py_format45@py_format47s&                                         r   !test_takeover_from_branch_missingr      s   $X.ND(x(D4&.#56F   !                    !"    <FMM?*U[UbUbTcd     }}v}},HFFNNF"$F$$FF("F F XF 	F H	F
 F
 #..F
 )*F
 **F F 5F4EF$F F =FI 	F F @FvF F .F-E F F =FI F F =FI #F F =FI %F F F @FvF @FF 5F4EF(F F =FI	 F F @FvF F .F-E	 #F F =FI	 #F F F @FvF @FF 5F4EF XF F =FI F F @FvF F .F-E F F =FI F F F @FvF @FF 5F4EF H	F F =FI 	F F @FvF F .F-E 	F F =FI 	F F F @FvF @FF 5F4EF
 *F F =FI F F @FvF F .F-E #F F =FI #F F =FI )F F =FI +F F F @FvF @FF 8F~F F 5F4E	:8*EF F F 3F2EF F F F F Fr!   c                r
   t        |       \  }}t        d      }t        ||       t        t	               |      }|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
|       dz   d|iz  }	t        t        j                   |	            dx}x}}|j                  |j                  z   }
g }d}||
v }|}|sLd}|
j"                  } |       }||v }|}|s/d}||
v }|}|s%d}||
v }|}|sd}|
j"                  } |       }||v }|}|snt        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t        j                        t        j                  |      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%                  |       |sBt        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t        j                        t        j                  |      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}x}x}x}x}x}x}x}x}}y)+u2   handoff.head_sha != --from branch HEAD → exit 1.0000000deadbeefrq   rr   rs   ru   rv   rw   u(   head_sha 불일치인데 exit 0
stdout: r{   z
real_head_sha=r|   r}   Nr   shau	   불일치r   mismatchr   )z%(py3)s in %(py5)sr   )r   rz   z%(py7)s)zJ%(py10)s in %(py16)s
{%(py16)s = %(py14)s
{%(py14)s = %(py12)s.lower
}()
})py10py12r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   u0   SHA 불일치 에러 메시지 없음
combined: r   r   r   )#r   r8   real_head_shar`   rv   r   r   r   r   r   r   r   r   @py_assert9r   r   @py_assert11r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s#                                      r   test_takeover_head_sha_mismatchr      s   )(3D- 01D4&.*4@F  !                    !"    4FMM?*V]]O
=/	+     }}v}},HFFhFFNNF"$F$$F F ("F 	F X	F
 F
 "F
 ()F
 ))F F 5F4EFhF F =FI 	F F @FvF F .F-E F F =FI F F F @FvF @FF 5F4EF$F F =FI	 F F @FvF F .F-E	 F F =FI	 F F =FI	 #F F =FI	 %F F F @FvF @FF 5F4EF (F F =FI F F @FvF F .F-E #F F =FI #F F F @FvF @FF 5F4EF X	F F =FI 	F F @FvF F .F-E 	F F =FI 	F F F @FvF @FF 5F4EF
 )F F =FI F F @FvF F .F-E "F F =FI "F F =FI (F F =FI *F F F @FvF @FF 8F~F F 5F4E	:8*EF F F 3F2EF F F F F Fr!   c                L	   t        |       \  }}t        |      }dg|d<   ddg|d<   t        ||       t        t	               |      }|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}}|j                  |j                  z   }
g }d}|
j"                  } |       }||v }|}|s/d}||
v }|}|s%d}|
j"                  } |       }||v }|}|sd}||
v }|}|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |
      rt        j                  |
      ndt        j                  |      t        j                  |      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%                  |       |sBt        j                  dfdf      t        j                  |      dt        j                         v st        j                  |
      rt        j                  |
      ndt        j                        t        j                  |      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}x}x}x}x}x}x}}y)*u+   changed_paths ⊄ allowed_paths → exit 1.r   r   r   zscripts/dangerous.pyr   rq   rr   rs   ru   rv   rw   u*   changed_paths 위반인데 exit 0
stdout: r{   r|   r}   Nallowedu   초과	violationr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   u0   경로 위반 에러 메시지 없음
combined: r   r   r   )!r   r8   r   r`   rv   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   s!                                    r   %test_takeover_changed_paths_violationr    s5   $X.ND(x(D-.D(D 4&.*4@F  !                    !"    6fmm_Jv}}o^     }}v}},HFF^^F#%F%%FFxF F #..F )*F **F 	F X	F F
 5F4EF%F F
 =FI	 	F F
 @FvF F
 .F-E	 F F
 =FI	 F F
 =FI	 $F F
 =FI	 &F F F
 @FvF
 @FF
 5F4EFxF F
 =FI F F
 @FvF F
 .F-E  F F
 =FI  F F F
 @FvF
 @FF
 5F4EF *F F
 =FI F F
 @FvF F
 .F-E #F F
 =FI #F F
 =FI )F F
 =FI +F F F
 @FvF
 @FF
 5F4EF X	F F
 =FI 	F F
 @FvF F
 .F-E 	F F
 =FI 	F F F
 @FvF
 @FF
 8F~F F
 5F4E	:8*EF F F
 3F2EF F F F Fr!   c           
        t        |       \  }}t        |      }t        ||       t        t	               |      }|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}}|j"                  dz  t$         dt&         z  |dz  t$         dt&         z  |j"                  t$         dt&         z  g}
t)        d |
D              }t+        j,                  g dt/        |      dd      }t&        |j                  v xs t$        |j                  v }g }|}|s|}|s0dddt        j                         v st        j                  |      rt        j                  |      ndiz  }|j1                  |       |sXdddt        j                         v st        j                  |      rt        j                  |      ndiz  }|j1                  |       t        j2                  |d      i z  }t        j                  d|
 d|j                   d|j                   d|j                         d	z   d
|iz  }	t        t        j                   |	            dx}}t/        |dz  dz  t$        z  dz        }t5        j4                  |      }|st        j                  d| d|j                   d|j                         d z   d!d"t        j                         v st        j                  |      rt        j                  |      nd"iz  }t        t        j                   |            t7        j8                  t;        |d         j=                  d#$            }g }|j>                  }d%} ||      }|t$        k(  }|}|s0d%}||v }|}|s&d&}t/        |      }|j@                  } |       }||v }|}|st        j                  d|fd'|t$        f      d(t        j                         v st        j                  |      rt        j                  |      nd(t        j                  |      t        j                  |      t        j                  |      d)t        j                         v st        j                  t$              rt        j                  t$              nd)d*z  }d+d,|iz  } |j1                  |        |st        j                  d-fd.|f      t        j                  |      d(t        j                         v st        j                  |      rt        j                  |      nd(d/z  }!d0d1|!iz  }"|j1                  |"       |st        j                  d-fd2f      t        j                  |      d3t        j                         v st        j                  t.              rt        j                  t.              nd3d(t        j                         v st        j                  |      rt        j                  |      nd(t        j                        t        j                        t        j                  |      d4z  }#d5d6|#iz  }$|j1                  |$       t        j2                  |d      i z  }%t        j                  d7|       d8z   d9|%iz  }&t        t        j                   |&            dx}x}x}x}x}x}x}x}x}x}x}x}}y):u   정상 경로: exit 0 + 새 worktree 존재 + evidence JSON 존재.

    검증 항목:
    1. exit code == 0
    2. .worktrees/<task-id>-<new-bot>/ 디렉토리 존재 (worktree add 완료)
    3. .tasks/evidence/<task-id>/takeover-*.json 존재
    rq   r   rs   ru   rv   rw   u%   정상 takeover인데 exit 1
stdout: r{   r|   r}   Nz
.worktrees-c              3  <   K   | ]  }|j                           y wN)rX   ).0ps     r   	<genexpr>z%test_takeover_pass.<locals>.<genexpr>N  s     EEs   )r>   worktreer?   T)r&   r'   r(   z%(py2)sry   worktree_foundz%(py4)spy4worktree_in_listrr   u8   새 worktree가 생성되지 않음
candidates checked: z
git worktree list:
r   z.tasksevidenceztakeover-*.jsonu4   evidence JSON이 생성되지 않음
검색 패턴: z
>assert %(py0)srx   evidence_filesrU   rV   r   rk   )zJ%(py8)s
{%(py8)s = %(py4)s
{%(py4)s = %(py2)s.get
}(%(py6)s)
} == %(py10)sev_datar   )ry   r  py6py8r   z%(py12)sr   r   )z%(py15)s in %(py17)s)py15py17z%(py19)spy19)zk%(py22)s in %(py31)s
{%(py31)s = %(py29)s
{%(py29)s = %(py27)s
{%(py27)s = %(py24)s(%(py25)s)
}.lower
}()
}r.   )py22py24r   r   r   py31z%(py33)spy33u   evidence JSON 내용 이상: z
>assert %(py36)sr   )!rO   r    ri   r6   ro   r   r   r   r   r   r   r   r   rL   r   r   r   parentr   NEW_BOTanyr0   r1   r.   r   r   globr^   loadsr   	read_textgetr   )'r   r8   r   r`   rv   r   r   r   r   r   new_worktree_candidatesr  wt_listr  r   @py_format3@py_format5evidence_patternr  @py_format1r  @py_assert5@py_assert7r   @py_assert14@py_assert16@py_assert21r   @py_assert28@py_assert30@py_assert23@py_format11@py_format13@py_format18@py_format20@py_format32@py_format34r   r   s'                                          r   test_takeover_passr6  1  s    %X.ND(x(D4&F   !                    !"    1z&--Y     	l"~Qwi%@@|ay99ay11
 E-DEENnn#I	G '..0RLGNN4R> >-  
  
    
    
 
  
  
  .  
  .  
 

  
 	67 8&~~. /==/FMM?	<  
   4(?Z7,FIZZ[YY/0N  *+ ,==/FMM?	<  	  	    	     	  jjnQ/0::G:LMG7;; y ;y! !\1 Y Y'5I Z [^_f[g [g[m[m [m[o Z[oMo   !\                  !    "      &2    &2     Y'    6?      CJ    CJ     Z[o    NX      \_    \_      `g    `g    \h    \n    \p        (y1       r!   )r   r.   returnr+   r  )r3   	list[str]r4   r   r5   zdict | Noner7  zsubprocess.CompletedProcess)rN   r   r7  ztuple[Path, str])r8   r   r`   r+   r7  r   )r   r.   rm   r.   rn   r.   r7  r8  )r   r   ) __doc__
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   r  r^   r,   r0   pathlibr   r\   r2   rZ   r   r   r  r    r6   rO   ri   ro   r   r   r   r   r  r6  rl   r!   r   <module>r@     s   $ #     	  
 ?@I%4!G+.CC <.. 

2 "
  !	(.b2 #/&6")J #JJ.7JT2B8F8F6F::r!   