## Phase 자동 체이닝 시스템 구현

### 배경
아누(개발실장)가 한정위임을 받아 여러 Phase를 순차 위임할 때, 세션 간에 자동으로 다음 Phase가 진행되지 않는 문제가 있다. 팀 작업 완료 → 아누 알림 → 다음 Phase 자동 dispatch 체이닝 시스템을 구축한다.

### 구현할 파일 3개

**1. 신규: /home/jay/workspace/chain.py (~200줄)**
체인 관리 CLI 스크립트.

서브커맨드:
- `create --id <chain_id> --desc "설명"`: 빈 체인 파일 생성 → memory/chains/<chain_id>.json
- `add-phase --chain <chain_id> --name "Phase 1" --tasks '<json_array>'`: Phase 추가. tasks JSON 형식: [{"team":"dev1-team","desc":"작업설명","level":"normal"}]
- `task-done --chain <chain_id> --task <task_id>`: 특정 task 완료 마킹. 완료 후 현재 Phase 전팀 완료인지 체크. 전팀 완료면 자동으로 다음 Phase dispatch (dispatch.py 호출). 마지막 Phase면 체인 status를 completed로 변경하고 제이회장님께 최종 보고 cokacdir --cron 등록.
- `status --chain <chain_id>`: 현재 체인 상태 출력 (JSON)
- `list`: 모든 활성 체인 목록

chain.json 스키마:
```json
{
  "chain_id": "insuwiki-p1p2",
  "description": "InsuWiki Phase 1-2",
  "status": "active",
  "current_phase_idx": 0,
  "created_at": "2026-03-03T...",
  "phases": [
    {
      "name": "Phase 1",
      "status": "pending",
      "tasks": [
        {
          "team": "dev1-team",
          "task_id": null,
          "description": "작업 설명",
          "level": "normal",
          "status": "pending",
          "dispatched_at": null,
          "completed_at": null
        }
      ]
    }
  ]
}
```

task-done 핵심 로직:
1. chain 파일에서 해당 task_id 찾아 status를 completed로, completed_at 기록
2. 현재 Phase의 모든 tasks가 completed인지 확인
3. 전팀 완료 시: Phase status를 completed로 변경, current_phase_idx 증가
4. 다음 Phase가 있으면: 해당 Phase의 각 task에 대해 dispatch.py를 subprocess로 호출 (source /home/jay/workspace/.env.keys 필수). dispatch 결과의 task_id를 chain 파일에 기록. Phase status를 in_progress로 변경.
5. 다음 Phase가 없으면 (마지막): chain status를 completed로 변경. cokacdir --cron으로 아누에게 '체인 <chain_id> 전체 완료. 종합 보고 작성하라' 알림 등록.
6. 제이회장님께 Phase 전환 중간보고: cokacdir --cron으로 '체인 <chain_id>의 Phase N 전팀 완료. Phase N+1 자동 dispatch됨.' 알림.

안전장치:
- chain status가 paused이면 다음 Phase dispatch 안 함 (경고 출력)
- 파일 락(fcntl)으로 동시 접근 방지 (여러 팀이 동시에 task-done 호출 가능)
- dispatch 실패 시 chain 파일에 에러 기록, 체인 pause

환경변수:
- WORKSPACE_ROOT, COKACDIR_CHAT_ID, COKACDIR_KEY_ANU 사용 (dispatch.py와 동일)
- cokacdir --cron 호출 시 --chat, --key는 환경변수에서 로드

**2. 수정: /home/jay/workspace/dispatch.py (~20줄 추가)**
- argparse에 `--chain <chain_id>` 옵션 추가
- dispatch() 함수에 chain_id 파라미터 추가
- dispatch 성공 시 chain_id가 있으면: chain.json 파일을 열어 해당 Phase의 해당 팀 task에 task_id, dispatched_at, status=in_progress 기록

**3. 수정: /home/jay/workspace/prompts/team_prompts.py (~15줄 추가)**
- build_prompt() 함수에 chain_id 파라미터 추가 (Optional[str])
- _build_direct_prompt()와 _build_glm_prompt()의 완료 알림 (step 6/8)에 chain 로직 추가:
  현재 step 6 뒤에 추가:
  ```
  만약 chain_id가 주어졌으면, 완료 알림 프롬프트에 다음 추가:
  '그 후 python3 /home/jay/workspace/chain.py task-done --chain {chain_id} --task {task_id} 를 실행하라.'
  ```
  이렇게 하면 팀 완료 → 아누 알림 → 아누가 chain.py task-done 실행 → 자동 다음 Phase dispatch 연쇄가 됨.

### 테스트
- chain.py의 모든 서브커맨드 단위 테스트 (pytest)
- 통합 시나리오: create → add-phase 2개 → 첫 Phase dispatch → task-done으로 완료 마킹 → 다음 Phase 자동 dispatch 확인
- dispatch.py --chain 옵션 정상 동작 확인
- team_prompts.py 프롬프트에 chain 관련 문구 포함 확인

### 작업 경로
- 모든 코드는 /home/jay/workspace/ 하위
- chain 데이터: /home/jay/workspace/memory/chains/ (디렉토리 없으면 생성)
- 테스트: /home/jay/workspace/tests/test_chain.py