# 보고서: task-120.1 — 대시보드 상단 바 vs 팀 상세 상태 불일치 수정

## 작업 요약
- **작업 ID**: task-120.1 (task-122.1로 실행)
- **팀**: dev3-team
- **담당**: GLM-5 (오픈클로)
- **완료 시각**: 2026-03-02T18:56:43

## 문제 원인
- 상단 바: bot-activity.json → `status === 'processing'` 기준
- 팀 상세: task-timers.json → `status === 'running'` 기준
- 두 데이터 소스가 독립적이어서 동기화 불일치 발생

## 수정 내용

### 1. dashboard/server.py — /api/bot-activity 엔드포인트 보강
- `get_running_tasks_by_team()` 호출하여 running task 상태 조회 (stale 필터링 포함)
- `team_to_bot` 매핑 추가: dev1-team→dev1, dev2-team→dev2, dev3-team→dev3, anu-direct→anu
- 각 봇 데이터에 `has_running_tasks` 필드 추가
- bot-activity.json에 없는 봇도 running task가 있으면 기본 엔트리 생성

### 2. dashboard/index.html — 상단 바 활성 조건 보강
- 374-378행: `isProcessing` 조건에 OR 추가
- 변경 전: `bot?.status === 'processing'`
- 변경 후: `bot?.status === 'processing' || bot?.has_running_tasks === true`
- 기존 로직 완전 유지, OR 추가만

## 생성/수정 파일 목록
- `/home/jay/workspace/dashboard/server.py` — /api/bot-activity 로직 수정 (678-716행)
- `/home/jay/workspace/dashboard/index.html` — isProcessing 조건 수정 (377-378행)
- `/home/jay/workspace/memory/events/task-120.1.done` — 완료 시그널 생성

## 팀장 검토 결과 (GLM 결과물)
- **server.py 수정**: 1차 검토 통과, 수정 사항 없음. team_to_bot 매핑이 정확하고, get_running_tasks_by_team()의 stale 필터링을 올바르게 활용함. bot-activity.json에 없는 봇 처리 로직도 올바름.
- **index.html 수정**: 1차 검토 통과, 수정 사항 없음. OR 조건 추가가 정확하고 기존 로직 유지함. optional chaining(?.) 사용으로 null 안전성 확보.
- **task-120.1.md 보고서**: 팀장(라)이 직접 작성 (GLM이 미생성). 결과물 파일 경로가 누락되어 팀장이 보완.

## 셀프 QC

1. **다른 파일 영향**: server.py의 `/api/bot-activity` 엔드포인트만 수정. 다른 API는 영향 없음. index.html은 해당 컴포넌트 렌더링 조건만 수정, 전역 영향 없음.
2. **엣지 케이스**: bot-activity.json에 봇 데이터가 없는 경우, 빈 dict에 엔트리 자동 생성. task-timers.json 파손 시 get_running_tasks_by_team()이 빈 dict 반환하여 has_running_tasks=False. 안전 처리 확인.
3. **구현이 지시와 일치**: 지시서의 3가지 요구사항(get_running_tasks_by_team() 활용, team_id→botID 매핑, has_running_tasks OR 추가) 모두 구현됨.
4. **에러 처리**: `bot_activity.copy()`로 원본 dict 보호. `bot_activity_data`가 None일 경우 빈 dict로 대체 처리됨.
5. **테스트 커버리지**: 별도 pytest 없음. 기능이 OR 조건 추가라 실제 대시보드에서 확인 가능. task-timers.json에 running 작업이 있을 때 상단 바 불이 들어오는지가 핵심 검증 포인트.
