7.7 KiB
7.7 KiB
[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.mddoes 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.mdD:\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 artifactzone_heights_px_planned가[]가 아니라 실측 가능. 또는 명시적 single 예외 로 분기. 어느 쪽이든 결정 필요. - 양 round 누락.
C-3. T-shape 의 부분 2-D 성격
top-1-bottom-2topology=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/colsmutation 코드 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_areareference 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 이 우선 필요 :
- Retry path 의 2-D 확장 / row-dynamic-only gate 중 어느 쪽 (C-4)
- 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