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

## 작업 요약
대시보드에 표시되던 고스트 running 태스크를 정리하고, 뷰 간 불일치를 수정하며, 재발 방지 로직과 프로젝트 분류 정확도를 개선했습니다.

## 작업 항목별 결과

### 1. 고스트 데이터 정리
- `task-1.1` (dev1-team): status=running → cancelled, end_time 설정, cancel_reason=ghost_task_cleanup
- `task-4.1` (marketing): status=running → cancelled, end_time 설정, cancel_reason=ghost_task_cleanup
- 삭제 없이 히스토리 보존
- 정상 running 태스크(task-423.1 등)는 영향 없음

### 2. 대시보드 뷰 간 불일치 수정
- **원인**: `get_system_status()`의 `running_count`가 stale 태스크를 포함하여 카운트
- **수정**: `running_count` 계산 시 `STALE_TASK_RUNNING_SECONDS`(2시간) 초과 태스크 제외
- `get_running_tasks_by_team()`과 동일한 stale 필터링 로직 적용
- 조직뷰/시스템뷰 상태 일관성 확보

### 3. 고스트 태스크 방지 로직
- **task-timer.py cleanup**: 이미 구현되어 있음 (`--running-hours`, `--dry-run`). 기존 기능 활용 가능
- **대시보드 시스템뷰 경고**: 봇 카드에서 2시간 이상 running 태스크에 ⚠️ 경고 표시 추가
  - "N시간 M분 이상 실행 중 — 고스트 태스크일 수 있음" 메시지
- **dispatch.py 경고 로그**: 같은 팀에 이미 running 태스크가 있으면 경고 로그 출력
  - `⚠️ 같은 팀(team_id)에 이미 running 태스크 있음: task_id`

### 4. 프로젝트뷰 분류 정확도 개선
- **키워드 확장**:
  - InsuRo: auth, supabase, login, oauth, 보험, insurance, premium, 가입, 계약, claim, 보장
  - InsuWiki: wiki, 위키, 콘텐츠, content, article
  - 아누시스템: 고도화, phase, spec, hook, qc, test, 워크플로우, workflow, prompt, chain, report, bot, cron, schedule, memory, timer, pipeline, worker, schema, deploy, vercel 등 30+ 키워드
  - 마케팅: 광고, ad, campaign, blog, 블로그, brand, 브랜드
- **부분 매칭 버그 수정**: "blog"에 "log"가 매칭되는 문제 → 마케팅 분류를 아누시스템보다 우선 배치
- **project_id 필드 활용**: task-timers.json의 project_id가 "system"이 아니면 해당 값을 프로젝트명으로 우선 사용
- **결과**: 기타 비율 47.2% (174/369건) — 목표(50% 이하) 달성

## 생성/수정 파일 목록
- `/home/jay/workspace/memory/task-timers.json` — 고스트 태스크 2건 cancelled 처리
- `/home/jay/workspace/dashboard/server.py` — running_count stale 필터, 프로젝트 분류 키워드 확장, project_id 우선 분류
- `/home/jay/workspace/dashboard/index.html` — 시스템뷰 2시간 경과 경고 UI
- `/home/jay/workspace/dispatch.py` — 같은 팀 running 태스크 경고 로그
- `/home/jay/workspace/dashboard/test_server.py` — 신규 테스트 20개 추가, fixture stale 문제 수정

## 테스트 결과
- `tests/test_task_timer.py`: 117개 PASS
- `dashboard/test_server.py`: 38개 PASS (기존 18개 + 신규 20개)
- **전체**: 155개 PASS, 0개 FAIL

## 완료 조건 달성 여부
1. ✅ 고스트 태스크 정리 → running 중 정상 태스크만 남음
2. ✅ 조직뷰/시스템뷰 상태 일관성 확보
3. ✅ task-timer.py cleanup 서브커맨드 동작 (기존 구현 활용)
4. ✅ 대시보드에 2시간 이상 running 태스크 경고 표시
5. ✅ 프로젝트 분류 "기타" 비율 47.2% (50% 이하 달성)
6. ✅ 기존 테스트 전체 PASS + 신규 테스트 20개 추가

## 비고
- pyright 검증: 0 errors (dispatch.py, server.py의 기존 import 경고는 sys.path 기반 런타임 해결)
- test_server.py fixture의 running 태스크 start_time을 동적 시간으로 변경하여 시간 경과에 따른 테스트 실패 방지
