core/generate
Shay c2b97f40bf test(comprehension): prove the scalar-multiply contract (PR-6a)
The multiplicative comparative frame (PR-5c) admits exactly one shape —
Mul(Symbol, Literal), a unit-bearing symbol times a dimensionless integer
(count × scalar = count). That contract was held by OMISSION: to_relation's
`case _: return None` refused every other Mul shape, but no test would fail
if the guard were loosened, and no doc stated where the guarantee lives.

This makes the obligation meaningfully-failing (CLAUDE.md Schema-Defined
Proof Obligations), with no runtime logic change:

- test_mul_projection_admits_only_symbol_times_literal — Mul(Symbol, Symbol)
  (a count×count product), a commuted factor, and compound factors all REFUSE
  (to_relation → None). Verified to go red when a Mul(Symbol, Symbol) projection
  arm is injected.
- test_literal_factor_is_dimensionless_by_construction — Literal has exactly
  one field (value); a unit-bearing literal multiplication is unrepresentable,
  not merely unchecked.
- test_scalar_only_guard_is_load_bearing — check_admissibility's `multiply`
  dispatch products operand units generally (count×count → count², no refusal),
  so it would NOT catch the masquerade. The projection arm is the sole boundary.

Docstrings on Mul and to_relation now state the scalar-only contract and that
it is enforced at the projection boundary, not in the dimensional checker.

Gates unchanged: setup-oracle 15-case 15/0/0 and R1 2/0/8 (setup_wrong=0);
77 expr/admissibility/reader/setup-oracle tests + 56 architectural invariants
green. No serving path touched.
2026-06-06 17:42:22 -07:00
..
binding_graph feat: Phase 1 — canonize binding-graph interlingua + INV-26 neutrality 2026-06-04 16:20:12 -07:00
comprehension
cue_precision
derivation feat(derivation): math-serving reach seam — select_self_verified is policy-aware (ADR-0206 §5) 2026-06-06 15:46:14 -07:00
determine feat(determine): calibrated disclosed estimation — the engine earns the right to guess (Step E) 2026-06-06 13:49:07 -07:00
meaning_graph fix(comprehend): relational reader fail-closed on leftover relational structure 2026-06-06 09:45:10 -07:00
proof_chain feat: add deductive proof evidence gates 2026-06-04 08:37:51 -07:00
realize refactor(comprehension): drop QuantQuery — consumers read the target from graph.unknowns (PR-3) 2026-06-06 16:49:09 -07:00
__init__.py
admissibility.py
articulation.py
articulation_legality.py
attention.py
bridge_trace.py
dialogue.py feat(persistence): Shape B+ Phase C — SessionContext.snapshot/restore (full lived state) 2026-06-05 12:13:46 -07:00
discourse_planner.py
exhaustion.py
graph_constraint.py
graph_planner.py
grounding_accessors.py
intent.py
intent_bridge.py
intent_ratifier.py
logic_canonical.py
logic_equivalence.py
math_candidate_graph.py feat: add gsm8k r1 reconstruction 2026-06-04 13:25:11 -07:00
math_candidate_parser.py
math_completeness.py
math_parser.py
math_problem_graph.py
math_realizer.py
math_roundtrip.py
math_solver.py
math_symbolic_equivalence.py
math_symbolic_normalizer.py
math_verifier.py
morphology.py
ood_surface_generator.py
operators.py
perturbation_suite.py
proposition.py feat(persistence): Shape B+ Phase C — SessionContext.snapshot/restore (full lived state) 2026-06-05 12:13:46 -07:00
quantitative_comprehension.py feat(comprehension): the multiplicative comparative frame — first R1 capability (PR-5c) 2026-06-06 17:29:23 -07:00
quantitative_expr.py test(comprehension): prove the scalar-multiply contract (PR-6a) 2026-06-06 17:42:22 -07:00
realizer.py
realizer_guard.py
recognizer_anchor_inject.py
recognizer_match.py
recognizer_registry.py
relational_field_reader.py feat(field-wedge): geometric field reader — relational-metric lane wrong=0 (Phase W.1) 2026-06-04 19:34:43 -07:00
relational_symbolic_reader.py feat(field-wedge): ablation verdict — field is decoration on additive (C3) (Phase W.2) 2026-06-04 19:44:22 -07:00
result.py
rotor_admissibility.py
salience.py
semantic_templates.py
stream.py refactor(generate): remove redundant forbidden-site _close_final_state; rename "Drift fix 2" 2026-06-05 08:17:17 -07:00
surface.py
templates.py