What it scores — and what it lost
Three arms, the same 150 LongMemEval questions, the same answer model and prompt — so the comparison measures the memory layer, not the reader. Every number on this page is recomputed at build time from the judged rows, and every one of them opens those rows. The cells Errata loses are printed as losses.
Counting all 450 rows including abstention, the same runs read Errata 66.7, naive 56.2, full-context 54.0. What the accuracies above cost to produce:
Runs of record — the full provenance
The three arms, same questions, same answer prompt
| Arm | Overall | Info. extraction | Multi-session | Temporal | Knowledge update | Abst. P / R | Ctx tok/Q | $/Q† | p50 / p95 (s)† |
|---|---|---|---|---|---|---|---|---|---|
| ErratarerunJ-arith | 60.0 ± 0.0216/360 | 44.7 ± 0.051/114 | 67.7 ± 0.063/93 | 51.5 ± 0.051/99 | 94.4 ± 0.051/54 | 0.49 / 0.93tp 84 · fp 87 | 2,532 | $0.0000 | 0.26 / 1.28 |
| Full-context baselinererunB-nothink | 47.5 ± 0.8171/360 | 80.7 ± 1.592/114 | 35.5 ± 3.233/93 | 13.1 ± 1.713/99 | 61.1 ± 0.033/54 | 0.58 / 0.80tp 72 · fp 52 | 109,943 | $0.0110 | 8.00 / 8.68 |
| Naive top-k RAG (k=10)rerunC-nothink | 45.8 ± 0.0165/360 | 63.2 ± 0.072/114 | 29.0 ± 0.027/93 | 21.2 ± 0.021/99 | 83.3 ± 0.045/54 | 0.41 / 0.98tp 88 · fp 128 | 4,665 | $0.0005 | 0.86 / 1.34 |
Overall and the four ability columns are accuracy over the 120 non-abstention questions; the ± is the sample sd across the three seeds, which is provider nondeterminism rather than sampling spread — Errata and the naive arm are bit-identical across seeds, which is what their ± 0.0 means. Abstention is scored deterministically by exact match and never reaches the judge. † $/Q and latency are the two columns not recomputed from these rows: Errata’s are measured on rerunF-wave, the last cold-cache run, because rerunJ-arith replayed 447 of 450 answers from cache and would flatter both. Errata’s $/Q is $0.0000257, not zero — the column rounds to four decimals.
The honest gap, kept next to the headline
Information extraction is the one column Errata loses, and it loses it badly: 44.7 against full-context’s 80.7. Cut by the corpus’s own question types rather than by ability — which folds the three single-session types into one column and hides where the deficit is — the entire remaining deficit is 22 of 150 questions.
| question_type | n | errata | full-context | naive |
|---|---|---|---|---|
| single-session-user | 22 | 100.066/66 | 100.066/66 | 77.351/66 |
| single-session-assistant | 14 | 7.13/42 | 92.939/42 | 92.939/42 |
| single-session-preference | 8 | 0.00/24 | 20.85/24 | 0.00/24 |
| multi-session | 43 | 72.193/129 | 46.560/129 | 47.361/129 |
| temporal-reasoning | 39 | 59.069/117 | 23.928/117 | 33.339/117 |
| knowledge-update | 24 | 95.869/72 | 62.545/72 | 87.563/72 |
Both losing rows are write-path gaps — the fact is not in the graph to retrieve — and the first is a priced decision, not a modelling result: lifting the extraction cap that drops long enumerated assistant answers was measured at $20.72 to re-extract the 150 histories against the $4.19 the shipped configuration cost. A $0 deterministic recall pass aimed at the same gap was built, applied, measured, and reverted — it is the second row of the table below. The account is in eval/RESULTS.md.
What we published that lost
Two changes were built in full, judged in full, and rejected by their own measurement. They are printed here with the shipped run, at the same size, because a result you only publish when it wins is not a result. These rows are counted over all 450 rows of each Errata wave.
| Run | What changed | All-450 | answered | answered-prec. | Ctx tok/Q | Verdict |
|---|---|---|---|---|---|---|
| rerunG-max45 | widen the material window, 30 → 45 claimsthe extra claims are distractors, not evidence — answered rose and answered-precision fell, so the window was never the binding constraint | 60.0 | 285 | 66.3% | 3,670 | REJECTED |
| rerunH-typed | a $0 deterministic typed-fact recall pass — 34,684 claims appended at zero LLM cost, 0 supersessions mintedtyped claims took 27% of the 30-claim window and displaced better evidence; on the case that motivated it all four addends were already in the window and the reader added them wrong — arithmetic, not recall | 62.7 | 291 | 68.0% | 2,519 | REJECTED |
| rerunI-restored | restore the graph from the pre-apply snapshot and re-run all 450 rowsthe revert is verified rather than asserted — the restored build answers identically to the build that earned the published number | 65.3 | 279 | 75.3% | 2,521 | VERIFIED |
| rerunJ-arith | the graph does the sum, not the prompt — question-scoped arithmetic over the material’s amounts, no model callshipped: three answers changed, two of them from INCORRECT to CORRECT and none the other way; `answered` is identical at 279, so nothing was bought by answering more | 66.7 | 279 | 77.4% | 2,532 | SHIPPED |
The baseline both rejections were measured against is rerunF-wave at 65.3. The revert is verified rather than asserted: rerunI-restored differs from it in 0 of 450 answers, which is checked here against the artifacts on every test run.
The three answers that moved, and which way
rerunF-wave → rerunJ-arith, seed 11. Two flipped to CORRECT, one stayed wrong and is printed anyway.
- 2b8f3739$565→$465INCORRECT → INCORRECT
- 85fa3a3f$45→$50INCORRECT → CORRECT
- d851d5ba$2,750→$3,750INCORRECT → CORRECT
The judge was validated before the table was believed
Scored on the committed 120-item control set: 60 perturbed negatives and 60 paraphrase positives, with the judge itself frozen. The overall figure was 15.0% before a disclosed control-set revision that fixed seven defective controls — the revision was made by a predicate over the gold, never by a list of question ids, because selecting controls by the verdict they received is how a control set gets quietly tuned. An unparseable verdict counts as a rejection, which can only hurt FAR’s sibling FRR and never flatter FAR; the other end of that envelope is 18.3% overall and 75.0% on attribution-flip, and it belongs in the same paragraph. Full account: eval/judge-validation.md · open all 120 controls →
τ was not fitted
The abstention gate stays at its a-priori 0.35. Every abstention-positive question the corpus owns is inside the reported test set by design, so a fitted τ would be in-sample and saying otherwise would be false. A sensitivity sweep ships instead: overall is 66.7 flat across τ ∈ [0.20, 0.35] — a plateau, not a knife edge.
| τ | overall % | answered | answered-prec. % | abstention P | abstention R |
|---|---|---|---|---|---|
| 0.20 | 66.7 | 279 | 77.4 | 0.49 | 0.93 |
| 0.25 | 66.7 | 279 | 77.4 | 0.49 | 0.93 |
| 0.30 | 66.7 | 279 | 77.4 | 0.49 | 0.93 |
| 0.35 — shipped | 66.7 | 276 | 78.3 | 0.48 | 0.93 |
| 0.40 | 65.3 | 270 | 77.8 | 0.47 | 0.93 |
| 0.45 | 63.3 | 255 | 78.8 | 0.43 | 0.93 |
| 0.50 | 59.3 | 219 | 82.2 | 0.38 | 0.97 |
| 0.55 | 48.0 | 147 | 87.8 | 0.29 | 0.97 |
The sweep is deterministic and model-free — it treats τ as a veto on the recorded synthesis answers — so it is recomputed here from the same rows the table above is counted from, and it reproduces the committed eval/out/tau-sweep-arith.md line for line.
reproduce · uv run errata-eval parity · uv run errata-eval run --arm errata --seeds 11,22,33 --run-id rerunJ-arith · uv run errata-eval judge --run rerunJ-arith · uv run errata-eval report --runs rerunJ-arith rerunB-nothink rerunC-nothink