This commit is contained in:
@@ -0,0 +1,128 @@
|
||||
# u4 — imp16_u2_deferred_items_resolution (evidence-only, RULE-6, not staged for commit)
|
||||
|
||||
**Stage**: Stage 3 / Round #4 — Issue #56 (INTEGRATION-AUDIT-02)
|
||||
**Unit**: u4 `imp16_u2_deferred_items_resolution`
|
||||
**Mode**: audit-only (P4/P4a). No `src/**`, `templates/**`, `tests/**`, or `IMP-16-U2-WIRING-DESIGN.md` edits.
|
||||
**Date**: 2026-05-20
|
||||
**Inputs (evidence chain)**: u1 scope-lock + u2 close-trio (c.17970 / c.19226 / c.19240) + u3 live grep (BE hits=1 docstring; FE hits=0).
|
||||
|
||||
---
|
||||
|
||||
## 1. Source of the deferred items (verbatim)
|
||||
|
||||
From `docs/architecture/IMP-16-U2-WIRING-DESIGN.md` lines 69–73 (read-only; this doc is FORBIDDEN to edit in this audit per u1):
|
||||
|
||||
> **## Open items deferred until IMP-07 lands**
|
||||
>
|
||||
> - Exact module path of the IMP-07 reverse-path adapter (TBD by IMP-07).
|
||||
> - Whether Step 2's preservation cross-check needs a per-section variant or only a whole-MDX variant — depends on whether IMP-07 emits a single re-entry MDX or per-section MDX fragments.
|
||||
> - Whether Step 14's invented-text telemetry should be emitted per `area_name` or only once globally — depends on whether IMP-07's reverse-path produces area-tagged HTML.
|
||||
|
||||
The doc also states at line 75:
|
||||
> "These are NOT resolved here. They are resolved at IMP-07 land time, in a follow-up update to this doc."
|
||||
|
||||
---
|
||||
|
||||
## 2. Governing gate (doc lines 12–16, verbatim relevant clauses)
|
||||
|
||||
> "IMP-07 status MUST be `implemented` and `verified` before any code change listed below lands."
|
||||
>
|
||||
> "Repo grep `html_to_slide_mdx | edited_html_to_mdx | reverse_path` MUST return at least one runtime hit in a non-test module under `src/`."
|
||||
>
|
||||
> "The reverse-path entry point MUST emit (a) a normalized re-entry MDX string and (b) the upstream generated HTML string, both as deterministic outputs accessible to Step 2 and Step 14 callers."
|
||||
|
||||
**Gate evaluation against u2 + u3 evidence**:
|
||||
|
||||
| gate clause | required state | observed (u2 / u3) | gate status |
|
||||
|---|---|---|---|
|
||||
| `IMP-07 implemented + verified` | runtime adapter in `src/`, verified | Gitea #7 closed as policy / no-runtime decision (c.17970 / c.19226 §5 / c.19240 closing line) | **NOT CLEARED** |
|
||||
| repo grep returns runtime hit in non-test `src/` module | ≥1 non-docstring runtime hit | u3 hits=1, **docstring only** inside `extract_text_from_html()` at `src/phase_z2_verification_utils.py:68` (no I/O, no LLM, no network) | **NOT CLEARED** |
|
||||
| reverse-path entry emits (a) re-entry MDX + (b) upstream HTML | callable entry point | c.19226 §3 enumerates absence: no SlideCanvas outerHTML capture, no backend POST, no `/api/edit \| /api/html_to_mdx \| /api/save`, no glubeot `html_to_slide_mdx` in repo; u3 FE grep hits=0 | **NOT CLEARED** |
|
||||
|
||||
→ All three gate clauses are NOT CLEARED. The Open-items prerequisite ("until IMP-07 lands") is therefore unmet.
|
||||
|
||||
---
|
||||
|
||||
## 3. Per-item resolution (a / b / c)
|
||||
|
||||
Each item is classified using the resolution policy from the issue body's Q3:
|
||||
- "If Q1 confirms IMP-07 reverse-path is implemented → resolve item with evidence from live code."
|
||||
- "If Q1 confirms no-runtime / dormant → reclassify item as dormant pending reverse-path reactivation."
|
||||
|
||||
Q1 verdict (u3): **closed-as-no-runtime** (no backend adapter, no FE trigger). → All three items take the second branch.
|
||||
|
||||
### Item (a) — Exact module path of the IMP-07 reverse-path adapter
|
||||
|
||||
| field | value |
|
||||
|---|---|
|
||||
| Classification | **DORMANT** |
|
||||
| Reason | No reverse-path adapter exists in `src/`. u3 axis-BE grep over pattern P (`html_to_slide_mdx\|edited_html_to_mdx\|reverse_path\|reverse-path\|reversePath\|html-to-mdx`) returned exactly 1 hit at `src/phase_z2_verification_utils.py:68`, and the hit is inside the `extract_text_from_html()` docstring (function body has no I/O, no LLM, no network — a deterministic, pure text extractor). There is therefore no module path to record. |
|
||||
| Evidence | u3 grep result (`src/phase_z2_verification_utils.py:68`, docstring-only); c.19226 §3 enumeration of absent surfaces (`SlideCanvas.tsx` outerHTML, backend `/api/edit \| /api/html_to_mdx \| /api/save`, glubeot `html_to_slide_mdx`) |
|
||||
| Resolution form | The TBD slot stays TBD until IMP-07 policy is reopened with a runtime decision. The item is **not** answered with a placeholder path. |
|
||||
| Doc-sync note | A doc-sync follow-up (recommended in u6 Section 6 / NOT posted) may add a cross-reference banner in `IMP-16-U2-WIRING-DESIGN.md` linking to `INTEGRATION-AUDIT-02-REPORT.md`. Per u1, **this audit must not edit that doc directly.** |
|
||||
|
||||
### Item (b) — Step 2 preservation cross-check: per-section variant vs whole-MDX variant
|
||||
|
||||
| field | value |
|
||||
|---|---|
|
||||
| Classification | **DORMANT** |
|
||||
| Reason | The deferred item's resolution is conditioned on "whether IMP-07 emits a single re-entry MDX or per-section MDX fragments" (doc line 72). Per u2 close-trio + u3 grep, IMP-07 emits **neither** — the gate-clause "reverse-path entry point MUST emit (a) a normalized re-entry MDX string" is NOT CLEARED. With no emitter, the per-section vs whole-MDX choice is not just unanswered, it is **unanswerable from runtime evidence**. |
|
||||
| Evidence | u3 axis-BE grep (docstring-only); c.19226 §3 ("`html_to_slide_mdx` 구현은 현재 repo에 직접 존재하지 않아 포팅 또는 신규 구현이 필요했다"); c.19226 §5 ("코드 변경 없이 close … '구현 완료'가 아니라 '기능 불필요 / 현 정책상 reverse path 미진행'"); IMP-16-U2-WIRING-DESIGN.md line 29 (Step 2 surface = `verify_text_preservation(reentry_mdx, upstream_generated_html, area_name="reentry_mdx_vs_upstream_html")` — call site requires the absent emitter) |
|
||||
| Resolution form | The wiring-design's Step 2 contract (doc §"Step 2 — MDX normalize") remains a paper contract. It does NOT bind any current runtime path because the reverse-path adapter has no `reentry_mdx` to feed it. Reactivation would require IMP-07 policy reopen *and* a downstream decision by that future issue. |
|
||||
| Doc-sync note | Same banner candidate as item (a). |
|
||||
|
||||
### Item (c) — Step 14 invented-text telemetry: per `area_name` vs global
|
||||
|
||||
| field | value |
|
||||
|---|---|
|
||||
| Classification | **DORMANT** |
|
||||
| Reason | The deferred item is conditioned on "whether IMP-07's reverse-path produces area-tagged HTML" (doc line 73). u3 axis-FE grep over `Front/client/src/` returned **0 hits** for pattern P across a populated tree (App.tsx, components/, contexts/, data/, hooks/, lib/, pages/, services/, types/, utils/) — i.e. no SlideCanvas outerHTML payload-path, no `fetch`/`axios` to a reverse-path endpoint, no area-tagging code. With no HTML producer in the reverse direction, the per-`area_name` vs global question has no runtime substrate. |
|
||||
| Evidence | u3 axis-FE grep (hits=0); c.19226 §3 ("`SlideCanvas.tsx`는 iframe 내부 DOM을 contenteditable로 편집하게 하지만, outerHTML capture나 backend POST는 구현되어 있지 않았다"); IMP-16-U2-WIRING-DESIGN.md lines 35–37 (Step 14 surface = `detect_invented_text(reentry_mdx, final_html)` — both arguments require the absent adapter); c.19240 closing line ("이 이슈는 코드 변경 없이 정책 판단으로 close했다") |
|
||||
| Resolution form | Step 14 telemetry contract is paper-only. The current `run_overflow_check` Step 14 path is unchanged by IMP-16-U2 because no reverse-path re-entry exists to set the gating `debug.json["pipeline"]["reverse_path_reentry"] = True` (doc line 42 makes this the schema gate for the other three keys). |
|
||||
| Doc-sync note | Same banner candidate as item (a). |
|
||||
|
||||
---
|
||||
|
||||
## 4. Cross-axis consistency check
|
||||
|
||||
| axis | Stage-1 / Stage-2 expectation | u4 verdict | consistent? |
|
||||
|---|---|---|---|
|
||||
| Stage 1 root_cause "IMP-16-U2 (L67) carries deferred items gated on IMP-07 activation — gate semantics become inconsistent under the no-runtime decision" | 3 items → DORMANT (not resolved, not closed) | (a) DORMANT, (b) DORMANT, (c) DORMANT | ✅ |
|
||||
| Stage 2 u4 test (a) "adapter module path -> DORMANT (cites u3 + c.19226)" | DORMANT with u3 + c.19226 citation | matches §3 item (a) | ✅ |
|
||||
| Stage 2 u4 test (b) "Step2 preservation per-section vs whole-MDX -> DORMANT (gate closed)" | DORMANT with gate-closed reason | matches §3 item (b) (gate-clause "reverse-path entry point MUST emit (a) a normalized re-entry MDX string" is NOT CLEARED) | ✅ |
|
||||
| Stage 2 u4 test (c) "Step14 invented-text telemetry per area_name vs global -> DORMANT (same)" | DORMANT with gate-closed reason | matches §3 item (c) (no FE producer → no area-tagged HTML → no substrate) | ✅ |
|
||||
| Stage 2 u5 dependency: "L67 IMP-16: implemented -> documented:dormant (blocked-by IMP-07)" | u4 must support DORMANT framing | §3 confirms all three items DORMANT, all blocked-by IMP-07 gate | ✅ feeds u5 |
|
||||
| Stage 2 u6 Section 4 (IMP-16-U2 deferred items resolution) | u4 supplies inputs | §3 three-item table directly feeds u6 §4 | ✅ feeds u6 |
|
||||
| Q4 follow-up recommendation policy | doc-sync candidate to add cross-ref banner in `IMP-16-U2-WIRING-DESIGN.md` | flagged per-item; will surface as **one** doc-sync follow-up in u6 Section 6 (banner, NOT posted) | ✅ feeds u6 |
|
||||
|
||||
Zero contradicting evidence. Resolution is unanimous DORMANT across the three deferred items.
|
||||
|
||||
---
|
||||
|
||||
## 5. Why "DORMANT" and not "documented:no-runtime" for IMP-16 (axis disambiguation)
|
||||
|
||||
- IMP-07 (L51) is the **policy axis** — it was actively declined and emits no runtime surface. Correct correction = `documented:no-runtime` (u5 will draft).
|
||||
- IMP-16 (L67) is the **dependent axis** — IMP-16 itself is technically *available* as a wiring-design contract (`src/phase_z2_verification_utils.py` U1 surface lands the algorithm), but the wiring it would land is **gated by IMP-07** (doc lines 12–16). Because the gate is closed, IMP-16's three deferred items remain in an inert, blocked-by-policy state. Correct correction = `documented:dormant`.
|
||||
- This distinction is preserved in u5's per-line diff: L51 receives `documented:no-runtime`; L67 receives `documented:dormant`. The audit does not collapse them to a single label, because the upstream cause (policy decline) and the downstream effect (wiring gated) are different axes.
|
||||
|
||||
---
|
||||
|
||||
## 6. Scope-lock compliance (per u1 draft)
|
||||
|
||||
- ✅ No edits to `src/**`, `templates/**`, `tests/**`, or `docs/architecture/IMP-16-U2-WIRING-DESIGN.md` in this round.
|
||||
- ✅ Only file written by u4: `.orchestrator/drafts/56_imp16_deferred.md` (evidence-only, RULE 6, untracked, not staged for commit).
|
||||
- ✅ No live Gitea API call; u4 chain-cites u2 (binding-artifact close-trio) + u3 (live grep).
|
||||
- ✅ Pattern P (used in §2 and §3) matches Stage 2 verbatim — no expansion, no shrinkage.
|
||||
- ✅ Scope-qualified verification (per RULE 4): every claim names its axis (item a/b/c, source doc line, evidence comment ID, grep hit count).
|
||||
- ✅ Per-item resolution form respects "audit does NOT modify production code or wiring-design doc" — the per-item table records *classification + reason + evidence*, not a textual change to the doc.
|
||||
|
||||
---
|
||||
|
||||
## 7. Downstream contracts
|
||||
|
||||
u4 evidence feeds:
|
||||
- **u5** `backlog_status_correction_proposal` — L67 IMP-16 cell `implemented → documented:dormant` rests on §3 + §5 (axis disambiguation).
|
||||
- **u6** REPORT.md §4 (IMP-16-U2 deferred items resolution) consumes §3's three-item table verbatim; §6 (Follow-up issue recommendations) consumes §3 doc-sync notes (one doc-sync follow-up draft, NOT posted) and §5 axis-disambiguation reasoning.
|
||||
- **u7** edits are scoped to BACKLOG.md L51 + L67 only — `IMP-16-U2-WIRING-DESIGN.md` remains UNTOUCHED in this audit (any banner is a separate doc-sync follow-up issue).
|
||||
|
||||
No new follow-up candidates beyond the one doc-sync banner surfaced from u4. The Q3 axis is fully resolved as DORMANT across (a), (b), (c).
|
||||
Reference in New Issue
Block a user