# 계획서: task-122.1 (대시보드 상단 바 vs 팀 상세 상태 불일치 수정)

## 작업 요약
- 작업 ID: task-122.1
- 참조 작업: task-120.1
- 대상 파일: dashboard/server.py, dashboard/index.html
- 팀: dev3-team

## 서브태스크 분해

### ST-1: server.py 수정 (GLM-5/오픈클로)
- /api/bot-activity 엔드포인트에서 get_tasks_info() 또는 get_running_tasks_by_team()으로 running tasks 조회
- team_id → botID 매핑 (dev1-team→dev1, dev2-team→dev2, dev3-team→dev3 등)
- 각 봇 응답에 has_running_tasks 필드 추가

### ST-2: index.html 수정 (GLM-5/오픈클로)
- 374-389행 상단 바 활성 조건: `bot.status === 'processing'` → `bot.status === 'processing' || bot.has_running_tasks`
- 기존 로직 유지 (OR 추가만)

### ST-3: 결과 파일 생성 (GLM-5/오픈클로)
- memory/reports/task-120.1.md 작성
- memory/events/task-120.1.done 생성
- task-122.1.done 시그널 파일 생성

## 팀원 배정
- 전담: GLM-5 (오픈클로) — 순차 단독 실행

## 실행 순서
1. 기존 server.py 코드 분석 (get_tasks_info, get_running_tasks_by_team 확인)
2. server.py 수정: has_running_tasks 필드 추가
3. index.html 수정: 상단 바 OR 조건 추가
4. 보고서 및 done 파일 생성

## 예상 위험 및 대안
- **위험**: get_running_tasks_by_team() 함수가 없을 수 있음
  - **대안**: task-timers.json을 직접 파싱하거나 기존 함수 활용
- **위험**: 상단 바 코드 위치(374-389행)가 버전에 따라 다를 수 있음
  - **대안**: 키워드 검색으로 정확한 위치 파악 후 수정

## 실패 시나리오 체크리스트

**1. 비정상 입력/상태**
- task-timers.json이 비어있거나 파손된 경우: 기존 stale 필터링 함수가 처리하므로 빈 dict 반환 예상. has_running_tasks=False로 안전 처리.

**2. 동시성/경쟁 조건**
- bot-activity API가 동시에 여러 클라이언트에서 호출될 수 있음. 읽기 전용 작업이므로 경쟁 조건 위험 없음.

**3. 비정상 종료/타임아웃**
- 대시보드 서버가 중간에 재시작되어도, server.py는 읽기 전용 수정이라 상태 파일이 남는 부작용 없음.

**4. 스테일 데이터**
- task-timers.json의 stale 데이터: get_running_tasks_by_team()이 이미 stale 필터링을 수행한다고 지시서에 명시됨. 이를 활용.

**5. 통합 시 충돌**
- 이 수정은 dashboard/server.py, dashboard/index.html만 변경하므로 다른 팀 모듈과 충돌 없음. OR 조건 추가로 기존 로직은 그대로 유지.
