untracked files on main: dceb101 feat(#63): IMP-34 R1 donor capacity measured bound (u1+u2)

This commit is contained in:
kmlee1 committed 2026-05-21 22:07:41 +09:00
commit 8f085a28d3
3220 files changed
+985495

No files matched your search

+3
View File
@@ -0,0 +1,3 @@
{
"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=Line truncated
}