# task-1004.1: 대시보드 토큰 탭 동적 업데이트 + 바 차트 정렬

## SCQA

**S**: 대시보드 토큰 탭에 `/api/token-usage` API와 `token-ledger.json`(763개 세션, 318KB)이 존재하나, API가 raw ledger JSON을 그대로 반환하여 `team_breakdown`, `anomalies`, `cost_estimate_usd` 등 프론트엔드 필수 필드가 누락되었다. 바 차트는 오래된 작업이 위에 표시되고, 자동 새로고침이 없었다.

**C**: 프론트엔드가 API 실패로 판단하여 하드코딩된 FALLBACK_TOKEN_DATA(10건)를 표시하거나, raw 데이터를 받아도 팀별 분석/이상치 감지가 불가능했다. 바 차트 `.reverse()` 로직으로 최신 작업이 아래에 표시되는 UX 문제도 존재.

**Q**: token-ledger.json의 실시간 데이터를 완전히 활용하여 팀별 분석, 이상치 감지, 비용 추정을 동적으로 제공하고, 바 차트를 최신 순으로 정렬할 수 있는가?

**A**: 백엔드 `get_token_usage()` 메서드에서 ledger 데이터를 enrich(비용 계산, team_id/description 보완, team_breakdown/anomalies 재계산)하여 반환하도록 수정. 프론트엔드에서 `.reverse()` 제거로 최신 작업 상단 표시, 5분 자동 새로고침 + 수동 새로고침 버튼 추가. pyright 0 에러, API 응답 30개 태스크/11개 팀/70개 이상치 정상 반환 확인.

## 수정 파일 목록

- `/home/jay/workspace/dashboard/server.py` — 백엔드 API 수정
  - `TOKEN_PRICES` 상수 추가 (모델별 토큰 가격)
  - `DataLoader.__init__` 캐시 변수 추가 (`_token_cache`, `_token_cache_time`)
  - `get_token_usage()` 전면 교체: ledger enrich 로직 (cost계산, team_id/description 보완, team_breakdown, anomalies, top_consumers 문자열화)
  - `/api/token-usage` 핸들러 단순화: `get_token_usage()` 위임
  - `/api/token-anomaly` 핸들러 단순화: `get_token_usage()` 위임
  - 5분 TTL 인메모리 캐시 적용

- `/home/jay/workspace/dashboard/components/TokenView.js` — 프론트엔드 수정
  - 바 차트 `.reverse()` 제거 → 최신 작업 상단 표시
  - `fetchTokenData` 함수 분리 (`useCallback`)
  - 5분 자동 새로고침 (`setInterval`)
  - 수동 새로고침 버튼 추가
  - 데이터 소스 배지 (실시간/추정/샘플)
  - 마지막 업데이트 시각 표시

## 테스트 결과

- `/api/token-usage` 응답: 30개 태스크, 11개 팀 breakdown, 70개 이상치, source=ledger ✅
- `/api/token-anomaly` 응답: 70건, avg_tokens=2,868,071 ✅
- 기존 API 정상: `/api/status`(200), `/api/tasks`(200), `/api/member-status`(200), `/api/tech-debt`(200) ✅
- 대시보드 페이지 로드: HTTP 200 ✅
- pyright: 0 errors, 0 warnings ✅
- 바 차트 최신 순 정렬: task-938.1(최신)이 맨 위 ✅
- 새로고침 버튼/자동 새로고침: Playwright로 확인 ✅
- 데이터 소스 배지: "실시간 데이터" 표시 ✅

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **ledger raw 반환으로 필수 필드 누락** — `get_token_usage()`에서 ledger enrich 로직 구현 (cost 계산, team_breakdown/anomalies 재계산)
2. **top_consumers 형식 불일치 (객체 배열 vs 문자열 배열)** — 문자열 배열로 정규화
3. **team_id 빈 문자열 다수** — task-timers.json에서 team_id 보완, 빈 값은 그대로 유지 (소스 데이터 한계)

### 범위 외 미해결 (1건)
1. **task-4.4의 team_id가 "str,"로 부정확** — token-ledger.json 원본 데이터 품질 이슈. token-tracker.py의 TEAM_RE 파싱 정규식 개선 필요. 본 작업(대시보드 표시) 범위 외.

## QC 자동 검증

- **결과: PASS** (9 PASS, 3 SKIP)
- api_health: PASS (`/api/token-usage` → 200, `/api/token-anomaly` → 200)
- file_check: PASS (server.py 122KB, TokenView.js 25KB, 보고서 3.6KB)
- data_integrity: PASS
- test_runner: PASS (pytest 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 (최대 유사도 8.5%)
- tdd_check: SKIP (시스템 작업, Lv.1 수정)
- schema_contract: SKIP (workers 없음)
- scope_check: SKIP
