docs: add renderer audit (Reference Only + Phase R' Archive)

- Classify renderer.py as Mixed with Salvage Candidate 0
- Mark Jinja/catalog/template rendering helpers as Reference Only
- Record render_slide_from_html Phase R' path as Archive Candidate
- Clarify A-3 as indirect preview render surface
- Clarify A-4 as slide-base impact surface without conditional CSS implementation
- Add §5-1 dated entry for 2026-05-12

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-12 09:56:45 +09:00
parent 1fedd4d0a0
commit 79cab1dcb9

View File

@@ -779,7 +779,97 @@ H6. (factual note) — 헤더의 L4 (Selenium) / L5 (Opus vision) layer 는 *문
> ⚠ **본 §2.7 audit 판정은 Phase Z normal path 기준의 후보 분류이며, `content_verifier.py` 는 §3 Salvage 적용 대상이 없다 (Salvage Candidate 0).** §0-A 의 10 원칙 + §0-0 의 분류 기준 + §0-B Audit 범위 lock + AI 격리 invariant 모두 따름. Reference Only 자산은 future verification / visual_check 보강 / B-2 검증 별 axis 활성 시 *참고 여부만 별도 판단* (직접 통합 X). **L4 Selenium / L5 Opus vision 은 본 파일 구현 부재 — header documentation only**.
### 2.8 `renderer.py` — *후속 turn*
### 2.8 `renderer.py`
#### 역할
**헤더**: "DA-11 + DA-21: 슬라이드 조합 렌더러" — 블록 배치 명세(JSON)를 받아 Jinja2 로 HTML 생성. 다중 페이지 지원 / 카테고리 경로 (`blocks/{category}/{name}.html`) / `_legacy` fallback / area 블록 그룹핑.
**687 lines, 11 함수 (class 없음).**
핵심 함수:
- `_load_catalog_map` / `_load_catalog_map_with_variants``catalog.yaml` → block id → template 매핑 (mtime check + 캐시, Phase R variant 포함)
- `create_jinja_env` — Jinja2 Environment 생성 (FileSystemLoader)
- `_resolve_template_path` — block_type + variant → template path 해결 (catalog → 카테고리 검색 → `_legacy` fallback)
- `_preprocess_svg_data` — Phase P2-B SVG 시각화 블록 좌표 사전 계산 (결정론적)
- `_group_blocks_by_area` — 같은 area 블록 그룹핑 + Phase O 비중 기반 컨테이너
- `render_multi_page` — 다중 페이지 슬라이드 HTML 생성 (DA-21 카테고리 경로 + `slide-base.html` + `tokens.css` + `base.css` 인라인)
- `render_slide` — 하위 호환 단일 페이지 (pages 구조 있으면 `render_multi_page` 위임)
- `render_block_in_container`**Phase P 다후보** era — 단일 블록 + 컨테이너 HTML (Selenium 스크린샷 캡처용)
- **`render_slide_from_html`** — **Phase R'** — AI 가 생성한 HTML 조각 (body/sidebar/footer) → slide-base 프레임 삽입
- `render_standalone_block` — 단일 블록 독립 HTML (테스트/미리보기)
#### 관련 §7-B 항목
| §7-B | 직간접 | 영향 |
|---|---|---|
| **A-3** Frame preview png 일관성 | (간접) | A-3 main = *preview.png 자동 생성 path*. `render_block_in_container` 가 Selenium 스크린샷 캡처용 HTML 생성 — preview render layer 의 1 component. Selenium 호출 자체는 별 module |
| **A-4** slide-base.html iframe-friendly mode | (영향면 있음, 구현 부재) | renderer.py 는 `slide-base.html` 사용 호출 지점 있음 (`render_multi_page` / `render_slide` / `render_slide_from_html`) — **A-4 영향면 보유**. 단 *embedded / standalone conditional CSS 분기* 는 구현하지 않음. A-4 자체는 *향후 보강 target* |
#### 현재 Phase Z 와 겹치는 영역
| Phase Q `renderer` | Phase Z (현재) | 비교 |
|---|---|---|
| `_load_catalog_map` + `_load_catalog_map_with_variants` (catalog.yaml) | Phase Z = `templates/phase_z2/catalog/frame_contracts.yaml` | **catalog schema 다름**. Phase Q = block id → variant template. Phase Z = frame contract + frame_partials |
| `create_jinja_env` (Jinja2 env) | Phase Z 자체 wrapper (`phase_z2_pipeline`) | Jinja2 공통 사용 단 wrapper 다름 |
| `_resolve_template_path` (catalog + 카테고리 + fallback) | Phase Z = frame_id → frame_partial path 직접 매핑 | **abstraction 다름** (block category vs frame contract id) |
| `_preprocess_svg_data` (SVG 좌표 사전 계산) | (Phase Z normal path 미존재 — frame_partials 안에 좌표 박힘) | Phase Z 의 SVG 는 frame_partial 안에 미리 박혀 있어 preprocess 불필요 |
| `_group_blocks_by_area` (area 비중 grouping) | Phase Z = zone/unit/preset (별 abstraction) | **abstraction 완전 다름** (Phase Q area + 비중 vs Phase Z zone preset) |
| `render_multi_page` / `render_slide` (orchestrator) | Phase Z = `phase_z2_pipeline` 의 final HTML 생성 | Phase Z 자체 orchestrator master |
| `render_block_in_container` (Selenium 캡처용) | (Phase Z normal path 미존재 — A-3 구현 axis) | Phase P 다후보 era artifact. A-3 구현 axis 활성 시 reference |
| **`render_slide_from_html`** (Phase R') | **(Phase Z 에서 명시 폐기)** | CLAUDE.md: *"Phase R' 의 역할 분리 (AI 가 HTML 구조 직접 생성) 는 Phase Z 에서 폐기"* — Archive |
| `render_standalone_block` (테스트 utility) | (Phase Z 미존재 — 별 axis 활성 시 reference) | 단일 블록 utility |
#### 재사용 가능성
| 자산 | 분류 | 근거 |
|---|---|---|
| `_load_catalog_map` / `_load_catalog_map_with_variants` | **Reference Only** | catalog 로드 + mtime 캐시 패턴 참고 가능. Phase Q catalog schema 와 Phase Z frame_contracts schema 다름 → 직접 통합 X |
| `create_jinja_env` | **Reference Only** | Jinja2 env 생성 wrapper. Phase Z 자체 wrapper 있음 |
| `_resolve_template_path` | **Reference Only** | catalog ID → template path 패턴 참고. Phase Q schema 특화 |
| `_preprocess_svg_data` | **Reference Only** | SVG 좌표 사전 계산 패턴. Phase Z SVG 는 frame_partial 안 — 직접 활용 axis 부재 |
| `_group_blocks_by_area` | **Reference Only** | area 비중 grouping 패턴 참고. abstraction (Phase Q area vs Phase Z zone) 다름 |
| `render_multi_page` / `render_slide` | **Reference Only** | orchestrator 패턴 참고. Phase Q layout_concept schema 특화 |
| `render_block_in_container` (Phase P + Selenium 캡처용) | **Reference Only** | A-3 구현 axis 활성 시 reference (HTML wrapper partial helper — end-to-end preview 구현은 별 layer). 직접 통합 X |
| **`render_slide_from_html`** (Phase R') | **Archive Candidate** | Phase R' 명시 폐기 (CLAUDE.md). AI 가 HTML 구조 직접 생성하는 흐름 — Phase Z 에서 거부됨 |
| `render_standalone_block` | **Reference Only** | 단일 블록 테스트 utility. 별 axis 활성 시 reference |
#### audit 판정
**Mixed (Reference Only + Archive Candidate)**.
`renderer.py` 는 결정론적 Jinja2 rendering utility 가 많지만, *Phase Z normal path 의 직접 Salvage 후보는 없다*. catalog schema / area abstraction / orchestrator 모두 Phase Q 특화 — Phase Z 와 abstraction 다름. 단 `render_slide_from_html` (Phase R' artifact) 는 **Archive Candidate** — CLAUDE.md 가 명시 폐기.
- §3 Salvage 적용 대상: **없음** (Salvage Candidate 0). Reference Only 자산은 *A-3 구현 axis / A-4 보강 axis / Phase Z SVG 보강 axis* 활성 시 참고 여부만 별도 판단 (직접 통합 X)
- 별도 surface:
- §1 audit lens 의 A-3 매핑은 *간접* (preview render component 의 1 part)
- A-4 iframe-friendly mode: renderer.py 가 `slide-base.html` *영향면 보유* (사용 호출 지점 있음). 단 *embedded/standalone conditional CSS 분기* 구현 부재 — A-4 는 *향후 보강 target*
- **`render_slide_from_html` (Phase R') = Archive 명확** (CLAUDE.md 명시 폐기 — AI 가 HTML 구조 직접 생성하는 흐름 금지) — 가장 중요한 배제 결정
#### 후속 참고 사항 (본 audit 밖 surface)
I1. (별 axis 후보) — A-3 구현 axis 활성 시, `render_block_in_container` 의 Selenium 캡처용 HTML 생성 pattern 이 **Reference Only 참고 후보**. 직접 통합 X — adapter / dual-write 검증은 별 axis 활성 시 새 기준으로 결정.
I2. (별 axis 후보 — A-4 영향면 보유, 구현 부재) — renderer.py 가 `slide-base.html` 사용 호출 지점은 있어 *A-4 영향면 보유*. 단 *embedded/standalone conditional CSS 분기* 는 구현 없음. Phase Z 본체 또는 A-4 보강 axis 에서 *새 설계* 필요 (renderer.py 의 slide-base 사용 pattern 만 Reference).
I3. (별 axis 후보) — `_preprocess_svg_data` (SVG 좌표 사전 계산) 가 Phase Z SVG 보강 axis 활성 시 Reference Only 참고. 단 Phase Z frame_partials 에 좌표 박힘 — 활성 axis 자체 검토 필요.
I4. (별 axis 후보) — `_group_blocks_by_area` (area 비중 grouping + Phase O 컨테이너) 가 Phase Z zone 비중 분배 axis 활성 시 Reference Only. abstraction 다름 — 직접 통합 X.
I5. (Archive marker) — **`render_slide_from_html` 는 Phase R' artifact**. CLAUDE.md 가 *"Phase R' 의 역할 분리 (AI 가 HTML 구조 직접 생성) 는 Phase Z 에서 폐기"* 명시. §3 검토 대상 외. Phase Z 의 *결정론적 mapper* path 와 직접 충돌.
I6. (factual note) — §1 audit lens 의 A-3 / A-4 매핑 정확도:
- A-3: *간접* (renderer 는 preview render component 의 1 part, Selenium 호출은 별 module)
- A-4: renderer.py 가 `slide-base.html` 사용 호출 지점 있음 → *영향면 보유*. 단 *embedded/standalone conditional CSS 분기 구현 부재* — A-4 자체는 *향후 보강 target*
#### Salvage Plan 검토 대상 dual-write 기준 (§3 에서 재확정)
- **Salvage Candidate**: 없음
- **Reference Only** 자산: §0-A 원칙 10 따라 활성 axis 결정 = *별 axis* (A-3 구현 axis / A-4 보강 axis / Phase Z SVG 보강 axis 등). 활성 시 그 axis 의 SoT 따라 adapter / dual-write 기준 별도 결정. 본 §2.8 audit 단계의 dual-write 기준 적용 X.
- **Archive Candidate** (`render_slide_from_html`, Phase R'): §3 검토 대상 외.
> ⚠ **본 §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*
@@ -864,7 +954,8 @@ audit 결과 → 어느 항목이:
| 2026-05-11 | 정정 pass 2 본체 실행 (2-c hygiene fix 2 + 2-d / 2-e / 2-f / 2-g) | 완료 — L1~L4 boundary lock 반영. §0-B Audit 범위 lock 추가, §2.5 F-3 함수별 재분류 반영 (`calculate_design_budget` / `calculate_char_budget` / `calculate_budgets_for_candidates` / `calculate_trim_chars` → Reference Only), §3 / §4 legacy 용어 정리, §5-1 인라인 재분류 태그 5 entry append, 13 pattern context-aware grep 검증 수행. 산출 추가: `PHASE-Q-AUDIT-PASS-2-EXECUTION-PLAN.md`, `memory/feedback_scope_qualified_verification.md` |
| 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 |
| ... | §2.8~§2.10 까지 1 모듈씩 | (대기) |
| 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 모듈씩 | (대기) |
| (last) | §2.11 pipeline.py / pipeline_context.py | (대기) |
| (then) | §3 Salvage Plan | (대기) |
| (then) | §4 우선순위 재정렬 → ROADMAP 갱신 | (대기) |