# task-1010.1 완료 보고서: 대시보드 바차트 최신화 + 기간필터 + 위스퍼 팀상태 실시간화

## SCQA

**S**: 대시보드의 토큰 사용량 바차트가 task-938.2까지만 표시되고, 기간별 조회 기능이 없으며, 위스퍼 비서 섹션의 팀 상태가 상단 신호등과 불일치한다.

**C**: task-1000번대가 18개 세션 존재하지만 token-ledger.json에 반영되지 않아 바차트가 stale. 기간 조회 불가로 당일 활동 파악이 어렵고, 위스퍼 팀 상태는 whisper-compile.py 실행 시점 스냅샷(status.json)에 고정되어 실시간성이 없다.

**Q**: 바차트 데이터를 최신화하고 기간별 필터를 추가하며, 위스퍼 팀 상태를 실시간으로 표시할 수 있는가?

**A**: 3건 모두 수정 완료. (1) token-tracker.py scan 재실행으로 763→779개 task 반영 (task-1010.1까지), (2) `/api/token-usage?period=1d|3d|7d|all` 기간 필터 추가 + TokenView.js에 선택 UI 구현, (3) `/api/whisper-status`에서 briefing_summary를 task-timers.json 기반 실시간 오버라이드. pytest 6건 전체 통과, pyright 에러 0건.

## 수정 내역

### 항목 1: 바차트 데이터 최신화

- **원인**: token-tracker.py scan이 08:16에 마지막 실행 → 이후 생성된 task-1000번대 JSONL 세션 미반영
- **해결**: `python3 scripts/token-tracker.py scan` 실행으로 1976개 JSONL 스캔, 779개 task 기록
- **결과**: task-1010.1까지 ledger에 반영됨 (task-1000+ 11건 신규 추가)

### 항목 2: 기간별 조회 기능 추가

**백엔드** (`/home/jay/workspace/dashboard/server.py`):
- `get_token_usage()` 시그니처에 `period: str = "1d"` 파라미터 추가
- `from datetime import datetime, timedelta` import 확장
- 캐시를 period별 dict로 변경: `_token_cache: Dict[str, Dict[str, Any]]`
- 라인 979-992: 기간 필터 로직 (1d/3d/7d → timedelta 기반 cutoff, all → 전체)
- 라인 1069-1082: estimated 경로에도 동일 기간 필터 적용
- 라인 1939-1943: 라우터에서 `period` 파라미터 파싱 및 화이트리스트 검증

**프론트엔드** (`/home/jay/workspace/dashboard/components/TokenView.js`):
- `period` 상태 추가 (기본값 `1d`)
- `fetchTokenData(p)` 수정: `/api/token-usage?period=${queryPeriod}` 호출
- `handlePeriodChange()` 핸들러 추가
- `.slice(0, 20)` 하드코딩 제거, 차트 높이 동적 조정
- 바차트 섹션에 기간 선택 버튼 그룹 UI: 당일 | 3일 | 1주일 | 전체

### 항목 3: 위스퍼 비서 팀 상태 실시간화

**백엔드** (`/home/jay/workspace/dashboard/server.py` 라인 2065-2104):
- `/api/whisper-status` 핸들러에서 status.json 읽은 후 실시간 오버라이드
- `load_tasks()` + `get_running_tasks_by_team()` 호출
- `briefing_summary`, `teams_active`, `teams_idle` 필드를 실시간 데이터로 교체
- 나머지 필드(done_pending, questions_pending 등) 그대로 유지

## 생성/수정 파일 목록

- `/home/jay/workspace/dashboard/server.py` — 수정 (기간필터 API + 위스퍼 실시간화)
- `/home/jay/workspace/dashboard/components/TokenView.js` — 수정 (기간선택 UI)
- `/home/jay/workspace/memory/token-ledger.json` — 갱신 (scan 재실행)

## 테스트 결과

- pyright: 0 errors, 0 warnings
- pytest (tests/test_server.py): 6/6 passed (0.25s)
- black + isort: 적용 완료

## 발견 이슈 및 해결

### 자체 해결 (3건)

1. **캐시가 period를 구분하지 않아 다른 기간 요청 시 stale 데이터 반환** — `_token_cache`를 period별 dict로 변경 (`Dict[str, Dict[str, Any]]`)
2. **estimated 경로(task-timers.json 기반)에 기간 필터 미적용** — estimated 경로에도 동일한 period_map 기반 cutoff 필터 적용 (라인 1069-1082)
3. **차트 높이가 고정(560px)되어 기간 변경 시 항목 수에 맞지 않음** — `entries.length * 28`로 동적 높이 설정 (최소 300px)

### 범위 외 미해결 (1건)

1. **"전체" 기간 선택 시 700+ 항목이 Chart.js 바차트에 로드되어 렌더링 성능 저하 가능** — 범위 외 사유: UX 최적화는 별도 작업으로 분리 권장 (가상 스크롤 또는 페이지네이션)

## QC 검증

- **Overall**: PASS (8 PASS, 4 SKIP)
- file_check: PASS (server.py 124,570B, TokenView.js 27,303B, report 4,256B)
- data_integrity: PASS
- test_runner: PASS (6 passed in 0.22s)
- pyright_check: PASS (0 errors, 0 warnings)
- style_check: PASS (black OK, isort OK)
- critical_gap: PASS
- spec_compliance: PASS
- duplicate_check: PASS (최대 유사도 9.9%)
- tdd_check: SKIP (파일 변경 audit-trail 미탐지)
- schema_contract: SKIP (workers 없음)
- api_health: SKIP (서버 재시작 없이 검증)
- scope_check: SKIP
