
    Bj*J                    	   d Z ddlmZ ddlZddlmc mZ ddl	m
Z ddlZddlZddlZddlmZ  ee      j%                         j&                  d   Z ee      ej,                  vr"ej,                  j/                  d ee             edz  dz  Zej2                  j5                  d      Ze eedd	      xs d	 ee      k7  r eej2                        D  cg c]  } | dk(  s| j=                  d
      s|  c} D ]  Zej2                  e=   ej@                  de eedz        g      Z!g Z"dZ#e!e#uZ$e$Z%e$re!jL                  Z'dZ(e'e(uZ)e)Z%e%sB ejT                  de$fde!e#f      d ejV                         v s ejX                  e!      r ejZ                  e!      nd ejZ                  e#      dz  Z.dde.iz  Z/e"ja                  e/       e$r ejT                  de)fde'e(f      d ejV                         v s ejX                  e!      r ejZ                  e!      nd ejZ                  e'       ejZ                  e(      dz  Z1dde1iz  Z2e"ja                  e2        ejf                  e"d      i z  Z4dde4iz  Z5 e6 ejn                  e5            dxZ%xZ"xZ$xZ#xZ'xZ)Z( ejp                  e!      Z9e9ej2                  d<   e!jL                  ju                  e9       edz  dz  Z; ej@                  de;      Z<g Z"dZ#e<e#uZ$e$Z%e$re<jL                  Z'dZ(e'e(uZ)e)Z%e%sB ejT                  de$fde<e#f      d ejV                         v s ejX                  e<      r ejZ                  e<      nd ejZ                  e#      dz  Z.dde.iz  Z/e"ja                  e/       e$r ejT                  de)fde'e(f      d ejV                         v s ejX                  e<      r ejZ                  e<      nd ejZ                  e'       ejZ                  e(      dz  Z1dde1iz  Z2e"ja                  e2        ejf                  e"d      i z  Z4dde4iz  Z5 e6 ejn                  e5            dxZ%xZ"xZ$xZ#xZ'xZ)Z( ejp                  e<      Z=e<jL                  ju                  e=       ddl>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZE d ZFd ZGd ZHd  ZId! ZJd&d"ZKd# ZLd$ ZMd% ZNyc c} w )'u  task-2779_a — Pre-push Terminal Artifact Guard 회귀 테스트.

pre_push_terminal_guard.run_guard 및 main 진입점의 불변식을 격리 검증:
  - artifact 존재 시 push_attempt=False, surfacing 정상 동작.
  - artifact 부재 시 push_attempt=True, PUSH_ATTEMPT_WITHOUT_TERMINAL_MARKER 기록.
  - warn mode: 항상 비차단(blocked=False), exit_code=0.
  - 내부 오류 시 fail-open: GUARD_INTERNAL_ERROR_FAIL_OPEN, 크래시 없음.
  - traversal/절대경로 입력은 거부 처리됨(부재 취급).
  - 금지 리터럴(raw key, subprocess, git push 실행 패턴) 소스에 없음.
  - 기존 dispatch.terminal_artifact_index 동작 무회귀 스모크.

모든 테스트는 tmp_path만 사용. 실제 /home/jay/workspace canonical 절대 미접촉.
    )annotationsN)Path   dispatchz__init__.py__file__ z	dispatch.)submodule_search_locations)is not)z%(py2)s is not %(py5)s_spec)py2py5z%(py7)spy7)z5%(py11)s
{%(py11)s = %(py9)s.loader
} is not %(py14)s)py9py11py14z%(py16)spy16zassert %(py19)spy19scriptszpre_push_terminal_guard.pypre_push_terminal_guard_gspec)build_manifestsurface_manifestSTATUS_WORKTREE_LOCAL_PRESENTSTATUS_SURFACED_TO_CANONICAL STATUS_TERMINAL_CALLBACK_MISSING$STATUS_PUSH_ATTEMPT_WITHOUT_TERMINALCANONICAL_INDEX_DIR_RELc                p	   d}| dz  }| dz  }|dz  dz  }|j                  d       || dz  j                  d	d
       t        j                  |t	        |      t	        |            }|d   }d}||u }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	t        j                  d      dz   d|	iz  }
t        t        j                  |
            dx}x}}|d   }t        |v }|st        j                  d|fdt        |f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}}|d   }d}||k7  }|st        j                  d |fd!||f      t        j                  |      t        j                  |      dz  }	t        j                  d"      dz   d|	iz  }
t        t        j                  |
            dx}x}}|t        z  | d#z  }|j                   } |       }|st        j                  d$|       d%z   d&t        j                         v st        j                  |      rt        j                  |      nd&t        j                  |      t        j                  |      d'z  }	t        t        j                  |	            dx}}t#        j$                  |j'                  d
            }|d(   }||k(  }|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  }t        t        j                  |            dx}}|d   }t        |v }|st        j                  d|fdt        |f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }d,d|iz  }t        t        j                  |            dx}}y)-u   worktree report 존재 시 push_attempt=False, STATUS_WORKTREE_LOCAL_PRESENT in statuses, canonical index 파일 생성 확인.ztask-2779-test-present	canonicalworktreememoryreportsTparents.mdz# terminal report
utf-8encodingcanonical_rootworktree_rootpush_attemptFisz%(py1)s is %(py4)spy1py4u6   artifact 존재 시 push_attempt는 False여야 한다
>assert %(py6)spy6Nstatusesinz%(py0)s in %(py3)sr   py0py3u[   worktree에 report 있을 때 STATUS_WORKTREE_LOCAL_PRESENT가 statuses에 있어야 한다
>assert %(py5)sr   surfaced_index_pathr   !=)z%(py1)s != %(py4)su2   surfaced_index_path는 비어 있으면 안 된다.jsonu2   canonical index 파일이 생성되어야 한다: C
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}expected_indexr:   r   r2   task_id==z%(py1)s == %(py3)sr1   r;   assert %(py5)s)mkdir
write_textguard	run_guardstr
@pytest_ar_call_reprcompare	_saferepr_format_assertmsgAssertionError_format_explanationr   @py_builtinslocals_should_repr_global_namer   existsjsonloads	read_text)tmp_pathrD   r   r    
report_dirresult@py_assert0@py_assert3@py_assert2@py_format5@py_format7@py_assert1@py_format4@py_format6rB   datas                   I/home/jay/workspace/tests/regression/test_pre_push_terminal_guard_2779.py0test_terminal_artifact_present_surfaces_manifestri   @   sj   &G;&I*$H H$y0JT"WIS/!--.Cg-V__9~(m  F .!dUd!U*ddd!Uddd!dddUddd,dddddddd,2:,> f(,>> fTeTef(,> f f_e_ef fMeMe ) f f\e\e ) f f\e\e -? f fTeTeef f fReRef f'(dBd(B.ddd(Bddd(dddBddd0dddddddd !88gYe;LLN  i "i"ii&XYgXh$iiiiiii>iii>iii iii"iiiiii ::n...@AD	?%?g%%%%?g%%%?%%%%%%g%%%g%%%%%%%,0,<<(,<<<<<(,<<<<<<<(<<<(<<<,<<<<<<<<    c                   d}| dz  }| dz  }|j                  d       t        j                  |t        |      t        |            }|d   }d}||u }|st	        j
                  d|fd	||f      t	        j                  |      t	        j                  |      d
z  }t	        j                  d      dz   d|iz  }	t        t	        j                  |	            dx}x}}|d   }d}||k(  }|st	        j
                  d|fd||f      t	        j                  |      t	        j                  |      d
z  }t	        j                  d      dz   d|iz  }	t        t	        j                  |	            dx}x}}d}|d   }||v }|st	        j
                  d|fd||f      t	        j                  |      t	        j                  |      d
z  }t	        j                  d      dz   d|iz  }	t        t	        j                  |	            dx}x}}|t        z  | dz  }
|
j                  } |       }|st	        j                  d      dz   dt        j                         v st	        j                  |
      rt	        j                  |
      ndt	        j                  |      t	        j                  |      dz  }t        t	        j                  |            dx}}t        j                   |
j#                  d            }d}|d   }||v }|st	        j
                  d|fd||f      t	        j                  |      t	        j                  |      d
z  }t	        j                  d      dz   d|iz  }	t        t	        j                  |	            dx}x}}y) ui   artifact 부재 시 push_attempt=True, status/statuses에 마커 설정, canonical index에도 기록됨.ztask-2779-test-absentr   r    Tr#   r)   r,   r-   r/   r0   u5   artifact 부재 시 push_attempt는 True여야 한다r3   r4   Nstatus$PUSH_ATTEMPT_WITHOUT_TERMINAL_MARKERrE   z%(py1)s == %(py4)su;   status가 PUSH_ATTEMPT_WITHOUT_TERMINAL_MARKER여야 한다r5   r6   )z%(py1)s in %(py4)suD   statuses에 PUSH_ATTEMPT_WITHOUT_TERMINAL_MARKER가 있어야 한다r@   u0   canonical index 파일이 생성되어야 한다rA   rB   rC   r&   r'   u6   canonical index에도 마커가 기록되어야 한다)rJ   rL   rM   rN   rO   rP   rQ   rR   rS   rT   r   rX   rU   rV   rW   rY   rZ   r[   )r\   rD   r   r    r^   r_   r`   ra   rb   rc   rB   rd   rg   s                rh   1test_terminal_artifact_absent_push_attempt_markerro   c   s*   %G;&I*$HNN4N __9~(m  F .!bTb!T)bbb!Tbbb!bbbTbbb+bbbbbbbb( FE FEE F4E4EFE F F<EI  F F<EI  F F F4E4EEF F F2E2EF F1 OVJ5G O15GG O=N=NO15G O OENY 2 O OENY 6H O O=N=NNO O O;N;NO O !88gYe;LLN  V "V"VV$VVVVVVV>VVV>VVV VVV"VVVVVV::n...@AD1 AT*5E A15EE A/@/@A15E A A7@y 2 A A7@y 6F A A/@/@@A A A-@-@A A Arj   c                   d}| dz  }| dz  }|j                  d       t        j                  |t        |      t        |      d      }|d   }d	}||u }|st	        j
                  d
|fd||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d      dz   d|iz  }	t        t	        j                  |	            dx}x}}|d   }d}||k(  }|st	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d      dz   d|iz  }	t        t	        j                  |	            dx}x}}y)uX   artifact 부재 시에도 warn mode에서 blocked=False, exit_code=0 (비차단) 보장.ztask-2779-test-warnr   r    Tr#   warn)r*   r+   modeblockedFr-   r/   r0   u4   warn mode에서 blocked는 항상 False여야 한다r3   r4   N	exit_coder   rE   rn   u5   warn mode에서 exit_code는 항상 0이어야 한다
rJ   rL   rM   rN   rO   rP   rQ   rR   rS   rT   )
r\   rD   r   r    r^   r_   r`   ra   rb   rc   s
             rh   %test_warn_mode_non_blocking_exit_zerorv      s   #G;&I*$HNN4N __9~(m	  F )]]%]]]]]]]]]]]]']]]]]]]]+\!\!#\\\!\\\\\\!\\\%\\\\\\\\rj   c                t   d}| dz  }| dz  }|j                  d       d }|j                  t        d|       t        j                  |t	        |      t	        |            }|d	   }d}||u }	|	st        j                  d
|	fd||f      t        j                  |      t        j                  |      dz  }
t        j                  d      dz   d|
iz  }t        t        j                  |            dx}x}	}|d   }d}||k(  }	|	st        j                  d|	fd||f      t        j                  |      t        j                  |      dz  }
t        j                  d      dz   d|
iz  }t        t        j                  |            dx}x}	}|d   }d}||u }	|	st        j                  d
|	fd||f      t        j                  |      t        j                  |      dz  }
t        j                  d      dz   d|
iz  }t        t        j                  |            dx}x}	}|d   }d}||k(  }	|	st        j                  d|	fd||f      t        j                  |      t        j                  |      dz  }
t        j                  d      dz   d|
iz  }t        t        j                  |            dx}x}	}y)um   build_manifest에 예외 주입 시 fail-open: GUARD_INTERNAL_ERROR_FAIL_OPEN, 크래시 없음, exit_code=0.ztask-2779-test-errorr   r    Tr#   c                     t        d      )Nu   강제 내부 오류 주입)RuntimeError)argskwargss     rh   _raisez-test_internal_error_fail_open.<locals>._raise   s    899rj   r   r)   failed_openr-   r/   r0   u/   내부 오류 시 failed_open=True여야 한다r3   r4   Nrl   GUARD_INTERNAL_ERROR_FAIL_OPENrE   rn   uJ   내부 오류 시 status가 GUARD_INTERNAL_ERROR_FAIL_OPEN이어야 한다rs   Fu5   내부 오류 시에도 blocked는 False여야 한다rt   r   u6   내부 오류 시에도 exit_code는 0이어야 한다)rJ   setattrrL   rM   rN   rO   rP   rQ   rR   rS   rT   )r\   monkeypatchrD   r   r    r|   r^   r_   r`   ra   rb   rc   s               rh   test_internal_error_fail_openr      s!   $G;&I*$HNN4N : /8__9~(m  F - [D[ D([[[ D[[[ [[[D[[[*[[[[[[[[( U? U?? UCTCTU? U UKT9  U UKT9  @ U UCTCTTU U UATATU U)^^%^^^^^^^^^^^^'^^^^^^^^+]!]!#]]]!]]]]]]!]]]%]]]]]]]]rj   c                   d}| dz  }| dz  }|j                  d       t        j                  |t        |      t        |      d      }|d   }d}||u }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d      dz   d|iz  }	t        t	        j                  |	            dx}x}}|d   }d}||k(  }|st	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d      dz   d|iz  }	t        t	        j                  |	            dx}x}}t        j                  |dz   t        |      t        |      d      }
|
d   }d}||u }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d      dz   d|iz  }	t        t	        j                  |	            dx}x}}|
d   }d}||k(  }|st	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d      dz   d|iz  }	t        t	        j                  |	            dx}x}}y)u   traversal 경로(../../../../etc/passwd) 및 절대경로는 containment helper가 거부, push_attempt=True (부재 취급), crash 없음.ztask-2779-test-traversalr   r    Tr#   z../../../../etc/passwd)r*   r+   
report_relr,   r-   r/   r0   uQ   traversal 경로는 거부되어 부재 취급(push_attempt=True)이어야 한다r3   r4   Nrl   rm   rE   rn   uW   traversal 경로 거부 시 status가 PUSH_ATTEMPT_WITHOUT_TERMINAL_MARKER여야 한다z-absz/etc/passwduM   절대경로는 거부되어 부재 취급(push_attempt=True)이어야 한다uS   절대경로 거부 시 status가 PUSH_ATTEMPT_WITHOUT_TERMINAL_MARKER여야 한다ru   )r\   rD   r   r    result_traversalr_   r`   ra   rb   rc   
result_abss              rh   /test_malicious_rel_path_rejected_by_containmentr      s   (G;&I*$HNN4N  9~(m+	 '  N+ \t \+t3 \J[J[\+t \ \R[R[ , \ \R[R[ 04 \ \J[J[[\ \ \H[H[\ \H% b)O b%)OO bPaPab%)O b bXaXa & b bXaXa *P b bPaPaab b bNaNab b &9~(m 	 ! J n% X X%- XFWFWX% X XNWi & X XNWi *. X XFWFWWX X XDWDWX Xh ^#I ^#II ^L]L]^#I ^ ^T]T]   ^ ^T]T] $J ^ ^L]L]]^ ^ ^J]J]^ ^ ^rj   c                .   ddl t               fd}t        | j                        r || j                         j                  |       D ]B  }t        |j                  j                  j                  f      s1 ||j                         D S )u   AST tree에서 docstring에 해당하는 Constant 노드를 수집하여 id set으로 반환.

    모듈/함수/클래스 정의 body의 첫 번째 Expr>Constant(str)는 docstring으로 취급.
    r   Nc                   | sy | d   }t        |j                        rkt        |j                  j                        rJt        |j                  j                  t              r%j                  t        |j                               y y y y )Nr   )
isinstanceExprvalueConstantrN   addid)bodyfirst_astdocstring_idss     rh   _collectz&_get_docstring_nodes.<locals>._collect   si    QeTYY'Ju{{DMM,Ru{{00#6bo. 7 -S'rj   )	astsetr   Moduler   walkFunctionDefAsyncFunctionDefClassDef)treer   noder   r   s      @@rh   _get_docstring_nodesr      s|    
 !eM/ $$		$  dT--t/D/DdmmTUTYY  rj   c                 	   ddl } 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}}| j                  |      }t        |      }g }| j                  |      D ]]  }	t        |	| j                         st        |	j"                  t$              s5t'        |	      |vsC|j)                  |	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      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}} t+        j,                  d      }|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}x}} y)u   scripts/pre_push_terminal_guard.py 소스에 ANU key, self/chat key, raw key 의심 리터럴이 없음 (docstring 언급 허용, 실제 코드 상수만 검증).r   Nr&   r'   c119085addb0f8b7not inz%(py1)s not in %(py3)ssrcrH   u3   ANU key 리터럴이 소스에 있으면 안 된다r<   r   fedf78d1d09509f5u9   self/chat key 리터럴이 소스에 있으면 안 된다cokacdirlitu=   코드 문자열 상수에 cokacdir가 있으면 안 된다: )z--key)z%(py0)s not in %(py3)sr9   uE   코드 문자열 상수에 --key 직접 값이 있으면 안 된다: z^[0-9a-fA-F]{16,}$uV   코드 문자열 상수에 raw key 의심 16진수 리터럴이 있으면 안 된다: zM
>assert not %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.match
}(%(py3)s)
}raw_key_pattern)r:   r   r;   r   )r   _guard_pathr[   rO   rP   rQ   rU   rV   rW   rR   rS   rT   parser   r   r   r   r   rN   r   appendrecompilematch)r   r   r_   ra   re   rf   r   r   code_string_literalsr   r   rd   r   @py_assert4@py_assert6rc   s                   rh   "test_no_self_key_no_raw_key_staticr      s#   




1C _S(___S_________S___S____*_______eS(eeeSeeeeeeeeeSeeeSeeee*eeeeeee ::c?D(.M&(		$ 8dDMM*z$**c/J$x},$++DJJ78 $ \ 	Tz$ 	TBSBS	Tz 	T 	TJS)  	T 	TMSV	T 	T;S;S "% 	T 	TJS) "% 	T 	TBSBSKC7S	T 	T 	T@S@S	T 	T$ 	\s*$ 	\J[J[	\s* 	\ 	\U[U[	\ 	\C[C[  	\ 	\R[R[  	\ 	\R[R[ % 	\ 	\J[J[STWSZ[	\ 	\ 	\H[H[	\ 	\\ jj!67O# m"(( 	m(- 	m-- 	m- 	m[l[ldehdkl	m 	mflfl	m 	mTlTl # 	m 	mclcl # 	m 	mclcl ) 	m 	mflfl	m 	mTlTl *- 	m 	mclcl *- 	m 	mclcl . 	m 	m 	mYlYl	m 	m 	mmrj   c                    ddl } t        j                  d      }| j                  |      }g }| j	                  |      D ]  }t        || j                        r-|j                  D ]  }|j                  |j                          Ft        || j                        s]|j                  sj|j                  |j                          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 ]l  }t        || j*                        st        |j,                  | j.                        s;|j,                  j0                  dk(  sUt'        d|j2                   d       | j	                  |      D ]n  }t        || j*                        st        |j,                  | j.                        s;|j,                  j0                  dk(  sU|j2                  dk(  set'        d       t5        |      }
| j	                  |      D ]-  }t        || j6                        st        |j,                  t8              s6t1        |      |
vsDd}|j,                  }||v}|st        j                  d|fd||f      t        j                  |      dt        j                          v st        j"                  |      rt        j                  |      ndt        j                  |      dz  }	t        j$                  d|j,                        dz   d|	iz  }t'        t        j(                  |            dx}x}}0 y)u   scripts/pre_push_terminal_guard.py 소스에 subprocess import, os.system, subprocess. 호출이 없음 (docstring 금지어 언급은 허용, 실제 import/호출 AST 노드만 검증).r   Nr&   r'   
subprocessr   r   imported_namesrH   u/   subprocess가 import되어 있으면 안 된다r<   r   zsubprocess.u)    호출이 코드에 있으면 안 된다ossystemu2   os.system 호출이 코드에 있으면 안 된다z.git/hooks/pre-push)z1%(py1)s not in %(py5)s
{%(py5)s = %(py3)s.value
}r   )r1   r;   r   u>   코드 상수에 .git/hooks/pre-push가 있으면 안 된다: z
>assert %(py7)sr   )r   r   r[   r   r   r   Importnamesr   name
ImportFrommodulerO   rP   rQ   rU   rV   rW   rR   rS   rT   	Attributer   Namer   attrr   r   rN   )r   r   r   r   r   aliasr_   ra   re   rf   r   r   @py_format8s                rh   (test_no_real_hook_install_no_push_staticr     sE   




1C ::c?D "N		$ 3dDKK( 2%%ejj12doo.{{%%dkk23  :<~- :(9(9:<~ : :09	  : :396: :!9!9  . : :09	  . : :(9(99: : :&9&9: : 		$ dDNN+$**dii0TZZ]]l5R$!$)),UV  		$ [dDNN+4::tyy1

-		X-$%YZZ[ ).M		$ ddDMM*z$**c/J$x},, dDJJ d,J> dRcRcd,J d dZcZc - d d]c]cd dKcKc 59 d dZcZc 59 d dZcZc 5? d dRcRcTUYU_U_Tbcd d dPcPcd d ddrj   c                b   d}| dz  }| dz  }|dz  dz  }|j                  d       || dz  j                  d	d
       t        |t        |      t        |            }|j                  }|t
        k(  }|st        j                  d|fd|t
        f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t
              rt        j                  t
              nddz  }t        j                  d      dz   d|iz  }	t        t        j                  |	            dx}}t        |t        |            }
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}}|t         z  | dz  }|j"                  } |       }|st        j                  d       d!z   d"t        j                         v st        j                  |      rt        j                  |      nd"t        j                  |      t        j                  |      dz  }t        t        j                  |            dx}}t%        j&                  |j)                  d
            }|d#   }||k(  }|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  }t        t        j                  |            dx}}|d'   }t
        |v }|st        j                  d(|fd)t
        |f      dt        j                         v st        j                  t
              rt        j                  t
              ndt        j                  |      dz  }d&d|iz  }t        t        j                  |            dx}}|j*                  }t,        |v }|st        j                  d(|fd*t,        |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                  |      dz  }t        j                  d,      dz   d|iz  }	t        t        j                  |	            dx}}y)-u   dispatch.terminal_artifact_index build_manifest/surface_manifest가 여전히 정상 동작하는지 스모크 검증 (2778 무회귀).ztask-2778-smoker   r    r!   r"   Tr#   r%   z# smoke test report
r&   r'   r)   rE   )z.%(py2)s
{%(py2)s = %(py0)s.status
} == %(py4)smanifestr   rC   uH   worktree에 report 있을 때 STATUS_WORKTREE_LOCAL_PRESENT여야 한다r3   r4   N)r*   r   r>   )z%(py0)s != %(py3)s
index_pathr9   uF   surface_manifest는 비어 있지 않은 경로를 반환해야 한다r<   r   r@   u<   surface 후 canonical index 파일이 생성되어야 한다rA   expectedrD   rG   rH   rI   r5   r6   r8   )z0%(py0)s in %(py4)s
{%(py4)s = %(py2)s.statuses
}r   u`   surface_manifest 후 manifest.statuses에 STATUS_SURFACED_TO_CANONICAL이 추가되어야 한다)rJ   rK   r   rN   rl   r   rO   rP   rU   rV   rW   rQ   rR   rS   rT   r   r   rX   rY   rZ   r[   r5   r   )r\   rD   r   r    r]   r   rd   r`   rb   rc   r   ra   re   rf   r   rg   r_   s                    rh   $test_existing_2778_regression_intactr   E  sB   G;&I*$H H$y0JT"WIS/!--.EPW-X 9~(mH
 ?? S?;; SARARS?; S SLRFS S:R:R  S SIR  S SIR  S SLRFS S:R:R < S SIR < S SARARRS S S?R?RS S "(3y>JJe:eee:eeeeee:eee:eeeeeeeeeeeee22y5FFH??\?\\\\\\\\\\8\\\8\\\?\\\\\\\\\::h(('(:;D	?%?g%%%%?g%%%?%%%%%%g%%%g%%%%%%%,0,<<(,<<<<<(,<<<<<<<(<<<(<<<,<<<<<<<<+3+<+< k'+<< kYjYjk'+< k kdjdjk kRjRj ( k kajaj ( k kdjdjk kRjRj ,4 k kajaj ,4 k kajaj ,= k kYjYjjk k kWjWjk krj   )returnr   )O__doc__
__future__r   builtinsrU   _pytest.assertion.rewrite	assertionrewriterO   importlib.utilutil_ilurY   r   syspathlibr   r   resolver$   _ROOTrN   pathinsert
_real_initmodulesget_cachedgetattrlist
startswith_kspec_from_file_locationr   rd   r   r`   r_   loader@py_assert10@py_assert13@py_assert12rP   rV   rW   rQ   rf   r   r   @py_format15@py_format17_format_boolop@py_format18@py_format20rS   rT   module_from_spec_pkgexec_moduler   r   rL    dispatch.terminal_artifact_indexr   r   r   r   r   r   r   ri   ro   rv   r   r   r   r   r   r   )ks   0rh   <module>r      so   #      	 
  	X ((+u:SXXHHOOAs5z" Z-/

++//*
%
?ww
B7=2#j/Qs{{+\QqJ!,,{B[q\ KKO(D((JC
@R<S;TE :9599T9T!9999599999599959999999999T9999999999999T9999999999999 4  'D"CKK
	LLT" i">>	%	%	%&?	M 7T 7vT 7fmm 74 7m47 7 7 7vT 7 7 7 7 7v 7 7 7v 7 7 7T 7 7 7 7 7 7 7m4 7 7 7 7 7f 7 7 7f 7 7 7m 7 74 7 7 7 7 7 7 7 7 7 7 7 7 7f%   %    =FA<]*^8^J4mH*d`kK	 ]s   S4S