
    )Ti                         d Z ddlZddlZddlmZ g dddgg ddgd	Zd
gddgdgdgdZdZdede	ee
e   f   de
e	   fdZdede
e   fdZddedee
e      de	fdZy)u  
two_pass_audit.py - 2-pass 구조적 감사 verifier (gstack /review 패턴)

Pass 1 (CRITICAL): 자동 블록 — 하나라도 발견 시 FAIL
Pass 2 (INFORMATIONAL): 경고만 — 발견 시 WARN

출처: gstack /review 스킬 (MIT 라이선스, https://github.com/garrytan/gstack)
    N)Optional)zexecute\s*\(z
\.raw\s*\(zDROP\s+TABLEzDELETE\s+FROM\s+\w+\s*$zTRUNCATE\s+TABLEz UPDATE\s+\w+\s+SET\s+.*(?!WHERE)zglobal\s+\w+z>threading\.(?!Lock|RLock|Event|Semaphore|Condition|Barrier)\w+)z	eval\s*\(z	exec\s*\(zsubprocess\..*shell\s*=\s*Truezos\.system\s*\(z.#\s*TODO.*switch|#\s*TODO.*case|#\s*TODO.*enum)zSQL & Data SafetyzRace ConditionszLLM Output Trust BoundaryzEnum/Value Completenessz4(?<!\w)(?:0x[\da-fA-F]+|\d{3,})\b(?!\s*[=:]\s*['\"])z%#\s*(?:UNUSED|DEPRECATED|DEAD|REMOVE)zpass\s*$zdef\s+\w+\(.*\).*:\s*$z*for\s+\w+\s+in\s+.*:\s*\n\s*for\s+\w+\s+in)zMagic Numbersz	Dead Codez	Test GapsPerformancez"/home/jay/workspace/memory/reportsfilepathpatternsreturnc                 "   g }	 t        | ddd      5 }|j                         }ddd       j                         }|j                         D ]  \  }}|D ]  }t	        |d      D ]n  \  }	}
|
j                         }|j                  d      rd	|vr,|j                  d
      r>	 t        j                  ||
      r|j                  || |	||dd d       p   	 |S # 1 sw Y   xY w# t        j                  $ r Y w xY w# t        $ r Y |S w xY w)u3   파일을 스캔하여 패턴 매칭 결과 반환.rutf-8ignore)encodingerrorsN   )start#TODO)zr"zr'zr"""zr'''"'d   )categoryfilelinepatterncontent)openread
splitlinesitems	enumeratestrip
startswithresearchappenderrorOSError)r   r   findingsfr   linesr   regexesregexir   strippeds               A/home/jay/workspace/teams/dev1/qc/verifiers.bak/two_pass_audit.py
_scan_filer.   ;   s1   H(C'(C 	qffhG	""$!)!1 	Hg  (a8 GAt#zz|H**3/F(4J **+QR 99UD1$OO08,4,-/4/7~!"	2 O9	 	0 88  OsL   D CA>D #0C(D C%!D (C>	;D =C>	>D 	DDtask_idc                    t         j                  j                  t        |  d      }t         j                  j	                  |      sg S g }	 t        |dd      5 }|j                         }ddd       t        j                  d      }|D ]3  }t         j                  j                  |      s#|j                  |       5 	 |S # 1 sw Y   ZxY w# t        $ r Y |S w xY w)uA   task_id 기반으로 보고서에서 변경 파일 목록 추출.z.mdr	   r
   )r   Nz+(/home/jay/workspace/\S+\.(?:py|js|ts|tsx)))ospathjoinDEFAULT_REPORTS_DIRexistsr   r   r!   findallisfiler#   r%   )r/   report_pathfilesr'   r   pathsps          r-   _get_check_filesr<   ^   s    '',,2wisODK77>>+&	E	+sW5 	ffhG	 

I7S 	 Aww~~a Q	 
 L	 	  Ls1   C C+AC .C C	C 	CCcheck_filesc                    | sddgdS |xs t        |       }|sddgdS g }g }g }|D ]V  }|j                  d      st        |t              }|j	                  |       t        |t
              }	|j	                  |	       X |r|j                  dt        |       d       |dd	 D ]+  }
|j                  d
|
d    d|
d    d|
d    d|
d           - t        |      d	kD  r!|j                  dt        |      d	z
   d       |r|j                  dt        |       d       |dd	 D ]+  }
|j                  d|
d    d|
d    d|
d    d|
d           - t        |      d	kD  r!|j                  dt        |      d	z
   d       |s |s|j                  dt        |       d       |j                  dt        |              |rd|dS |rd|dS d|dS )ub  
    2-pass 구조적 감사 실행.

    Pass 1 CRITICAL 발견 → FAIL
    Pass 2 INFORMATIONAL 발견 → WARN
    아무것도 없으면 → PASS

    Args:
        task_id: 검증할 task ID
        check_files: 검사할 파일 목록 (없으면 보고서에서 추출)

    Returns:
        {"status": "PASS"|"FAIL"|"WARN", "details": [...]}
    SKIPzNo task_id provided)statusdetailsz?No files to audit (no check_files and no files found in report))z.pyz.jsz.tsz.tsxzPass 1 CRITICAL: z finding(s)N
   z  [CRITICAL] r   u    — r   :r   r   z
  ... and z morezPass 2 INFORMATIONAL: z	  [INFO] z2-pass audit clean: z file(s) scanned, 0 findingszFiles scanned: FAILWARNPASS)r<   endswithr.   CRITICAL_PATTERNSextendINFORMATIONAL_PATTERNSr#   len)r/   r=   kwargsr9   rA   pass1_findingspass2_findingsr   p1p2r'   s              r-   verifyrQ   r   sB     .C-DEE4+G4EYZ
 	

 GNN "  !>?"34b!"89b!" *3~+>*?{KL$ 	kANN]1Z=/qyk1V9+UZ[\]f[gZhij	k~#NNZN(;b(@'AGH/N0C/DKPQ$ 	gANNYq}oU1V9+QqykQVWXYbWcVdef	g~#NNZN(;b(@'AGH.-c%j\9UVWNN_SZL12  W55	 W55 W55    )N)__doc__r1   r!   typingr   rH   rJ   r4   strdictlistr.   r<   rQ    rR   r-   <module>rY      s    
 	  	I" 	: ' 6 	@ 	1
 	" 	6   ;    S$s)^(<  d  Fc d3i (A6C A6htCy&9 A6t A6rR   