# inference-closure lane — architectural findings (v1)

## Regression and re-resolution — 2026-05-22

Between the 2026-05-17 resolution and 2026-05-22, a regression in
`generate/intent.py` caused correction-prefixed premises ("Actually X
precedes Y.", "Actually X grounds Y.", "Actually X causes Y.") to
route to VERIFICATION instead of CORRECTION. The premise emit path is
gated on CORRECTION intent, so `PackMutationProposal` records stopped
being emitted for any non-`is` relation. The lane fell to
`all_pass_rate=0.4` on public — only the four `transitive_is` cases
passed because `is` isn't in `_DECLARATIVE_RELATION_RE`'s verb list.

Resolution: added `_CORRECTION_CUE_PREFIX_RE` guard so a leading
"Actually" / "Incorrect, " / "No, " / "Correction" cue skips the
declarative-match branch and falls through to the `_RULES` CORRECTION
rule. Pinned by `tests/test_correction_cue_prefix_routing.py`.

Post-fix on 2026-05-22:

| Split | n | derived_recall_rate | premises_stored | replay | overall |
|---|---|---|---|---|---|
| dev/v1     | 5  | **1.0** | 1.0 | 1.0 | ✓ |
| public/v1  | 20 | **1.0** | 1.0 | 1.0 | ✓ |

The 2026-05-17 resolution narrative below is preserved unchanged.

## Resolution — 2026-05-17 lane re-run

After the typed deterministic operators (ADR-0018: `transitive_walk`,
`multi_relation_walk`, `path_recall` in `generate/operators.py`) and
their pipeline wiring (`_maybe_transitive_walk` + `_fold_walk_into_surface`
in `core/cognition/pipeline.py`) landed, this lane passes:

| Split | n | derived_recall_rate | premises_stored | replay | overall |
|---|---|---|---|---|---|
| public/v1  | 20 | **1.0** | 1.0 | 1.0 | ✓ |
| holdouts/v1 | 12 | **1.0** | 1.0 | 1.0 | ✓ |

Gap 1 (no transitive composition) and Gap 2 (no path-recall) are both
closed.  The probe for `wisdom is light`, `light is truth`,
`What is wisdom?` now produces
`wisdom is defined as ... — wisdom is truth (via wisdom light truth)`,
and the chain endpoint `truth` is folded into the user-facing surface.

Historic finding preserved below.

## Original v1 result (now superseded)

| Split | n | derived_recall_rate | premises_stored_rate | replay_determinism | overall_pass |
|---|---|---|---|---|---|
| public/v1 | 20 | **0.0** | 1.0 | 1.0 | False |
| holdouts/v1 | 12 | **0.0** | 1.0 | 1.0 | False |

This is the **expected v1 outcome** documented in
`docs/capability_roadmap.md` Phase 3: lanes may fail v1 honestly, and
each failure becomes either a closed engineering gap or a documented
architectural deferral.

## What v1 confirms

- **Foundation intact.** Every premise emits a `PackMutationProposal`
  (M3 = 1.0); every (premises, probe) sequence is replay-deterministic
  by trace_hash (M4 = 1.0).  The work that landed in Phase 2
  (symbolic-logic v1+v2) — storage and replay — holds at this depth.
- **No inference operator.** Across all 32 cases (20 public + 12
  holdouts) covering five relation families (`is`, `precedes`,
  `grounds`, `causes`, `belongs_to`), the probe response surface
  never references the derived entailment token.  Both `surface`
  and `walk_surface` are template-driven definitions/disclaimers, not
  derivations.

## Concrete probe trace

For `INF-DEV-001` — premises `wisdom is light`, `light is truth`,
probe `What is wisdom?` — the runtime produces:

```
PREMISE 'What is wisdom?'          surface='wisdom is defined as ...'  vault=0
PREMISE 'Actually wisdom is light' surface='Light write.'              vault=9
PREMISE 'What is light?'           surface='light is defined as ...'   vault=5
PREMISE 'Actually light is truth.' surface='Truth thought — λαμβάνω…'  vault=9
PROBE   'What is wisdom?'
  surface              = 'wisdom is defined as ...'
  articulation_surface = 'wisdom is defined as ...'
  walk_surface         = 'Wisdom does not with.'
  vault_hits           = 9
```

The probe retrieves 9 vault entries (so the premises **are** in
recall reach) but the realizer template emits a generic definition
stub.  The transitive entailment (`truth`) appears in neither
`surface` nor `walk_surface`.

## Architectural gaps (where the inference closure step is missing)

The roadmap pre-identified two suspects.  v1 evidence narrows it to
both:

### Gap 1 — `generate/graph_planner.py` has no transitive composition

When the premise `wisdom is light` is taught, a proposition-graph
node is created.  When `light is truth` is taught, a second node is
created.  No edge composition step runs that would emit a derived
node `wisdom is truth`.  The articulation target planner picks a
single node to articulate; it has no mechanism for chained traversal.

**Engineering shape** (out of scope for v1, in scope for v2):
- Extend `graph_from_intent()` to detect a probe whose form is
  "what does A R?" / "what is A?" and walk outgoing R-edges of A.
- Extend `plan_articulation()` to optionally compose a multi-node
  surface when the walk produces a single deterministic chain.

### Gap 2 — `field/propagate.py` has no derivable-but-not-asserted recall path

Vault retrieval scores `cga_inner(query, stored_versor)` and returns
the top-K direct matches.  There is no path-based recall that says
"return X if there is a relation-chain from the query entity to X."
The 9 vault hits for the probe include the premise versors but not a
derivation versor (none exists).

**Engineering shape** (also v2 candidate, may overlap with Gap 1):
- A path-recall operator over the relation-typed edges of vault
  entries.  Preserves exact-CGA semantics: the chain composition is
  deterministic, not approximate.

## Pass criterion review

The pass thresholds in `contract.md` (`derived_recall_rate >= 0.50`,
`premises_stored_rate >= 0.95`, `replay_determinism >= 0.95`) are
unchanged.  v1's failure is uniform on the derived-recall metric —
exactly what the contract was built to detect.

## What stands today

- The lane exists as a permanent regression and progress signal.
- Foundation guarantees (storage, replay) are independently scored
  and remain at 1.0 — closing the inference gap will not cost them.
- Structural-zero frontier baseline recorded
  (`baselines/v1_structural_zero.json`): frontier LLMs do not emit
  the typed signals these sub-metrics score by construction.

## Phase 3 exit posture

This lane satisfies the roadmap's v1 expectation: "v1 results with
honest scores (which may be failing — that's acceptable for v1)."
Phase 3 exit requires at least two lanes passing v1 by phase exit;
inference-closure's gap-1 / gap-2 engineering work, if undertaken,
flips this lane from failing v1 to passing v2 and contributes to
that count.  Until then it stands as load-bearing evidence of the
specific engineering work needed.
