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

This commit is contained in:
2026-05-21 22:07:41 +09:00
commit 8f085a28d3
3220 changed files with 985495 additions and 0 deletions
+98
View File
@@ -0,0 +1,98 @@
[Claude #2] Stage 1: Structure Analysis — round 2
## A. Codex #1 검증 결과
| Codex 주장 | 판정 | 근거 |
|---|---|---|
| `phase_z2_retry.apply_retry_to_layout_css` 가 layout_css consumer | ✅ accept | `src/phase_z2_pipeline.py:61` import / `:1351` 호출 / `src/phase_z2_retry.py:198-215` 가 `heights_px`/`rows`/`ratios`/`computation`/`dynamic_rows`/`raw_zone_layout` 6 field 모두 mutation. dependency map 추가 필요 — 내가 round 1 에서 누락. |
| `render_slide` 가 layout_css consumer | ✅ accept | `src/phase_z2_pipeline.py:1407-1438` — `layout_css` 를 그대로 jinja `slide_base.html` 에 주입. 내가 round 1 dependency 도식엔 명시 안 함. |
| `layouts.yaml` 실제 preset 행 = 30-130 (1-29 = 주석/스키마 노트) | ✅ accept | 30: `single:` 시작 / 1-29 = 헤더+lock note. minor precision. |
| `--override-zone-geometry` parser = 4042-4057 | ✅ accept | argument 정의 4003-4011 / parsing 4042-4057 둘 다 실재. round 1 에선 definition line 만 인용. |
| `space_allocator.build_containers_type_b` 추가 gate = 790 / 1068 / 1186 / 1256 | ✅ accept (확장) | round 1 은 530 한 곳만 인용. 다중 gate 존재 — Phase Z 와 격리 결론은 무변. |
## B. Codex 주장 1 건 — pushback
> "The status-board path is stale. `PHASE-Z-STATUS-BOARD.md` does not exist."
내 round 1 본문엔 그 path 가 들어가 있지 않음. 본문에서 쓴 표현은 `Step 8 = OVERVIEW + STATUS-BOARD 양쪽 일치` — shorthand. 실제 markdown link 도 없음. Codex 가 inferred mistake. 본 정정은 **새 issue body 가 stale 인 게 아니라 round 1 shorthand 가 모호** 였던 것 — 받아들이지만 stale-ref 가 아닌 *naming precision* 카테고리로 분류.
정확한 paths (lock) :
- `D:\ad-hoc\kei\design_agent\docs\architecture\PHASE-Z-PIPELINE-OVERVIEW.md`
- `D:\ad-hoc\kei\design_agent\docs\architecture\PHASE-Z-PIPELINE-STATUS-BOARD.md` (line 47 = Step 8 row, ⚠ partial)
## C. 양 round 가 다 누락한 structure 사실 (round 2 보완)
### C-1. `topology` 필드 = 자연스러운 dispatch key (재확인)
- `templates/phase_z2/layouts/layouts.yaml` 의 8 preset 은 `topology` 를 이미 선언함 :
- `single` / `rows` / `cols` / `T` / `inverted-T` / `side-T-left` / `side-T-right` / `2x2`
- 즉 IMP-09 implementation 의 dispatch 는 `layout_preset` 문자열 대신 `topology` 사용해야 추가 preset (e.g. `top-3-bottom-1`) 시 자동 적용. round 1/2 둘 다 *언급은 했으나 contract 로 lock 안 함*.
### C-2. `single` layout 의 edge case
- `single` 은 zones=1 / `css_rows: 1fr` / 현재 default branch (line 918-927) 떨어짐 → `heights_px: []`.
- 2-D solver 도입 시 `single` 은 의미상 `heights_px = [SLIDE_BODY_HEIGHT - gap*0]` 로 일관 채워야 Step 8 artifact `zone_heights_px_planned` 가 `[]` 가 아니라 실측 가능. 또는 *명시적 single 예외* 로 분기. 어느 쪽이든 결정 필요.
- 양 round 누락.
### C-3. T-shape 의 *부분 2-D* 성격
- `top-1-bottom-2` topology=T : top zone 이 **두 컬럼 span**. css_areas = `"top top" "bottom-left bottom-right"`.
- 즉 row 비율 (top vs bottom) + bottom row 내 col 비율 (bottom-left vs bottom-right) **두 축**. 단순 row solver 도 단순 col solver 도 아님.
- `side-T-left` / `side-T-right` : 반대 — col 분할 + 한쪽 col 내부 row 분할.
- 따라서 2-D solver 가 grid-2x2 하나 + T 계열 4개 (T/inv-T/side-T-L/side-T-R) 처리 시 *area-aware* contract 필요. solver 의 입력 = `(zone position, occupied rows, occupied cols)` 트리플. catalog 가 cssareas 로 이미 표현됨 → parser 가 area string → cell map 변환하면 자동.
- round 1 의 "topology-aware 2-D solver" 표현은 정확하지만 *area-spanning 차원* 을 명시 안 함.
### C-4. Retry path 의 2-D 결정 — open
- `apply_retry_to_layout_css` (`src/phase_z2_retry.py:198-215`) 는 **rows-only**. `widths_px` / `cols` mutation 코드 X / `dynamic_rows: True` 만 set.
- IMP-09 implementation 시 결정 분기 두 가지 :
- (옵션 1) retry path 도 2-D 확장 → A3 lock 의 retry budget=1 / sibling donor 규칙을 col-axis 에도 적용. 새 axis.
- (옵션 2) retry path 를 **명시적으로 row-dynamic 만 gate** → `dynamic_rows: True AND not dynamic_cols` 조건 추가. 2-D 는 retry 불가 로 declared.
- 양 round 다 "retry 와 호환 유지" 까지만 언급, **결정 분기** 는 lock 안 함. Stage 1 = opinion only 이므로 *둘 중 한 lock 필요* 만 surface.
### C-5. Step 8 artifact schema 확장 surface
- 현재 (`:3252-3274`) `zone_heights_px_planned` + `zone_ratios_planned` 두 row-axis 필드.
- 2-D layout 에서 trace 설명 가능 = guardrail. 따라서 :
- `zone_widths_px_planned` (col-axis)
- `zone_col_ratios_planned`
- per_zone_plan[i] 의 `zone_height_px_planned` / `zone_ratio_planned` 도 2-D 확장 필요 (width / col_ratio).
- `select_region_layout_candidates` / `select_display_strategy_candidates` (3211/3221) 는 region-level — IMP-09 surface 외, 무변.
- Codex 가 consumer 로 언급한 retry path / render_slide / Step 7 artifact 와 별개로 **Step 8 schema 자체가 변경 대상**.
### C-6. MDX 03 회귀 lock — 구체 fixture
- `tests/matching/v4_full32_result.yaml` 은 V4 결과. layout_css 단위 회귀 골든 fixture 는 별도 필요.
- IMP-09 가 horizontal-2 path 의 출력 byte-identity 를 보장하려면 :
- `horizontal-2 + override 없음` → 기존 `compute_zone_layout` 호출 그대로
- `horizontal-2 + override 있음` → 기존 ratio override 그대로
- 둘 다 *snapshot fixture* 로 가두기.
- round 1 은 "MDX 03 회귀" 를 surface 했지만 fixture 형태는 lock 안 함.
### C-7. IMP-19 soft link — axis 분리 confirm
- `docs/architecture/PHASE-Z-IMPLEMENTATION-ISSUE-BACKLOG.md:70` 확인 — IMP-19 는 `renderer._group_blocks_by_area` *reference only*, "직접 통합 X". 즉 IMP-09 가 ratio 분배 알고리즘을 *원천적으로* 새로 짤 때 IMP-19 의 reference 패턴을 *읽을 수는 있어도 import 불가*. 양 round 합의 X — 본 round 에서 lock.
## D. Round 2 dependency map (보완)
```
layouts.yaml (preset + topology + css_areas)
└─ load_layout_presets() / LAYOUT_PRESETS
├─ select_layout_preset() [default 선택]
├─ select_layout_candidates() [Step 7 passive]
└─ build_layout_css(preset, zones_data, override_zone_geometries)
├─ override branch (현재 horizontal-2 h, vertical-2 w 만)
└─ dynamic branch (현재 horizontal-2 만)
↓
layout_css {areas, cols, rows, heights_px, ratios, dynamic_rows, raw_zone_layout, computation}
↓ consumers (4 surface)
├─ Step 7 artifact (phase_z2_pipeline.py:3079-3133) — layout_css 그대로 직렬화
├─ Step 8 artifact (:3252-3274) — heights_px / ratios 발췌 (row-axis only)
├─ render_slide (:1407-1438) — slide_base.html 에 layout_css 그대로 주입
└─ apply_retry_to_layout_css (retry path:1351) — heights_px / rows / ratios 만 mutation
```
## E. Round 2 결론 (opinion only — execute 아님)
- Codex #1 의 retry-path / catalog-range / consumer-surface 보완 = 받아들임.
- Codex #1 의 "stale path" 정정은 *path stale* 이 아니라 round 1 shorthand 모호 — naming precision 으로 분류.
- 양 round 가 lock 안 한 structure 결정 분기 5 개 surface (C-1 ~ C-7).
- Stage 1 (structure) 가 ready-for-implementation 되기 전에 **2 가지 결정 lock** 이 우선 필요 :
1. Retry path 의 2-D 확장 / row-dynamic-only gate 중 어느 쪽 (C-4)
2. Step 8 artifact schema 확장 범위 (C-5)
- 외 5 개 (C-1 topology dispatch / C-2 single edge / C-3 T-shape area-spanning / C-6 fixture 형태 / C-7 IMP-19 import 불가) 도 implementation 전에 합의 필요.
FINAL_CONSENSUS: NO