docs(t24): GATE D parity audit recorded — PARTIAL, with the gaps reframed as shared

explore-7 verified by reading code. Headline: the earlier 'unreachable
machinery' diagnosis is confirmed WRONG — both consumers converge on
ConstructionInterface.submit_need -> construction_decision.

17 items SAME_CANONICAL_PATH. 4 SAME_CANONICAL_STATE_DIFFERENT_ADAPTER.
11 MISSING_ADAPTER, of which 21/22/23/25 (invalidation, retest obligations,
post-change obligations, Behaviour Ledger writers) are ONE composed family
whose natural activation point is contract close — the seam GATE B opened.
That family has ZERO runtime callers in EITHER consumer.

GATE E: Build Basis = NO_EXECUTOR. research_route honestly reports
RECORDED_NOT_EXECUTED; build_basis.py has no runtime importer; no bridge from
decision -> router -> pipeline -> basis. Shared gap, not a MiMo regression.

GATE F: Capability Ledger is close-gated (now reached from MiMo after GATE B,
proved by a test asserting material_revision changed) but nothing ever DEFINES
a capability at runtime. The Behaviour Ledger is written by NOTHING in either
consumer.

GATE G: _auto_structural_awareness writes a blanket 'manages' edge and never
consults the canonical three-way owner (rune_relationship / declare_relationship
in construction_authority). (A) ordinary external vs (B) external dependency is
not distinguished automatically.

BYPASSED (shared, recorded NOT repaired per the §0 hard boundary): TUI
'/build start' mints via scaffold.new_contract directly with empty scope and no
decision trace — the exact defect the MiMo seam already had repaired.

VERDICT: FULL_SCAFFOLDING_HARNESS_PARTIAL. Six of nine PROVEN requirements hold;
three do not (ledger updates, Spine semantics, fresh-process discovery).
Not BLOCKED: nothing is architecturally wrong, and no item is worse in MiMo
than in the TUI. Parity is largely achieved; completeness is not.

TUI_SPECIFIC_CODE_CHANGED = NO · TUI_OBSERVABLE_BEHAVIOUR_CHANGED = NO
This commit is contained in:
conductor committed 2026-09-24 22:27:25 +01:00
1 parent e6f0436918
commit 9bf939900b
1 file changed
+134
@@ -335,3 +335,137 @@ it. The gap is pre-existing and shared with the TUI path — it is not created b
the adapter, and closing it is a user-authority workstream, not a bridge
workstream. What the adapter must not do is *claim* provenance it does not
have, which is now explicitly labelled at the check site.
---
# GATE D — ORIGINAL V1 RUNTIME PARITY AUDIT (explore-7, verified by reading code)
**Headline: the earlier "unreachable machinery" diagnosis is confirmed WRONG.**
Both consumers converge on `ConstructionInterface.submit_need` →
`construction_decision`. The decision half of Scaffolding V1 was always
composed; MiMo was bypassing it, and that is now repaired.
## Converged — SAME_CANONICAL_PATH (17 items)
contextual intent · classification · Build Basis **routing** · Project Registry ·
Project Scaffold · structural discovery · fit/capability resolution · toolchain
decision · Layout obligations · completeness · DecisionTrace · auto-derived
obligations · Construction Contract · mutation enforcement · verification ·
Scaffold update · contextual Project↔Spine **registration**.
## SAME_CANONICAL_STATE_DIFFERENT_ADAPTER (4)
observed/descriptive impact · Capability Ledger update · continuation/resume ·
governed completion. In each case the canonical state exists and the MiMo CLI
exposes the operation; the difference is which wiring invokes it. GATE B closed
two of these (completion now delegates, so the Capability Ledger revision is
reached).
## MISSING_ADAPTER (the actionable shortlist)
| # | Item | Canonical owner | Note |
|---|---|---|---|
| 4 | Build Basis **execution** | `build_basis.py` | **NO_EXECUTOR** — see Gate E |
| 11 | bounded context packet | `iteration.context_packet` | no runtime caller in EITHER path |
| 12b | impact **closure** predictor | `iteration.predictive_impact` | surface resolution works; the graph predictor does not run |
| 17 | worktree isolation for MiMo | `build_mode.BuildManager` | MiMo mutates in-repo under guard |
| 21 | selective behaviour invalidation | `BehaviourLedger.invalidate_for_change` | **zero runtime callers** |
| 22 | retest obligations | `behaviour_ledger.retest_history` | fed only by 21 |
| 23 | post-change obligations | `iteration.post_change_obligations` | zero runtime callers |
| 25 | Behaviour Ledger **writers** | `behaviour_ledger.define/_transition` | **nothing writes it at runtime** |
| 27 | structural drift handling | `drift_resume.py` | imported only by tests/scripts |
| 28 | schema-change consent | `structural_migration.py` | tests only |
| 32 | fresh-context discovery | `ConstructionInterface.discover_active_contract` | consumed only by a script |
**21 / 22 / 23 / 25 are ONE composed family** (`iteration.py` +
`behaviour_ledger.py`) whose natural activation point is **contract close /
checkpoint** — the seam GATE B just opened. That makes it the highest-value
remaining adapter, and it is a *shared* gap, not a MiMo gap.
## GATE E — Build Basis: `NO_EXECUTOR`
`research_route` honestly reports `RECORDED_NOT_EXECUTED` and says the top
level "is not yet wired for direct invocation" (construction_decision.py:421,
427). `build_basis.py` is imported by **no runtime module** — only tests and one
evidence script. `scripts/research_*` never references it: there is no bridge
from decision → router → pipeline → basis. The research that actually runs is
`build_mode.BuildManager`'s own internal step, which produces no qualified
Build Basis.
**Verdict: ROUTED_ONLY. The canonical Build Basis machinery has no executor in
either consumer.** This is not a MiMo regression — it is a shared gap.
## GATE F — ledgers
* **Capability Ledger** — written ONLY by `_auto_material_change`, which fires
on **close**. MiMo previously never closed (parallel path), so it updated
nothing; after GATE B a MiMo completion reaches it (proved by a test asserting
`material_revision` changed). `define`/`attach_spec`/`revise_spec` have ZERO
runtime callers — no capability is ever newly defined at runtime.
* **Behaviour/Test Ledger** — writers exist (`define`, `_transition`,
`testing_mode.record`, `iteration.invalidate_behaviours`) but **grep finds
zero callers** in the TUI, operator, build_mode or any construction path. The
TUI `/testing` command only READS. **The Behaviour Ledger is currently written
by nothing, in either consumer.**
* `iteration.py` is imported only by tests — so it is not the entrypoint, and
neither is anything else.
## GATE G — Project↔Spine: two-part, not three-way
`_auto_structural_awareness` unconditionally registers the project and writes a
blanket `manages` edge:
```python
registry.register(project_id=project, scaffold_location=..., repo_identity="")
spine_mod.add_relationship(sdoc, type="manages",
from_id="project:rune", to_id=f"project:{project}", ...)
```
The genuine three-way distinction **does exist canonically** — in
`construction_authority.rune_relationship` (CORE / recorded declaration /
UNRELATED, with `declare_relationship` mapping CORE→`manages`,
EXTERNAL→`depends_on`) — but **activation never consults it**. So (A) ordinary
external vs (B) external dependency is not distinguished automatically; only
the manual `declare` op reaches it.
## BYPASSED — shared, in the TUI (recorded, NOT repaired)
**TUI `/build start` mints its contract via `scaffold.new_contract` directly**
(rune_tui.py:3306-3315) — empty scope, no `make_decision` trace. That is the
**exact defect the MiMo seam already had repaired**. The TUI uses the canonical
phase machine but not the canonical decision path.
Per the tranche's §0 hard boundary, **no TUI change was made.** This is recorded
as a shared canonical defect with a named owner, for a future authorised change.
## GATE L — VERDICT
```
FULL_SCAFFOLDING_HARNESS_PARTIAL
```
**Why not PROVEN.** Six of the nine PROVEN requirements hold: normal MiMo
construction enters Scaffolding automatically, uses the canonical
decision/impact/contract machinery, obeys the hardened mutation authority,
reports observed consequences canonically, uses canonical verification, and
persists the Scaffold. **Three do not:**
1. **ledger updates** — the Behaviour Ledger has no writer at all, in either
consumer; the Capability Ledger is close-gated only (now reached, but
nothing ever defines a capability at runtime);
2. **Spine semantics** — activation writes a blanket `manages` edge and never
consults the canonical three-way relationship owner;
3. **fresh-process discovery** — `discover_active_contract` is not wired into
either consumer's runtime path.
**Why not BLOCKED.** Nothing is architecturally wrong. Seventeen items are
already SAME_CANONICAL_PATH; the gaps are *composition* gaps in the shared
canonical layer, and the seam for the largest of them (the
invalidation/obligations/behaviour-ledger family) is the contract-close point
GATE B just opened.
**Critical reframing: parity is largely achieved; completeness is not.** The
audit found no item where MiMo is worse than the TUI, and no DUPLICATE in the
MiMo path. The remaining gaps are **shared** — they exist in the reference
consumer too. Judging MiMo against the TUI, the integration is done; judging
Scaffolding V1 against its own accepted design, V1 itself is not fully wired.