# task-460.1 보고서: dispatch.py task-ID 불일치 버그 수정

## 작업 내용

dispatch.py의 두 가지 버그를 수정:

1. **task-id 불일치 수정**: 지시서 파일 내용의 첫 줄 `# task-NNN.N:` 패턴을 실제 생성된 task_id로 교체
2. **dispatch 실패 시 cleanup 누락 수정**: 3개 실패 경로에서 `_cleanup_task()` 호출 추가

## 수정 파일 목록

- `/home/jay/workspace/dispatch.py` — 3가지 변경
  - `import re` 추가 (line 19)
  - `re.sub()` 으로 task_desc 첫 줄 task-id 교체 (line 441-442)
  - project_dir 미존재 시 `_cleanup_task(task_id)` 추가 (line 413)
  - dev팀 봇 키 None 시 `sys.exit(1)` → `_cleanup_task` + error dict 반환 (line 476-479)
- `/home/jay/workspace/tests/test_dispatch.py` — 테스트 추가/수정
  - `TestTaskIdReplacement` 클래스 추가 (3개 테스트)
  - `TestDispatchFailureCleanup` 클래스 추가 (2개 테스트)
  - 기존 `test_dispatch_bot_key_none_exits` 테스트를 새 동작(error dict 반환)에 맞게 수정

## 테스트 결과

- **80 passed**, 1 deselected
- deselected 1건: `test_notify_completion_timeout` (기존 환경변수 문제, 본 작업 범위 외)
- 새 테스트 4건 모두 PASS (RED→GREEN 전환 완료)

## 검증 기준 달성

- [x] 지시서에 `# task-999.1:` 로 적어도, 저장된 파일에는 실제 생성된 task-id로 교체됨
- [x] dispatch 실패 시 task-timers.json에 잔여 task-id 없음
- [x] 기존 `--task-id` 플래그 동작에 영향 없음
- [x] 기존 자동 ID 생성 로직에 영향 없음

## 비고

- `sys.exit(1)` → error dict 반환 변경: 봇 키 미설정 시 프로세스 종료 대신 에러 딕셔너리를 반환하도록 변경. 호출자(아누)가 에러를 잡아서 처리할 수 있게 개선.
- pyright: dispatch.py 자체에 새 에러 없음 (기존 모듈 임포트 경고 3건은 기존 이슈)
