diff --git a/docs/architecture/PHASE-Q-AUDIT.md b/docs/architecture/PHASE-Q-AUDIT.md index cb4a608..d0cd1d8 100644 --- a/docs/architecture/PHASE-Q-AUDIT.md +++ b/docs/architecture/PHASE-Q-AUDIT.md @@ -871,7 +871,123 @@ I6. (factual note) — §1 audit lens 의 A-3 / A-4 매핑 정확도: > ⚠ **본 §2.8 audit 판정은 Phase Z normal path 기준의 후보 분류이며, `renderer.py` 는 §3 Salvage 적용 대상이 없다 (Salvage Candidate 0).** §0-A 의 10 원칙 + §0-0 의 분류 기준 + §0-B Audit 범위 lock + AI 격리 invariant 모두 따름. Reference Only 자산은 A-3 구현 axis / A-4 보강 axis / Phase Z SVG 보강 axis 활성 시 *참고 여부만 별도 판단* (직접 통합 X). **`render_slide_from_html` (Phase R') = Archive 명확 (CLAUDE.md 명시 폐기)**. -### 2.9 `html_generator.py` — *후속 turn* +### 2.9 `html_generator.py` + +#### 역할 + +**헤더**: "Phase T: AI HTML 생성기 — 동적 프롬프트 생성" +> 영역별 개별 호출. Phase T context (폰트 위계, 블록 레퍼런스, 디자인 예산) 에서 모든 수치를 동적으로 가져와 프롬프트 조립. +> **역할 분리**: Kei (1단계) = 콘텐츠 분석. **Claude Sonnet (이 모듈) = HTML 코드 생성**. + +**1069 lines, 13 함수 (class 없음) + 2 legacy prompt 상수**. + +**이 모듈 자체가 *Phase R' (AI HTML 직접 생성) main implementation***: +- `import anthropic` + `_call_claude` → Anthropic Claude Sonnet API 직접 호출 +- `generate_slide_html` (async) — main entry, 4 영역 (배경/본심/sidebar/footer) 각각 Claude 호출 +- `regenerate_area` (async) — failed area retry + error feedback +- `build_area_prompt` — Phase T 동적 prompt 조립 + +§2.8 의 `render_slide_from_html` (renderer.py 의 Phase R' helper) 가 *consume 하는 main path* — html_generator 가 Phase R' 의 *core implementation*. + +핵심 함수: + +| 함수 | line | 역할 | AI 의존 | +|---|---|---|---| +| `_calc_indent` | 49 | 폰트 크기 기반 들여쓰기 px 계산 | deterministic | +| `build_area_prompt` | 59 | 영역별 Claude prompt 동적 조립 (Phase T) | AI prompt 조립 | +| `_build_phase_t_supplement` | 532 | Phase T context supplement | AI prompt 보조 | +| `generate_slide_html` (async) | 594 | **main entry** — 4 영역 Claude API 호출 | Claude API 직접 호출 | +| `normalize_mdx` | 752 | MDX 정규화 | deterministic | +| `_slice_mdx_sections` | 830 | MDX section slicing | deterministic | +| `_map_sections_for_role` | 858 | role-section 매핑 | deterministic | +| `_extract_keywords_from_hints` | 906 | source_hint keyword 추출 | deterministic | +| `_get_definitions` | 930 | 용어 정의 추출 | deterministic | +| `_get_conclusion` | 943 | 결론 추출 | deterministic | +| `_call_claude` (async) | 963 | Claude Sonnet API call + HTML 추출 | Claude API 인프라 | +| `regenerate_area` (async) | 989 | failed area Claude 재호출 + error feedback | Claude API 재호출 | +| `_replace_img_placeholder` | 1056 | placeholder 이미지 → base64 교체 | deterministic | + +상수: `_LEGACY_SIDEBAR_PROMPT` / `_LEGACY_FOOTER_PROMPT` (regenerate_area 에서 사용 — legacy prompt 폴백). + +#### 관련 §7-B 항목 + +**§1 §2 audit list**: `html_generator.py` (A-3, A-4) + +| §7-B | 직간접 | 영향 | +|---|---|---| +| **A-3** Frame preview png 일관성 | (부정확) | A-3 main = preview.png 자동 생성. html_generator 는 *full slide HTML 의 AI 생성* — preview 생성 component 와 직접 매핑 X. §1 의 "(selenium 캡처 흔적 추정)" 부연도 부정확 (html_generator 에 Selenium import 부재). §1 정정 후보 | +| **A-4** slide-base.html iframe-friendly mode | (부정확) | html_generator 는 area HTML 만 반환 (body/sidebar/footer separately). slide-base 사용은 renderer.py — html_generator 는 slide-base 호출 부재. §1 정정 후보 | + +→ §1 매핑 = §2.8 renderer.py 와 같은 패턴으로 부정확. 별 axis 정정 후보 (J5). + +#### 현재 Phase Z 와 겹치는 영역 + +| Phase Q `html_generator` | Phase Z (현재) | 비교 | +|---|---|---| +| `generate_slide_html` (AI HTML generation main) | **(Phase Z 에서 명시 폐기 — Phase R')** | CLAUDE.md: *"Phase R' 의 역할 분리 (AI 가 HTML 구조 직접 생성) 는 Phase Z 에서 폐기"*. Phase Z = 결정론적 mapper | +| `_call_claude` (Claude API infra) | (Phase Z normal path 미존재 — AI 격리 invariant) | Phase Z 본체 AI 호출 X. AI repair fallback 영역 (본 audit 외, L3 lock) | +| `regenerate_area` (Claude 재호출 + error feedback) | (Phase Z 폐기) | retry loop 자체가 Phase R' 의 part | +| `build_area_prompt` + `_build_phase_t_supplement` (Phase T 동적 prompt) | (Phase Z 폐기) | Phase T → Phase R' 흐름 — Phase Z 에서 거부됨 | +| `normalize_mdx` (line 752) | §2.1 `mdx_normalizer.py` 의 `normalize_mdx_content` | **중복 implementation** (§2.1 에 더 직접적인 SoT 후보 존재) | +| `_slice_mdx_sections` / `_map_sections_for_role` | §2.2 `section_parser.py` 의 extract 함수들 | **중복 implementation** (§2.2 에 더 직접적인 SoT 후보 존재) | +| `_get_definitions` / `_get_conclusion` | §2.2 `extract_conclusion_text` 등 | 부분 중복 (§2.2 에 더 직접적인 SoT 후보 존재) | +| `_extract_keywords_from_hints` | (Phase Z 미존재 — keyword 추출 utility) | 일반 utility | +| `_replace_img_placeholder` | (Phase Z 미존재 — base64 image utility) | 일반 utility | +| `_calc_indent` | (Phase Z 미존재 — typography utility) | 일반 utility | + +#### 재사용 가능성 + +| 자산 | 분류 | 근거 | +|---|---|---| +| `_calc_indent` | **Reference Only** | typography utility. Phase Z normal path 직접 활성 axis 부재 | +| `build_area_prompt` | **Archive Candidate** | Claude prompt 조립 — AI HTML generation flow. Phase R' main path | +| `_build_phase_t_supplement` | **Archive Candidate** | Phase T → Phase R' Claude prompt 보조. AI flow | +| **`generate_slide_html`** (async) | **Archive Candidate** | **Phase R' main entry** — Claude API 직접 호출. CLAUDE.md 명시 폐기 | +| `normalize_mdx` | **Reference Only** | §2.1 `normalize_mdx_content` 와 중복 (§2.1 에 더 직접적인 SoT 후보 존재). Phase Z normal path 직접 활성 axis 부재. Phase R' cleanup 시 별도 판단 | +| `_slice_mdx_sections` | **Reference Only** | §2.2 `extract_major_sections` 영역 중복 (§2.2 에 더 직접적인 SoT 후보 존재). Phase Z normal path 직접 활성 axis 부재. Phase R' cleanup 시 별도 판단 | +| `_map_sections_for_role` | **Reference Only** | role-section 매핑 utility. Phase Z = V4 매칭 path master | +| `_extract_keywords_from_hints` | **Reference Only** | keyword utility | +| `_get_definitions` | **Reference Only** | 용어 정의 추출 utility | +| `_get_conclusion` | **Reference Only** | §2.2 `extract_conclusion_text` 와 부분 중복 (§2.2 에 더 직접적인 SoT 후보). Phase R' cleanup 시 별도 판단 | +| **`_call_claude`** (async) | **Archive Candidate** | Claude API 직접 호출 infrastructure. AI HTML generation flow | +| **`regenerate_area`** (async) | **Archive Candidate** | failed area Claude 재호출 + error feedback. AI flow + retry loop | +| `_replace_img_placeholder` | **Reference Only** | base64 image utility | +| `_LEGACY_SIDEBAR_PROMPT` / `_LEGACY_FOOTER_PROMPT` (상수) | **Archive Candidate** | legacy Claude prompt 상수. Phase R' artifact | + +#### audit 판정 + +**Mixed (Archive heavy — Phase R' core)**. + +`html_generator.py` 는 *Phase R' (AI HTML 직접 생성) 의 main implementation*. CLAUDE.md 가 명시 폐기. **Salvage Candidate 0**. 대부분의 AI HTML generation path (`generate_slide_html` / `_call_claude` / `regenerate_area` / `build_area_prompt` / Phase T supplement / `_LEGACY_*` prompts) = **Archive Candidate**. 일부 deterministic helper (`normalize_mdx` / `_slice_mdx_sections` / `_get_definitions` / `_get_conclusion` / `_calc_indent` / `_replace_img_placeholder` 등) = **Reference Only** (§2.1 / §2.2 에 더 직접적인 SoT 후보 존재). + +- §3 Salvage 적용 대상: **없음** (Salvage Candidate 0) +- 별도 surface: + - §1 audit lens 의 A-3 / A-4 매핑 *부정확* — html_generator 는 *AI HTML generation main* 으로 A-3 (preview) / A-4 (iframe mode) 와 직접 관계 X (§2.6 / §2.8 patterns 누적) + - **html_generator 가 Phase R' 의 *core implementation***. §2.8 의 `render_slide_from_html` 가 *consume 하는 main path* — Phase R' Archive 영역의 *주축* + - utility 함수 중복 (§2.1 / §2.2 자산과) — *Phase R' cleanup 시 별 axis* 후보 + +#### 후속 참고 사항 (본 audit 밖 surface) + +J1. (Archive marker — 핵심) — **`html_generator.py` 가 Phase R' (AI HTML 직접 생성) main implementation**. `generate_slide_html` / `_call_claude` / `regenerate_area` / `build_area_prompt` / `_build_phase_t_supplement` / `_LEGACY_*` prompts 모두 Archive Candidate. CLAUDE.md 명시 폐기. §3 검토 대상 외. + +J2. (별 axis 후보 — §2.8 와 연결) — §2.8 의 `render_slide_from_html` (Phase R' helper) 가 *consume* 하는 main implementation. **§2.8 + §2.9 양쪽이 Phase R' archive 영역의 공동 core**. §3 Salvage Plan 에서 *Phase R' 영역 전체* 별 axis 로 묶어 표시 가능. + +J3. (별 axis 후보 — cleanup) — utility 함수 중복: `normalize_mdx` (vs §2.1 `mdx_normalizer.normalize_mdx_content`) / `_slice_mdx_sections` (vs §2.2 `extract_major_sections`) / `_get_definitions` / `_get_conclusion` (vs §2.2 `extract_conclusion_text`). §2.1 / §2.2 에 이미 더 직접적인 SoT 후보가 있으므로, 본 모듈 안의 중복 helper 는 Reference Only. Phase R' cleanup 시 제거/보존 여부를 별도 판단. + +J4. (별 axis 후보) — `_calc_indent` / `_extract_keywords_from_hints` / `_replace_img_placeholder` 등 *일반 utility* 는 future verification / rendering 보강 axis 활성 시 Reference Only 참고. + +J5. (factual note — §1 매핑 누적) — §1 audit lens 의 A-3 / A-4 매핑 정확도: +- A-3: 부정확 — html_generator 는 *AI HTML generation main*, preview render component 아님. §1 의 "(selenium 캡처 흔적 추정)" 부연도 부정확 (Selenium import 부재) +- A-4: 부정확 — html_generator 는 *area HTML separately 반환*, slide-base 사용 부재 (renderer.py 가 slide-base 사용) +- §2.6 / §2.8 / §2.9 의 §1 매핑 부정확 패턴 누적 — §1 정정 별 axis weight ↑ (단 본 audit 에서는 직접 정정 X — 별 axis 로 deferred) + +#### Salvage Plan 검토 대상 dual-write 기준 (§3 에서 재확정) + +- **Salvage Candidate**: 없음 +- **Reference Only** 자산 (deterministic helpers): §0-A 원칙 10 따라 활성 axis 결정 = *별 axis*. Phase Q utility 중복 자체가 cleanup 별 axis 영역. §2.1 / §2.2 에 더 직접적인 SoT 후보가 있으므로 본 모듈 중복 helper 는 *Phase R' cleanup 시 별도 판단* +- **Archive Candidate** (Phase R' core + Claude prompt 상수): §3 검토 대상 외 + +> ⚠ **본 §2.9 audit 판정은 Phase Z normal path 기준의 후보 분류이며, `html_generator.py` 는 Phase R' (AI HTML 직접 생성) main implementation 으로 §3 Salvage 적용 대상이 없다.** §0-A 의 10 원칙 + §0-0 의 분류 기준 + §0-B Audit 범위 lock + AI 격리 invariant 모두 따름. Reference Only 자산은 §2.1 / §2.2 에 더 직접적인 SoT 후보가 있으므로 Phase R' cleanup 시 별도 판단. **`html_generator.py` = Phase R' core Archive 명확 (CLAUDE.md 명시 폐기 — AI 가 HTML 구조 직접 생성하는 흐름 금지)**. ### 2.10 `block_reference.py` / `block_selector.py` — *후속 turn* @@ -955,7 +1071,8 @@ audit 결과 → 어느 항목이: | 2026-05-12 | §2.6 content_editor.py audit | 완료 — Archive Candidate (module-level). Kei AI direct slot-fill flow. §3 검토 대상 외. 별도 surface: §1 B-1/B-2 매핑 부정확 (G2 별 axis), AI repair fallback infra reference 여부 별 axis (G3) | | 2026-05-12 | §2.7 content_verifier.py audit | 완료 — Mixed (Reference Only + Archive Candidate). Salvage Candidate 0. utility 다수 결정론적이나 Phase Z normal path 직접 빈칸 채움 부재 → Reference Only. Kei artifact 검출 + Kei AI generation retry loop = Archive. L4 Selenium / L5 Opus vision = 본 파일 구현 부재 (header documentation only). §3 적용 대상 없음. 별도 surface: §1 B-2 후속 매핑 간접, H1~H3 reference axis 후보, H4~H5 Archive marker, H6 L4/L5 factual note | | 2026-05-12 | §2.8 renderer.py audit | 완료 — Mixed (Reference Only + Archive Candidate). **`render_slide_from_html` (Phase R') = Archive (CLAUDE.md 명시 폐기 — AI 가 HTML 구조 직접 생성 금지)**. Salvage Candidate 0. 나머지 Jinja2 rendering utility / catalog 로드 / template resolution = Reference Only (Phase Q schema 특화, abstraction 다름). §3 적용 대상 없음. 별도 surface: §1 A-3 간접 / A-4 영향면 있으나 conditional CSS 분기 구현 부재, I1~I4 구현/보강 axis 후보, I5 Phase R' Archive marker, I6 §1 매핑 정확도 factual note | -| ... | §2.9~§2.10 까지 1 모듈씩 | (대기) | +| 2026-05-12 | §2.9 html_generator.py audit | 완료 — Mixed (Archive heavy — Phase R' core). **`html_generator.py` = Phase R' (AI HTML 직접 생성) main implementation (CLAUDE.md 명시 폐기)**. Salvage Candidate 0. AI HTML generation path (`generate_slide_html` / `_call_claude` / `regenerate_area` / `build_area_prompt` / Phase T supplement / `_LEGACY_*` prompts) = Archive Candidate. deterministic helpers (`normalize_mdx` / `_slice_mdx_sections` / `_get_definitions` / `_get_conclusion` / `_calc_indent` / `_replace_img_placeholder` 등) = Reference Only (§2.1 / §2.2 에 더 직접적인 SoT 후보 존재). §3 적용 대상 없음. 별도 surface: §1 A-3/A-4 매핑 부정확, J1 Phase R' core Archive marker, J2 §2.8 연결, J3 utility 중복 cleanup axis, J4 general helper reference axis, J5 §1 매핑 factual note | +| ... | §2.10 까지 1 모듈씩 | (대기) | | (last) | §2.11 pipeline.py / pipeline_context.py | (대기) | | (then) | §3 Salvage Plan | (대기) | | (then) | §4 우선순위 재정렬 → ROADMAP 갱신 | (대기) |