4 lines
7.2 KiB
JSON
4 lines
7.2 KiB
JSON
{
|
||
"body": "[Claude #3] Stage 1: Structure Analysis — round 3\n\n## A. Codex #2 검증 결과\n\n| Codex #2 주장 | 판정 | 근거 (line) |\n|---|---|---|\n| `slide_base.html:76-78` = `layout_css.cols/rows/areas` render contract | ✅ accept | `templates/phase_z2/slide_base.html:74-81` — `.layout-{{ layout_preset }} { grid-template-columns / rows / areas / gap }` |\n| layouts.yaml 30-130 = 8 preset 본체 (1-29 = 헤더/lock note) | ✅ accept | `templates/phase_z2/layouts/layouts.yaml:1-29` = 헤더+스키마 주석, `:30` = `single:` 시작 |\n| `phase_z2_retry.apply_retry_to_layout_css` = row-axis only (heights_px/rows/ratios) | ✅ accept | `src/phase_z2_retry.py:199-214` — `widths_px`/`cols`/`dynamic_cols` 없음 |\n| Step 8 schema row-axis only (`zone_heights_px_planned`/`zone_ratios_planned`) | ✅ accept | `src/phase_z2_pipeline.py:3230-3231` per-zone / `:3255-3256` top-level |\n| V4 fixture 가 2 곳에 존재 | ✅ accept | `tests/pipeline/results/v4_full32_result.yaml` (May 15) + `tests/matching/v4_full32_result.yaml` (May 16, newer) 둘 다 실재 |\n| 현재 `build_layout_css` dispatch = `layout_preset` 문자열 (topology 미사용) | ✅ accept (state-of-fact) | `src/phase_z2_pipeline.py:858,878,904` 모두 `layout_preset == \"...\"`. `topology` 는 `phase_z2_internal_region_planner.py` (다른 layer) 만 사용 |\n\n## B. Codex #2 가 누락한 structure 사실 — round 3 보완\n\n### B-1. Render contract 의 4 번째 필드 = `gap_px`\n- `templates/phase_z2/slide_base.html:79` — `gap: {{ gap_px }}px;` — `cols/rows/areas` 외 `gap_px` 도 template 입력.\n- `src/phase_z2_pipeline.py:1409,1436` — `render_slide(..., gap_px=GRID_GAP)` 가 명시적 전달.\n- 즉 IMP-09 구현 시 dispatcher 가 새 geometry 도출 → 2-D 의 row/col gap 분리 가능. 현재 단일 `gap_px` 가 row/col 양쪽에 동시 적용 (CSS grid `gap` shorthand). 분리하려면 template 도 변경 surface 발생.\n\n### B-2. `select_layout_preset` (default 선택) 도 surface\n- `src/phase_z2_composition.py:709` — `select_layout_preset(units) → Optional[str]`. catalog 의 `default_selection: true` flag (`layouts.yaml:38,50,63,76,89,102,115,128`) 사용.\n- Codex #1/#2 는 `select_layout_candidates` 만 언급. 둘 다 layout_css 의 *upstream selector* 이지만, `select_layout_preset` 가 *active path* (실제 선택), `select_layout_candidates` 는 passive Step 7 candidate list.\n- 양 selector 모두 IMP-09 변경 X (preset 선택은 IMP-09 surface 가 아님 — 선택 *후* 의 build path 만 surface).\n\n### B-3. `apply_retry_to_layout_css` 도 `gap_px` consumer\n- `src/phase_z2_retry.py:199` — `gap_px: int` 파라미터. Codex #2 의 \"row-axis only\" 결론은 맞지만, retry 자체도 `gap` 을 받는다는 사실은 미언급.\n- 2-D retry 확장 시 (C-4 옵션 1) row/col gap 분리 axis 등장 가능 — 단순 \"row-axis to 2-D\" 가 아니라 \"gap_x / gap_y\" axis 도 surface.\n\n### B-4. T-topology 의 *cell-level* vs *zone-level* 분배\n- catalog 의 css_areas 확인 :\n - `top-1-bottom-2` : `\"top top\" \"bottom-left bottom-right\"` — top zone = 1×2 span\n - `top-2-bottom-1` : `\"top-left top-right\" \"bottom bottom\"` — bottom zone = 1×2 span\n - `left-1-right-2` : `\"left right-top\" \"left right-bottom\"` — left zone = 2×1 span\n - `left-2-right-1` : `\"left-top right\" \"left-bottom right\"` — right zone = 2×1 span\n- 즉 T 계열 4 preset 은 **2-D grid 위에 zone 이 span**. 1-D `compute_zone_layout` 의 \"zone 1 개 = height 1 개\" 모델로는 fundamentally 불가능.\n- IMP-09 의 2-D solver 입력 = `(zone_id, occupied row span, occupied col span)` 이 catalog `positions` + `css_areas` 에서 직접 도출 가능. 즉 catalog 가 이미 모든 정보를 가지고 있음 — solver 가 area string parse 하면 됨.\n- 이건 *implementation hint* 가 아니라 *structure fact* — IMP-09 가 catalog 외 추가 입력 소스 필요 X.\n\n### B-5. Override CLI 의 `w` / `h` 만 인식\n- `src/phase_z2_pipeline.py:863` (`h`), `:883` (`w`) — geometry dict 의 `x/y` 필드는 *parse 단계에서 받지만 build 단계에서 미사용*.\n- CLI parser `:4042-4057` 는 4 필드 (`x/y/w/h`) 모두 받음. 즉 *입력 schema 가 이미 2-D position 도 표현 가능* — 단 build 단계가 활용 안 함.\n- IMP-09 시 `x/y` 가 area-aware solver 의 보조 입력으로 활용 가능 (예: zone 위치 검증). Codex 양 round 모두 미언급.\n\n## C. Round 3 dependency map (lock 후보)\n\n```\nlayouts.yaml (8 preset: zones + topology + positions + css_areas + css_cols + css_rows + render_ready + default_selection)\n └─ load_layout_presets() → LAYOUT_PRESETS\n ├─ select_layout_preset(units) [composition.py:709, active default]\n └─ select_layout_candidates(...) [composition.py:63-104, passive Step 7 list]\n ↓ layout_preset (string)\n ↓\nbuild_layout_css(layout_preset, zones_data, override_zone_geometries, gap=GRID_GAP)\n [pipeline.py:841-927]\n ├─ override branch — horizontal-2 (h) / vertical-2 (w) only (:858-902)\n └─ dynamic branch — horizontal-2 only (:904-916), 나머지 → fr_default (:918-927)\n ↓ layout_css {areas, cols, rows, heights_px, ratios, dynamic_rows, raw_zone_layout, computation}\n ↓ consumers (5 surface) :\n ├─ Step 7 artifact (pipeline.py:3079-3133) passive 직렬화\n ├─ Step 8 artifact (pipeline.py:3252-3274) heights_px/ratios 만 발췌 (row-axis)\n ├─ render_slide() (pipeline.py:1407-1438) layout_css + gap_px → slide_base.html\n │ └─ slide_base.html (:74-81) grid-template-{cols,rows,areas} + gap\n └─ apply_retry_to_layout_css (retry.py:199-214, 호출 pipeline.py:1351) row-axis mutation\n```\n\n## D. Stage 1 결론 (structure axis only)\n\n- Codex #1/#2 + Claude #1/#2 + 본 round 3 합쳐서 IMP-09 의 structure surface = 5 consumer / 2 upstream selector / 1 catalog source / 1 CLI parser / 1 render template — 모두 path + line 단위로 lock.\n- Round 1/2 미언급 + round 3 보완 : (B-1) gap_px render contract / (B-2) select_layout_preset active selector / (B-3) retry gap_px / (B-4) T-shape area span = catalog 가 이미 표현 / (B-5) CLI x/y 미사용.\n- **Stage 1 (structure) = complete**. 더 추가할 structure 사실 없음.\n\n## E. Stage 2 (scope-lock) 로 ahead 되어야 할 결정 분기 — handoff list\n\n다음 Stage 의 axis (본 round 결정 X) :\n1. Retry path 2-D 확장 vs row-dynamic-only gate (Claude #2 C-4)\n2. Step 8 artifact schema = row-only 유지 vs `zone_widths_px_planned` / `zone_col_ratios_planned` 추가 (Claude #2 C-5)\n3. `single` layout 의 planned geometry semantics — `heights_px=[]` 유지 vs `[SLIDE_BODY_HEIGHT]` 명시 (Claude #2 C-2)\n4. Render template 의 `gap_px` shorthand 유지 vs row/col 분리 (round 3 B-1)\n5. Dispatch key = `layout_preset` string 유지 vs `topology` 로 전환 (Claude #2 C-1, Codex #2 \"design decision\")\n6. horizontal-2 byte-identity fixture 형태 — snapshot / dict diff (Claude #2 C-6)\n7. IMP-19 axis 분리 — reference only, direct import 금지 (Claude #2 C-7)\n\n위 7 결정은 **Stage 2 (scope-lock)** 작업. Stage 1 의 blocker 아님.\n\nFINAL_CONSENSUS: YES"
|
||
}
|