v3.0.0 — The region field
Milestone: the region field (ADR-014). The roadmap's planned breaking change: output becomes {category, operational_domain, region} — six labels (indo-pacific, europe, middle-east, africa, americas, global), with global as the single catch-all for no-anchor and multi-region stories, mirroring multi on the domain axis.
The numbers (n=54, human answer key — evals/gold_eval_v3.txt)
| Axis | Accuracy | Judge vs human |
|---|---|---|
| Category | 92.6% | 92.6% |
| Operational domain | 92.6% | 98.1% |
| Region | 87.0% | 100.0% |
The 100.0% judge-vs-human region agreement clears ADR-014's gate for the scaled (n=300) region eval in a future v3.1.0. The region misses are one named cluster: all seven are gold=global rows the model pulled to a specific region — it infers a theater from the US actor where the rubric's no-guessing rule says no anchor (evals/gold_confusion_v3.md names every row).
How the gold labels earned trust
The 54-row gold set gained a hand-labeled region column, owner-reviewed row by row — and then every label on all three axes was adversarially verified against each snippet's source article (one verifier per row, adversarial skeptics on challenges, a cross-row consistency audit). Category and domain survived 108/108; region took two review corrections before anything was measured against it. The labeling conventions are recorded in data/gold/README.md.
Also in this release
- Measured CI floors for region —
region_accuracy 0.78,judge_region_agreement 0.93, both derived from the live run (never aspirational); the gate now grades all eight floors against the committed v3 snapshot. Deliberately no region macro-F1 floor (europesupport is n=1). - Frozen v2 records — all v3 eval outputs use new
_v3filenames; the v2 snapshots behind the published two-axis numbers are never regenerated. - Live-pass hardening — the strict-mode guarantee blipped three times in the wild (the API returned a tool input missing required fields despite
strict: true; identical replays were clean), so the eval harness retries transientInvalidLabelErrors with bounded backoff, and interrupted runs now print a PARTIAL RUN banner instead of clean-looking fractional results.
Breaking-change note for integrators: the /classify response now carries a required region field, and the SYS-004 contract literals moved with it.
Full detail: CHANGELOG 3.0.0