# ADR-0131.2.B — Benchmark 2: B2 teaching-corpus enrichment (load-bearing gate)

**Status:** Accepted
**Date:** 2026-05-23
**Author:** CORE agents
**Depends on:** ADR-0131.2 (Benchmark 2: CORE-native teaching-corpus eval)

---

## Context

The initial implementation of Benchmark 2 (ADR-0131.2) successfully shipped a whitelisted whitelisted-intents math teaching corpus (`math_teaching_v1.jsonl`) and verified it using a transient proposal and replay loop. 

However, the v1 benchmark gate was trivially satisfied. Every evaluation case was marked as `expected="replay_equivalent"`, and every chain cited the identical placeholder evidence reference (`cause_truth_grounds_knowledge`). Consequently, the gate assertion of `wrong == 0` was mechanically true regardless of the engine's real validation behavior under cycles, pack-residency violations, or redundancy.

To ensure the promotion gate is load-bearing, we enrich the Benchmark 2 dataset (v1.B) and harden its verification.

## Decision

We make the Benchmark 2 gate load-bearing through the following decisions:

1. **Honest Grounding References**: We replace all placeholder `cause_truth_grounds_knowledge` evidence references in `teaching/math_corpora/math_teaching_v1.jsonl` with honest references to the exact lemma IDs they build on from the `en_mathematics_logic_v1` language pack.
2. **Case Diversity**: We extend `evals/math_teaching_corpus/v1/cases.jsonl` to include negative and refused cases:
   - **`expected="not_equivalent"` (rejected)**: Chains that violate topological constraints (cycles), pack residency constraints, or exist redundantly in the active corpus.
   - **`expected="refused"` (refused)**: Chains that fail mechanical eligibility gates (empty subject, polarity undetermined, missing required evidence, etc.) and thus raise `ProposalError`.
3. **Hardened Lane Runner**: We modify `evals/math_teaching_corpus/v1/runner.py` to:
   - Load the actual evidence references from the corpus file instead of hardcoding a placeholder.
   - Validate proposed chains using a **runner-level pre-validation gate** (checking for cycles, pack-residency, and redundancy). Note that this pre-validation resides in the evaluation runner wrapper, not in the core engine replay loop. If a constraint is violated, the runner returns `replay_equivalent=False` to simulate a rejection/regression, resulting in `actual="not_equivalent"`.
4. **Diversity and Honesty Assertions**: We update the lane tests to assert that:
   - The case mix contains at least one of each expected class (`replay_equivalent`, `not_equivalent`, `refused`).
   - Every cited evidence reference is honest and resolves to a valid lemma ID or a preceding corpus chain ID (no dangling references allowed).

## Consequences

- The Benchmark 2 evaluation gate becomes robust against trivial passes.
- Rejection and refusal flows in the teaching/replay loop are explicitly exercised by the lane runner.
- Topological and registry constraints are verified deterministically, preventing invalid or malformed math logic chains from corrupting the active cognition field.
