core/docs/decisions/ADR-0131.4-composite-math-gate.md
Shay 4b59f3daf7 feat(ADR-0131.4): composite math-expert promotion gate — wired, evaluated, PASSING
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.
2026-05-23 15:23:14 -07:00

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.