2 lines
7.7 KiB
JSON
2 lines
7.7 KiB
JSON
{"id":18972,"html_url":"https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/12#issuecomment-18972","pull_request_url":"","issue_url":"https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/12","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 #5] Stage 3 code-edit Round #3 — unit u3\n\n### unit_executed\n- **id**: u3\n- **summary**: Rewire `NEXT_ACTION_BY_FAILURE` — `donor_slack_insufficient`/`no_donor_candidates` → `cross_zone_redistribute`; add `cross_zone_redistribute_insufficient` → `glue_compression` → `font_step_compression` → `layout_adjust` chain; preserve `rerender_still_fails` → `frame_reselect`. Update `NEXT_ACTION_RATIONALE` accordingly.\n\n### files_changed\n- `src/phase_z2_failure_router.py` (u3-only delta = +43 insertions, +19 deletions, net +24 lines — within u3 estimate ≤25 lines)\n - Diff to HEAD reports +90/-19; u2 already contributed +47/-0 in this file, so u3-only = +43/-19.\n\n### diff_summary\n1. **`NEXT_ACTION_BY_FAILURE` rewired (7 rows)** — `donor_slack_insufficient`/`no_donor_candidates` now route to `cross_zone_redistribute` (was `layout_adjust`); 3 new salvage failure types added; `rerender_still_fails`/`not_attempted` rows unchanged.\n2. **3 new entries in `NEXT_ACTION_RATIONALE`** — explain salvage cascade transitions (slack → redistribute → glue envelope → font step → layout_adjust → frame_reselect → popup). 2 existing rationales (`donor_slack_insufficient`, `no_donor_candidates`) rewritten to point at `cross_zone_redistribute` instead of `layout_adjust`.\n3. **Module docstring lock table updated** — new lock date `2026-05-17, IMP-12 u3 cascade` and 7-row mapping table; escalation hierarchy block replaced with 6-stage cascade (`cross_zone_redistribute → glue_compression → font_step_compression → layout_adjust → frame_reselect → details_popup_escalation`).\n4. **`mapping_source` string updated** in `route_retry_failure` return shape (`A4 NEXT_ACTION_BY_FAILURE (사용자 잠금 2026-05-17, IMP-12 u3 cascade)`).\n5. **`NEXT_ACTION_IMPLEMENTATION_STATUS` UNCHANGED** — 3 new cascade actions intentionally absent from this table; `route_retry_failure` returns `'unknown'` for them today. u7 will register them as `IMPLEMENTED` once u4/u5/u6 land.\n6. **`SALVAGE_FAILURE_TYPE_BY_ACTION` UNCHANGED** — u2 surface preserved.\n7. **classifier body UNCHANGED** — u2's case 0.5 / 0.7 branches untouched; this unit is *routing only*.\n\n### evidence\n- `python -m pytest -q tests/phase_z2` → **62 passed in 0.13s** (regression-free; u14 will add cascade-router test fixtures).\n- `git diff --numstat src/phase_z2_failure_router.py` → `90\t19\tsrc/phase_z2_failure_router.py`. u2 baseline (`+47/-0`) subtracted → u3-only = `+43/-19`, net +24 ≤25.\n- Direct probes (7 routing rows, 5 end-to-end enrichment paths) — all pass:\n - `route_retry_failure('donor_slack_insufficient')` → `cross_zone_redistribute` (impl_status=unknown, u7 will flip to IMPLEMENTED)\n - `route_retry_failure('no_donor_candidates')` → `cross_zone_redistribute`\n - `route_retry_failure('cross_zone_redistribute_insufficient')` → `glue_compression`\n - `route_retry_failure('glue_absorption_insufficient')` → `font_step_compression`\n - `route_retry_failure('font_step_insufficient')` → `layout_adjust` (impl_status=MISSING, preserved)\n - `route_retry_failure('rerender_still_fails')` → `frame_reselect` (preserved)\n - `route_retry_failure('not_attempted')` → `none` (preserved)\n - End-to-end `enrich_retry_trace_with_failure_classification` on (a) donor_slack reason text → routes to `cross_zone_redistribute`; (b) salvage_steps[-1]=cross_zone fail → routes to `glue_compression`; (c) salvage_steps[-1]=glue fail → routes to `font_step_compression`; (d) salvage_steps[-1]=font_step fail → routes to `layout_adjust`; (e) rerender_attempted+plan.feasible → `frame_reselect` preserved.\n- Scope: 1 file modified (matches u3 `files: [src/phase_z2_failure_router.py]`); no other source file touched.\n\n### scope_lock_compliance\n- ✅ deterministic only (router is pure table lookup, no AI call) — `feedback_ai_isolation_contract`\n- ✅ no `ACTION_BY_CATEGORY` change (Stage 1 lock) — only `NEXT_ACTION_BY_FAILURE` table rewired; u7 owns `ACTION_IMPLEMENTATION_STATUS`/`NEXT_ACTION_IMPLEMENTATION_STATUS` registration\n- ✅ no global spacing shrink — cascade explicitly routes to `cross_zone_redistribute` first (role-height redistribution) before `glue_compression` (frame-scoped envelope), never `:root`/`body`/`.slide` — `feedback_phase_z_spacing_direction`\n- ✅ no `density_adjust_candidate`-style label (`PHASE-Z-PIPELINE-OVERVIEW.md:333` lock)\n- ✅ retry_budget=1 unchanged (router doesn't touch orchestrator)\n- ✅ files ≤3 and estimate_lines ≤25 — actual: 1 file, net +24 lines\n- ✅ `frame_reselect` / `layout_adjust` MISSING status preserved (out-of-scope per Stage 2)\n- ✅ classifier surface (u2) preserved — `SALVAGE_FAILURE_TYPE_BY_ACTION` + case 0.5/0.7 branches untouched\n- ✅ existing 4 routes (`donor_slack_insufficient`, `no_donor_candidates`, `rerender_still_fails`, `not_attempted`) remain in table (no row deletion)\n\n### remaining_units\n- u4 — `plan_cross_zone_redistribute` + scoped role-height CSS (wraps `fit_verifier.redistribute`)\n- u5 — `plan_glue_compression` + frame-scoped `[data-zone-position]` CSS (wraps `compute_glue_css_overrides`)\n- u6 — `plan_font_step_compression` + zone-scoped font-size CSS (wraps `find_fitting_font_size`)\n- u7 — Register IMPLEMENTED status in `ACTION_IMPLEMENTATION_STATUS` + `NEXT_ACTION_IMPLEMENTATION_STATUS` for 3 new salvage actions\n- u8 — `_attempt_salvage_chain` orchestrator in `phase_z2_pipeline.py` (plan→apply→rerender→visual_check per action)\n- u9 — pipeline wiring after `_attempt_zone_ratio_retry`; Step 17 telemetry (`salvage_steps`, `salvage_passed`)\n- u10 — Tests for multi-donor `plan_zone_ratio_retry`\n- u11 — Tests for `plan_cross_zone_redistribute`\n- u12 — Tests for `plan_glue_compression` (assert scoped CSS, no global rule)\n- u13 — Tests for `plan_font_step_compression`\n- u14 — Tests for failure_router cascade (this unit's behavior + impl_status assertions)\n- u15 — End-to-end test of `_attempt_salvage_chain` (3 fixtures: zone_ratio+cross_zone pass, cross_zone fail+glue pass, all 3 fail → (b)-revert)\n\n### follow_up_issue_candidates\n- None new. u3 is pure routing wiring; no out-of-scope axis surfaced. The `unknown` impl_status returned for the 3 new cascade actions is *intentional* and will be resolved by u7 (registration) after u4/u5/u6 (implementation). This is not scope creep — it is the Stage 2 plan execution order.\n\n### post_u3_state_for_codex\n- `NEXT_ACTION_BY_FAILURE` now has 7 rows (was 4).\n- `NEXT_ACTION_RATIONALE` now has 7 rows (was 4).\n- `NEXT_ACTION_IMPLEMENTATION_STATUS` UNCHANGED at 3 rows (u7 will extend).\n- `SALVAGE_FAILURE_TYPE_BY_ACTION` UNCHANGED at 3 rows (u2 surface preserved).\n- classifier `classify_retry_failure` UNCHANGED (u2 cases 0.5/0.7 intact).\n- 62/62 phase_z2 pytest pass; no behavioral regression on existing 4 routes.","assets":[],"created_at":"2026-05-17T23:13:00+09:00","updated_at":"2026-05-17T23:13:00+09:00"}
|