
    Si(                       d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
Z
ddlmZ ddlZ ee      j                         j                   d   Zedz  Z ee      e
j(                  vr"e
j(                  j+                  d ee             ddlZddlZej4                  dd       Zej4                  dd       Zdd	Zdd
Zd Zd Z ddZ!ddZ"d Z#d Z$d Z%ddZ&ddZ'ddZ(d Z)ddZ*y)u   
test_lifecycle_guards.py — task-2468 P1 통합 테스트 14건 (A~N).

회장 명시: 14건 중 1건이라도 FAIL → ESCALATED.
task-2467+3 silent corruption 4대 결함이 본 task 코드로 차단됨을 증명.
    )annotationsN)Path   scriptsc                0    | dz  }|j                          |S )Neventsmkdirtmp_pathds     :/home/jay/workspace/tests/taskctl/test_lifecycle_guards.py
tmp_eventsr      s    8AGGIH    c                0    | dz  }|j                          |S )Nevidencer	   r   s     r   tmp_evidencer      s    :AGGIHr   c                   d}| | dz  j                  t        j                  |dgd      d       t        j                  ||       }|j
                  }d}||u }|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z   d|iz  }t        t        j                  |            d x}x}}g }d}|j                   }	||	v }|}
|s'd}|j                   }|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  }dd|iz  }|j%                  |       |st        j                  dfdf      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                        t        j                        t        j                  |      dz  }dd|iz  }|j%                  |       t        j&                  |d      i z  }dd|iz  }t        t        j                  |            d x}
x}x}x}x}	x}x}x}x}}d |j(                  D        }t+        |      }|sd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}}y )!Nztask-test-A.g3-failtest)task_idfail_reasonsutf-8encoding
events_dirFisz*%(py2)s
{%(py2)s = %(py0)s.ok
} is %(py5)srpy0py2py5zexpected FAIL but got 
>assert %(py7)spy7g3in)z.%(py3)s in %(py7)s
{%(py7)s = %(py5)s.reason
})py3r%   r'   z%(py9)spy9)zh%(py12)s in %(py20)s
{%(py20)s = %(py18)s
{%(py18)s = %(py16)s
{%(py16)s = %(py14)s.reason
}.lower
}()
})py12py14py16py18py20%(py22)spy22   assert %(py25)spy25c              3  T   K   | ]   }d t        |      v xs dt        |      v  " yw)r   z.g3_failN)str).0ps     r   	<genexpr>z-test_A_g3_fail_blocks_done.<locals>.<genexpr>-   s*     PzSV#;zSV';;Ps   &(z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}any)r#   r$   py4)
write_textjsondumpslgcheck_g3_fail_blocks_doneok
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgas_dictAssertionError_format_explanationreasonlowerappend_format_boolopblockingr<   )r   r   r!   @py_assert1@py_assert4@py_assert3@py_format6@py_format8@py_assert2@py_assert6@py_assert0@py_assert11@py_assert15@py_assert17@py_assert19@py_assert13@py_format10@py_format21@py_format23@py_format24@py_format26@py_format5s                         r   test_A_g3_fail_blocks_donerf   %   sQ   GWIX&&22

wABW 3  	$$WDA44@5@45=@@@45@@@@@@1@@@1@@@4@@@5@@@2199;-@@@@@@@@=:==:!=T=QXX=X^^=^-==T-=%=====:===:===================T-====T======Q===Q===X===^===-================PQZZPP3PPPPPPPPP3PPP3PPPPPPPPPPPPPPr   c                $   d}| | dz  j                  dd       | | dz  j                  dd       t        j                  ||       }|j                  }d}||u }|st	        j
                  d	|fd
||f      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}}g }d}|j                  }	|	j                  }
 |
       }||v }|}|sd}|j                  }||v }|}|st	        j
                  d|fd||f      t	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |	      t	        j                  |
      t	        j                  |      dz  }dd|iz  }|j                  |       |st	        j
                  dfdf      t	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dz  }dd|iz  }|j                  |       t	        j                  |d      i z  }dd|iz  }t        t	        j                  |            d x}x}x}x}x}	x}
x}x}x}}y )Nztask-test-Br   z{}r   r   z.doner   Fr   r    r!   r"   assert %(py7)sr'   conflictu   동시r)   zb%(py3)s in %(py11)s
{%(py11)s = %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s.reason
}.lower
}()
}r+   r%   r'   r,   py11%(py13)spy13z2%(py16)s in %(py20)s
{%(py20)s = %(py18)s.reason
}r/   r0   r1   r2   r3   r4   r5   r6   )r>   rA   check_done_fail_conflictrC   rD   rE   rF   rG   rH   rI   rL   rM   rN   rO   rP   rQ   )r   r   r!   rS   rT   rU   rV   rW   rX   rY   @py_assert8@py_assert10rZ   r\   r^   r]   @py_format12@py_format14ra   rb   rc   rd   s                         r   test_B_done_fail_conflictrv   1   s   GWIX&&224'2JWIU##//w/G
##G
CA44545=451145A:AAA)A:))AXAAX-AAAAA:)AAA:AAAAAAAAAAAAAAAAAA)AAAAAAAXAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAr   c                 l   d} t        j                  |       }|d   }d}||k\  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j
                  d|d    d      d	z   d
|iz  }t        t        j                  |            d x}x}}y )Nu  ## High Priority Issues

🔴 **High:** Bot author allowlist에 `app/` prefix 누락

### Critical: self-approve guard 우회 가능

severity: critical — chairman PAT fallback 시 PR author=human

## Medium

⚠️ Medium: TASKCTL_CWD env hook은 임시방편

## Low

- Minor: typo
high   >=)z%(py1)s >= %(py4)s)py1r=   zhigh=u)    (expected >=3) — task-2467+3 미재현z
>assert %(py6)spy6)gspcount_severitiesrD   rE   rI   rJ   rL   rM   )fixtureresultrZ   rU   rX   re   @py_format7s          r   test_C_gemini_high_3_countr   ;   s    G  !!'*F&>aQa>Qaaa>Qaaa>aaaQaaa%v'77` aaaaaaaar   c            
        d} t        j                  |       }|j                  }d}||u }|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	z   d
|iz  }t        t        j                  |            d x}x}}|j                  }|j                  }d}d} |||      }	d}
|	|
k\  }|st        j                  d|fd|	|
f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |	      t        j                  |
      dz  }dd|iz  }t        t        j                  |            d x}x}x}x}x}	x}}
y )Nu   ## High
🔴 BLOCKING issue)textFr   r    r!   r"   zexpected FAIL: r&   r'   rx   r   r4   rz   )zq%(py10)s
{%(py10)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.detail
}.get
}(%(py6)s, %(py8)s)
} >= %(py13)s)r#   r$   r=   r}   py8py10rn   zassert %(py15)spy15)rA   check_gemini_severityrC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   detailget)r   r!   rS   rT   rU   rV   rW   @py_assert5@py_assert7@py_assert9@py_assert12r[   ru   @py_format16s                 r   #test_D_gemini_high_blocks_automerger   Q   sY   /D
  d+A4495945=999459999991999199949995999OAIIK=9999999988'8<<'''<"'a'"a''''"a''''''1'''1'''8'''<'''''''''"'''a''''''''r   c                   | dz  }|j                  t        j                  dddgdgd      d       t        j                  d|	      }|j
                  }d
}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        j                  d|j                                dz   d|iz  }t        t        j                  |            d x}x}}g }d}|j                   }	|	j"                  }
 |
       }||v }|}|s'd}|j                   }|j"                  } |       }||v }|}|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |
      t        j                  |      dz  }dd|iz  }|j%                  |       |st        j                  dfdf      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                        t        j                        t        j                  |      dz  }dd|iz  }|j%                  |       t        j&                  |d      i z  }dd|iz  }t        t        j                  |            d x}x}x}x}x}	x}
x}x}x}x}x}}y )Nallowed_approvers.jsontaskctl-gatesystemlogintypeJonghyukJeon	approversmanual_loginsr   r   allowlist_pathFr   r    r!   r"   u1   chairman approver는 manual로 분류돼야 함: r&   r'   manualr)   rj   rk   rm   rn   zh%(py16)s in %(py24)s
{%(py24)s = %(py22)s
{%(py22)s = %(py20)s
{%(py20)s = %(py18)s.reason
}.lower
}()
}r/   r0   r1   r3   py24%(py26)spy26r4   assert %(py29)spy29)r>   r?   r@   rA   check_approver_identityrC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   )r   cfgr!   rS   rT   rU   rV   rW   rX   rY   rr   rs   rZ   r\   r^   @py_assert21@py_assert23r]   rt   ru   @py_format25@py_format27@py_format28@py_format30s                           r   "test_E_chairman_approver_is_manualr   Z   s!   
-
-CNN4:: .AB()     	"">#FA44[5[45=[[[45[[[[[[1[[[1[[[4[[[5[[[Maiik][[[[[[[[G8GqxxGx~~G~'G8''G8GqxxGx~~G~7GG87G+GGGGG8'GGG8GGGGGGqGGGqGGGxGGG~GGG'GGGGGGG87GGGG8GGGGGGqGGGqGGGxGGG~GGG7GGGGGGGGGGGGGGGGr   c                t   | dz  }|j                  t        j                  dddgdgd      d       t        j                  d|	      }|j
                  }d
}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        j                  d|j                                dz   d|iz  }t        t        j                  |            d x}x}}y )Nr   r   r   r   r   r   r   r   r   Tr   r    r!   r"   zsystem approver: r&   r'   )r>   r?   r@   rA   r   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   r   r   r!   rS   rT   rU   rV   rW   s           r   test_F_system_approver_is_autor   f   s    
-
-CNN4:: .AB()     	"">#FA44:4:44<:::44::::::1:::1:::4:::4:::,QYY[M::::::::r   c                l   d!d}| j                  t        d|       t        j                  dd      }|j                  }d}||u }|st	        j
                  d|fd||f      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}}g }d}|j                  }	|	j                  }
 |
       }||v }|}|sPd}|j                  }|j                  } |       }||v }|}|s'd}|j                  }|j                  } |       }||v }|}|st	        j
                  d|fd||f      t	        j                  |      d	t        j                         v st	        j                  |      rt	        j                  |      nd	t	        j                  |	      t	        j                  |
      t	        j                  |      dz  }dd|iz  }|j                  |       |st	        j
                  dfdf      t	        j                  |      d	t        j                         v st	        j                  |      rt	        j                  |      nd	t	        j                        t	        j                        t	        j                  |      dz  }dd|iz  }|j                  |       |st	        j
                  dfdf      t	        j                  |      d	t        j                         v st	        j                  |      rt	        j                  |      nd	t	        j                        t	        j                        t	        j                  |      dz  }dd|iz  }|j                  |       t	        j                  |d      i z  }dd |iz  }t        t	        j                  |            dx}x}x}x}x}	x}
x}x}x}x}x}x}x}x}x}x}}y)"u@   merge_commit_sha 빈 값 시 차단. fetch_pr_merge_sha를 mock.c                    dddi dS )N mainTmerge_commit_shabase_refrC   raw )
_pr_number_repos     r   
fake_fetchz1test_G_merge_sha_empty_blocks.<locals>.fake_fetchs   s    $&F$rRRr   fetch_pr_merge_sha!   
dummy/reporepoFr   r    r!   r"   rh   r'   Nshaemptynullr)   rj   rk   rm   rn   r   r   r   r   zh%(py29)s in %(py37)s
{%(py37)s = %(py35)s
{%(py35)s = %(py33)s
{%(py33)s = %(py31)s.reason
}.lower
}()
}r   py31py33py35py37%(py39)spy39r4   assert %(py42)spy42)r   intr   r8   returndictsetattrrA   check_merge_commit_sharC   rD   rE   rF   rG   rH   rI   rL   rM   rN   rO   rP   rQ   )monkeypatchr   r!   rS   rT   rU   rV   rW   rX   rY   rr   rs   rZ   r\   r^   r   r   r]   @py_assert28@py_assert32@py_assert34@py_assert36@py_assert30rt   ru   r   r   @py_format38@py_format40@py_format41@py_format43s                                  r   test_G_merge_sha_empty_blocksr   q   s~   S0*=
!!"<8A44545=451145a5aAHHaHNNaN$a5$$aa188a8>>a>3Ca3C(CavaQRQYQYaQYQ_Q_aQ_QaavQaGaaaaa5$aaa5aaaaaaAaaaAaaaHaaaNaaa$aaaaaaa3Caaaaaaaaa1aaa1aaa8aaa>aaa3CaaaaaaavQaaaavaaaaaaQRaaaQRaaaQYaaaQ_aaaQaaaaaaaaaaaaaaaaaar   c                   | j                  t        dd        | j                  t        dd        t        j                  dd      }|j                  }d}||u }|st	        j
                  d	|fd
||f      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}}g }d}|j                  }|j                  }	 |	       }
||
v }|}|s*d}|j                  }||v }|}|sd}|j                  }||v }|}|sKt	        j
                  d|fd||
f      t	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |	      t	        j                  |
      dz  }dd|iz  }|j                  |       |sBt	        j
                  dfdf      t	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dz  }dd|iz  }|j                  |       |st	        j
                  dfdf      t	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dz  }dd|iz  }|j                  |       t	        j                  |d      i z  }d d!|iz  }t        t	        j                  |            d x}x}x}x}x}x}	x}
x}x}x}x}x}}y )"Nr   c                    dddi dS )Nabc123r   Tr   r   _prr   s     r   <lambda>z2test_H_merge_sha_mismatch_blocks.<locals>.<lambda>~   s    V\dhqs+t r   fetch_origin_head_shac                     y)NDIFFERENT_SHAr   )_base_kws     r   r   z2test_H_merge_sha_mismatch_blocks.<locals>.<lambda>   s    r   r   r   r   Fr   r    r!   r"   rh   r'   mismatchu	   불일치u   ≠r)   rj   rk   rm   rn   ro   rp   r2   r3   )z2%(py25)s in %(py29)s
{%(py29)s = %(py27)s.reason
})r6   py27r   z%(py31)sr   r4   zassert %(py34)spy34r   )r   r!   rS   rT   rU   rV   rW   rX   rY   rr   rs   rZ   r\   r^   r]   @py_assert24r   @py_assert26rt   ru   ra   rb   r   @py_format32@py_format33@py_format35s                             r    test_H_merge_sha_mismatch_blocksr   |   s8   0tv3<>
!!"<8A44545=451145Y:YYY)Y:))Y[YAHHY[H-DYYQRQYQYYQYHYYYYY:)YYY:YYYYYYYYYYYYYYYYYY)YYYYYYY[HYYY[YYYYYYAYYYAYYYHYYYYYYYQYYYYYYYYYYQRYYYQRYYYQYYYYYYYYYYYYYYYYYr   c                n   | j                  t        dd        | j                  t        dd        t        j                  dd      }|j                  }d}||u }|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z   d|iz  }t        t	        j                  |            d x}x}}y )Nr   c                    dddi dS )Nr   developTr   r   r   s     r   r   z2test_I_nonmain_base_dynamic_pass.<locals>.<lambda>   s    V_gktv+w r   r   c                    | dk(  rdS dS )Nr   r   WRONGr   )baser   s     r   r   z2test_I_nonmain_base_dynamic_pass.<locals>.<lambda>   s    	8IH w r   2   r   r   Tr   r    r!   r"   u)   develop base에서도 동적으로 PASS: r&   r'   )r   rA   r   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   )r   r!   rS   rT   rU   rV   rW   s          r    test_I_nonmain_base_dynamic_passr      s    0wy3VX
!!"<8A44R4R44<RRR44RRRRRR1RRR1RRR4RRR4RRRDQYY[MRRRRRRRRr   c                j   | dz  }|j                          t        j                  dddi|      }|j                  }d}||u }|st	        j
                  d|fd||f      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}}g }d}|j                  }	|	j                  }
 |
       }||v }|}|s'd}|j                  }|j                  } |       }||v }|}|st	        j
                  d|fd||f      t	        j                  |      d	t        j                         v st	        j                  |      rt	        j                  |      nd	t	        j                  |	      t	        j                  |
      t	        j                  |      dz  }dd|iz  }|j                  |       |st	        j
                  dfdf      t	        j                  |      d	t        j                         v st	        j                  |      rt	        j                  |      nd	t	        j                        t	        j                        t	        j                  |      dz  }dd|iz  }|j                  |       t	        j                  |d      i z  }dd|iz  }t        t	        j                  |            d x}x}x}x}x}	x}
x}x}x}x}x}}y )Nadmin-override.jsonlztask-test-JTASKCTL_BYPASS1env
audit_pathFr   r    r!   r"   rh   r'   auditbypassr)   rj   rk   rm   rn   r   r   r   r   r4   r   r   )touchrA   check_bypass_auditrC   rD   rE   rF   rG   rH   rI   rL   rM   rN   rO   rP   rQ   )r   r  r!   rS   rT   rU   rV   rW   rX   rY   rr   rs   rZ   r\   r^   r   r   r]   rt   ru   r   r   r   r   s                           r   !test_J_bypass_without_audit_failsr	     s   --E	KKM
m2BC1HUZ[A44545=451145F7FahhFhnnFn&F7&&F(FahhFhnnFn6FF(6F*FFFFF7&FFF7FFFFFFaFFFaFFFhFFFnFFF&FFFFFFF(6FFFF(FFFFFFaFFFaFFFhFFFnFFF6FFFFFFFFFFFFFFFFr   c                   | dz  }|j                          t        j                  dddi|      }|j                  }d}||u }|st	        j
                  d|fd||f      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}}y )Nr   ztask-test-KTASKCTL_PR_AUTHOR_OVERRIDEzfake-botr  Fr   r    r!   r"   rh   r'   )r  rA   r  rC   rD   rE   rF   rG   rH   rI   rL   rM   )r   r  r!   rS   rT   rU   rV   rW   s           r   -test_K_pr_author_override_without_audit_failsr     s    --E	KKM
m$@*#M*/	1A 44545=451145r   c                r   | dz  }|j                  t        j                  dgdgdgd      d       t        j                  d|	      }|j
                  }d
}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        j                  d|j                                dz   d|iz  }t        t        j                  |            d x}x}}y )Nzallowed_bot_accounts.jsonzjeon-jonghyuk-taskctl-bot[bot]z[bot]zapp/)exactwildcard_suffixwildcard_prefixr   r   zmalicious-userr   Fr   r    r!   r"   zunknown author blocked: r&   r'   )r>   r?   r@   rA   check_bot_author_allowlistrC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   r   s           r   "test_L_unknown_author_blocks_merger     s    
0
0CNN4::23#9"8  	  
 	%%&6sKA44B5B45=BBB45BBBBBB1BBB1BBB4BBB5BBB4QYY[MBBBBBBBBr   c                    t        j                  dd      } | j                  }d}||u }|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	z   d
|iz  }t        t        j                  |            d x}x}}y )NFAILEDDONEFr   r    r!   r"   u   FAILED → DONE 금지: r&   r'   )rA   check_state_transitionrC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   )r!   rS   rT   rU   rV   rW   s         r   test_M_fail_to_done_forbiddenr     s    
!!(F3A44B5B45=BBB45BBBBBB1BBB1BBB4BBB5BBB4QYY[MBBBBBBBBr   c                >   d}t        j                  |dd|       }|j                  }d}||u }|st        j                  d|fd||f      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}}g }d}|j                  }	|	j                  }
 |
       }||v }|}|sPd}|j                  }|j                  } |       }||v }|}|s'd}|j                  }|j                  } |       }||v }|}|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |
      t        j                  |      dz  }dd|iz  }|j                  |       |st        j                  dfdf      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                        t        j                        t        j                  |      dz  }dd|iz  }|j                  |       |st        j                  dfdf      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                        t        j                        t        j                  |      dz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            d x}x}x}x}x}	x}
x}x}x}x}x}x}x}x}x}x}}y )Nztask-test-Nr   abc)	pr_numberhead_shaevidence_dirFr   r    r!   r"   rh   r'   r   r(   missingr)   rj   rk   rm   rn   r   r   r   r   r   r   r   r   r4   r   r   )rA   check_done_g3_pass_evidencerC   rD   rE   rF   rG   rH   rI   rL   rM   rN   rO   rP   rQ   )r   r   r!   rS   rT   rU   rV   rW   rX   rY   rr   rs   rZ   r\   r^   r   r   r]   r   r   r   r   r   rt   ru   r   r   r   r   r   r   s                                  r   !test_N_no_g3_pass_evidence_blocksr     sr   G
&&w"u5A	CA44545=451145f:fff)f:))fTfQXXfX^^f^5EfT5E-EffVWV^V^fV^VdVdfVdVffVfIf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ffffT5EfffTffffffQfffQfffXfff^fff5EfffffffVffffffffffVWfffVWfffV^fffVdfffVffffffffffffffffffr   )r   r   r   r   )r   r   )r   r   )r   r   )+__doc__
__future__r   builtinsrF   _pytest.assertion.rewrite	assertionrewriterD   r?   syspathlibr   pytest__file__resolveparents
_REPO_ROOT_SCRIPTS_DIRr8   pathinsertlifecycle_guardsrA   gemini_severity_parserr~   r   r   r   rf   rv   r   r   r   r   r   r   r   r	  r  r  r  r  r   r   r   <module>r2     s    #       (^##%--a0
I%|CHH$HHOOAs<()  $    QBb,(H;bZSGCCgr   