# task-2126: 대시보드 조직뷰 신호등 동기화 버그 수정 (Lv.4)

## ★ 프로젝트: `/home/jay/workspace/dashboard/`

## 문제 현상
봇이 실제로 작업 중(claude 프로세스 활성)인데 대시보드 조직뷰에서 해당 팀이 전원 "유휴"(회색)로 표시됨.
- 1팀 봇(bot-b): task-2125 실행 중 → 대시보드: 헤르메스 포함 전원 유휴
- 2팀 봇(bot-f): task-2125 실행 중 → 대시보드: 오딘 유휴, 토르/프레이야만 작업중

## 정상 동작 기준일
- 2026-04-21까지 정상 동작 확인됨
- 4/21 마지막 정상 커밋: `89485093`
- 4/22 이후 커밋(task-2116, 2117, 2122)에서 시스템뷰 관련 코드 변경

## 근본 원인 분석 (아누 직접 분석 완료)

### 원인 1: task-timers.json에 running 레코드 부재
- dispatch.py가 cron으로 봇에 작업 전송 시, `task-timer.py start`를 팀장 봇의 프롬프트 내부에 포함
- 팀장 봇이 프롬프트 실행 중 `task-timer.py start`를 호출하면 running 레코드 생성
- **하지만**: cron 수신 → 봇 세션 시작까지 딜레이가 있고, 세션이 시작되어도 팀장이 task-timer start를 실행하기까지 시간이 걸림
- **그 사이**: `get_running_tasks_by_team()`이 빈 결과 반환 → 전원 idle

### 원인 2: dispatch.py에서 member-status.json 미업데이트
- dispatch.py는 cron 전송만 하고 `member-status.json`을 직접 업데이트하지 않음
- **수정 필요**: dispatch 시점에 해당 팀 팀장의 member-status를 "working"으로, 팀원을 "standby"로 즉시 업데이트

### 원인 3: _enrich_member_status()가 리드만 enrichment
- `data_loader.py:831-838`에서 `member_id in lead_ids` 조건으로 **팀장만** working으로 오버라이드
- 팀원은 task-timers에 running이 있어도 idle 유지
- **신호등 규칙**: dispatch 시 팀장=작업중, 팀원=대기(노란). 현재 팀원이 대기가 아닌 유휴로 표시

### 원인 4: task-2116/2117 영향 가능성
- SSE 핸들러(`server.py:526-668`)에 psutil.process_iter() 추가
- 매 10사이클마다 모든 프로세스 스캔 → SSE 이벤트 전송 지연 가능성
- 직접적 원인은 아니지만 간접적으로 SSE refresh 이벤트 누락 가능

## 수정 사항

### 수정 1: dispatch.py에서 member-status.json 즉시 업데이트 (핵심)
dispatch 완료 시점에 해당 팀의 member-status를 업데이트:
```python
# dispatch.py 위임 완료 후
import json
from datetime import datetime, timezone

status_file = 'memory/events/member-status.json'
with open(status_file) as f:
    data = json.load(f)

now = datetime.now(timezone.utc).strftime('%Y-%m-%dT%H:%M:%SZ')
team_members = get_team_members(team_id)  # org-structure에서 조회
for member in team_members:
    if member['is_lead']:
        data['members'][member['id']] = {'status': 'working', 'since': now, 'task': task_description[:100]}
    else:
        data['members'][member['id']] = {'status': 'standby', 'since': now, 'task': None}
data['updated_at'] = now

with open(status_file, 'w') as f:
    json.dump(data, f, indent=2, ensure_ascii=False)
```

### 수정 2: _enrich_member_status()에서 팀원도 standby로 업데이트
`data_loader.py:831-838` 수정:
```python
if team_id and team_id in running_by_team:
    tasks = running_by_team[team_id]
    if tasks:
        if member_id in lead_ids:
            # 팀장: working
            member_data["status"] = "working"
            member_data["task"] = tasks[0].get("description")
        else:
            # 팀원: standby (유휴가 아님!)
            if member_data.get("status") == "idle":
                member_data["status"] = "standby"
```

### 수정 3: get_member_status()도 동일 로직 적용
`data_loader.py:842+`의 `get_member_status()` 함수에서도 팀에 running task가 있을 때:
- 리드 → "working"
- 멤버 → "standby"
- 이전 task-1744.1, task-1817.1에서 반복 수정된 이력 있음 — 이번에 확정 필요

### 수정 4: SSE 프로세스 스캔 격리 (선택)
server.py의 psutil.process_iter()를 별도 스레드로 분리하여 SSE 루프 블로킹 방지

## ★ 먼저 읽을 파일
- `/home/jay/workspace/dashboard/data_loader.py` — L777~900 (_enrich_member_status, get_member_status)
- `/home/jay/workspace/dashboard/server.py` — L506~670 (SSE 핸들러)
- `/home/jay/workspace/dispatch.py` — 위임 완료 시점 코드
- `/home/jay/workspace/memory/specs/traffic-light-spec.md` — 신호등 단일 소스 스펙
- `/home/jay/workspace/prompts/DIRECT-WORKFLOW.md` — L170~190 (idle 복원 코드)

## 4/21 정상 커밋과 비교
```bash
# 정상 시점
git log --oneline 89485093 -1
# 이후 변경된 코드 파일
git diff 89485093..HEAD -- data_loader.py server.py routes_get.py components/App.js
```
- 4/21: SystemView에 프로세스 목록 없음, SSE에 psutil 없음
- 현재: SystemView에 프로세스 목록 추가, SSE에 psutil 프로세스 스캔 추가

## 검증 시나리오 (이게 되면 성공)

### 시나리오 1: dispatch 직후 신호등 반영
1. dispatch.py로 dev3-team에 테스트 작업 위임
2. 조직뷰에서 dev3-team 팀장(다그다) → 작업중(초록), 팀원 → 대기(노란)
3. task-timer에 running 레코드 존재

### 시나리오 2: finish-task 후 전원 idle 복원
1. 테스트 작업 완료 (finish-task.sh)
2. 조직뷰에서 dev3-team 전원 → 유휴(회색)

### 시나리오 3: 기존 시스템뷰 정상 동작 유지
1. 시스템뷰 탭에서 CPU/RAM 게이지 정상 표시
2. 프로세스 목록 정상 표시
3. SSE 연결 안정적 (끊김 없음)

### 시나리오 4: composite 위임 시 해당 팀 신호등 반영
1. composite(consulting+design)으로 위임
2. 조직뷰에서 consulting, design 섹션에 작업중 표시

## 완료 시그니처
- 봇 작업 중일 때 해당 팀 조직뷰에 작업중/대기 신호등 정상 표시
- dispatch 직후 즉시 반영 (task-timer start 대기 없이)
- finish-task 후 전원 idle 복원
- 시스템뷰 탭 기존 기능 회귀 없음
- 스크린샷: 조직뷰에 작업중 팀 표시 확인

## 레벨
- critical (Lv.4 — 반복 발생 신호등 버그, 근본 수정 필요)

## 프로젝트
- dev-system