# task-timers.json stale 상태 근본 원인 분석 + 재발 방지 구현

## 상황
- task-timers.json에 22건의 running/reserved 상태 작업이 장기간 방치되어 있었음
- 대시보드가 이를 "진행중"으로 표시하여 실제 현황과 불일치
- 수동으로 done 처리했지만, 근본 원인 해결 필요

## 분석 요청
1. **왜 발생했는지** 근본 원인 분석:
   - dispatch.py의 generate_task_id()가 reserved 상태를 생성하지만 end가 호출 안 되는 경우
   - 팀이 task-timer start를 했지만 end를 호출 안 하고 작업이 중단된 경우
   - 3팀 봇 수신 실패로 작업 자체가 시작 안 된 경우 (reserved 상태로 방치)
   - 기타 경로 분석

2. **현재 코드 확인**:
   - `/home/jay/workspace/dispatch.py` — generate_task_id() 함수의 reserved 로직
   - `/home/jay/workspace/memory/task-timer.py` — start/end 로직
   - `/home/jay/workspace/prompts/team_prompts.py` — 팀장 프롬프트에서 timer start/end 지시
   - 대시보드 server.py — running task 판별 로직

3. **재발 방지 구현**:
   - 방안 A: stale 감지 자동 정리 — 일정 시간(예: 2시간) 이상 running/reserved 상태인 작업을 자동으로 stale 표시
   - 방안 B: task-timer.py에 cleanup 서브커맨드 추가
   - 방안 C: dispatch.py에서 reserved → running 전환 시 타임스탬프 기록, timeout 감지
   - 방안 D: 대시보드 server.py에서 stale task 필터링 (표시 시 경과 시간 체크)
   - 기타 더 나은 방안 있으면 제안

## 참고 파일
- dispatch.py: `/home/jay/workspace/dispatch.py`
- task-timer.py: `/home/jay/workspace/memory/task-timer.py`
- team_prompts.py: `/home/jay/workspace/prompts/team_prompts.py`
- dashboard server.py: `/home/jay/workspace/dashboard/server.py`
- task-timers.json: `/home/jay/workspace/memory/task-timers.json`

## 결과물
- 근본 원인 분석 리포트
- 재발 방지 코드 구현 + 테스트
- 대시보드에서 stale task가 "진행중"으로 잘못 표시되지 않도록 보장
