
     jiP                    0   d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
Z
ddlmZ  ee      j                         j                  j                  j                  Z ee      e
j$                  v r!e
j$                  j'                   ee             e
j$                  j)                  d ee             ddlmZmZmZmZmZmZmZmZmZ ddlm Z m!Z! 	 	 	 d	 	 	 	 	 	 	 	 	 ddZ"d Z#d	 Z$d
 Z%d Z&d Z'd Z(d Z)d Z*d Z+d Z,d Z-d Z.d Z/d Z0d Z1d Z2d Z3d Z4d Z5y)u   tests/regression/test_auto_gemini_triage_2511.py — task-2511 회귀 테스트 16건.

회장 명시: PR #55/#56/#57/#61 fixture replay 포함.
모든 테스트는 100% offline — gh api / network 호출 없음.
    )annotationsN)Path)	ThreadTriageOutcomeTriageVerdictauto_resolve_threadsbuild_dismiss_commentbuild_resolve_thread_argsbuild_review_gate_statusclassify_thread	triage_prto_legacy_gemini_state)CriticalEscalationTypeto_jsonc                    | ||d|igdS )Nbody)id
isOutdated
isResolvedcomments )tidis_outdatedis_resolvedr   s       D/home/jay/workspace/tests/regression/test_auto_gemini_triage_2511.py_make_threadr   (   s!     !!d^$	     c                    t        ddd      } t        | dg g g       }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
t        j                         v st        j                  t              rt        j                  t              nd
t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}t        |gd      }|d   }|j                  }	d}|	|u }
|
st        j                  d|
fd|	|f      t        j                  |      t        j                  |	      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}	x}
}y )NT1T   이전 코드r   r   abc123threadpr_head_shafix_commitsexpected_filesforbidden_paths==zM%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py6)s
{%(py6)s = %(py4)s.OUTDATED
}outcomer   py0py2py4py6assert %(py8)spy8Fapplyr   isz5%(py3)s
{%(py3)s = %(py1)s.auto_resolved
} is %(py6)spy1py3r0   r   r   verdictr   OUTDATED
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr   auto_resolvedr#   r+   @py_assert1@py_assert5@py_assert3@py_format7@py_format9resolved@py_assert0@py_assert2@py_assert4s              r   $test_01_outdated_thread_auto_resolverQ   :   s5   $DGFG ??4m444?44444?444444474447444?444444m444m44444444444#WIU;HA;,;$$,,$,,,,$,,,;,,,$,,,,,,,,,,r   c                    t        dd      } dddgdg}t        | d|dgg 	      }|j                  }t        j                  }||k(  }|st        j                  d
|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}t        |gd      }|d   }	|	j                  }
d}|
|u }|st        j                  d|fd|
|f      t        j                  |	      t        j                  |
      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}	x}
x}}y )NT2u&   def foo(): 함수 구현 개선 필요r   b1eff66b1234567890abcdefu   fix: foo 함수 구현 개선utils/auto_gemini_triage.pyshamessagefilesr!   r"   r(   )zW%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py6)s
{%(py6)s = %(py4)s.CODE_ALREADY_FIXED
}r+   r   r,   r1   r2   Fr3   r   Tr5   r7   r8   )r   r   r<   r   CODE_ALREADY_FIXEDr>   r?   r@   rA   rB   rC   rD   rE   r   rF   )r#   r%   r+   rH   rI   rJ   rK   rL   rM   rN   rO   rP   s               r   'test_02_code_already_fixed_auto_resolver\   M   sV   5F .634	
K 56G ??>m>>>?>>>>>?>>>>>>>7>>>7>>>?>>>>>>m>>>m>>>>>>>>>>>#WIU;HA;,;$$,,$,,,,$,,,;,,,$,,,,,,,,,,r   c                    t        dd      } t        | dg g g       }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d	t        j                         v st        j                  t              rt        j                  t              nd	t        j                  |      d
z  }dd|iz  }t        t        j                  |            d x}x}}t        |      }d}||v }	|	st        j                  d|	fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }
dd|
iz  }t        t        j                  |            d x}}	y )NT3u;   grep regex가 wrapper 패턴을 false-positive로 매칭함rT   r!   r"   r(   zS%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py6)s
{%(py6)s = %(py4)s.FALSE_POSITIVE
}r+   r   r,   r1   r2   FALSE_POSITIVEinz%(py1)s in %(py3)scommentr9   r:   assert %(py5)spy5)r   r   r<   r   r`   r>   r?   r@   rA   rB   rC   rD   rE   r   )r#   r+   rH   rI   rJ   rK   rL   rd   rN   rO   @py_format4@py_format6s               r   $test_03_false_positive_regex_dismissrj   k   s*   JF G ??:m:::?:::::?:::::::7:::7:::?::::::m:::m:::::::::::#G,G&w&&&&w&&&&&&&&&w&&&w&&&&&&&r   c                    t        dd      } t        | dg g g       }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d	t        j                         v st        j                  t              rt        j                  t              nd	t        j                  |      d
z  }dd|iz  }t        t        j                  |            d x}x}}t        |gd      }|d   }|j                  }	d}|	|u }
|
st        j                  d|
fd|	|f      t        j                  |      t        j                  |	      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}	x}
}y )NT4z,nit: variable naming consistency improvementrT   r!   r"   r(   zO%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py6)s
{%(py6)s = %(py4)s.STYLE_ONLY
}r+   r   r,   r1   r2   Fr3   r   Tr5   r7   r8   r   r   r<   r   
STYLE_ONLYr>   r?   r@   rA   rB   rC   rD   rE   r   rF   rG   s              r   test_04_style_only_dismissrp      s9   ;F G ??6m666?66666?666666676667666?666666m666m66666666666#WIU;HA;,;$$,,$,,,,$,,,;,,,$,,,,,,,,,,r   c                    t        dd      } t        | dg dgg       }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
t        j                         v st        j                  t              rt        j                  t              nd
t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}t        |gd      }|d   }|j                  }	d}|	|u }
|
st        j                  d|
fd|	|f      t        j                  |      t        j                  |	      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}	x}
}y )NT5u&   rename bool flag is_active → enabledrT   r!   rV   r"   r(   )zV%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py6)s
{%(py6)s = %(py4)s.MINOR_FIX_ALLOWED
}r+   r   r,   r1   r2   Fr3   r   Tr5   r7   r8   )r   r   r<   r   MINOR_FIX_ALLOWEDr>   r?   r@   rA   rB   rC   rD   rE   r   rF   rG   s              r   "test_05_minor_fix_allowed_in_scopert      s<   5F 56G ??=m===?=====?=======7===7===?======m===m===========#WIU;HA;,;$$,,$,,,,$,,,;,,,$,,,,,,,,,,r   c                 J   t        dd      } t        | dg dgg       }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
t        j                         v st        j                  t              rt        j                  t              nd
t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|j                  }t        j                  }||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|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 )NT6zDimplement new module utils/new_feature.py for extended functionalityrT   r!   rV   r"   r(   z]%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py6)s
{%(py6)s = %(py4)s.REAL_BUG_SCOPE_EXPANSION
}r+   r   r,   r1   r2   )zu%(py2)s
{%(py2)s = %(py0)s.escalation_type
} == %(py6)s
{%(py6)s = %(py4)s.GEMINI_REAL_BUG_REQUIRES_SCOPE_EXPANSION
}r   Fr5   z5%(py2)s
{%(py2)s = %(py0)s.auto_resolved
} is %(py5)sr-   r.   rg   assert %(py7)spy7)r   r   r<   r   REAL_BUG_SCOPE_EXPANSIONr>   r?   r@   rA   rB   rC   rD   rE   escalation_typer   (GEMINI_REAL_BUG_REQUIRES_SCOPE_EXPANSIONrF   
r#   r+   rH   rI   rJ   rK   rL   rP   ri   @py_format8s
             r    test_06_scope_expansion_criticalr      s   SF 56G ??DmDDD?DDDDD?DDDDDDD7DDD7DDD?DDDDDDmDDDmDDDDDDDDDDD""e&<&e&ee"&eeeee"&eeeeeee7eee7eee"eeeeee&<eee&<eee&eeeeeeee  )E) E)))) E))))))7)))7))) )))E)))))))r   c                 L   t        dd      } t        | dg dgdg      }|j                  }t        j                  }||k(  }|st        j                  d|fd	||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|j                  }t        j                  }||k(  }|st        j                  d|fd||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|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 )NT7z4modify dispatch.py to add hook for new functionalityrT   r!   rV   dispatch.pyr"   r(   rw   r+   r   r,   r1   r2   ze%(py2)s
{%(py2)s = %(py0)s.escalation_type
} == %(py6)s
{%(py6)s = %(py4)s.FORBIDDEN_PATH_INTRUSION
}r   Fr5   rx   ry   rz   r{   )r   r   r<   r   r|   r>   r?   r@   rA   rB   rC   rD   rE   r}   r   FORBIDDEN_PATH_INTRUSIONrF   r   s
             r   test_07_forbidden_path_criticalr      s   CF 56&G ??DmDDD?DDDDD?DDDDDDD7DDD7DDD?DDDDDDmDDDmDDDDDDDDDDD""U&<&U&UU"&UUUUU"&UUUUUUU7UUU7UUU"UUUUUU&<UUU&<UUU&UUUUUUUU  )E) E)))) E))))))7)))7))) )))E)))))))r   c                 Z   t        d      } t        | t              }|sd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dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d }d}|| v }|st        j                  d|fd	|| f      t        j                  |      dt        j                         v st        j                  |       rt        j                  |       ndd
z  }dd|iz  }t        t        j                  |            d x}}d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}}y )N
THREAD_123z5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstanceargslist)r-   r9   r.   r/   graphqlra   rc   re   rf   rg    resolveReviewThreadcombined)r	   r   r   r@   rA   r>   rB   rC   rD   rE   r?   join)r   rJ   @py_format5rN   rO   rh   ri   r   s           r   test_08_resolve_thread_payloadr      s   $\2DdD!!!!!!!!:!!!:!!!!!!d!!!d!!!!!!D!!!D!!!!!!!!!!999xx~H , H,,,, H,,, ,,,,,,H,,,H,,,,,,,#<8####<8###<######8###8#######r   c            	        t        dd      D  cg c]  } t        d|  dd       }} t        d|dg g g d	
      }|j                  }d}||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}x}}|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  }dd|iz  }t        t	        j                  |            d x}x}}|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  }dd|iz  }t        t	        j                  |            d x}x}}t        dd	d      gt        dd      D  cg c]  } t        d|  dd       c} z   }t        d|dg dgg d	
      }	|	j                  }d}||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |	      rt	        j                  |	      ndt	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}x}}|	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  }dd|iz  }t        t	        j                  |            d x}x}}y c c} w c c} w )N      TTzold coder    c   abcF	pr_numberthreadsr$   r%   r&   r'   r4   r   r(   z8%(py2)s
{%(py2)s = %(py0)s.unresolved_count
} == %(py5)sreportry   rz   r{      z;%(py2)s
{%(py2)s = %(py0)s.auto_resolved_count
} == %(py5)sz=%(py2)s
{%(py2)s = %(py0)s.blocking_thread_count
} == %(py5)sTX1z)implement utils/new_module.py for featureTYoldd   rV   report2)ranger   r   unresolved_countr>   r?   r@   rA   rB   rC   rD   rE   auto_resolved_countblocking_thread_count)
i	threads_5r   rH   rP   rJ   ri   r   threads_mixr   s
             r   $test_09_unresolved_count_calculationr      s    q! 	qW$Z@I  F ""'a'"a''''"a''''''6'''6'''"'''a'''''''%%**%****%******6***6***%**********'',1,'1,,,,'1,,,,,,6,,,6,,,',,,1,,,,,,, 	U4_` q!	 	r!X4e<	K 56G ((-A-(A----(A------7---7---(---A-------##(q(#q((((#q((((((7(((7(((#(((q(((((((E(	s   Q0/Q5c            	     f
   t        dt        j                  ddd ddi      g} t        |       }t	        |      }t        j                  |      }|d   }|j                  }|j                  }||k(  }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      d
z  }dd|iz  }	t        t        j                   |	            d x}x}x}}|d   }|j"                  }||k(  }|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  }t        t        j                   |            d x}x}}|d   }|j$                  }||k(  }|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  }t        t        j                   |            d x}x}}|d   }|j&                  }||k(  }|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  }t        t        j                   |            d x}x}}|d   }|j(                  }||k(  }|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  }t        t        j                   |            d x}x}}|d   }|j*                  }||k(  }|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  }t        t        j                   |            d x}x}}y )Nr   Tz[AUTO-OUTDATED] okoutdated)	thread_idr<   rF   dismiss_commentr}   evidencegemini_statusr(   )zP%(py1)s == %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.gemini_status
}.value
}status)r9   r:   rg   r{   assert %(py9)spy9unresolved_threads)z:%(py1)s == %(py5)s
{%(py5)s = %(py3)s.unresolved_threads
})r9   r:   rg   rz   r{   fallback_review_used)z<%(py1)s == %(py5)s
{%(py5)s = %(py3)s.fallback_review_used
}fallback_review_passed)z>%(py1)s == %(py5)s
{%(py5)s = %(py3)s.fallback_review_passed
}review_gate_passed)z:%(py1)s == %(py5)s
{%(py5)s = %(py3)s.review_gate_passed
}reason)z.%(py1)s == %(py5)s
{%(py5)s = %(py3)s.reason
})r   r   r=   r
   r   jsonloadsr   valuer>   r?   rC   r@   rA   rB   rD   rE   r   r   r   r   r   )outcomesr   json_strparsedrN   rP   @py_assert6rO   r   @py_format10ri   s              r   )test_10_review_gate_status_json_roundtripr     sD   !**0  $'	
	H &h/FvHZZ!F/"@f&:&:@&:&@&@@"&@@@@@"&@@@@"@@@@@@f@@@f@@@&:@@@&@@@@@@@@&'D6+D+DD'+DDDDD'+DDDD'DDDDDD6DDD6DDD+DDDDDDDD()HV-H-HH)-HHHHH)-HHHH)HHHHHHVHHHVHHH-HHHHHHHH*+Lv/L/LL+/LLL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&'D6+D+DD'+DDDDD'+DDDD'DDDDDD6DDD6DDD+DDDDDDDD(,v}},},,,,},,,,,,,,,v,,,v,,,},,,,,,,r   c            	        t        ddd      t        ddd      t        ddd      t        d	dd
      t        ddd      g} dddgdg}ddg}t        d| d||dgd      }|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|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"      d#z   d|iz  }t        t        j                  |            dx}x}} |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  }dd|iz  }t        t        j                  |            dx}x}}|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}}|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  }dd|iz  }t        t        j                  |            dx}x}}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.   }g }||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d0||f      t        j                  |      t        j                  |      d+z  }d,d-|iz  }t        t        j                  |            dx}x}}y)1uL   PR #61 fixture: 5 unresolved → 5 auto-resolved → mergeStateStatus CLEAN.r   Tu   이전 버전 코드r    rS   zstale commentr^   zoutdated reviewrl   zold implementationrr   FuA   이미 후속 commit b1eff66b로 반영됨. 코드 수정 완료.rU   u   fix: 코드 수정 완료zutils/replacement_pr_runner.pyrW   z3tests/regression/test_replacement_pr_runner_2510.py=   r   r   r   r(   r   r   ry   rz   r{   Nr5   rx   r+   zthread z not auto_resolvedz
>assert %(py7)sr   r   z7%(py2)s
{%(py2)s = %(py0)s.merge_readiness
} is %(py5)sr   r   	completed)z%(py1)s == %(py4)s)r9   r/   zassert %(py6)sr0   
unresolvedmerge_readiness)z%(py1)s is %(py4)s)r   r   r   r>   r?   r@   rA   rB   rC   rD   rE   r   rF   _format_assertmsgr   r   r   r   r   )r   r%   r&   r   rH   rP   rJ   ri   r   r+   legacyrN   rO   r   rK   s                  r   )test_11_pr61_replay_5_unresolved_to_cleanr   *  s   
 	Tt2HITt/BTt2CDTt2FGT	

G .267	
K 	)=N
 .%&F %%**%****%******6***6***%**********>> ^$$]]$,]]]$]]]]]]w]]]w]]]$]]]]]]8I8I7JJ\.]]]]]]]]^ '',1,'1,,,,'1,,,,,,6,,,6,,,',,,1,,,,,,,!!)T)!T))))!T))))))6)))6)))!)))T)))))))""'a'"a''''"a''''''6'''6'''"'''a''''''' $F+F(*{*{****{******{*******,%2%2%%%%2%%%%%%2%%%%%%%#$,,$,,,,$,,,$,,,,,,,,,,r   c                    t        dd      } dddgdg}t        | d|dgg 	      }|j                  }t        j                  t        j
                  f}||v }|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}}|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)u5   PR #56 fixture: hardcoded path 제거 후 commit fix.T56u3   /home/jay/projects/foo hardcoded path 제거 필요rT   deadbeef12345678u   fix: hardcoded path 제거zutils/some_module.pyrW   deadbeefr"   ra   )z/%(py2)s
{%(py2)s = %(py0)s.verdict
} in %(py5)sr+   ry   rz   r{   NTr5   rx   )r   r   r<   r   r[   r`   r>   r?   r@   rA   rB   rC   rD   rE   rF   )r#   r%   r+   rH   rP   rJ   ri   r   s           r   *test_12_pr56_replay_hardcoded_path_dismissr   d  s?   BF &3,-	
K ./G ??^}??A]A]^^?^^^^^?^^^^^^^7^^^7^^^?^^^^^^^^^^^  (D( D(((( D((((((7(((7((( (((D(((((((r   c                 |   t        dd      } t        | dg g g       }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d	t        j                         v st        j                  t              rt        j                  t              nd	t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}y)z*PR #57 fixture: regex grep false-positive.T57au:   grep regex가 false positive를 매칭하여 오탐 발생rT   r   r"   r(   r_   r+   r   r,   r1   r2   Nr   r   r<   r   r`   r>   r?   r@   rA   rB   rC   rD   rE   r#   r+   rH   rI   rJ   rK   rL   s          r   -test_13_pr57_replay_regex_grep_false_positiver     s    IF G ??:m:::?:::::?:::::::7:::7:::?::::::m:::m:::::::::::r   c                 |   t        dd      } t        | dg g g       }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d	t        j                         v st        j                  t              rt        j                  t              nd	t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}y)z6PR #57 fixture: wrapper helper pattern false positive.T57bu9   wrapper helper pattern false positive 오탐으로 보임rT   r   r"   r(   r_   r+   r   r,   r1   r2   Nr   r   s          r   1test_14_pr57_replay_wrapper_helper_false_positiver     s    HF G ??:m:::?:::::?:::::::7:::7:::?::::::m:::m:::::::::::r   c                    t        ddd      } t        | dg g g       }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
t        j                         v st        j                  t              rt        j                  t              nd
t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}t        |gd      }|d   }|j                  }	d}|	|u }
|
st        j                  d|
fd|	|f      t        j                  |      t        j                  |	      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}	x}
}y)u3   PR #56 fixture: PR head 변경 후 outdated thread.T56bTu"   이전 commit 기준 코드 리뷰r    newshar"   r(   r*   r+   r   r,   r1   r2   NFr3   r   r5   r7   r8   r;   rG   s              r   *test_15_pr56_replay_outdated_commit_reviewr     s<   1F
 G ??4m444?44444?444444474447444?444444m444m44444444444#WIU;HA;,;$$,,$,,,,$,,,;,,,$,,,,,,,,,,r   c                    t        dd      } t        | dg g g       }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d	t        j                         v st        j                  t              rt        j                  t              nd	t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}t        |gd      }|d   }|j                  }	d}|	|u }
|
st        j                  d|
fd|	|f      t        j                  |      t        j                  |	      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}	x}
}y)z)PR #55 fixture: style-only medium thread.T55z3nit: prefer f-string over .format() for readabilityrT   r   r"   r(   rm   r+   r   r,   r1   r2   NFr3   r   Tr5   r7   r8   rn   rG   s              r   ,test_16_pr55_replay_style_only_medium_threadr     s9   BF G ??6m666?66666?666666676667666?666666m666m66666666666#WIU;HA;,;$$,,$,,,,$,,,;,,,$,,,,,,,,,,r   c            	        t        dd      } t        | dg g g       }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d	t        j                         v st        j                  t              rt        j                  t              nd	t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}|j                  }|j                  }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                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}x}x}x}	}y)u   commit 매칭 없이 HARDCODED_PATH_PATTERN만으로 FALSE_POSITIVE 직접 분류 검증.

    Codex G1 게이트 권고: PR #56 회귀가 commit 매칭으로만 통과하지 않도록
    classifier capability 자체를 검증.
    T_HARDuN   /home/jay/projects/InsuRo/scripts/foo 경로가 절대 경로로 박혀 있음rT   r   r"   r(   r_   r+   r   r,   r1   r2   Nmatched_kindhardcoded_path)zh%(py8)s
{%(py8)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.evidence
}.get
}(%(py6)s)
} == %(py11)s)r-   r.   r/   r0   r2   py11zassert %(py13)spy13)r   r   r<   r   r`   r>   r?   r@   rA   rB   rC   rD   rE   r   get)r#   r+   rH   rI   rJ   rK   rL   @py_assert7@py_assert10@py_assert9@py_format12@py_format14s               r   ,test_17_hardcoded_path_direct_false_positiver     s~    ]F G ??:m:::?:::::?:::::::7:::7:::?::::::m:::m:::::::::::CCC/C3CC/3CCCCC/3CCCCCCC7CCC7CCCCCCCCCCCC/CCC3CCCCCCCCCr   c            
        t        dd      } t        ddd      }t        d| |gd	g d
gg dd      }|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|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  }dd|iz  }t        t        j                  |            dx}x}}|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}}|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                  |      t        j                  |      dz  }dd|iz  }
t        t        j                  |
            dx}x}x}	}y)uB  REAL_BUG_IN_SCOPE 잔여 thread가 있으면 review_gate_passed=False.

    Codex G1 게이트 권고: blocking_thread_count == 0이어도 unresolved가 있으면
    후속 wiring(task-2514)이 머지하지 않도록 review_gate_passed를 False로 차단.
    merge_readiness는 별도 — blocking 기준만 유지.
    T_REALu&   실제 버그: bug crash on null inputrT   T_OUTTr   r    i  abc12345utils/foo.pyFztask-test-18)r   r   r$   r%   r&   r'   r4   task_idr   r(   r   r   ry   rz   r{   Nr   )>=)z8%(py2)s
{%(py2)s = %(py0)s.unresolved_count
} >= %(py5)sr5   r   )zb%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.review_gate_status
}.review_gate_passed
} is %(py7)s)r-   r.   r/   r{   r   r   )r   r   r   r>   r?   r@   rA   rB   rC   rD   rE   r   r   review_gate_statusr   )thread_realthread_outdatedr   rH   rP   rJ   ri   r   r   rI   r   s              r   3test_18_review_gate_blocked_when_unresolved_remainsr     s+    x.VWK"7?SOo.&'	F '',1,'1,,,,'1,,,,,,6,,,6,,,',,,1,,,,,,,""'a'"a''''"a''''''6'''6'''"'''a'''''''!!)T)!T))))!T))))))6)))6)))!)))T)))))))$$@$77@5@75@@@@75@@@@@@6@@@6@@@$@@@7@@@5@@@@@@@r   c                    t        dd      } t        | dg dgg       }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
t        j                         v st        j                  t              rt        j                  t              nd
t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|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}}t        dd      }
t        |
dg dgg       }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d
t        j                         v st        j                  t              rt        j                  t              nd
t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|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}}t        dd      }t        |dg dgdg      }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d
t        j                         v st        j                  t              rt        j                  t              nd
t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|j                   }t"        j$                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t"              rt        j                  t"              ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y) u  false-positive/style-only 코멘트가 path를 한번 언급해도 SCOPE_EXPANSION으로
    escalate되지 않아야 함.

    Codex G1 권고: 분류 우선순위는 false-positive/style/fixed 검사가
    expected_files scope expansion보다 먼저 실행되어야 함.
    T_BENIGN_FPuC   grep false-positive in docs/guide.md — 실제로는 정상 동작rT   r   r   r"   r(   r_   	outcome_ar   r,   r1   r2   NTr5   rx   ry   rz   r{   T_BENIGN_STYLEz>nit: rename helper variable in tests/test_x.py for readabilityrm   	outcome_bT_FORBIDDEN_OVERRIDEz!nit: rename helper in dispatch.pyr   rw   	outcome_cr   r   )r   r   r<   r   r`   r>   r?   r@   rA   rB   rC   rD   rE   rF   ro   r|   r}   r   r   )thread_ar   rH   rI   rJ   rK   rL   rP   ri   r   thread_br   thread_cr  s                 r   5test_19_benign_path_mention_not_escalated_to_criticalr    s    RH  &'I < < << <<<<< <<<<<<<9<<<9<<<<<<<<<<<<<<< <<<<<<<<""*d*"d****"d******9***9***"***d******* MH  &'I 8 8 88 88888 888888898889888888888888888 88888888""*d*"d****"d******9***9***"***d******* 0H  &'&I F F FF FFFFF FFFF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FFF$$W(>(W(WW$(WWWWW$(WWWWWWW9WWW9WWW$WWWWWW(>WWW(>WWW(WWWWWWWWr   )FF )
r   strr   boolr   r  r   r  returndict)6__doc__
__future__r   builtinsr@   _pytest.assertion.rewrite	assertionrewriter>   r   syspathlibr   __file__resolveparent	WORKSPACEr  pathremoveinsertutils.auto_gemini_triager   r   r   r   r	   r
   r   r   r   utils.automation_contractsr   r   r   rQ   r\   rj   rp   rt   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   <module>r     s3   #    
  N""$++2299	y>SXXHHOOC	N# 3y> "
 
 
 		  	
 
$-&-<'*-,-,****$$)V-63-t):;(;(-0-.D2AH4Xr   