18 KiB
Authorization: binding.quantity_entity Foundational Slice
Status: Authorized for one future diagnostic-only implementation PR after this
authorization PR merges
Date: 2026-06-20
Family: binding.quantity_entity
Governing doctrine: ADR-0223, ADR-0224, and the proposal-first fence landed
through PRs #841–#844
Serving status: Not serving; serving is not authorized
1. Purpose
This document authorizes a bounded implementation slice for
binding.quantity_entity. It is the first foundational grounding family because
a quantity is not merely a number: it is a typed counted or measured amount
attached to an entity, an explicit unit/kind disposition, exact source
provenance, and a local semantic role.
The family is a grounding primitive, not an answer-producing construction. Its job is to expose whether one locally evidenced quantity can be bound to one locally evidenced entity without ambiguity. Later state-change, partition, rate, comparison, unit/science, chart-reading, and reading-comprehension contracts may consume that binding. None of those later contracts are part of this authorization.
This preserves ADR-0223's authority split:
closeness proposes;
bindings ground;
contracts determine.
Here, "determine" means only that a diagnostic construction contract is runnable from its stated evidence. It does not mean determining or emitting an answer.
2. Map: intrinsic space and considered directions
The intrinsic space is a small, provenance-preserving bipartite relation:
grounded quantity mentions on one side, locally evidenced entity mentions on
the other, and typed MentionBinding edges between them. Ambiguity is not a
low score to optimize away; it is competing topology that prevents closure.
The invariant is therefore unique local binding under exact evidence, not generic noun discovery.
| Direction | Geometry | Decision |
|---|---|---|
| Add a broad noun/entity parser | Expands an open world of possible referents before a bounded contract exists | Rejected: generic entity extraction and broad parsing are outside the family |
Treat any existing MentionBinding as runnable |
Collapses evidence and authority into one edge | Rejected: a binding may propose/ground, but only an organ-specific assessment may close |
Add proposal-first local quantity/entity assessment over existing ProblemFrame facts |
Preserves the proposal → binding → assessment authority gradient | Selected: smallest reusable and refusal-first slice |
Begin with state_change.transition |
Adds events, temporal order, actor continuity, and transition semantics | Rejected for this slice: it is a larger manifold with different confusers |
The selected direction is structurally minimal: reuse exact GroundedScalar,
GroundedMention, GroundedUnit, MentionBinding, and SourceSpan evidence;
add only the family declaration, proposal seam, and separate diagnostic
assessment necessary to make closure explicit.
3. Non-goals
The future implementation PR is not authorized to add or change:
- broad noun parsing or generic entity extraction;
- a universal IR, generic knowledge blob, or cross-domain entity ontology;
- benchmark-specific grammar, case-ID logic, answer mining, or a GSM8K-shaped substrate;
- serving admission, serving dispatch, committed answer production, or response realization;
- state-change recognition or
state_change.transition; - transaction, acquisition, transfer, consumption, or loss recognition;
- rate, percent, partition, proportional-change, or comparison logic;
- pronoun/coreference resolution or cross-sentence inference beyond exact local evidence;
- derivation-organ behavior or raw-prose parsing inside a derivation organ;
- sealed/eval/report artifacts, packs, policy, identity, recall, Vault, field, algebra, or runtime mutation;
determine(answer=False)or any inference that absence means false.
No family may become runnable merely because a nearby token resembles a noun. No score, proximity heuristic, or assessment result may synthesize a proposal.
4. Target seam and authority gradient
The future implementation must obey this one-way seam:
surface quantity/entity cue
→ ConstructionProposal(status="proposed")
→ exact mention/entity/quantity binding
→ ContractAssessment
→ diagnostic runnable/refused
The phases have distinct authority:
- Proposal: exact surface evidence may propose
binding.quantity_entity. The proposal is born withstatus == "proposed",diagnostic_only is True, andserving_allowed is False. - Grounding: existing
ProblemFrameevidence binds a quantity mention to an entity mention throughMentionBinding(binding_type="quantity_entity"). A unit, when present, is connected only through the existingMentionBinding(binding_type="quantity_unit")form. - Assessment: an organ-specific
ContractAssessmentchecks cardinality, provenance, exact spans, kind/unit disposition, locality, and confusers. - Disposition: only the assessment may report diagnostic
runnable=True; otherwise it reports typed missing bindings or unresolved hazards and refuses.
No proposal may be derived from ContractAssessment output. The legacy
assessment-backed make_proposal() adapter is not authorized for this family.
The family must enter through propose_construction() before its assessment is
dispatched. A frame with no binding.quantity_entity proposal must not dispatch
the family contract.
5. Minimal first implementation slice
The smallest allowed future PR may:
- Register
binding.quantity_entityin the diagnostic construction catalog, preservingdiagnostic_only=Trueandserving_allowed=False. - Recognize only local quantity/entity evidence already exposed by
ProblemFrame,GroundedScalar,GroundedMention,GroundedUnit, andMentionBindingmachinery. It may not add a second raw-text parser. - Create a diagnostic-only
ConstructionProposalfrom exact local source evidence before assessment, with initialstatus="proposed". - Attach exact, non-synthetic
SourceSpanevidence whose text equals the corresponding original-text slice. - Add one organ-specific
ContractAssessmentfor this family. - Refuse if the entity span, quantity span, quantity kind/unit disposition, or provenance is missing, synthetic, conflicting, or ambiguous.
- Produce no serving output and make no serving-path import or dispatch change.
- Preserve
wrong_ids == []on both serving train and holdout lanes.
The implementation may make a narrowly necessary type-only addition for a closed quantity-kind disposition if existing types cannot represent the obligation. Such a type must be local to this family, must not become a generic entity ontology, and must not authorize new parsing. Otherwise, existing types must be reused.
This documentation PR intentionally does not flip the descriptive
FoundationalFamilySpec.implementation_authorized field. That mechanical gate
remains false until the authorized implementation PR actually introduces the
bounded family seam. At that point only binding.quantity_entity may be set to
true; state_change.transition must remain false.
6. Roles and evidence obligations
The family must use existing names where the substrate already has them. It must distinguish semantic roles from closure evidence so that provenance does not masquerade as an entity role.
6.1 Catalog semantic roles
| Name | Obligation | Existing representation |
|---|---|---|
quantity |
Required. Exactly one quantity mention must link through fact_id to exactly one GroundedScalar. |
GroundedMention(kind="quantity") + GroundedScalar |
entity |
Required. Exactly one local entity/object mention must be the target of the selected binding. | Existing GroundedMention; do not add a broad extractor |
unit |
Optional as a role, but its disposition is mandatory. If present it must be grounded and bound to the same quantity. | GroundedMention(kind="unit") + GroundedUnit + quantity_unit binding |
6.2 Required assessment evidence
| Name | Obligation |
|---|---|
quantity_kind |
Required closed disposition: count or measurement. It must be grounded by local evidence, not guessed from a missing unit. If neither can be justified, refuse. |
provenance_span |
Required exact SourceSpan evidence for the quantity, entity, and any unit; each span must be source-backed and equal to the corresponding original text slice. |
local_binding_relation |
Required existing MentionBinding(binding_type="quantity_entity") from the selected quantity mention to the selected entity mention, with its exact evidence spans. |
quantity_kind, provenance_span, and local_binding_relation are closure
obligations; they do not authorize a broad ontology or a new universal relation
model. "Unit explicitly absent" means the assessment records that no unit
mention participates in the bounded local evidence while count is positively
grounded. Mere absence of a unit token must not be converted into a count claim.
7. Closure conditions
The diagnostic assessment may report runnable=True only when all of the
following hold:
- exactly one
GroundedScalaris selected; - exactly one local entity/object
GroundedMentionis selected and bound; - the selected quantity mention resolves to that scalar through
fact_id; - exactly one selected
quantity_entitybinding connects the quantity to the entity; - all quantity, entity, binding, and unit evidence spans are exact, non-synthetic, ordered, within bounds, and equal to original text slices;
- quantity and entity provenance is preserved without replacement or widening;
quantity_kindis positively grounded ascountormeasurement;- a unit is either explicitly grounded through the selected quantity's
quantity_unitbinding or explicitly absent under a positively grounded count construction; - no competing nearby entity or competing scalar creates another plausible local binding;
- the evidence requires no pronoun resolution, antecedent repair, or cross-sentence leap;
- the proposal already exists and remains separate from the assessment.
Closure is diagnostic readiness only. It does not verify a mathematical answer, authorize a downstream construction, or admit anything to serving.
8. Refusal conditions
The assessment must refuse, with stable organ-specific blockers or hazards, on:
- multiple plausible entities for the quantity;
- a missing entity mention;
- a quantity without positively grounded count or measurement context;
- pronoun-only binding without independently established antecedent evidence;
- sentence- or clause-level ambiguity that prevents a unique local edge;
- unit/kind conflict or a unit bound to a different quantity;
- synthetic, widened, overlapping, out-of-bounds, or text-mismatched evidence spans;
- a cross-sentence entity leap;
- multiple plausible quantities for one entity when the local topology does not disambiguate them;
- list or enumeration topology with ambiguous pairing;
- percent, rate, comparison, partition, or transition evidence that requires another family to interpret;
- any benchmark-shaped shortcut, case-specific branch, or assessment-backed proposal synthesis.
Unknown or absent evidence remains unknown. Refusal is the correct result; the implementation must not silently select the nearest candidate.
9. Mandatory confuser suite design
The future PR must add positive examples plus at least these refusal/confuser cases:
- quantity with no entity;
- entity with no quantity;
- two nearby entities and one number;
- two numbers and one entity;
- percent, rate, and comparison surfaces that must not close as generic
quantity_entityevidence; - a state-change sentence that may expose a local quantity/entity binding but
must not propose or dispatch
state_change.transition; - pronoun reference without a resolved antecedent;
- a cross-sentence entity leap;
- a unit/kind conflict;
- list/enumeration ambiguity.
The state-change confuser protects family separation: local quantity/entity grounding may exist inside a sentence, but this family must neither interpret the event nor become a transition contract.
10. Interaction with existing proposal-first families
binding.quantity_entity is foundational evidence that later contracts may
consume. It does not replace, wrap, or weaken:
proportional_change.decrease_to_fraction; orpartition.percent_partition.
The new family must not alter their proposal triggers, roles, assessments,
dispatch, statuses, blocker labels, or serving posture. It must not call their
contracts, backdoor into their relation types, or make either family runnable
by treating a quantity/entity edge as sufficient evidence. The
_PROPOSAL_FIRST_FAMILIES fence established by #844 remains load-bearing, and
all #841–#844 seam invariants must remain green.
Future composition, if separately authorized, must be explicit and monotonic: those families may require a closed quantity/entity assessment as one input, but retain their own independent obligations and authority.
11. Acceptance criteria for the future implementation PR
The future PR must prove all of the following:
- every proposal begins with
status == "proposed"; - every proposal has
diagnostic_only is Trueandserving_allowed is False; ContractAssessmentremains the separate and sole closure authority;- no assessment output is used to construct or recover a proposal;
- a proposal-free frame does not dispatch the family contract;
- exact source spans equal the corresponding original-text slices;
- quantity, entity, unit/kind, locality, and provenance obligations are all
positively closed before
runnable=True; - every mandatory confuser refuses without nearest-candidate fallback;
- no new raw-prose/local-regex derivation surface is added;
- only the
binding.quantity_entityfoundational registry entry changes itsimplementation_authorizedgate;state_change.transitionremains false; - existing #841/#842/#843/#844 tests remain green;
- serving train and holdout retain
wrong_ids == []; - deterministic replay produces the same proposal, bindings, assessment, and ordering for the same input;
- no serving, derivation-organ, sealed/eval/report, pack, policy, identity, recall, Vault, field, or algebra file changes are present.
12. Required validation for the future implementation PR
Run:
uv run python -m pytest -q \
tests/test_construction_affordances.py \
tests/test_construction_proposal_seam.py \
tests/test_foundational_families.py \
tests/test_problem_frame_builder.py \
tests/test_problem_frame_contracts.py \
tests/test_proportional_decrease_proposal.py \
tests/test_percent_partition_proposal.py \
tests/test_kernel_no_new_legacy_derivation_surfaces.py
uv run python -m core.cli test --suite smoke -q
uv run python -m compileall -q \
generate/construction_affordances.py \
generate/foundational_families.py \
generate/problem_frame.py \
generate/problem_frame_builder.py \
generate/problem_frame_contracts.py
uv run ruff check .
git diff --check
The future PR must also run the repository's canonical train and holdout serving
checks and report both wrong_ids lists explicitly. This authorization does not
permit writing or changing those eval artifacts.
13. Explicit authorization boundary
This PR authorizes a future implementation slice for
binding.quantity_entity only.
It does not authorize state_change.transition.
It does not authorize serving.
It does not authorize general entity extraction.
It does not authorize broad parsing.
Authorization becomes effective only after this document merges. Any widening of family, parser surface, inference distance, serving posture, or mutation surface requires a separate authorization.
14. Justification: the masterstroke
The key structural choice is to model ambiguity as non-closure of a local relation, not as a classification error to be repaired by a broader parser. That aligns the representation with the problem's intrinsic geometry: one quantity node, one entity node, one provenance-preserving edge, and a conjugate assessment that can oppose an unsafe proposal. Proposal and assessment form the required forward/corrective pair. Exact bindings carry meaning forward; refusal removes distortion when the topology is not unique.
The result is reusable without becoming universal: later families can consume the grounded edge, but none inherit authority to answer, transition, compare, partition, or serve.
15. Copy-paste brief for the next PR
PR title:
feat(kernel): introduce diagnostic quantity-entity proposal seamDependency: Start only after
docs(kernel): authorize quantity-entity foundational implementation slicehas merged. Create a fresh worktree from currentorigin/mainand prove the authorization commit is in the base before editing.Implement the first diagnostic-only proposal-first slice for
binding.quantity_entity. Reuse only local evidence already exposed byProblemFrame,GroundedScalar,GroundedMention,GroundedUnit, andMentionBinding. Register the family with required rolesquantityandentity, optional roleunit, and explicit closure obligations forquantity_kind,provenance_span, andlocal_binding_relation. CreateConstructionProposal(status="proposed", diagnostic_only=True, serving_allowed=False)from exact source evidence before assessment. Add a separate organ-specificContractAssessment; dispatch it only when the proposal exists. Refuse on ambiguous entity/scalar topology, unresolved kind/unit disposition, non-exact or synthetic provenance, pronoun-only or cross-sentence binding, and every confuser listed in the authorization.Do not add broad noun/entity parsing, state-change/event semantics, a universal IR, benchmark-specific grammar, serving behavior, answer production, or any assessment-backed proposal path. Do not touch derivation organs,
generate/math_candidate_graph.py, eval/sealed/report artifacts, packs, policy, identity, recall, Vault, field, algebra, or serving runtime. Preserve the #841–#844 seams and prove train/holdoutwrong_ids == []using the validation commands in this authorization.