# task-1157.1 완료 보고서: 모듈화 위반 전수 점검 — 하드코딩 근절

**팀**: dev6-team (페룬)
**일시**: 2026-03-28

---

## SCQA

**S**: 시스템 전반에 걸쳐 팀/봇 매핑이 하드코딩되어 있으며, organization-structure.json에 dev1~dev8 총 8개 팀이 정의되어 있다.

**C**: 스캔 결과 14개 프로덕션 파일에서 하드코딩 패턴을 발견했고, 그 중 5개 파일은 dev4~dev8 팀이 누락되어 기능 결함 상태였다. inbox_utils.py는 dev1-3만, whisper-compile.py는 dev1-3만, bot-status-watchdog.py는 dev1-3만, skill-usage-logger.sh는 dev1-3만 처리하고 있었다.

**Q**: 모든 하드코딩을 organization-structure.json 기반 동적 로딩으로 전환하여 팀 추가/삭제 시 코드 수정 없이 동작하게 할 수 있는가?

**A**: `utils/org_loader.py` 공통 유틸리티를 생성하고 13개 파일을 수정하여 동적 로딩으로 전환 완료. pytest 115건 전체 통과, 5개 기능 결함(팀 누락) 해결. 팀 추가/삭제 시 organization-structure.json만 수정하면 자동 반영.

---

## 생성/수정 파일 목록

### 신규 생성 (1건)
- `utils/org_loader.py` — 조직구조 동적 로드 공통 유틸리티 (139줄)

### 수정 (12건)

**Python (7건)**
- `dispatch.py` — TEAM_BOT, BOT_TO_KEY, TEAM_TO_BOT_ID를 org_loader 호출로 교체 (try/except fallback 포함)
- `utils/session_resilience.py` — BOT_TEAMS를 org_loader 기반으로 교체
- `inbox_utils.py` — VALID_TEAMS를 get_dev_team_ids() + ["anu"]로 교체
- `scripts/activity-watcher.py` — BOT_TEAM_MAP을 build_bot_team_map() 기반으로 교체
- `scripts/whisper-compile.py` — TEAM_NAME_MAP을 build_short_labels() 기반으로 교체
- `scripts/bot-status-watchdog.py` — BOT_WORKSPACE_PATTERNS을 동적 생성으로 교체
- `teams/shared/sync_verifiers.py` — TEAMS를 _discover_teams() (디렉토리 스캔)으로 교체

**JavaScript (3건)**
- `dashboard/components/utils.js` — teamLabels/teamColors를 window.TEAM_CONFIG 우선 사용으로 변경
- `dashboard/components/HistoryView.js` — 독립 teamLabelMap 제거, 공통 teamLabels 사용
- `dashboard/components/ProjectView.js` — 독립 TEAM_LABEL 제거, 공통 teamLabels 사용

**Dashboard Server (1건)**
- `dashboard/server.py` — 7개 헬퍼 메서드 추가, 하드코딩 3곳 제거, /api/team-config 엔드포인트 추가

**Shell (2건)**
- `~/.claude/hooks/lib/detect-bot.sh` — 하드코딩 case문 → 동적 teams/ 디렉토리 스캔
- `hooks/skill-usage-logger.sh` — dev1-3만 처리 case문 → dev* 패턴 일반화

**문서 (1건)**
- `teams/shared/CODING-STANDARDS.md` — 섹션 11 "팀/조직 정보 동적 로드" 규칙 추가

---

## 테스트 결과

- org_loader.py 단위 검증: 13개 함수 모두 정상 (dev1~dev8, 8팀 확인)
- test_dispatch.py: 98건 통과 (0.56초)
- test_integration.py: 17건 통과 (2.03초)
- inbox_utils VALID_TEAMS: 9개 팀 확인 (dev1-8 + anu)
- session_resilience BOT_TEAMS: 정상
- whisper-compile TEAM_NAME_MAP: dev1~dev8 + anu 확인

---

## 발견 이슈 및 해결

### 자체 해결 (5건)
1. **inbox_utils.py VALID_TEAMS에 dev4-8 누락** — get_dev_team_ids() + ["anu"]로 동적 교체하여 8팀 전체 포함
2. **whisper-compile.py TEAM_NAME_MAP에 dev4-8 누락** — build_short_labels() 기반으로 교체하여 8팀 전체 포함
3. **bot-status-watchdog.py에 dev4-8 누락** — get_dev_short_ids() 기반 동적 생성으로 교체
4. **skill-usage-logger.sh에 dev4-8 누락** — dev* 패턴 일반화로 모든 devN 자동 처리
5. **JS 컴포넌트 3개에서 팀 라벨 중복 하드코딩** — 공통 teamLabels(utils.js)로 통합

### 범위 외 미해결 (2건)
1. **sync_verifiers.py fix_files()의 other_teams 미사용 파라미터** — 기존 코드의 pre-existing 이슈, 본 작업 범위 외
2. **pyright reportMissingImports 경고 (scripts 디렉토리)** — 런타임 sys.path 조작을 pyright가 인식 못하는 구조적 한계, try/except fallback으로 런타임 안전성 확보됨

---

## 아키텍처 결정

### 동적 로딩 전략
- **Python**: `utils/org_loader.py` 공통 유틸리티 → 모든 Python 파일이 import
- **JavaScript**: server.py의 /api/team-config + window.TEAM_CONFIG 패턴
- **Shell**: 디렉토리 스캔(detect-bot.sh) + 패턴 일반화(skill-usage-logger.sh)
- **Graceful degradation**: dispatch.py는 try/except ImportError fallback 포함, org 파일 없어도 시스템 동작

### 모듈화 원칙 준수
- DRY: 14개 파일의 중복 매핑 → 1개 공통 유틸리티로 통합
- 단일 책임: org_loader.py는 조직구조 로드만 담당 (139줄)
- 선택적 임포트: dispatch.py의 기존 패턴 준수

---

## 머지 판단
- **머지 필요**: No (시스템 작업, worktree 미사용)
