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

@@ -0,0 +1 @@
[{"id": 21894, "html_url": "https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/39#issuecomment-21894", "pull_request_url": "", "issue_url": "https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/39", "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 problem-review — IMP-30 first-render invariant + abort bypass\n\n=== ROOT_CAUSE ===\n\nTwo abort paths described in the issue are real. Issue line numbers are stale; verified actual locations:\n\n| issue ref | actual location | what it does |\n|---|---|---|\n| path (a) `if not units or layout_preset is None` @ `:1762~` | `src/phase_z2_pipeline.py:3156` | writes `error.json`, then `sys.exit(1)` |\n| path (b) `if status not in MVP1_ALLOWED_STATUSES` @ `:489` | `src/phase_z2_pipeline.py:657` (inside `_choose_match_from_judgments`) | per-rank candidate filter; cascades to `selection_path=\"chain_exhausted\"` → `lookup_v4_match()` returns `None` → composition planner emits no candidate for that section |\n\n**Cascade:** When every aligned section produces only `restructure`/`reject` V4 labels (or has no V4 entry at all), path (b) filters all rank-1/2/3 candidates inside `_choose_match_from_judgments`, the section ends up with no `CompositionUnit` in `collect_candidates`, `plan_composition` returns `units=[]` + `preset=None`, and path (a) hard-aborts before any artifact tree (`final.html`, `step20_slide_status.json`, candidate_evidence, …) is written.\n\n**Downstream blast radius:** IMP-29 (#38, shipped `b4872ba`) frontend zone-level evidence bridge has nothing to read because `data/runs/<run-id>/` never gets populated. IMP-31 (AI adaptation) cannot be triggered because it expects a first-render trace as input. The pipeline survivability invariant (\"first render always produced, even when degraded\") is violated.\n\n=== SCOPE_LOCK ===\n\n**IN scope (IMP-30):**\n\n1. **Composition layer placeholder synthesis** — `src/phase_z2_composition.py`:\n - For each aligned section uncovered by any auto-selectable `CompositionUnit` (no V4 match, all restructure/reject, or `chain_exhausted`), synthesize a **placeholder `CompositionUnit`** with:\n - `frame_template_id = \"__placeholder_needs_adaptation__\"` (sentinel — parallel to existing `__empty__` pattern at `:3536`)\n - `phase_z_status = \"placeholder_needs_adaptation\"` (informational only; **NOT** added to `MVP1_ALLOWED_STATUSES`)\n - `placeholder = True`, `adaptation_reason ∈ {no_v4_entry, restructure_only, reject_only, chain_exhausted}`\n - `raw_content = section.raw_content` (MDX byte-preserved, no rewrite)\n - `v4_candidates` populated from full-32 (including reject) so IMP-31 has seed evidence\n - placeholders DO NOT pass through `select_composition_units` filter (which gates on `auto_selectable + allowed_statuses`); they are union-appended at `plan_composition` exit to cover sections the auto pass missed.\n\n2. **Abort path (a) loosen** — `src/phase_z2_pipeline.py:3156`:\n - Trigger `sys.exit(1)` only when `len(sections) == 0` (truly empty MDX input).\n - When `len(sections) > 0` but auto units are 0, placeholders cover the gap; `layout_preset` is computed from `len(auto_units ∪ placeholder_units)`.\n\n3. **Renderer placeholder partial** — minimal partial under `templates/phase_z2/placeholders/needs_adaptation.html`:\n - emits a visible adaptation banner (\"needs user/AI adaptation\") + section title + MDX preview (truncated, full text in `<details>` if long).\n - zone-loop `:2059` short-circuit gains a sibling branch: `template_id == \"__placeholder_needs_adaptation__\"` → render the placeholder partial instead of the empty string.\n\n4. **Telemetry / artifacts**:\n - Step 6 `composition_plan` artifact: new `placeholder_units` list (one entry per placeholder, with `section_id`, `adaptation_reason`, `v4_candidates_count`).\n - Step 20 `slide_status`: new informational fields `placeholder_zone_count` + `placeholder_section_ids` + `adaptation_pending_count`. **Top-level `overall` enum unchanged** (PASS / RENDERED_WITH_VISUAL_REGRESSION / PARTIAL_COVERAGE / …).\n - `candidate_evidence` per-zone (IMP-05 L2 schema) for placeholder zones records `placeholder=True` + `adaptation_reason` + full V4 evidence (including reject candidates).\n\n5. **`full_mdx_coverage` semantics** — placeholder-covLine truncated