11 KiB
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_nameor 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
implementedandverifiedbefore any code change listed below lands.""Repo grep
html_to_slide_mdx | edited_html_to_mdx | reverse_pathMUST return at least one runtime hit in a non-test module undersrc/.""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.pyU1 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 receivesdocumented: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/**, ordocs/architecture/IMP-16-U2-WIRING-DESIGN.mdin 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 cellimplemented → documented:dormantrests 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.mdremains 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).