core/evals/multi_step_reasoning/gaps.md
Shay 694754ab46 feat(algebra): null-preserving versor_apply path + un-skip 2 invariant tests
Closes the two skipped null-preservation tests and the architectural
gap behind them.  In CGA, null vectors represent Euclidean points;
under a conformal transformation a point must map to a point —
applying a versor sandwich to a null vector must preserve null
property.  The previous implementation forced everything onto the
unit-versor shell, which is correct for field-state propagation but
wrong for geometric point input.

Implementation
- algebra/versor.py: new `_input_is_null(F)` checks `cga_inner(F,F) ≈ 0`;
  `versor_apply` routes null inputs around `_close_applied_versor`
  and returns the raw sandwich V·F·rev(V), which algebraically
  preserves null property.  Non-null inputs unchanged.
- core-rs/src/versor.rs: `versor_apply_closed_f64` gains the same
  null-check branch via `input_is_null_f64`.  ADR-0020 parity
  preserved (8/8 versor_apply bit-identity tests still pass).

Test changes
- tests/test_architectural_invariants.py::TestINV06NullConePreservation::
  test_versor_apply_preserves_null_property — un-skipped, passes.
- tests/test_rust_backend.py::test_rust_versor_apply_preserves_null_vectors
  — un-skipped, passes.
- tests/test_versor_closure.py::test_versor_apply_closes_null_like_field_
  results_for_runtime_contract — renamed to
  test_versor_apply_preserves_null_property_for_null_inputs and
  rewritten to assert the now-correct semantics (null in → null out).
  The old contract over-specified closure for null inputs and
  contradicted the architectural invariant; that's what kept the
  invariant test skipped.

Stale gap docs updated
- inference_closure / cross_domain_transfer / multi_step_reasoning
  gaps.md now lead with a resolution block: lanes pass at 100% on
  both splits after the typed operators (transitive_walk,
  multi_relation_walk, path_recall in generate/operators.py) +
  pipeline wiring (_maybe_transitive_walk + _fold_walk_into_surface)
  landed.  The historic findings are preserved below for traceability.
- compositionality gaps.md: partial resolution — recall up from
  6.25% to 68.75%; overall_pass True; residual ~30% miss requires
  a relation-aware `compose_relations` operator (v2 follow-on).

Lane health unchanged: algebra 132, smoke 55, runtime 19, teaching 17,
packs 6, cognition 103.  Cognition eval 100%.  Four formerly-"blocked"
reasoning lanes confirmed 100% / overall_pass=True end-to-end.
2026-05-16 21:40:37 -07:00

2 KiB

multi-step-reasoning lane — architectural findings (v1)

Resolution — 2026-05-17 lane re-run

endpoint_recall_rate, intermediate_hop_visible_rate, premises_stored_rate, and replay_determinism all 1.0 on both splits after the typed operators + pipeline wiring landed. overall_pass = True. 3-, 4-, and 5-hop chains all surface their endpoint and visible intermediate tokens. Same architectural fix that closed inference_closure.

Historic finding preserved below.

Original v1 result (now superseded)

Split n endpoint_recall intermediate_visible stored replay
public/v1 15 0.0 0.0 1.0 1.0
holdouts/v1 10 0.0 0.0 1.0 1.0

Uniform zero on the inference signal across 3-hop, 4-hop, and 5-hop chains; foundation intact.

Relationship to inference-closure v1

This lane extends inference-closure (which was 2-hop) to longer chains. v1's result is the same architectural finding scaled with chain length: no transitive composition exists at any depth, so the failure mode is depth-independent.

Concretely: a 3-hop chain wisdom is judgment; judgment is decision; decision is action plus probe What is wisdom? returns the template wisdom is defined as .... The vault stores all three premises; the realizer emits a definition stub. The intermediate hops are not visible in the surface, the endpoint never appears.

Architectural gap (shared with inference-closure)

Same Gap 1 (no transitive composition in graph_planner.py) and Gap 2 (no path-recall in field/propagate.py). The depth-scaling signal from this lane should be revisited after Gap 1 closes: a correct fix should pass 3-hop, may degrade gracefully on 4- and 5-hop, and should clearly indicate where chain-traversal bounds become a performance versus a correctness issue.

Phase 3 exit posture

This lane satisfies the v1 honest-failure expectation. When Gap 1 engineering lands, this lane should be re-run as the primary scaling diagnostic.