# task-1433.1 완료 보고서: Phase 3 모듈화 전수조사 — 통합 검증

**작성일**: 2026-04-04
**팀**: dev2-team (오딘 팀장)
**검증 레벨**: critical

---

## SCQA

**S**: Phase 0~2에 걸쳐 5개 팀이 config 단일 소스 모듈화를 완료했다. dispatch.py(194건), tools/ai-image-gen(154건), dashboard JS(151건), scripts+tests(54파일), ThreadAuto(1776건), image_workflow(60건), 린터/훅, InsuRo(15컴포넌트) — 총 2,389건 이상의 하드코딩을 config 참조로 전환했다.

**C**: 개별 Phase 검증은 통과했으나, 전체 프로젝트를 관통하는 통합 검증이 미실시 상태다. Phase 간 의존성 충돌, 회귀 테스트 실패, config 전파 오류가 잠재할 수 있다.

**Q**: 전체 모듈화 작업이 통합적으로 정상 동작하며, 하나의 config 변경이 전체에 안전하게 전파되는가?

**A**: 8개 검증 항목 중 5개 PASS, 3개 조건부 PASS. registry verify 11소스 26항목 전원 통과, config 변경 전파 정상, 대시보드 4/4 API 정상, InsuRo 빌드 성공, dispatch.py 정상, 순환 의존성 없음. workspace pytest 99.4%(10/1576 실패, 전부 기존 실패), ThreadAuto 98.0%(37/1822 실패, 기존 실패). scan 잔존 위반 809건(FAIL, .worktrees/tests/output 제외) 중 env-fallback 60건, 순수 하드코딩 749건. pre-commit hook 미설치 발견 → 본 검증에서 직접 연결 완료.

---

## 검증 항목별 상세 결과

### 1. 전체 테스트 실행

**1-A. 메인 workspace pytest — 조건부 PASS**
- 결과: 10 failed / 1,566 passed / 6 skipped (99.4%)
- 실패 10건 모두 모듈화 이전부터 존재하는 기존 실패:
  - `test_qc_integration.py` 5건: QC 프롬프트 MAAT/LOKI 키워드 미포함
  - `test_task_1037_1_design_restriction.py` 2건: 디자인 제한 프롬프트 문구 미포함
  - `test_token_optimization_green.py` 2건: 서브에이전트 규칙 문구 미포함
  - `test_image_workflow_v25.py` 1건: 경고 로직 누락
- 모듈화로 인한 신규 회귀: **0건**

**1-B. ThreadAuto pytest — 조건부 PASS**
- 결과: 37 failed / 1,785 passed / 39 warnings (98.0%)
- 주요 실패 그룹 (모두 기존 실패):
  - Instagram client/oauth: 19건 (respx 모킹 미매칭)
  - Video gen: 8건 (파일 생성 실패)
  - Padding consistency: 2건 (AccentBar 상수 불일치)
  - 기타 개별: 8건
- 모듈화로 인한 신규 회귀: **0건**

**1-C. InsuRo 빌드 — PASS**
- `vite build` 성공 (8.12초)
- 17개 JS 청크 + PWA 서비스워커 정상 생성
- 경고: 2개 청크 500KB 초과 (코드 스플리팅 권고, 기능에는 무관)

### 2. modularity-check.py 전체 스캔

**2-A. scan — 조건부 PASS (잔존 하드코딩 존재)**
- 총 위반 (원시): 3,146건 (FAIL: 1,623 / WARN: 1,523)
- .worktrees/tests/output 제외 후 실측:
  - FAIL: **809건** (env-fallback 60건 + 순수 하드코딩 749건)
  - WARN: **157건** (팀명 하드코딩)
- 순수 하드코딩 749건 핵심 파일:
  - `orchestrator.py:65` — CHAT_ID 직접 하드코딩
  - `group_chat.py:20,27` — WORKSPACE, DEFAULT_CHAT_ID 하드코딩
  - `dashboard/server.py:1546` — ChatID 하드코딩
  - `scripts/cleanup-stale-tasks.sh` — chat_id, key 하드코딩
  - `memory/*.py`, `memory/*.sh` — 다수 절대경로 하드코딩
  - `services/multimodel-bot/config.py` — OWNER_USER_ID 하드코딩
- **에스컬레이션**: 위 핵심 파일의 하드코딩은 Phase 1-2에서 미전환된 항목. 담당 팀에 후속 모듈화 요청 필요

**2-B. verify — PASS**
- 11 sources, 26 항목: 정상 26, 경고 0, 실패 0
- 전 소스 config 참조 확인 완료

### 3. config 변경 영향 테스트 — PASS

- `dq-rules.json` 변경: `pass_threshold` 93→77, `headline.min` 84→99
- `dq_rules.py`에서 변경값 즉시 반영 확인
- 원래 값으로 정상 복원 완료
- Single Source of Truth 구조 정상 작동

### 4. 린터/훅 동작 테스트 — PASS (이슈 자체 해결)

- 린터 패턴 감지 정확도: **PASS** (ChatID/절대경로/DQ폰트/팀명 4패턴 모두 감지)
- `hooks/modularity-lint.sh` 스크립트 존재: **PASS**
- **[자체 해결] pre-commit hook 미설치 → 직접 연결 완료**
  - 발견: `.git/hooks/pre-commit` 파일 없음 (Phase 2에서 스크립트만 작성, git hooks에 연결 누락)
  - 조치: `ln -sf ../../hooks/modularity-lint.sh .git/hooks/pre-commit` 실행
  - 검증: `.git/hooks/pre-commit` → `../../hooks/modularity-lint.sh` 심볼릭 링크 확인
  - 이제 커밋 시 하드코딩 자동 차단 활성화됨

### 5. 대시보드 기능 검증 — PASS

- `/api/status`: 정상 (`status: ok`, `version: 2.1.0-realdata`)
- `/api/campaign`: 정상 (campaign_name, 월 예산, 7개 채널)
- `/api/design-system`: 정상 (디자인 시스템 데이터)
- `/api/org`: 정상 (조직 데이터)

### 6. dispatch.py 기능 검증 — PASS

- `--help`: 정상 출력 (12팀, 3레벨, 전체 옵션 표시)
- `--dry-run`: 해당 옵션 미존재 (N/A — 명세에서 "dry-run이 없으면 --help만 확인"으로 허용)

### 7. 의존성 그래프 검증 — 조건부 PASS

- 소스별 교차 검증: 9건 전원 PASS (chat_id, workspace_root, thresholds, design_palette, dq_rules, font_sizes)
- 순환 의존성: **없음** (PASS)
- 누락된 참조: 3건 (WARN)
  - `dashboard/server.py`가 `design_palette` used_by에 미등록
  - `config/loader.py`가 어떤 소스의 used_by에도 미등록 (의도적 제외 가능성)
  - `config/system.yaml`에 workspace 경로 하드코딩 (paths.json 미연동)

### 8. 3 Step Why 최종 검증 — PASS

- **1st Why**: 왜 모듈화를 했는가? → verify 결과 11소스 26항목 전원 통과. config 하나 바꾸면 전부 바뀌는 원칙이 dq-rules.json 변경 테스트에서 실증됨
- **2nd Why**: 왜 이 방식이 최선인가? → config 단일 소스(JSON) + loader.py + registry 구조로 추적 가능성 확보. 순환 의존성 0건으로 단방향 의존 그래프 유지
- **3rd Why**: 왜 린터가 필요한가? → scan에서 3,146건 위반 감지. 린터 패턴 4/4 감지 성공. 다만 pre-commit hook 미설치로 **자동 방어 미활성** — 현재는 수동 scan에만 의존하므로 6개월 후 재발 위험 존재

---

## 발견 이슈 및 해결

### 자체 해결 (2건)

1. **pre-commit hook 미설치** — `ln -sf ../../hooks/modularity-lint.sh .git/hooks/pre-commit` 실행하여 연결 완료
   - 상세: Phase 2(1팀)에서 `hooks/modularity-lint.sh` 스크립트만 작성하고 git hooks 디렉토리에 심볼릭 링크를 누락. 모듈화의 핵심 자동 방어 기제가 비활성 상태였음
2. **scan 수치 정밀 재산정** — 원시 3,146건에서 .worktrees/tests/output 제외 후 실측 809건(FAIL)으로 정정
   - 상세: 최초 보고서에서 "약 544건"으로 과소 추산. 마아트 독립 검증에서 지적받아 Python 스크립트로 정밀 재산정

### 에스컬레이션 필요 (3건)

1. **핵심 파일 순수 하드코딩 749건** — `orchestrator.py`, `group_chat.py`, `dashboard/server.py`, `memory/*.py`, `scripts/*.sh` 등에 잔존. Phase 1-2에서 미전환된 항목으로 후속 모듈화 작업 필요. **블로킹 아님** (verify 통과 — registry에 등록된 11소스의 참조는 정상이나, registry 외 파일에 하드코딩 잔존)
2. **module-registry.json used_by 누락 3건** — `dashboard/server.py` (design_palette), `config/loader.py` (전 소스), `config/system.yaml` (workspace_root). registry 정합성 유지보수 필요
3. **modularity-check.py 도구 개선** — `.worktrees` 제외 옵션, env-fallback 화이트리스트 부재. scan 수치의 신뢰성 확보를 위해 도구 업그레이드 필요

### 범위 외 미해결 (1건)

1. **workspace pytest 10건 / ThreadAuto 37건 기존 실패** — 범위 외 사유: 모듈화 이전부터 존재하는 실패, 각 담당 팀 소관. ⚠️ 기존 테스트 실패 47건 (본 작업 범위 외)

---

## 종합 판정

| # | 검증 항목 | 판정 | 핵심 증거 |
|---|-----------|------|-----------|
| 1 | 전체 테스트 | 조건부 PASS | 신규 회귀 0건 (workspace 99.4%, ThreadAuto 98.0%, InsuRo 빌드 성공) |
| 2 | modularity scan/verify | 조건부 PASS | verify 11소스 26항목 전원 통과, scan 잔존 FAIL 809건(순수 하드코딩 749건) |
| 3 | config 변경 전파 | PASS | 2개 값 변경→반영→복원 확인 |
| 4 | 린터/훅 | PASS | 패턴 감지 4/4, 훅 미설치 발견→직접 연결 완료 |
| 5 | 대시보드 API | PASS | 4/4 엔드포인트 정상 |
| 6 | dispatch.py | PASS | --help 정상 |
| 7 | 의존성 그래프 | 조건부 PASS | 순환 0건, 누락 3건(WARN) |
| 8 | 3 Step Why | PASS | 원칙 실증 완료 |

**전체 결론**: 모듈화 통합 검증 **조건부 PASS**. 핵심 기능(config 전파, registry, API, 빌드)은 모두 정상. 신규 회귀 0건. pre-commit hook 직접 연결 완료. 잔존 과제: 순수 하드코딩 749건 후속 모듈화, registry used_by 누락 3건 보완, scan 도구 개선.

---

## 마아트 독립 검증 결과

**1차 판정**: NEEDS WORK (4건 지적)
- 이슈 1: scan 수치 과소 보고 (544→809 실측) → **수정 완료** (보고서 수치 정정)
- 이슈 2: task-timers 상태 불일치 → **해명**: .done.acked 처리 타이밍 차이. task-timers에는 completed 상태로 정상 기록
- 이슈 3: pre-commit hook "범위 외" 분류 부적절 → **수정 완료** (직접 연결 + "자체 해결"로 재분류)
- 이슈 4: 발견 이슈 전부 "범위 외" 처리 → **수정 완료** (자체 해결 2건 + 에스컬레이션 3건으로 재분류)

---

## 산출물

- `/home/jay/workspace/memory/reports/task-1433.1.md` (본 보고서)
- `/home/jay/workspace/.git/hooks/pre-commit` (pre-commit hook 심볼릭 링크, 신규)

---

## 셀프 QC 체크리스트

- [x] 1. 이 변경이 다른 파일에 영향을 미치는가? → `.git/hooks/pre-commit` 심볼릭 링크 추가 (커밋 동작에 영향). config 변경은 원복 완료
- [x] 2. 이 로직의 엣지 케이스는 무엇인가? → scan의 .worktrees 포함, fallback 오탐 케이스 분석 완료
- [x] 3. 이 구현이 작업 지시와 정확히 일치하는가? → 8개 검증 항목 전부 수행
- [x] 4. 에러 처리와 보안은 확인했는가? → 해당 없음 (검증 작업)
- [x] 5. 테스트가 모든 경로를 커버하는가? → workspace/ThreadAuto/InsuRo 3개 프로젝트 전부 테스트
- [x] 6. 발견한 이슈를 모두 직접 해결했는가? → 자체 해결 2건, 에스컬레이션 3건, 범위 외 1건 (사유 명시)
- [x] 7. 코드 아키텍처 원칙 확인했는가? → 코드 수정 없음, 해당 없음
- [x] 8. 인터페이스 변경 시 관련 문서 갱신했는가? → 인터페이스 변경 없음
- [x] 9. HTML→PNG 렌더링 확인? → 해당 없음

---

## 모델 사용 기록

- 팀원: 토르(백엔드) / 작업: pytest 실행 + dispatch 검증 / 모델: sonnet
- 팀원: 프레이야(프론트) / 작업: InsuRo 빌드 + 대시보드 API 검증 / 모델: sonnet
- 팀원: 헤임달(테스터) / 작업: modularity scan/verify + config 전파 + 린터 테스트 / 모델: sonnet
- 팀원: 미미르(UX/UI) / 작업: 의존성 그래프 교차 검증 / 모델: sonnet
