# task-423: 대시보드 고스트 태스크 정리 + 방지 로직 구현

## 배경
대시보드에 고스트 running 태스크가 표시되고 있음.
- `task-1.1` — "작업" (dev1-team, 3/9 생성, end 안 됨)
- `task-4.1` — "마케팅 작업" (marketing, 3/10 생성, 2팀 dispatch 테스트 중 생성, end 안 됨)

또한 조직뷰에서는 "유휴"인데 시스템뷰에서는 "진행중"으로 표시되는 불일치 문제도 있음.

## 작업 항목

### 1. 고스트 데이터 정리
- task-timers.json에서 `task-1.1`과 `task-4.1`의 status를 `cancelled`로 변경 (삭제 금지, 히스토리 보존)
- end_time을 현재 시각으로 설정
- 정리 후 대시보드에서 running 0건 확인

### 2. 대시보드 뷰 간 불일치 수정
- **조직뷰**: 팀 상태가 task-timers.json의 running 태스크를 반영해야 함
- **시스템뷰**: 봇 상태와 조직뷰 팀 상태가 일관되게 표시
- 불일치 원인 분석:
  - 시스템뷰의 봇 상태 판단: task-timers.json의 running 중 team_id로 봇 매핑
  - 조직뷰의 팀 상태: organization-structure.json의 static status 사용 (실시간 반영 안 됨)
  - marketing/consulting은 논리적 팀이라 봇 매핑이 다름
- 수정: 조직뷰도 task-timers.json running 데이터를 참조하여 실시간 상태 표시

### 3. 고스트 태스크 방지 로직
고스트 태스크가 발생하는 원인: start만 하고 end를 호출하지 않는 경우 (테스트, 에러 등)

방지/감지 방안 구현:
- **task-timer.py에 cleanup 서브커맨드 추가**: `python3 task-timer.py cleanup --max-age 24h`
  - 24시간 이상 running인 태스크를 감지하여 목록 출력
  - `--force` 옵션 시 자동으로 status=timeout 처리
- **대시보드 시스템뷰에 경고 표시**: running 태스크가 2시간 이상이면 ⚠️ 표시
  - "2시간 이상 실행 중 — 고스트 태스크일 수 있음" 경고 메시지
- **dispatch.py 위임 시 기존 running 체크 강화**: 같은 봇에 이미 running 태스크가 있으면 경고 로그 출력

### 4. 프로젝트뷰 분류 정확도 개선
현재 "기타"에 320건이 몰려 있음. 분류 키워드 세분화:
- "고도화", "phase", "spec", "hook", "qc", "test" → 아누시스템
- "auth", "supabase", "login", "oauth" → InsuRo (인증 관련은 InsuRo)
- "font", "deploy", "vercel" → 해당 프로젝트에 맞게 분류
- task-timers.json의 desc 분석해서 빠진 키워드 추가

## 파일 참조
- 대시보드: `/home/jay/workspace/dashboard/index.html`, `dashboard/server.py`
- task-timer: `/home/jay/workspace/memory/task-timer.py`
- task-timers.json: `/home/jay/workspace/memory/task-timers.json`
- dispatch.py: `/home/jay/workspace/dispatch.py`

## 완료 조건
1. 고스트 태스크 정리 → running 0건 (정상 실행 중인 것 제외)
2. 조직뷰/시스템뷰 상태 일관성 확보
3. task-timer.py cleanup 서브커맨드 동작
4. 대시보드에 2시간 이상 running 태스크 경고 표시
5. 프로젝트 분류 "기타" 비율 50% 이하로 감소
6. 기존 테스트 전체 PASS + 신규 테스트 추가
