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

## SCQA

**S**: 대시보드 조직뷰의 신호등 시스템은 봇 작업 상태를 실시간으로 표시하며, 2026-04-21까지 정상 동작이 확인되었다. traffic-light-spec.md에 따라 dispatch 시 팀장=작업중(초록), 팀원=대기(노란)로 표시되어야 한다.

**C**: 봇이 실제 작업 중임에도 대시보드 조직뷰에서 해당 팀이 전원 "유휴"(회색)로 표시되는 버그가 반복 발생하였다. 근본 원인은 두 가지: (1) dispatch.py가 위임 완료 후 member-status.json을 전혀 업데이트하지 않아 task-timer start 호출까지 딜레이 동안 전원 idle 표시, (2) data_loader.py의 _enrich_member_status()가 팀장만 working으로 오버라이드하고 팀원은 idle 유지.

**Q**: dispatch 직후 즉시 신호등이 올바르게 반영되도록 근본 수정할 수 있는가?

**A**: 2개 파일 수정으로 해결 완료. (1) dispatch.py에 `_update_member_status_on_dispatch()` 함수를 추가하여 일반 dispatch와 composite dispatch 모두 성공 직후 member-status.json을 즉시 업데이트 (팀장=working, 팀원=standby). (2) data_loader.py의 `_enrich_member_status()`에 팀원 분기를 추가하여 running task가 있는 팀의 idle 팀원을 standby로 오버라이드. Playwright 스크린샷으로 신호등 정상 동작 확인 완료.

## 수정 파일

- `/home/jay/workspace/dispatch.py` — `_update_member_status_on_dispatch()` 함수 추가 (L2613-2698), 일반 dispatch 호출 (L3214), composite dispatch 호출 (L2319), timezone import 추가 (L22)
- `/home/jay/workspace/dashboard/data_loader.py` — `_enrich_member_status()` L831-843 수정: 팀원 idle→standby 분기 추가

## 테스트 결과

1. **DataLoader 직접 테스트**: running task 삽입 → `_enrich_member_status()` 호출 → hermes=working, vulcan/iris/athena/argos=standby 확인
2. **API 테스트**: `/api/member-status` 엔드포인트 정상 응답 확인
3. **UI 스크린샷 테스트**: Playwright로 대시보드 조직뷰 캡처
   - 유휴 상태: 전원 회색 정상 표시 (dashboard-org-view-idle.png)
   - 작업중 상태: 개발1팀 팀장=작업중(초록), 팀원4명=대기(노란) 정상 표시 (dashboard-org-view-working.png)
   - 인원 현황 바: 작업중 2, 대기 4, 유휴 75 정상 반영

## L1 스모크테스트

1. 서버 재시작: 기존 대시보드 서버(PID 898835) 가동 중 확인
2. API 검증: `curl http://localhost:8000/api/member-status` → 200 OK, 멤버 상태 정상 반환
3. Playwright 스크린샷:
   - `dashboard-org-view-idle.png` — 전원 유휴(회색) 정상
   - `dashboard-org-view-working.png` — 개발1팀 팀장=작업중(초록), 팀원=대기(노란) 정상
4. 콘솔 에러: 0건 (경고 3건은 기존)
5. pytest: 2445 passed, 0 failed

## 발견 이슈 및 해결

### 자체 해결 (2건)
1. **dispatch.py에 member-status 업데이트 로직 부재** — `_update_member_status_on_dispatch()` 함수 신규 추가, atomic_json_write로 안전한 파일 쓰기
2. **_enrich_member_status()에서 팀원 무시** — else 분기 추가하여 idle 팀원을 standby로 전환

### 범위 외 미해결 (1건)
1. **SSE psutil.process_iter() 매 10사이클 스캔** — task-2116/2117에서 추가된 코드. 간접적 SSE 지연 가능성이 있으나 직접적 원인이 아니므로 이번 수정에서 제외. 필요 시 별도 task로 격리 권장.

## 모델 사용 기록
- 불칸(백엔드) / dispatch.py member-status 업데이트 로직 구현 / sonnet
- 이리스(프론트엔드) / data_loader.py _enrich_member_status 수정 / sonnet
