# ADR-0119.6 — GSM8K Math Depth-Curve Measurement Harness

**Status:** Accepted
**Date:** 2026-05-23
**Author:** CORE agents + reviewers
**Depends on:** [ADR-0114a](file:///Users/kaizenpro/.gemini/antigravity/worktrees/core/adr-0119-depth-curve-harness/docs/decisions/ADR-0114a-anti-overfitting-proof-obligations.md), [ADR-0119](file:///Users/kaizenpro/.gemini/antigravity/worktrees/core/adr-0119-depth-curve-harness/docs/decisions/ADR-0119-gsm8k-eval-lane-roadmap.md), [ADR-0119.2](file:///Users/kaizenpro/.gemini/antigravity/worktrees/core/adr-0119-depth-curve-harness/docs/decisions/ADR-0119.2-gsm8k-eval-corpus-dev-public.md)

---

## Context

[ADR-0114a](file:///Users/kaizenpro/.gemini/antigravity/worktrees/core/adr-0119-depth-curve-harness/docs/decisions/ADR-0114a-anti-overfitting-proof-obligations.md) (Obligation #6) requires publishing a compositional-depth vs. accuracy curve for any domain promoting to `expert`. Accuracy as a function of reasoning depth must not decay sharply (a pattern-matcher decays; a reasoning system stays flat within ε).

With the GSM8K-style eval corpus splits authored ([ADR-0119.2](file:///Users/kaizenpro/.gemini/antigravity/worktrees/core/adr-0119-depth-curve-harness/docs/decisions/ADR-0119.2-gsm8k-eval-corpus-dev-public.md)) and the lane runner developed ([ADR-0119.3](file:///Users/kaizenpro/.gemini/antigravity/worktrees/core/adr-0119-depth-curve-harness/evals/gsm8k_math/runner.py)), we must ship the measurement harness that implements this curve calculation from a lane report and a case set. This fulfills the measurement-side requirement of Obligation #6.

---

## Decision

We introduce a measurement harness and CLI hook to calculate and print the depth-vs-correctness curve.

### Implementation Details

- **Module:** [depth_curve.py](file:///Users/kaizenpro/.gemini/antigravity/worktrees/core/adr-0119-depth-curve-harness/evals/gsm8k_math/scoring/depth_curve.py)
- **Exposed Function:**
  ```python
  def compute_depth_curve(cases: list[dict], lane_report: LaneReport) -> dict[str, Any]
  ```
  Returns:
  ```json
  {
    "buckets": {
      "depth_1": {"total": N, "correct": M, "rate": float},
      "depth_2-3": {"total": N, "correct": M, "rate": float},
      "depth_4-5": {"total": N, "correct": M, "rate": float},
      "depth_6-8": {"total": N, "correct": M, "rate": float}
    },
    "max_depth": int,
    "raw_curve": [
      {"depth": 1, "total": N, "correct": M, "rate": float},
      ...
    ]
  }
  ```
- **Bucket key format:** `depth_1` for single integers; `depth_2-3`, `depth_4-5`, `depth_6-8` for the documented buckets matching the corpus distribution.
- **Empty bucket safety:** Rate is initialized/defaulted to `0.0` if a bucket has zero cases (preventing NaN or division-by-zero exceptions).
- **CLI hook:** Invoking `python3 -m evals.gsm8k_math.scoring.depth_curve --split dev|public` executes the lane runner on the chosen split and prints the resulting JSON.

---

## Invariants

- **Determinism:** Given the same cases and lane report, `compute_depth_curve` outputs byte-identical results.
- **Completeness:** The sum of totals in `buckets` equals the total number of cases.
- **Correctness:** The sum of correct cases in `buckets` equals the overall correct case count in the lane report.

---

## Acceptance Evidence

Accepted when:
- The module [depth_curve.py](file:///Users/kaizenpro/.gemini/antigravity/worktrees/core/adr-0119-depth-curve-harness/evals/gsm8k_math/scoring/depth_curve.py) is present and functional.
- The tests in [test_adr_0119_6_depth_curve.py](file:///Users/kaizenpro/.gemini/antigravity/worktrees/core/adr-0119-depth-curve-harness/tests/test_adr_0119_6_depth_curve.py) pass cleanly, validating:
  - Determinism across runs.
  - Bucket totals sum to total cases.
  - Bucket correct counts sum to total correct.
  - Empty bucket safety (no NaN/exceptions, rate defaults to `0.0`).
  - Correct totals when evaluated against the public split (150 cases total, bucket distribution 15/45/45/45).
  - Correct totals on combined splits matching the documented 20/60/60/60 distribution.
  - Successful execution of the curve flatness ratio calculation.

---

## Consequences

- The GSM8K-math evaluation lane now has a standard, deterministic measurement harness to construct the depth curve required by [ADR-0114a](file:///Users/kaizenpro/.gemini/antigravity/worktrees/core/adr-0119-depth-curve-harness/docs/decisions/ADR-0114a-anti-overfitting-proof-obligations.md).
- The measurement-side of Obligation #6 is fully discharged for GSM8K-math.

---

## Out of Scope

- Setting a specific numeric threshold ε for curve flatness (reserved for the promotion contract [ADR-0120](file:///Users/kaizenpro/.gemini/antigravity/worktrees/core/adr-0119-depth-curve-harness/docs/decisions/ADR-0120-expert-promotion-contract.md)).
