
    (<i$                        d Z ddlZddlZddlmZ ddlmZmZ ddlZ eej                  j                  dd            Z ee      ej                  vr"ej                  j                  d ee             ddlmZ  ej$                         d        Z G d d	      Z G d
 d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d  d!      Z  G d" d#      Z! G d$ d%      Z" G d& d'      Z# G d( d)      Z$ G d* d+      Z% G d, d-      Z& G d. d/      Z'y)0u  
test_team_prompts.py

prompts/team_prompts.py 단위 테스트 (아르고스 작성)

테스트 항목:
- build_prompt(): 팀별 올바른 프롬프트 생성 (dev1/dev2/dev3)
- level별 차이 (normal / critical / security)
- project_id 유무에 따른 경로 차이
- 잘못된 team_id → ValueError 발생

주의: build_prompt()는 WORKSPACE_ROOT/memory/tasks/<task_id>.md 에
task_desc를 저장한다. monkeypatch + tmp_path로 Path 생성 경로를 오버라이드.
    N)Path)	MagicMockpatchWORKSPACE_ROOTz/home/jay/workspacec                       dz  dz  }|j                  dd       t        j                  }d fd	}|j                  t        d|       |S )u   team_prompts.build_prompt에서 하드코딩된 경로를 tmp_path로 교체.

    실제 WORKSPACE/memory/tasks/ 에 파일을 쓰지 않도록
    Path.write_text와 mkdir를 tmp_path 기준으로 우회한다.
    memorytasksTparentsexist_okc                    t         j                  j                  |       }|st        d|        t	        dz  dz  | dz        }dz  dz  | dz  j                  |d       t	        t              }|dd }d	| d
| d|  d| d	}	d	| d| }
| d| d}|d   dk(  rt        j                  || ||||	|
||	      }nE|d   dk(  rt        j                  || ||||	|
||	      }nt        j                  || ||||	|
||	      }|t        j                  ||      z  }|t        j                  ||      z  }|dk(  rd|z   }|S |dk(  rd|z   }|S )uT   task 파일을 tmp_path에 저장한 뒤 나머지 프롬프트 생성 로직 실행u   알 수 없는 팀 ID: r   r	   z.mdutf-8encodingN   zpython3 z/memory/task-timer.py start z --team z	 --desc ""z/memory/task-timer.py end z/memory/reports/typedirect
project_idmcpcriticalum   **[CRITICAL] 이 작업은 중요도 critical입니다. 품질 우선으로 신중하게 작업하세요.**

securityue   **[SECURITY] 이 작업은 보안 중요 작업입니다. 보안 최우선으로 작업하세요.**

)tp	TEAM_INFOget
ValueErrorstr
write_text
_WORKSPACE_build_direct_prompt_build_mcp_prompt_build_glm_prompt_build_three_docs_section_build_verification_section)team_idtask_id	task_desclevelr   teamtask_file_path_real_ws
short_desctimer_start	timer_endreport_pathprompttmp_paths                H/home/jay/workspace/.worktrees/task-2057-dev2/tests/test_team_prompts.py_safe_buildz)patched_build_prompt.<locals>._safe_build/   s    ||(6wi@AA "(X"5"?WIS/"QR	H	w	&G9C	8DDYY`Da*os^
 %A',W^V__hishttuvse#=gYG	-gYc:<8#,,#%
F &\U"))#%
F ))%
F 	"..w>>"00@@J G  JP  PF  j ~  BH  HF    build_prompt)normalN)mkdirr   r6   setattr)r2   monkeypatchtask_diroriginal_buildr4   s   `    r3   patched_build_promptr=   #   sM     ("W,HNN4$N/__N>@ NK8r5   c                   F    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)TestBuildPromptTeamContentuP   각 팀에 맞는 팀장/팀원 정보가 프롬프트에 포함되는지 확인c                 $     |ddd      }d|v sJ y )N	dev1-teamtask-1.1   로그인 페이지 개발   헤르메스 selfr=   r1   s      r3   test_dev1_team_contains_hermesz9TestBuildPromptTeamContent.test_dev1_team_contains_hermes{   s    %k:?[\'''r5   c                 D     |ddd      }dD ]  }||v rJ d| d        y )NrA   rB   rC   )   불칸	   이리스	   아테나   아르고스u"   dev1-team 프롬프트에 팀원 '   ' 누락rE   rG   r=   r1   members       r3   #test_dev1_team_contains_all_membersz>TestBuildPromptTeamContent.test_dev1_team_contains_all_members   s@    %k:?[\J 	[FV#Z'I&QY%ZZ#	[r5   c                 $     |ddd      }d|v sJ y )N	dev2-teamtask-2.1   API 서버 구축u   오딘rE   rF   s      r3   test_dev2_team_contains_odinz7TestBuildPromptTeamContent.test_dev2_team_contains_odin   s    %k:?RS6!!!r5   c                 D     |ddd      }dD ]  }||v rJ d| d        y )NrS   rT   rU   )   토르   프레이야u	   미미르u	   헤임달u"   dev2-team 프롬프트에 팀원 'rN   rE   rO   s       r3   #test_dev2_team_contains_all_membersz>TestBuildPromptTeamContent.test_dev2_team_contains_all_members   s@    %k:?RSJ 	[FV#Z'I&QY%ZZ#	[r5   c                 $     |ddd      }d|v sJ y )N	dev3-teamztask-3.1    데이터 파이프라인 구축u	   다그다rE   rF   s      r3   test_dev3_team_contains_dagdaz8TestBuildPromptTeamContent.test_dev3_team_contains_dagda   s    %k:?abf$$$r5   c                 $     |ddd      }d|v sJ y )N	dev8-teamtask-8.1r]      라rE   rF   s      r3   test_dev8_team_contains_raz5TestBuildPromptTeamContent.test_dev8_team_contains_ra   s    %k:?abr5   c                 8     |ddd      }d|v sd|v sd|v sJ yyy)ua   dev8-team은 MCP 타입이므로 glm_backend 등 MCP tool 관련 키워드가 포함되어야 함r`   ra   r]   glm_backendglm_frontendMCPNrE   rF   s      r3   !test_dev8_team_contains_mcp_toolsz<TestBuildPromptTeamContent.test_dev8_team_contains_mcp_tools   s4    %k:?ab&.F*BevoUUo*B&r5   c                 $     |ddd      }d|v sJ y)u]   dev8-team(GLM 타입)은 openclaw에 위임하므로 팀원 목록 대신 팀 ID가 포함됨r`   ra   r]   NrE   rF   s      r3   test_dev8_team_contains_team_idz:TestBuildPromptTeamContent.test_dev8_team_contains_team_id   s    %k:?abf$$$r5   c                 $     |ddd      }d|v sJ y )NrA   z	task-42.1u   특정 태스크 테스트rE   rF   s      r3   test_prompt_contains_task_idz7TestBuildPromptTeamContent.test_prompt_contains_task_id   s    %k;@\]f$$$r5   N)__name__
__module____qualname____doc__rH   rQ   rV   rZ   r^   rc   rh   rj   rl   rE   r5   r3   r?   r?   x   s5    Z([
"[
%V
%
%r5   r?   c                   X    e 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d Zd Zy)TestBuildPromptLevelsuA   normal / critical / security 레벨별 프롬프트 차이 검증c                 (     |dddd      }d|v sJ y)u"   normal: 셀프 QC 섹션만 포함rA   rB      작업r7   r)      검증 레벨:NrE   rF   s      r3   test_normal_contains_selfcheckz4TestBuildPromptLevels.test_normal_contains_selfcheck   s     %k:xxX6)))r5   c                 (     |dddd      }d|vsJ y)u    normal: [CRITICAL] 문구 없음rA   rB   rt   r7   ru   
[CRITICAL]NrE   rF   s      r3   ,test_normal_does_not_contain_critical_markerzBTestBuildPromptLevels.test_normal_does_not_contain_critical_marker        %k:xxX6)))r5   c                 (     |dddd      }d|vsJ y)u    normal: [SECURITY] 문구 없음rA   rB   rt   r7   ru   
[SECURITY]NrE   rF   s      r3   ,test_normal_does_not_contain_security_markerzBTestBuildPromptLevels.test_normal_does_not_contain_security_marker   r{   r5   c                 (     |dddd      }d|v sJ y)u6   critical: [CRITICAL] 문구 프롬프트 상단 포함rA   rB   rt   r   ru   ry   NrE   rF   s      r3   &test_critical_contains_critical_markerz<TestBuildPromptLevels.test_critical_contains_critical_marker        %k:xzZv%%%r5   c                 (     |dddd      }d|v sJ y)u=   critical: 검증 레벨이 critical로 전달되는지 확인rA   rB   rt   r   ru      검증 레벨: criticalNrE   rF   s      r3   $test_critical_contains_maat_subagentz:TestBuildPromptLevels.test_critical_contains_maat_subagent        %k:xzZ(F222r5   c                 (     |dddd      }d|vsJ y)u"   critical: [SECURITY] 문구 없음rA   rB   rt   r   ru   r}   NrE   rF   s      r3   .test_critical_does_not_contain_security_markerzDTestBuildPromptLevels.test_critical_does_not_contain_security_marker   s     %k:xzZ6)))r5   c                 (     |dddd      }d|v sJ y)u6   security: [SECURITY] 문구 프롬프트 상단 포함rA   rB   rt   r   ru   r}   NrE   rF   s      r3   &test_security_contains_security_markerz<TestBuildPromptLevels.test_security_contains_security_marker   r   r5   c                 (     |dddd      }d|v sJ y)u=   security: 검증 레벨이 security로 전달되는지 확인rA   rB   rt   r   ru      검증 레벨: securityNrE   rF   s      r3   $test_security_contains_maat_subagentz:TestBuildPromptLevels.test_security_contains_maat_subagent   r   r5   c                 0     |dddd      }d|v rd|v sJ y)	u@   security: 검증 레벨 security이고 QC-RULES.md 참조 포함rA   rB   rt   r   ru   r   QC-RULES.mdNrE   rF   s      r3   $test_security_contains_loki_subagentz:TestBuildPromptLevels.test_security_contains_loki_subagent   s*    %k:xzZ(F2}7NNN7Nr5   c                 (     |dddd      }d|v sJ y)u=   security: 셀프 QC도 포함 (critical 요소 모두 상속)rA   rB   rt   r   ru   rv   NrE   rF   s      r3    test_security_contains_selfcheckz6TestBuildPromptLevels.test_security_contains_selfcheck   s     %k:xzZ6)))r5   c                 (     |dddd      }d|v sJ y)u=   critical: [CRITICAL] 문구가 프롬프트 맨 앞에 위치rA   rB   rt   r   ru   **[CRITICAL]NrE   rF   s      r3   'test_critical_marker_at_start_of_promptz=TestBuildPromptLevels.test_critical_marker_at_start_of_prompt        %k:xzZ'''r5   c                 (     |dddd      }d|v sJ y)u=   security: [SECURITY] 문구가 프롬프트 맨 앞에 위치rA   rB   rt   r   ru   **[SECURITY]NrE   rF   s      r3   'test_security_marker_at_start_of_promptz=TestBuildPromptLevels.test_security_marker_at_start_of_prompt   r   r5   N)rm   rn   ro   rp   rw   rz   r~   r   r   r   r   r   r   r   r   r   rE   r5   r3   rr   rr      sB    K*
*
*
&
3
*
&
3
O
*
(
(r5   rr   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestBuildPromptProjectIdu\   project_id 없음 → DIRECT-WORKFLOW.md 참조, project_id 있음 → project_id 값 포함c                 (     |dddd      }d|v sJ y)u>   project_id=None: DIRECT-WORKFLOW.md 참조 포함 (direct 팀)rA   rB      작업 설명Nr   DIRECT-WORKFLOW.mdrE   rF   s      r3   /test_no_project_id_contains_system_task_messagezHTestBuildPromptProjectId.test_no_project_id_contains_system_task_message   s!    %k:[_`#v---r5   c                 (     |dddd      }d|v sJ y)u=   project_id='myproj': 'project_id: myproj' 포함 (direct 팀)rA   rB   r   myprojr   project_id: myprojNrE   rF   s      r3   %test_project_id_contains_project_pathz>TestBuildPromptProjectId.test_project_id_contains_project_path   s!    %k:[cd#v---r5   c                 (     |dddd      }d|v sJ y)uA   project_id=None, dev8-team(GLM): DIRECT-WORKFLOW.md 참조 포함r`   ra   
   GLM 작업Nr   r   rE   rF   s      r3   0test_no_project_id_glm_team_contains_system_taskzITestBuildPromptProjectId.test_no_project_id_glm_team_contains_system_task   s!    %k:|X\]#v---r5   c                 (     |dddd      }d|v sJ y)uD   project_id='testproj', dev8-team(GLM): 'project_id: testproj' 포함r`   ra   r   testprojr   project_id: testprojNrE   rF   s      r3   .test_project_id_glm_team_contains_project_pathzGTestBuildPromptProjectId.test_project_id_glm_team_contains_project_path   s!    %k:|Xbc%///r5   c                 (     |dddd      }d|v sJ y)u2   project_id 지정 시 'project_id: sandbox' 포함rS   rT   u   격리 테스트sandboxr   zproject_id: sandboxNrE   rF   s      r3   &test_project_id_isolation_rule_presentz?TestBuildPromptProjectId.test_project_id_isolation_rule_present  s"    %k:?Q^gh$...r5   N)	rm   rn   ro   rp   r   r   r   r   r   rE   r5   r3   r   r      s    f.
.
.
0
/r5   r   c                   "    e Zd ZdZd Zd Zd Zy)TestBuildPromptInvalidTeamIduE   알 수 없는 팀 ID 전달 시 ValueError가 발생하는지 검증c                 x    t        j                  t        d      5   |ddd       d d d        y # 1 sw Y   y xY w)N   알 수 없는 팀 IDmatchzunknown-teamrB   rt   pytestraisesr   rG   r=   s     r3   'test_invalid_team_id_raises_value_errorzDTestBuildPromptInvalidTeamId.test_invalid_team_id_raises_value_error  s6    ]]:-DE 	G XF	G 	G 	Gs   09c                 t    t        j                  t              5   |ddd       d d d        y # 1 sw Y   y xY w)N rB   rt   r   r   s     r3   %test_empty_team_id_raises_value_errorzBTestBuildPromptInvalidTeamId.test_empty_team_id_raises_value_error  s/    ]]:& 	; Z:	; 	; 	;s   .7c                     t        j                  t        t        f      5   |ddd       ddd       y# 1 sw Y   yxY w)uB   None을 team_id로 전달하면 ValueError 또는 TypeError 발생NrB   rt   )r   r   r   	TypeErrorr   s     r3   $test_none_team_id_raises_value_errorzATestBuildPromptInvalidTeamId.test_none_team_id_raises_value_error  s4    ]]J	23 	= z8<	= 	= 	=s   4=N)rm   rn   ro   rp   r   r   r   rE   r5   r3   r   r     s    OG;=r5   r   c                       e Zd ZdZej
                  j                  dg d      d        Zd Zd Z	d Z
d Zd	 Zd
 Zd Zy)TestTeamInfou7   TEAM_INFO 딕셔너리의 구조가 올바른지 확인r&   )rA   rS   r\   	marketing
consulting
publishingdesignc                 Z    t         j                  |   }d|v sJ d|v sJ d|v sJ d|v sJ y )Nleaderroler   membersr   r   )rG   r&   r*   s      r3    test_team_info_has_required_keysz-TestTeamInfo.test_team_info_has_required_keys)  sF     ||G$4~~~~D   r5   c                 :    t         j                  d   d   dk(  sJ y )Nr\   r   r   r   rG   s    r3   test_dev3_team_type_is_directz*TestTeamInfo.test_dev3_team_type_is_direct3  s    ||K(0H<<<r5   c                 :    t         j                  d   d   dk(  sJ y )Nr`   r   r   r   r   s    r3   test_dev8_team_type_is_mcpz'TestTeamInfo.test_dev8_team_type_is_mcp6  s    ||K(0E999r5   c                 p    t         j                  d   d   dk(  sJ t         j                  d   d   dk(  sJ y )NrA   r   r   rS   r   r   s    r3   "test_dev1_dev2_team_type_is_directz/TestTeamInfo.test_dev1_dev2_team_type_is_direct9  s:    ||K(0H<<<||K(0H<<<r5   c                 :    t         j                  d   d   dk(  sJ y )Nr   r   r   r   s    r3   test_marketing_typez TestTeamInfo.test_marketing_type=  s    ||K(0K???r5   c                 :    t         j                  d   d   dk(  sJ y )Nr   r   r   r   s    r3   test_consulting_typez!TestTeamInfo.test_consulting_type@      ||L)&1\AAAr5   c                 :    t         j                  d   d   dk(  sJ y )Nr   r   r   r   s    r3   test_publishing_typez!TestTeamInfo.test_publishing_typeC  r   r5   c                 :    t         j                  d   d   dk(  sJ y )Nr   r   r   r   s    r3   test_design_typezTestTeamInfo.test_design_typeF  s    ||H%f-999r5   N)rm   rn   ro   rp   r   markparametrizer   r   r   r   r   r   r   r   rE   r5   r3   r   r   &  sR    A[[m!!=:=@BB:r5   r   c                   r    e Zd ZdZ ej
                  d      d        Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zy)TestBuildPromptOriginalu   원본 build_prompt() 함수 직접 호출 테스트 (lines 93-133 커버)

    patched_build_prompt가 아닌 원본 tp.build_prompt를 호출하여
    lines 93-133을 커버합니다. 파일 쓰기는 monkeypatch로 격리.
    Tautousec                     |dz  dz  j                  dd       t        j                  t        j                   d
fd	}dfd	}|j                  t        d|       |j                  t        d	|       y)=   Path.write_text와 Path.mkdir을 tmp_path 기준으로 격리r   r	   Tr
   Nc                 ~    t        |       }t         d|v r| j                  }|z  } |||      S  | ||      S Nz/memory/tasks/r   r   r    name	self_pathcontentr   path_strfilename
redirectedoriginal_write_textr;   s         r3   patched_write_textzETestBuildPromptOriginal._patch_file_write.<locals>.patched_write_text_  sL    9~H^,8$>>%0
*:wRR&y'HMMr5   c                 H    t        |       }t         d|v ry  | ||      S Nz/memory/tasksr
   r   r    r   r   r   r   original_mkdirs       r3   patched_mkdirz@TestBuildPromptOriginal._patch_file_write.<locals>.patched_mkdirh  -    9~H]+x7!)WxPPr5   r   r8   NFFr8   r   r   r9   rG   r2   r:   r   r   r   r   r;   s        @@@r3   _patch_file_writez)TestBuildPromptOriginal._patch_file_writeV  sj     h&0td3"oo	N	Q 	D,0BCD'=9r5   c                 N    ddl m} |j                  ddd      }d|v sJ d|v sJ y)uG   dev1-team(direct): 원본 build_prompt가 올바른 프롬프트 생성r   NrA   ztask-test-1u   직접 호출 테스트rD   )prompts.team_promptsteam_promptsr6   )rG   tp_modresults      r3   test_direct_team_build_promptz5TestBuildPromptOriginal.test_direct_team_build_promptq  s8    - $$[-AZ['''&&&r5   c                 R    t        j                  ddd      }d|v sd|v sJ d|v sJ y)u>   dev8-team(mcp): 원본 build_prompt가 MCP 프롬프트 생성r`   ztask-test-2u   MCP 직접 호출rb   Rare   Nr   r6   rG   r   s     r3   test_mcp_team_build_promptz2TestBuildPromptOriginal.test_mcp_team_build_promptz  s6    m=PQ$&.00&&&r5   c                 N    t        j                  dddd      }d|v sJ d|v sJ y)	uC   critical 레벨: 원본 build_prompt에서 [CRITICAL] 상단 삽입rA   ztask-test-3u   크리티컬 테스트r   ru   r   r   Nr  r  s     r3   test_critical_level_originalz4TestBuildPromptOriginal.test_critical_level_original  s4    m=U]gh'''(F222r5   c                 N    t        j                  dddd      }d|v sJ d|v sJ y)	uC   security 레벨: 원본 build_prompt에서 [SECURITY] 상단 삽입rS   ztask-test-4u   보안 테스트r   ru   r   r   Nr  r  s     r3   test_security_level_originalz4TestBuildPromptOriginal.test_security_level_original  s4    m=OWab'''(F222r5   c                 Z    t        j                  dddd      }d|vsJ d|vsJ d|v sJ y	)
u,   normal 레벨: [CRITICAL], [SECURITY] 없음rA   ztask-test-5u   일반 테스트r7   ru   ry   r}   rv   Nr  r  s     r3   test_normal_level_no_markersz4TestBuildPromptOriginal.test_normal_level_no_markers  sB    m=OW_`6)))6)))6)))r5   c                 B    t        j                  dddd      }d|v sJ y)u+   project_id 지정 시 project_id 값 포함rA   ztask-test-6u   프로젝트 작업r   r   r   Nr  r  s     r3   test_project_id_directz.TestBuildPromptOriginal.test_project_id_direct  s&    m=R_gh#v---r5   c                 B    t        j                  dddd      }d|v sJ y)uA   dev8-team + project_id: GLM 프롬프트에 project_id 값 포함r`   ztask-test-7u   GLM 프로젝트r   r   r   Nr  r  s     r3   test_project_id_glmz+TestBuildPromptOriginal.test_project_id_glm  s&    m=O\fg%///r5   c                     t        j                  t        d      5  t        j                  ddd       ddd       y# 1 sw Y   yxY w)u    잘못된 team_id → ValueErrorr   r   zinvalid-teamrB   	   테스트N)r   r   r   r   r6   r   s    r3   test_invalid_team_raises_errorz6TestBuildPromptOriginal.test_invalid_team_raises_error  s:    ]]:-DE 	EOONJD	E 	E 	Es	   =AN)rm   rn   ro   rp   r   fixturer   r   r  r  r  r
  r  r  r  rE   r5   r3   r   r   O  sO     V^^D!: ":4''33*.
0
Er5   r   c                   (    e Zd ZdZd Zd Zd Zd Zy)TestBuildCoworkSectionu/   _build_cowork_section() 함수 직접 테스트c                 ^    t        j                  d      }d|v sJ d|v sJ d|v sJ d|v sJ y)u.   dev1-team 코워크 섹션에 팀원들 포함rA   rJ   rK   rL   rM   Nr   _build_cowork_sectionr  s     r3   &test_dev1_team_cowork_contains_membersz=TestBuildCoworkSection.test_dev1_team_cowork_contains_members  sJ    ))+66!!!f$$$f$$$'''r5   c                 F    t        j                  d      }d|v sJ d|v sJ y)u.   dev2-team 코워크 섹션에 팀원들 포함rS   rX   rY   Nr  r  s     r3   &test_dev2_team_cowork_contains_membersz=TestBuildCoworkSection.test_dev2_team_cowork_contains_members  s.    ))+66!!!'''r5   c                 D    t        j                  d      }d|v sd|v sJ yy)u=   TEAM_MEMBER_ROLES에 없는 팀은 빈 멤버 (dev3-team 등)r\   u   모델 선택 가이드u   모델 가이드Nr  r  s     r3   'test_unknown_team_returns_empty_membersz>TestBuildCoworkSection.test_unknown_team_returns_empty_members  s0    ))+6 )F26HF6RRR6R2r5   c                 :    t        j                  d      }d|v sJ y)u2   코워크 섹션에 Task tool 관련 내용 포함rA   z	Task toolNr  r  s     r3   test_cowork_contains_task_toolz5TestBuildCoworkSection.test_cowork_contains_task_tool  s     ))+6f$$$r5   N)rm   rn   ro   rp   r  r  r  r  rE   r5   r3   r  r    s    9((S%r5   r  c                   (    e Zd ZdZd Zd Zd Zd Zy)TestBuildVerificationSectionu5   _build_verification_section() 함수 직접 테스트c                 R    t        j                  d      }d|v sJ d|vsJ d|vsJ y )Nr7   	   셀프 QCu   마아트 독립 검증 필수u   로키 보안 감사r   r%   r  s     r3   "test_normal_returns_selfcheck_onlyz?TestBuildVerificationSection.test_normal_returns_selfcheck_only  s<    //9f$$$/v===%V333r5   c                 F    t        j                  d      }d|v sJ d|v sJ y )Nr   r"  r   r#  r  s     r3   (test_critical_returns_selfcheck_and_maatzETestBuildVerificationSection.test_critical_returns_selfcheck_and_maat  .    //
;f$$$(F222r5   c                 F    t        j                  d      }d|v sJ d|v sJ y )Nr   r"  r   r#  r  s     r3   test_security_returns_allz6TestBuildVerificationSection.test_security_returns_all  r'  r5   c                 F    t        j                  d      }d|v sJ d|v sJ y)u8   unknown level은 해당 level 문자열 그대로 전달unknown_levelr"  u   검증 레벨: unknown_levelNr#  r  s     r3   &test_unknown_level_treated_as_securityzCTestBuildVerificationSection.test_unknown_level_treated_as_security  s.    //@f$$$-777r5   N)rm   rn   ro   rp   r$  r&  r)  r,  rE   r5   r3   r   r     s    ?43
3
8r5   r   c                   F    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)TestTaskTypeQCSkipuO   task_type 파라미터에 따른 QC 섹션 포함/제외 테스트 (task-202.1)c                 P    t        j                  ddddd      }d|v sJ d|v sJ y	)
u9   task_type='coding'이면 QC 섹션이 포함되어야 함rA   ztask-test-001u   테스트 작업r7   codingr)   	task_typer"  r   Nr  r  s     r3   test_coding_type_includes_qcz/TestTaskTypeQCSkip.test_coding_type_includes_qc  s7    o?QYamuvf$$$&&&r5   c                 P    t        j                  ddddd      }d|vsJ d|vsJ y	)
u;   task_type='research'이면 QC 섹션이 제외되어야 함rA   ztask-test-002u   리서치 작업r7   researchr1  rv   "   QC-RULES.md를 읽고 따르세요Nr  r  s     r3   test_research_type_skips_qcz.TestTaskTypeQCSkip.test_research_type_skips_qc  s7    o?QYamwxv---36AAAr5   c                 P    t        j                  ddddd      }d|vsJ d|vsJ y	)
u8   task_type='check'이면 QC 섹션이 제외되어야 함rA   ztask-test-003u   점검 작업r7   checkr1  rv   r6  Nr  r  s     r3   test_check_type_skips_qcz+TestTaskTypeQCSkip.test_check_type_skips_qc  s6    oV^jqrv---36AAAr5   c                 N    t        j                  dddd      }d|v sJ d|v sJ y)	u9   task_type 미지정 시 기본값은 'coding' (QC 포함)rA   ztask-test-004u   기본 작업r7   ru   r"  r   Nr  r  s     r3   test_default_type_is_codingz.TestTaskTypeQCSkip.test_default_type_is_coding  s3    oV^_f$$$&&&r5   c                 D    t        j                  ddddd      }d|v sJ y)	u3   GLM 팀(dev8)도 task_type='coding'이면 QC 포함r`   ztask-test-005u   GLM 코딩 작업r7   r0  r1  rv   Nr  r  s     r3    test_glm_team_coding_includes_qcz3TestTaskTypeQCSkip.test_glm_team_coding_includes_qc   s)    o?RZbnvw6)))r5   c                 D    t        j                  ddddd      }d|vsJ y)	u2   GLM 팀(dev8)도 task_type='research'면 QC 제외r`   ztask-test-006u   GLM 리서치 작업r7   r5  r1  rv   Nr  r  s     r3   test_glm_team_research_skips_qcz2TestTaskTypeQCSkip.test_glm_team_research_skips_qc  s)    o?U]eq{|v---r5   c                 P    t        j                  ddddd      }d|vsJ d|vsJ y	)
u;   level='critical'이어도 task_type='research'면 QC 제외rA   ztask-test-007   중요 리서치r   r5  r1  rv   	   마아트Nr  r  s     r3   *test_critical_with_research_still_skips_qcz=TestTaskTypeQCSkip.test_critical_with_research_still_skips_qc
  s7    o?QYcoyzv---&(((r5   c                 P    t        j                  ddddd      }d|vsJ d|vsJ y	)
u;   level='security'이어도 task_type='research'면 QC 제외rA   ztask-test-008u   보안 리서치r   r5  r1  rv      로키Nr  r  s     r3   *test_security_with_research_still_skips_qcz=TestTaskTypeQCSkip.test_security_with_research_still_skips_qc  s7    o?QYcoyzv---v%%%r5   c                 P    t        j                  ddddd      }d|v sJ d|vsJ y	)
uR   task_type='research'여도 level='critical'이면 CRITICAL 마커는 있어야 함rA   ztask-test-009rB  r   r5  r1  ry   rv   Nr  r  s     r3   ,test_research_type_still_has_critical_markerz?TestTaskTypeQCSkip.test_research_type_still_has_critical_marker  s7    o?QYcoyzv%%%v---r5   N)rm   rn   ro   rp   r3  r7  r:  r<  r>  r@  rD  rG  rI  rE   r5   r3   r.  r.    s4    Y'BB'*
.
)&.r5   r.  c                   F    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)TestBuildMarketingPromptu'   마케팅 프롬프트 생성 테스트c                 >    t        j                  ddd      }d|v sJ y)u:   마케팅 프롬프트에 '마케팅 팀장' 역할 포함r   z
task-mkt-1u   콘텐츠 작성u   마케팅 팀장Nr  r  s     r3   #test_marketing_prompt_contains_rolez<TestBuildMarketingPrompt.test_marketing_prompt_contains_role%  s#    l<NO!V+++r5   c                 >    t        j                  ddd      }d|v sJ y)S   마케팅 프롬프트가 팀 카드 파일(marketing.md)을 참조하는지 확인r   z
task-mkt-2u   블로그 포스트prompts/teams/marketing.mdNr  r  s     r3   %test_marketing_prompt_contains_apolloz>TestBuildMarketingPrompt.test_marketing_prompt_contains_apollo*  s#    l<QR+v555r5   c                 >    t        j                  ddd      }d|v sJ y)rO  r   z
task-mkt-3u   카피 작성rP  Nr  r  s     r3   %test_marketing_prompt_contains_peithoz>TestBuildMarketingPrompt.test_marketing_prompt_contains_peitho/  "    lOL+v555r5   c                 >    t        j                  ddd      }d|v sJ y)rO  r   z
task-mkt-4u   전략 수립rP  Nr  r  s     r3   %test_marketing_prompt_contains_skillsz>TestBuildMarketingPrompt.test_marketing_prompt_contains_skills4  rT  r5   c                 >    t        j                  ddd      }d|v sJ y)rO  r   z
task-mkt-5u   SNS 콘텐츠rP  Nr  r  s     r3   )test_marketing_prompt_contains_brand_infozBTestBuildMarketingPrompt.test_marketing_prompt_contains_brand_info9  rT  r5   c                 >    t        j                  ddd      }d|v sJ y)u(   마케팅 프롬프트에 task_id 포함r   z
task-mkt-6rt   Nr  r  s     r3   &test_marketing_prompt_contains_task_idz?TestBuildMarketingPrompt.test_marketing_prompt_contains_task_id>  s"    lHEv%%%r5   c                 >    t        j                  ddd      }d|v sJ y)ud   마케팅 프롬프트가 워크플로우 파일(LOGICAL-TEAM-WORKFLOW.md)을 참조하는지 확인r   z
task-mkt-7rt   LOGICAL-TEAM-WORKFLOW.mdNr  r  s     r3   'test_marketing_prompt_contains_workflowz@TestBuildMarketingPrompt.test_marketing_prompt_contains_workflowC  s"    lHE)V333r5   c                 B    t        j                  dddd      }d|v sJ y)u,   마케팅 + task_type=coding이면 QC 포함r   z
task-mkt-8   코딩 작업r0  r2  r"  Nr  r  s     r3   +test_marketing_with_coding_type_includes_qczDTestBuildMarketingPrompt.test_marketing_with_coding_type_includes_qcH  s%    lOW_`f$$$r5   c                 B    t        j                  dddd      }d|vsJ y)u+   마케팅 + task_type=research면 QC 제외r   z
task-mkt-9	   리서치r5  r`  rv   Nr  r  s     r3   *test_marketing_with_research_type_skips_qczCTestBuildMarketingPrompt.test_marketing_with_research_type_skips_qcM  s%    lKS]^v---r5   N)rm   rn   ro   rp   rM  rQ  rS  rV  rX  rZ  r]  ra  rd  rE   r5   r3   rK  rK  "  s2    1,
6
6
6
6
&
4
%
.r5   rK  c                   @    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)TestBuildConsultingPromptu'   컨설팅 프롬프트 생성 테스트c                 >    t        j                  ddd      }d|v sJ y)u:   컨설팅 프롬프트에 '컨설팅 팀장' 역할 포함r   z
task-con-1u   보장 분석u   컨설팅 팀장Nr  r  s     r3   $test_consulting_prompt_contains_rolez>TestBuildConsultingPrompt.test_consulting_prompt_contains_role[  s"    |_M!V+++r5   c                 >    t        j                  ddd      }d|v sJ y)T   컨설팅 프롬프트가 팀 카드 파일(consulting.md)을 참조하는지 확인r   z
task-con-2u   보장 갭 분석prompts/teams/consulting.mdNr  r  s     r3   )test_consulting_prompt_contains_asclepiuszCTestBuildConsultingPrompt.test_consulting_prompt_contains_asclepius`  s#    |=PQ,666r5   c                 >    t        j                  ddd      }d|v sJ y)rj  r   z
task-con-3u   약관 비교rk  Nr  r  s     r3   &test_consulting_prompt_contains_themisz@TestBuildConsultingPrompt.test_consulting_prompt_contains_themise  "    |_M,666r5   c                 >    t        j                  ddd      }d|v sJ y)rj  r   z
task-con-4u
   PDF 분석rk  Nr  r  s     r3   &test_consulting_prompt_contains_skillsz@TestBuildConsultingPrompt.test_consulting_prompt_contains_skillsj  s"    |\J,666r5   c                 >    t        j                  ddd      }d|v sJ y)u(   컨설팅 프롬프트에 task_id 포함r   z
task-con-5rt   Nr  r  s     r3   'test_consulting_prompt_contains_task_idzATestBuildConsultingPrompt.test_consulting_prompt_contains_task_ido  "    |XFv%%%r5   c                 >    t        j                  ddd      }d|v sJ y)ud   컨설팅 프롬프트가 워크플로우 파일(LOGICAL-TEAM-WORKFLOW.md)을 참조하는지 확인r   z
task-con-6rt   r\  Nr  r  s     r3   (test_consulting_prompt_contains_workflowzBTestBuildConsultingPrompt.test_consulting_prompt_contains_workflowt  s"    |XF)V333r5   c                 >    t        j                  ddd      }d|v sJ y)u;   컨설팅 프롬프트에 보험 관련 컨텍스트 포함r   z
task-con-7u   보험 분석u   보험Nr  r  s     r3   1test_consulting_prompt_contains_insurance_contextzKTestBuildConsultingPrompt.test_consulting_prompt_contains_insurance_contexty  s"    |_M6!!!r5   c                 B    t        j                  dddd      }d|v sJ y)u,   컨설팅 + task_type=coding이면 QC 포함r   z
task-con-8r_  r0  r`  r"  Nr  r  s     r3   ,test_consulting_with_coding_type_includes_qczFTestBuildConsultingPrompt.test_consulting_with_coding_type_includes_qc~  s%    |_X`af$$$r5   N)rm   rn   ro   rp   rh  rl  rn  rq  rs  rv  rx  rz  rE   r5   r3   rf  rf  X  s-    1,
7
7
7
&
4
"
%r5   rf  c                       e Zd ZdZd Zy)TestModuleLevelImportSafetyuK   team_prompts.py import 시 ANU_KEY 없어도 크래시 안 남 (task-448.1)c                    ddl }ddl}t        j                  D cg c]	  }d|v s| }}i }|D ]$  }t        j                  j	                  |      ||<   & 	 t
        j                  j                         D ci c]  \  }}|dk7  s|| }}}t        j                  t
        j                  |d      5  ddl
m}	 t        |	d      sJ d|	j                  v sJ 	 ddd       |j                         D ]  \  }}
|
t        j                  |<    yc c}w c c}}w # 1 sw Y   @xY w# |j                         D ]  \  }}
|
t        j                  |<    w xY w)	uR   환경변수 없는 상태에서 from prompts.team_prompts import TEAM_INFO 성공r   Nr   COKACDIR_KEY_ANUT)clearr   rA   )	importlibtypessysmodulespoposenvironitemsr   dictr   r   hasattrr   )rG   r  r  kmods_to_removesavedmvenv_without_keytp_freshmods              r3   $test_import_without_anu_key_no_crashz@TestModuleLevelImportSafety.test_import_without_anu_key_no_crash  s4    &)[[HNa4G!HH 	*A{{q)E!H	*	%02

0@0@0B^1aK]F]q!t^O^BJJtD 97x555"h&8&88889  ++- %3!$A% I _9 9  ++- %3!$A%sF   	DD!D% 8DD)D% 4%DD% D% D"D% %-EN)rm   rn   ro   rp   r  rE   r5   r3   r|  r|    s
    U%r5   r|  c                   ^    e 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d Zd Zd Zy)TestBuildPublishingPromptu'   출판팀 프롬프트 생성 테스트c                 H    t        j                  ddd      }d|v sd|v sJ yy)u@   출판 프롬프트에 '토트' 또는 '출판 센터장' 포함r   z
task-pub-1u   집필 작업u   토트ThothNr  r  s     r3   $test_publishing_prompt_contains_rolez>TestBuildPublishingPrompt.test_publishing_prompt_contains_role  s/    |_M6!W%666%6!r5   c                 >    t        j                  ddd      }d|v sJ y)Q   출판 프롬프트가 팀 카드 파일(publishing.md)을 참조하는지 확인r   z
task-pub-2u   아웃라인 설계prompts/teams/publishing.mdNr  r  s     r3   (test_publishing_prompt_contains_calliopezBTestBuildPublishingPrompt.test_publishing_prompt_contains_calliope  s#    |=RS,666r5   c                 >    t        j                  ddd      }d|v sJ y)r  r   z
task-pub-3u   초안 작성r  Nr  r  s     r3   %test_publishing_prompt_contains_eratoz?TestBuildPublishingPrompt.test_publishing_prompt_contains_erato  ro  r5   c                 >    t        j                  ddd      }d|v sJ y)r  r   z
task-pub-4u   팩트 검증r  Nr  r  s     r3   $test_publishing_prompt_contains_clioz>TestBuildPublishingPrompt.test_publishing_prompt_contains_clio  ro  r5   c                 >    t        j                  ddd      }d|v sJ y)r  r   z
task-pub-5u   퇴고r  Nr  r  s     r3   +test_publishing_prompt_contains_terpsichorezETestBuildPublishingPrompt.test_publishing_prompt_contains_terpsichore  "    |XF,666r5   c                 >    t        j                  ddd      }d|v sJ y)r  r   z
task-pub-6u   마케팅 카피r  Nr  r  s     r3   *test_publishing_prompt_contains_polyhymniazDTestBuildPublishingPrompt.test_publishing_prompt_contains_polyhymnia  s#    |=OP,666r5   c                 >    t        j                  ddd      }d|v sJ y)u%   출판 프롬프트에 task_id 포함r   z
task-pub-7rt   Nr  r  s     r3   'test_publishing_prompt_contains_task_idzATestBuildPublishingPrompt.test_publishing_prompt_contains_task_id  rt  r5   c                 >    t        j                  ddd      }d|v sJ y)r  r   z
task-pub-8u   집필r  Nr  r  s     r3   2test_publishing_prompt_contains_anti_hallucinationzLTestBuildPublishingPrompt.test_publishing_prompt_contains_anti_hallucination  r  r5   c                 >    t        j                  ddd      }d|v sJ y)r  r   z
task-pub-9u   검토r  Nr  r  s     r3   +test_publishing_prompt_contains_6dim_reviewzETestBuildPublishingPrompt.test_publishing_prompt_contains_6dim_review  r  r5   c                 >    t        j                  ddd      }d|v sJ y)r  r   ztask-pub-10u	   밸런스r  Nr  r  s     r3   /test_publishing_prompt_contains_content_balancezITestBuildPublishingPrompt.test_publishing_prompt_contains_content_balance  s"    }kJ,666r5   c                 B    t        j                  dddd      }d|v sJ y)u)   출판 + task_type=coding이면 QC 포함r   ztask-pub-11r_  r0  r`  r"  Nr  r  s     r3   ,test_publishing_with_coding_type_includes_qczFTestBuildPublishingPrompt.test_publishing_with_coding_type_includes_qc  s%    }oYabf$$$r5   c                 B    t        j                  dddd      }d|vsJ y)u(   출판 + task_type=research면 QC 제외r   ztask-pub-12rc  r5  r`  rv   Nr  r  s     r3   +test_publishing_with_research_type_skips_qczETestBuildPublishingPrompt.test_publishing_with_research_type_skips_qc  s%    }kU_`v---r5   c                 :    t         j                  d   d   dk(  sJ y)u2   TEAM_INFO에서 publishing의 type이 'publishing'r   r   Nr   r   s    r3   "test_publishing_type_is_publishingz<TestBuildPublishingPrompt.test_publishing_type_is_publishing  s    ||L)&1\AAAr5   N)rm   rn   ro   rp   r  r  r  r  r  r  r  r  r  r  r  r  r  rE   r5   r3   r  r    sG    17
7
7
7
7
7
&
7
7
7
%
.
Br5   r  c                   L    e 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)TestBuildDesignPromptu*   디자인팀 프롬프트 생성 테스트c                 H    t        j                  ddd      }d|v sd|v sJ yy)uL   디자인 프롬프트에 '아마테라스' 또는 '디자인 팀장' 포함r   z
task-des-1u   카드뉴스 제작u   아마테라스	AmaterasuNr  r  s     r3    test_design_prompt_contains_rolez6TestBuildDesignPrompt.test_design_prompt_contains_role  s0    <9NO F*kV.CCC.C*r5   c                 >    t        j                  ddd      }d|v sJ y)P   디자인 프롬프트가 팀 카드 파일(design.md)을 참조하는지 확인r   z
task-des-2u   배너 제작prompts/teams/design.mdNr  r  s     r3   %test_design_prompt_contains_benzaitenz;TestBuildDesignPrompt.test_design_prompt_contains_benzaiten  s"    <I(F222r5   c                 >    t        j                  ddd      }d|v sJ y)r  r   z
task-des-3u   하이브리드 이미지r  Nr  r  s     r3   !test_design_prompt_contains_inariz7TestBuildDesignPrompt.test_design_prompt_contains_inari   s#    <9TU(F222r5   c                 >    t        j                  ddd      }d|v sJ y)r  r   z
task-des-4u   아트 디자인r  Nr  r  s     r3   "test_design_prompt_contains_kaguyaz8TestBuildDesignPrompt.test_design_prompt_contains_kaguya  #    <9KL(F222r5   c                 >    t        j                  ddd      }d|v sJ y)r  r   z
task-des-5u   이미지 생성r  Nr  r  s     r3   "test_design_prompt_contains_skillsz8TestBuildDesignPrompt.test_design_prompt_contains_skills
  r  r5   c                 >    t        j                  ddd      }d|v sJ y)u(   디자인 프롬프트에 task_id 포함r   z
task-des-6rt   Nr  r  s     r3   #test_design_prompt_contains_task_idz9TestBuildDesignPrompt.test_design_prompt_contains_task_id  s"    <Bv%%%r5   c                 >    t        j                  ddd      }d|v sJ y)ud   디자인 프롬프트가 워크플로우 파일(LOGICAL-TEAM-WORKFLOW.md)을 참조하는지 확인r   z
task-des-7rt   r\  Nr  r  s     r3   $test_design_prompt_contains_workflowz:TestBuildDesignPrompt.test_design_prompt_contains_workflow  s"    <B)V333r5   c                 >    t        j                  ddd      }d|v sJ y)r  r   z
task-des-8u	   이미지r  Nr  r  s     r3   )test_design_prompt_contains_routing_rulesz?TestBuildDesignPrompt.test_design_prompt_contains_routing_rules  s"    <E(F222r5   c                 B    t        j                  dddd      }d|v sJ y)u,   디자인 + task_type=coding이면 QC 포함r   z
task-des-9r_  r0  r`  r"  Nr  r  s     r3   (test_design_with_coding_type_includes_qcz>TestBuildDesignPrompt.test_design_with_coding_type_includes_qc  s%    <T\]f$$$r5   c                 B    t        j                  dddd      }d|vsJ y)u+   디자인 + task_type=research면 QC 제외r   ztask-des-10rc  r5  r`  rv   Nr  r  s     r3   'test_design_with_research_type_skips_qcz=TestBuildDesignPrompt.test_design_with_research_type_skips_qc#  s%    =+Q[\v---r5   N)rm   rn   ro   rp   r  r  r  r  r  r  r  r  r  r  rE   r5   r3   r  r    s8    4D
3
3
3
3
&
4
3
%
.r5   r  c                   x    e Zd ZdZedz  Zedz  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d Zd Zy)TestCardFileContentuS   팀 카드 파일이 기존 인라인 내용을 올바르게 포함하는지 검증zprompts/teamsz prompts/LOGICAL-TEAM-WORKFLOW.mdc                 f    | j                   dz  j                  d      }d|v sJ d|v sJ d|v sJ y )Nmarketing.mdr   r   u	   아폴론u	   페이토u   에이레네	_CARD_DIR	read_textrG   r   s     r3   $test_marketing_card_contains_membersz8TestCardFileContent.test_marketing_card_contains_members4  sH    >>N2==w=Og%%%g%%%(((r5   c                 f    | j                   dz  j                  d      }d|v sJ d|v sJ d|v sJ y )Nr  r   r   zcontent-strategycopywritingzblog-writerr  r  s     r3   #test_marketing_card_contains_skillsz7TestCardFileContent.test_marketing_card_contains_skills:  sH    >>N2==w=O!W,,,''''''r5   c                 Z    | j                   dz  j                  d      }d|v sJ d|v sJ y )Nr  r   r   u   서울대보험쌤u   서울대연금쌤r  r  s     r3   'test_marketing_card_contains_brand_infoz;TestCardFileContent.test_marketing_card_contains_brand_info@  s:    >>N2==w=O#w...#w...r5   c                 Z    | j                   dz  j                  d      }d|v sJ d|v sJ y )Nconsulting.mdr   r   u   아스클레피오스u	   테미스r  r  s     r3   %test_consulting_card_contains_membersz9TestCardFileContent.test_consulting_card_contains_membersE  s:    >>O3>>>P&'111g%%%r5   c                     | j                   dz  j                  d      }d|j                         v sJ d|j                         v sJ y )Nr  r   r   pdfsupabase)r  r  lowerr  s     r3   $test_consulting_card_contains_skillsz8TestCardFileContent.test_consulting_card_contains_skillsJ  sF    >>O3>>>P'''W]]_,,,r5   c                 n    | j                   dz  j                  d      }dD ]  }||v rJ d| d        y )Npublishing.mdr   r   )u   칼리오페u	   에라토u	   클리오u   테르프시코레u   폴리뮤니아u   세쉬아트u   publishing.md에 'rN   r  )rG   r   r   s      r3   %test_publishing_card_contains_membersz9TestCardFileContent.test_publishing_card_contains_membersO  sJ    >>O3>>>Pw 	HD7?G&8h$GG?	Hr5   c                 n    | j                   dz  j                  d      }d|v sJ d|v sd|v sJ d|v sJ y )Nr  r   r   u	   반환각u   6차원zFact Checkerz60%r  r  s     r3   +test_publishing_card_contains_quality_rulesz?TestCardFileContent.test_publishing_card_contains_quality_rulesT  sO    >>O3>>>Pg%%%G#~'@@@r5   c                 f    | j                   dz  j                  d      }d|v sJ d|v sJ d|v sJ y )N	design.mdr   r   u   벤자이텐u	   이나리u	   카구야r  r  s     r3   !test_design_card_contains_membersz5TestCardFileContent.test_design_card_contains_membersZ  sH    >>K/::G:L(((g%%%g%%%r5   c                 Z    | j                   dz  j                  d      }d|v sJ d|v sJ y )Nr  r   r   zsatori-cardnewszcanvas-designr  r  s     r3    test_design_card_contains_skillsz4TestCardFileContent.test_design_card_contains_skills`  s:    >>K/::G:L G+++')))r5   c                 X    | j                   dz  j                  d      }d|v sd|v sJ y y )Nr  r   r   u   포토리얼u	   라우팅r  r  s     r3   !test_design_card_contains_routingz5TestCardFileContent.test_design_card_contains_routinge  s9    >>K/::G:L(K7,BBB,B(r5   c                 H    | j                   j                  d      }d|v sJ y )Nr   r   u!   에이전트 미팅 기록 규칙_WORKFLOW_FILEr  r  s     r3   )test_workflow_file_contains_meeting_rulesz=TestCardFileContent.test_workflow_file_contains_meeting_rulesi  s)    %%///A2g===r5   c                 H    | j                   j                  d      }d|v sJ y )Nr   r   u   500자 이내r  r  s     r3   *test_workflow_file_contains_subagent_rulesz>TestCardFileContent.test_workflow_file_contains_subagent_rulesm  s)    %%///A')))r5   c                 T    | j                   j                  d      }d|v sJ d|v sJ y )Nr   r   rC  rF  r  r  s     r3   %test_workflow_file_contains_cross_orgz9TestCardFileContent.test_workflow_file_contains_cross_orgq  s7    %%///Ag%%%7"""r5   c                 H    | j                   j                  d      }d|v sJ y )Nr   r   zfinish-task.shr  r  s     r3   'test_workflow_file_contains_finish_taskz;TestCardFileContent.test_workflow_file_contains_finish_taskv  s)    %%///A7***r5   N)rm   rn   ro   rp   r    r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rE   r5   r3   r  r  .  sb    ]_,I"DDN)(/
&
-
H
 &*
C>*#
+r5   r  c                   N    e Zd ZdZ ej
                  d      d        Zd Zd Zy) TestSessionOptimizationInPromptsu[   direct 및 GLM 팀 프롬프트에 세션 경량화 규칙이 포함되어 있는지 확인Tr   c                 2    |j                  t        dd       yu(   ANU_KEY를 테스트용 값으로 패치ANU_KEYztest-anu-keyNr9   r   rG   r:   s     r3   _patch_anu_keyz/TestSessionOptimizationInPrompts._patch_anu_key       	B	>:r5   c           
      x    t         j                  d   }t        j                  |ddddddd      }d|v sJ d	       y
)u   direct 팀 프롬프트가 DIRECT-WORKFLOW.md를 참조하는지 확인 (세션 경량화 규칙은 WORKFLOW-RULES.md에 있음)rA   ztask-test-session-1z/tmp/task-test-session-1.mdr7   python3 /timer.py startpython3 /timer.py end/tmp/report.mdr   u5   direct 프롬프트에 'DIRECT-WORKFLOW.md' 미포함N)r   r   r!   rG   r*   r   s      r3   0test_direct_prompt_contains_session_optimizationzQTestSessionOptimizationInPrompts.test_direct_prompt_contains_session_optimization  sN    ||K(((!)%#	
 $v-f/ff-r5   c           
          t         j                  d   }t        j                  |ddddddd      }d|v sJ d	       d
|v sJ d       d|v sJ d       y)uS   GLM 팀 프롬프트에도 세션 경량화 규칙이 포함되어 있는지 확인r`   ztask-test-session-2u   GLM 세션 경량화 테스트r7   r  r  r  u   세션 경량화 규칙u7   GLM 프롬프트에 '세션 경량화 규칙' 미포함z/compactu(   GLM 프롬프트에 '/compact' 미포함u   체크포인트u/   GLM 프롬프트에 '체크포인트' 미포함N)r   r   r#   r  s      r3   -test_glm_prompt_contains_session_optimizationzNTestSessionOptimizationInPrompts.test_glm_prompt_contains_session_optimization  sv    ||K(%%!,%#	
 )F2m4mm2V#O%OO# F*],]]*r5   N)	rm   rn   ro   rp   r   r  r   r  r	  rE   r5   r3   r  r    s.    eV^^D!; ";g^r5   r  c                   @    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)TestThreeDocsSectionu]   3문서 활용 지침 섹션이 level에 따라 올바르게 포함/미포함되는지 검증c                 <    t        j                  dd      }d|v sJ y)u-   critical: 3문서 활용 지침 섹션 포함	task-testr      3문서 활용 지침Nr   r$   r  s     r3   )test_three_docs_section_critical_includedz>TestThreeDocsSection.test_three_docs_section_critical_included  "    --k:F&&000r5   c                 <    t        j                  dd      }d|v sJ y)u-   security: 3문서 활용 지침 섹션 포함r  r   r  Nr  r  s     r3   )test_three_docs_section_security_includedz>TestThreeDocsSection.test_three_docs_section_security_included  r  r5   c                 >    t        j                  dd      }|dk(  sJ y)u.   normal: 3문서 활용 지침 섹션 미포함r  r7   r   Nr  r  s     r3   'test_three_docs_section_normal_excludedz<TestThreeDocsSection.test_three_docs_section_normal_excluded  s     --k8D||r5   c                 <    t        j                  dd      }d|v sJ y)u'   3문서 섹션에 plan.md 경로 포함task-42r   z"memory/plans/tasks/task-42/plan.mdNr  r  s     r3   *test_three_docs_section_contains_plan_pathz?TestThreeDocsSection.test_three_docs_section_contains_plan_path  s"    --iD3v===r5   c                 <    t        j                  dd      }d|v sJ y)u0   3문서 섹션에 context-notes.md 경로 포함r  r   z+memory/plans/tasks/task-42/context-notes.mdNr  r  s     r3   3test_three_docs_section_contains_context_notes_pathzHTestThreeDocsSection.test_three_docs_section_contains_context_notes_path  s"    --iD<FFFr5   c                 <    t        j                  dd      }d|v sJ y)u,   3문서 섹션에 checklist.md 경로 포함r  r   z'memory/plans/tasks/task-42/checklist.mdNr  r  s     r3   /test_three_docs_section_contains_checklist_pathzDTestThreeDocsSection.test_three_docs_section_contains_checklist_path  s"    --iD8FBBBr5   c                 `    t        j                  dd      }d|v sJ d|v sJ d|v sJ d|v sJ y)u-   3문서 섹션에 팀장 의무 항목 포함r  r   u   팀장 의무zplan.mdzcontext-notes.mdzchecklist.mdNr  r  s     r3   .test_three_docs_section_contains_leader_dutieszCTestThreeDocsSection.test_three_docs_section_contains_leader_duties  sL    --iD&(((F"""!V+++'''r5   c                 >    t        j                  dd      }|dk(  sJ y)u*   알 수 없는 level: 빈 문자열 반환r  unknownr   Nr  r  s     r3   /test_three_docs_section_empty_for_unknown_levelzDTestThreeDocsSection.test_three_docs_section_empty_for_unknown_level  s     --k9E||r5   N)rm   rn   ro   rp   r  r  r  r  r  r  r  r!  rE   r5   r3   r  r    s/    g1
1

>
G
C
(r5   r  c                   T    e Zd ZdZ ej
                  d      d        Zd Zd Zd Z	y)	TestThreeDocsInBuildPromptuM   build_prompt 통합 시 3문서 섹션이 올바르게 포함되는지 검증Tr   c                 2    |j                  t        dd       yr  r  r  s     r3   r   z)TestThreeDocsInBuildPrompt._patch_anu_key  r  r5   c                 (     |dddd      }d|v sJ y)u<   critical 레벨 프롬프트에 3문서 활용 지침 포함rA   task-99r  r   ru   r  NrE   rF   s      r3   (test_critical_prompt_includes_three_docszCTestThreeDocsInBuildPrompt.test_critical_prompt_includes_three_docs  !    %k9kQ[\&&000r5   c                 (     |dddd      }d|vsJ y)u=   normal 레벨 프롬프트에 3문서 활용 지침 미포함rA   r&  r  r7   ru   r  NrE   rF   s      r3   &test_normal_prompt_excludes_three_docszATestThreeDocsInBuildPrompt.test_normal_prompt_excludes_three_docs  s!    %k9kQYZ&f444r5   c                 (     |dddd      }d|v sJ y)u<   security 레벨 프롬프트에 3문서 활용 지침 포함rA   r&  r  r   ru   r  NrE   rF   s      r3   (test_security_prompt_includes_three_docszCTestThreeDocsInBuildPrompt.test_security_prompt_includes_three_docs  r(  r5   N)
rm   rn   ro   rp   r   r  r   r'  r*  r,  rE   r5   r3   r#  r#    s1    WV^^D!; ";1
5
1r5   r#  c                   l    e Zd ZdZ ej
                  d      d        Zd Zd Zd Z	d Z
d	 Zd
 Zd Zy) TestCodexAndSanitizeGateInPromptud   판정C-1/C-2: critical/security 레벨에서 Codex/Sanitize 실행 명령이 포함되는지 검증Tr   c                 2    |j                  t        dd       yr  r  r  s     r3   r   z/TestCodexAndSanitizeGateInPrompt._patch_anu_key  r  r5   c                 (     |dddd      }d|v sJ y)uE   critical: Codex 사전 검증 실행 명령이 프롬프트에 포함rA   	task-1925r  r   ru   codex_gate_check.pyNrE   rF   s      r3   )test_critical_contains_codex_gate_commandzJTestCodexAndSanitizeGateInPrompt.test_critical_contains_codex_gate_command  !    %k;S]^$...r5   c                 (     |dddd      }d|v sJ y)uN   critical: Sanitize 게이트 구체적 실행 방법이 프롬프트에 포함rA   r1  r  r   ru   sanitize_textNrE   rF   s      r3   $test_critical_contains_sanitize_gatezETestCodexAndSanitizeGateInPrompt.test_critical_contains_sanitize_gate  !    %k;S]^&(((r5   c                 (     |dddd      }d|v sJ y)uE   security: Codex 사전 검증 실행 명령이 프롬프트에 포함rA   r1  r  r   ru   r2  NrE   rF   s      r3   )test_security_contains_codex_gate_commandzJTestCodexAndSanitizeGateInPrompt.test_security_contains_codex_gate_command  r4  r5   c                 (     |dddd      }d|v sJ y)uD   security: Sanitize 게이트 실행 방법이 프롬프트에 포함rA   r1  r  r   ru   r6  NrE   rF   s      r3   $test_security_contains_sanitize_gatezETestCodexAndSanitizeGateInPrompt.test_security_contains_sanitize_gate  r8  r5   c                 (     |dddd      }d|vsJ y)u,   normal: Codex 사전 검증 명령 미포함rA   r1  r  r7   ru   r2  NrE   rF   s      r3   test_normal_excludes_codex_gatez@TestCodexAndSanitizeGateInPrompt.test_normal_excludes_codex_gate  s!    %k;S[\$F222r5   c                 (     |dddd      }d|vsJ y)u<   normal: Sanitize 게이트 구체적 실행 방법 미포함rA   r1  r  r7   ru   r6  NrE   rF   s      r3   )test_normal_excludes_sanitize_gate_detailzJTestCodexAndSanitizeGateInPrompt.test_normal_excludes_sanitize_gate_detail  s!    %k;S[\f,,,r5   c                 4     |dddd      }d|v sJ d|v sJ y)u1   Codex 명령에 task_id가 포함되는지 확인rA   r1  r  r   ru   z'codex_gate_check.py --task-id task-1925NrE   rF   s      r3   #test_codex_command_contains_task_idzDTestCodexAndSanitizeGateInPrompt.test_codex_command_contains_task_id   s/    %k;S]^f$$$8FBBBr5   N)rm   rn   ro   rp   r   r  r   r3  r7  r:  r<  r>  r@  rB  rE   r5   r3   r.  r.    sF    nV^^D!; ";/
)
/
)
3
-
Cr5   r.  c                       e Zd ZdZ ej
                  d      d        Z ej
                  d      d        Zd Zd Z	y)	TestL1SmokeTestRecordFormatu_   판정B-2: L1 스모크테스트 결과 기록 형식이 프롬프트에 포함되는지 검증Tr   c                 2    |j                  t        dd       yr  r  r  s     r3   r   z*TestL1SmokeTestRecordFormat._patch_anu_key*  r  r5   c                     |dz  dz  j                  dd       t        j                  t        j                   d
fd	}dfd	}|j                  t        d|       |j                  t        d	|       y)r   r   r	   Tr
   Nc                 ~    t        |       }t         d|v r| j                  }|z  } |||      S  | ||      S r   r   r   s         r3   r   zITestL1SmokeTestRecordFormat._patch_file_write.<locals>.patched_write_text8  sL    9~H^,8$>>%0
*:wRR&y'HMMr5   c                 H    t        |       }t         d|v ry  | ||      S r   r   r   s       r3   r   zDTestL1SmokeTestRecordFormat._patch_file_write.<locals>.patched_mkdir@  r   r5   r   r8   r   r   r   r   s        @@@r3   r   z-TestL1SmokeTestRecordFormat._patch_file_write/  sj     h&0td3"oo	N	Q 	D,0BCD'=9r5   c                 V    t        j                  ddd      }d|v sJ d|v sJ d|v sJ y)uH   모든 프롬프트에 L1 스모크테스트 결과 기록 형식 포함rA   ztask-test-l1   L1 테스트u   서버 재시작: [u   API 응답 확인: [u   스크린샷: [Nr  r  s     r3   %test_prompt_contains_l1_record_formatzATestL1SmokeTestRecordFormat.test_prompt_contains_l1_record_formatI  s>    nnM$...%/// F***r5   c                 >    t        j                  ddd      }d|v sJ y)u   불완전 처리 경고 포함rA   ztask-test-l1-2rJ  u   불완전 처리Nr  r  s     r3   'test_prompt_contains_incomplete_warningzCTestL1SmokeTestRecordFormat.test_prompt_contains_incomplete_warningP  s#    .>O!V+++r5   N)
rm   rn   ro   rp   r   r  r   r   rK  rM  rE   r5   r3   rD  rD  '  sK    iV^^D!; "; V^^D!: ":2+,r5   rD  )(rp   r  r  pathlibr   unittest.mockr   r   r   r  r   r    r   pathinsertr   r   r   r  r=   r?   rr   r   r   r   r   r  r   r.  rK  rf  r|  r  r  r  r  r  r#  r.  rD  rE   r5   r3   <module>rR     sg   
 
  *  "**..!13HIJ
z?#(("HHOOAs:' ! L Lh)% )%b=( =(J/ /D= =,!: !:RQE QEr% %F8 845. 5.z.. ..l)% )%b% %BAB ABR3. 3.vJ+ J+d&^ &^\, ,^1 1:*C *CZ,, ,,r5   