# task-1425.1 완료 보고서

## SCQA

**S**: dispatch.py는 작업 위임의 핵심 모듈로, TEAM_BOT/CHAT_ID/파일 경로 등이 하드코딩되어 있었다. Phase 0에서 config/constants.json + config/loader.py 단일 소스 인프라가 구축 완료된 상태다.

**C**: 하드코딩된 값(팀 매핑 8개, 봇 매핑 8개, CHAT_ID, workspace 경로)이 분산되어 있어, 팀 추가/변경 시 dispatch.py를 직접 수정해야 했다. config와 dispatch.py 간 값 불일치 위험이 존재했다.

**Q**: dispatch.py 내 모든 하드코딩을 config/loader.py 참조로 전환하여 단일 소스 원칙을 달성할 수 있는가?

**A**: 6곳의 하드코딩을 ConfigManager 참조로 전환 완료. 3단계 fallback 체인(org_loader → config → hardcoded)으로 안정성 확보. 기존 테스트 194건 전체 통과, 동작 변경 없음.

## 변경 내역

| # | 위치 | 변경 전 | 변경 후 |
|---|------|---------|---------|
| 1 | line 35-42 | (없음) | ConfigManager 임포트 블록 추가 |
| 2 | line 122-123 | fallback `"/home/jay/workspace"` 하드코딩 | `_cfg.get_path("roots.workspace")` |
| 3 | line 127-128 | fallback `"6937032012"` 하드코딩 | `_cfg.get_constant("chat_id")` |
| 4 | line 152-191 | TEAM_BOT/BOT_TO_KEY/TEAM_TO_BOT_ID 하드코딩 dict | config 우선 로딩 + ultimate fallback |
| 5 | line 830 | regex `r"/home/jay/workspace..."` 하드코딩 | `re.escape(str(WORKSPACE))` 동적 패턴 |
| 6 | line 514 | docstring 내 하드코딩 경로 | `{WORKSPACE}` placeholder |

## 산출물

- `/home/jay/workspace/dispatch.py` (수정)

## 셀프 QC

- [x] 1. 영향 파일: dispatch.py만 수정. 외부 인터페이스 변경 없음
- [x] 2. 엣지 케이스: config 로드 실패 시 ultimate fallback으로 기존 하드코딩 유지
- [x] 3. 작업 지시 일치: TEAM_BOT, CHAT_ID, 파일 경로, TEAM_TO_BOT_ID 4항목 모두 config 참조 전환 완료
- [x] 4. 에러 처리/보안: try/except 안전 처리, 민감정보 없음
- [x] 5. 테스트 커버리지: 194건 전체 통과 (test_dispatch 167건 + resume 10건 + workflow 17건)
- [x] 6. 이슈 해결: 3건 발견 및 해결 (아래 상세)
- [x] 7. 아키텍처 원칙: DRY 개선 (하드코딩 → 단일 소스 참조)
- [x] 8. 인터페이스 변경: 없음 (내부 fallback만 변경)

## 발견 이슈 및 해결

1. **regex 하드코딩 패턴** (line 811): `_check_referenced_file_sizes` 함수에서 `/home/jay/workspace` 문자열이 regex 패턴에 하드코딩 → `re.escape(str(WORKSPACE))` 로 동적 패턴 생성으로 해결
2. **docstring 하드코딩** (line 495): `_sync_bot_settings` 함수 docstring에 절대 경로 하드코딩 → `{WORKSPACE}` placeholder로 전환
3. **fallback 안정성**: ConfigManager 로드 실패 시에도 기존 동작을 보장하기 위해 3단계 fallback 설계 (org_loader → config → hardcoded)

## 검증 결과

- pytest: 194/194 통과 (0 실패)
- 하드코딩 grep: ultimate fallback에만 잔존 (config도 없는 극단적 상황용)
  - `6937032012` → line 127 ultimate fallback만
  - `/home/jay/workspace` → line 122 ultimate fallback만
  - `TEAM_BOT =` → org_loader/config/ultimate fallback 3경로 (정상)

## 모델 사용 기록

- 아누비스(백엔드): sonnet — dispatch.py 코드 수정 및 테스트 실행
- 라(팀장): opus — 설계, 검토, QC, 보고서
