
    οi)                    .   d Z ddlmZ ddlZddlmZ  ee      j                         j                  d   Z	 e
e	      ej                  vr"ej                  j                  d e
e	             ddlm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y)u  tests/dispatch/test_routing_classification.py — task-2473 regression test.

dispatch.py 휴리스틱 false-positive hotfix 검증.

5건 시나리오:
1. 백틱 코드 블록 안의 디자인 키워드 → coding (false positive 없음)
2. regex pattern 안의 키워드 → coding
3. 코딩 컨텍스트 + 키워드 (Gemini gate / severity badge) → coding
4. 실제 디자인 작업 spec → design (true positive 보존)
5. 정상 코딩 작업 spec → coding (정상 동작 보존)
    )annotationsN)Path   )classify_task_routingc                     d} t        | d      }|j                  dk(  s.J d|j                   d|j                   d|j                          |j
                  dk(  sJ y	)
uA   백틱 코드 블록 안의 디자인 키워드는 coding 분류.u   task-X: hardening 작업.

    아래 패턴을 탐지해야 합니다 (코드 검증 대상):
    `image markdown severity badge` 형식의 표현
    `![high](...)` `![critical](...)` 등
    Fwrite_auditcodinguP   백틱 코드 블록 안의 디자인 키워드는 coding이어야 함. matched=
, signals=, score=allowNr   classificationmatched_keywordscontext_signalsscoreresult	task_descds     ]/home/jay/workspace/.worktrees/task-2487-C-dev2/tests/dispatch/test_routing_classification.py=test_backtick_code_block_design_keywords_classified_as_codingr      s    I 	iU;Ax' 
Z[\[m[mZnnxyz  zK  zK  yL  LT  UV  U\  U\  T]  	^' 88w    c                     d} t        | d      }|j                  dk(  s.J d|j                   d|j                   d|j                          |j
                  dk(  sJ y	)
u0   regex pattern 안의 키워드는 coding 분류.u   task-Y: regex pattern 휴리스틱 정정.

    다음 정규식 표현을 탐지: !\[(high|critical)\] 형식.
    raw string r"image|banner|design" 패턴.
    Fr   r
   u?   regex pattern 안의 키워드는 coding이어야 함. matched=r   r   r   Nr   r   s     r   7test_regex_pattern_design_keywords_classified_as_codingr   '   s    I
 	iU;Ax' 
I!J\J\I]]ghihyhygz  {C  DE  DK  DK  CL  	M' 88wr   c                    d} t        | d      }|j                  dk(  s.J d|j                   d|j                   d|j                          |j
                  dk(  sJ t        |j                        d	k\  sJ d
|j                          y)uM   코딩 컨텍스트 시그널 다수 + 디자인 키워드 → coding 분류.u  task-Z: Gemini gate severity badge 검증 hardening.

    regression test로 false positive 차단.
    qc-gate 룰 정정. 검사 대상 탐지 휴리스틱 보강.
    image 키워드도 본문에 등장하지만 코드 블록과 동등한 검증 컨텍스트.
    Fr   r
   uH   코딩 컨텍스트 시그널이 design을 override 해야 함. matched=r   r   r   r   u&   컨텍스트 시그널 검출 누락: Nr   r   r   r   r   r   lenr   s     r   4test_coding_context_signals_override_design_keywordsr   5   s    I 	iU;Ax' 
RSTSeSeRffpqr  rC  rC  qD  DL  MN  MT  MT  LU  	V' 88wq  !Q&d*PQRQbQbPc(dd&r   c                    d} t        | d      }|j                  dk(  s.J d|j                   d|j                   d|j                          |j
                  dk(  sJ t        |j                        d	k\  sJ d
|j                          y)uF   실제 디자인 작업 spec → design 분류 (true positive 보존).u   task-A: InsuRo 신규 광고 배너 디자인 제작.

    1080x1080 SNS 광고 이미지 5종.
    포스터 디자인 가이드라인 준수.
    배너 일러스트 색상 시안 검토.
    Fr   designu8   실제 디자인 작업은 design이어야 함. matched=r   r   blockr   u#   디자인 키워드 검출 누락: Nr   r   s     r   /test_real_design_task_spec_classified_as_designr#   E   s    I 	iU;Ax' 
B1CUCUBVV`abarar`ss{|}  }D  }D  |E  	F' 88wq!!"a'c+NqOaOaNb)cc'r   c                     d} t        | d      }|j                  dk(  sJ |j                  dk(  sJ |j                  g k(  sJ d|j                          y)uC   정상 코딩 작업 spec → coding 분류 (정상 동작 보존).u   task-B: API endpoint 추가 + DB 마이그레이션.

    /api/users 엔드포인트에 POST/PUT 추가.
    Postgres 스키마 변경 (users 테이블 컬럼 추가).
    pytest 단위 테스트 5건.
    Fr   r
   r   uB   정상 코딩 작업에 디자인 키워드 매칭되면 안 됨: N)r   r   r   r   r   s     r   ,test_normal_coding_task_classified_as_codingr%   U   sf    I 	iU;Ax'''88w#~'ijkj|j|i}%~~#r   c                
   | dz  }|j                  d|       t        dddd       t        dd	dd       |j                         sJ |j                  d
      j	                         j                  d      }t        |      dk(  sJ ddl}|j                  |d         }|j                  |d         }|d   dk(  sJ |d   dk(  sJ |d   dk(  sJ |d   d	k(  sJ |d   dk(  sJ |d   dk(  sJ dD ]  }||v rJ d|         y)u.   audit jsonl이 정상 append 되는지 확인.zdispatch-routing-decision.jsonlz!utils.dispatch_routing.AUDIT_PATHu"   새 광고 배너 디자인 제작ztest-1ztest.mdTtask_id	task_filer	   u   API 엔드포인트 추가ztest-2utf-8encoding
r   r   N   r(   r   r!   r   r"   r
   r   )	tsr(   r)   r   r   r   r   r   raw_text_hashzaudit entry missing field: )	setattrr   exists	read_textstripsplitr   jsonloads)tmp_pathmonkeypatch
fake_auditlinesr6   e1e2requireds           r   test_audit_jsonl_appends_entryr?   c   sM   ==J;ZH>\eswx6T]kop  ' 288:@@FEu:??	E!H	B	E!H	Bi=H$$$8+++h<7"""i=H$$$8+++h<7""" P H2~G!<XJGG~Hr   c                     d} t        | d      }|j                  dk(  sJ d|j                          d|j                  vsJ d|j                  vsJ y)	u;   imagery, imagine 같은 영어 합성어는 매칭 안 됨.zQtask-C: imagine a new feature with imagery rendering. designation system upgrade.Fr   r
   uM   imagery/imagine/designation은 단어 경계로 분리되어야 함. matched=imager!   N)r   r   r   r   s     r   $test_word_boundary_no_false_positiverB   z   sj    cIiU;Ax' 
WXYXjXjWkl' !,,,,,1-----r   c                 \   t         dz  dz  dz  } | j                         sddl}|j                  d       | j	                  d      }t        |d	t        |       d
      }|j                  dk(  s.J d|j                   d|j                   d|j                          |j                  dk(  sJ y)uG   task-2472 spec 본문 시뮬레이션 — false positive 차단 검증.memorytaskstask-2472.mdr   N   task-2472.md 없음r*   r+   z	task-2472Fr'   r
   uK   task-2472는 코드 hardening 작업이므로 coding이어야 함. matched=r   r   r   )	WORKSPACEr2   pytestskipr3   r   strr   r   r   r   r   )task_2472_pathrI   r   r   s       r   0test_task_2472_spec_simulation_no_false_positiverM      s    )G3nDN  ")*(('(:IiNH[inoAx' %%&j1B1B0C8AGG9	V' 88wr   c                     d} t        | d      }|j                  dk(  s!J d|j                   d|j                          d|j                  vst	        |j
                        dk\  sJ y	y	)
up   raw string 안에 이스케이프된 따옴표가 있어도 strip이 끊기지 않음 (마아트/Gemini 발견).u}   task-Q: regex 작업. raw string r"image quote \" middle quote \" end" 패턴 처리.
hardening regression test 컨텍스트.Fr   r
   u[   이스케이프된 따옴표가 있어도 raw string 전체가 strip되어야 함. matched=r   rA   r.   N)r   r   r   r   r   r   r   s     r   &test_escaped_quote_in_raw_string_striprO      s    	2  	iU;Ax' %%&hqwwi	9' !,,,A4E4E0F!0KKK0K,r   c                     d} t        | d      }t        |j                  t              sJ |j                  dk(  s.J d|j
                   d|j                   d|j                          y)	u   닫히지 않은 펜스 코드 블록도 분류기가 crash하지 않고 정확히 분류 (마아트/Gemini 발견).

    펜스가 닫히지 않아도 코드 블록 안의 디자인 키워드가 false positive를 만들지 않아야 함.
    u   task-R: hardening regression test.
```python
design_keywords = ['디자인']  # 닫히지 않은 펜스 (의도적 edge case)
이미지 광고 배너 키워드도 본문에 등장하나 코드 검증 컨텍스트임.
Fr   r
   uI   닫히지 않은 펜스 안의 키워드는 coding이어야 함. matched=r   r   N)r   
isinstancer   intr   r   r   r   s     r   'test_unclosed_code_fence_does_not_crashrS      sx    	g  	iU;Aaggs###x' %%&j1B1B0C8AGG9	V'r   c                 ,   ddl } ddl}ddl}t        }|dz  dz  dz  }|j	                         sddl}|j                  d       | j                  ddd	t        |      d
gt        |      dddi |j                  dt        |      i      }|j                  dk(  sJ d|j                          |j                  |j                  j                         j                         d         }|d   dk(  sJ |d   du sJ |d   dk(  s
J d|        |d   du sJ y)uT   CLI 통합: dispatch.py --task-file task-2472.md --dry-run → qc-gate 미트리거.r   NrD   rE   rF   rG   python3dispatch.py--task-file	--dry-runT   
PYTHONPATHcwdcapture_outputtexttimeoutenv   dry-run 실패: stderr=statusokdry_runr   r
   u"   task-2472는 coding이어야 함: qc_gate_triggeredF)
subprocessr6   osrH   r2   rI   rJ   runrK   environ
returncodestderrr7   stdoutr4   
splitlines)rg   _jsonrh   repo	task_2472rI   r   payloads           r   .test_dispatch_cli_dry_run_task_2472_no_qc_gaters      s2   ((Dx')N:I)*^^	M=#i.+NIdr3rzz3<T3  F
 !L%<V]]O#LL!kk&----/::<R@AG8$$$9%%%#$0`4VW^V_2``0&'5000r   c                    ddl } ddl}ddl}ddl}t        }d}|j                  dddd      5 }|j                  |       |j                  }ddd       	 | j                  d	d
ddgt        |      dddi |j                  dt        |      i      }|j                  dk(  sJ d|j                          |j                  |j                  j                         j!                         d         }	|	d   dk(  sJ |	d   dk(  sJ |	d   du sJ 	 ddl}
|
j#                  |       y# 1 sw Y   xY w# ddl}
|
j#                         w xY w)uW   CLI 통합: 실제 디자인 spec dry-run → qc-gate 트리거 (true positive 보존).r   Nu   # task-design-test: InsuRo 광고 배너 디자인 제작

- 1080x1080 SNS 광고 이미지 5종
- 포스터 디자인 + 일러스트 색상 시안
- 배너 시안 검토
wz.mdFr*   )suffixdeleter,   rU   rV   rW   rX   TrY   rZ   r[   ra   rb   r   r!   r   r"   rf   )rg   r6   rh   tempfilerH   NamedTemporaryFilewritenameri   rK   rj   rk   rl   r7   rm   r4   rn   unlink)rg   ro   rh   rx   rp   specf	spec_pathr   rr   _oss              r   ,test_dispatch_cli_dry_run_design_task_blocksr      sR   22D	# 	 
	$	$Suw	$	W [\	FF	}iMD	$T272::7|SY7   

   A%P)@'PP%++fmm113>>@DE'(H444x G+++*+t333

9!  	

9s   D$B8D0 $D-0E)__doc__
__future__r   syspathlibr   __file__resolveparentsrH   rK   pathinsertutils.dispatch_routingr   r   r   r   r#   r%   r?   rB   rM   rO   rS   rs   r    r   r   <module>r      s   
 # 
  N""$,,Q/	y>!HHOOAs9~& 8e d H..L(1*r   