diff --git a/docs/architecture/PHASE-Q-AUDIT.md b/docs/architecture/PHASE-Q-AUDIT.md index d0cd1d8..d7db301 100644 --- a/docs/architecture/PHASE-Q-AUDIT.md +++ b/docs/architecture/PHASE-Q-AUDIT.md @@ -989,7 +989,112 @@ J5. (factual note — §1 매핑 누적) — §1 audit lens 의 A-3 / A-4 매핑 > ⚠ **본 §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* +### 2.10 `block_reference.py` / `block_selector.py` + +#### 역할 + +두 모듈 모두 *block catalog + selection logic* 영역이나 **시기와 사용처가 다름**: + +- **`block_reference.py`** (Phase T-3, 755 lines): "참고 블록 선택 + 디자인 레퍼런스 HTML 생성". Stage 1.7 호출. *블록을 "참고할 디자인"* 으로 제공 (Phase R' AI 의 reference path). 8 함수 + 1 상수 +- **`block_selector.py`** (Phase Q-2, 267 lines): "제약 기반 블록 선택 엔진". relation_type → 카테고리 + 컨테이너 제약 필터링. "AI 에게 불가능한 선택지를 주지 않는다" (Beautiful.ai 원칙). 5 함수 + 3 상수. **pipeline.py 에서 unused** (Phase T 가 block_reference 로 대체) 단 `format_candidates_for_prompt` 는 `kei_client.py` 에서 사용 + +핵심 함수 (block_reference): +- `_get_jinja_env`, `_load_catalog`, `_get_block_by_id`: utility (Jinja2 / catalog / block 검색) +- `_match_visual_type` (line 136): expression_hint 키워드 매칭 (deterministic pattern) +- `_match_by_tags` (line 152): tag 기반 매칭 (deterministic). **pipeline.py 도 직접 호출 (line 228 — Phase R' 전용 아님)** +- `select_reference_block` (line 237): Phase T-3 main reference block 선택 +- `generate_design_reference` (line 448): design reference HTML 생성 +- `select_and_generate_references` (line 522): pipeline Stage 1.7 entry +- `VISUAL_TYPE_KEYWORDS` (상수): 시각 유형별 매칭 keyword + +핵심 함수 (block_selector): +- `load_catalog`, `_get_block_by_id`: utility +- `select_block_candidates` (line 89): Phase Q-2 main filtering — relation_type / 컨테이너 제약 / catalog 검증 +- `select_fallback_candidates` (line 193): fallback +- `format_candidates_for_prompt` (line 236): Kei prompt formatter — `kei_client.py` 에서 사용 +- `RELATION_TO_CATEGORIES`, `SIDEBAR_FORBIDDEN_CATEGORIES`, `BLOCKS_FORCING_FORMAT_CHANGE` (상수): Phase Q schema 매핑 + +#### 관련 §7-B 항목 + +**§1 §2 audit list**: `block_reference.py` / `block_selector.py` (A-2) + +| §7-B | 직간접 | 영향 | +|---|---|---| +| **A-2** Catalog 확장 (frame_contracts + frame_partials) | (간접) | Phase Q `catalog.yaml` 로딩 / block 검색 패턴이 Phase Z catalog 확장 시 reference. 단 Phase Q catalog (block id + variant) vs Phase Z catalog (frame contract + frame partial) — schema 다름 | + +#### 현재 Phase Z 와 겹치는 영역 + +| Phase Q `block_reference` / `block_selector` | Phase Z (현재) | 비교 | +|---|---|---| +| `_load_catalog` / `load_catalog` (catalog.yaml 로드 + mtime 캐시) | `frame_contracts.yaml` 로드 (Phase Z 자체) | **catalog schema 다름** (block id vs frame contract). Phase Z 자체 wrapper | +| `_get_block_by_id` (block_reference + block_selector 양쪽 중복) | frame_id → frame_contract 검색 (Phase Z) | abstraction 다름 | +| `_match_visual_type` / `VISUAL_TYPE_KEYWORDS` (expression_hint matching) | (Phase Z normal path 미존재) | Phase T-3 schema 특화. Phase Z 의 V4 evidence 매칭 path 와 *대체 path* | +| `_match_by_tags` (tag 매칭) | (Phase Z normal path 미존재) | deterministic catalog utility. pipeline.py 도 직접 호출 — Phase R' 전용 아님 | +| `select_reference_block` / `generate_design_reference` / `select_and_generate_references` | (Phase Z 에서 명시 폐기 — Phase R' reference path) | Phase R' AI 의 reference 자료 제공 — §2.8 `render_slide_from_html` / §2.9 `html_generator` 와 같은 Phase R' archive 영역 | +| `select_block_candidates` / `select_fallback_candidates` (Phase Q-2 filtering) | Phase Z V4 매칭 (master) | **dual path 위험** (Phase Q content 분석 기반 schema vs Phase Z V4 evidence). pipeline.py 에서 unused — Phase Q-2 legacy | +| `format_candidates_for_prompt` (Kei prompt formatter) | (Phase Z normal path 미존재 — AI 격리) | Kei flow integration utility. `kei_client.py` 에서 사용 | + +#### 재사용 가능성 + +**block_reference.py**: + +| 자산 | 분류 | 근거 | +|---|---|---| +| `_get_jinja_env` | **Reference Only** | Jinja2 env utility | +| `_load_catalog` | **Reference Only** | catalog 로드 + mtime 캐시 utility. block_selector / §2.8 renderer 와 중복. Phase Z catalog schema 다름 | +| `_get_block_by_id` | **Reference Only** | catalog 검색 utility. block_selector 와 중복 | +| `_match_visual_type` | **Reference Only** | deterministic pattern matching utility. Phase T-3 schema 특화이나 함수 자체는 결정론적 | +| `_match_by_tags` | **Reference Only** | deterministic catalog/tag matching utility. **pipeline.py 도 직접 호출 (line 228) — Phase R' 전용 아님** | +| `select_reference_block` | **Archive Candidate** | **high-level Phase R' reference path entry** — AI 가 reference 로 사용. CLAUDE.md 명시 폐기 영역 | +| `generate_design_reference` | **Archive Candidate** | Phase R' reference HTML 생성 high-level entry | +| `select_and_generate_references` | **Archive Candidate** | pipeline Stage 1.7 main entry — Phase R' orchestration | +| `VISUAL_TYPE_KEYWORDS` (상수) | **Reference Only** | deterministic matching table | + +**block_selector.py**: + +| 자산 | 분류 | 근거 | +|---|---|---| +| `load_catalog` | **Reference Only** | catalog 로드 utility. block_reference / §2.8 renderer 와 중복 | +| `_get_block_by_id` | **Reference Only** | catalog 검색 utility. block_reference 와 중복 | +| `select_block_candidates` | **Reference Only** | Phase Q-2 main filtering — 결정론적 + AI 무관. pipeline.py 에서 unused. Phase Z V4 매칭과 dual path 위험 — 직접 통합 X | +| `select_fallback_candidates` | **Reference Only** | fallback filtering. 같은 이유 | +| `format_candidates_for_prompt` | **Archive Candidate** | Kei prompt formatter — `kei_client.py` 에서 사용. deterministic 단 *Kei flow integration utility* (output 이 Kei AI input) | +| `RELATION_TO_CATEGORIES` / `SIDEBAR_FORBIDDEN_CATEGORIES` / `BLOCKS_FORCING_FORMAT_CHANGE` (상수) | **Reference Only** | Phase Q schema 매핑 dict. Phase Z V4 evidence 와 abstraction 다름 | + +#### audit 판정 + +**Mixed (Reference Only heavy + 일부 high-level Phase R' / Kei prompt entries Archive)**. + +§2.10 의 두 모듈 (block_reference + block_selector) = *block catalog + selection logic* 영역. 대부분 *결정론적 utility / pattern matching helper / catalog schema 매핑* 으로 **Reference Only**. Archive 영역은 *high-level Phase R' reference path entries* (block_reference 의 3 자산: `select_reference_block`, `generate_design_reference`, `select_and_generate_references`) + *Kei prompt formatter* (block_selector 의 `format_candidates_for_prompt`). + +- §3 Salvage 적용 대상: **없음** (Salvage Candidate 0). Reference Only 자산은 Phase Z catalog 확장 / V4 매칭 보강 / Phase R' cleanup 등 별 axis 활성 시 *참고 여부만 별도 판단* +- 별도 surface: + - §1 audit lens 의 A-2 매핑은 *간접* (catalog 로딩 / block 검색 패턴 reference 정도) + - **block_reference 의 high-level entries = Phase R' archive 영역의 reference path** (§2.8 / §2.9 와 같은 Phase R' core 그룹) + - block_selector 는 **pipeline 에서 unused** (Phase Q-2 legacy) 단 `format_candidates_for_prompt` 는 `kei_client.py` 에서 used + - catalog 로드 + `_get_block_by_id` 중복 (block_reference + block_selector + §2.8 renderer 3 module) — cleanup 별 axis 후보 + +#### 후속 참고 사항 (본 audit 밖 surface) + +K1. (Archive marker — Phase R' 영역) — block_reference 의 high-level entries (`select_reference_block` / `generate_design_reference` / `select_and_generate_references`) = Phase R' AI reference path. §2.8 / §2.9 와 같은 Phase R' archive 영역의 *reference 제공 layer*. §3 검토 대상 외. + +K2. (Archive marker — Kei flow integration) — block_selector 의 `format_candidates_for_prompt` = Kei prompt formatter (`kei_client.py` 에서 used). Kei flow integration utility. §3 검토 대상 외. + +K3. (Reference Only — legacy unused / dual path) — block_selector 의 main filtering (`select_block_candidates` / `select_fallback_candidates`) 는 pipeline.py 에서 unused (Phase T 가 block_reference 로 대체). Phase Z V4 매칭과 *dual path 위험*. 직접 통합 X 단 *결정론적 filtering 패턴* reference 가능. + +K4. (Reference Only — deterministic utilities) — `_match_visual_type` / `_match_by_tags` / `VISUAL_TYPE_KEYWORDS` 등 deterministic pattern matching utilities. `_match_by_tags` 는 pipeline.py 에서 직접 호출 (line 228) — Phase R' 전용 아님. 별 axis 활성 시 reference. + +K5. (cleanup 별 axis 후보) — catalog 로드 + `_get_block_by_id` 중복 (block_reference / block_selector / §2.8 renderer 3 module). Phase R' cleanup 또는 Phase Z catalog 확장 axis 활성 시 *중복 제거 별도 판단*. + +K6. (factual note) — §1 audit lens 의 A-2 매핑 정확도: *간접* (catalog 로딩 / block 검색 패턴 reference 정도). §1 직접 정정은 별 axis (G2 + I6 + J5 누적 + K6). + +#### Salvage Plan 검토 대상 dual-write 기준 (§3 에서 재확정) + +- **Salvage Candidate**: 없음 +- **Reference Only** 자산 (utilities + matching helpers + Phase Q-2 filtering + 상수): §0-A 원칙 10 따라 활성 axis 결정 = *별 axis* (Phase Z catalog 확장 / Phase R' cleanup / V4 매칭 보강 등). 활성 시 그 axis 의 SoT 따라 adapter / dual-write 기준 별도 결정. 본 §2.10 audit 단계의 dual-write 기준 적용 X. +- **Archive Candidate** (Phase R' reference path entries + Kei prompt formatter): §3 검토 대상 외. + +> ⚠ **본 §2.10 audit 판정은 Phase Z normal path 기준의 후보 분류이며, `block_reference.py` / `block_selector.py` 는 §3 Salvage 적용 대상이 없다 (Salvage Candidate 0).** §0-A 의 10 원칙 + §0-0 의 분류 기준 + §0-B Audit 범위 lock + AI 격리 invariant 모두 따름. Reference Only 자산 (deterministic utility / matching helper / Phase Q-2 filtering / 상수) 은 별 axis 활성 시 *참고 여부만 별도 판단*. **block_reference 의 high-level entries (3 자산) = Phase R' archive 영역의 reference 제공 layer (§2.8 / §2.9 와 같은 Phase R' core 그룹). block_selector 의 `format_candidates_for_prompt` = Kei flow integration utility (Archive)**. ### 2.11 (마지막) `pipeline.py` / `pipeline_context.py` — *후속 turn* @@ -1072,7 +1177,8 @@ audit 결과 → 어느 항목이: | 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 | | 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 모듈씩 | (대기) | +| 2026-05-12 | §2.10 block_reference.py / block_selector.py audit | 완료 — Mixed (Reference Only heavy + 일부 high-level Phase R' / Kei prompt entries Archive). Salvage Candidate 0. block_reference utilities (`_get_jinja_env` / `_load_catalog` / `_get_block_by_id` / `_match_visual_type` / `_match_by_tags` / `VISUAL_TYPE_KEYWORDS`) + block_selector utilities + filtering (`load_catalog` / `_get_block_by_id` / `select_block_candidates` / `select_fallback_candidates` / 상수) = Reference Only. **block_reference high-level entries (`select_reference_block` / `generate_design_reference` / `select_and_generate_references`) = Phase R' reference path Archive (§2.8 / §2.9 와 같은 Phase R' core 그룹)**. block_selector `format_candidates_for_prompt` = Kei prompt formatter Archive (`kei_client.py` used). §3 적용 대상 없음. 별도 surface: §1 A-2 매핑 간접, K1 Phase R' reference path Archive marker, K2 Kei prompt formatter Archive marker, K3 block_selector legacy unused + dual path, K4 deterministic utilities reference axis, K5 catalog/_get_block_by_id 중복 cleanup axis, K6 §1 매핑 factual note | +| (last) | §2.11 pipeline.py / pipeline_context.py | (대기) | | (last) | §2.11 pipeline.py / pipeline_context.py | (대기) | | (then) | §3 Salvage Plan | (대기) | | (then) | §4 우선순위 재정렬 → ROADMAP 갱신 | (대기) |