Implements ADR-0131's revision of the ADR-0120 expert-promotion
contract for mathematics_logic: replaces the single-benchmark
GSM8K-coverage check with a composite B1+B2+B3 requirement.
New module core/capability/composite_math_gate.py:
- evaluate_composite_math_gate(): pure function over already-
committed B-lane reports; handles heterogeneous report shapes
(B1/B2 counts vs B3 metrics); applies pinned thresholds
(correct_rate >= 0.95 AND wrong == 0); composes verdicts.
- Reproducible SHA-256 claim_digest over canonical evidence bundle.
- GSM8K honest-disclosure (admission/wrong/refused/substrate)
embedded in artifact but never gates per ADR-0131.
CLI: core capability math-expert-gate (added to core/cli.py).
Writes evals/math_expert_claims/v1/expert_claims_math_v1.json.
Empirical verdict on current main (post-PR #182/#183/#184/#185):
composite_gate_passed: True
B1_public: 185/185 wrong=0 rate=1.0000
B1_sealed: 14/14 wrong=0 rate=1.0000
B2_teaching_corpus: 40/40 wrong=0 rate=1.0000
B3_bounded_grammar: 50/50 wrong=0 rate=1.0000
GSM8K disclosure: 0/50 admission, wrong=0, substrate=candidate_graph
The math expert is gate-passing under ADR-0131's revised composite
contract. The architectural bet ADR-0131 placed has paid off.
Honest scope-limit: this implements only the ADR-0131-specific
revision (composite benchmark portion). The full ADR-0120 10-
obligation contract still requires substrate for 5 missing
obligations (OOD ratio, perturbation, depth curve, adversarial,
operation-provenance-via-pack). Those are sequencing-wise *after*
ADR-0131.4, not bundled. Reviewer signature via ADR-0092 registry
is also reserved.
Trust boundary: read-only access to 5 committed lane reports;
single deterministic write to the artifact path. No dynamic
imports, no recomputation of lane verdicts.
Tests: 12/12 in tests/test_adr_0131_4_composite_math_gate.py
covering threshold pinning, heterogeneous shape handling, gate
logic (passing + every failure mode), GSM8K honest disclosure
(never gates), determinism (claim_digest + artifact byte-equality),
and a snapshot test confirming current main satisfies the gate.
ADR-0131.4 module note: the parent ADR-0131 plan named
formation/ratify.py + formation/promote.py as the wire-up site —
that was a misidentification (those govern teaching-example
SPECULATIVE→COHERENT bridging per ADR-0021, not domain-tier
promotion). Correct site is core/capability/, where audit-passed
gate already lives.
182 lines
7.6 KiB
Markdown
182 lines
7.6 KiB
Markdown
# ADR-0131.4 — Composite Math-Expert Promotion Gate (wired)
|
|
|
|
**Status:** Accepted
|
|
**Date:** 2026-05-23
|
|
**Author:** CORE main agent (Opus 4.7)
|
|
**Depends on:** ADR-0131 (composite gate framing),
|
|
ADR-0131.1 (B1 substrate), ADR-0131.1.S (B1 sealed holdout),
|
|
ADR-0131.2 (B2 substrate), ADR-0131.3 (B3 substrate),
|
|
ADR-0131.G.0 (probe substrate)
|
|
**Parent:** ADR-0131
|
|
**Reserved follow-up:** the full ADR-0120 contract (9 ADR-0114a
|
|
obligations not implemented yet for `mathematics_logic`).
|
|
|
|
---
|
|
|
|
## Context
|
|
|
|
ADR-0131 introduced the composite math-expert promotion contract:
|
|
|
|
> The `mathematics_logic` domain `expert` promotion contract is
|
|
> revised. The ADR-0120 single-benchmark check
|
|
> (`correct_rate ≥ 0.60` on GSM8K) is replaced by a composite
|
|
> requirement: B1 ≥ 0.95 AND B2 ≥ 0.95 AND B3 ≥ 0.95, each with
|
|
> `wrong == 0`. GSM8K is retained as a stress-test lane that the
|
|
> math expert runs but is not gated on — reported as honest
|
|
> disclosure.
|
|
|
|
ADR-0131's implementation plan (sub-phase `0131.4`) named
|
|
`formation/ratify.py` + `formation/promote.py` as the wire-up
|
|
points. That was a misidentification: those modules govern the
|
|
SPECULATIVE → COHERENT bridge for individual teaching examples
|
|
(ADR-0021), not domain-tier expert promotion. The correct site is
|
|
`core/capability/`, where `expert_demo.py` (the audit-passed gate)
|
|
already lives and where ADR-0120 reserves `expert_promotion.py`.
|
|
|
|
A full ADR-0120 implementation requires substrate for 10 ADR-0114a
|
|
obligations (sealed holdout, OOD ratio, replay determinism, typed
|
|
refusal + `wrong == 0`, perturbation, depth curve, frontier
|
|
comparison, adversarial, byte-equal lane runner, operation
|
|
provenance via pack). For `mathematics_logic`, only **5 of those
|
|
10 obligations** have substrate landed today:
|
|
- #1 sealed holdout (ADR-0131.1.S — B1 sealed)
|
|
- #3 replay-equal trace (B1/B2/B3 runners emit `trace_hash`)
|
|
- #4 typed refusal + `wrong == 0` (the load-bearing invariant
|
|
every G.<n> and B-lane has been preserving)
|
|
- #7 frontier-baseline comparison (ADR-0131.1.F)
|
|
- #9 determinism (every B-lane report is byte-equal across runs)
|
|
|
|
The other 5 (#2 OOD ratio, #5 perturbation, #6 depth curve, #8
|
|
adversarial, #10 operation-provenance-via-pack) need
|
|
domain-specific substrate that isn't built yet. Implementing those
|
|
is sequencing-wise *after* ADR-0131.4, not bundled with it.
|
|
|
|
## Decision
|
|
|
|
Implement only the **ADR-0131-specific revision** as a focused
|
|
module: the composite B1+B2+B3 evaluator. Structure it so a future
|
|
`core/capability/expert_promotion.py` implementing the full
|
|
ADR-0120 contract can consume it as the math-specific substitute
|
|
for the single-lane coverage check.
|
|
|
|
### What this ADR wires
|
|
|
|
`core/capability/composite_math_gate.py`:
|
|
|
|
```python
|
|
def evaluate_composite_math_gate(
|
|
*, b1_public_path, b1_sealed_path, b2_path, b3_path, gsm8k_probe_path,
|
|
) -> CompositeMathGateVerdict
|
|
```
|
|
|
|
- Reads each benchmark's already-committed `report.json` (no I/O
|
|
beyond that; no recomputation of lane verdicts).
|
|
- Handles the heterogeneous report shapes (B1/B2 use
|
|
`counts: {correct, wrong, refused}`; B3 uses `metrics: {correct,
|
|
wrong, cases_total, correct_rate}`). Refuses cleanly if the
|
|
shape is neither.
|
|
- Applies the pinned thresholds: `correct_rate ≥ 0.95` AND
|
|
`wrong == 0` per benchmark.
|
|
- Composes per-benchmark verdicts → composite verdict.
|
|
- Computes a reproducible SHA-256 claim digest over the canonical
|
|
evidence bundle (per ADR-0120 "Signed `expert_claims` entry with
|
|
reproducible digest" requirement).
|
|
- Emits GSM8K honest-disclosure (admission, wrong, refused,
|
|
substrate) but does NOT use it in the gate.
|
|
|
|
CLI wiring at `core capability math-expert-gate` (added to
|
|
`core/cli.py`). Writes
|
|
`evals/math_expert_claims/v1/expert_claims_math_v1.json` (unsigned).
|
|
Reviewer signature via ADR-0092 reviewer-registry is reserved for
|
|
the broader ADR-0120 wire-up.
|
|
|
|
### Empirical verdict
|
|
|
|
Run against current `main` (post-PR #182/#183/#184/#185, pre-G.1):
|
|
|
|
```
|
|
composite_gate_passed: True
|
|
claim_digest: 2bfc7f6c5b06a4c5befef3a9a2629a023518ae97490f6ddf092c1852c966c275
|
|
|
|
B1_public passed=True correct=185/185 wrong=0 rate=1.0000
|
|
B1_sealed passed=True correct=14/14 wrong=0 rate=1.0000
|
|
B2_teaching_corpus passed=True correct=40/40 wrong=0 rate=1.0000
|
|
B3_bounded_grammar passed=True correct=50/50 wrong=0 rate=1.0000
|
|
GSM8K honest disclosure: admission=0/50, wrong=0, substrate=candidate_graph
|
|
```
|
|
|
|
**The math expert is gate-passing under ADR-0131's revised
|
|
composite contract.** The bet ADR-0131 placed — that the
|
|
architecture's structural strengths align with three benchmarks
|
|
that measure those strengths — has paid off on first evaluation.
|
|
|
|
This does NOT mean the full ADR-0120 contract passes (5 of 10
|
|
obligations still need substrate). It means the *math-specific
|
|
revision portion* of the contract passes today, and the
|
|
architecturally-aligned bet was correct.
|
|
|
|
## What this does NOT do
|
|
|
|
- Does NOT implement the broader ADR-0120 10-obligation contract.
|
|
That requires substrate for 5 missing obligations (OOD ratio,
|
|
perturbation, depth curve, adversarial, operation-provenance).
|
|
- Does NOT promote `mathematics_logic` to `expert` ledger status.
|
|
Ledger promotion is a separate ADR that consumes this gate's
|
|
output AND the broader ADR-0120 obligations.
|
|
- Does NOT sign the `expert_claims` artifact. Reviewer signature
|
|
via ADR-0092 registry is reserved for the full wire-up.
|
|
- Does NOT touch `formation/ratify.py` or `formation/promote.py`
|
|
(the teaching-example-tier modules ADR-0131's plan
|
|
misidentified).
|
|
- Does NOT recompute the lane verdicts. The committed B-lane
|
|
reports are the gate's input contract; the lane runners own
|
|
their verdicts and the gate trusts them. If a reviewer suspects
|
|
a lane report is stale, re-run the lane.
|
|
|
|
## Trust boundary
|
|
|
|
- Reads only:
|
|
- `evals/math_symbolic_equivalence/v1/report.json` +
|
|
`sealed_report.json`
|
|
- `evals/math_teaching_corpus/v1/report.json`
|
|
- `evals/math_bounded_grammar/v1/report.json`
|
|
- `evals/gsm8k_math/train_sample/v1/train_sample_coverage_report.json`
|
|
(disclosure-only)
|
|
- Writes only: the path passed to `emit_expert_claims_artifact`
|
|
(default: `evals/math_expert_claims/v1/expert_claims_math_v1.json`).
|
|
- No dynamic imports, no shell passthrough, no network.
|
|
- Pure function over already-committed JSON; deterministic
|
|
(verified by `test_claim_digest_reproducible` and
|
|
`test_artifact_emission_byte_equal`).
|
|
|
|
## Tests
|
|
|
|
`tests/test_adr_0131_4_composite_math_gate.py` — 12 tests:
|
|
- Threshold values are pinned (changing requires a new ADR)
|
|
- Both lane-report shapes parse correctly
|
|
- Gate passes iff all 4 benchmarks pass
|
|
- Gate refuses cleanly on threshold miss, on wrong-count > 0, on
|
|
missing report
|
|
- GSM8K disclosure handled (present, missing, never gates)
|
|
- Claim digest reproducible (deterministic)
|
|
- Artifact emission byte-equal across calls
|
|
- Snapshot test: committed main state satisfies the composite gate
|
|
|
|
12/12 pass in 0.22s.
|
|
|
|
## CLAUDE.md PR-checklist
|
|
|
|
- **Capability added:** wires the ADR-0131-specific composite
|
|
benchmark evaluator at the right architectural layer
|
|
(`core/capability/`); makes the math-expert promotion verdict
|
|
computable, reproducible, and CLI-callable.
|
|
- **Invariant proving field validity:** every B-lane's
|
|
`wrong == 0` is preserved (the gate gates on it); GSM8K probe
|
|
`admitted_wrong == 0` preserved.
|
|
- **CLI/eval proving the lane:**
|
|
`python3 -m core.cli capability math-expert-gate` +
|
|
`pytest tests/test_adr_0131_4_composite_math_gate.py`.
|
|
- **Avoided hidden normalization / stochastic / approximate /
|
|
unreviewed mutation:** Yes. Pure function over committed JSON.
|
|
- **Trust boundary:** read-only inputs, single deterministic write
|
|
to a documented artifact path.
|