# task-316.1 완료 보고서: task-timer end 누락 방지 — 근본 원인 해소

## 작업 요약
완료된 작업의 task-timer end가 호출되지 않아 대시보드에 "running" 상태로 남는 문제를 해결.
근본 원인(워크플로우 순서)을 수정하고, 이중 안전망(훅)과 멱등성을 추가.

## 변경 파일 목록

### 1. `/home/jay/workspace/prompts/DIRECT-WORKFLOW.md`
- **Step 1**: `task-timer start` 호출 제거 → dispatch.py가 자동 처리함을 명시
- **Step 6**: `task-timer end`를 .done 파일 생성 직후로 이동 (기존 Step 8 → Step 6)
- **Step 7**: 아누에게 완료 통보 (기존 Step 6)
- **Step 8**: 체인 Phase 완료 알림 (기존 Step 7)
- 효과: 세션 중단 시에도 timer end가 .done 직후에 실행되므로 누락 가능성 최소화

### 2. `/home/jay/workspace/memory/task-timer.py`
- `end_task()` 메서드에 멱등성 추가
- 이미 completed 상태인 태스크에 end 재호출 시: 에러 없이 기존 결과 + `"already_completed": true` 반환
- 훅의 auto-end 안전망과 조합 시 중복 호출해도 안전

### 3. `/home/jay/.claude/hooks/stop-qc-reminder.sh`
- dev1/dev2/dev3 봇 Stop 시 안전망 추가
- `.done` 파일 존재 + timer가 running 상태 → 자동 `task-timer end` 호출
- 실패 시 `|| true`로 안전하게 처리 (hook이 블로킹되지 않음)

### 4. `/home/jay/.claude/hooks/user-prompt-submit.sh`
- anu 봇의 .done 파일 감지 루프에 안전망 추가
- .done 파일의 task-id에 대해 timer가 running이면 자동 `task-timer end` 호출
- auto-end 작동 시 `→ timer auto-ended (안전망 작동)` 메시지 출력

### 5. `/home/jay/workspace/dispatch.py`
- 변경 없음. timer start는 dispatch.py에서 유지 (확실한 기록을 위해)

## 테스트 결과

- 멱등성 테스트 (end 재호출): PASS — `"already_completed": true` 반환
- 존재하지 않는 태스크 end: PASS — `"status": "error"` 반환 (crash 없이)
- 훅 문법 체크 (bash -n): PASS — stop-qc-reminder.sh, user-prompt-submit.sh 모두 정상
- 워크플로우 순서 검증: PASS — Step 1~8 순차적, timer end=Step 6, timer start 중복 제거 확인
- pyright 체크: PASS — 에러 0건 (workspace 루트 기준)

## 아키텍처 결정

**3중 방어 체계:**
1. **1차 방어 (워크플로우)**: timer end를 .done 직후 Step 6으로 이동 → 정상 흐름에서 확실히 호출
2. **2차 방어 (Stop 훅)**: 개발 봇 세션 종료 시 .done 파일 감지 → running timer 자동 종료
3. **3차 방어 (anu 훅)**: 아누가 미처리 .done 확인 시 → running timer 자동 종료

## 버그/이슈
- 없음

## QC 자동 검증 결과

- file_check: **PASS** — 보고서, .done 파일, 수정 파일 모두 확인
- data_integrity: **PASS** — task-timers.json과 .done 파일 일치
- style_check: **PASS** — black/isort 정상
- pyright_check: **FAIL** (기존 이슈) — `utils.logger` import 경로 미인식. qc_verify.py가 절대경로로 pyright 실행하여 workspace root를 인식하지 못하는 구조적 문제. workspace root에서 직접 실행 시 에러 0건 (`cd /home/jay/workspace && pyright memory/task-timer.py`).
- api_health, test_runner, schema_contract, scope_check: SKIP (해당 없음)
