Glossary

June 10, 2026 · View on GitHub

A single reference for every term the benchmark docs use without expanding it. The EXPLAINER.md "Basic terms" table is the read-this-first short version (replay mechanics); this is the full reference, and it adds the evidence-ladder vocabulary (byte-clean, byte-author, forgeable, net-new, additivity, the frontier cut, SSOT) that docs/158 and _results/additivity_claims.md lean on heavily.

Every definition here is grounded in the code it names — the detector grammar in benchmark/toolathlon/trajectory.py, the verdict vocabularies in src/dos/tool_stream.py / src/dos/dangling_intent.py, and the numbers in additivity.py. When a term has a canonical kernel definition, this entry is the benchmark-local gloss and points at the kernel module; the authoritative kernel-internal glossary lives in the repo-root CLAUDE.md ("Glossary — acronyms used in this contract").


1. The benchmark & data

TermWhat it means
ToolathlonAn external benchmark (ICLR 2026): 108 long-horizon tasks where an agent must use 600+ real tools across 32 apps (Gmail, Notion, k8s, WooCommerce…). Hard — the best model passes <40%. DOS did not build it; we replay its published trajectories.
Toolathlon-TrajectoriesThe published dataset of recorded runs: 7,116 records = 22 models × 3 runs × ~108 tasks. The frozen input to the whole study.
trajectoryThe full recorded transcript of one agent attempt at one task: every message, every tool call, every tool result. Parsed by trajectory.py:parse_record.
replayRunning DOS's detectors over the frozen trajectories offline ($0, no live env, no LLM). Because the runs are recordings, nothing can intervene — this measures DETECT, never FIX.
the third-party oracleToolathlon's OWN pass/fail judge (evaluation/main.py). It reads the real app state after the run (did the email actually send?) and returns true/false. Authored by Toolathlon, not by us — a verdict DOS cannot fake. An agent saying "I'm done" cannot make it pass. This is the label every detector is scored against.
replay_all_rows.csvThe durable per-run join: one row per trajectory, carrying the model, the oracle label, and each detector's fire bit. The single frozen artifact additivity.py recomputes every published number from. Has a content fingerprint (sha256:…) so a stale ledger vs a regenerated CSV is detectable.

2. The three detectors

All three are byte-clean (see below) and advisory — they REPORT, they never block, kill, or refuse. Each reads only environment-authored bytes (the tool-result content the MCP gateway produced), never the agent's narration about itself.

DetectorKernel moduleFires when…In one phrase
dangling_intentsrc/dos/dangling_intent.pythe agent's last message admits unfinished work ("I still need to update the rest…") AND nothing acted after it (no real tool ran).said it wasn't done, then stopped.
tool_streamsrc/dos/tool_stream.pythe same (tool, args, result_digest) triple recurs repeat_n times in a row — the agent re-asks a question the env keeps answering identically.spinning in place, learning nothing.
terminal_errortrajectory.py (terminal_error_fired, is_struct_error, TerminalErrorEvidence) — the docs/158 detectorthe agent stopped while the env's last word was a structured error (a crash, an MCP error -3xxxx, isError:true, a Traceback, a non-zero exit, a permission-denied) and no later result from the same tool recovered.walked away from a wall the env clearly reported.

3. The evidence-ladder vocabulary (the load-bearing terms)

These are the DOS-specific concepts that make a detector's verdict worth acting on. They are why terminal_error shipped and two tempting alternatives (hedge-scoring, claim-vs-narration) were rejected.

TermWhat it means
byte-authorWho actually produced the bytes a verdict reads. The single invariant of the whole trust model: a verdict is trustworthy only when its byte-author ≠ the judged agent. The env's tool results are authored by the MCP gateway; the agent's narration is authored by the agent.
byte-cleanA detector is byte-clean iff it reads only bytes the judged agent did not author (env tool-results), never the agent's own claims about itself. The agent can't forge "the same result came back 3×" or "the env returned an error" — the env wrote those bytes. This is what makes a fire trustworthy. The canonical byte-clean field is tool_stream's result_digest; terminal_error's error-envelope has identical provenance.
forgeableThe opposite of byte-clean: a signal that reads agent-authored bytes (its narration tone, its self-described confidence). It shows fake recall on a frozen dataset and collapses to zero on deployment, because a model just learns to stop emitting the give-away phrase. The reason hedge-scoring and completion-without-verification were rejected (docs/158 §5).
mirror-verifier (trap)A "verifier" that checks one agent-authored thing against another agent-authored thing — e.g. the agent's claim vs the agent's last narration. It looks like effect-checking but has no env-authored operand, so it is consistency, not grounding. (docs/143 §5a, [[project-dos-byte-inequality-and-derivatives]].)
consistency ≠ groundingRe-deriving an author's OWN bytes proves consistency; checking against a DIFFERENT byte-author proves grounding. Only grounding crosses the trust floor.
structured error envelopeThe TIGHT grammar terminal_error matches — shapes, not loose substrings: MCP error -3\d{4}, "isError":true, a leading Error: node, a Traceback, a non-zero exited with code N, a permission denied. Anchored deliberately: a LOOSE match on the words error/failed/not found fires on legitimate env PAYLOAD (an arXiv abstract about "error rates", a "404" in fetched HTML) — measured at 69.4% false-alarm vs the tight grammar's 0.2% (a ~350× gap). The same tight-anchor discipline as the result_digest normalizer (docs/157 §4).
result_digesttool_stream's canonical byte-clean field: a digest of the env-authored tool-result content, normalized to strip volatile fields (timestamps, request-ids) so that semantically identical results compare equal. result_digest=None means errored/no-result and can never match another step (fail-safe).
ABSTAINThe safe non-answer. When evidence is insufficient or a transform is non-deterministic, a DOS adjudicator returns ABSTAIN rather than guessing — it can refute but never falsely affirm. (run_judge converts any raise/bad-return to ABSTAIN, never AGREE.)
derived_witness / believe_under_floorThe kernel seam (src/dos/evidence.py) for crossing the trust floor: a claim is believable only if its operands are themselves non-forgeable AND the deriving operation is declared AND the result matches. The $-tier live post-hoc re-read (docs/158 §6) is this with a THIRD_PARTY operand fetched on demand.

4. The metrics

TermDefinitionOurs
fire / fire-rateA detector "fires" when it flags a run. Fire-rate = fraction of all runs it flags.terminal_error 1.2%; the detectors are quiet by design.
precisionWhen it fires, how often is it right? = (fires that were real failures) ÷ (all fires).terminal_error 95.0%; trio union 92.6%.
recallOf all failures that happened, how many did it catch? = (failures flagged) ÷ (all failures). The low number.pair 4.74% → trio 6.18%.
base-fail-rateHow often runs fail anyway (the benchmark is hard). A detector that flagged everything would be "right" this often by luck — so precision must beat it to mean anything.76.2%.
liftprecision − base-fail-rate. "How much better than guessing."terminal_error +18.8pp.
false-alarm rateOf all passing runs, how many did it wrongly flag? = FP ÷ all passes. The precision cost of widening a detector.terminal_error 0.24%; loose grammar 69.4% (rejected).
TP / FP / FNTrue-positive (fired on a real failure) / false-positive (fired on a pass) / false-negative (a failure it missed). The confusion grid; here the FN cell dominates (most failures are silent).
DETECT vs FIXDETECT = does the detector spot failures? (measured, offline). FIX = if we warned the agent, would it then pass? (NOT measured — needs a live run, Phase 4). The whole study is DETECT.

5. The additivity story (docs/158)

The terms specific to "is terminal_error a distinct slice or a re-catch?" — recomputed by additivity.py and pinned by --check.

TermWhat it means
net-newA catch made by terminal_error that neither dangling_intent nor tool_stream made. The additivity headline: 75 of terminal_error's 76 catches are net-new (only 1 overlap) — a different failure mode, not redundancy.
additiveAdding the detector raises union recall because its catches are mostly net-new. Trio union recall 4.74% → 6.18% (+30% relative). Contrast a detector whose catches all overlap the existing pair (zero additivity).
union recall / union precisionThe metric for a set of detectors: a run is "caught" if any member fires. Union recall = caught-failures ÷ all-failures across the set; union precision = real-failure-fires ÷ all-fires across the set.
pair → trioShorthand for the before/after: the pair = dangling_intent + tool_stream (the docs/157 baseline); the trio = pair + terminal_error (the docs/158 result).
frontierA capability THRESHOLD, not a fixed model list: the models above a chosen Toolathlon pass-rate cut. Strong models fail quietly (no dangling cue, no visible loop), so the pair goes nearly silent there. The net-new count is threshold-sensitive, so docs/158 reports three honest cuts (top-4 / ≥0.30 / top-10 → +7 / +9 / +12).
the ≥0.30 cut (SSOT default)The default frontier cut used by fig6 and the ledger: the 8 models with pass-rate ≥ 0.30. On it, the pair catches 6 and terminal_error adds 9 net-new.
"additive, not first"The honesty correction baked into every frontier claim: tool_stream already catches some frontier failures (4 on the strongest models), so terminal_error is the first signal for the strong-model failures the pair misses, NOT the first DOS signal to reach the frontier at all. A stale draft over-claimed "22 net-new / pair 35" from a hand-picked 10-model set that no principled cut reproduces.
SSOT (single source of truth)additivity.py:compute() — the one function the figures, the ledger, and the 5 tests all consume, so no published number can drift. --check asserts 6 structural invariants and exits non-zero on drift; --emit writes the ledger with a CSV fingerprint.

6. The figures

FigureShows
figA_additivity_headlinethe two load-bearing claims: 75/76 catches net-new (left); union recall +1.43pp with precision flat + false-alarm cost on the twin axis (right).
figB_per_model_catchesall 22 models, capability-ascending; grey = caught by the pair, purple = terminal_error net-new; the shaded band = the ≥0.30 frontier.
figC_frontier_sensitivitythe honesty figure: net-new vs the capability cut (9 at ≥0.30 vs 22 at top-10, where o3 alone supplies 12), and per-model net-new ranked.
fig6_trio_additivitythe headline trio additivity at the ≥0.30 SSOT cut.
fig1fig5the docs/157 replay figures (purchase-vs-capability, per-model grid, Simpson, confusion, lift-vs-recall).

7. Kernel acronyms referenced in passing

These appear in the docs but belong to the kernel; full definitions in CLAUDE.md.

AcronymExpansion (benchmark-relevant sense)
DOSDispatch Operating System — the trust kernel whose detectors this benchmark replays.
MCPModel Context Protocol — the gateway that authored the tool-result bytes. "MCP error -3xxxx" is its JSON-RPC error code, the canonical structured error envelope.
§5a lineThe rule from tool_stream §5a: a byte-clean detector reads provenance-of-output, never a "is the agent succeeding?" satisfaction predicate. The line terminal_error had to stay inside.
EOGEnd-Of-Generation — the silent-failure ceiling: a run that ends with no error and no contradiction because the agent never re-read the state it claims it changed. The residual terminal_error can't reach (docs/158 §6).
ORACLE → JUDGE → HUMANthe trust ladder: deterministic verdict first, advisory non-deterministic adjudicator only on the residue, human only at the irreducible seed. The third-party oracle is the ORACLE rung; the rejected hedge-scorer would have been a forgeable JUDGE.