
    H_jRl                        d 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                  d   ZeZdedefdZ eded	z  d
z  dz  dz        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 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( Z/d) Z0d* Z1d+ Z2d, Z3d- Z4d. Z5d/ Z6d0 Z7d1 Z8d2 Z9d3 Z:d4 Z;d5 Z<d6 Z=d7 Z>d8 Z?d9 Z@d: ZAd; ZBd< ZCd= ZDd> ZEd? ZFd@ ZGy)Au2  
test_critical_gap_false_positive_2506.py — task-2506 회귀 테스트

회장 명시 15건 (10 false-positive + 5 true-positive) 검증.
- False-positive: critical_gap fix 후 PASS여야 함
- True-positive: 기존 룰 유지 — FAIL이어야 함

수정 대상: teams/shared/verifiers/critical_gap.py
    N)Path   namepathc                    t         j                  j                  | |      }||j                  t	        d|       t         j                  j                  |      }|t        j                  | <   |j                  j                  |       |S )NzFailed to load module spec for )		importlibutilspec_from_file_locationloaderImportErrormodule_from_specsysmodulesexec_module)r   r   specmodules       g/home/jay/workspace/.worktrees/task-2723-dev2/tests/regression/test_critical_gap_false_positive_2506.py_load_moduler      sr    >>11$=D|t{{*;D6BCC^^,,T2FCKKKKF#M    critical_gap_t2506teamsshared	verifierszcritical_gap.pyc                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)uS   FP1: '- 우선순위: critical' 단독 줄 → PASS (메타 정보, 이슈 아님).u   - 우선순위: critical
ztask-fp1.mdutf-8encodingztask-fp1report_pathstatusPASS==z%(py1)s == %(py4)spy1py4u>   FP1 메타 우선순위 라벨이 이슈로 오인식: status=
, details=details
>assert %(py6)spy6N
write_textcritical_gapverifystr
@pytest_ar_call_reprcompare	_saferepr_format_assertmsggetAssertionError_format_explanation	tmp_pathbodyreportresult@py_assert0@py_assert3@py_assert2@py_format5@py_format7s	            r   test_fp_priority_label_onlyrB   (   s    'D%F
dW-  V EF( v v%  v         &    IPXIYHZZdekeoeopyezd{|     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)un   FP2: '## task: [CRITICAL] 20개 컨셉' 헤더 → PASS (태스크 제목 우선순위 표기, 이슈 아님).u7   ## task: [CRITICAL] 20개 컨셉
본문 내용 없음.
ztask-fp2.mdr   r   ztask-fp2r   r    r!   r"   r$   r%   uH   FP2 태스크 헤더 우선순위 표기가 이슈로 오인식: status=r(   r)   r*   r+   Nr,   r8   s	            r   $test_fp_task_priority_bracket_headerrD   3   s    FD%F
dW-  V EF( v v%  v         &    SSYZbScRddnouoyoy  {D  pE  oF  	G     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)u_   FP3: '1. critical path 분석' 번호 목록 항목 → PASS (방법론 용어, 이슈 아님).u,   1. critical path 분석
2. 일정 최적화
ztask-fp3.mdr   r   ztask-fp3r   r    r!   r"   r$   r%   uB   FP3 critical path 방법론 용어가 이슈로 오인식: status=r(   r)   r*   r+   Nr,   r8   s	            r   test_fp_critical_path_in_listrF   >   s    ;D%F
dW-  V EF( v v%  v         &    MVT\M]L^^hioisist}i~h  	A     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)uw   FP4: SCQA 프레임 상황절 내 'critical chain 중복 투입 문제' → PASS (상황 묘사, 이슈 마커 아님).u3   ### S 상황
- critical chain 중복 투입 문제
ztask-fp4.mdr   r   ztask-fp4r   r    r!   r"   r$   r%   uA   FP4 SCQA 상황절 critical chain이 이슈로 오인식: status=r(   r)   r*   r+   Nr,   r8   s	            r   test_fp_critical_chain_in_scqarH   I   s    BD%F
dW-  V EF( v v%  v         &    LFS[L\K]]ghnhrhrs|h}g~     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)un   FP5: 보고서 첫줄 '- 작업 레벨: critical' 단독 → PASS (디스패치 레벨 메타, 이슈 아님).u;   - 작업 레벨: critical
작업이 완료되었습니다.
ztask-fp5.mdr   r   ztask-fp5r   r    r!   r"   r$   r%   u?   FP5 작업 레벨 메타 라벨이 이슈로 오인식: status=r(   r)   r*   r+   Nr,   r8   s	            r   *test_fp_dispatch_level_critical_first_linerJ   T   s    JD%F
dW-  V EF( v v%  v         &    J&QYJZI[[eflfpfpqzf{e|}     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)u}   FP6: '## [CRITICAL]' 대괄호 prefix만 있는 헤더 (이슈 본문 없음) → PASS (분류 헤더, 본문 이슈 없음).u   ## [CRITICAL]
작업 완료.
ztask-fp6.mdr   r   ztask-fp6r   r    r!   r"   r$   r%   uF   FP6 분류 헤더 [CRITICAL]이 미해결 이슈로 오인식: status=r(   r)   r*   r+   Nr,   r8   s	            r   $test_fp_bracket_critical_only_headerrL   _   s    ,D%F
dW-  V EF( v v%  v         &    QQWX`QaPbblmsmwmw  yB  nC  mD  	E     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)um   FP7: '이 작업은 critical thinking이 필요하다' 평문 문장 → PASS (일반 용어, 이슈 아님).u@   이 작업은 critical thinking이 필요하다.
분석 완료.
ztask-fp7.mdr   r   ztask-fp7r   r    r!   r"   r$   r%   uE   FP7 'critical thinking' 일반 문구가 이슈로 오인식: status=r(   r)   r*   r+   Nr,   r8   s	            r    test_fp_critical_thinking_phraserN   j   s    OD%F
dW-  V EF( v v%  v         &    PPVW_P`Oaaklrlvlv  xA  mB  lC  	D     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)ua   FP8: '- level: critical' 메타 라벨 → PASS (severity와 다른 level 필드, 이슈 아님).u(   - level: critical
작업 정상 완료.
ztask-fp8.mdr   r   ztask-fp8r   r    r!   r"   r$   r%   uC   FP8 'level: critical' 메타 라벨이 이슈로 오인식: status=r(   r)   r*   r+   Nr,   r8   s	            r   test_fp_level_critical_metarP   u   s    7D%F
dW-  V EF( v v%  v         &    NfU]N^M__ijpjtjtu~j  jA  	B     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)ue   FP9: 'dispatch level critical' 명시 → PASS (디스패치 시스템 레벨 태그, 이슈 아님).u5   dispatch level critical
모든 항목 처리 완료.
ztask-fp9.mdr   r   ztask-fp9r   r    r!   r"   r$   r%   uD   FP9 'dispatch level critical' 태그가 이슈로 오인식: status=r(   r)   r*   r+   Nr,   r8   s	            r   &test_fp_dispatch_level_critical_inlinerR      s    DD%F
dW-  V EF( v v%  v         &    OvV^O_N``jkqkukuv  lA  kB  	C     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)ui   FP10: '발사 우선순위: critical' → PASS (발사/배포 우선순위 메타 정보, 이슈 아님).u4   발사 우선순위: critical
배포 준비 완료.
ztask-fp10.mdr   r   z	task-fp10r   r    r!   r"   r$   r%   uK   FP10 '발사 우선순위: critical' 메타가 이슈로 오인식: status=r(   r)   r*   r+   Nr,   r8   s	            r    test_fp_launch_priority_criticalrT      s    CD&F
dW-  #f+ FF( v v%  v         &    VV\]eVfUggqrxr|r|  ~G  sH  rI  	J     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)ub   TP1: '## CRITICAL 이슈 1건 발견\n- token 누락' → FAIL (실제 이슈 헤더 + 미해결).u.   ## CRITICAL 이슈 1건 발견
- token 누락
ztask-tp1.mdr   r   ztask-tp1r   r    FAILr"   r$   r%   uF   TP1 CRITICAL 이슈 헤더 + 미해결이 감지되지 않음: status=r(   r)   r*   r+   Nr,   r8   s	            r   (test_tp_critical_issue_section_with_bodyrW      s    =D%F
dW-  V EF( v v%  v         &    QQWX`QaPbblmsmwmw  yB  nC  mD  	E     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)uc   TP2: '## 발견된 이슈\n- severity: critical' → FAIL (severity는 이슈 자체를 나타냄).u)   ## 발견된 이슈
- severity: critical
ztask-tp2.mdr   r   ztask-tp2r   r    rV   r"   r$   r%   u?   TP2 'severity: critical' 이슈가 감지되지 않음: status=r(   r)   r*   r+   Nr,   r8   s	            r   /test_tp_severity_critical_meta_in_issue_sectionrY      s    8D%F
dW-  V EF( v v%  v         &    J&QYJZI[[eflfpfpqzf{e|}     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)u`   TP3: '## 미해결 항목\n- CRITICAL: 누락' → FAIL (CRITICAL 리스트 마커 + 미해결).u'   ## 미해결 항목
- CRITICAL: 누락
ztask-tp3.mdr   r   ztask-tp3r   r    rV   r"   r$   r%   u=   TP3 'CRITICAL: 누락' 마커가 감지되지 않음: status=r(   r)   r*   r+   Nr,   r8   s	            r   #test_tp_unresolved_in_issue_sectionr[      s    6D%F
dW-  V EF( v v%  v         &    HxHXGYYcdjdndnoxdycz{     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)uf   TP4: '## 발견된 이슈\n- ![security-critical] 발견' → FAIL (보안 배지 마커 + 미해결).u2   ## 발견된 이슈
- ![security-critical] 발견
ztask-tp4.mdr   r   ztask-tp4r   r    rV   r"   r$   r%   uA   TP4 '![security-critical]' 배지가 감지되지 않음: status=r(   r)   r*   r+   Nr,   r8   s	            r   test_tp_security_critical_badger]      s    AD%F
dW-  V EF( v v%  v         &    LFS[L\K]]ghnhrhrs|h}g~     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)uu   TP5: '## CRITICAL 이슈\n- 보안 누락' (RESOLVED 마커 없음) → FAIL (이슈 있으나 해결 확인 없음).u#   ## CRITICAL 이슈
- 보안 누락
ztask-tp5.mdr   r   ztask-tp5r   r    rV   r"   r$   r%   uE   TP5 CRITICAL 이슈 + RESOLVED 없음이 감지되지 않음: status=r(   r)   r*   r+   Nr,   r8   s	            r   #test_tp_critical_no_resolved_markerr_      s    2D%F
dW-  V EF( v v%  v         &    PPVW_P`Oaaklrlvlv  xA  mB  lC  	D     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)uL   ZC1: '- HIGH/CRITICAL 0건' → PASS (0건 명시, 미해결 이슈 아님).)   ## 발견된 이슈
- HIGH/CRITICAL 0건
ztask-zc1.mdr   r   ztask-zc1r   r    r!   r"   r$   r%   u8   ZC1 '0건' 명시가 미해결 이슈로 오탐: status=r(   r)   r*   r+   Nr,   r8   s	            r    test_zc_high_critical_zero_countrb      s    8D%F
dW-  V EF( v v%  v         &    C6(CSBTT^_e_i_ijs_t^uv     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)uZ   ZC2: '- HIGH/CRITICAL 신규 0건' → PASS (신규 0건 명시, 미해결 이슈 아님).u0   ## 발견된 이슈
- HIGH/CRITICAL 신규 0건
ztask-zc2.mdr   r   ztask-zc2r   r    r!   r"   r$   r%   u?   ZC2 '신규 0건' 명시가 미해결 이슈로 오탐: status=r(   r)   r*   r+   Nr,   r8   s	            r   $test_zc_high_critical_new_zero_countrd      s    ?D%F
dW-  V EF( v v%  v         &    J&QYJZI[[eflfpfpqzf{e|}     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)uW   ZC3: '- 신규 HIGH/CRITICAL 없음' → PASS (부재 명시, 미해결 이슈 아님).u2   ## 발견된 이슈
- 신규 HIGH/CRITICAL 없음
ztask-zc3.mdr   r   ztask-zc3r   r    r!   r"   r$   r%   u:   ZC3 '없음' 명시가 미해결 이슈로 오탐: status=r(   r)   r*   r+   Nr,   r8   s	            r   test_zc_new_high_critical_nonerf      s    AD%F
dW-  V EF( v v%  v         &    EVHEUDVV`agakakluav`wx     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)ug   ZC4: '- 신규 HIGH/CRITICAL 없습니다' → PASS (부재 명시 격식체, 미해결 이슈 아님).u8   ## 발견된 이슈
- 신규 HIGH/CRITICAL 없습니다
ztask-zc4.mdr   r   ztask-zc4r   r    r!   r"   r$   r%   u@   ZC4 '없습니다' 명시가 미해결 이슈로 오탐: status=r(   r)   r*   r+   Nr,   r8   s	            r   %test_zc_new_high_critical_none_formalrh      s    GD%F
dW-  V EF( v v%  v         &    K6RZK[J\\fgmgqgqr{g|f}~     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)uK   ZC5: '- CRITICAL=0' → PASS (0건 등식 표기, 미해결 이슈 아님).u!   ## 발견된 이슈
- CRITICAL=0
ztask-zc5.mdr   r   ztask-zc5r   r    r!   r"   r$   r%   u>   ZC5 'CRITICAL=0' 등식이 미해결 이슈로 오탐: status=r(   r)   r*   r+   Nr,   r8   s	            r   test_zc_critical_equals_zerorj     s    0D%F
dW-  V EF( v v%  v         &    IPXIYHZZdekeoeopyezd{|     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)uT   ZC6: '- CRITICAL = 0' → PASS (공백 포함 0건 등식, 미해결 이슈 아님).u#   ## 발견된 이슈
- CRITICAL = 0
ztask-zc6.mdr   r   ztask-zc6r   r    r!   r"   r$   r%   u@   ZC6 'CRITICAL = 0' 등식이 미해결 이슈로 오탐: status=r(   r)   r*   r+   Nr,   r8   s	            r   test_zc_critical_eq_zero_spacedrl     s    2D%F
dW-  V EF( v v%  v         &    K6RZK[J\\fgmgqgqr{g|f}~     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)u   ZC7: '- HIGH: 0 / CRITICAL: 0' → PASS (양쪽 0건 명시, 미해결 이슈 아님).

    (round-2: narrowed ZERO_EXPR는 :/= 구분자 요구 → 콜론 표기로 보강)
    u,   ## 발견된 이슈
- HIGH: 0 / CRITICAL: 0
ztask-zc7.mdr   r   ztask-zc7r   r    r!   r"   r$   r%   uI   ZC7 'HIGH: 0 / CRITICAL: 0' 명시가 미해결 이슈로 오탐: status=r(   r)   r*   r+   Nr,   r8   s	            r   test_zc_high_zero_critical_zerorn     s    
 <D%F
dW-  V EF( v v%  v         &    TTZ[cTdSeeopvpzpz  |E  qF  pG  	H     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)uc   ZC8: '- fresh unresolved HIGH/CRITICAL = 0' → PASS (0건 등식 영문, 미해결 이슈 아님).u9   ## 발견된 이슈
- fresh unresolved HIGH/CRITICAL = 0
ztask-zc8.mdr   r   ztask-zc8r   r    r!   r"   r$   r%   uL   ZC8 'fresh unresolved ... = 0' 등식이 미해결 이슈로 오탐: status=r(   r)   r*   r+   Nr,   r8   s	            r    test_zc_fresh_unresolved_eq_zerorp   %  s    HD%F
dW-  V EF( v v%  v         &    WW]^fWgVhhrsys}s}  H  tI  sJ  	K     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)u   ZC9: '- no new high/critical: 0건' → PASS (영문 부재 명시, 미해결 이슈 아님).

    (round-2: narrowed ZERO_EXPR는 명시적 zero 표현 요구 → '0건' 보강)
    u1   ## 발견된 이슈
- no new high/critical: 0건
ztask-zc9.mdr   r   ztask-zc9r   r    r!   r"   r$   r%   uU   ZC9 'no new high/critical: 0건' 부재 명시가 미해결 이슈로 오탐: status=r(   r)   r*   r+   Nr,   r8   s	            r   test_zc_no_new_high_critical_enrr   0  s
   
 AD%F
dW-  V EF( v v%  v         &    ``fgo`p_qq{  }C  }G  }G  HQ  }R  |S  	T     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)u   ZC10: '- CRITICAL: SQL injection (수정 없음)' → FAIL.

    '수정 없음'은 fix 부재(=미해결 신호)이지 zero-count(이슈 0건)가 아니다.
    탐지력 보존 — 실제 미해결 critical이므로 FAIL이어야 함.
    u>   ## 발견된 이슈
- CRITICAL: SQL injection (수정 없음)
ztask-zc10.mdr   r   z	task-zc10r   r    rV   r"   r$   r%   uX   ZC10 '수정 없음'(fix 부재=미해결)이 zero-count로 오인되어 통과: status=r(   r)   r*   r+   Nr,   r8   s	            r   'test_zc_preserve_unresolved_fix_absencert   >  s
    ND&F
dW-  #f+ FF( v v%  v         &    ccijrcsbtt~  @F  @J  @J  KT  @U  V  	W     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)uc   ZC11: '- ![critical] 인증 우회' → FAIL (실제 미해결 critical 배지, zero-count 아님).u0   ## 발견된 이슈
- ![critical] 인증 우회
ztask-zc11.mdr   r   z	task-zc11r   r    rV   r"   r$   r%   uQ   ZC11 '![critical]' 미해결 배지가 zero-count로 오인되어 통과: status=r(   r)   r*   r+   Nr,   r8   s	            r   *test_zc_preserve_critical_badge_unresolvedrv   M  s   ?D&F
dW-  #f+ FF( v v%  v         &    \\bck\l[mmwx~  yC  yC  DM  yN  xO  	P     r   c                     t         j                  } d} | |      }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x} x}x}x}}y	)
u7   R2-1: 'HIGH/CRITICAL 0건' → zero-count 인정(True).u   - HIGH/CRITICAL 0건Tisz\%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s._is_zero_count_context
}(%(py4)s)
} is %(py9)sr.   py0py2r'   r+   py9assert %(py11)spy11N
r.   _is_zero_count_contextr1   r2   @py_builtinslocals_should_repr_global_namer3   r6   r7   @py_assert1r>   @py_assert5@py_assert8@py_assert7@py_format10@py_format12s          r   %test_r2_pass_high_critical_zero_countr   `  s    ..N/EN./EFN$NF$NNNNF$NNNNNN<NNN<NNN.NNN/ENNNFNNN$NNNNNNNNr   c                     t         j                  } d} | |      }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x} x}x}x}}y	)
u/   R2-2: 'CRITICAL=0' → zero-count 인정(True).z- CRITICAL=0Trx   rz   r.   r{   r   r   Nr   r   s          r   !test_r2_pass_critical_equals_zeror   e  s    ..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FFFFFFr   c                     t         j                  } d} | |      }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x} x}x}x}}y	)
uG   R2-3: 'fresh unresolved HIGH/CRITICAL = 0' → zero-count 인정(True).z$- fresh unresolved HIGH/CRITICAL = 0Trx   rz   r.   r{   r   r   Nr   r   s          r   %test_r2_pass_fresh_unresolved_eq_zeror   j  s    .. ... 	 	   	 v     I   I /  I 	/ I  I      r   c                     t         j                  } d} | |      }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x} x}x}x}}y	)
uP   R2-4: '신규 HIGH 없음 / 신규 CRITICAL 없음' → zero-count 인정(True).u-   - 신규 HIGH 없음 / 신규 CRITICAL 없음Trx   rz   r.   r{   r   r   Nr   r   s          r   ,test_r2_pass_new_high_none_new_critical_noner   q  s    .. 7.7 	 	   	 v     I   I /  I 	8 I  I      r   c                     t         j                  } d} | |      }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x} x}x}x}}y	)
uT   R2-5: '[CRITICAL] 인증 없음' → 미억제(False) — strong marker + vuln deny.u   [CRITICAL] 인증 없음Frx   rz   r.   r{   r   r   Nr   r   s          r   "test_r2_fail_critical_auth_missingr   z      ..S/IS./IJSeSJeSSSSJeSSSSSS<SSS<SSS.SSS/ISSSJSSSeSSSSSSSSr   c                     t         j                  } d} | |      }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x} x}x}x}}y	)
u=   R2-6: '[CRITICAL] 권한 검증 없음' → 미억제(False).u   [CRITICAL] 권한 검증 없음Frx   rz   r.   r{   r   r   Nr   r   s          r   #test_r2_fail_critical_authz_missingr     s    ..Z/PZ./PQZUZZQUZZZZZQUZZZZZZZ<ZZZ<ZZZ.ZZZ/PZZZQZZZUZZZZZZZZZr   c                     t         j                  } d} | |      }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x} x}x}x}}y	)
u9   R2-7: '[CRITICAL] 암호화 없음' → 미억제(False).u   [CRITICAL] 암호화 없음Frx   rz   r.   r{   r   r   Nr   r   s          r   (test_r2_fail_critical_encryption_missingr     s    ..V/LV./LMVQVVMQVVVVVMQVVVVVVV<VVV<VVV.VVV/LVVVMVVVQVVVVVVVVVr   c                     t         j                  } d} | |      }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x} x}x}x}}y	)
uY   R2-8: '[HIGH] secure_mode=0' → 미억제(False) — strong marker + secure_mode=0 deny.z[HIGH] secure_mode=0Frx   rz   r.   r{   r   r   Nr   r   s          r   "test_r2_fail_high_secure_mode_zeror         ..O/EO./EFO%OF%OOOOF%OOOOOO<OOO<OOO.OOO/EOOOFOOO%OOOOOOOOr   c                     t         j                  } d} | |      }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x} x}x}x}}y	)
uA   R2-9: '[HIGH] timeout=0' → 미억제(False) — timeout=0 deny.z[HIGH] timeout=0Frx   rz   r.   r{   r   r   Nr   r   s          r   test_r2_fail_high_timeout_zeror     s    ..K/AK./ABKeKBeKKKKBeKKKKKK<KKK<KKK.KKK/AKKKBKKKeKKKKKKKKr   c                     t         j                  } d} | |      }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x} x}x}x}}y	)
u@   R2-10: '[CRITICAL] port=0' → 미억제(False) — port=0 deny.z[CRITICAL] port=0Frx   rz   r.   r{   r   r   Nr   r   s          r   test_r2_fail_critical_port_zeror     s    ..L/BL./BCLuLCuLLLLCuLLLLLL<LLL<LLL.LLL/BLLLCLLLuLLLLLLLLr   c                     t         j                  } d} | |      }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x} x}x}x}}y	)
um   R2-11: '[CRITICAL] 신규 버그, 패치 없음' → 미억제(False) — strong marker + 패치 없음 deny.u'   [CRITICAL] 신규 버그, 패치 없음Frx   rz   r.   r{   r   r   Nr   r   s          r   &test_r2_fail_critical_new_bug_no_patchr     s    ..b/Xb./XYb]bbY]bbbbbY]bbbbbbb<bbb<bbb.bbb/XbbbYbbb]bbbbbbbbbr   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)uc   R2-12a: 이슈 섹션 내 '- [CRITICAL] 인증 없음' → verify FAIL (실제 미해결 critical).u/   ## 발견된 이슈
- [CRITICAL] 인증 없음
ztask-r2-12a.mdr   r   ztask-r2-12ar   r    rV   r"   r$   r%   uA   R2-12a '[CRITICAL] 인증 없음'이 억제되어 통과: status=r(   r)   r*   r+   Nr,   r8   s	            r   *test_r2_preserve_e2e_critical_auth_missingr     s    >D((F
dW-  CK HF( v v%  v         &    LFS[L\K]]ghnhrhrs|h}g~     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)uV   R2-12b: 이슈 섹션 내 '- [CRITICAL] 신규 버그, 패치 없음' → verify FAIL.u>   ## 발견된 이슈
- [CRITICAL] 신규 버그, 패치 없음
ztask-r2-12b.mdr   r   ztask-r2-12br   r    rV   r"   r$   r%   uA   R2-12b '[CRITICAL] 패치 없음'이 억제되어 통과: status=r(   r)   r*   r+   Nr,   r8   s	            r   &test_r2_preserve_e2e_critical_no_patchr     s    MD((F
dW-  CK HF( v v%  v         &    LFS[L\K]]ghnhrhrs|h}g~     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)u\   R2-12c: 이슈 섹션 내 '- HIGH/CRITICAL 0건' → verify PASS (zero-count 인정 보존).ra   ztask-r2-12c.mdr   r   ztask-r2-12cr   r    r!   r"   r$   r%   u    R2-12c '0건'이 오탐: status=r(   r)   r*   r+   Nr,   r8   s	            r   $test_r2_preserve_e2e_zero_count_passr     s    8D((F
dW-  CK HF( v v%  v         &    +6(+;*<JvzzR[G\F]^     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)uS   R3-1: '- CRITICAL 총0건' → PASS (한글 무공백 '총0건' zero-count 인정).u'   ## 발견된 이슈
- CRITICAL 총0건
ztask-r3-1.mdr   r   z	task-r3-1r   r    r!   r"   r$   r%   uQ   R3-1 '총0건' 한글 무공백 zero-count가 미해결 이슈로 오탐: status=r(   r)   r*   r+   Nr,   r8   s	            r   #test_r3_zc_total_zero_count_nospacer     s    6D&F
dW-  #f+ FF( v v%  v         &   "#:fjj.C-D	F     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)uh   R3-2: '- 이슈없음' → PASS (한글 무공백 '이슈없음' zero-count 인정, '이슈'가 anchor).u#   ## 발견된 이슈
- 이슈없음
ztask-r3-2.mdr   r   z	task-r3-2r   r    r!   r"   r$   r%   uV   R3-2 '이슈없음' 한글 무공백 zero-count가 미해결 이슈로 오탐: status=r(   r)   r*   r+   Nr,   r8   s	            r   test_r3_zc_issue_none_nospacer         2D&F
dW-  #f+ FF( v v%  v         &   "#:fjj.C-D	F     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)uh   R3-3: '- 이슈없다' → PASS (한글 무공백 '이슈없다' zero-count 인정, '이슈'가 anchor).u#   ## 발견된 이슈
- 이슈없다
ztask-r3-3.mdr   r   z	task-r3-3r   r    r!   r"   r$   r%   uV   R3-3 '이슈없다' 한글 무공백 zero-count가 미해결 이슈로 오탐: status=r(   r)   r*   r+   Nr,   r8   s	            r   #test_r3_zc_issue_none_plain_nospacer     r   r   c                     t         j                  } d} | |      }ddg}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x} x}x}x}}y
)uE   R4-parse: 'CRITICAL: 0, HIGH: 1' → [0, 1] (각 severity 별 count).CRITICAL: 0, HIGH: 1r      r"   z[%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.parse_severity_counts
}(%(py4)s)
} == %(py9)sr.   r{   r   r   N
r.   parse_severity_countsr1   r2   r   r   r   r3   r6   r7   r   s          r   test_r4_parse_mixed_colonr     s    --O.DO-.DEO!QOEOOOOEOOOOOO<OOO<OOO-OOO.DOOOEOOOOOOOOOOOr   c                     t         j                  } d} | |      }ddg}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x} x}x}x}}y
)u0   R4-parse: 'CRITICAL 0개, HIGH 2개' → [0, 2].   CRITICAL 0개, HIGH 2개r   r   r"   r   r.   r{   r   r   Nr   r   s          r    test_r4_parse_mixed_counter_unitr     s    --S.HS-.HISaQRVSIVSSSSIVSSSSSS<SSS<SSS-SSS.HSSSISSSVSSSSSSSSr   c                     t         j                  } d} | |      }dg}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x} x}x}x}}y	)
uQ   R4-parse: 'HIGH/CRITICAL 0건' → [0] (슬래시 결합 그룹은 단일 count).u   HIGH/CRITICAL 0건r   r"   r   r.   r{   r   r   Nr   r   s          r   test_r4_parse_group_single_zeror     s    --J.BJ-.BCJsJCsJJJJCsJJJJJJ<JJJ<JJJ-JJJ.BJJJCJJJsJJJJJJJJr   c                     t         j                  } d} | |      }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x} x}x}x}}y	)
uH   R4-1: 'CRITICAL: 0, HIGH: 1' → False (HIGH 1 탐지, suppress 금지).r   Frx   rz   r.   r{   r   r   Nr   r   s          r   %test_r4_mixed_zero_one_not_suppressedr     r   r   c                     t         j                  } d} | |      }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x} x}x}x}}y	)
uL   R4-2: 'CRITICAL 0개, HIGH 2개' → False (HIGH 2 탐지, suppress 금지).r   Frx   rz   r.   r{   r   r   Nr   r   s          r   %test_r4_mixed_zero_two_not_suppressedr   	  r   r   c                     t         j                  } d} | |      }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x} x}x}x}}y	)
uJ   R4-3: 'HIGH: 0 / CRITICAL: 0' → True (모든 count 0 → 억제 보존).zHIGH: 0 / CRITICAL: 0Trx   rz   r.   r{   r   r   Nr   r   s          r   test_r4_all_zero_suppressedr     s    ..O/FO./FGO4OG4OOOOG4OOOOOO<OOO<OOO.OOO/FOOOGOOO4OOOOOOOOr   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)u[   R4-4: 이슈 섹션 내 '- CRITICAL: 0, HIGH: 1' → verify FAIL (HIGH 1 미해결 탐지).u+   ## 발견된 이슈
- CRITICAL: 0, HIGH: 1
ztask-r4-4.mdr   r   z	task-r4-4r   r    rV   r"   r$   r%   u:   R4-4 mixed-count 'HIGH: 1'이 억제되어 통과: status=r(   r)   r*   r+   Nr,   r8   s	            r   test_r4_e2e_mixed_zero_one_failr     s    :D&F
dW-  #f+ FF( v v%  v         &    EVHEUDVV`agakakluav`wx     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)u_   R4-5: 이슈 섹션 내 '- CRITICAL 0개, HIGH 2개' → verify FAIL (HIGH 2 미해결 탐지).u/   ## 발견된 이슈
- CRITICAL 0개, HIGH 2개
ztask-r4-5.mdr   r   z	task-r4-5r   r    rV   r"   r$   r%   u=   R4-5 mixed-count 'HIGH: 2개'가 억제되어 통과: status=r(   r)   r*   r+   Nr,   r8   s	            r   test_r4_e2e_mixed_zero_two_failr   "  s    >D&F
dW-  #f+ FF( v v%  v         &    HxHXGYYcdjdndnoxdycz{     r   c                    d}| dz  }|j                  |d       t        j                  dt        |            }|d   }d}||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }t	        j                  d|d    d|j                  d             dz   d|iz  }t        t	        j                  |            dx}x}}y)uX   R4-6: 이슈 섹션 내 '- HIGH/CRITICAL 0건' → verify PASS (all-zero 억제 보존).ra   ztask-r4-6.mdr   r   z	task-r4-6r   r    r!   r"   r$   r%   u5   R4-6 'HIGH/CRITICAL 0건' all-zero가 오탐: status=r(   r)   r*   r+   Nr,   r8   s	            r   test_r4_e2e_all_zero_passr   -  s    8D&F
dW-  #f+ FF( v v%  v         &    @x@P?QQ[\b\f\fgp\q[rs     r   )H__doc__builtinsr   _pytest.assertion.rewrite	assertionrewriter1   importlib.utilr   r   pathlibr   __file__resolveparents	REPO_ROOT	WORKSPACEr0   r   r.   rB   rD   rF   rH   rJ   rL   rN   rP   rR   rT   rW   rY   r[   r]   r_   rb   rd   rf   rh   rj   rl   rn   rp   rr   rt   rv   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r   r   <module>r      s      
  N""$,,Q/		s $  ("[03DD&O
G
T
[
W
P
L
M
c$			(P
T
KP
TPr   