# task-1430.1 완료 보고서

## SCQA

**S**: image_workflow.py는 Phase 0~1에서 config 4개 + loader.py + dq_rules.py + dispatch.py 모듈화가 완료된 상태에서, 여전히 DQ 점수 기준(93점), 폰트 사이즈(84/64/40px), 폰트 두께(300/400), 파일 경로(/home/jay/workspace)를 인라인 하드코딩하고 있었다.

**C**: dq-rules.json에서 규칙을 변경해도 image_workflow.py에 자동 반영되지 않아, 값 동기화 누락으로 인한 QC 기준 불일치 위험이 있었다.

**Q**: image_workflow.py의 모든 DQ 관련 하드코딩을 config/dq_rules 참조로 전환하여 단일 소스(Single Source of Truth) 원칙을 달성할 수 있는가?

**A**: 8개 카테고리의 하드코딩을 모두 config/dq_rules 참조로 전환 완료. dq-rules.json 변경 시 image_workflow.py에 자동 반영됨을 검증. 기존 테스트 60/61건 통과(1건 dispatch.py 기존 실패, 본 작업 범위 외).

## 수정 내용

### 변경 파일
- `/home/jay/workspace/prompts/image_workflow.py`

### 변경 사항 상세

1. **Import 변경**: `import os` 제거 → `ConfigManager` + `dq_rules` 모듈 import 추가
2. **WORKSPACE_ROOT**: `os.environ.get("WORKSPACE_ROOT", "/home/jay/workspace")` → `ConfigManager.get_path("roots.workspace")`
3. **DQ 파생 상수 추가**: `_HEADLINE_MIN`, `_SUBHEAD_MIN`, `_MAX_BANNED_WEIGHT`, `_MIN_ALLOWED_WEIGHT` (dq-rules.json에서 파생)
4. **QC_CATEGORY_A**: A-04(폰트 크기), A-08(절대 최소), A-09(폰트 두께) check 문자열 → f-string으로 전환
5. **build_phase3_prompt**: 폰트 크기 84/64/40, 두께 300/400 → 파생 상수 참조
6. **build_phase2_5_prompt**: 40px → `ABSOLUTE_MIN_PX` 참조
7. **build_phase3_5_prompt**: `threshold = 93` → `PASS_THRESHOLD`, 관련 문자열 모두 f-string 전환
8. **_build_fail_categories_section**: FONT_WEIGHT_FAIL 설명 → `_MAX_BANNED_WEIGHT` 참조

### 변경하지 않은 항목 (의도적)
- ESCALATION_RULES 값 (90, 97, 5, 3, 2) — 워크플로우 전용 상수
- B 카테고리 70점, 브리프 QC 85점 — 워크플로우 전용
- WCAG 대비율 7:1, 4.5:1 — 국제 표준 값
- 안전 영역 여백 40px, 텍스트 간격 8px — 레이아웃 규칙 (DQ 폰트 규칙 아님)

## 검증 결과

### 하드코딩 grep 검증
- DQ 93점 하드코딩: 0건 (PASS)
- 폰트 크기(84/64) 하드코딩: 0건 (PASS)
- 경로(/home/jay/workspace) 하드코딩: 0건 (PASS)
- `import os` 잔존: 0건 (PASS)

### DQ 규칙 자동 반영 검증
- `PASS_THRESHOLD` = dq-rules.json `pass_threshold` = 93 (일치)
- `_HEADLINE_MIN` = dq-rules.json `headline.min` = 84 (일치)
- `_SUBHEAD_MIN` = dq-rules.json `subhead.min` = 64 (일치)
- `ABSOLUTE_MIN_PX` = dq-rules.json `absolute_min` = 40 (일치)
- `_MAX_BANNED_WEIGHT` = dq-rules.json `banned_weights` max = 300 (일치)
- `WORKSPACE_ROOT` = ConfigManager `roots.workspace` = /home/jay/workspace (일치)

### 테스트 결과
- `tests/test_image_workflow_v25.py`: 60 passed, 1 failed (dispatch.py 기존 실패, 본 작업 범위 외)
- `tests/test_token_optimization_green.py`: 22 passed, 2 failed (team_prompts.py 기존 실패, 본 작업 범위 외)
- pyright: 0 errors, 0 warnings (pyright_check PASS)

### ⚠️ 기존 테스트 실패 3건 (본 작업 범위 외)
- `TestDispatchWarning::test_warning_logic_exists` — dispatch.py 내 `_image_keywords` 변수 검증 (dispatch.py 미수정)
- `TestG4SubagentResultRules::test_marketing_prompt_contains_subagent_rules` — team_prompts.py 내용 검증
- `TestG4SubagentResultRules::test_design_prompt_contains_subagent_rules` — team_prompts.py 내용 검증

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **Pyright import resolution 실패** — `config/` 디렉토리에 `__init__.py` 미존재로 Pyright가 패키지 인식 불가. `# pyright: ignore[reportMissingImports]` 추가로 해결 (프로젝트 표준 패턴 준수)
2. **black 포맷팅 불일치** — A-04 dict entry가 한 줄에 너무 길어 black 위반. `black prompts/image_workflow.py` 실행으로 자동 교정
3. **FAIL_CATEGORIES 코멘트 하드코딩** — `# 폰트 두께 미달 (300 이하)` 코멘트에서 수치 제거

### 범위 외 미해결 (1건)
1. **config/__init__.py 미존재** — Pyright가 `config` 패키지를 완전히 인식하려면 `__init__.py` 필요. 범위 외 사유: config/ 디렉토리는 Phase 0 완료로 수정 금지

## 참조 체인 (단일 소스 흐름)
```
dq-rules.json (단일 소스) → tools/dq_rules.py (Python API) → prompts/image_workflow.py (프롬프트 생성)
config/paths.json (경로 소스) → config/loader.py (ConfigManager) → prompts/image_workflow.py
```

## 모델 사용 기록
- 토르(백엔드): image_workflow.py 수정 / sonnet / -
- 오딘(팀장): 설계, QC 검증, Pyright 진단 수정 / opus / 직접 개입 사유: Pyright 진단 해결은 설정 판단 필요
