PR-α of the CompositionClaim wave (CC-1 brief in
docs/handoff/COMPOSITIONCLAIM-BRIEF-PACK.md). Pure docs; no runtime
mutation. Authors two ADRs mirroring ADR-0168 / ADR-0168.1 structure:
- ADR-0169 — CompositionClaim ratification doctrine (parent ADR-0167)
- ADR-0169.1 — MathCompositionClaimProposal adapter (parent ADR-0169)
CompositionClaim is the next sub-type from ADR-0167 FOLLOWUPS §1 and
the highest-leverage missing handler: 20 of 47 audit refusals in
evals/gsm8k_math/train_sample/v1/audit_brief_11.json
(quantity_extraction = 12 + multi_quantity_composition = 8; corrects
the §1 hint's 8+11 = 19 to the audited 20).
Initial SAFE_COMPOSITION_CATEGORIES allowlist:
- multiplicative_composition
- additive_composition
- subtractive_composition
Distributive / ratio / comparative / percentage / unit-conversion /
time / chained compositions are explicitly deferred.
Case 0050 hazard pin is mandated in the acceptance gates section.
Prior-ADR compatibility audit covers ADR-0056, 0057, 0114a, 0164,
0165, 0166, 0167, 0168, 0172. ADR-0057 evidence floor preserved via
the adapter (ADR-0169.1) — audit evidence stays source="math_audit",
never laundered as source="corpus".
Mutation boundary limits accepted proposals to appending reviewed
composition-pattern artifacts under
language_packs/data/en_core_math_v1/compositions/{category}.jsonl;
solver, parser, decomposer, frame-opener, and lexical surfaces remain
untouched.
11 KiB
ADR-0169.1 — MathCompositionClaimProposal Adapter
Status: Proposed (design bridge; no runtime CompositionClaim admission in this PR) Date: 2026-05-27 Author: Shay Parent: ADR-0169 Related: ADR-0057, ADR-0163, ADR-0164, ADR-0166, ADR-0167, ADR-0168, ADR-0168.1, ADR-0172
Context
ADR-0169 identified a required compatibility bridge before any CompositionClaim implementation can land.
ADR-0057 ordinary TeachingChainProposal eligibility requires a
reviewed source="corpus" evidence pointer. That is correct for
cognition teaching chains, where the claim is grounded in reviewed
teaching-corpus material.
Math-domain CompositionClaims originate elsewhere:
MathReaderRefusalEvidence / audit rows
— specifically the 20 rows in
evals/gsm8k_math/train_sample/v1/audit_brief_11.json under
refusal_reason="incomplete_operation" with missing_operator in
{"quantity_extraction", "multi_quantity_composition"}.
Those rows are legitimate evidence of a teachable composition gap, but they are not cognition corpus evidence and must never be laundered into cognition corpus pointers.
Therefore CompositionClaim cannot simply reuse ordinary
TeachingChainProposal as-is without either:
- weakening ADR-0057's reviewed-evidence floor, or
- falsely treating audit evidence as cognition corpus evidence.
Both are forbidden.
This ADR is structurally analogous to ADR-0168.1
(MathFrameClaimProposal). The same bridge logic applies, with the
data shape and evidence floor specialized to composition.
Decision
Choose a math-specific proposal/ratification adapter:
MathCompositionClaimProposal
instead of creating a reviewed math corpus artifact first.
This adapter preserves ADR-0057's discipline:
- append-only proposal log
- replay-equivalence/admissibility as precondition, not permission
- explicit operator review before mutation
- no deletion
- no auto-accept
- no active-pack mutation during replay
but gives math-domain audit evidence its own honest evidence floor.
Why not a reviewed math corpus first?
A reviewed math corpus may eventually be useful, but it is premature for the second math sub-type bridge (FrameClaim is the first; see ADR-0168.1).
Creating it now would require deciding:
- corpus schema
- corpus lifecycle
- corpus indexing semantics
- corpus replay integration
- whether frame evidence, slot evidence, composition evidence, and reference evidence share one corpus or separate corpora
- how accepted math evidence relates to pack manifests
That is a larger substrate decision than CompositionClaim needs.
The adapter remains narrower:
one claim type
one proposal surface
one replay gate
one operator acceptance boundary
It keeps the capability path moving without inventing a new corpus family before the need is proven across at least two sub-types (FrameClaim and CompositionClaim) and converged.
When (and only when) the third or fourth math sub-type adapter is needed, the case for collapsing them into a reviewed math corpus becomes load-bearing. Not yet.
Data shape
A future implementation should define a frozen, canonicalizable data shape similar to:
@dataclass(frozen=True, slots=True)
class MathCompositionClaimProposal:
proposal_id: str
claim_signature: str
surface_pattern: str # normalized structural pattern over bound slots
composition_category: str # must be in SAFE_COMPOSITION_CATEGORIES
polarity: Literal["affirms", "falsifies"]
evidence: tuple[MathReaderRefusalEvidence, ...]
replay_evidence: AdmissibilityReplayEvidence | None
review_state: Literal["pending", "accepted", "rejected", "withdrawn"]
operator_note: str
provenance: MathProposalProvenance | None
Mirror the structure of MathFrameClaimProposal (ADR-0168.1) exactly,
swapping surface_form / frame_category for surface_pattern /
composition_category.
This is deliberately not a TeachingChainProposal because its
evidence floor is not cognition corpus evidence.
It is also deliberately not a runtime composition registry entry. It is a proposal.
Evidence floor
A MathCompositionClaimProposal is eligible only if it has:
- at least one audit/refusal evidence pointer,
- a deterministic audit-row digest,
- a normalized claim signature,
- a known
missing_operatorsubtype mapping toCompositionClaim(i.e.quantity_extractionormulti_quantity_composition), - an allowlisted
composition_category(one ofSAFE_COMPOSITION_CATEGORIESfrom ADR-0169), boundary_clean=True, andpolarity in {"affirms", "falsifies"}.
Audit evidence must include enough provenance to replay the claim:
- case id
- sentence index
- frame index when available
- bound-slot tuple digest (the slot shape over which the composition pattern is asserted)
- missing operator
- refusal reason (
incomplete_operation) and refusal detail - recognized terms digest
- audit row canonical digest
The evidence pointer source must be a math-specific value such as:
source="math_audit"
It must not be source="corpus" unless and until a real reviewed
math corpus exists. This is the no-laundering trip-wire shared with
ADR-0168.1.
Replay gate
The adapter uses the math-domain replay gate:
run_admissibility_replay_gate
(the same gate used by MathFrameClaimProposal), parameterized by the
composition-pattern target artifact rather than the frame target
artifact.
Replay remains a precondition, not permission.
If replay regresses any protected metric (wrong == 0, refusal
stability, partition, determinism), the proposal auto-transitions to
rejected with an auto_rollback_regression note.
If replay passes, the proposal remains pending until explicit
operator review. This preserves ADR-0057's "replay is precondition,
not permission" rule.
Accepted proposal effect
Accepting a MathCompositionClaimProposal may only append (or propose
append) to a reviewed composition-pattern artifact:
language_packs/data/en_core_math_v1/compositions/{category}.jsonl
where {category} is one of the entries in SAFE_COMPOSITION_CATEGORIES.
It must not directly mutate:
- active runtime state
- solver code
- parser code
- decomposer code (heuristic changes are their own reviewed PR)
- graph verifier code
- arithmetic semantics
- frame-opener registries (FrameClaim's surface)
- lexical registries (LexicalClaim's surface)
- cognition corpus
- cognition packs
Acceptance should produce an append-only provenance record linking:
proposal_id -> claim_signature -> target artifact row -> reviewer
Idempotency
proposal_id must derive from canonical claim identity, not clock
time.
Recommended identity:
sha256(
domain
| subtype # "composition_claim"
| surface_pattern # normalized bound-slot shape
| composition_category
| polarity
| evidence_digest_set
)
Equivalent evidence should deduplicate. Adding a second audit row for the same claim may either:
- append evidence to the existing proposal record, or
- create a new event referencing the existing proposal id.
It must not create a second independent mutation opportunity for the same claim.
Calling apply_composition_claim() a second time on an already-ratified
proposal must raise AlreadyRatified (mirror
teaching/math_frame_ratification.py semantics).
Partition guarantees
The adapter is math-domain only.
It must not:
- consume cognition corpus evidence,
- emit cognition
TeachingChainProposalrecords, - append to cognition chains,
- read cognition semantic-domain classifiers,
- use cognition replay gates,
- be visible to cognition contemplation/proposal flows.
It may share infrastructure patterns from ADR-0057 and from
MathFrameClaimProposal (ADR-0168.1), but not evidence identity.
The partition test in the implementation PR
(tests/test_math_composition_ratification.py::test_partition_cognition_proposals_not_seen)
must mechanically pin that cognition TeachingChainProposal records
do not flow into the math composition handler and vice versa.
Trip-wires that close the ADR-0057 compatibility gap
The implementation PR must mechanically prove each of:
- No corpus laundering. The adapter emits
source="math_audit"and neversource="corpus". Pinned bytest_audit_evidence_not_laundered_as_corpus. - Append-only proposal log. No deletion path; rejected/withdrawn states are transitions, not removals.
- Replay is precondition, not permission. Replay pass leaves the
proposal
pending. Operator accept is required for mutation. - Replay regression auto-rejects. Any regression in
wrong, refusal stability, partition, or determinism flips the proposal torejectedwith anauto_rollback_regressionnote. - Deterministic proposal id.
proposal_idis derived from canonical claim identity; equivalent evidence produces equivalent ids across processes. - Active-pack bytes unchanged during replay. The replay gate must
not mutate
language_packs/data/en_core_math_v1/**byte content until operator accept lands. - No cross-domain emission. The handler does not produce cognition-domain artifacts.
- Allowlist enforcement. A
composition_categoryoutsideSAFE_COMPOSITION_CATEGORIESraisesWrongCompositionCategorybefore any provenance is written.
Acceptance gates for implementation
A future implementation PR must prove:
- deterministic claim signature
- deterministic proposal id
- duplicate evidence deduplication
- append-only proposal log behavior
- replay-gate selection = math admissibility replay
- replay pass leaves proposal pending, not accepted
- replay regression auto-rejects
- operator accept is required for mutation
- accept writes only the reviewed math composition target artifact
- active corpus and active pack bytes are unchanged during replay
- audit evidence is never serialized as cognition corpus evidence
- case 0050 remains safe under any synthetic ratification in the initial allowlist
- recognized-but-uninjectable remains refused unless fully admitted correctly
- multi-quantity initial-state cases (e.g. case 0042 with 3 quantities) do not silently collapse under an unproven aggregation
- subtractive composition does not silently swap minuend and subtrahend
Non-goals
This ADR does not implement:
- CompositionClaim runtime admission
- composition-pattern artifact schema (deferred to the implementation PR;
the JSONL layout under
language_packs/data/en_core_math_v1/compositions/is the artifact target but its row schema is not fixed here) - workbench rendering
- ReferenceClaim
- SlotClaim
- reviewed math corpus substrate
- automatic acceptance
- additional composition categories beyond the ADR-0169 initial allowlist
This is only the bridge decision that makes future CompositionClaim implementation compatible with ADR-0057.
Decision summary
Use a dedicated
MathCompositionClaimProposaladapter for math-domain CompositionClaim evidence. Preserve ADR-0057's replay/review discipline, but do not impersonate ADR-0057's cognition corpus evidence floor. Audit evidence stays audit evidence; operator-reviewed accepted proposals may later append to a reviewed math composition artifact under deterministic replay gates, scoped to theSAFE_COMPOSITION_CATEGORIESallowlist defined in ADR-0169.