# task-568.1: chain_manager.py 체이닝 버그 원인분석 + 수정

## SCQA

**S**: dispatch.py로 task-566을 1팀에 한정승인(5 Phase 체이닝)으로 위임하였다. chain_manager.py의 check/next 명령으로 Phase 간 자동 체이닝이 작동해야 하는 구조이다.

**C**: 1팀이 Phase 1(task-566.1) 완료 후 `chain_manager.py check --task-id task-566.1` 실행 시 `in_chain: false`가 반환됨. 1팀 헤르메스가 "체인에 속하지 않음"으로 판단하여 Phase 1만 끝내고 중단함. 근본 원인은 **dispatch.py → chain_manager.py 연동 코드가 전혀 존재하지 않았음**.

**Q**: 한정승인 위임 시 chain_manager.py에 체인이 자동 등록되지 않는 근본 원인은 무엇이며, 수정 가능한가?

**A**: 3개 파일에서 3건의 버그를 발견하여 모두 수정 완료. dispatch.py에 `--phases N` 파라미터를 추가하여 chain_manager.py create를 자동 호출하고, chain_manager.py next 출력에 task_id를 포함시키고, notify-completion.py에서 --task-id를 전달하도록 수정. 신규 테스트 10건 전체 통과, 기존 테스트 회귀 0건, pyright 에러 0건.

---

## 원인분석 상세

### 발견된 버그 3건

**버그 1 (PRIMARY): dispatch.py → chain_manager.py 연결 부재**
- dispatch.py의 `--chain` 파라미터는 `chain.py` (멀티팀 Phase 체이닝) 전용
- chain.py의 체인 파일: `memory/chains/{chain_id}.json` (접두어 없음)
- chain_manager.py의 체인 파일: `memory/chains/chain-{chain_id}.json` (접두어 있음)
- DIRECT-WORKFLOW.md의 Step 5.5는 `chain_manager.py check`로 체인 소속 판단
- **dispatch.py에 chain_manager.py create를 호출하는 코드가 전혀 없었음**

**버그 2 (SECONDARY): chain_manager.py next 출력에 task_id 누락**
- `cmd_next()`의 dispatch action 출력에 `task_id` 필드 없음
- 다음 Phase dispatch 시 사전 등록된 task_id를 전달할 수 없음

**버그 3 (SECONDARY): notify-completion.py에서 --task-id 미전달**
- dispatch_next_phase() 결과에서 task_id를 받아도 dispatch 명령에 전달하지 않음
- 결과: 자동생성 ID가 chain에 매칭되지 않아 2번째 Phase부터도 `in_chain: false`

### 재현 조건
1. dispatch.py를 `--chain` 없이 (또는 있어도) 사용하여 위임
2. 위임된 팀이 `chain_manager.py check --task-id {task_id}` 실행
3. chain-*.json 파일이 없으므로 `in_chain: false` 반환

---

## 수정 내용

### 1. dispatch.py (핵심 수정)
- `dispatch()` 함수에 `phases: Optional[int]` 파라미터 추가
- phases 지정 시: task_id에서 base 번호 추출 ("task-566.1" → 566)
- chain_id = "scoped-566" 자동 생성
- N개 Phase의 tasks JSON 구성 후 `chain_manager.py create` subprocess 호출
- chain_manager.py create 실패 시에도 dispatch 계속 진행 (graceful degradation)
- CLI에 `--phases` 인자 추가

### 2. chain_manager.py (보조 수정)
- `cmd_next()` dispatch action 출력에 `"task_id": next_task.get("task_id")` 추가

### 3. notify-completion.py (보조 수정)
- dispatch_result에서 task_id 추출
- dispatch 명령에 `--task-id {task_id}` 전달 (있는 경우만)

---

## 수정/생성 파일 목록

- `/home/jay/workspace/dispatch.py` — --phases 파라미터 + chain_manager.py create 연동
- `/home/jay/workspace/chain_manager.py` — next 출력에 task_id 추가
- `/home/jay/workspace/scripts/notify-completion.py` — --task-id 전달
- `/home/jay/workspace/tests/test_dispatch.py` — TestDispatchPhasedChaining 클래스 추가 (5개 테스트)
- `/home/jay/workspace/tests/test_chain_manager.py` — next task_id 출력 테스트 2개 추가
- `/home/jay/workspace/scripts/tests/test_notify_completion.py` — TestDispatchNextPhaseWithTaskId 클래스 추가 (3개 테스트)

---

## 테스트 결과

- 신규 테스트: 10건 전체 PASS
- 기존 테스트 회귀: 0건
- pyright: 0 에러, 0 경고
- 총 테스트: 129 PASS / 5 FAIL (모두 기존 실패, 본 작업 무관)

### ⚠️ 기존 테스트 실패 5건 (본 작업 범위 외)
- `test_notify_completion_send_failure_no_exit`: send_direct_telegram 속성 없음
- `test_prompt_length_under_120_chars`: 프롬프트 289자 > 120자 제한
- `test_main_calls_cokacdir`: COKACDIR_KEY_ANU 미설정
- `test_main_custom_chat_id`: COKACDIR_KEY_ANU 미설정
- `test_main_failure_exits_nonzero`: .done.clear 파일 선점 이슈

---

## 셀프 QC

- [x] 1. 영향 범위: dispatch.py, chain_manager.py, notify-completion.py 3개 파일 + 테스트 3개 파일
- [x] 2. 엣지 케이스: task_id 형식 불일치 시 chain 생성 스킵(안전), phases=1 허용, create 실패 시 graceful
- [x] 3. 작업 지시 일치: dispatch.py --phases N 체인 등록 연동 + 수정 + 테스트 완료
- [x] 4. 에러 처리: chain_manager.py create 실패 → 경고만, dispatch 계속 진행
- [x] 5. 테스트 커버리지: 신규 10건, 엣지 케이스 포함 (실패 시 abort 안 됨, task_id None 처리 등)

### 발견한 이슈 (Zero Issue Red Flag 대응)
1. 두 개의 체이닝 시스템(chain.py vs chain_manager.py)이 혼재하여 혼동 유발 — 장기적으로 통합 필요
2. notify-completion.py의 기존 테스트 5건이 이미 실패 상태 — 별도 task로 수정 필요
3. dispatch.py의 task_file 경로가 상대경로("memory/tasks/...")로 저장되어, notify-completion.py에서 절대경로 변환 없이 사용 시 경로 불일치 가능성 — 현재는 dispatch.py가 WORKSPACE 기준으로 처리하므로 문제 없음
