This commit is contained in:
commit
8f085a28d3
3220 files changed
+985495
No files matched your search
@@ -0,0 +1 @@
|
||||
[{"id": 18713, "html_url": "https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/9#issuecomment-18713", "pull_request_url": "", "issue_url": "https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/9", "user": {"id": 28, "login": "Kyeongmin", "login_name": "", "source_id": 0, "full_name": "이경민", "email": "kyeongmin@noreply.localhost", "avatar_url": "https://gitea.hmac.kr/avatars/d883a35f9197b080b2a0c535c3f9357dcd5c7d40b3c42bd8f40218cb94609a8e", "html_url": "https://gitea.hmac.kr/Kyeongmin", "language": "", "is_admin": false, "last_login": "0001-01-01T00:00:00Z", "created": "2025-12-30T10:51:04+09:00", "restricted": false, "active": false, "prohibit_login": false, "location": "", "website": "", "description": "", "visibility": "public", "followers_count": 0, "following_count": 0, "starred_repos_count": 1, "username": "Kyeongmin"}, "original_author": "", "original_author_id": 0, "body": "## [Claude #1] Stage 1: 문제 검토 Round #1 — scope-lock draft\n\nFresh against current HEAD = `201099e feat(IMP-09): PR 1`. Working tree clean\n(`git diff --stat HEAD` = 0 lines for `src/phase_z2_pipeline.py`). Exit reports = none;\nthis round re-derives scope from issue body + on-disk code + PR 1's RED fixtures only.\n\n## 1. Where the gap actually lives\n\n`src/phase_z2_pipeline.py::build_layout_css` dispatches by `LAYOUT_PRESETS[layout_preset][\"topology\"]`:\n\n- `topology == \"rows\"` (horizontal-2) → `_build_rows_dynamic` ⇒ dynamic row heights\n- `topology == \"cols\"` (vertical-2) → `_build_cols_dynamic` ⇒ dynamic col widths\n- all others (`single`, `T`, `inverted-T`, `side-T-left`, `side-T-right`, `2x2`) → `_build_fr_default`\n ⇒ static `1fr` tracks from catalog `css_rows` / `css_cols`, `dynamic_rows=false`, `dynamic_cols=false`,\n `computation=\"fr_default_from_preset\"` (line 1144‑1221).\n\nThe Step D-ext override branch (line 1148-1213) is even narrower: only `horizontal-2` and `vertical-2`\nhonor `override_zone_geometries`; every other preset goes through a stderr `[override-warning]` and\nsilently drops to the `1fr` static path. PR 1's own comments (line 1207-1219) explicitly mark this\nas \"PR 2 territory\".\n\nPR 1 already landed the universal R×C aggregator `_compute_per_zone_geometry` (line 956-1022) and\nlength-locked the `heights_px` (=R) / `widths_px` (=C) contract. So the only thing missing for the 5\npreset families is a **2-D track solver** that fills those arrays from `zones_data` signals (and from\nthe override dict) instead of from raw `1fr`.\n\n## 2. PR 1 has already written the target contract — 10 RED fixtures\n\n`tests/phase_z2/fixtures/build_layout_css/*.yaml` ships exact byte-for-byte snapshots for\n`top-1-bottom-2`, `top-2-bottom-1`, `left-1-right-2`, `left-2-right-1`, `grid-2x2` in both\n`*_default.yaml` and `*_override.yaml` form. `pytest -q tests/phase_z2/` confirms 10 failures, all on\n`test_build_layout_css_matches_fixture[<preset>_<mode>]`. The other 52 tests (horizontal-2,\nvertical-2, retry-gate, parse helpers) are green and stay green by construction.\n\nReverse-engineering the fixtures (verified by hand against `SLIDE_BODY_HEIGHT=585`,\n`SLIDE_BODY_WIDTH=1180`, `GRID_GAP=14`) gives a single coherent rule:\n\n**Default (no-override) — `computation = \"2d_dynamic_aggregated\"`, `dynamic_rows = dynamic_cols = true`:**\n1. Parse `css_areas` into the R×C cell grid.\n2. For each row track `r`, aggregate over the set of zones occupying any cell in that row:\n - `row_min_h[r] = max(zone.min_height_px)` across participating zones\n - `row_score[r] = max(zone.content_weight.score)` across participating zones\n (`max` is the rule that reproduces every fixture; `sum` or `mean` does not.)\n3. Feed those R aggregates into the existing `compute_zone_layout` algorithm\n (`min_height_first + content_weight_distribution`) to get `heights_px` of length R.\n4. Mirror for col tracks: `col_min_w` is absent in current contracts (col-axis has no `min_width_px`\n field — confirmed in `compute_zone_layout_cols` line 911-913), so col uses `col_score = max(zone.score)`\n only and goes through `compute_zone_layout_cols`-style weight-only allocation.\n5. Emit `cols` and `rows` as px strings (NOT fr) to match `cols: 583px 583px`, `rows: 314px 257px` etc.\n\n**Override — `computation = \"user_override_geometry\"`, `dynamic_rows = dynamic_cols = true`:**\n1. For each row track, pull ratio from any participating zone's `h` (e.g. `top-1-bottom-2`:\n row-1 = `top.h`, row-2 = `bottom-left.h` which must equal `bottom-right.h`).\n2. For each col track, same for `w`.\n3. Normalize ratios to sum=1, distribute `avail_h` / `avail_w` into px, absorb rounding diff into\n last track (same convention as `_parse_fr_string` line 901).\n\nBoth branches reuse PR 1's existing helpers (`_parse_css_areas`, weight-distribution math) — no new\nallocation algorithm, just an aggregation layer above the existing 1-D solvers.\n\n## 3. Assumptions verified\n\n- LAYOUT_PRESETS sourLine truncated
|
||||
Reference in new issue
Block a user