
    ci$                        d Z ddlZddlmc m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j0                         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                ./home/jay/workspace/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                 b    |ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            d x}}y )N	dev1-teamtask-1.1   로그인 페이지 개발   헤르메스inz%(py1)s in %(py3)sr1   py1py3assert %(py5)spy5
@pytest_ar_call_reprcompare	_saferepr@py_builtinslocals_should_repr_global_nameAssertionError_format_explanationselfr=   r1   @py_assert0@py_assert2@py_format4@py_format6s          r3   test_dev1_team_contains_hermesz9TestBuildPromptTeamContent.test_dev1_team_contains_hermes{   sj    %k:?[\'~''''~'''~''''''''''''''''r5   c                     |ddd      }dD ]  }||v }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j
                  |      nddt        j                         v st        j                  |      rt        j
                  |      ndd	z  }t        j                  d
| d      dz   d|iz  }t        t        j                  |            d } y )NrA   rB   rC   )   불칸	   이리스	   아테나   아르고스rE   z%(py0)s in %(py2)smemberr1   py0py2u"   dev1-team 프롬프트에 팀원 '   ' 누락
>assert %(py4)spy4	rN   rO   rQ   rR   rS   rP   _format_assertmsgrT   rU   rW   r=   r1   rc   @py_assert1@py_format3@py_format5s          r3   #test_dev1_team_contains_all_membersz>TestBuildPromptTeamContent.test_dev1_team_contains_all_members   s    %k:?[\J 	[FV#ZZZ6VZZZZZZ6ZZZ6ZZZZZZVZZZVZZZZ'I&QY%ZZZZZZZ	[r5   c                 b    |ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            d x}}y )N	dev2-teamtask-2.1   API 서버 구축u   오딘rE   rG   r1   rH   rK   rL   rM   rV   s          r3   test_dev2_team_contains_odinz7TestBuildPromptTeamContent.test_dev2_team_contains_odin   sj    %k:?RS!x6!!!!x6!!!x!!!!!!6!!!6!!!!!!!r5   c                     |ddd      }dD ]  }||v }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j
                  |      nddt        j                         v st        j                  |      rt        j
                  |      ndd	z  }t        j                  d
| d      dz   d|iz  }t        t        j                  |            d } y )Nrr   rs   rt   )   토르   프레이야u	   미미르u	   헤임달rE   rb   rc   r1   rd   u"   dev2-team 프롬프트에 팀원 'rg   rh   ri   rj   rl   s          r3   #test_dev2_team_contains_all_membersz>TestBuildPromptTeamContent.test_dev2_team_contains_all_members   s    %k:?RSJ 	[FV#ZZZ6VZZZZZZ6ZZZ6ZZZZZZVZZZVZZZZ'I&QY%ZZZZZZZ	[r5   c                 b    |ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            d x}}y )N	dev3-teamztask-3.1    데이터 파이프라인 구축u	   다그다rE   rG   r1   rH   rK   rL   rM   rV   s          r3   test_dev3_team_contains_dagdaz8TestBuildPromptTeamContent.test_dev3_team_contains_dagda   sj    %k:?ab${f$$$${f$$${$$$$$$f$$$f$$$$$$$r5   c                 b    |ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            d x}}y )N	dev8-teamtask-8.1r|      라rE   rG   r1   rH   rK   rL   rM   rV   s          r3   test_dev8_team_contains_raz5TestBuildPromptTeamContent.test_dev8_team_contains_ra   si    %k:?abuuur5   c                 H    |ddd      }g }d}||v }|}|sd}||v }|}|sd}	|	|v }
|
}|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j
                  |      rt        j                  |      nd	d
z  }dd|iz  }|j                  |       |st        j                  dfd|f      t        j                  |      d	t        j                         v st        j
                  |      rt        j                  |      nd	dz  }dd|iz  }|j                  |       |st        j                  d
fd	|f      t        j                  |	      d	t        j                         v st        j
                  |      rt        j                  |      nd	dz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}x}x}x}	}
y)ua   dev8-team은 MCP 타입이므로 glm_backend 등 MCP tool 관련 키워드가 포함되어야 함r   r   r|   glm_backendglm_frontendMCPrE   z%(py3)s in %(py5)sr1   rJ   rL   %(py7)spy7z%(py10)s in %(py12)spy10py12%(py14)spy14)z%(py17)s in %(py19)s)py17py19z%(py21)spy21   zassert %(py24)spy24N
rN   rO   rP   rQ   rR   rS   append_format_booloprT   rU   )rW   r=   r1   rm   rY   @py_assert4rX   @py_assert9@py_assert11@py_assert16@py_assert18r[   @py_format8@py_format13@py_format15@py_format20@py_format22@py_format23@py_format25s                      r3   !test_dev8_team_contains_mcp_toolsz<TestBuildPromptTeamContent.test_dev8_team_contains_mcp_tools   s-   %k:?abU}U}&U.U.F*BUeUevoUUUU}UUU}UUUUUUUUUUUUUUUUU.FUUU.UUUUUUFUUUFUUUUUUUevUUUeUUUUUUvUUUvUUUUUUUUUUUUUUUr5   c                 b    |ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d
x}}y
)u]   dev8-team(GLM 타입)은 openclaw에 위임하므로 팀원 목록 대신 팀 ID가 포함됨r   r   r|   rE   rG   r1   rH   rK   rL   NrM   rV   s          r3   test_dev8_team_contains_team_idz:TestBuildPromptTeamContent.test_dev8_team_contains_team_id   sj    %k:?ab${f$$$${f$$${$$$$$$f$$$f$$$$$$$r5   c                 b    |ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d x}}y )
NrA   z	task-42.1u   특정 태스크 테스트rE   rG   r1   rH   rK   rL   rM   rV   s          r3   test_prompt_contains_task_idz7TestBuildPromptTeamContent.test_prompt_contains_task_id   sj    %k;@\]${f$$$${f$$${$$$$$$f$$$f$$$$$$$r5   N)__name__
__module____qualname____doc__r\   rp   ru   ry   r}   r   r   r   r    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                 f    |dddd      }d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j
                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)u"   normal: 셀프 QC 섹션만 포함rA   rB      작업r7   r)      검증 레벨:rE   rG   r1   rH   rK   rL   NrM   rV   s          r3   test_normal_contains_selfcheckz4TestBuildPromptLevels.test_normal_contains_selfcheck   sn    %k:xxX)6))))6)))))))))6)))6)))))))r5   c                 f    |dddd      }d}||v}|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j
                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)u    normal: [CRITICAL] 문구 없음rA   rB   r   r7   r   
[CRITICAL]not inz%(py1)s not in %(py3)sr1   rH   rK   rL   NrM   rV   s          r3   ,test_normal_does_not_contain_critical_markerzBTestBuildPromptLevels.test_normal_does_not_contain_critical_marker   k    %k:xxX)|6))))|6)))|))))))6)))6)))))))r5   c                 f    |dddd      }d}||v}|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j
                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)u    normal: [SECURITY] 문구 없음rA   rB   r   r7   r   
[SECURITY]r   r   r1   rH   rK   rL   NrM   rV   s          r3   ,test_normal_does_not_contain_security_markerzBTestBuildPromptLevels.test_normal_does_not_contain_security_marker   r   r5   c                 f    |dddd      }d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j
                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)u6   critical: [CRITICAL] 문구 프롬프트 상단 포함rA   rB   r   r   r   r   rE   rG   r1   rH   rK   rL   NrM   rV   s          r3   &test_critical_contains_critical_markerz<TestBuildPromptLevels.test_critical_contains_critical_marker   k    %k:xzZ%|v%%%%|v%%%|%%%%%%v%%%v%%%%%%%r5   c                 f    |dddd      }d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j
                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)u=   critical: 검증 레벨이 critical로 전달되는지 확인rA   rB   r   r   r      검증 레벨: criticalrE   rG   r1   rH   rK   rL   NrM   rV   s          r3   $test_critical_contains_maat_subagentz:TestBuildPromptLevels.test_critical_contains_maat_subagent   n    %k:xzZ(2(F2222(F222(222222F222F2222222r5   c                 f    |dddd      }d}||v}|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j
                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)u"   critical: [SECURITY] 문구 없음rA   rB   r   r   r   r   r   r   r1   rH   rK   rL   NrM   rV   s          r3   .test_critical_does_not_contain_security_markerzDTestBuildPromptLevels.test_critical_does_not_contain_security_marker   sk    %k:xzZ)|6))))|6)))|))))))6)))6)))))))r5   c                 f    |dddd      }d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j
                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)u6   security: [SECURITY] 문구 프롬프트 상단 포함rA   rB   r   r   r   r   rE   rG   r1   rH   rK   rL   NrM   rV   s          r3   &test_security_contains_security_markerz<TestBuildPromptLevels.test_security_contains_security_marker   r   r5   c                 f    |dddd      }d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j
                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)u=   security: 검증 레벨이 security로 전달되는지 확인rA   rB   r   r   r      검증 레벨: securityrE   rG   r1   rH   rK   rL   NrM   rV   s          r3   $test_security_contains_maat_subagentz:TestBuildPromptLevels.test_security_contains_maat_subagent   r   r5   c                     |dddd      }g }d}||v }|}|rd}||v }|}|sXt        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j
                  |      rt        j                  |      nd
dz  }	dd|	iz  }
|j                  |
       |rt        j                  dfd|f      t        j                  |      d
t        j                         v st        j
                  |      rt        j                  |      nd
dz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}x}}y)u@   security: 검증 레벨 security이고 QC-RULES.md 참조 포함rA   rB   r   r   r   r   QC-RULES.mdrE   r   r1   r   r   r   r   r   r   r   r   assert %(py17)sr   Nr   )rW   r=   r1   rm   rY   r   rX   r   r   r[   r   r   r   @py_format16@py_format18s                  r3   $test_security_contains_loki_subagentz:TestBuildPromptLevels.test_security_contains_loki_subagent   s    %k:xzZN(N(F2N}N}7NNNNN(FNNN(NNNNNNFNNNFNNNNNNN}NNN}NNNNNNNNNNNNNNNNNNNNNNNr5   c                 f    |dddd      }d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j
                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)u=   security: 셀프 QC도 포함 (critical 요소 모두 상속)rA   rB   r   r   r   r   rE   rG   r1   rH   rK   rL   NrM   rV   s          r3    test_security_contains_selfcheckz6TestBuildPromptLevels.test_security_contains_selfcheck   sn    %k:xzZ)6))))6)))))))))6)))6)))))))r5   c                 f    |dddd      }d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j
                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)u=   critical: [CRITICAL] 문구가 프롬프트 맨 앞에 위치rA   rB   r   r   r   **[CRITICAL]rE   rG   r1   rH   rK   rL   NrM   rV   s          r3   'test_critical_marker_at_start_of_promptz=TestBuildPromptLevels.test_critical_marker_at_start_of_prompt   k    %k:xzZ'~''''~'''~''''''''''''''''r5   c                 f    |dddd      }d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j
                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)u=   security: [SECURITY] 문구가 프롬프트 맨 앞에 위치rA   rB   r   r   r   **[SECURITY]rE   rG   r1   rH   rK   rL   NrM   rV   s          r3   'test_security_marker_at_start_of_promptz=TestBuildPromptLevels.test_security_marker_at_start_of_prompt   r   r5   N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r5   r3   r   r      sB    K*
*
*
&
3
*
&
3
O
*
(
(r5   r   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                 f    |dddd      }d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j
                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)u>   project_id=None: DIRECT-WORKFLOW.md 참조 포함 (direct 팀)rA   rB      작업 설명Nr   DIRECT-WORKFLOW.mdrE   rG   r1   rH   rK   rL   rM   rV   s          r3   /test_no_project_id_contains_system_task_messagezHTestBuildPromptProjectId.test_no_project_id_contains_system_task_message   so    %k:[_`#-#v----#v---#------v---v-------r5   c                 f    |dddd      }d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j
                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)u=   project_id='myproj': 'project_id: myproj' 포함 (direct 팀)rA   rB   r   myprojr   project_id: myprojrE   rG   r1   rH   rK   rL   NrM   rV   s          r3   %test_project_id_contains_project_pathz>TestBuildPromptProjectId.test_project_id_contains_project_path   so    %k:[cd#-#v----#v---#------v---v-------r5   c                 f    |dddd      }d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j
                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)uA   project_id=None, dev8-team(GLM): DIRECT-WORKFLOW.md 참조 포함r   r   
   GLM 작업Nr   r   rE   rG   r1   rH   rK   rL   rM   rV   s          r3   0test_no_project_id_glm_team_contains_system_taskzITestBuildPromptProjectId.test_no_project_id_glm_team_contains_system_task   so    %k:|X\]#-#v----#v---#------v---v-------r5   c                 f    |dddd      }d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j
                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)uD   project_id='testproj', dev8-team(GLM): 'project_id: testproj' 포함r   r   r   testprojr   project_id: testprojrE   rG   r1   rH   rK   rL   NrM   rV   s          r3   .test_project_id_glm_team_contains_project_pathzGTestBuildPromptProjectId.test_project_id_glm_team_contains_project_path   so    %k:|Xbc%/%////%///%////////////////r5   c                 f    |dddd      }d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j
                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)u2   project_id 지정 시 'project_id: sandbox' 포함rr   rs   u   격리 테스트sandboxr   zproject_id: sandboxrE   rG   r1   rH   rK   rL   NrM   rV   s          r3   &test_project_id_isolation_rule_presentz?TestBuildPromptProjectId.test_project_id_isolation_rule_present  sp    %k:?Q^gh$.$....$...$................r5   N)	r   r   r   r   r   r   r   r   r   r   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   r   pytestraisesr   rW   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   r   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   r   )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)r   r   r   r   r   r   r  r   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   rr   r{   	marketing
consulting
publishingdesignc                 R   t         j                  |   }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d x}}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d x}}d	}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d x}}d
}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d x}}y )NleaderrE   rG   r*   rH   rK   rL   roler   members)
r   r   rN   rO   rP   rQ   rR   rS   rT   rU   )rW   r&   r*   rX   rY   rZ   r[   s          r3    test_team_info_has_required_keysz-TestTeamInfo.test_team_info_has_required_keys)  st    ||G$x4x4x44v~vvv~vv yD    yD   y      D   D       r5   c                 &   t         j                  d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )	Nr{   r   r   ==z%(py1)s == %(py4)srI   ri   assert %(py6)spy6r   r   rN   rO   rP   rT   rU   rW   rX   @py_assert3rY   ro   @py_format7s         r3   test_dev3_team_type_is_directz*TestTeamInfo.test_dev3_team_type_is_direct3  s]    ||K(0<H<0H<<<<0H<<<0<<<H<<<<<<<r5   c                 &   t         j                  d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )	Nr   r   r   r  r  r  r  r  r  r  s         r3   test_dev8_team_type_is_mcpz'TestTeamInfo.test_dev8_team_type_is_mcp6  s]    ||K(09E90E99990E9990999E9999999r5   c                 H   t         j                  d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}t         j                  d	   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )
NrA   r   r   r  r  r  r  r  rr   r  r  s         r3   "test_dev1_dev2_team_type_is_directz/TestTeamInfo.test_dev1_dev2_team_type_is_direct9  s    ||K(0<H<0H<<<<0H<<<0<<<H<<<<<<<||K(0<H<0H<<<<0H<<<0<<<H<<<<<<<r5   c                 &   t         j                  d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )Nr  r   r  r  r  r  r  r  r  s         r3   test_marketing_typez TestTeamInfo.test_marketing_type=  s]    ||K(0?K?0K????0K???0???K???????r5   c                 &   t         j                  d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )Nr  r   r  r  r  r  r  r  r  s         r3   test_consulting_typez!TestTeamInfo.test_consulting_type@  ]    ||L)&1A\A1\AAAA1\AAA1AAA\AAAAAAAr5   c                 &   t         j                  d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )Nr  r   r  r  r  r  r  r  r  s         r3   test_publishing_typez!TestTeamInfo.test_publishing_typeC  r!  r5   c                 &   t         j                  d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )Nr  r   r  r  r  r  r  r  r  s         r3   test_design_typezTestTeamInfo.test_design_typeF  s]    ||H%f-99-9999-999-9999999999r5   N)r   r   r   r   r   markparametrizer  r  r  r  r  r   r#  r%  r   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    r3  r   r   r5  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   rW   r2   r:   r9  r?  r>  r8  r;   s        @@@r3   _patch_file_writez)TestBuildPromptOriginal._patch_file_writeV  sj     h&0td3"oo	N	Q 	D,0BCD'=9r5   c                    ddl m} |j                  ddd      }d}||v }|st        j                  d|fd||f      t        j
                  |      d	t        j                         v st        j                  |      rt        j
                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}d}||v }|st        j                  d|fd||f      t        j
                  |      d	t        j                         v st        j                  |      rt        j
                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)uG   dev1-team(direct): 원본 build_prompt가 올바른 프롬프트 생성r   NrA   ztask-test-1u   직접 호출 테스트rD   rE   rG   resultrH   rK   rL   )prompts.team_promptsteam_promptsr6   rN   rO   rP   rQ   rR   rS   rT   rU   )rW   tp_modrG  rX   rY   rZ   r[   s          r3   test_direct_team_build_promptz5TestBuildPromptOriginal.test_direct_team_build_promptq  s    - $$[-AZ['~''''~'''~''''''''''''''''&}&&&&}&&&}&&&&&&&&&&&&&&&&r5   c                 r   t        j                  ddd      }g }d}||v }|}|sd}||v }|}|sXt        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndd	z  }d
d|iz  }	|j                  |	       |st        j                  dfd|f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }
dd|
iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}x}}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            dx}}y)u>   dev8-team(mcp): 원본 build_prompt가 MCP 프롬프트 생성r   ztask-test-2u   MCP 직접 호출r   RarE   r   rG  r   r   r   r   r   r   r   r   r   r   Nr   rG   rH   rK   rL   r   r6   rN   rO   rP   rQ   rR   rS   r   r   rT   rU   )rW   rG  rm   rY   r   rX   r   r   r[   r   r   r   r   r   rZ   s                  r3   test_mcp_team_build_promptz2TestBuildPromptOriginal.test_mcp_team_build_promptz  s1   m=PQ0u0u0$0$&.0000u000u0000000000000000$&000$000000&000&00000000000000&}&&&&}&&&}&&&&&&&&&&&&&&&&r5   c                    t        j                  dddd      }d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)uC   critical 레벨: 원본 build_prompt에서 [CRITICAL] 상단 삽입rA   ztask-test-3u   크리티컬 테스트r   r   r   rE   rG   rG  rH   rK   rL   Nr   
r   r6   rN   rO   rP   rQ   rR   rS   rT   rU   rW   rG  rX   rY   rZ   r[   s         r3   test_critical_level_originalz4TestBuildPromptOriginal.test_critical_level_original  s    m=U]gh'~''''~'''~''''''''''''''''(2(F2222(F222(222222F222F2222222r5   c                    t        j                  dddd      }d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)uC   security 레벨: 원본 build_prompt에서 [SECURITY] 상단 삽입rr   ztask-test-4u   보안 테스트r   r   r   rE   rG   rG  rH   rK   rL   Nr   rQ  rR  s         r3   test_security_level_originalz4TestBuildPromptOriginal.test_security_level_original  s    m=OWab'~''''~'''~''''''''''''''''(2(F2222(F222(222222F222F2222222r5   c                    t        j                  dddd      }d}||v}|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}d}||v}|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)u,   normal 레벨: [CRITICAL], [SECURITY] 없음rA   ztask-test-5u   일반 테스트r7   r   r   r   r   rG  rH   rK   rL   Nr   r   rE   rG   rQ  rR  s         r3   test_normal_level_no_markersz4TestBuildPromptOriginal.test_normal_level_no_markers  s&   m=OW_`)|6))))|6)))|))))))6)))6))))))))|6))))|6)))|))))))6)))6))))))))6))))6)))))))))6)))6)))))))r5   c                    t        j                  dddd      }d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)u+   project_id 지정 시 project_id 값 포함rA   ztask-test-6u   프로젝트 작업r   r   r   rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   test_project_id_directz.TestBuildPromptOriginal.test_project_id_direct  st    m=R_gh#-#v----#v---#------v---v-------r5   c                    t        j                  dddd      }d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)uA   dev8-team + project_id: GLM 프롬프트에 project_id 값 포함r   ztask-test-7u   GLM 프로젝트r   r   r   rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   test_project_id_glmz+TestBuildPromptOriginal.test_project_id_glm  st    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   )rW   s    r3   test_invalid_team_raises_errorz6TestBuildPromptOriginal.test_invalid_team_raises_error  s:    ]]:-DE 	EOONJD	E 	E 	Es	   =AN)r   r   r   r   r   fixturerE  rK  rO  rS  rU  rW  rY  r[  r^  r   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                 V   t        j                  d      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d	x}}d
}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d	x}}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d	x}}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d	x}}y	)u.   dev1-team 코워크 섹션에 팀원들 포함rA   r^   rE   rG   rG  rH   rK   rL   Nr_   r`   ra   
r   _build_cowork_sectionrN   rO   rP   rQ   rR   rS   rT   rU   rR  s         r3   &test_dev1_team_cowork_contains_membersz=TestBuildCoworkSection.test_dev1_team_cowork_contains_members  sv   ))+6!x6!!!!x6!!!x!!!!!!6!!!6!!!!!!!${f$$$${f$$${$$$$$$f$$$f$$$$$$$${f$$$${f$$${$$$$$$f$$$f$$$$$$$'~''''~'''~''''''''''''''''r5   c                    t        j                  d      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d	x}}d
}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d	x}}y	)u.   dev2-team 코워크 섹션에 팀원들 포함rr   rw   rE   rG   rG  rH   rK   rL   Nrx   rc  rR  s         r3   &test_dev2_team_cowork_contains_membersz=TestBuildCoworkSection.test_dev2_team_cowork_contains_members  s    ))+6!x6!!!!x6!!!x!!!!!!6!!!6!!!!!!!'~''''~'''~''''''''''''''''r5   c                 $   t        j                  d      }g }d}||v }|}|sd}||v }|}|sXt        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd	|iz  }	|j                  |	       |st        j                  dfd
|f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }
dd|
iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}x}}y)u=   TEAM_MEMBER_ROLES에 없는 팀은 빈 멤버 (dev3-team 등)r{   u   모델 선택 가이드u   모델 가이드rE   r   rG  r   r   r   r   r   r   r   r   r   r   N)r   rd  rN   rO   rP   rQ   rR   rS   r   r   rT   rU   rW   rG  rm   rY   r   rX   r   r   r[   r   r   r   r   r   s                 r3   'test_unknown_team_returns_empty_membersz>TestBuildCoworkSection.test_unknown_team_returns_empty_members  s    ))+6 	S(R(F2R6HR6HF6RRRRR(FRRR(RRRRRRFRRRFRRRRRRR6HFRRR6HRRRRRRFRRRFRRRRRRRRRRRRRRr5   c                 x   t        j                  d      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d	x}}y	)
u2   코워크 섹션에 Task tool 관련 내용 포함rA   z	Task toolrE   rG   rG  rH   rK   rL   Nrc  rR  s         r3   test_cowork_contains_task_toolz5TestBuildCoworkSection.test_cowork_contains_task_tool  sk    ))+6${f$$$${f$$${$$$$$$f$$$f$$$$$$$r5   N)r   r   r   r   re  rg  rj  rl  r   r5   r3   ra  ra    s    9((S%r5   ra  c                   (    e Zd ZdZd Zd Zd Zd Zy)TestBuildVerificationSectionu5   _build_verification_section() 함수 직접 테스트c                    t        j                  d      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d x}}d	}||v}|st        j                  d
|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d x}}d}||v}|st        j                  d
|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d x}}y )Nr7   	   셀프 QCrE   rG   rG  rH   rK   rL   u   마아트 독립 검증 필수r   r   u   로키 보안 감사
r   r%   rN   rO   rP   rQ   rR   rS   rT   rU   rR  s         r3   "test_normal_returns_selfcheck_onlyz?TestBuildVerificationSection.test_normal_returns_selfcheck_only  s#   //9${f$$$${f$$${$$$$$$f$$$f$$$$$$$/=/v====/v===/======v===v=======%3%V3333%V333%333333V333V3333333r5   c                    t        j                  d      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d x}}d	}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d x}}y )
Nr   rp  rE   rG   rG  rH   rK   rL   r   rq  rR  s         r3   (test_critical_returns_selfcheck_and_maatzETestBuildVerificationSection.test_critical_returns_selfcheck_and_maat      //
;${f$$$${f$$${$$$$$$f$$$f$$$$$$$(2(F2222(F222(222222F222F2222222r5   c                    t        j                  d      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d x}}d	}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d x}}y )
Nr   rp  rE   rG   rG  rH   rK   rL   r   rq  rR  s         r3   test_security_returns_allz6TestBuildVerificationSection.test_security_returns_all  ru  r5   c                    t        j                  d      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d	x}}d
}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d	x}}y	)u8   unknown level은 해당 level 문자열 그대로 전달unknown_levelrp  rE   rG   rG  rH   rK   rL   Nu   검증 레벨: unknown_levelrq  rR  s         r3   &test_unknown_level_treated_as_securityzCTestBuildVerificationSection.test_unknown_level_treated_as_security  s    //@${f$$$${f$$${$$$$$$f$$$f$$$$$$$-7-7777-777-7777777777777777r5   N)r   r   r   r   rr  rt  rw  rz  r   r5   r3   rn  rn    s    ?43
3
8r5   rn  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                    t        j                  ddddd      }d}||v }|st        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }t        t        j                  |            dx}}d}||v }|st        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }t        t        j                  |            dx}}y)u9   task_type='coding'이면 QC 섹션이 포함되어야 함rA   ztask-test-001u   테스트 작업r7   codingr)   	task_typerp  rE   rG   rG  rH   rK   rL   Nr   rQ  rR  s         r3   test_coding_type_includes_qcz/TestTaskTypeQCSkip.test_coding_type_includes_qc  s    o?QYamuv${f$$$${f$$${$$$$$$f$$$f$$$$$$$&}&&&&}&&&}&&&&&&&&&&&&&&&&r5   c                    t        j                  ddddd      }d}||v}|st        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }t        t        j                  |            dx}}d}||v}|st        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }t        t        j                  |            dx}}y)u;   task_type='research'이면 QC 섹션이 제외되어야 함rA   ztask-test-002u   리서치 작업r7   researchr  r   r   r   rG  rH   rK   rL   N"   QC-RULES.md를 읽고 따르세요rQ  rR  s         r3   test_research_type_skips_qcz.TestTaskTypeQCSkip.test_research_type_skips_qc  s    o?QYamwx-v----v---------v---v-------3A36AAAA36AAA3AAAAAA6AAA6AAAAAAAr5   c                    t        j                  ddddd      }d}||v}|st        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }t        t        j                  |            dx}}d}||v}|st        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }t        t        j                  |            dx}}y)u8   task_type='check'이면 QC 섹션이 제외되어야 함rA   ztask-test-003u   점검 작업r7   checkr  r   r   r   rG  rH   rK   rL   Nr  rQ  rR  s         r3   test_check_type_skips_qcz+TestTaskTypeQCSkip.test_check_type_skips_qc  s    oV^jqr-v----v---------v---v-------3A36AAAA36AAA3AAAAAA6AAA6AAAAAAAr5   c                    t        j                  dddd      }d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)u9   task_type 미지정 시 기본값은 'coding' (QC 포함)rA   ztask-test-004u   기본 작업r7   r   rp  rE   rG   rG  rH   rK   rL   Nr   rQ  rR  s         r3   test_default_type_is_codingz.TestTaskTypeQCSkip.test_default_type_is_coding  s    oV^_${f$$$${f$$${$$$$$$f$$$f$$$$$$$&}&&&&}&&&}&&&&&&&&&&&&&&&&r5   c                    t        j                  ddddd      }d}||v }|st        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }t        t        j                  |            dx}}y)u3   GLM 팀(dev8)도 task_type='coding'이면 QC 포함r   ztask-test-005u   GLM 코딩 작업r7   r~  r  r   rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3    test_glm_team_coding_includes_qcz3TestTaskTypeQCSkip.test_glm_team_coding_includes_qc   sw    o?RZbnvw)6))))6)))))))))6)))6)))))))r5   c                    t        j                  ddddd      }d}||v}|st        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }t        t        j                  |            dx}}y)u2   GLM 팀(dev8)도 task_type='research'면 QC 제외r   ztask-test-006u   GLM 리서치 작업r7   r  r  r   r   r   rG  rH   rK   rL   NrQ  rR  s         r3   test_glm_team_research_skips_qcz2TestTaskTypeQCSkip.test_glm_team_research_skips_qc  sw    o?U]eq{|-v----v---------v---v-------r5   c                    t        j                  ddddd      }d}||v}|st        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }t        t        j                  |            dx}}d}||v}|st        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }t        t        j                  |            dx}}y)u;   level='critical'이어도 task_type='research'면 QC 제외rA   ztask-test-007   중요 리서치r   r  r  r   r   r   rG  rH   rK   rL   N	   마아트rQ  rR  s         r3   *test_critical_with_research_still_skips_qcz=TestTaskTypeQCSkip.test_critical_with_research_still_skips_qc
  s    o?QYcoyz-v----v---------v---v-------({&(((({&((({((((((&(((&(((((((r5   c                    t        j                  ddddd      }d}||v}|st        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }t        t        j                  |            dx}}d}||v}|st        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }t        t        j                  |            dx}}y)u;   level='security'이어도 task_type='research'면 QC 제외rA   ztask-test-008u   보안 리서치r   r  r  r   r   r   rG  rH   rK   rL   N   로키rQ  rR  s         r3   *test_security_with_research_still_skips_qcz=TestTaskTypeQCSkip.test_security_with_research_still_skips_qc  s    o?QYcoyz-v----v---------v---v-------%xv%%%%xv%%%x%%%%%%v%%%v%%%%%%%r5   c                    t        j                  ddddd      }d}||v }|st        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }t        t        j                  |            dx}}d}||v}|st        j                  d|fd||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }t        t        j                  |            dx}}y)uR   task_type='research'여도 level='critical'이면 CRITICAL 마커는 있어야 함rA   ztask-test-009r  r   r  r  r   rE   rG   rG  rH   rK   rL   Nr   r   r   rQ  rR  s         r3   ,test_research_type_still_has_critical_markerz?TestTaskTypeQCSkip.test_research_type_still_has_critical_marker  s    o?QYcoyz%|v%%%%|v%%%|%%%%%%v%%%v%%%%%%%-v----v---------v---v-------r5   N)r   r   r   r   r  r  r  r  r  r  r  r  r  r   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 }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}y)u:   마케팅 프롬프트에 '마케팅 팀장' 역할 포함r  z
task-mkt-1u   콘텐츠 작성u   마케팅 팀장rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   #test_marketing_prompt_contains_rolez<TestBuildMarketingPrompt.test_marketing_prompt_contains_role%  sq    l<NO!+!V++++!V+++!++++++V+++V+++++++r5   c                 |   t        j                  ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}y)S   마케팅 프롬프트가 팀 카드 파일(marketing.md)을 참조하는지 확인r  z
task-mkt-2u   블로그 포스트prompts/teams/marketing.mdrE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   %test_marketing_prompt_contains_apolloz>TestBuildMarketingPrompt.test_marketing_prompt_contains_apollo*  sq    l<QR+5+v5555+v555+555555v555v5555555r5   c                 |   t        j                  ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}y)r  r  z
task-mkt-3u   카피 작성r  rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   %test_marketing_prompt_contains_peithoz>TestBuildMarketingPrompt.test_marketing_prompt_contains_peitho/  p    lOL+5+v5555+v555+555555v555v5555555r5   c                 |   t        j                  ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}y)r  r  z
task-mkt-4u   전략 수립r  rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   %test_marketing_prompt_contains_skillsz>TestBuildMarketingPrompt.test_marketing_prompt_contains_skills4  r  r5   c                 |   t        j                  ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}y)r  r  z
task-mkt-5u   SNS 콘텐츠r  rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   )test_marketing_prompt_contains_brand_infozBTestBuildMarketingPrompt.test_marketing_prompt_contains_brand_info9  r  r5   c                 |   t        j                  ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d
x}}y
)u(   마케팅 프롬프트에 task_id 포함r  z
task-mkt-6r   rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   &test_marketing_prompt_contains_task_idz?TestBuildMarketingPrompt.test_marketing_prompt_contains_task_id>  sm    lHE%|v%%%%|v%%%|%%%%%%v%%%v%%%%%%%r5   c                 |   t        j                  ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}y)ud   마케팅 프롬프트가 워크플로우 파일(LOGICAL-TEAM-WORKFLOW.md)을 참조하는지 확인r  z
task-mkt-7r   LOGICAL-TEAM-WORKFLOW.mdrE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   'test_marketing_prompt_contains_workflowz@TestBuildMarketingPrompt.test_marketing_prompt_contains_workflowC  sp    lHE)3)V3333)V333)333333V333V3333333r5   c                    t        j                  dddd      }d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)u,   마케팅 + task_type=coding이면 QC 포함r  z
task-mkt-8   코딩 작업r~  r  rp  rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   +test_marketing_with_coding_type_includes_qczDTestBuildMarketingPrompt.test_marketing_with_coding_type_includes_qcH  sp    lOW_`${f$$$${f$$${$$$$$$f$$$f$$$$$$$r5   c                    t        j                  dddd      }d}||v}|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)u+   마케팅 + task_type=research면 QC 제외r  z
task-mkt-9	   리서치r  r  r   r   r   rG  rH   rK   rL   NrQ  rR  s         r3   *test_marketing_with_research_type_skips_qczCTestBuildMarketingPrompt.test_marketing_with_research_type_skips_qcM  ss    lKS]^-v----v---------v---v-------r5   N)r   r   r   r   r  r  r  r  r  r  r  r  r  r   r5   r3   r  r  "  s2    1,
6
6
6
6
&
4
%
.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
)TestBuildConsultingPromptu'   컨설팅 프롬프트 생성 테스트c                 |   t        j                  ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}y)u:   컨설팅 프롬프트에 '컨설팅 팀장' 역할 포함r  z
task-con-1u   보장 분석u   컨설팅 팀장rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   $test_consulting_prompt_contains_rolez>TestBuildConsultingPrompt.test_consulting_prompt_contains_role[  sp    |_M!+!V++++!V+++!++++++V+++V+++++++r5   c                 |   t        j                  ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}y)T   컨설팅 프롬프트가 팀 카드 파일(consulting.md)을 참조하는지 확인r  z
task-con-2u   보장 갭 분석prompts/teams/consulting.mdrE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   )test_consulting_prompt_contains_asclepiuszCTestBuildConsultingPrompt.test_consulting_prompt_contains_asclepius`  sq    |=PQ,6,6666,666,6666666666666666r5   c                 |   t        j                  ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}y)r  r  z
task-con-3u   약관 비교r  rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   &test_consulting_prompt_contains_themisz@TestBuildConsultingPrompt.test_consulting_prompt_contains_themise  p    |_M,6,6666,666,6666666666666666r5   c                 |   t        j                  ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}y)r  r  z
task-con-4u
   PDF 분석r  rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   &test_consulting_prompt_contains_skillsz@TestBuildConsultingPrompt.test_consulting_prompt_contains_skillsj  sp    |\J,6,6666,666,6666666666666666r5   c                 |   t        j                  ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d
x}}y
)u(   컨설팅 프롬프트에 task_id 포함r  z
task-con-5r   rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   'test_consulting_prompt_contains_task_idzATestBuildConsultingPrompt.test_consulting_prompt_contains_task_ido  m    |XF%|v%%%%|v%%%|%%%%%%v%%%v%%%%%%%r5   c                 |   t        j                  ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}y)ud   컨설팅 프롬프트가 워크플로우 파일(LOGICAL-TEAM-WORKFLOW.md)을 참조하는지 확인r  z
task-con-6r   r  rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   (test_consulting_prompt_contains_workflowzBTestBuildConsultingPrompt.test_consulting_prompt_contains_workflowt  sp    |XF)3)V3333)V333)333333V333V3333333r5   c                 |   t        j                  ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}y)u;   컨설팅 프롬프트에 보험 관련 컨텍스트 포함r  z
task-con-7u   보험 분석u   보험rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   1test_consulting_prompt_contains_insurance_contextzKTestBuildConsultingPrompt.test_consulting_prompt_contains_insurance_contexty  sm    |_M!x6!!!!x6!!!x!!!!!!6!!!6!!!!!!!r5   c                    t        j                  dddd      }d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)u,   컨설팅 + task_type=coding이면 QC 포함r  z
task-con-8r  r~  r  rp  rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   ,test_consulting_with_coding_type_includes_qczFTestBuildConsultingPrompt.test_consulting_with_coding_type_includes_qc~  sp    |_X`a${f$$$${f$$${$$$$$$f$$$f$$$$$$$r5   N)r   r   r   r   r  r  r  r  r  r  r  r  r   r5   r3   r  r  X  s-    1,
7
7
7
&
4
"
%r5   r  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}	 d}
t        |	|
      }|sdd	t        j                         v st        j                   t              rt        j"                  t              nd	d
t        j                         v st        j                   |	      rt        j"                  |	      nd
t        j"                  |
      t        j"                  |      dz  }t%        t        j&                  |            dx}
}d}|	j(                  }||v }
|
st        j*                  d|
fd||f      t        j"                  |      d
t        j                         v st        j                   |	      rt        j"                  |	      nd
t        j"                  |      dz  }dd|iz  }t%        t        j&                  |            dx}x}
}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   NrI  COKACDIR_KEY_ANUT)clearr   z5assert %(py5)s
{%(py5)s = %(py0)s(%(py1)s, %(py3)s)
}hasattrtp_fresh)re   rI   rJ   rL   rA   rE   )z1%(py1)s in %(py5)s
{%(py5)s = %(py3)s.TEAM_INFO
})rI   rJ   rL   zassert %(py7)sr   )	importlibtypessysmodulespoposenvironitemsr   dictrH  rI  r  rQ   rR   rN   rS   rP   rT   rU   r   rO   )rW   r  r  kmods_to_removesavedmvenv_without_keyr  rY   r   r[   rX   r   mods                   r3   $test_import_without_anu_key_no_crashz@TestModuleLevelImportSafety.test_import_without_anu_key_no_crash  s    &)[[HNa4G!HH 	*A{{q)E!H	*	%02

0@0@0B^1aK]F]q!t^O^BJJtD 97)45wx55555555w555w555555x555x5555555555555"8h&8&88{&88888{&8888{888888h888h888&888888889  ++- %3!$A% I _9 9  ++- %3!$A%sG   	J J !J7 8J%J%)J7 4F8J+,J7 %J7 +J40J7 7-K$N)r   r   r   r   r  r   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                 (   t        j                  ddd      }g }d}||v }|}|sd}||v }|}|sXt        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndd	z  }d
d|iz  }	|j                  |	       |st        j                  dfd|f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }
dd|
iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}x}}y)u@   출판 프롬프트에 '토트' 또는 '출판 센터장' 포함r  z
task-pub-1u   집필 작업u   토트ThothrE   r   rG  r   r   r   r   r   r   r   r   r   r   NrN  ri  s                 r3   $test_publishing_prompt_contains_rolez>TestBuildPublishingPrompt.test_publishing_prompt_contains_role  s    |_M6x6x6!6W6W%66666x6666x666666666666666666W666W66666666666666666666666r5   c                 |   t        j                  ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}y)Q   출판 프롬프트가 팀 카드 파일(publishing.md)을 참조하는지 확인r  z
task-pub-2u   아웃라인 설계prompts/teams/publishing.mdrE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   (test_publishing_prompt_contains_calliopezBTestBuildPublishingPrompt.test_publishing_prompt_contains_calliope  sq    |=RS,6,6666,666,6666666666666666r5   c                 |   t        j                  ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}y)r  r  z
task-pub-3u   초안 작성r  rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   %test_publishing_prompt_contains_eratoz?TestBuildPublishingPrompt.test_publishing_prompt_contains_erato  r  r5   c                 |   t        j                  ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}y)r  r  z
task-pub-4u   팩트 검증r  rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   $test_publishing_prompt_contains_clioz>TestBuildPublishingPrompt.test_publishing_prompt_contains_clio  r  r5   c                 |   t        j                  ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}y)r  r  z
task-pub-5u   퇴고r  rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   +test_publishing_prompt_contains_terpsichorezETestBuildPublishingPrompt.test_publishing_prompt_contains_terpsichore  p    |XF,6,6666,666,6666666666666666r5   c                 |   t        j                  ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}y)r  r  z
task-pub-6u   마케팅 카피r  rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   *test_publishing_prompt_contains_polyhymniazDTestBuildPublishingPrompt.test_publishing_prompt_contains_polyhymnia  sq    |=OP,6,6666,666,6666666666666666r5   c                 |   t        j                  ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d
x}}y
)u%   출판 프롬프트에 task_id 포함r  z
task-pub-7r   rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   'test_publishing_prompt_contains_task_idzATestBuildPublishingPrompt.test_publishing_prompt_contains_task_id  r  r5   c                 |   t        j                  ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}y)r  r  z
task-pub-8u   집필r  rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   2test_publishing_prompt_contains_anti_hallucinationzLTestBuildPublishingPrompt.test_publishing_prompt_contains_anti_hallucination  r  r5   c                 |   t        j                  ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}y)r  r  z
task-pub-9u   검토r  rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   +test_publishing_prompt_contains_6dim_reviewzETestBuildPublishingPrompt.test_publishing_prompt_contains_6dim_review  r  r5   c                 |   t        j                  ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}y)r  r  ztask-pub-10u	   밸런스r  rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   /test_publishing_prompt_contains_content_balancezITestBuildPublishingPrompt.test_publishing_prompt_contains_content_balance  sp    }kJ,6,6666,666,6666666666666666r5   c                    t        j                  dddd      }d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)u)   출판 + task_type=coding이면 QC 포함r  ztask-pub-11r  r~  r  rp  rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   ,test_publishing_with_coding_type_includes_qczFTestBuildPublishingPrompt.test_publishing_with_coding_type_includes_qc  sp    }oYab${f$$$${f$$${$$$$$$f$$$f$$$$$$$r5   c                    t        j                  dddd      }d}||v}|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)u(   출판 + task_type=research면 QC 제외r  ztask-pub-12r  r  r  r   r   r   rG  rH   rK   rL   NrQ  rR  s         r3   +test_publishing_with_research_type_skips_qczETestBuildPublishingPrompt.test_publishing_with_research_type_skips_qc  ss    }kU_`-v----v---------v---v-------r5   c                 &   t         j                  d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)	u2   TEAM_INFO에서 publishing의 type이 'publishing'r  r   r  r  r  r  r  Nr  r  s         r3   "test_publishing_type_is_publishingz<TestBuildPublishingPrompt.test_publishing_type_is_publishing  s]    ||L)&1A\A1\AAAA1\AAA1AAA\AAAAAAAr5   N)r   r   r   r   r  r  r  r  r  r  r  r  r  r  r  r  r   r   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                 (   t        j                  ddd      }g }d}||v }|}|sd}||v }|}|sXt        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndd	z  }d
d|iz  }	|j                  |	       |st        j                  dfd|f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }
dd|
iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}x}}y)uL   디자인 프롬프트에 '아마테라스' 또는 '디자인 팀장' 포함r  z
task-des-1u   카드뉴스 제작u   아마테라스	AmaterasurE   r   rG  r   r   r   r   r   r   r   r   r   r   NrN  ri  s                 r3    test_design_prompt_contains_rolez6TestBuildDesignPrompt.test_design_prompt_contains_role  s    <9NOC C F*CkCkV.CCCCC FCCC CCCCCCFCCCFCCCCCCCkVCCCkCCCCCCVCCCVCCCCCCCCCCCCCCr5   c                 |   t        j                  ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}y)P   디자인 프롬프트가 팀 카드 파일(design.md)을 참조하는지 확인r  z
task-des-2u   배너 제작prompts/teams/design.mdrE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   %test_design_prompt_contains_benzaitenz;TestBuildDesignPrompt.test_design_prompt_contains_benzaiten  sp    <I(2(F2222(F222(222222F222F2222222r5   c                 |   t        j                  ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}y)r  r  z
task-des-3u   하이브리드 이미지r  rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   !test_design_prompt_contains_inariz7TestBuildDesignPrompt.test_design_prompt_contains_inari   sq    <9TU(2(F2222(F222(222222F222F2222222r5   c                 |   t        j                  ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}y)r  r  z
task-des-4u   아트 디자인r  rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   "test_design_prompt_contains_kaguyaz8TestBuildDesignPrompt.test_design_prompt_contains_kaguya  q    <9KL(2(F2222(F222(222222F222F2222222r5   c                 |   t        j                  ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}y)r  r  z
task-des-5u   이미지 생성r  rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   "test_design_prompt_contains_skillsz8TestBuildDesignPrompt.test_design_prompt_contains_skills
  r  r5   c                 |   t        j                  ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d
x}}y
)u(   디자인 프롬프트에 task_id 포함r  z
task-des-6r   rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   #test_design_prompt_contains_task_idz9TestBuildDesignPrompt.test_design_prompt_contains_task_id  sm    <B%|v%%%%|v%%%|%%%%%%v%%%v%%%%%%%r5   c                 |   t        j                  ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}y)ud   디자인 프롬프트가 워크플로우 파일(LOGICAL-TEAM-WORKFLOW.md)을 참조하는지 확인r  z
task-des-7r   r  rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   $test_design_prompt_contains_workflowz:TestBuildDesignPrompt.test_design_prompt_contains_workflow  sp    <B)3)V3333)V333)333333V333V3333333r5   c                 |   t        j                  ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}y)r  r  z
task-des-8u	   이미지r  rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   )test_design_prompt_contains_routing_rulesz?TestBuildDesignPrompt.test_design_prompt_contains_routing_rules  sp    <E(2(F2222(F222(222222F222F2222222r5   c                    t        j                  dddd      }d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)u,   디자인 + task_type=coding이면 QC 포함r  z
task-des-9r  r~  r  rp  rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   (test_design_with_coding_type_includes_qcz>TestBuildDesignPrompt.test_design_with_coding_type_includes_qc  sp    <T\]${f$$$${f$$${$$$$$$f$$$f$$$$$$$r5   c                    t        j                  dddd      }d}||v}|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)u+   디자인 + task_type=research면 QC 제외r  ztask-des-10r  r  r  r   r   r   rG  rH   rK   rL   NrQ  rR  s         r3   'test_design_with_research_type_skips_qcz=TestBuildDesignPrompt.test_design_with_research_type_skips_qc#  ss    =+Q[\-v----v---------v---v-------r5   N)r   r   r   r   r  r	  r  r  r  r  r  r  r  r  r   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                     | j                   dz  j                  d      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            d x}}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            d x}}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            d x}}y )Nmarketing.mdr   r   u	   아폴론rE   rG   r4  rH   rK   rL   u	   페이토u   에이레네
	_CARD_DIR	read_textrN   rO   rP   rQ   rR   rS   rT   rU   rW   r4  rX   rY   rZ   r[   s         r3   $test_marketing_card_contains_membersz8TestCardFileContent.test_marketing_card_contains_members4  s)   >>N2==w=O%{g%%%%{g%%%{%%%%%%g%%%g%%%%%%%%{g%%%%{g%%%{%%%%%%g%%%g%%%%%%%(~((((~(((~((((((((((((((((r5   c                     | j                   dz  j                  d      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            d x}}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            d x}}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            d x}}y )Nr  r   r   zcontent-strategyrE   rG   r4  rH   rK   rL   copywritingzblog-writerr  r"  s         r3   #test_marketing_card_contains_skillsz7TestCardFileContent.test_marketing_card_contains_skills:  s,   >>N2==w=O!,!W,,,,!W,,,!,,,,,,W,,,W,,,,,,,'}''''}'''}'''''''''''''''''}''''}'''}''''''''''''''''r5   c                    | j                   dz  j                  d      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            d x}}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            d x}}y )Nr  r   r   u   서울대보험쌤rE   rG   r4  rH   rK   rL   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...#......w...w.......#.#w....#w...#......w...w.......r5   c                    | j                   dz  j                  d      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            d x}}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            d x}}y )Nconsulting.mdr   r   u   아스클레피오스rE   rG   r4  rH   rK   rL   u	   테미스r  r"  s         r3   %test_consulting_card_contains_membersz9TestCardFileContent.test_consulting_card_contains_membersE  s    >>O3>>>P&1&'1111&'111&111111'111'1111111%{g%%%%{g%%%{%%%%%%g%%%g%%%%%%%r5   c                    | j                   dz  j                  d      }d}|j                  } |       }||v }|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      ndt        j
                  |      t        j
                  |      dz  }d	d
|iz  }t        t        j                  |            d x}x}x}}d}|j                  } |       }||v }|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      ndt        j
                  |      t        j
                  |      dz  }d	d
|iz  }t        t        j                  |            d x}x}x}}y )Nr*  r   r   pdfrE   )zD%(py1)s in %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.lower
}()
}r4  )rI   rJ   rL   r   zassert %(py9)spy9supabase)r   r!  lowerrN   rO   rP   rQ   rR   rS   rT   rU   )rW   r4  rX   r   @py_assert6rY   r   @py_format10s           r3   $test_consulting_card_contains_skillsz8TestCardFileContent.test_consulting_card_contains_skillsJ  s   >>O3>>>P'''u''''u'''u'''''''''''''''''''''',W]],]_,z_,,,,z_,,,z,,,,,,W,,,W,,,],,,_,,,,,,,r5   c                     | j                   dz  j                  d      }dD ]  }||v }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      nddt	        j
                         v st        j                  |      rt        j                  |      ndd	z  }t        j                  d
| d      dz   d|iz  }t        t        j                  |            d } y )Npublishing.mdr   r   )u   칼리오페u	   에라토u	   클리오u   테르프시코레u   폴리뮤니아u   세쉬아트rE   rb   r1  r4  rd   u   publishing.md에 'rg   rh   ri   )r   r!  rN   rO   rQ   rR   rS   rP   rk   rT   rU   )rW   r4  r1  rm   rn   ro   s         r3   %test_publishing_card_contains_membersz9TestCardFileContent.test_publishing_card_contains_membersO  s    >>O3>>>Pw 	HD7?GGG47GGGGGG4GGG4GGGGGG7GGG7GGGG&8h$GGGGGGG	Hr5   c                    | j                   dz  j                  d      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            d x}}g }d}||v }|}|sd}||v }	|	}|sXt        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }
|j                  |
       |st        j                  d	fd|f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            d x}x}x}x}x}}	d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            d x}}y )Nr5  r   r   u	   반환각rE   rG   r4  rH   rK   rL   u   6차원zFact Checkerr   r   r   r   r   r   r   r   r   r   r   z60%)r   r!  rN   rO   rP   rQ   rR   rS   rT   rU   r   r   )rW   r4  rX   rY   rZ   r[   rm   r   r   r   r   r   r   r   r   s                  r3   +test_publishing_card_contains_quality_rulesz?TestCardFileContent.test_publishing_card_contains_quality_rulesT  s   >>O3>>>P%{g%%%%{g%%%{%%%%%%g%%%g%%%%%%%@y@yG#@~@~'@@@@@yG@@@y@@@@@@G@@@G@@@@@@@~@@@~@@@@@@@@@@@@@@@@@@@@@@@uuur5   c                     | j                   dz  j                  d      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            d x}}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            d x}}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            d x}}y )N	design.mdr   r   u   벤자이텐rE   rG   r4  rH   rK   rL   u	   이나리u	   카구야r  r"  s         r3   !test_design_card_contains_membersz5TestCardFileContent.test_design_card_contains_membersZ  s)   >>K/::G:L(~((((~(((~((((((((((((((((%{g%%%%{g%%%{%%%%%%g%%%g%%%%%%%%{g%%%%{g%%%{%%%%%%g%%%g%%%%%%%r5   c                    | j                   dz  j                  d      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            d x}}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            d x}}y )Nr:  r   r   zsatori-cardnewsrE   rG   r4  rH   rK   rL   zcanvas-designr  r"  s         r3    test_design_card_contains_skillsz4TestCardFileContent.test_design_card_contains_skills`  s    >>K/::G:L + G++++ G+++ ++++++G+++G+++++++)'))))')))))))))')))')))))))r5   c                 8   | j                   dz  j                  d      }g }d}||v }|}|sd}||v }|}|sXt        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndd	z  }d
d|iz  }	|j                  |	       |st        j                  dfd|f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }
dd|
iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            d x}x}x}x}x}}y )Nr:  r   r   u   포토리얼u	   라우팅rE   r   r4  r   r   r   r   r   r   r   r   r   r   )r   r!  rN   rO   rP   rQ   rR   rS   r   r   rT   rU   )rW   r4  rm   rY   r   rX   r   r   r[   r   r   r   r   r   s                 r3   !test_design_card_contains_routingz5TestCardFileContent.test_design_card_contains_routinge  s    >>K/::G:LB~B~(BKBK7,BBBBB~BBB~BBBBBBBBBBBBBBBBK7BBBKBBBBBB7BBB7BBBBBBBBBBBBBBr5   c                    | j                   j                  d      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d x}}y )
Nr   r   u!   에이전트 미팅 기록 규칙rE   rG   r4  rH   rK   rL   
_WORKFLOW_FILEr!  rN   rO   rP   rQ   rR   rS   rT   rU   r"  s         r3   )test_workflow_file_contains_meeting_rulesz=TestCardFileContent.test_workflow_file_contains_meeting_rulesi  sw    %%///A2=2g====2g===2======g===g=======r5   c                    | j                   j                  d      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d x}}y )
Nr   r   u   500자 이내rE   rG   r4  rH   rK   rL   rA  r"  s         r3   *test_workflow_file_contains_subagent_rulesz>TestCardFileContent.test_workflow_file_contains_subagent_rulesm  st    %%///A)'))))')))))))))')))')))))))r5   c                    | j                   j                  d      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d x}}d
}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d x}}y )Nr   r   r  rE   rG   r4  rH   rK   rL   r  rA  r"  s         r3   %test_workflow_file_contains_cross_orgz9TestCardFileContent.test_workflow_file_contains_cross_orgq  s    %%///A%{g%%%%{g%%%{%%%%%%g%%%g%%%%%%%"x7""""x7"""x""""""7"""7"""""""r5   c                    | j                   j                  d      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d x}}y )
Nr   r   zfinish-task.shrE   rG   r4  rH   rK   rL   rA  r"  s         r3   'test_workflow_file_contains_finish_taskz;TestCardFileContent.test_workflow_file_contains_finish_taskv  sw    %%///A*7****7*********7***7*******r5   N)r   r   r   r   r    r   rB  r#  r&  r(  r+  r3  r6  r8  r;  r=  r?  rC  rE  rG  rI  r   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   rW   r:   s     r3   _patch_anu_keyz/TestSessionOptimizationInPrompts._patch_anu_key       	B	>:r5   c           
         t         j                  d   }t        j                  |ddddddd      }d}||v }|st        j                  d	|fd
||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}}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   rE   rG   rG  rH   u5   direct 프롬프트에 'DIRECT-WORKFLOW.md' 미포함
>assert %(py5)srL   N)r   r   r!   rN   rO   rP   rQ   rR   rS   rk   rT   rU   rW   r*   rG  rX   rY   rZ   r[   s          r3   0test_direct_prompt_contains_session_optimizationzQTestSessionOptimizationInPrompts.test_direct_prompt_contains_session_optimization  s    ||K(((!)%#	
 $f#v-fff#vfff#ffffffvfffvffff/fffffffr5   c           
         t         j                  d   }t        j                  |ddddddd      }d}||v }|st        j                  d	|fd
||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}}d}||v }|st        j                  d	|fd
||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}}d}||v }|st        j                  d	|fd
||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}}y)uS   GLM 팀 프롬프트에도 세션 경량화 규칙이 포함되어 있는지 확인r   ztask-test-session-2u   GLM 세션 경량화 테스트r7   rT  rU  rV  u   세션 경량화 규칙rE   rG   rG  rH   u7   GLM 프롬프트에 '세션 경량화 규칙' 미포함rW  rL   Nz/compactu(   GLM 프롬프트에 '/compact' 미포함u   체크포인트u/   GLM 프롬프트에 '체크포인트' 미포함)r   r   r#   rN   rO   rP   rQ   rR   rS   rk   rT   rU   rX  s          r3   -test_glm_prompt_contains_session_optimizationzNTestSessionOptimizationInPrompts.test_glm_prompt_contains_session_optimization  so   ||K(%%!,%#	
 )m(F2mmm(Fmmm(mmmmmmFmmmFmmmm4mmmmmmmOzV#OOOzVOOOzOOOOOOVOOOVOOOO%OOOOOOO ] F*]]] F]]] ]]]]]]F]]]F]]]],]]]]]]]r5   N)	r   r   r   r   r   r_  rQ  rY  r[  r   r5   r3   rK  rK    s.    eV^^D!; ";g^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
)TestThreeDocsSectionu]   3문서 활용 지침 섹션이 level에 따라 올바르게 포함/미포함되는지 검증c                 z   t        j                  dd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d
x}}y
)u-   critical: 3문서 활용 지침 섹션 포함	task-testr      3문서 활용 지침rE   rG   rG  rH   rK   rL   N
r   r$   rN   rO   rP   rQ   rR   rS   rT   rU   rR  s         r3   )test_three_docs_section_critical_includedz>TestThreeDocsSection.test_three_docs_section_critical_included  p    --k:F&0&&0000&&000&000000&000&0000000r5   c                 z   t        j                  dd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d
x}}y
)u-   security: 3문서 활용 지침 섹션 포함r_  r   r`  rE   rG   rG  rH   rK   rL   Nra  rR  s         r3   )test_three_docs_section_security_includedz>TestThreeDocsSection.test_three_docs_section_security_included  rc  r5   c                 |   t        j                  dd      }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}}y
)u.   normal: 3문서 활용 지침 섹션 미포함r_  r7   r   r  z%(py0)s == %(py3)srG  re   rJ   rK   rL   N
r   r$   rN   rO   rQ   rR   rS   rP   rT   rU   rW   rG  rY   rm   rZ   r[   s         r3   'test_three_docs_section_normal_excludedz<TestThreeDocsSection.test_three_docs_section_normal_excluded  sl    --k8Dv|vvvr5   c                 z   t        j                  dd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d
x}}y
)u'   3문서 섹션에 plan.md 경로 포함task-42r   z"memory/plans/tasks/task-42/plan.mdrE   rG   rG  rH   rK   rL   Nra  rR  s         r3   *test_three_docs_section_contains_plan_pathz?TestThreeDocsSection.test_three_docs_section_contains_plan_path  sp    --iD3=3v====3v===3======v===v=======r5   c                 z   t        j                  dd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d
x}}y
)u0   3문서 섹션에 context-notes.md 경로 포함rm  r   z+memory/plans/tasks/task-42/context-notes.mdrE   rG   rG  rH   rK   rL   Nra  rR  s         r3   3test_three_docs_section_contains_context_notes_pathzHTestThreeDocsSection.test_three_docs_section_contains_context_notes_path  sp    --iD<F<FFFF<FFF<FFFFFFFFFFFFFFFFr5   c                 z   t        j                  dd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d
x}}y
)u,   3문서 섹션에 checklist.md 경로 포함rm  r   z'memory/plans/tasks/task-42/checklist.mdrE   rG   rG  rH   rK   rL   Nra  rR  s         r3   /test_three_docs_section_contains_checklist_pathzDTestThreeDocsSection.test_three_docs_section_contains_checklist_path  sp    --iD8B8FBBBB8FBBB8BBBBBBFBBBFBBBBBBBr5   c                 X   t        j                  dd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d
x}}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d
x}}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d
x}}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d
x}}y
)u-   3문서 섹션에 팀장 의무 항목 포함rm  r   u   팀장 의무rE   rG   rG  rH   rK   rL   Nzplan.mdzcontext-notes.mdzchecklist.mdra  rR  s         r3   .test_three_docs_section_contains_leader_dutieszCTestThreeDocsSection.test_three_docs_section_contains_leader_duties  s{   --iD(&((((&(((((((((&(((&((((((("yF""""yF"""y""""""F"""F"""""""!+!V++++!V+++!++++++V+++V+++++++'~''''~'''~''''''''''''''''r5   c                 |   t        j                  dd      }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}}y
)u*   알 수 없는 level: 빈 문자열 반환r_  unknownr   r  rg  rG  rh  rK   rL   Nri  rj  s         r3   /test_three_docs_section_empty_for_unknown_levelzDTestThreeDocsSection.test_three_docs_section_empty_for_unknown_level  sl    --k9Ev|vvvr5   N)r   r   r   r   rb  re  rk  rn  rp  rr  rt  rw  r   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rM  rO  rP  s     r3   rQ  z)TestThreeDocsInBuildPrompt._patch_anu_key  rR  r5   c                 f    |dddd      }d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j
                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)u<   critical 레벨 프롬프트에 3문서 활용 지침 포함rA   task-99r]  r   r   r`  rE   rG   r1   rH   rK   rL   NrM   rV   s          r3   (test_critical_prompt_includes_three_docszCTestThreeDocsInBuildPrompt.test_critical_prompt_includes_three_docs  o    %k9kQ[\&0&&0000&&000&000000&000&0000000r5   c                 f    |dddd      }d}||v}|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j
                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)u=   normal 레벨 프롬프트에 3문서 활용 지침 미포함rA   r|  r]  r7   r   r`  r   r   r1   rH   rK   rL   NrM   rV   s          r3   &test_normal_prompt_excludes_three_docszATestThreeDocsInBuildPrompt.test_normal_prompt_excludes_three_docs  so    %k9kQYZ&4&f4444&f444&444444f444f4444444r5   c                 f    |dddd      }d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j
                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)u<   security 레벨 프롬프트에 3문서 활용 지침 포함rA   r|  r]  r   r   r`  rE   rG   r1   rH   rK   rL   NrM   rV   s          r3   (test_security_prompt_includes_three_docszCTestThreeDocsInBuildPrompt.test_security_prompt_includes_three_docs  r~  r5   N)
r   r   r   r   r   r_  rQ  r}  r  r  r   r5   r3   ry  ry    s1    WV^^D!; ";1
5
1r5   ry  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rM  rO  rP  s     r3   rQ  z/TestCodexAndSanitizeGateInPrompt._patch_anu_key  rR  r5   c                 f    |dddd      }d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j
                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)uE   critical: Codex 사전 검증 실행 명령이 프롬프트에 포함rA   	task-1925r]  r   r   codex_gate_check.pyrE   rG   r1   rH   rK   rL   NrM   rV   s          r3   )test_critical_contains_codex_gate_commandzJTestCodexAndSanitizeGateInPrompt.test_critical_contains_codex_gate_command  o    %k;S]^$.$....$...$................r5   c                 f    |dddd      }d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j
                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)uN   critical: Sanitize 게이트 구체적 실행 방법이 프롬프트에 포함rA   r  r]  r   r   sanitize_textrE   rG   r1   rH   rK   rL   NrM   rV   s          r3   $test_critical_contains_sanitize_gatezETestCodexAndSanitizeGateInPrompt.test_critical_contains_sanitize_gate  l    %k;S]^(&((((&(((((((((&(((&(((((((r5   c                 f    |dddd      }d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j
                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)uE   security: Codex 사전 검증 실행 명령이 프롬프트에 포함rA   r  r]  r   r   r  rE   rG   r1   rH   rK   rL   NrM   rV   s          r3   )test_security_contains_codex_gate_commandzJTestCodexAndSanitizeGateInPrompt.test_security_contains_codex_gate_command  r  r5   c                 f    |dddd      }d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j
                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)uD   security: Sanitize 게이트 실행 방법이 프롬프트에 포함rA   r  r]  r   r   r  rE   rG   r1   rH   rK   rL   NrM   rV   s          r3   $test_security_contains_sanitize_gatezETestCodexAndSanitizeGateInPrompt.test_security_contains_sanitize_gate  r  r5   c                 f    |dddd      }d}||v}|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j
                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)u,   normal: Codex 사전 검증 명령 미포함rA   r  r]  r7   r   r  r   r   r1   rH   rK   rL   NrM   rV   s          r3   test_normal_excludes_codex_gatez@TestCodexAndSanitizeGateInPrompt.test_normal_excludes_codex_gate  so    %k;S[\$2$F2222$F222$222222F222F2222222r5   c                 f    |dddd      }d}||v}|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j
                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            dx}}y)u<   normal: Sanitize 게이트 구체적 실행 방법 미포함rA   r  r]  r7   r   r  r   r   r1   rH   rK   rL   NrM   rV   s          r3   )test_normal_excludes_sanitize_gate_detailzJTestCodexAndSanitizeGateInPrompt.test_normal_excludes_sanitize_gate_detail  sl    %k;S[\,f,,,,f,,,,,,,,,f,,,f,,,,,,,r5   c                     |dddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      ndd	z  }d
d|iz  }t        t        j                  |            dx}}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      ndd	z  }d
d|iz  }t        t        j                  |            dx}}y)u1   Codex 명령에 task_id가 포함되는지 확인rA   r  r]  r   r   rE   rG   r1   rH   rK   rL   Nz'codex_gate_check.py --task-id task-1925rM   rV   s          r3   #test_codex_command_contains_task_idzDTestCodexAndSanitizeGateInPrompt.test_codex_command_contains_task_id   s    %k;S]^${f$$$${f$$${$$$$$$f$$$f$$$$$$$8B8FBBBB8FBBB8BBBBBBFBBBFBBBBBBBr5   N)r   r   r   r   r   r_  rQ  r  r  r  r  r  r  r  r   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rM  rO  rP  s     r3   rQ  z*TestL1SmokeTestRecordFormat._patch_anu_key*  rR  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/  r0  r2  s         r3   r9  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   rA  rB  rC  rD  s        @@@r3   rE  z-TestL1SmokeTestRecordFormat._patch_file_write/  sj     h&0td3"oo	N	Q 	D,0BCD'=9r5   c                    t        j                  ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}y)uH   모든 프롬프트에 L1 스모크테스트 결과 기록 형식 포함rA   ztask-test-l1   L1 테스트u   서버 재시작: [rE   rG   rG  rH   rK   rL   Nu   API 응답 확인: [u   스크린샷: [rQ  rR  s         r3   %test_prompt_contains_l1_record_formatzATestL1SmokeTestRecordFormat.test_prompt_contains_l1_record_formatI  s(   nnM$.$....$...$................%/%////%///%//////////////// * F**** F*** ******F***F*******r5   c                 |   t        j                  ddd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            dx}}y)u   불완전 처리 경고 포함rA   ztask-test-l1-2r  u   불완전 처리rE   rG   rG  rH   rK   rL   NrQ  rR  s         r3   'test_prompt_contains_incomplete_warningzCTestL1SmokeTestRecordFormat.test_prompt_contains_incomplete_warningP  sq    .>O!+!V++++!V+++!++++++V+++V+++++++r5   N)
r   r   r   r   r   r_  rQ  rE  r  r  r   r5   r3   r  r  '  sK    iV^^D!; "; V^^D!: ":2+,r5   r  ).r   builtinsrQ   _pytest.assertion.rewrite	assertionrewriterN   r  r  pathlibr   unittest.mockr   r   r   r  r   r    r   pathinsertrH  rI  r   r_  r=   r?   r   r   r   r  r)  ra  rn  r|  r  r  r  r  r  r  rK  r]  ry  r  r  r   r5   r3   <module>r     sk    	 
  *  "**..!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   