# ADR-0119.2 — GSM8K Eval Corpus Dev/Public Splits

**Status:** Accepted
**Date:** 2026-05-22
**Author:** CORE agents + reviewers
**Depends on:** ADR-0114, ADR-0114a, ADR-0115, ADR-0116, ADR-0117, ADR-0119

---

## Context

ADR-0114 §Phase 5 designates the actual GSM8K test set as a **SEALED HOLDOUT** — to never be read during development to prevent contamination and overfitting. Consequently, we cannot use GSM8K problems directly for our own dev/public splits.

To measure mathematical reasoning capabilities during development, we require original, GSM8K-style math problems that use our own vocabulary and grammar (defined in ADR-0115). This ADR authors 200 CORE-original math problems (50 for dev, 150 for public splits) to serve as local benchmarks.

---

## Decision

We have authored and verified 200 GSM8K-style math word problems using the CORE vocabulary and grammar:
- **`evals/gsm8k_math/dev/cases.jsonl`**: 50 cases (`gma-001` through `gma-050`).
- **`evals/gsm8k_math/public/v1/cases.jsonl`**: 150 cases (`gma-101` through `gma-250`).
- **`evals/gsm8k_math/holdouts/v1/cases.jsonl`** / **`cases_plaintext.jsonl`**: Left empty; these will contain the sealed holdout in a future phase.

### Scope Expansion
Compared to the Phase 1.1 seed cases, the authored set expands scope as follows:
- **Reasoning depth**: 1-8 steps (vs Phase 1.1's 1-3).
- **Multi-entity complexity**: Up to 5 entities with realistic interactions (transfers, divides, multiplies, etc.).
- **Supported operations**: add, subtract, transfer, multiply, divide.

### Constraints Enforced
All cases enforce the rules specified in Phase 1.1:
- No conditional / time-modal phrasing
- No rate/per-unit pricing requiring inference
- No compound questions / multiple unknowns
- No implicit-entity / generic plural
- No metaphor or mixed units within one entity
- No numeric magnitude beyond integer scope
- No non-CORE-current-grammar constructions

### Verification Script
We added `evals/gsm8k_math/verify.py` which loads all 200 cases and verifies that:
1. `parse_problem(case["problem"])` successfully parses to a graph.
2. The parsed graph matches the ground-truth graph byte-for-byte.
3. The solver yields `answer_value == expected_answer`.
4. The solver yields `answer_unit == expected_unit`.

---

## Invariants

### `adr_0119_2_sealed_holdout_untouched`
The actual GSM8K holdout test set remains completely unread and sealed. No GSM8K test cases overlap with this original corpus.

### `adr_0119_2_perfect_parser_solver_resonance`
All 200 cases parse and solve to the expected answer and unit exactly.

### `adr_0119_2_distribution_balanced`
The authored corpus strictly adheres to the target depth and operation distributions:
- Depth 1: 20 cases
- Depth 2-3: 60 cases
- Depth 4-5: 60 cases
- Depth 6-8: 60 cases
- Each operation appears at least 30 times.
- At least 80 cases contain 2+ entities.

---

## Acceptance Evidence

This ADR is accepted when:
- `verify.py` completes successfully and prints `200/200 OK` with the correct distributions:
  ```text
  --- Verification Stats ---
  Cases parsed and solved successfully: 200/200
  Depth distribution: {1: 20, '2-3': 60, '4-5': 60, '6-8': 60}
  Operation distribution: {'transfer': 109, 'divide': 155, 'multiply': 193, 'subtract': 165, 'add': 237}
  Multi-entity cases: 111

  200/200 OK
  ```

---

## Consequences

- The `gsm8k_math` evaluation lane has high-coverage dev and public splits, unblocking solver benchmarking.
- The sealed holdout remains uncontaminated.
- Regression testing of math solving capabilities is now locally automated.
