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.
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.