
    üi              
       B   d Z ddlZddlZdZg dZg dZ ej                  d      Z ej                  d      Z ej                  d       ej                  d	       ej                  d
       ej                  dej                         ej                  dej                        gZ
 ej                  dej                         ej                  d       ej                  d      gZ ej                  d       ej                  dej                         ej                  dej                         ej                  dej                         ej                  d      gZ ej                  d       ej                  d       ej                  d       ej                  d       ej                  d       ej                  dej                         ej                  dej                        gZdee   deeeef      fdZdee   dedefdZd%d ed!edefd"Zd#edefd$Zy)&u   
critical_gap.py - 보고서 CRITICAL 이슈 미수정 검증 verifier

보고서에서 CRITICAL 이슈가 보고되었으나 수정이 확인되지 않으면 FAIL.
    Nz"/home/jay/workspace/memory/reports)CRITICALcriticalu   심각u	   블로커)u   수정 완료u   해결fixedresolvedz\b(CRITICAL|critical)\bu:   (?:^|[\s,。、!?])(?:심각|블로커)(?:[\s,。、!?]|$)u5   ^\s*#{1,6}\s+.*(?:CRITICAL|critical|심각|블로커)u3   ^\s*[-*]\s+.*(?:CRITICAL|critical|심각|블로커)u4   ^\s*\d+\.\s+.*(?:CRITICAL|critical|심각|블로커)zseverity\s*[:=]\s*criticalz(!\[(?:security-critical|critical|high)\]z\*\*\[.*resolved.*\]\*\*u   ✅\s*RESOLVEDu   ~~.*(critical|심각).*~~u   수정\s*완료z	\bfixed\bz\bresolved\bu>   해결(?:됨|되었|되었음|됐|책|책을|책이|\s*완료)u   미\s*해결u   미\s*완료u   해결\s*되지\s*않u   해결\s*안\s*됨u   해결\s*못
unresolvedznot\s+(?:fixed|resolved)linesreturnc                 2   g }t        | d      D ]  \  }t        j                        st        j                        s1t	        fdt
        D              sJt	        fdt        D              rc|j                  |j                         f        |S )N   )startc              3   @   K   | ]  }|j                          y wNsearch.0plines     T/home/jay/workspace/.worktrees/task-2487-dev2/teams/shared/verifiers/critical_gap.py	<genexpr>z)_detect_critical_lines.<locals>.<genexpr>I   s     Aa188D>A   c              3   @   K   | ]  }|j                          y wr   r   r   s     r   r   z)_detect_critical_lines.<locals>.<genexpr>L   s     @!qxx~@r   )		enumerate_CRITICAL_RE_ENr   _CRITICAL_RE_KOanyISSUE_MARKER_PATTERNSRESOLVED_INLINE_PATTERNSappendstrip)r   foundir   s      @r   _detect_critical_linesr#   B   s    #%EU!, 
(4&&t,0F0Ft0LA+@AA@'?@@a&'
( L    critical_line_numc                     | |d D ]5  t        fdt        D              rt        fdt        D              s5 y y)u  
    critical_line_num 이후 줄에서 RESOLVED 마커 탐지. 부정 컨텍스트는 차단.

    Args:
        lines: 전체 줄 목록
        critical_line_num: CRITICAL 이슈가 발견된 줄 번호 (1-based)

    Returns:
        True if resolved marker found after critical_line_num (단, 같은 줄에
        부정 힌트가 있으면 해당 줄은 후보에서 제외).
    Nc              3   @   K   | ]  }|j                          y wr   r   r   s     r   r   z)_detect_resolved_after.<locals>.<genexpr>a   s     9!qxx~9r   c              3   @   K   | ]  }|j                          y wr   r   r   s     r   r   z)_detect_resolved_after.<locals>.<genexpr>d   s     :!qxx~:r   TF)r   _UNRESOLVED_HINTS_RESOLVED_PATTERNS)r   r%   r   s     @r   _detect_resolved_afterr+   R   sF     '() 9'899:'9:: r$   task_idreport_pathc                 v   | sddgdS |r|}n't         j                  j                  t        |  d      }t         j                  j	                  |      s	dd| gdS 	 t        |dd      5 }|j                         }d	d	d	       j                         }|r|j                         sddgdS t        |      }|s	dd| gdS g }g }	|D ]d  \  }
}t        ||
      }t        |      }|r|j                  d|
 d|        7|j                  d|
 d|        |	j                  d|
 d|        f |	r$|j!                  ddt#        |	       d       d|dS |j!                  ddt#        |       d       d|dS # 1 sw Y   xY w# t        $ r)}dd
t        |      j                   d| gdcY d	}~S d	}~ww xY w)u  
    보고서에서 CRITICAL 이슈 확인 + 수정 여부 검증.

    보고서 경로: /home/jay/workspace/memory/reports/{task_id}.md
    - CRITICAL 이슈가 있는데 수정 확인이 없으면 FAIL
    - CRITICAL 이슈가 있고 수정 확인도 있으면 PASS
    - CRITICAL 이슈가 없으면 PASS (이슈 없음)
    - 보고서 파일 없으면 SKIP
    - 빈 보고서 → PASS

    Returns:
        {"status": "PASS"|"FAIL"|"WARN"|"SKIP", "details": [...]}
    SKIPzNo task_id provided)statusdetailsz.mdzReport not found: rzutf-8)encodingNzFailed to read report: z: PASSu&   Report is empty — no CRITICAL issuesz$No CRITICAL issues found in report: zCRITICAL (line z) RESOLVED: z) UNRESOLVED: zline r   u	   FAIL — z CRITICAL issue(s) not resolvedFAILu	   PASS — z CRITICAL issue(s) all resolved)ospathjoinDEFAULT_REPORTS_DIRexistsopenreadOSErrortype__name__
splitlinesr    r#   r+   _extract_issue_descriptionr   insertlen)r,   r-   r7   fcontenter   critical_linesr1   r   line_numline_contentr   
issue_descs                 r   verifyrK   i   s     .C-DEE ww||/G9CA 77>>$,TF34
 	

$g. 	!ffhG	  E  .V-WXX ,E2N>tfEF
 	
 GJ"0 @,)%:/=
NN_XJl:,OPNN_XJnZLQRhZr*>?@ qIc*o%66UVW W55NN1	#n"5!66UVW11S	 	 
1$q'2B2B1C2aSIJ
 	

s6   F ,E:=F :F?F 	F8F3-F83F8r   c                     t        j                  dd|       j                         }t        |      dkD  r|dd dz   S |r|S | dd S )uA   CRITICAL 이슈 줄에서 설명 텍스트 추출 (최대 80자).z^[#\-*\d\.\s]+ P   Nu   …)resubr    rC   )r   cleaneds     r   rA   rA      sP     ff&D1779G
7|bs|e##7,49,r$   )rM   )__doc__r6   rO   r9   CRITICAL_KEYWORDSRESOLVED_KEYWORDScompiler   r   
IGNORECASEr   r   r*   r)   liststrtupleintr#   boolr+   dictrK   rA    r$   r   <module>r^      sB   
 	:  D  E  "**78"**Z[ BJJGHBJJEFBJJFGBJJ,bmm<BJJ:BMMJ  BJJ*BMM:BJJ !BJJ+,  BJJ!"BJJ|R]]+BJJ.BJJ "--0 BJJPQ	  BJJBJJBJJ'(BJJ$%BJJBJJ}bmm,BJJ*BMM: $s) U38_0E  $s)   .I2C I2c I24 I2X-S -S -r$   