
    ejV                    N   d Z ddlmZ ddlmZmZ ddlmZ ddlm	Z	m
Z
 ddlZddlZddlZddlmZmZ  ee      j#                         j$                  d   Zed	z  d
z  dz  Zg dZg dZg dZe G d d             ZddZddZddZddZ	 	 	 d	 	 	 	 	 	 	 	 	 ddZddZeez   Zy)u  dispatch routing classifier — task-2473 false-positive hotfix.

task spec 본문에서 디자인/광고 작업을 분류할 때, 코드 블록/regex pattern/검증 컨텍스트
시그널을 인지해 코딩 작업의 false positive를 차단하는 분류기.
    )annotations)	dataclassfield)Path)OptionalListN)datetimetimezone   memoryzorchestration-auditzdispatch-routing-decision.jsonl)u	   디자인u   배너u	   이미지u	   포스터u   일러스트u   광고)designbannerimageposterillustrationad)zGemini gatezgemini gatezseverity badgezregression testu   회귀 테스트	hardeningu   검사 대상u   탐지u   휴리스틱u
   룰 정정zfalse positivezfalse-positivezqc-gatezqc gatezregex patternu   코드 블록z
code blocku   단어 경계zword boundaryu   dispatch 차단c                  v    e Zd ZU ded<   ded<    ee      Zded<    ee      Zded<   dZd	ed
<   dZ	ded<   y)RoutingDecisionstrclassificationresult)default_factory	List[str]matched_keywordscontext_signalsr   intscore raw_text_hashN)
__name__
__module____qualname____annotations__r   listr   r   r   r         G/home/jay/workspace/.worktrees/task-2658-dev6/utils/dispatch_routing.pyr   r   )   s?    K"'"=i=!&t!<OY<E3NM3r'   r   c                b    t        j                  dd|       } t        j                  dd|       } | S )u   백틱 인라인(`...`) 및 펜스(```...```) 코드 블록 제거.

    펜스 코드 블록은 ```부터 다음 ```까지(또는 EOF까지) 통째로 제거.
    인라인 코드는 single backtick으로 감싼 부분만 제거.
    z```[\s\S]*?(?:```|$) z	`[^`\n]*`resubtexts    r(   _strip_code_blocksr0   2   s.     66)35D66,T*DKr'   c                    t        j                  dd|       } t        j                  dd|       } t        j                  dd|       } t        j                  dd|       } | S )u   task spec 본문에서 regex 표현 안의 키워드 제거.

    대상:
    - r"...", r'...' (raw string literal)
    - 백슬래시 escape pattern (예: !\[(...)\], \(, \[)
    - 명시적 'regex pattern' 괄호 표현
    zr(['\"])(?:(?!\1).|\\.)*\1r*   z!\\\[[^\]]*\\\]z!\[[^\]]*\([^)]*\)[^\]]*\]z\\[\[\]()|]r+   r.   s    r(   _strip_regex_patternsr2   >   sT     66/d;D66$c40D66/d;D66.#t,DKr'   c                    g }| j                         }t        D ]&  }|j                         |v s|j                  |       ( t        t        j                  |            S )N)lowerCODING_CONTEXT_SIGNALSappendr%   dictfromkeys)r/   detected
text_lowersignals       r(   _detect_context_signalsr<   O   sQ    HJ( $<<>Z'OOF#$ h'((r'   c                8   g }| j                         }t        D ]  }||v s|j                  |        t        D ]A  }t	        j
                  dt	        j                  |       d|      s1|j                  |       C t        t        j                  |            S )u  단어 경계 기반 design keyword 매칭.

    한글 키워드는 단어 경계 개념이 다르므로 substring 사용 (단, 사전 코드/regex 제거됨).
    영어 키워드는 \b...\b 단어 경계 사용 (imagery, imagine 등 합성어 제외).
    z\b)
r4   DESIGN_KEYWORDS_KOr6   DESIGN_KEYWORDS_ENr,   searchescaper%   r7   r8   )r/   matchedr:   kws       r(   $_match_design_keywords_word_boundaryrD   W   s     GJ  NN2 ! 99299R=/,j9NN2 g&''r'   c                Z   t        |       }t        |      }t        |      }t        |       }t	        |      dt	        |      z  z
  }|dk\  rd}d}	nd}d}	t        j                  | j                  d            j                         dd	 }
t        ||	||||

      }|rt        |||       |S )uH  task_desc를 분류하고 audit jsonl에 기록.

    1. 백틱 코드 블록 제거
    2. regex pattern 제거
    3. context signals 검출
    4. 단어 경계 기반 design keyword 매칭
    5. 점수 = matched_count - 2 * context_signals_count
    6. score >= 1 → "design" + "block", 그 외 → "coding" + "allow"
       r   r   blockcodingallowutf-8N   )r   r   r   r   r   r    )task_id	task_file)r0   r2   rD   r<   lenhashlibsha256encode	hexdigestr   _append_audit)	task_descrL   rM   write_auditcleanedrB   signalsr   r   r   raw_hashdecisions               r(   classify_task_routingrZ   g   s     !+G#G,G27;G%i0GL1s7|++Ez!!~~i..w78BBDSbIH% H h9EOr'   c           
        t         j                  j                  dd       t        j                  t
        j                        j                  d      |xs d|xs d| j                  | j                  | j                  | j                  | j                  | j                  d	}	 t         j                  dd      5 }|j                  t!        j"                  |d	
      dz          d d d        y # 1 sw Y   y xY w# t$        $ r Y y w xY w)NT)parentsexist_okz%Y-%m-%dT%H:%M:%SZr   )	tsrL   rM   r   r   r   r   r   r    arJ   )encodingF)ensure_ascii
)
AUDIT_PATHparentmkdirr	   nowr
   utcstrftimer   r   r   r   r   r    openwritejsondumpsOSError)rY   rL   rM   entryfs        r(   rS   rS      s    D48ll8<<(112FG=b_"$55#33"11//!//
E__S7_3 	BqGGDJJu59D@A	B 	B 	B s0   #C9 :*C-$C9 -C62C9 6C9 9	DD)r/   r   returnr   )r/   r   rp   r   )NNT)
rT   r   rL   Optional[str]rM   rq   rU   boolrp   r   )rY   r   rL   rq   rM   rq   rp   None) __doc__
__future__r   dataclassesr   r   pathlibr   typingr   r   rO   rk   r,   r	   r
   __file__resolver\   	WORKSPACErc   r>   r?   r5   r   r0   r2   r<   rD   rZ   rS   FALLBACK_DESIGN_KEYWORDSr&   r'   r(   <module>r}      s   
 # (  !   	 'N""$,,Q/	!$99<]]
 a R  "   
")($ "#	,,, , 	,
 ,\( .0BB r'   