calibrate-difficulty · git:20261020.17ad730 · 2026-10-20 · sha256 47675b4473234549

calibrate-difficulty git:20261020.17ad730A

Immutable. This exact content never changes and is served at /api/v1/blob/47675b4473234549.

---
name: calibrate-difficulty
description: Measure per-band model headroom from a local, source-bound run artifact before investing in training.
metadata:
  understudy:
    mode: interactive
    safety: local-first
    cli_required: false
---

# Calibrate difficulty

Use an existing local run artifact with explicit generic `band` labels. The
artifact is hashed and the report records that source binding. This is a
deterministic screening step: it makes no provider calls, never reads holdout
or customer data, and does not infer bands from benchmark-specific task IDs.

```bash
npm run build
node scripts/difficulty-calibration.mjs --run path/to/synthetic-run.json --out report.json
```

Scores at or above `0.95` are saturated only when the band has at least 10
scored rows; insufficient sample takes precedence and remains `caution`.
Only sufficiently sampled bands below the threshold are `measurable` and
`invest`. Keep fixture, split, scoring protocol, and source hash visible, and
use dev/train data for decisions—never holdout data.

## Safety Gates

- Use only a frozen, source-bound train/dev run. Never use holdout rows or make
  provider calls from this calibration step.
- Predeclare the saturation threshold and minimum sample. An undersized band is
  `insufficient_sample` even when its observed mean is perfect.
- Treat the report as a spend-routing screen, not promotion evidence or proof
  that a model can beat the incumbent.

## Resolve CLI

Build before invoking the repository-local script:

```bash
npm run build
node scripts/difficulty-calibration.mjs \
  --run path/to/source-bound-dev-run.json \
  --threshold 0.95 --min-sample 10 --out report.json
```

The script hashes the exact input bytes and writes a deterministic calibration
report apart from `generated_at`.