# task-439.1 보고서: 팀장 자기체이닝 인프라 강화 + 보안 조치

**팀**: dev2-team (오딘)
**레벨**: Lv.2
**작업일**: 2026-03-10

---

## 작업 요약

에이전트 미팅 합의 사항에 따라 기존 인프라(notify-completion.py + chain_manager.py)를 강화하여:
1. 팀장 자기체이닝 워크플로우 추가
2. 중간 Phase 토큰 절약 (아누 세션 스킵)
3. ANU_KEY 보안 취약점 수정 + 디렉토리 권한 강화

---

## 작업 1: 자기체이닝 워크플로우

### DIRECT-WORKFLOW.md (dev1/dev2용)
- Step 5.5 "자기체이닝" 추가
- chain_manager.py check으로 체인 소속/마지막 여부 확인
- 마지막이 아니면 다음 Phase 지시서를 팀장이 직접 작성
- notify-completion.py가 자동 dispatch 처리

### GLM-WORKFLOW.md (dev3용)
- Step 10.5 "자기체이닝" 추가
- 동일한 규칙 (체인 확인 → 지시서 작성 → 자동 dispatch)

---

## 작업 2: 토큰 절약

### chain_manager.py — check 서브커맨드 추가
- 읽기 전용 커맨드: 체인 소속 여부 + 마지막 Phase 여부 확인
- 출력: `{"in_chain": bool, "is_last": bool, "chain_id": str|null, "next_task_id": str|null}`
- 기존 `_find_chain_for_task()` 헬퍼 활용, 락 불필요

### notify-completion.py — 체인 인식 분기
- **변경 전**: 모든 완료 → cokacdir --cron으로 아누 Opus 세션 깨움
- **변경 후**:
  - 체인 중간 Phase → .done.clear 선점 → chain_manager.py next 직접 호출 → 텔레그램 알림만
  - 체인 마지막 Phase OR 일반 작업 → 기존대로 아누 세션 깨움
- 8개 함수로 분리: get_anu_key, check_chain_status, build_prompt, wake_anu_session, send_telegram_notification, create_done_clear, dispatch_next_phase, end_task_timer

### 텔레그램 알림 함수
- `send_telegram_notification()`: cokacdir --cron --at 10s --once로 텍스트만 전송
- 실패/타임아웃 시 WARNING만 출력 (fatal 아님)

---

## 작업 3: 보안 조치

### ANU_KEY 하드코딩 제거 (3개 파일)
- `prompts/team_prompts.py:18` — fallback 제거, 없으면 EnvironmentError
- `chain_manager.py:37` — 동일
- `scripts/notify-completion.py` — argparse default 대신 get_anu_key() 함수로 전환

### 디렉토리 권한 강화
```
chmod 700 /home/jay/workspace/memory/events/
chmod 700 /home/jay/workspace/memory/tasks/
chmod 700 /home/jay/workspace/memory/chains/
```

---

## 수정/생성 파일 목록

| 파일 | 작업 |
|------|------|
| `/home/jay/workspace/chain_manager.py` | check 서브커맨드 추가 + ANU_KEY 보안 |
| `/home/jay/workspace/scripts/notify-completion.py` | 체인 인식 분기 전면 재작성 + ANU_KEY 보안 |
| `/home/jay/workspace/prompts/team_prompts.py` | ANU_KEY 보안 |
| `/home/jay/workspace/prompts/DIRECT-WORKFLOW.md` | 자기체이닝 규칙 추가 |
| `/home/jay/workspace/teams/dev3/GLM-WORKFLOW.md` | 자기체이닝 규칙 추가 |
| `/home/jay/workspace/tests/test_chain_manager.py` | TestCheck 4개 테스트 추가 |
| `/home/jay/workspace/tests/test_notify_completion.py` | 신규 24개 테스트 |

---

## 테스트 결과

- **pytest**: 799 passed (전체 테스트 스위트), 0 failed
- **신규 테스트**: 28개 (chain_manager 4 + notify-completion 24)
- **pyright**: 0 errors
- **black + isort**: OK

### 테스트 케이스 상세

chain_manager TestCheck:
- test_check_in_chain_not_last: 체인 소속, 마지막 아님 → in_chain=true, is_last=false
- test_check_in_chain_is_last: 체인 소속, 마지막 → in_chain=true, is_last=true
- test_check_not_in_chain: 미소속 → in_chain=false
- test_check_next_task_id_none_when_pending: 다음 task_id=None → null 반환

notify-completion:
- get_anu_key: 환경변수 있음/없음/빈문자열 3케이스
- check_chain_status: 정상/실패/타임아웃/잘못된JSON 4케이스
- create_done_clear: 정상/중복/부모디렉토리 3케이스
- build_prompt: 인터페이스 유지 2케이스
- main: 중간Phase/중간Phase중복/마지막Phase/일반작업/CLI키우선/키없음 6케이스
- wake_anu_session: 정상/타임아웃/에러 3케이스
- send_telegram_notification: 정상/실패/타임아웃 3케이스

---

## 버그/이슈

없음

---

## QC 자동 검증 결과

```json
{
  "task_id": "task-439.1",
  "overall": "PASS",
  "checks": {
    "test_runner": "PASS (799 passed)",
    "pyright_check": "PASS (0 errors)",
    "style_check": "PASS (black OK, isort OK)",
    "data_integrity": "PASS"
  }
}
```
