
    Pj8                       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ZddlmZmZ ddlmZ ddlmZ ddlZ ee      j-                         j.                  d   Z ee      ej4                  vr"ej4                  j7                  d ee             ddlmZmZmZ d	Z d
Z!dZ"dZ# ee      jH                  jH                  dz  Z%d'dZ&	 	 	 d(	 	 	 	 	 	 	 d)dZ'd*d+dZ(dZ)dZ*d,dZ+d-dZ,d-dZ-ej\                  j_                  dg d      	 	 	 	 	 	 	 	 	 	 	 	 d.d       Z0d-dZ1d-dZ2d-dZ3d-dZ4d-dZ5d/dZ6d-dZ7d/d Z8d/d!Z9 ee      jH                  dz  d"z  Z:d/d#Z;	 	 	 	 d0d$Z<	 	 	 	 d0d%Z=	 	 	 	 d0d&Z>y)1uq  회귀 테스트 12건 — anu_v2.post_merge_smoke_runner (task-2539).

pytest 사용. 외부 부수효과(subprocess / file write / capabilities / clock)는
모두 fake callable로 주입.

⚠️ 테스트 코드 내 "ghp_faketoken123abc" 등 raw token placeholder는
   실제 토큰이 아닌 테스트 fake 값임 — leak detector 오탐 방지를 위해 명시.
    )annotationsN)datetimetimezone)Path)Callable   )DEFAULT_CHAT_ID"KIND_NAME_POST_MERGE_SMOKE_FAILUREPostMergeSmokeRunner(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(106e645b479b6fb1888256b0ef4a7b68ed8fad63(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbz	task-2539fixturesc            	     B    t        ddddddt        j                        S )u4   고정 시각 반환 — 테스트 결정론 보장.i     
             )tzinfo)r   r   utc     E/home/jay/workspace/anu_v2/tests/test_post_merge_smoke_runner_2539.py_fake_clockr   +   s    D!RRHLLAAr   c                4    t        j                  g | ||      S )N)args
returncodestdoutstderr)
subprocessCompletedProcess)r   r   r    s      r   _make_completed_processr#   0   s#    
 &&	 r   c                "     ddi fd}|S )uC   git rev-parse → smoke command 순서로 응답하는 fake runner.nr   c                h    dxx   dz  cc<   d| v rt        dt        dz   d      S t        d      S )Nr%      	rev-parser   
 zsmoke outputr#   FAKE_MAIN_SHA)r   _
call_countsmoke_returncodesmoke_stderrs     r   runnerz'_make_git_ok_then_smoke.<locals>.runnerA   s=    31$*1md.BBGG&'7VVr   r   )r/   r0   r1   r.   s   `` @r   _make_git_ok_then_smoker2   =   s    qJW Mr   task-2539+1ztask/task-2539+1c                    t         j                  j                  d      t        k(  ry	 t	        j
                  g dddt        t              d      } | j                  dk(  r0| j                  j                         }|j                  t              ry	 t        t        dd      }t!        |t              r	t        |v ryy	# t        t        j                  f$ r Y Gw xY w# t"        t$        t&        f$ r Y y	w xY w)
u>   task-2539+1 worktree/dispatch 컨텍스트 여부 (OR 매칭).TASK_IDT)gitr(   --abbrev-refHEADr   capture_outputtextcwdtimeoutr   nameNF)osenvironget_TASK_2539PLUS1_IDr!   runstrWORKSPACE_ROOTr   r   strip
startswith_TASK_2539PLUS1_BRANCH_PREFIXFileNotFoundErrorTimeoutExpiredgetattr
isinstanceOSError
ValueErrorAttributeError)branch_resultbranchr>   s      r   _is_task_2539plus1_scoperR   T   s    	zz~~i $66"8N#
 ##q("))//1F  !>?~vt4dC %74%?  z889  Z0 s$   A'B= )C =CCC32C3c                   t        t        d      d t        |       }|j                  t        t
        dg      }|d   }d}||k(  }|slt        j                  d|fd	||f      t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}|d   }d}||k(  }|slt        j                  d|fd	||f      t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}|d   }d}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}t        |d         }|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}	}|j#                  d      j%                         j'                         }
t)        |
      }d}||k(  }|st        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  }dd|iz  }t        t        j                  |            dx}x}}t+        j,                  |
d         }|d    }|t        k(  }|st        j                  d|fd!|t        f      t        j                  |      d"t        j                         v st        j                   t              rt        j                  t              nd"d#z  }d$d%|iz  }t        t        j                  |            dx}}|d&   }|t
        k(  }|st        j                  d|fd!|t
        f      t        j                  |      d't        j                         v st        j                   t
              rt        j                  t
              nd'd#z  }d$d%|iz  }t        t        j                  |            dx}}|d   }d(}||k(  }|slt        j                  d|fd	||f      t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            d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  }d$d%|iz  }t        t        j                  |            dx}}|d-   }d.}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}|d/   }d.}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}d0}||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  }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  }d$d%|iz  }t        t        j                  |            dx}}d1}||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  }t        t        j                  |            dx}}d2}||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  }t        t        j                  |            dx}}d3}||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  }t        t        j                  |            dx}}d4}||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  }t        t        j                  |            dx}}|d4   }d}||k(  }|slt        j                  d|fd	||f      t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}y)5uS   smoke exit_code=0 → outcome=PASS / .smoke-evidence 파일 생성 / format 일치.r   c                     y Nr   r-   s    r   <lambda>z0test_smoke_pass_creates_marker.<locals>.<lambda>v       r   subprocess_runnercapabilities_loaderclockworkspace_root!anu_v2/post_merge_smoke_runner.pytask_idmerge_commitexpected_filesoutcomePASS==z%(py1)s == %(py4)spy1py4assert %(py6)spy6N	exit_codecritical_seven_classificationisz%(py1)s is %(py4)ssmoke_evidence_marker_pathu&   smoke-evidence marker 파일이 없음C
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}marker_pathpy0py2rj   utf-8encodingr'   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenlinesrv   ri   py3rl   assert %(py8)spy8r`   z%(py1)s == %(py3)sFAKE_TASK_IDri   r   assert %(py5)spy5	merge_sha
FAKE_SHA40
probe_passtsinz%(py1)s in %(py3)srecordbuild_okTtest_okcommandduration_seconds	main_headra   expected_files_count)r   r2   r   run_post_merge_smoker   r   
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanationr   exists_format_assertmsg@py_builtinslocals_should_repr_global_name	read_textrF   
splitlinesr|   jsonloads)tmp_pathr1   result@py_assert0@py_assert3@py_assert2@py_format5@py_format7rt   @py_assert1r}   @py_assert5@py_assert4@py_format9r   @py_format4@py_format6s                    r   test_smoke_pass_creates_markerr   r   s   !1!4*	F ((;< ) F )&&&&&&&&&&&&&&&&&&&+#!#!####!######!#######12:d:2d::::2d:::2:::d::::::: v:;<KIIII!IIIIIII;III;IIIIIIIIIIII !!7!399;FFHEu::?:33uu: ZZa!F),,,,,,,,,,,,,,,,,,,,,,,,+,*,,,,*,,,,,,,,,*,,,*,,,,,,,),,,,,,,,,,,,,,,,,,,46>46466*%%%%%%%%%%%%%%%%%%%)$$$$$$$$$$$$$$$$$$$999 ;&    ;&   ;      &   &       '''''''''''''''''''''''' ;&    ;&   ;      &   &       #>V####>V###>######V###V#######!+!V++++!V+++!++++++V+++V+++++++().Q.)Q....)Q...)...Q.......r   c                   t        t        dd      d t        |       }|j                  t        t
        dg      }|d   }d}||k(  }|slt        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d   }d}||k(  }|slt        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d   }d}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}dddddd}|j                  t        t
        |      }	|	d   }d}||k(  }|slt        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|	d   }|t        k(  }|st        j                  d	|fd|t        f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }
dd|
iz  }t        t        j                  |            dx}}|	d    }d!}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}| d"z  d#z  }|t         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}x}}y))uX   smoke exit_code=1 → outcome=FAIL / critical_seven_classification=7 / marker 미생성.r'   zAssertionError: test failedc                     y rU   r   rV   s    r   rW   z;test_smoke_fail_classifies_critical_seven.<locals>.<lambda>   rX   r   rY   r^   r_   rc   FAILre   rg   rh   rk   rl   Nrn      rr   ro   rq   python3 -m pytest tests/smoker*   g      ?r   rm   r   r    r   r`   ra   execution_resultcritical_seven_kind	kind_namer   r
   r   r   r   report_to_chairman_requiredTmemoryevents.smoke-evidenceu'   FAIL 시 marker가 생성되면 안 됨G
>assert not %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}markerru   )r   r2   r   r   r   r   r   r   r   r   r   (classify_smoke_failure_as_critical_sevenr
   r   r   r   r   r   )r   r1   r   r   r   r   r   r   exec_resultcriticalr   r   
events_dirr   r   r   s                   r   )test_smoke_fail_classifies_critical_sevenr      s   !1!5RS*	F ((;< ) F )&&&&&&&&&&&&&&&&&&&127a72a77772a7772777a7777777./747/47777/4777/77747777777 3/K >>$ ? H
 )*/a/*a////*a///*///a///////K F $FFFFF $FFFF FFFFFF$FFFF$FFFFFFFF12:d:2d::::2d:::2:::d::::::: H$x/J\N/::F}}I}IIII IIIIIIIvIIIvIII}IIIIIIIIIr   z4smoke_command, caps_command, smoke_profile, expected))explicit-cmd	from-caps
profile.pyr   )Nr   r   r   )NNztests/smoke/custom.pyz'python3 -m pytest tests/smoke/custom.py)NNNz4python3 -m pytest tests/smoke/test_smoke_baseline.pyc                   
 |rd|ind
t        t        d      
fdt        |       }|j                  t        ||      }||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  }dd|iz  }	t        t        j                  |	            d}y)u7   _resolve_smoke_command 4 케이스 우선순위 검증.smoke_commandNr   c                    S rU   r   )r-   capss    r   rW   z/test_resolve_command_priority.<locals>.<lambda>   s    d r   rY   re   )z%(py0)s == %(py2)sresolvedexpectedrv   rw   zassert %(py4)srj   )r   r2   r   _resolve_smoke_commandr   r   r   r   r   r   r   r   r   )r   r   caps_commandsmoke_profiler   r1   r   r   @py_format3r   r   s             @r   test_resolve_command_priorityr      s    * /;O\*D!1!4*	F ,,\=-XHx8x88xxr   c                   t        t        d      d t        |       }|j                  t        t
        g       }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}}t        t        d      d t        |       }|j                  t        t
        g       }	|	d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}}t        |d         }
|
j                  d      j                         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}}t)        j*                  |d         }t)        j*                  |d         }|d   }|d   }||k(  }|t        k(  }|r|st        j                  d||fd||t        f      t        j                  |      t        j                  |      dt!        j"                         v st        j$                  t              rt        j                  t              nddz  }d d|iz  }t        t        j                  |            dx}x}x}}y)!u@   동일 task_id 2회 실행 → marker에 2 line. 덮어쓰기 X.r   c                     y rU   r   rV   s    r   rW   z/test_idempotent_marker_append.<locals>.<lambda>   rX   r   rY   r_   rc   rd   re   rg   rh   rk   rl   Nc                     y rU   r   rV   s    r   rW   z/test_idempotent_marker_append.<locals>.<lambda>  rX   r   rr   rx   ry   r   r{   r|   r}   r~   u#   marker에 2 line이어야 함 (got )
>assert %(py8)sr   r'   r`   )rf   rf   )z%(py1)s == %(py5)sz%(py5)s == %(py6)sr   )ri   r   rl   r   )r   r2   r   r   r   r   r   r   r   r   r   r   r   rF   r   r|   r   r   r   r   r   r   )r   r1   r1r   r   r   r   r   runner2r2rt   r}   r   r   r   rec1rec2s                    r   test_idempotent_marker_appendr      s   !1!4*	F 
	$	$ 
% 
B
 i="F"=F""""=F"""="""F""""""" #1!4*	G 
	%	% 
& 
B
 i="F"=F""""=F"""="""F"""""""r678K!!7!399;FFHEu:OO:?OOO:OOOOOO3OOO3OOOOOOuOOOuOOO:OOOOOOA#e*QOOOOOOOO::eAhD::eAhD	?=d9o=?o==o=====?o===?===o=================r   c                    t        t        d      d t        |       }t        j                  t
        d      5  |j                  t        t        g d       ddd       y# 1 sw Y   yxY w)	uW   chat_id=999 입력 → AssertionError (chat_id != 6937032012 cross-chat 누출 차단).r   c                     y rU   r   rV   s    r   rW   z/test_chat_isolation_assertion.<locals>.<lambda>   rX   r   rY   zchat_id != 6937032012)matchi  )r`   ra   rb   chat_idN)	r   r2   r   pytestraisesr   r   r   r   )r   r1   s     r   test_chat_isolation_assertionr     sb    !1!4*	F 
~-D	E 
## #	 	$ 	

 
 
s   A  A)c                   dddifd}t        |d t        |       }|j                  t        t        g       }|d   }d	}||k(  }|slt        j                  d
|fd||f      t        j                  |      t        j                  |      dz  }d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}}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}}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}}ddddd }	|j                  t        t        |	!      }
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}}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)$u   fake stderr에 raw token 포함 → marker / Critical 7종 본문 모두 ***MASKED*** 처리.

    ⚠️ 아래 "ghp_faketoken123abc"는 테스트 fake 값 (실제 토큰 아님).
    z1GH_TOKEN=ghp_faketoken123abc x-api-key: secretkeyr%   r   c                h    dxx   dz  cc<   d| v rt        dt        dz   d      S t        dd      S )Nr%   r'   r(   r   r)   r*   r+   )r   r-   r.   fake_stderrs     r   runner_with_token_stderrz5test_token_raw_zero.<locals>.runner_with_token_stderr;  s<    31$*1md.BBGG&q"k::r   c                     y rU   r   rV   s    r   rW   z%test_token_raw_zero.<locals>.<lambda>D  rX   r   rY   r_   rc   r   re   rg   rh   rk   rl   Nghp_faketoken123abcstderr_summary)not in)z%(py1)s not in %(py4)su"   stderr_summary에 raw token 노출
>assert %(py6)s	secretkeyu#   stderr_summary에 raw secret 노출z***MASKED***r   )z%(py1)s in %(py4)su   마스킹 처리되어야 함r   r'   r*   g      ?r   r   u0   Critical 7종 stderr_summary에 raw token 노출u1   Critical 7종 stderr_summary에 raw secret 노출)r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r1   r   r   r   r   r   r   r   r   r.   r   s              @@r   test_token_raw_zeror   0  sg    FKqJ; "2*	F (( ) F )&&&&&&&&&&&&&&&&&&&  /?(@  (@@   (@    !    )A    	-      f%56 ;66  ;6        7    	.     VV$45V>55VVV>5VVV>VVV5VVV7VVVVVVVV 3K >>$ ? H
 ! 1A(B  (BB   (B    !    )C    	;      h'78 ;88  ;8        9    	<     r   c                f   t        t        d      d t        |       }t        j                  |j
                        }|j                  D cg c])  }d|j                         v sd|j                         v s(|+ }}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|       dz   d|	iz  }
t!        t        j"                  |
            dx}x}}t        t        d      d t        |       }|j                  t$        t&        g       }|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(        d!fd	}|j+                  d|       |j                  t$        t&        g       }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }	t!        t        j"                  |	            dx}x}}|d   }d}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }	t!        t        j"                  |	            dx}x}}|d    }d}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }	t!        t        j"                  |	            dx}x}}yc c}w )"uN  md/report fallback 금지 + OSError 시 EVIDENCE_INCOMPLETE 반환.

    qc-result md에 "smoke PASS" 텍스트가 있어도 run_post_merge_smoke는
    md를 참조하지 않음 — 시그니처에 md 관련 파라미터 0건 검증.
    marker dir read-only 시뮬(monkeypatch open → OSError) → outcome=EVIDENCE_INCOMPLETE.
    r   c                     y rU   r   rV   s    r   rW   z3test_md_report_fallback_forbidden.<locals>.<lambda>y  rX   r   rY   mdreportre   r{   r|   	md_paramsr~   u)   md/report 관련 파라미터가 있음: r   r   Nr'   c                     y rU   r   rV   s    r   rW   z3test_md_report_fallback_forbidden.<locals>.<lambda>  rX   r   r_   rc   r   rg   rh   u8   exit_code=1일 때 md 텍스트 무관 FAIL이어야 함r   rl   c                T    t        |       }d|v rd|v rt        d       | |fi |S )Nr   azread-only filesystem simulation)rD   rM   )pathmodekwargspath_stroriginal_opens       r   mock_open_oserrorz<test_md_report_fallback_forbidden.<locals>.mock_open_oserror  s8    t9(SD[;<<T42622r   zbuiltins.openEVIDENCE_INCOMPLETErk   rr   ro   rq   rn   )r)r   r2   r   inspect	signaturer   
parameterslowerr|   r   r   r   r   r   r   r   r   r   r   r   opensetattr)r   monkeypatchr1   sigpr   r   r   r   r   r   fail_runnerresult_failr   r   r   r   result_incompleter   s                     @r   !test_md_report_fallback_forbiddenr  p  s    "1!4*	F 

F77
8CNNYqdaggi.?8qwwyCXYIYy>WQW>QWWW>QWWWWWW3WWW3WWWWWWyWWWyWWW>WWWQWWW"KI; WWWWWWWW '1!4*	K 22 3 K
 y! V !V+  !V    "    &,    	C    
 M3 ):;33 4 
 Y'@+@@'+@@@@@'+@@@@'@@@+@@@@@@@@9:BdB:dBBBB:dBBB:BBBdBBBBBBB<=EE=EEEE=EEE=EEEEEEEEEEK Zs   )P.6P.c                   d }t        |d t        |       }|j                  t        t        g       }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}}|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}}|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}}|d   }d}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}}| dz  dz  }	|	t         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}x}}y)uV   TimeoutExpired raise → outcome=FAIL / exit_code=124 / critical=7 / marker 미생성.c                `    d| v rt        dt        dz   d      S t        j                  | d      )Nr(   r   r)   r*   i,  )cmdr=   )r#   r,   r!   rJ   r   r-   s     r   timeout_runnerz>test_timeout_classifies_critical_seven.<locals>.timeout_runner  s1    $*1md.BBGG''D#>>r   c                     y rU   r   rV   s    r   rW   z8test_timeout_classifies_critical_seven.<locals>.<lambda>  rX   r   rY   r_   rc   r   re   rg   rh   rk   rl   Nrm   |   rn   r   rr   ro   rq   r   r   r   u*   timeout 시 marker가 생성되면 안 됨r   r   ru   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r  r1   r   r   r   r   r   r   r   r   r   r   r   s                 r   &test_timeout_classifies_critical_sevenr    s   ?
 "(*	F (( ) F )&&&&&&&&&&&&&&&&&&&+%#%#%%%%#%%%%%%#%%%%%%%127a72a77772a7772777a7777777./747/47777/4777/77747777777 H$x/J\N/::F}}L}LLLL LLLLLLLvLLLvLLL}LLLLLLLLLr   c                 J   t        j                  t        j                        } t	        | 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}}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}}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  }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  }d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  }dd|iz  }t        t        j                  |            d	x}}t        j                  t        j                         }t	        |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}}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                  t        j"                        }t	        |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  }d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  }d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  }d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  }dd|iz  }t        t        j                  |            d	x}}d}t$        |k(  }
|
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}
}d}t&        |k(  }
|
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   run_post_merge_smoke / classify_smoke_failure_as_critical_seven 시그니처 보존.

    task-2540 critical_escalation_reporter / task-2541 self-resume이 import 가능 형태.
    r`   r   r   
params_runr   u   task_id 파라미터 없음
>assert %(py5)sr   Nra   u    merge_commit 파라미터 없음rb   u"   expected_files 파라미터 없음r   r   r   r   params_classifyr   u$   execution_result 파라미터 없음rZ   params_initr[   r\   r]   l   L5: re   )z%(py0)s == %(py3)sr	   )rv   r   POST_MERGE_SMOKE_FAILUREr
   )r  r  r   r   setr  keysr   r   r   r   r   r   r   r   r   r   __init__r	   r
   )sig_runr  r   r   r   r   sig_classifyr  sig_initr  r   s              r   test_interface_contractr$    s4     4 I IJGW'',,./JA9
"AAA9
AAA9AAAAAA
AAA
AAAA$AAAAAAAK>Z'KKK>ZKKK>KKKKKKZKKKZKKKK)KKKKKKKOz)OOOzOOOOOOOOOzOOOzOOOO+OOOOOOO (?j((((?j(((?((((((j(((j((((((((?j((((?j(((?((((((j(((j((((((("9
""""9
"""9""""""
"""
""""""" $$%9%b%bcL,116689OF9'FFF9FFF9FFFFFFFFFFFFF)FFFFFFFP>_,PPP>_PPP>PPPPPP_PPP_PPPP.PPPPPPPX0XXXXXXXXXXXXXXXXXXX2XXXXXXX   !5!>!>?Hh))..01K-+----+---------+---+------- / K//// K/// //////K///K///////!7k!!!!7k!!!7!!!!!!k!!!k!!!!!!!*{****{*********{***{******* )(?j((((?j((((((?(((?(((j((((((( 2LK-1KKKKK-1KKKKKKK-KKK-KKK1KKKKKKKKr   c                f   d}g d}t        t        d      d t        |       }|j                  |t        |      }|d   }d}||k(  }|st        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }t        j                  d|d          dz   d|iz  }	t        t        j                  |	            dx}x}}|d   }d}||k(  }|slt        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}|d   }d}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}t        |d         }
|
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}}|
j                   }||v }|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t        j                  |      dz  }t        j                  d|
j                          dz   d|iz  }	t        t        j                  |	            dx}}|
j#                  d      j%                         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&      d'z   d(|	iz  }t        t        j                  |            dx}x}}t+        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  }t        j                  d,|d)         d-z   d.|iz  }t        t        j                  |            dx}}|d   }d/}||k(  }|st        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }t        j                  d0|d         dz   d|iz  }	t        t        j                  |	            dx}x}}|d1   }t)        |      }||k(  }|st        j                  d	|fd2||f      t        j                  |      d#t        j                         v st        j                  t(              rt        j                  t(              nd#d3t        j                         v st        j                  |      rt        j                  |      nd3t        j                  |      d4z  }	t        j                  d5|d1          d'z   d(|	iz  }t        t        j                  |            dx}x}}y)6u   task-2539+1 자기참조 smoke — marker 생성 + task_id / outcome 확인.

    본 모듈이 자기 자신(task-2539+1) 머지 후 호출되어
    task-2539+1.smoke-evidence 박제 가능 여부를 검증한다 (post-merge phase 자기참조).
    r3   )r^   1anu_v2/tests/test_post_merge_smoke_runner_2539.py4anu_v2/fixtures/post_merge_smoke_pass_task_2524.json<anu_v2/fixtures/post_merge_smoke_warn_to_pass_task_2537.jsonr   c                     y rU   r   rV   s    r   rW   zAtest_self_invoke_smoke_evidence_for_task_2539p1.<locals>.<lambda>	  rX   r   rY   r_   rc   rd   re   rg   rh   zexpected PASS, got r   rl   Nrm   rk   rn   ro   rq   rr   u2   task-2539+1.smoke-evidence marker 파일이 없음rs   rt   ru   r   )z,%(py0)s in %(py4)s
{%(py4)s = %(py2)s.name
}SELF_TASK_IDu'   marker 파일명에 task_id가 없음: rx   ry   r'   )>=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sr|   r}   r~   u(   marker에 최소 1 line이 있어야 함r   r   r`   r   r   zmarker task_id mismatch: r  r   r   zmarker outcome mismatch: r   )z0%(py1)s == %(py6)s
{%(py6)s = %(py3)s(%(py4)s)
}EXPECTED_FILES_2539P1)ri   r   rj   rl   zexpected_files_count mismatch: )r   r2   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r>   r   rF   r   r|   r   r   )r   r*  r,  r1   r   r   r   r   r   r   rt   r   r}   r   r   r   r   r   r   s                      r   /test_self_invoke_smoke_evidence_for_task_2539p1r-    s    !L "1!4*	F ((, ) F )QQ&QQQQQQQQQQQQ*=fY>O=P(QQQQQQQQ+#!#!####!######!#######12:d:2d::::2d:::2:::d::::::: v:;<KUUUU!UUUUUUU;UUU;UUUUUUUUUUUU '++ <++  <+                '    '    ,    2+2B2B1CD    
 !!7!399;FFHEu:FF:?FFF:FFFFFF3FFF3FFFFFFuFFFuFFF:FFFFFFFFFFFFFFZZa!F) ,            !-    !-    $F9$5#89     )  ,          !-    $F9$5#89     () S1F-G )-GG   )-G    *      .1    .1      2G    2G    .H    *&1G*H)IJ     r   c            	     b   t        t        dz  dz        } d}d| gddd| gfD ]p  }	 t        j                  |ddt        t              d	      }|j                  |j
                  z   j                         }|j                  d
k7  rd|v sd|v sd|v rd}p n |t        j                  d       |j                  |j
                  z   }|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|dd        dz   d|iz  }	t'        t        j(                  |	            dx}x}}|j                         }
d|
v }d|
v xr d|
v}g }| }|}|s|}|sdddt        j                         v st        j                   |      rt        j"                  |      ndiz  }|j+                  |       |sXddd t        j                         v st        j                   |      rt        j"                  |      nd iz  }|j+                  |       t        j,                  |d!      i z  }t        j$                  d"|dd        d#z   d$|iz  }t'        t        j(                  |            dx}x}}y# t        $ r d}Y t        j                  $ r t        j                  d       Y w xY w)%u   pyright로 post_merge_smoke_runner.py 정적 타입 검사 — 0 errors 어설션.

    pyright가 환경에 없으면 pytest.skip.
    anu_v2zpost_merge_smoke_runner.pyNpyrightpython3z-mT<   r9   r   zcommand not foundzno module namedznot recognizedzpyright timed outzpyright unavailablere   )z2%(py2)s
{%(py2)s = %(py0)s.returncode
} == %(py5)sr   )rv   rw   r   zpyright returncode=r)   i  z
>assert %(py7)spy7z0 errorserrorznot %(py2)srw   has_error_keywordz%(py5)sr   has_zero_errorsr'   zpyright reported errors:
r   r   )rD   rE   r!   rC   r   r    r  r   rI   rJ   r   skipr   r   r   r   r   r   r   r   r   append_format_boolop)runner_moduler   r  combinedcombined_outputr   r   r   r   @py_format8output_lowerr6  r5  r   r   r   r   s                    r   )test_pyright_zero_errors_on_runner_moduler?  4  s   
 14PPQM FM*Yi,WX -	-^^#'F 5<<>H  A%#x/$0#x/%-2 ~)* mmfmm3O  !                    !"    f//0?5D3I2JK    
 #((*L L0O< 	+l*       O      !    !    !     %4    %4       %_Ud%;$<=     - ! 	F(( 	-KK+,	-s   A+K55L.'L.-L.c                    t               st        j                  d       h d} 	 t        j                  g dddt        t              d      }j                  d	k7  rt        j                  d       |j                  j                         j                         D cg c]"  }|j                         r|j                         $ }}|D ]  }|| v }|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# t        $ r t        j                  d       Y t        j                  $ r t        j                  d       Y w xY wc c}w )uy  git diff origin/main..HEAD 변경 파일이 allowed_resources.paths 화이트리스트만 포함.

    task-2539 사고 재발 방지 gate: effective diff == expected_files (4개) + 메타파일.

    task-2561 scope-guard: task-2539+1 worktree/dispatch 컨텍스트가 아니면
    deterministic skip — mis-scoped baseline noise 0 (회장 §명시 2026-05-12 Track B).
    uf   out-of-scope: task-2539+1 worktree/dispatch 컨텍스트 아님 (task-2561 scope-guard, deterministic)>   memory/reports/task-2539+1.mdmemory/events/task-2539+1.doner^   $memory/capabilities/task-2539+1.jsonr&  r'  r(  )r6   diffz--name-onlyzorigin/main..HEADTr   r9   z!git unavailable or not a worktreezgit timed outr   r   )z%(py0)s in %(py2)sr   ALLOWED_PATHSr   z,FORBIDDEN_PATH or SCOPE_EXPANSION detected: z
>assert %(py4)srj   N)rR   r   r7  r!   rC   rD   rE   rI   rJ   r   r   rF   r   r   r   r   r   r   r   r   r   r   )rE  r   linechanged_filesr   r   r   r   s           r   %test_clean_origin_main_base_assertionrH  n  s    $%5	

M%?N#
 A78
 MM'')446::< 	

M   
}$ 	
 	
t} 	
 	
	6	
 	
   	
 	
 		  	
 	
	6	
 	
  % 	
 	
 		 % 	
 	
  ;4&A	
 	
 	
 	
 	

!  978$$ %O$%s   )F4 'H4H 'H ?H zbaseline_noise_repro_2561.jsonc                    t         j                  }  |        }|st        j                  dt                dz   dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      dz  }t        t        j                  |            dx} }t        j                  t         j                  d            }|d   }d	}||k(  }|slt        j                  d
|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d   }d}||k(  }|slt        j                  d
|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d   }d}||k(  }|slt        j                  d
|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d   d   }d}||k(  }|slt        j                  d
|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d   d   }d}||k(  }|slt        j                  d
|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d   d   }d}||k(  }|slt        j                  d
|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}t        |d         }t        |      }d}||k(  }	|	st        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  }d d!|iz  }
t        t        j                  |
            d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  }d&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  }d&d'|iz  }t        t        j                  |            dx}}|d)   D ci c]  }|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  }d&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  }d&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  }d&d'|iz  }t        t        j                  |            dx}}|d+   d/   }d0}||k(  }|slt        j                  d
|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d-   d/   }d1}||k(  }|slt        j                  d
|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d.   d/   }d2}||k(  }|slt        j                  d
|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}yc c}w )3u1   fixture 파일 존재 + 필수 키 구조 검증.u   baseline noise fixture 누락: rs   _BASELINE_NOISE_FIXTURE_2561ru   Nrx   ry   task_refz	task-2561re   rg   rh   rk   rl   trackBclassificationMIS_SCOPED_TESTsource_testfiler&  functionrH  introducing_taskr3   allowed_paths_hardcodedr   r{   r|   allowedr~   r   r   r^   r   r   r   r   r   rC  repro_casesr>   in_scope_clean_diffreproout_of_scope_arbitrary_branchin_scope_forbidden_pathexpected_outcomerd   SKIPr   )rJ  r   r   r   r   r   r   r   r   r   r   r   r   r   r  r|   )r   r   r   datar   r   r   rU  r   r   r   r   r   caserX  s                  r   8test_baseline_noise_fixture_2561_present_and_well_formedr_    s   '.. .0 0   **F)GH     (    (    /    1      ::2<<g<NOD
*{*{****{******{*******=C=C=C=C !6%66!%66666!%6666!666%66666666]F#>#>	? #>   	$   ?     
 	]J'+R'+RR '+R   	(   ,S      12CmC2mCCCC2mCCC2CCCmCCCCCCC$012Gw<1<1<133ww<1.9.'9999.'999.999999'999'99999991<1W<<<<1W<<<1<<<<<<W<<<W<<<<<<<,0,?@DT&\4@E@ ) E)))) E))) ))))))E)))E)))))))*3*e3333*e333*333333e333e3333333$-$----$---$----------------&'(:;EvE;vEEEE;vEEE;EEEvEEEEEEE012DEOOEOOOOEOOOEOOOOOOOOOO'();<@P<@PP <@P   	=   AQ       As   1g9c                   | j                  dd       d }| j                  t        d|       t        t	        t
        dd      xs dv rt        j                  d       t        j                  t        j                  j                        5 }t                d	d	d	       d
}j                  }t        |      }||v }|s
t        j                  d|fd||f      t        j                  |      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  }dd|iz  }t'        t        j(                  |            d	x}x}x}}y	# 1 sw Y   =xY w)u   out-of-scope (env / branch / worktree 셋 다 false) 면 deterministic skip.

    PR #110 / task-2550+1 같은 후속 브랜치에서 false failure 0 보장.
    r5   F)raisingc                d    d| v rd| v rt        ddd      S d| v rt        d      t        ddd      S )Nr(   r7   r   ztask/task-2561-dev2
r*   rD  uZ   out-of-scope 분기에서 git diff 가 호출되면 안 됨 (task-2561 scope-guard 위반))r#   r   r  s     r   fake_runzMtest_clean_origin_main_skipped_outside_task_2539plus1_scope.<locals>.fake_run  sK    $>T#9*1.ErJJT> 1  'q"b11r   rC   r>   r*   uT   WORKSPACE_ROOT name contains task-2539+1 — out-of-scope 시나리오 검증 불가Nzout-of-scoper   zK%(py1)s in %(py8)s
{%(py8)s = %(py3)s(%(py6)s
{%(py6)s = %(py4)s.value
})
}rD   	skip_infori   r   rj   rl   r   assert %(py10)spy10)delenvr  r!   rB   rK   rE   r   r7  r   	ExceptionrH  valuerD   r   r   r   r   r   r   r   r   )	r	  rc  re  r   r   @py_assert7r   r   @py_format11s	            r   ;test_clean_origin_main_skipped_outside_task_2539plus1_scopern    s0    y%02 
E84 gnfbAGRHb	
 
v{{,,	- 0-/011S11>11111>1111>111111S111S111111111111111111111110 0s   GGc                ~    | j                  dd       g dfd}| j                  t        d|       t                y)u   in-scope (TASK_ID=task-2539+1) + clean diff → 기존 보호 의도 정상 PASS.

    task-2539+1 fixture context 기존 검증 유지 확인.
    r5   r3   )r^   r&  rA  rB  rC  c                d    d| v rt        ddj                        dz   d      S t        ddd      S NrD  r   r)   r*   r#   join)r   r-   clean_diff_pathss     r   rc  zXtest_clean_origin_main_runs_under_task_2539plus1_scope_with_clean_diff.<locals>.fake_run   s8    T>*1dii8H.ID.PRTUU&q"b11r   rC   N)setenvr  r!   rH  )r	  rc  rt  s     @r   Ftest_clean_origin_main_runs_under_task_2539plus1_scope_with_clean_diffrv    s<     y-02
 
E84)+r   c                  	 | j                  dd       ddg		fd}| j                  t        d|       t        j                  t
              5 }t                ddd       d}j                  }t        |      }||v }|s
t        j                  d	|fd
||f      t        j                  |      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  }dd|iz  }t        t        j                  |            dx}x}x}}d}|j                  }t        |      }||v }|s
t        j                  d	|fd
||f      t        j                  |      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  }dd|iz  }t        t        j                  |            dx}x}x}}y# 1 sw Y   oxY w)uP   in-scope + forbidden path → AssertionError (task-2539+1 보호 의도 유지).r5   r3   r^   zanu_v2/executor_scheduler.pyc                d    d| v rt        ddj                        dz   d      S t        ddd      S rq  rr  )r   r-   forbidden_diff_pathss     r   rc  zHtest_clean_origin_main_in_scope_detects_forbidden_path.<locals>.fake_run  s>    T>*49912T92  'q"b11r   rC   Nz*FORBIDDEN_PATH or SCOPE_EXPANSION detectedr   rd  rD   exc_inforf  rg  rh  )ru  r  r!   r   r   r   rH  rk  rD   r   r   r   r   r   r   r   )
r	  rc  rz  r   r   rl  r   r   rm  ry  s
            @r   6test_clean_origin_main_in_scope_detects_forbidden_pathr{  
  s    y-0 	,&
2 
E84	~	& 0(-/07Nx~~N3~;NN7;NNNNN7;NNNN7NNNNNN3NNN3NNNNNNxNNNxNNN~NNN;NNNNNNNN)@@S-@@)-@@@@@)-@@@@)@@@@@@S@@@S@@@@@@@@@@@@@@@-@@@@@@@@0 0s   KK)returnr   )r   okr*   )r   intr   rD   r    rD   r|  zsubprocess.CompletedProcess)r   r*   )r/   r~  r0   rD   r|  z*Callable[..., subprocess.CompletedProcess])r|  bool)r   r   r|  None)r   r   r   
str | Noner   r  r   r  r   rD   r|  r  )r|  r  )r	  zpytest.MonkeyPatchr|  r  )?__doc__
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   r  r   r?   r!   sysr   r   pathlibr   typingr   r   __file__resolveparentsrE   rD   r   insertanu_v2.post_merge_smoke_runnerr	   r
   r   r   FAKE_MERGE_SHAr,   r   parentFIXTURE_DIRr   r#   r2   rB   rH   rR   r   r   markparametrizer   r   r   r   r  r  r$  r-  r?  rH  rJ  r_  rn  rv  r{  r   r   r   <module>r     s   #     	  
 '    h'')11!4~chh&HHOOAs>*+  
;8n##**Z7B 


 
 !	

& #  2 <)/^&JX :	      	 
   
  .%>V
(:@5FvMD&LX5v4t4
z 	NJ&)II 
@2#2	2@,#,	,6A#A	Ar   