# 토큰 절약 Phase 1 — Team 1 작업

## 작업 1: QC-RULES 레벨 분리

### 현재 상태
- `/home/jay/workspace/teams/shared/QC-RULES.md` (206줄, ~5,600 토큰)
- 팀장 세션마다 전체 파일을 읽음
- 대부분 작업이 `normal` 레벨인데, critical/security 전용 섹션도 항상 로딩됨

### 변경 사항

#### 1-1. QC-RULES.md 분리

**`QC-RULES.md`** (base — normal 레벨 기본):
- Section 1-A (기본 체크리스트 5항목) — 유지
- Section 2 (자동 검증 qc_verify.py 사용법 + verifier 목록) — 유지
- Section 5 (에러 처리 원칙) — 유지
- 변경이력 — 유지
- 하단에 안내 1줄 추가: "데이터 계약/마아트/로키 규칙은 QC-RULES-EXTENDED.md 참조"

**`QC-RULES-EXTENDED.md`** (critical/security + 데이터 계약 전용, 새 파일):
- Section 1-B (데이터 계약 체크리스트)
- Section 1.5 (인터페이스 계약 관리)
- Section 3 (마아트 독립 검증)
- Section 4 (로키 보안 감사)
- 상단에 "이 파일은 critical/security 레벨 또는 workers/ 변경 시 읽으세요" 안내

두 파일 모두 `/home/jay/workspace/teams/shared/` 에 위치.

#### 1-2. team_prompts.py 수정

`/home/jay/workspace/prompts/team_prompts.py`의 `_build_verification_section()` 함수 수정:

현재:
```python
def _build_verification_section(level: str) -> str:
    qc_rules_path = f"{WORKSPACE_ROOT}/teams/shared/QC-RULES.md"
    section = (
        f"\n\n## 보고서 작성 전 셀프 QC + 자동 검증\n"
        f"{qc_rules_path}를 읽고 따르세요.\n"
        f"- 검증 레벨: {level}\n"
    )
```

변경:
```python
def _build_verification_section(level: str) -> str:
    qc_base_path = f"{WORKSPACE_ROOT}/teams/shared/QC-RULES.md"
    qc_ext_path = f"{WORKSPACE_ROOT}/teams/shared/QC-RULES-EXTENDED.md"

    section = (
        f"\n\n## 보고서 작성 전 셀프 QC + 자동 검증\n"
        f"{qc_base_path}를 읽고 따르세요.\n"
        f"- 검증 레벨: {level}\n"
    )

    if level in ("critical", "security"):
        section += f"- {qc_ext_path}도 읽고 따르세요. (마아트/로키 검증 포함)\n"
    else:
        section += f"- workers/ 하위 파일을 변경한 경우 {qc_ext_path}의 데이터 계약 섹션도 읽으세요.\n"
    ...
```

**주의**: `_build_verification_section`에서 레벨별 분기 텍스트(normal/critical/security)는 그대로 유지. 경로 참조만 변경.

---

## 작업 2: Step 7 완료 통보 스크립트화

### 현재 상태
- `/home/jay/workspace/prompts/DIRECT-WORKFLOW.md` Step 7이 매우 긴 1줄 (약 500자)
- 매 세션마다 이 긴 cokacdir 명령어를 읽고 변수 치환해야 함

### 변경 사항

#### 2-1. notify-completion.py 생성

**`/home/jay/workspace/scripts/notify-completion.py`** (신규):

```python
#!/usr/bin/env python3
"""팀장 → 아누 완료 통보 스크립트 (DIRECT-WORKFLOW Step 7 대체)"""

import argparse
import os
import subprocess
import sys

WORKSPACE_ROOT = os.environ.get("WORKSPACE_ROOT", "/home/jay/workspace")

def main():
    parser = argparse.ArgumentParser(description="팀장 → 아누 완료 통보")
    parser.add_argument("task_id", help="작업 ID (예: task-381.1)")
    parser.add_argument("--chat-id", default=os.environ.get("COKACDIR_CHAT_ID", "6937032012"))
    parser.add_argument("--anu-key", default=os.environ.get("COKACDIR_KEY_ANU", "c119085addb0f8b7"))
    args = parser.parse_args()

    report_path = f"{WORKSPACE_ROOT}/memory/reports/{args.task_id}.md"

    prompt = (
        f"{args.task_id} 완료 처리. "
        f"먼저 python3 -c 명령으로 {WORKSPACE_ROOT}/memory/events/{args.task_id}.done.clear 파일을 "
        f"open(str(p),'x')로 원자적 생성 시도하라. p.parent.mkdir(parents=True,exist_ok=True)로 부모 디렉토리 먼저 생성. "
        f"open 성공(proceed 출력) 시 {report_path} 보고서 읽고 제이회장님께 핵심 요약 보고하라. "
        f"FileExistsError 발생 시 이미 처리된 건이니 아무 행동 없이 종료하라. "
        f"그리고 python3 {WORKSPACE_ROOT}/chain_manager.py next --task-id {args.task_id} 실행. "
        f"결과가 action=dispatch이면 표시된 task_file과 team으로 dispatch.py 위임하라. "
        f"결과가 action=stalled이면 제이회장님께 '체인 정체: (이유)' 보고하라. "
        f"결과가 action=chain_complete이면 '체인 전체 완료' 보고하라. "
        f"결과가 action=no_chain이면 체인 없는 일반 작업이므로 무시하라."
    )

    cmd = [
        "cokacdir",
        "--cron", prompt,
        "--at", "1m",
        "--chat", args.chat_id,
        "--key", args.anu_key,
        "--once",
    ]

    result = subprocess.run(cmd, capture_output=True, text=True)
    print(result.stdout)
    if result.returncode != 0:
        print(f"ERROR: {result.stderr}", file=sys.stderr)
        sys.exit(1)

if __name__ == "__main__":
    main()
```

#### 2-2. DIRECT-WORKFLOW.md Step 7 수정

현재 Step 7 (긴 cokacdir --cron 명령):
```
7. 아누에게 완료 통보: `cokacdir --cron "{task_id} 완료 처리. 먼저 python3 -c ... (매우 긴 명령)" --at 1m --chat {CHAT_ID} --key {ANU_KEY} --once`
```

변경 후:
```
7. 아누에게 완료 통보: `python3 {WORKSPACE_ROOT}/scripts/notify-completion.py {task_id}`
```

#### 2-3. chain_id 지원 (선택)

Step 8의 chain 완료 알림도 notify-completion.py에 --chain-id 옵션으로 통합:
```python
parser.add_argument("--chain-id", default=None, help="체인 ID (Phase 체이닝용)")
```

chain_id가 있으면 Step 8 로직(chain.py task-done)도 자동 실행.

---

## 테스트

### QC-RULES 분리 테스트
1. 기존 `tests/test_team_prompts.py` 실행 — PASS 확인
2. `_build_verification_section("normal")` 출력에 QC-RULES.md 경로 포함 확인
3. `_build_verification_section("critical")` 출력에 QC-RULES-EXTENDED.md 경로 포함 확인
4. 두 파일의 내용 합 = 기존 QC-RULES.md 내용과 동일 확인

### notify-completion.py 테스트
1. `python3 scripts/notify-completion.py --help` 정상 출력
2. 단위 테스트: argparse 파싱, prompt 생성 문자열 검증
3. cokacdir 호출은 mock 처리 (실제 전송 방지)

## QC 기준
- 기존 test_team_prompts.py 통과
- 신규 테스트 추가 (notify-completion.py)
- pyright 0 errors
- black + isort 적용
