**task-1804 완료 보고** **task-1804 완료 보고서: 대시보드 조직뷰 팀원 신호등 버그 수정** **핵심 결과** 백엔드 `/api/org` 응답에 `running_tasks_by_team` 딕셔너리를 추가하고, 프론트엔드에서 이를 우선 소스로 사용하도록 수정. 기존 `/api/tasks` 기반 로직은 fallback으로 유지. Playwright 검증 결과: running 태스크가 있는 팀의 팀장=작업중(초록), 팀원=대기(노랑), 없는 팀=유휴(회색) 정상 표시. JS 에러 0건, pytest 기존 통과 9건 유지(5건 기존 실패). ## 수정 내역 ### 백엔드 1. `dashboard/server.py:1741` — `/api/org` 응답에 `running_tasks_by_team` 필드 추가 2. `dashboard/data_loader.py:463` — `get_running_tasks_by_team()` 반환 딕셔너리에 `composite_teams` 필드 추가 ### 프론트엔드 3. `dashboard/components/App.js:228-247` — `running` 변수 계산을 IIFE로 변경: `orgData.running_tasks_by_team` 우선 사용, `task_id` 기준 dedup, fallback으로 기존 `tasksData.filter()` 유지 ## 산출물 파일 - `/home/jay/workspace/dashboard/server.py` - `/home/jay/workspace/dashboard/data_loader.py` - `/home/jay/workspace/dashboard/components/App.js` ## 검증 결과 ### 시나리오 검증 (Playwri 테스트: pytest 4건 통과 **발견/해결 이슈 4건** 1. **`get_running_tasks_by_team()` 이중 호출 비효율** — `_enrich_bot_activity()`와 `/api/org`에서 2회 호출되나, in-memory 딕셔너리 순회(< 50 tasks)로 성능 영향 무시 수준. 현 단계에서 캐싱 미적용. 2. **composite 태스크 double-counting 위험** — `running_tasks_by_team` dict을 flat array로 변환 시 composite 태스크가 primary key + composite sub-key에 중복 존재. `task_id` 기준 Map dedup으로 해결 (first occurrence = original team_id). 3. **`composite_teams` 필드 누락** — `get_running_tasks_by_team()` 반환 dict에 `composite_teams`가 없어 프론트 조건 3 (`t.team_id === 'composite' && t.composite_teams?.includes(...)`)이 작동 불가. 필드 추가로 해결. 4. **`test_composite_status.py` 5건 실패** — 미해결: 범위 외 사유: 본 작업 변경 전부터 동일한 5건 실패 확인 (git stash로 원본 코드 테스트 검증). `get_composite_tasks()` 메서드의 기존 로직 문제.