
     jj+                       d Z ddlmZ ddlZddlmZ ddlZ ee      j                         j                  j                  j                  Z
 ee
      ej                  v r!ej                  j                   ee
             ej                  j                  d ee
             ddlmZmZmZmZmZmZmZ ddlmZmZmZmZmZ d Zd Zd	 Zd
 Z d Z!y)u  tests/regression/test_composite_v3_cross_cutting_2530.py

회귀 테스트 — task-2530 composite ③ 카테고리 dispatch 코드 정식 구현.

회장 §본질 (2026-05-10):
  composite 작업 3종 분류 중 ③ 카테고리(개발팀 물리봇 + 여러 팀 + 횡단조직 agent
  복합)가 미구현 상태였음. dispatch 코드를 정식 구현하여 cross-cutting agent를
  composite member로 합법적으로 받아들이고 페르소나를 합성한다.

회장 §명시 5 회귀 (정확히 5개):
  1. ① logical 1팀 회귀 — 기존 `--team marketing` 단일 경로 유지 (composite 미진입)
  2. ② logical 2~3팀 복합 회귀 — `--composite marketing,design` ②_logical_only 분류
  3. ③ logical + cross-cutting mix success — `--composite marketing,loki` → ③_mixed + 페르소나 합성
  4. ③ 잘못된 cross-cutting ID rejection — `--composite marketing,nonexistent` → ValueError
  5. ③ 페르소나 합성 검증 + trigger gate — prompt OFF/agent 라벨 + bot_status COMPOSITE_TRIGGER_KEYWORDS 동작
    )annotationsN)Path)COMPOSITE_ALL_ALLOWEDCOMPOSITE_ALLOWED_TEAMSCOMPOSITE_CROSS_CUTTING_AGENTSCOMPOSITE_TRIGGER_KEYWORDSCROSS_CUTTING_AGENT_LABELSHANDOFF_REQUIRED_FIELDSMAX_COMPOSITE_TEAMS)_build_composite_iii_prompt_build_persona_prompt_classify_composite_pattern_validate_composite_members_validate_composite_teamsc                    t        j                  t        d      5  t        d       ddd       dt        v sJ dt        v sJ dt        v sJ dt        v sJ t        t              dk(  sJ t        d	k(  sJ y# 1 sw Y   QxY w)
uh   ① logical 1팀: --team marketing 단일 위임 경로는 변경 없음 + composite 4팀 박제 유지.   2개 이상match	marketingNdesign
consulting
publishing      )pytestraises
ValueErrorr   r   lenr        L/home/jay/workspace/tests/regression/test_composite_v3_cross_cutting_2530.py!test_legacy_single_team_unchangedr"   5   s     
z	7 1#K01 1111....22222222&'1,,, !###1 1s   A88Bc                 .   t        d      } | ddgk(  sJ t        |       dk(  sJ t        d      }|g dk(  sJ t        |      dk(  sJ t        j                  t        d      5  t        d	       d
d
d
       t        d      ddgk(  sJ y
# 1 sw Y   xY w)ue   ② logical 2~3팀 복합: marketing,design은 ②_logical_only로 분류되고 기존 동작 유지.zmarketing,designr   r   u   ②_logical_onlyzmarketing,design,consulting)r   r   r   u   최대r   z&marketing,design,consulting,publishingN)r   r   r   r   r   r   )members2members3s     r!   -test_logical_only_composite_pattern_unchangedr&   I   s     ++=>HX....&x04FFFF ++HIH<<<<&x04FFFF 
z	2 N#$LMN %%78[(<SSSS	N Ns   $BBc                 <   h d} t         t        |       k(  sJ t        d      }|ddgk(  sJ t        |      dk(  sJ t        d      }t        |      dk(  sJ | D ],  }t        d|       }||v sJ d|v sJ t        |      dk(  r,J  t	        t
              d	k(  sJ y
)ua   ③ logical + cross-cutting mix: marketing,loki → ③_mixed 분류 + 7개 cross-cutting 통과.>   lokimaatatlasjanusvenuschronos
prometheuszmarketing,lokir   r(   u	   ③_mixedz	maat,lokiu   ③_cross_cutting_onlyz
marketing,   N)r   	frozensetr   r   r   r   )expected_agentsmemberscc_onlyagents       r!   (test_mixed_logical_cross_cutting_successr5   `   s     [O)Y-GGGG **:;G{F++++&w/;>>> *+6G&w/3KKKK ! C-
5'.BCg%%%*73{BBB	C $%+++r    c                 R   t        j                  t        d      5  t        d       ddd       t        j                  t        d      5  t        d       ddd       t        j                  t        d      5  t        d       ddd       t        j                  t        d      5  t	        d       ddd       t        j                  t        d      5  t        d	       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   ]xY w# 1 sw Y   yxY w)
u[   ③ 잘못된 cross-cutting ID: marketing,nonexistent → ValueError + alias 동일 거부.u   알 수 없는 composite 멤버r   zmarketing,nonexistentNzmarketing,dev1-teamu   중복 멤버zmarketing,marketingr    )r   r   r   r   r   r   r    r!   test_invalid_member_rejectionr8   }   s    	z)J	K =#$;<= 
z)J	K ;#$9:; 
z	9 ;#$9:; 
z)J	K ;!"9:; 
z	7 (#B'( (!= =; ;; ;; ;( (s;   C-C9:D)DD-C69DDDD&c                b   t        dgddg      }d|v sJ t        d   |v sJ t        d   |v sJ d|v sJ t        g ddg      }d|v sJ d|v rd|v sJ t        dgdgddd	
      }d|v sJ t        d   |v sJ d|v sJ d|v sJ t        dgdgddd
      }d|v sJ t        dgdgddd
      }d|v sJ t        ddh      t        v sJ t        ddh      t        v sJ t        ddh      t        v sJ t        ddh      t        v sJ h d}t
        t        |      k(  sJ | }|j                  dt        |             ddlm	}	  |	|      }
dgg ddgg dd|j                  |
dfd        |
j                  d!      dk(  sJ |
j                  d"      J |
j                  d$      d%k(  sJ y#)&uT  ③ 페르소나 합성: prompt에 'dev 본인 페르소나 OFF' + 로키/마아트 라벨 포함.

    추가로 utils/bot_status.py:367 보강이 동작하는지 검증:
      - trigger 키워드 미포함 → composite 후보 진입 X (기존 동작)
      - trigger 키워드 포함 + composite 키워드 매칭 → 후보 진입 O
    r   r(   r)   u   dev 본인 페르소나 OFFu   로키u	   마아트ztask-2530.persona-testu   redteam 검증 tasknormal)logical_memberscross_cutting_memberstask_id	task_desclevelu   redteam 공격 시나리오r   ztask-2530.crittcriticalz
[CRITICAL]r   ztask-2530.secsecurityz
[SECURITY]r   >      감사   검증   보안검토QCredteam   복합검증WORKSPACE_ROOTr   )BotStatusManager)workspace_rootu	   디자인)keywordsanti_keywordsrH   )r   	composite_load_logical_teamsc                      S )Nr   )fake_logical_teamss   r!   <lambda>z9test_persona_synthesis_and_trigger_gate.<locals>.<lambda>   s    <N r    u   디자인 작업u   일반 작업Nu   복합검증 작업rN   )r   r	   r   r0   r
   r   setenvstrutils.bot_statusrJ   setattrsuggest_team)tmp_pathmonkeypatchpersona_mixedpersona_cc_onlyfull_promptcritical_promptsecurity_promptexpected_triggersfake_workspacerJ   mgrrQ   s              @r!   'test_persona_synthesis_and_trigger_gaterb      s{    *;-&&9IJM(M999%f->>>%f->>>-''' ,B0@AO(O;;;&;/+III .$%h('K )K777%f-<<<#{222(K777 2%%h O ?***1!
%hO ?*** k6*+/FFFFh'(,CCCClF+,0GGGGlF+,0GGGG ^%3D)EEEE N'^)<=1
.
9C !,}rB#1"2RH 24NO ./8;;;O,444 12kAAAr    )"__doc__
__future__r   syspathlibr   r   __file__resolveparent_WORKTREE_ROOTrT   pathremoveinsertutils.composite_constantsr   r   r   r   r	   r
   r   dispatchr   r   r   r   r   r"   r&   r5   r8   rb   r   r    r!   <module>rp      s     # 
  
 h'')0077>>~#(("HHOOC'( 3~& '   $(T.,:(2QBr    