What is an MCP server's tooling worth, and to which model?

The benchmark measures how well an agent turns a prose question into a correct SPARQL answer over the Proto-OKN federation, and how much of that success comes from the server's tooling rather than from the model. This study asks the follow-up: the tooling is worth something — but worth it to whom?

Three models — Opus 5, Sonnet 5, Haiku 4.5 — answer the same twelve cross-graph questions under the same three conditions, three attempts each: 324 episodes, none blocked.

Condition What the agent has KG named
KG namedthe server's full toolkityes
KG not namedthe server's full toolkitno
−6 toolsthe toolkit minus six discovery toolsyes

The six withheld from the ablated arm are get_description, get_query_template, get_schema, list_graphs, route_query and visualize_schema — the tools an agent would use to find out what a graph contains before querying it. Withholding is enforced at the proxy, so a remembered tool name cannot be called anyway.

Each model ran at its own default reasoning effort — high for Opus, medium for Sonnet, and the CLI default for Haiku, which was run without an --effort flag — so this compares the three as they come configured.

The headline: the three models fail in three different places. Opus is nearly flat across all three conditions; Sonnet collapses when the graph is not named; Haiku never reaches the point where the tooling could help it.

Every figure and table here comes from runs-opus-cross/, runs-sonnet-cross/ or runs-haiku-cross/, and can be traced to summary.csv (one row per attempt) or conditions/*.json (settings, provenance and aggregates) in those directories. The same study read question by question is in QUESTIONS.md; how the figures are built and rebuilt is in README.md.


1. Methods

Corpus. 12 .rq files (benchmarks-cross/ in this repo), all on the cross tier. Each pairs a prose #+ summary: — the prompt given to the agent — with a SPARQL answer key. The summary states every limit and tie-breaker, so the result set is fully determined by the prose. The summary never names the knowledge graph; choosing it is half the task.

Knowledge graphs. Each question joins a different pair, so twelve joins are exercised:

biobricks-aopwiki × spoke-genelabbiomarkerkg × biobricks-aopwikidigcfdekg × rdkg
gene-expression-atlas-okn × pankgraphncipidkg × proknnde × spoke-okn
oard-kg × biomarkerkgpankgraph × proknprokn × spoke-okn
rdkg × oard-kgspoke-genelab × gene-expression-atlas-oknspoke-okn × digcfdekg

The ablated arm withholds six discovery tools from an otherwise-full toolkit: get_description, get_query_template, get_schema, list_graphs, route_query, visualize_schema. Withholding is enforced at the proxy on both halves of the protocol, so a remembered tool name cannot be called anyway, and every refusal is recorded.

Why there is no baseline arm. The obvious control would be a SPARQL-only arm — one neutral query tool, no server, no instructions. It cannot be used here, because it cannot be run with the graph unnamed. An agent has no way to address the federated endpoint without the list of valid graph names, and once it has that list it recognizes the graph a question is about rather than having to work it out. The control would therefore sit permanently on the "KG named" side and could never provide the other half of the comparison.

None of the comparisons need it. Full toolkit against ablated toolkit measures what the six tools add; graph named against graph not named measures what naming it saves. Both are differences between arms that exist.

Agents. Three attempts per question, driven through claude -p 2.1.234, with a 900s per-episode timeout:

Model Resolved Effort
claude-opus-5claude-opus-5high
claude-sonnet-5claude-sonnet-5medium
claude-haiku-4-5-20251001claude-haiku-4-5default (no flag)

Each model ran at its own default reasoning effort — high for Opus, medium for Sonnet, and the CLI default for Haiku, which was run without an --effort flag. The comparison is therefore between the three as they come configured, rather than at a single effort level held across them. The figures label these effort high, effort medium and effort default.

Isolation. A proxy sits between the agent and the server: it filters the tool set, strips or forwards the server's instructions, injects the answer channel and times every call. Each episode runs in an empty scratch directory with no settings sources, no skills and no delegation tools, so nothing but the tools under test can reach the data.

Ground truth. Answer keys are executed against the Proto-OKN federation endpoint; the rows are cached and fingerprinted per question, so editing a key invalidates only that question.

Execution. Strictly serial — timings are meaningless under contention.

2. How answers are scored

Answers are compared by denotation, not by SELECT clause: column names and column order are ignored, so an answer is free to name its variables however it likes. Where it does use the reference's column names, values are matched column by column, which catches a row that swaps two same-typed fields. Two further adjustments make comparison fair across engines — IRI normalization to local names, and a numeric tolerance for computed decimals.

Four numbers appear below and must not be conflated:

precision = matching rows ÷ rows the answer returned recall = matching rows ÷ rows the key returned F1 = 2 · precision · recall ÷ (precision + recall)

A row matches only if it agrees cell for cell, after the same two adjustments used for exactness — IRIs compared by local name where that is unambiguous, and decimals compared at 6 significant digits with a 0.0005 relative tolerance. When the answer uses exactly the reference's column names, cells are matched column by column; when it renames anything, the whole row is compared by denotation instead. Both sides empty scores 1.0; no overlap scores 0.0.

The reported figure is a mean of means: F1 is averaged across a question's attempts first, then across questions. So every question weighs the same regardless of how many attempts ran, and a question is not counted twice for being flaky.

Attempts exact, below, is ordered_exact — right rows and right order, the stricter of the two criteria and the one the figures' totals count. The order-insensitive exact is one higher for Sonnet and two higher for Haiku.


3. What each attempt produced

Outcome per Attempt, by Model — Cross Graph Corpus 324 episodes: three models x three conditions x twelve questions. Outcome per Attempt, by Model — Cross Graph Corpus right rows and order right rows, wrong order wrong rows hit the 900s timeout, no answer exact Opus 5 effort high KG named 34/36 Opus 5 · KG named · biobricks-aopwiki_cross · right rows and order Opus 5 · KG named · biobricks-aopwiki_cross · right rows and order Opus 5 · KG named · biobricks-aopwiki_cross · right rows and order Opus 5 · KG named · biomarkerkg_cross · right rows and order Opus 5 · KG named · biomarkerkg_cross · wrong rows Opus 5 · KG named · biomarkerkg_cross · wrong rows Opus 5 · KG named · digcfdekg_cross · right rows and order Opus 5 · KG named · digcfdekg_cross · right rows and order Opus 5 · KG named · digcfdekg_cross · right rows and order Opus 5 · KG named · gene-expression-atlas-okn_cross · right rows and order Opus 5 · KG named · gene-expression-atlas-okn_cross · right rows and order Opus 5 · KG named · gene-expression-atlas-okn_cross · right rows and order Opus 5 · KG named · ncipidkg_cross · right rows and order Opus 5 · KG named · ncipidkg_cross · right rows and order Opus 5 · KG named · ncipidkg_cross · right rows and order Opus 5 · KG named · nde_cross · right rows and order Opus 5 · KG named · nde_cross · right rows and order Opus 5 · KG named · nde_cross · right rows and order Opus 5 · KG named · oard-kg_cross · right rows and order Opus 5 · KG named · oard-kg_cross · right rows and order Opus 5 · KG named · oard-kg_cross · right rows and order Opus 5 · KG named · pankgraph_cross · right rows and order Opus 5 · KG named · pankgraph_cross · right rows and order Opus 5 · KG named · pankgraph_cross · right rows and order Opus 5 · KG named · prokn_cross · right rows and order Opus 5 · KG named · prokn_cross · right rows and order Opus 5 · KG named · prokn_cross · right rows and order Opus 5 · KG named · rdkg_cross · right rows and order Opus 5 · KG named · rdkg_cross · right rows and order Opus 5 · KG named · rdkg_cross · right rows and order Opus 5 · KG named · spoke-genelab_cross · right rows and order Opus 5 · KG named · spoke-genelab_cross · right rows and order Opus 5 · KG named · spoke-genelab_cross · right rows and order Opus 5 · KG named · spoke-okn_cross · right rows and order Opus 5 · KG named · spoke-okn_cross · right rows and order Opus 5 · KG named · spoke-okn_cross · right rows and order KG not named 33/36 Opus 5 · KG not named · biobricks-aopwiki_cross · right rows and order Opus 5 · KG not named · biobricks-aopwiki_cross · right rows and order Opus 5 · KG not named · biobricks-aopwiki_cross · right rows and order Opus 5 · KG not named · biomarkerkg_cross · right rows and order Opus 5 · KG not named · biomarkerkg_cross · right rows and order Opus 5 · KG not named · biomarkerkg_cross · right rows and order Opus 5 · KG not named · digcfdekg_cross · right rows and order Opus 5 · KG not named · digcfdekg_cross · right rows and order Opus 5 · KG not named · digcfdekg_cross · right rows and order Opus 5 · KG not named · gene-expression-atlas-okn_cross · right rows and order Opus 5 · KG not named · gene-expression-atlas-okn_cross · right rows and order Opus 5 · KG not named · gene-expression-atlas-okn_cross · right rows and order Opus 5 · KG not named · ncipidkg_cross · right rows and order Opus 5 · KG not named · ncipidkg_cross · wrong rows Opus 5 · KG not named · ncipidkg_cross · wrong rows Opus 5 · KG not named · nde_cross · right rows and order Opus 5 · KG not named · nde_cross · right rows and order Opus 5 · KG not named · nde_cross · right rows and order Opus 5 · KG not named · oard-kg_cross · right rows and order Opus 5 · KG not named · oard-kg_cross · right rows and order Opus 5 · KG not named · oard-kg_cross · right rows and order Opus 5 · KG not named · pankgraph_cross · right rows and order Opus 5 · KG not named · pankgraph_cross · right rows and order Opus 5 · KG not named · pankgraph_cross · right rows and order Opus 5 · KG not named · prokn_cross · right rows and order Opus 5 · KG not named · prokn_cross · wrong rows Opus 5 · KG not named · prokn_cross · right rows and order Opus 5 · KG not named · rdkg_cross · right rows and order Opus 5 · KG not named · rdkg_cross · right rows and order Opus 5 · KG not named · rdkg_cross · right rows and order Opus 5 · KG not named · spoke-genelab_cross · right rows and order Opus 5 · KG not named · spoke-genelab_cross · right rows and order Opus 5 · KG not named · spoke-genelab_cross · right rows and order Opus 5 · KG not named · spoke-okn_cross · right rows and order Opus 5 · KG not named · spoke-okn_cross · right rows and order Opus 5 · KG not named · spoke-okn_cross · right rows and order KG named, −6 tools 32/36 Opus 5 · KG named, −6 tools · biobricks-aopwiki_cross · right rows and order Opus 5 · KG named, −6 tools · biobricks-aopwiki_cross · right rows and order Opus 5 · KG named, −6 tools · biobricks-aopwiki_cross · right rows and order Opus 5 · KG named, −6 tools · biomarkerkg_cross · wrong rows Opus 5 · KG named, −6 tools · biomarkerkg_cross · right rows and order Opus 5 · KG named, −6 tools · biomarkerkg_cross · right rows and order Opus 5 · KG named, −6 tools · digcfdekg_cross · right rows and order Opus 5 · KG named, −6 tools · digcfdekg_cross · right rows and order Opus 5 · KG named, −6 tools · digcfdekg_cross · right rows and order Opus 5 · KG named, −6 tools · gene-expression-atlas-okn_cross · right rows and order Opus 5 · KG named, −6 tools · gene-expression-atlas-okn_cross · right rows and order Opus 5 · KG named, −6 tools · gene-expression-atlas-okn_cross · right rows and order Opus 5 · KG named, −6 tools · ncipidkg_cross · right rows and order Opus 5 · KG named, −6 tools · ncipidkg_cross · right rows and order Opus 5 · KG named, −6 tools · ncipidkg_cross · wrong rows Opus 5 · KG named, −6 tools · nde_cross · right rows and order Opus 5 · KG named, −6 tools · nde_cross · right rows and order Opus 5 · KG named, −6 tools · nde_cross · right rows and order Opus 5 · KG named, −6 tools · oard-kg_cross · right rows and order Opus 5 · KG named, −6 tools · oard-kg_cross · right rows and order Opus 5 · KG named, −6 tools · oard-kg_cross · right rows and order Opus 5 · KG named, −6 tools · pankgraph_cross · right rows and order Opus 5 · KG named, −6 tools · pankgraph_cross · right rows and order Opus 5 · KG named, −6 tools · pankgraph_cross · right rows and order Opus 5 · KG named, −6 tools · prokn_cross · wrong rows Opus 5 · KG named, −6 tools · prokn_cross · right rows and order Opus 5 · KG named, −6 tools · prokn_cross · wrong rows Opus 5 · KG named, −6 tools · rdkg_cross · right rows and order Opus 5 · KG named, −6 tools · rdkg_cross · right rows and order Opus 5 · KG named, −6 tools · rdkg_cross · right rows and order Opus 5 · KG named, −6 tools · spoke-genelab_cross · right rows and order Opus 5 · KG named, −6 tools · spoke-genelab_cross · right rows and order Opus 5 · KG named, −6 tools · spoke-genelab_cross · right rows and order Opus 5 · KG named, −6 tools · spoke-okn_cross · right rows and order Opus 5 · KG named, −6 tools · spoke-okn_cross · right rows and order Opus 5 · KG named, −6 tools · spoke-okn_cross · right rows and order Sonnet 5 effort medium KG named 29/36 Sonnet 5 · KG named · biobricks-aopwiki_cross · right rows and order Sonnet 5 · KG named · biobricks-aopwiki_cross · right rows and order Sonnet 5 · KG named · biobricks-aopwiki_cross · right rows and order Sonnet 5 · KG named · biomarkerkg_cross · wrong rows Sonnet 5 · KG named · biomarkerkg_cross · right rows and order Sonnet 5 · KG named · biomarkerkg_cross · wrong rows Sonnet 5 · KG named · digcfdekg_cross · right rows and order Sonnet 5 · KG named · digcfdekg_cross · right rows and order Sonnet 5 · KG named · digcfdekg_cross · right rows and order Sonnet 5 · KG named · gene-expression-atlas-okn_cross · right rows and order Sonnet 5 · KG named · gene-expression-atlas-okn_cross · right rows and order Sonnet 5 · KG named · gene-expression-atlas-okn_cross · right rows and order Sonnet 5 · KG named · ncipidkg_cross · wrong rows Sonnet 5 · KG named · ncipidkg_cross · right rows and order Sonnet 5 · KG named · ncipidkg_cross · right rows and order Sonnet 5 · KG named · nde_cross · right rows and order Sonnet 5 · KG named · nde_cross · hit the 900s timeout, no answer Sonnet 5 · KG named · nde_cross · right rows and order Sonnet 5 · KG named · oard-kg_cross · right rows and order Sonnet 5 · KG named · oard-kg_cross · right rows and order Sonnet 5 · KG named · oard-kg_cross · right rows and order Sonnet 5 · KG named · pankgraph_cross · right rows and order Sonnet 5 · KG named · pankgraph_cross · hit the 900s timeout, no answer Sonnet 5 · KG named · pankgraph_cross · hit the 900s timeout, no answer Sonnet 5 · KG named · prokn_cross · wrong rows Sonnet 5 · KG named · prokn_cross · right rows and order Sonnet 5 · KG named · prokn_cross · right rows and order Sonnet 5 · KG named · rdkg_cross · right rows and order Sonnet 5 · KG named · rdkg_cross · right rows and order Sonnet 5 · KG named · rdkg_cross · right rows and order Sonnet 5 · KG named · spoke-genelab_cross · right rows and order Sonnet 5 · KG named · spoke-genelab_cross · right rows and order Sonnet 5 · KG named · spoke-genelab_cross · right rows and order Sonnet 5 · KG named · spoke-okn_cross · right rows and order Sonnet 5 · KG named · spoke-okn_cross · right rows and order Sonnet 5 · KG named · spoke-okn_cross · right rows and order KG not named 21/36 Sonnet 5 · KG not named · biobricks-aopwiki_cross · right rows and order Sonnet 5 · KG not named · biobricks-aopwiki_cross · right rows and order Sonnet 5 · KG not named · biobricks-aopwiki_cross · right rows and order Sonnet 5 · KG not named · biomarkerkg_cross · right rows and order Sonnet 5 · KG not named · biomarkerkg_cross · right rows and order Sonnet 5 · KG not named · biomarkerkg_cross · wrong rows Sonnet 5 · KG not named · digcfdekg_cross · right rows and order Sonnet 5 · KG not named · digcfdekg_cross · right rows and order Sonnet 5 · KG not named · digcfdekg_cross · right rows, wrong order Sonnet 5 · KG not named · gene-expression-atlas-okn_cross · wrong rows Sonnet 5 · KG not named · gene-expression-atlas-okn_cross · right rows and order Sonnet 5 · KG not named · gene-expression-atlas-okn_cross · right rows and order Sonnet 5 · KG not named · ncipidkg_cross · wrong rows Sonnet 5 · KG not named · ncipidkg_cross · wrong rows Sonnet 5 · KG not named · ncipidkg_cross · right rows and order Sonnet 5 · KG not named · nde_cross · right rows and order Sonnet 5 · KG not named · nde_cross · wrong rows Sonnet 5 · KG not named · nde_cross · right rows and order Sonnet 5 · KG not named · oard-kg_cross · hit the 900s timeout, no answer Sonnet 5 · KG not named · oard-kg_cross · right rows and order Sonnet 5 · KG not named · oard-kg_cross · hit the 900s timeout, no answer Sonnet 5 · KG not named · pankgraph_cross · right rows and order Sonnet 5 · KG not named · pankgraph_cross · hit the 900s timeout, no answer Sonnet 5 · KG not named · pankgraph_cross · right rows and order Sonnet 5 · KG not named · prokn_cross · right rows and order Sonnet 5 · KG not named · prokn_cross · hit the 900s timeout, no answer Sonnet 5 · KG not named · prokn_cross · hit the 900s timeout, no answer Sonnet 5 · KG not named · rdkg_cross · wrong rows Sonnet 5 · KG not named · rdkg_cross · wrong rows Sonnet 5 · KG not named · rdkg_cross · hit the 900s timeout, no answer Sonnet 5 · KG not named · spoke-genelab_cross · right rows and order Sonnet 5 · KG not named · spoke-genelab_cross · hit the 900s timeout, no answer Sonnet 5 · KG not named · spoke-genelab_cross · right rows and order Sonnet 5 · KG not named · spoke-okn_cross · right rows and order Sonnet 5 · KG not named · spoke-okn_cross · right rows and order Sonnet 5 · KG not named · spoke-okn_cross · right rows and order KG named, −6 tools 25/36 Sonnet 5 · KG named, −6 tools · biobricks-aopwiki_cross · right rows and order Sonnet 5 · KG named, −6 tools · biobricks-aopwiki_cross · wrong rows Sonnet 5 · KG named, −6 tools · biobricks-aopwiki_cross · right rows and order Sonnet 5 · KG named, −6 tools · biomarkerkg_cross · hit the 900s timeout, no answer Sonnet 5 · KG named, −6 tools · biomarkerkg_cross · wrong rows Sonnet 5 · KG named, −6 tools · biomarkerkg_cross · hit the 900s timeout, no answer Sonnet 5 · KG named, −6 tools · digcfdekg_cross · right rows and order Sonnet 5 · KG named, −6 tools · digcfdekg_cross · wrong rows Sonnet 5 · KG named, −6 tools · digcfdekg_cross · wrong rows Sonnet 5 · KG named, −6 tools · gene-expression-atlas-okn_cross · right rows and order Sonnet 5 · KG named, −6 tools · gene-expression-atlas-okn_cross · wrong rows Sonnet 5 · KG named, −6 tools · gene-expression-atlas-okn_cross · wrong rows Sonnet 5 · KG named, −6 tools · ncipidkg_cross · right rows and order Sonnet 5 · KG named, −6 tools · ncipidkg_cross · right rows and order Sonnet 5 · KG named, −6 tools · ncipidkg_cross · right rows and order Sonnet 5 · KG named, −6 tools · nde_cross · right rows and order Sonnet 5 · KG named, −6 tools · nde_cross · right rows and order Sonnet 5 · KG named, −6 tools · nde_cross · right rows and order Sonnet 5 · KG named, −6 tools · oard-kg_cross · right rows and order Sonnet 5 · KG named, −6 tools · oard-kg_cross · right rows and order Sonnet 5 · KG named, −6 tools · oard-kg_cross · right rows and order Sonnet 5 · KG named, −6 tools · pankgraph_cross · right rows and order Sonnet 5 · KG named, −6 tools · pankgraph_cross · right rows and order Sonnet 5 · KG named, −6 tools · pankgraph_cross · right rows and order Sonnet 5 · KG named, −6 tools · prokn_cross · right rows and order Sonnet 5 · KG named, −6 tools · prokn_cross · right rows and order Sonnet 5 · KG named, −6 tools · prokn_cross · right rows and order Sonnet 5 · KG named, −6 tools · rdkg_cross · hit the 900s timeout, no answer Sonnet 5 · KG named, −6 tools · rdkg_cross · right rows and order Sonnet 5 · KG named, −6 tools · rdkg_cross · right rows and order Sonnet 5 · KG named, −6 tools · spoke-genelab_cross · right rows and order Sonnet 5 · KG named, −6 tools · spoke-genelab_cross · right rows and order Sonnet 5 · KG named, −6 tools · spoke-genelab_cross · right rows and order Sonnet 5 · KG named, −6 tools · spoke-okn_cross · right rows and order Sonnet 5 · KG named, −6 tools · spoke-okn_cross · wrong rows Sonnet 5 · KG named, −6 tools · spoke-okn_cross · wrong rows Haiku 4.5 effort default KG named 13/36 Haiku 4.5 · KG named · biobricks-aopwiki_cross · wrong rows Haiku 4.5 · KG named · biobricks-aopwiki_cross · right rows and order Haiku 4.5 · KG named · biobricks-aopwiki_cross · right rows and order Haiku 4.5 · KG named · biomarkerkg_cross · wrong rows Haiku 4.5 · KG named · biomarkerkg_cross · wrong rows Haiku 4.5 · KG named · biomarkerkg_cross · wrong rows Haiku 4.5 · KG named · digcfdekg_cross · right rows and order Haiku 4.5 · KG named · digcfdekg_cross · right rows and order Haiku 4.5 · KG named · digcfdekg_cross · wrong rows Haiku 4.5 · KG named · gene-expression-atlas-okn_cross · wrong rows Haiku 4.5 · KG named · gene-expression-atlas-okn_cross · wrong rows Haiku 4.5 · KG named · gene-expression-atlas-okn_cross · wrong rows Haiku 4.5 · KG named · ncipidkg_cross · wrong rows Haiku 4.5 · KG named · ncipidkg_cross · wrong rows Haiku 4.5 · KG named · ncipidkg_cross · wrong rows Haiku 4.5 · KG named · nde_cross · right rows and order Haiku 4.5 · KG named · nde_cross · wrong rows Haiku 4.5 · KG named · nde_cross · right rows and order Haiku 4.5 · KG named · oard-kg_cross · right rows and order Haiku 4.5 · KG named · oard-kg_cross · wrong rows Haiku 4.5 · KG named · oard-kg_cross · hit the 900s timeout, no answer Haiku 4.5 · KG named · pankgraph_cross · hit the 900s timeout, no answer Haiku 4.5 · KG named · pankgraph_cross · right rows and order Haiku 4.5 · KG named · pankgraph_cross · hit the 900s timeout, no answer Haiku 4.5 · KG named · prokn_cross · right rows and order Haiku 4.5 · KG named · prokn_cross · wrong rows Haiku 4.5 · KG named · prokn_cross · wrong rows Haiku 4.5 · KG named · rdkg_cross · hit the 900s timeout, no answer Haiku 4.5 · KG named · rdkg_cross · right rows and order Haiku 4.5 · KG named · rdkg_cross · hit the 900s timeout, no answer Haiku 4.5 · KG named · spoke-genelab_cross · right rows and order Haiku 4.5 · KG named · spoke-genelab_cross · right rows and order Haiku 4.5 · KG named · spoke-genelab_cross · right rows and order Haiku 4.5 · KG named · spoke-okn_cross · wrong rows Haiku 4.5 · KG named · spoke-okn_cross · wrong rows Haiku 4.5 · KG named · spoke-okn_cross · wrong rows KG not named 8/36 Haiku 4.5 · KG not named · biobricks-aopwiki_cross · right rows and order Haiku 4.5 · KG not named · biobricks-aopwiki_cross · right rows and order Haiku 4.5 · KG not named · biobricks-aopwiki_cross · wrong rows Haiku 4.5 · KG not named · biomarkerkg_cross · wrong rows Haiku 4.5 · KG not named · biomarkerkg_cross · wrong rows Haiku 4.5 · KG not named · biomarkerkg_cross · wrong rows Haiku 4.5 · KG not named · digcfdekg_cross · right rows and order Haiku 4.5 · KG not named · digcfdekg_cross · wrong rows Haiku 4.5 · KG not named · digcfdekg_cross · wrong rows Haiku 4.5 · KG not named · gene-expression-atlas-okn_cross · wrong rows Haiku 4.5 · KG not named · gene-expression-atlas-okn_cross · wrong rows Haiku 4.5 · KG not named · gene-expression-atlas-okn_cross · wrong rows Haiku 4.5 · KG not named · ncipidkg_cross · wrong rows Haiku 4.5 · KG not named · ncipidkg_cross · wrong rows Haiku 4.5 · KG not named · ncipidkg_cross · wrong rows Haiku 4.5 · KG not named · nde_cross · right rows and order Haiku 4.5 · KG not named · nde_cross · wrong rows Haiku 4.5 · KG not named · nde_cross · right rows and order Haiku 4.5 · KG not named · oard-kg_cross · wrong rows Haiku 4.5 · KG not named · oard-kg_cross · wrong rows Haiku 4.5 · KG not named · oard-kg_cross · wrong rows Haiku 4.5 · KG not named · pankgraph_cross · wrong rows Haiku 4.5 · KG not named · pankgraph_cross · right rows and order Haiku 4.5 · KG not named · pankgraph_cross · wrong rows Haiku 4.5 · KG not named · prokn_cross · wrong rows Haiku 4.5 · KG not named · prokn_cross · wrong rows Haiku 4.5 · KG not named · prokn_cross · wrong rows Haiku 4.5 · KG not named · rdkg_cross · wrong rows Haiku 4.5 · KG not named · rdkg_cross · wrong rows Haiku 4.5 · KG not named · rdkg_cross · wrong rows Haiku 4.5 · KG not named · spoke-genelab_cross · wrong rows Haiku 4.5 · KG not named · spoke-genelab_cross · right rows and order Haiku 4.5 · KG not named · spoke-genelab_cross · right rows and order Haiku 4.5 · KG not named · spoke-okn_cross · wrong rows Haiku 4.5 · KG not named · spoke-okn_cross · wrong rows Haiku 4.5 · KG not named · spoke-okn_cross · wrong rows KG named, −6 tools 7/36 Haiku 4.5 · KG named, −6 tools · biobricks-aopwiki_cross · wrong rows Haiku 4.5 · KG named, −6 tools · biobricks-aopwiki_cross · right rows and order Haiku 4.5 · KG named, −6 tools · biobricks-aopwiki_cross · wrong rows Haiku 4.5 · KG named, −6 tools · biomarkerkg_cross · wrong rows Haiku 4.5 · KG named, −6 tools · biomarkerkg_cross · wrong rows Haiku 4.5 · KG named, −6 tools · biomarkerkg_cross · wrong rows Haiku 4.5 · KG named, −6 tools · digcfdekg_cross · right rows and order Haiku 4.5 · KG named, −6 tools · digcfdekg_cross · right rows, wrong order Haiku 4.5 · KG named, −6 tools · digcfdekg_cross · wrong rows Haiku 4.5 · KG named, −6 tools · gene-expression-atlas-okn_cross · wrong rows Haiku 4.5 · KG named, −6 tools · gene-expression-atlas-okn_cross · wrong rows Haiku 4.5 · KG named, −6 tools · gene-expression-atlas-okn_cross · wrong rows Haiku 4.5 · KG named, −6 tools · ncipidkg_cross · wrong rows Haiku 4.5 · KG named, −6 tools · ncipidkg_cross · right rows and order Haiku 4.5 · KG named, −6 tools · ncipidkg_cross · wrong rows Haiku 4.5 · KG named, −6 tools · nde_cross · wrong rows Haiku 4.5 · KG named, −6 tools · nde_cross · right rows and order Haiku 4.5 · KG named, −6 tools · nde_cross · right rows and order Haiku 4.5 · KG named, −6 tools · oard-kg_cross · wrong rows Haiku 4.5 · KG named, −6 tools · oard-kg_cross · hit the 900s timeout, no answer Haiku 4.5 · KG named, −6 tools · oard-kg_cross · hit the 900s timeout, no answer Haiku 4.5 · KG named, −6 tools · pankgraph_cross · hit the 900s timeout, no answer Haiku 4.5 · KG named, −6 tools · pankgraph_cross · hit the 900s timeout, no answer Haiku 4.5 · KG named, −6 tools · pankgraph_cross · hit the 900s timeout, no answer Haiku 4.5 · KG named, −6 tools · prokn_cross · wrong rows Haiku 4.5 · KG named, −6 tools · prokn_cross · right rows, wrong order Haiku 4.5 · KG named, −6 tools · prokn_cross · wrong rows Haiku 4.5 · KG named, −6 tools · rdkg_cross · hit the 900s timeout, no answer Haiku 4.5 · KG named, −6 tools · rdkg_cross · right rows and order Haiku 4.5 · KG named, −6 tools · rdkg_cross · wrong rows Haiku 4.5 · KG named, −6 tools · spoke-genelab_cross · wrong rows Haiku 4.5 · KG named, −6 tools · spoke-genelab_cross · hit the 900s timeout, no answer Haiku 4.5 · KG named, −6 tools · spoke-genelab_cross · right rows and order Haiku 4.5 · KG named, −6 tools · spoke-okn_cross · wrong rows Haiku 4.5 · KG named, −6 tools · spoke-okn_cross · wrong rows Haiku 4.5 · KG named, −6 tools · spoke-okn_cross · wrong rows biobricks-aopwiki biomarkerkg digcfdekg gene-expression-atlas-okn ncipidkg nde oard-kg pankgraph prokn rdkg spoke-genelab spoke-okn

Figure 1. Outcome of all 324 episodes, one square per attempt. The twelve cross-graph questions run across the columns, each labeled by the first of the two knowledge graphs it joins, and each was attempted three times: the three squares in a group are attempts 1 to 3 of the same question under the same condition. The nine rows are three models, each under three conditions — KG named, KG not named, and KG named minus six tools. Color gives the outcome: dark blue, right rows in the right order; pale blue, right rows in the wrong order; gray, wrong rows; hollow, killed at the 900 s timeout without answering. The right-hand column counts fully correct attempts out of the 36 in each row. Figures 2 to 4 share this layout.

Two of the three conditions are degraded on purpose, so a success rate pooled over all 324 attempts would not describe anything. The equipped arm is the baseline to read: 76 of its 108 attempts were fully correct, from 34/36 for Opus down to 13/36 for Haiku.

What the pool does show is the shape of failure. Of the 122 attempts that were not fully correct, 94 returned wrong rows, 25 were killed at the timeout, and only 3 got the right rows in the wrong order. Ordering is almost never what goes wrong — which is why the strict and order-insensitive scores differ on 3 attempts out of 324.

The bands separate by model far more than by condition. Opus's worst arm (32/36) beats Sonnet's best (29/36), which beats Haiku's best (13/36) by more than a factor of two. Whatever the tooling is worth, it is worth less than the gap between these models.

Model Condition Always exact Ever exact Success rate Mean F1 Attempts exact
Opus 5all tools · KG named11/1212/1294%0.9434/36
all tools · KG not named10/1212/1292%0.9233/36
−6 tools · KG named9/1212/1289%0.9132/36
Sonnet 5all tools · KG named7/1212/1281%0.8329/36
all tools · KG not named3/1211/1261%0.6921/36
−6 tools · KG named6/1211/1269%0.7925/36
Haiku 4.5all tools · KG named1/128/1236%0.5013/36
all tools · KG not named0/125/1222%0.338/36
−6 tools · KG named0/127/1225%0.397/36

Read down the always exact column and the three models tell three different stories:

The hollow squares concentrate too: Opus has none at all in 108 episodes, against 13 for Sonnet and 12 for Haiku. Stalling is a model property here, not a condition one.



4. Where the time goes

Server Time per Attempt, by Model — Cross Graph Corpus Heatmap of seconds spent inside the server, three models x three conditions. Server Time per Attempt, by Model — Cross Graph Corpus 1s 1000s median 33.9s hit the 900s timeout total Opus 5 effort high KG named 501s Opus 5 · KG named · biobricks-aopwiki_cross · 7.6s Opus 5 · KG named · biobricks-aopwiki_cross · 48.7s Opus 5 · KG named · biobricks-aopwiki_cross · 7.4s Opus 5 · KG named · biomarkerkg_cross · 67.3s Opus 5 · KG named · biomarkerkg_cross · 68.4s Opus 5 · KG named · biomarkerkg_cross · 34.3s Opus 5 · KG named · digcfdekg_cross · 5.8s Opus 5 · KG named · digcfdekg_cross · 4.8s Opus 5 · KG named · digcfdekg_cross · 4.9s Opus 5 · KG named · gene-expression-atlas-okn_cross · 43.8s Opus 5 · KG named · gene-expression-atlas-okn_cross · 12.9s Opus 5 · KG named · gene-expression-atlas-okn_cross · 14.9s Opus 5 · KG named · ncipidkg_cross · 6.7s Opus 5 · KG named · ncipidkg_cross · 7.7s Opus 5 · KG named · ncipidkg_cross · 12.6s Opus 5 · KG named · nde_cross · 6.5s Opus 5 · KG named · nde_cross · 3.9s Opus 5 · KG named · nde_cross · 3.9s Opus 5 · KG named · oard-kg_cross · 1.8s Opus 5 · KG named · oard-kg_cross · 2.6s Opus 5 · KG named · oard-kg_cross · 2.2s Opus 5 · KG named · pankgraph_cross · 34.9s Opus 5 · KG named · pankgraph_cross · 5.0s Opus 5 · KG named · pankgraph_cross · 4.8s Opus 5 · KG named · prokn_cross · 9.3s Opus 5 · KG named · prokn_cross · 4.4s Opus 5 · KG named · prokn_cross · 34.3s Opus 5 · KG named · rdkg_cross · 4.3s Opus 5 · KG named · rdkg_cross · 3.3s Opus 5 · KG named · rdkg_cross · 2.3s Opus 5 · KG named · spoke-genelab_cross · 3.0s Opus 5 · KG named · spoke-genelab_cross · 3.4s Opus 5 · KG named · spoke-genelab_cross · 2.1s Opus 5 · KG named · spoke-okn_cross · 6.2s Opus 5 · KG named · spoke-okn_cross · 6.4s Opus 5 · KG named · spoke-okn_cross · 8.8s KG not named 1445s Opus 5 · KG not named · biobricks-aopwiki_cross · 64.0s Opus 5 · KG not named · biobricks-aopwiki_cross · 59.2s Opus 5 · KG not named · biobricks-aopwiki_cross · 286.2s Opus 5 · KG not named · biomarkerkg_cross · 33.0s Opus 5 · KG not named · biomarkerkg_cross · 8.3s Opus 5 · KG not named · biomarkerkg_cross · 10.0s Opus 5 · KG not named · digcfdekg_cross · 20.0s Opus 5 · KG not named · digcfdekg_cross · 6.5s Opus 5 · KG not named · digcfdekg_cross · 6.9s Opus 5 · KG not named · gene-expression-atlas-okn_cross · 98.5s Opus 5 · KG not named · gene-expression-atlas-okn_cross · 159.4s Opus 5 · KG not named · gene-expression-atlas-okn_cross · 98.8s Opus 5 · KG not named · ncipidkg_cross · 13.4s Opus 5 · KG not named · ncipidkg_cross · 8.7s Opus 5 · KG not named · ncipidkg_cross · 7.3s Opus 5 · KG not named · nde_cross · 11.7s Opus 5 · KG not named · nde_cross · 6.7s Opus 5 · KG not named · nde_cross · 65.2s Opus 5 · KG not named · oard-kg_cross · 2.9s Opus 5 · KG not named · oard-kg_cross · 3.6s Opus 5 · KG not named · oard-kg_cross · 3.2s Opus 5 · KG not named · pankgraph_cross · 8.9s Opus 5 · KG not named · pankgraph_cross · 3.9s Opus 5 · KG not named · pankgraph_cross · 2.7s Opus 5 · KG not named · prokn_cross · 127.9s Opus 5 · KG not named · prokn_cross · 176.4s Opus 5 · KG not named · prokn_cross · 25.1s Opus 5 · KG not named · rdkg_cross · 3.6s Opus 5 · KG not named · rdkg_cross · 33.0s Opus 5 · KG not named · rdkg_cross · 65.0s Opus 5 · KG not named · spoke-genelab_cross · 2.2s Opus 5 · KG not named · spoke-genelab_cross · 1.7s Opus 5 · KG not named · spoke-genelab_cross · 2.5s Opus 5 · KG not named · spoke-okn_cross · 4.6s Opus 5 · KG not named · spoke-okn_cross · 7.0s Opus 5 · KG not named · spoke-okn_cross · 7.5s KG named, −6 tools 3697s Opus 5 · KG named, −6 tools · biobricks-aopwiki_cross · 246.1s Opus 5 · KG named, −6 tools · biobricks-aopwiki_cross · 489.4s Opus 5 · KG named, −6 tools · biobricks-aopwiki_cross · 194.6s Opus 5 · KG named, −6 tools · biomarkerkg_cross · 87.3s Opus 5 · KG named, −6 tools · biomarkerkg_cross · 168.1s Opus 5 · KG named, −6 tools · biomarkerkg_cross · 143.2s Opus 5 · KG named, −6 tools · digcfdekg_cross · 60.8s Opus 5 · KG named, −6 tools · digcfdekg_cross · 10.6s Opus 5 · KG named, −6 tools · digcfdekg_cross · 190.0s Opus 5 · KG named, −6 tools · gene-expression-atlas-okn_cross · 180.1s Opus 5 · KG named, −6 tools · gene-expression-atlas-okn_cross · 34.0s Opus 5 · KG named, −6 tools · gene-expression-atlas-okn_cross · 37.8s Opus 5 · KG named, −6 tools · ncipidkg_cross · 151.7s Opus 5 · KG named, −6 tools · ncipidkg_cross · 34.7s Opus 5 · KG named, −6 tools · ncipidkg_cross · 13.8s Opus 5 · KG named, −6 tools · nde_cross · 279.6s Opus 5 · KG named, −6 tools · nde_cross · 117.2s Opus 5 · KG named, −6 tools · nde_cross · 76.2s Opus 5 · KG named, −6 tools · oard-kg_cross · 104.4s Opus 5 · KG named, −6 tools · oard-kg_cross · 179.8s Opus 5 · KG named, −6 tools · oard-kg_cross · 32.3s Opus 5 · KG named, −6 tools · pankgraph_cross · 48.2s Opus 5 · KG named, −6 tools · pankgraph_cross · 4.6s Opus 5 · KG named, −6 tools · pankgraph_cross · 3.3s Opus 5 · KG named, −6 tools · prokn_cross · 43.8s Opus 5 · KG named, −6 tools · prokn_cross · 41.8s Opus 5 · KG named, −6 tools · prokn_cross · 46.7s Opus 5 · KG named, −6 tools · rdkg_cross · 55.6s Opus 5 · KG named, −6 tools · rdkg_cross · 20.2s Opus 5 · KG named, −6 tools · rdkg_cross · 8.9s Opus 5 · KG named, −6 tools · spoke-genelab_cross · 211.8s Opus 5 · KG named, −6 tools · spoke-genelab_cross · 146.4s Opus 5 · KG named, −6 tools · spoke-genelab_cross · 128.0s Opus 5 · KG named, −6 tools · spoke-okn_cross · 58.2s Opus 5 · KG named, −6 tools · spoke-okn_cross · 7.0s Opus 5 · KG named, −6 tools · spoke-okn_cross · 40.9s Sonnet 5 effort medium KG named ≥1947s Sonnet 5 · KG named · biobricks-aopwiki_cross · 96.5s Sonnet 5 · KG named · biobricks-aopwiki_cross · 86.9s Sonnet 5 · KG named · biobricks-aopwiki_cross · 9.0s Sonnet 5 · KG named · biomarkerkg_cross · 13.5s Sonnet 5 · KG named · biomarkerkg_cross · 27.7s Sonnet 5 · KG named · biomarkerkg_cross · 23.7s Sonnet 5 · KG named · digcfdekg_cross · 14.6s Sonnet 5 · KG named · digcfdekg_cross · 5.5s Sonnet 5 · KG named · digcfdekg_cross · 3.7s Sonnet 5 · KG named · gene-expression-atlas-okn_cross · 87.5s Sonnet 5 · KG named · gene-expression-atlas-okn_cross · 19.3s Sonnet 5 · KG named · gene-expression-atlas-okn_cross · 33.9s Sonnet 5 · KG named · ncipidkg_cross · 18.7s Sonnet 5 · KG named · ncipidkg_cross · 12.0s Sonnet 5 · KG named · ncipidkg_cross · 10.4s Sonnet 5 · KG named · nde_cross · 39.9s Sonnet 5 · KG named · nde_cross · 718.3s Sonnet 5 · KG named · nde_cross · 2.7s Sonnet 5 · KG named · oard-kg_cross · 4.6s Sonnet 5 · KG named · oard-kg_cross · 3.8s Sonnet 5 · KG named · oard-kg_cross · 3.9s Sonnet 5 · KG named · pankgraph_cross · 14.3s Sonnet 5 · KG named · pankgraph_cross · 19.5s Sonnet 5 · KG named · pankgraph_cross · 24.6s Sonnet 5 · KG named · prokn_cross · 252.3s Sonnet 5 · KG named · prokn_cross · 6.6s Sonnet 5 · KG named · prokn_cross · 31.4s Sonnet 5 · KG named · rdkg_cross · 5.1s Sonnet 5 · KG named · rdkg_cross · 5.1s Sonnet 5 · KG named · rdkg_cross · 4.0s Sonnet 5 · KG named · spoke-genelab_cross · 209.7s Sonnet 5 · KG named · spoke-genelab_cross · 76.3s Sonnet 5 · KG named · spoke-genelab_cross · 2.4s Sonnet 5 · KG named · spoke-okn_cross · 10.3s Sonnet 5 · KG named · spoke-okn_cross · 43.9s Sonnet 5 · KG named · spoke-okn_cross · 5.8s KG not named ≥2476s Sonnet 5 · KG not named · biobricks-aopwiki_cross · 18.0s Sonnet 5 · KG not named · biobricks-aopwiki_cross · 5.0s Sonnet 5 · KG not named · biobricks-aopwiki_cross · 12.0s Sonnet 5 · KG not named · biomarkerkg_cross · 25.8s Sonnet 5 · KG not named · biomarkerkg_cross · 201.7s Sonnet 5 · KG not named · biomarkerkg_cross · 20.8s Sonnet 5 · KG not named · digcfdekg_cross · 39.0s Sonnet 5 · KG not named · digcfdekg_cross · 3.3s Sonnet 5 · KG not named · digcfdekg_cross · 21.7s Sonnet 5 · KG not named · gene-expression-atlas-okn_cross · 96.3s Sonnet 5 · KG not named · gene-expression-atlas-okn_cross · 51.2s Sonnet 5 · KG not named · gene-expression-atlas-okn_cross · 24.3s Sonnet 5 · KG not named · ncipidkg_cross · 45.0s Sonnet 5 · KG not named · ncipidkg_cross · 46.1s Sonnet 5 · KG not named · ncipidkg_cross · 11.2s Sonnet 5 · KG not named · nde_cross · 44.5s Sonnet 5 · KG not named · nde_cross · 294.8s Sonnet 5 · KG not named · nde_cross · 282.5s Sonnet 5 · KG not named · oard-kg_cross · 3.0s Sonnet 5 · KG not named · oard-kg_cross · 5.1s Sonnet 5 · KG not named · oard-kg_cross · 3.5s Sonnet 5 · KG not named · pankgraph_cross · 34.5s Sonnet 5 · KG not named · pankgraph_cross · 1.8s Sonnet 5 · KG not named · pankgraph_cross · 50.2s Sonnet 5 · KG not named · prokn_cross · 183.4s Sonnet 5 · KG not named · prokn_cross · 352.8s Sonnet 5 · KG not named · prokn_cross · 498.3s Sonnet 5 · KG not named · rdkg_cross · 6.5s Sonnet 5 · KG not named · rdkg_cross · 20.1s Sonnet 5 · KG not named · rdkg_cross · 9.9s Sonnet 5 · KG not named · spoke-genelab_cross · 3.5s Sonnet 5 · KG not named · spoke-genelab_cross · 4.2s Sonnet 5 · KG not named · spoke-genelab_cross · 8.8s Sonnet 5 · KG not named · spoke-okn_cross · 12.0s Sonnet 5 · KG not named · spoke-okn_cross · 14.6s Sonnet 5 · KG not named · spoke-okn_cross · 20.1s KG named, −6 tools ≥4564s Sonnet 5 · KG named, −6 tools · biobricks-aopwiki_cross · 383.9s Sonnet 5 · KG named, −6 tools · biobricks-aopwiki_cross · 78.3s Sonnet 5 · KG named, −6 tools · biobricks-aopwiki_cross · 280.8s Sonnet 5 · KG named, −6 tools · biomarkerkg_cross · 87.8s Sonnet 5 · KG named, −6 tools · biomarkerkg_cross · 37.4s Sonnet 5 · KG named, −6 tools · biomarkerkg_cross · 555.4s Sonnet 5 · KG named, −6 tools · digcfdekg_cross · 63.7s Sonnet 5 · KG named, −6 tools · digcfdekg_cross · 43.5s Sonnet 5 · KG named, −6 tools · digcfdekg_cross · 27.8s Sonnet 5 · KG named, −6 tools · gene-expression-atlas-okn_cross · 118.7s Sonnet 5 · KG named, −6 tools · gene-expression-atlas-okn_cross · 45.0s Sonnet 5 · KG named, −6 tools · gene-expression-atlas-okn_cross · 110.0s Sonnet 5 · KG named, −6 tools · ncipidkg_cross · 84.1s Sonnet 5 · KG named, −6 tools · ncipidkg_cross · 41.1s Sonnet 5 · KG named, −6 tools · ncipidkg_cross · 145.7s Sonnet 5 · KG named, −6 tools · nde_cross · 92.6s Sonnet 5 · KG named, −6 tools · nde_cross · 59.9s Sonnet 5 · KG named, −6 tools · nde_cross · 54.3s Sonnet 5 · KG named, −6 tools · oard-kg_cross · 79.2s Sonnet 5 · KG named, −6 tools · oard-kg_cross · 24.8s Sonnet 5 · KG named, −6 tools · oard-kg_cross · 14.6s Sonnet 5 · KG named, −6 tools · pankgraph_cross · 149.9s Sonnet 5 · KG named, −6 tools · pankgraph_cross · 6.0s Sonnet 5 · KG named, −6 tools · pankgraph_cross · 9.9s Sonnet 5 · KG named, −6 tools · prokn_cross · 545.0s Sonnet 5 · KG named, −6 tools · prokn_cross · 73.5s Sonnet 5 · KG named, −6 tools · prokn_cross · 372.9s Sonnet 5 · KG named, −6 tools · rdkg_cross · 97.8s Sonnet 5 · KG named, −6 tools · rdkg_cross · 39.0s Sonnet 5 · KG named, −6 tools · rdkg_cross · 57.7s Sonnet 5 · KG named, −6 tools · spoke-genelab_cross · 236.0s Sonnet 5 · KG named, −6 tools · spoke-genelab_cross · 282.6s Sonnet 5 · KG named, −6 tools · spoke-genelab_cross · 52.2s Sonnet 5 · KG named, −6 tools · spoke-okn_cross · 138.1s Sonnet 5 · KG named, −6 tools · spoke-okn_cross · 38.7s Sonnet 5 · KG named, −6 tools · spoke-okn_cross · 36.1s Haiku 4.5 effort default KG named ≥3256s Haiku 4.5 · KG named · biobricks-aopwiki_cross · 40.7s Haiku 4.5 · KG named · biobricks-aopwiki_cross · 648.1s Haiku 4.5 · KG named · biobricks-aopwiki_cross · 24.4s Haiku 4.5 · KG named · biomarkerkg_cross · 22.0s Haiku 4.5 · KG named · biomarkerkg_cross · 20.7s Haiku 4.5 · KG named · biomarkerkg_cross · 24.2s Haiku 4.5 · KG named · digcfdekg_cross · 7.3s Haiku 4.5 · KG named · digcfdekg_cross · 24.2s Haiku 4.5 · KG named · digcfdekg_cross · 41.6s Haiku 4.5 · KG named · gene-expression-atlas-okn_cross · 67.2s Haiku 4.5 · KG named · gene-expression-atlas-okn_cross · 82.6s Haiku 4.5 · KG named · gene-expression-atlas-okn_cross · 46.5s Haiku 4.5 · KG named · ncipidkg_cross · 7.6s Haiku 4.5 · KG named · ncipidkg_cross · 25.6s Haiku 4.5 · KG named · ncipidkg_cross · 261.3s Haiku 4.5 · KG named · nde_cross · 42.1s Haiku 4.5 · KG named · nde_cross · 46.8s Haiku 4.5 · KG named · nde_cross · 39.2s Haiku 4.5 · KG named · oard-kg_cross · 5.8s Haiku 4.5 · KG named · oard-kg_cross · 820.1s Haiku 4.5 · KG named · oard-kg_cross · 730.1s Haiku 4.5 · KG named · pankgraph_cross · 6.3s Haiku 4.5 · KG named · pankgraph_cross · 12.8s Haiku 4.5 · KG named · pankgraph_cross · 2.6s Haiku 4.5 · KG named · prokn_cross · 31.8s Haiku 4.5 · KG named · prokn_cross · 24.5s Haiku 4.5 · KG named · prokn_cross · 43.9s Haiku 4.5 · KG named · rdkg_cross · 14.2s Haiku 4.5 · KG named · rdkg_cross · 10.7s Haiku 4.5 · KG named · rdkg_cross · 15.9s Haiku 4.5 · KG named · spoke-genelab_cross · 32.4s Haiku 4.5 · KG named · spoke-genelab_cross · 5.3s Haiku 4.5 · KG named · spoke-genelab_cross · 2.6s Haiku 4.5 · KG named · spoke-okn_cross · 13.6s Haiku 4.5 · KG named · spoke-okn_cross · 8.2s Haiku 4.5 · KG named · spoke-okn_cross · 2.9s KG not named 2394s Haiku 4.5 · KG not named · biobricks-aopwiki_cross · 46.0s Haiku 4.5 · KG not named · biobricks-aopwiki_cross · 468.9s Haiku 4.5 · KG not named · biobricks-aopwiki_cross · 7.1s Haiku 4.5 · KG not named · biomarkerkg_cross · 77.1s Haiku 4.5 · KG not named · biomarkerkg_cross · 20.8s Haiku 4.5 · KG not named · biomarkerkg_cross · 17.6s Haiku 4.5 · KG not named · digcfdekg_cross · 79.8s Haiku 4.5 · KG not named · digcfdekg_cross · 6.6s Haiku 4.5 · KG not named · digcfdekg_cross · 36.6s Haiku 4.5 · KG not named · gene-expression-atlas-okn_cross · 152.8s Haiku 4.5 · KG not named · gene-expression-atlas-okn_cross · 33.2s Haiku 4.5 · KG not named · gene-expression-atlas-okn_cross · 41.4s Haiku 4.5 · KG not named · ncipidkg_cross · 76.2s Haiku 4.5 · KG not named · ncipidkg_cross · 6.2s Haiku 4.5 · KG not named · ncipidkg_cross · 3.9s Haiku 4.5 · KG not named · nde_cross · 44.0s Haiku 4.5 · KG not named · nde_cross · 11.4s Haiku 4.5 · KG not named · nde_cross · 82.7s Haiku 4.5 · KG not named · oard-kg_cross · 74.4s Haiku 4.5 · KG not named · oard-kg_cross · 131.2s Haiku 4.5 · KG not named · oard-kg_cross · 48.2s Haiku 4.5 · KG not named · pankgraph_cross · 78.8s Haiku 4.5 · KG not named · pankgraph_cross · 10.2s Haiku 4.5 · KG not named · pankgraph_cross · 28.2s Haiku 4.5 · KG not named · prokn_cross · 24.2s Haiku 4.5 · KG not named · prokn_cross · 13.1s Haiku 4.5 · KG not named · prokn_cross · 80.4s Haiku 4.5 · KG not named · rdkg_cross · 34.4s Haiku 4.5 · KG not named · rdkg_cross · 4.5s Haiku 4.5 · KG not named · rdkg_cross · 61.5s Haiku 4.5 · KG not named · spoke-genelab_cross · 24.2s Haiku 4.5 · KG not named · spoke-genelab_cross · 4.6s Haiku 4.5 · KG not named · spoke-genelab_cross · 5.3s Haiku 4.5 · KG not named · spoke-okn_cross · 466.7s Haiku 4.5 · KG not named · spoke-okn_cross · 82.0s Haiku 4.5 · KG not named · spoke-okn_cross · 10.1s KG named, −6 tools ≥4285s Haiku 4.5 · KG named, −6 tools · biobricks-aopwiki_cross · 19.2s Haiku 4.5 · KG named, −6 tools · biobricks-aopwiki_cross · 182.0s Haiku 4.5 · KG named, −6 tools · biobricks-aopwiki_cross · 172.4s Haiku 4.5 · KG named, −6 tools · biomarkerkg_cross · 198.5s Haiku 4.5 · KG named, −6 tools · biomarkerkg_cross · 134.5s Haiku 4.5 · KG named, −6 tools · biomarkerkg_cross · 57.6s Haiku 4.5 · KG named, −6 tools · digcfdekg_cross · 319.2s Haiku 4.5 · KG named, −6 tools · digcfdekg_cross · 40.0s Haiku 4.5 · KG named, −6 tools · digcfdekg_cross · 101.7s Haiku 4.5 · KG named, −6 tools · gene-expression-atlas-okn_cross · 104.0s Haiku 4.5 · KG named, −6 tools · gene-expression-atlas-okn_cross · 167.9s Haiku 4.5 · KG named, −6 tools · gene-expression-atlas-okn_cross · 131.1s Haiku 4.5 · KG named, −6 tools · ncipidkg_cross · 86.8s Haiku 4.5 · KG named, −6 tools · ncipidkg_cross · 155.6s Haiku 4.5 · KG named, −6 tools · ncipidkg_cross · 240.9s Haiku 4.5 · KG named, −6 tools · nde_cross · 42.6s Haiku 4.5 · KG named, −6 tools · nde_cross · 130.2s Haiku 4.5 · KG named, −6 tools · nde_cross · 70.0s Haiku 4.5 · KG named, −6 tools · oard-kg_cross · 153.2s Haiku 4.5 · KG named, −6 tools · oard-kg_cross · 3.1s Haiku 4.5 · KG named, −6 tools · oard-kg_cross · 81.1s Haiku 4.5 · KG named, −6 tools · pankgraph_cross · 218.8s Haiku 4.5 · KG named, −6 tools · pankgraph_cross · 14.1s Haiku 4.5 · KG named, −6 tools · pankgraph_cross · 12.2s Haiku 4.5 · KG named, −6 tools · prokn_cross · 92.2s Haiku 4.5 · KG named, −6 tools · prokn_cross · 57.4s Haiku 4.5 · KG named, −6 tools · prokn_cross · 112.8s Haiku 4.5 · KG named, −6 tools · rdkg_cross · 85.7s Haiku 4.5 · KG named, −6 tools · rdkg_cross · 196.8s Haiku 4.5 · KG named, −6 tools · rdkg_cross · 73.4s Haiku 4.5 · KG named, −6 tools · spoke-genelab_cross · 150.1s Haiku 4.5 · KG named, −6 tools · spoke-genelab_cross · 153.7s Haiku 4.5 · KG named, −6 tools · spoke-genelab_cross · 302.9s Haiku 4.5 · KG named, −6 tools · spoke-okn_cross · 6.5s Haiku 4.5 · KG named, −6 tools · spoke-okn_cross · 53.9s Haiku 4.5 · KG named, −6 tools · spoke-okn_cross · 163.0s biobricks-aopwiki biomarkerkg digcfdekg gene-expression-atlas-okn ncipidkg nde oard-kg pankgraph prokn rdkg spoke-genelab spoke-okn

Figure 2. Server time per attempt, in the layout of Figure 1. Shading is logarithmic and diverges about the median attempt (33.9 s): blue below it, red above. Outlined squares were killed at the timeout, so their time stopped early and those row totals understate.

The third row of each band reddens visibly, the second only slightly. Both ablations raise endpoint load in every model, but by very different amounts — and the median attempt is the honest comparator here, since row totals are distorted by a handful of very long episodes:

Median attempt KG named KG not named vs named −6 tools vs named
Opus 56.3s8.8s1.4×59.5s9.5×
Sonnet 514.5s20.5s1.4×75.9s5.3×
Haiku 4.524.3s35.5s1.5×108.4s4.5×

Not naming the graph costs about 1.4× in every model; withholding the six tools costs 4.5–9.5×. Whatever the agent does to recover a graph it has not been told about, it does not do it by hammering the endpoint — that comes later, in Figure 4.

Opus's equipped arm is the bluest region of the figure: a median attempt spends 6.3 seconds at the endpoint, and the whole corpus takes 501 seconds. That is roughly an eighth of what the same model needs without the tools, bought for a two-question accuracy drop — the sharpest illustration in the study that the tooling buys efficiency rather than capability — while nothing is rationed. Section 9 rations it, and the distinction does not survive.

The baselines rise as the models weaken: Haiku's equipped median is already 3.9× Opus's. A weaker model spends more at the endpoint before anything is taken away.



5. How much work reached the endpoint

Queries per Attempt, by Model — Cross Graph Corpus Heatmap of queries run per attempt, three models x three conditions. Queries per Attempt, by Model — Cross Graph Corpus 1 100 median 14 queries hit the 900s timeout total Opus 5 effort high KG named 344 Opus 5 · KG named · biobricks-aopwiki_cross · 6 queries Opus 5 · KG named · biobricks-aopwiki_cross · 7 queries Opus 5 · KG named · biobricks-aopwiki_cross · 7 queries Opus 5 · KG named · biomarkerkg_cross · 22 queries Opus 5 · KG named · biomarkerkg_cross · 13 queries Opus 5 · KG named · biomarkerkg_cross · 18 queries Opus 5 · KG named · digcfdekg_cross · 8 queries Opus 5 · KG named · digcfdekg_cross · 7 queries Opus 5 · KG named · digcfdekg_cross · 10 queries Opus 5 · KG named · gene-expression-atlas-okn_cross · 15 queries Opus 5 · KG named · gene-expression-atlas-okn_cross · 21 queries Opus 5 · KG named · gene-expression-atlas-okn_cross · 18 queries Opus 5 · KG named · ncipidkg_cross · 13 queries Opus 5 · KG named · ncipidkg_cross · 11 queries Opus 5 · KG named · ncipidkg_cross · 13 queries Opus 5 · KG named · nde_cross · 9 queries Opus 5 · KG named · nde_cross · 9 queries Opus 5 · KG named · nde_cross · 8 queries Opus 5 · KG named · oard-kg_cross · 4 queries Opus 5 · KG named · oard-kg_cross · 5 queries Opus 5 · KG named · oard-kg_cross · 6 queries Opus 5 · KG named · pankgraph_cross · 11 queries Opus 5 · KG named · pankgraph_cross · 8 queries Opus 5 · KG named · pankgraph_cross · 6 queries Opus 5 · KG named · prokn_cross · 8 queries Opus 5 · KG named · prokn_cross · 8 queries Opus 5 · KG named · prokn_cross · 10 queries Opus 5 · KG named · rdkg_cross · 7 queries Opus 5 · KG named · rdkg_cross · 7 queries Opus 5 · KG named · rdkg_cross · 5 queries Opus 5 · KG named · spoke-genelab_cross · 5 queries Opus 5 · KG named · spoke-genelab_cross · 7 queries Opus 5 · KG named · spoke-genelab_cross · 6 queries Opus 5 · KG named · spoke-okn_cross · 7 queries Opus 5 · KG named · spoke-okn_cross · 7 queries Opus 5 · KG named · spoke-okn_cross · 12 queries KG not named 413 Opus 5 · KG not named · biobricks-aopwiki_cross · 6 queries Opus 5 · KG not named · biobricks-aopwiki_cross · 7 queries Opus 5 · KG not named · biobricks-aopwiki_cross · 8 queries Opus 5 · KG not named · biomarkerkg_cross · 12 queries Opus 5 · KG not named · biomarkerkg_cross · 14 queries Opus 5 · KG not named · biomarkerkg_cross · 18 queries Opus 5 · KG not named · digcfdekg_cross · 8 queries Opus 5 · KG not named · digcfdekg_cross · 14 queries Opus 5 · KG not named · digcfdekg_cross · 11 queries Opus 5 · KG not named · gene-expression-atlas-okn_cross · 15 queries Opus 5 · KG not named · gene-expression-atlas-okn_cross · 18 queries Opus 5 · KG not named · gene-expression-atlas-okn_cross · 15 queries Opus 5 · KG not named · ncipidkg_cross · 21 queries Opus 5 · KG not named · ncipidkg_cross · 19 queries Opus 5 · KG not named · ncipidkg_cross · 11 queries Opus 5 · KG not named · nde_cross · 12 queries Opus 5 · KG not named · nde_cross · 10 queries Opus 5 · KG not named · nde_cross · 11 queries Opus 5 · KG not named · oard-kg_cross · 5 queries Opus 5 · KG not named · oard-kg_cross · 7 queries Opus 5 · KG not named · oard-kg_cross · 7 queries Opus 5 · KG not named · pankgraph_cross · 7 queries Opus 5 · KG not named · pankgraph_cross · 7 queries Opus 5 · KG not named · pankgraph_cross · 6 queries Opus 5 · KG not named · prokn_cross · 14 queries Opus 5 · KG not named · prokn_cross · 28 queries Opus 5 · KG not named · prokn_cross · 33 queries Opus 5 · KG not named · rdkg_cross · 6 queries Opus 5 · KG not named · rdkg_cross · 7 queries Opus 5 · KG not named · rdkg_cross · 9 queries Opus 5 · KG not named · spoke-genelab_cross · 5 queries Opus 5 · KG not named · spoke-genelab_cross · 5 queries Opus 5 · KG not named · spoke-genelab_cross · 6 queries Opus 5 · KG not named · spoke-okn_cross · 10 queries Opus 5 · KG not named · spoke-okn_cross · 10 queries Opus 5 · KG not named · spoke-okn_cross · 11 queries KG named, −6 tools 533 Opus 5 · KG named, −6 tools · biobricks-aopwiki_cross · 14 queries Opus 5 · KG named, −6 tools · biobricks-aopwiki_cross · 22 queries Opus 5 · KG named, −6 tools · biobricks-aopwiki_cross · 11 queries Opus 5 · KG named, −6 tools · biomarkerkg_cross · 15 queries Opus 5 · KG named, −6 tools · biomarkerkg_cross · 19 queries Opus 5 · KG named, −6 tools · biomarkerkg_cross · 24 queries Opus 5 · KG named, −6 tools · digcfdekg_cross · 12 queries Opus 5 · KG named, −6 tools · digcfdekg_cross · 15 queries Opus 5 · KG named, −6 tools · digcfdekg_cross · 9 queries Opus 5 · KG named, −6 tools · gene-expression-atlas-okn_cross · 27 queries Opus 5 · KG named, −6 tools · gene-expression-atlas-okn_cross · 16 queries Opus 5 · KG named, −6 tools · gene-expression-atlas-okn_cross · 17 queries Opus 5 · KG named, −6 tools · ncipidkg_cross · 16 queries Opus 5 · KG named, −6 tools · ncipidkg_cross · 22 queries Opus 5 · KG named, −6 tools · ncipidkg_cross · 25 queries Opus 5 · KG named, −6 tools · nde_cross · 18 queries Opus 5 · KG named, −6 tools · nde_cross · 15 queries Opus 5 · KG named, −6 tools · nde_cross · 12 queries Opus 5 · KG named, −6 tools · oard-kg_cross · 19 queries Opus 5 · KG named, −6 tools · oard-kg_cross · 10 queries Opus 5 · KG named, −6 tools · oard-kg_cross · 13 queries Opus 5 · KG named, −6 tools · pankgraph_cross · 8 queries Opus 5 · KG named, −6 tools · pankgraph_cross · 10 queries Opus 5 · KG named, −6 tools · pankgraph_cross · 9 queries Opus 5 · KG named, −6 tools · prokn_cross · 15 queries Opus 5 · KG named, −6 tools · prokn_cross · 17 queries Opus 5 · KG named, −6 tools · prokn_cross · 11 queries Opus 5 · KG named, −6 tools · rdkg_cross · 11 queries Opus 5 · KG named, −6 tools · rdkg_cross · 12 queries Opus 5 · KG named, −6 tools · rdkg_cross · 11 queries Opus 5 · KG named, −6 tools · spoke-genelab_cross · 9 queries Opus 5 · KG named, −6 tools · spoke-genelab_cross · 9 queries Opus 5 · KG named, −6 tools · spoke-genelab_cross · 8 queries Opus 5 · KG named, −6 tools · spoke-okn_cross · 17 queries Opus 5 · KG named, −6 tools · spoke-okn_cross · 12 queries Opus 5 · KG named, −6 tools · spoke-okn_cross · 23 queries Sonnet 5 effort medium KG named ≥542 Sonnet 5 · KG named · biobricks-aopwiki_cross · 7 queries Sonnet 5 · KG named · biobricks-aopwiki_cross · 8 queries Sonnet 5 · KG named · biobricks-aopwiki_cross · 2 queries Sonnet 5 · KG named · biomarkerkg_cross · 14 queries Sonnet 5 · KG named · biomarkerkg_cross · 21 queries Sonnet 5 · KG named · biomarkerkg_cross · 26 queries Sonnet 5 · KG named · digcfdekg_cross · 24 queries Sonnet 5 · KG named · digcfdekg_cross · 14 queries Sonnet 5 · KG named · digcfdekg_cross · 10 queries Sonnet 5 · KG named · gene-expression-atlas-okn_cross · 31 queries Sonnet 5 · KG named · gene-expression-atlas-okn_cross · 26 queries Sonnet 5 · KG named · gene-expression-atlas-okn_cross · 34 queries Sonnet 5 · KG named · ncipidkg_cross · 36 queries Sonnet 5 · KG named · ncipidkg_cross · 21 queries Sonnet 5 · KG named · ncipidkg_cross · 25 queries Sonnet 5 · KG named · nde_cross · 7 queries Sonnet 5 · KG named · nde_cross · 33 queries Sonnet 5 · KG named · nde_cross · 8 queries Sonnet 5 · KG named · oard-kg_cross · 5 queries Sonnet 5 · KG named · oard-kg_cross · 7 queries Sonnet 5 · KG named · oard-kg_cross · 7 queries Sonnet 5 · KG named · pankgraph_cross · 7 queries Sonnet 5 · KG named · pankgraph_cross · 8 queries Sonnet 5 · KG named · pankgraph_cross · 9 queries Sonnet 5 · KG named · prokn_cross · 34 queries Sonnet 5 · KG named · prokn_cross · 10 queries Sonnet 5 · KG named · prokn_cross · 16 queries Sonnet 5 · KG named · rdkg_cross · 5 queries Sonnet 5 · KG named · rdkg_cross · 6 queries Sonnet 5 · KG named · rdkg_cross · 5 queries Sonnet 5 · KG named · spoke-genelab_cross · 12 queries Sonnet 5 · KG named · spoke-genelab_cross · 11 queries Sonnet 5 · KG named · spoke-genelab_cross · 8 queries Sonnet 5 · KG named · spoke-okn_cross · 13 queries Sonnet 5 · KG named · spoke-okn_cross · 22 queries Sonnet 5 · KG named · spoke-okn_cross · 10 queries KG not named ≥723 Sonnet 5 · KG not named · biobricks-aopwiki_cross · 11 queries Sonnet 5 · KG not named · biobricks-aopwiki_cross · 4 queries Sonnet 5 · KG not named · biobricks-aopwiki_cross · 5 queries Sonnet 5 · KG not named · biomarkerkg_cross · 23 queries Sonnet 5 · KG not named · biomarkerkg_cross · 36 queries Sonnet 5 · KG not named · biomarkerkg_cross · 12 queries Sonnet 5 · KG not named · digcfdekg_cross · 15 queries Sonnet 5 · KG not named · digcfdekg_cross · 7 queries Sonnet 5 · KG not named · digcfdekg_cross · 11 queries Sonnet 5 · KG not named · gene-expression-atlas-okn_cross · 41 queries Sonnet 5 · KG not named · gene-expression-atlas-okn_cross · 41 queries Sonnet 5 · KG not named · gene-expression-atlas-okn_cross · 27 queries Sonnet 5 · KG not named · ncipidkg_cross · 19 queries Sonnet 5 · KG not named · ncipidkg_cross · 41 queries Sonnet 5 · KG not named · ncipidkg_cross · 23 queries Sonnet 5 · KG not named · nde_cross · 6 queries Sonnet 5 · KG not named · nde_cross · 39 queries Sonnet 5 · KG not named · nde_cross · 14 queries Sonnet 5 · KG not named · oard-kg_cross · 3 queries Sonnet 5 · KG not named · oard-kg_cross · 10 queries Sonnet 5 · KG not named · oard-kg_cross · 4 queries Sonnet 5 · KG not named · pankgraph_cross · 6 queries Sonnet 5 · KG not named · pankgraph_cross · 2 queries Sonnet 5 · KG not named · pankgraph_cross · 16 queries Sonnet 5 · KG not named · prokn_cross · 64 queries Sonnet 5 · KG not named · prokn_cross · 79 queries Sonnet 5 · KG not named · prokn_cross · 47 queries Sonnet 5 · KG not named · rdkg_cross · 11 queries Sonnet 5 · KG not named · rdkg_cross · 21 queries Sonnet 5 · KG not named · rdkg_cross · 12 queries Sonnet 5 · KG not named · spoke-genelab_cross · 8 queries Sonnet 5 · KG not named · spoke-genelab_cross · 9 queries Sonnet 5 · KG not named · spoke-genelab_cross · 7 queries Sonnet 5 · KG not named · spoke-okn_cross · 11 queries Sonnet 5 · KG not named · spoke-okn_cross · 21 queries Sonnet 5 · KG not named · spoke-okn_cross · 17 queries KG named, −6 tools ≥749 Sonnet 5 · KG named, −6 tools · biobricks-aopwiki_cross · 24 queries Sonnet 5 · KG named, −6 tools · biobricks-aopwiki_cross · 11 queries Sonnet 5 · KG named, −6 tools · biobricks-aopwiki_cross · 18 queries Sonnet 5 · KG named, −6 tools · biomarkerkg_cross · 17 queries Sonnet 5 · KG named, −6 tools · biomarkerkg_cross · 23 queries Sonnet 5 · KG named, −6 tools · biomarkerkg_cross · 27 queries Sonnet 5 · KG named, −6 tools · digcfdekg_cross · 20 queries Sonnet 5 · KG named, −6 tools · digcfdekg_cross · 34 queries Sonnet 5 · KG named, −6 tools · digcfdekg_cross · 26 queries Sonnet 5 · KG named, −6 tools · gene-expression-atlas-okn_cross · 34 queries Sonnet 5 · KG named, −6 tools · gene-expression-atlas-okn_cross · 19 queries Sonnet 5 · KG named, −6 tools · gene-expression-atlas-okn_cross · 36 queries Sonnet 5 · KG named, −6 tools · ncipidkg_cross · 27 queries Sonnet 5 · KG named, −6 tools · ncipidkg_cross · 26 queries Sonnet 5 · KG named, −6 tools · ncipidkg_cross · 27 queries Sonnet 5 · KG named, −6 tools · nde_cross · 10 queries Sonnet 5 · KG named, −6 tools · nde_cross · 13 queries Sonnet 5 · KG named, −6 tools · nde_cross · 14 queries Sonnet 5 · KG named, −6 tools · oard-kg_cross · 19 queries Sonnet 5 · KG named, −6 tools · oard-kg_cross · 20 queries Sonnet 5 · KG named, −6 tools · oard-kg_cross · 20 queries Sonnet 5 · KG named, −6 tools · pankgraph_cross · 11 queries Sonnet 5 · KG named, −6 tools · pankgraph_cross · 10 queries Sonnet 5 · KG named, −6 tools · pankgraph_cross · 13 queries Sonnet 5 · KG named, −6 tools · prokn_cross · 44 queries Sonnet 5 · KG named, −6 tools · prokn_cross · 24 queries Sonnet 5 · KG named, −6 tools · prokn_cross · 43 queries Sonnet 5 · KG named, −6 tools · rdkg_cross · 17 queries Sonnet 5 · KG named, −6 tools · rdkg_cross · 14 queries Sonnet 5 · KG named, −6 tools · rdkg_cross · 14 queries Sonnet 5 · KG named, −6 tools · spoke-genelab_cross · 13 queries Sonnet 5 · KG named, −6 tools · spoke-genelab_cross · 23 queries Sonnet 5 · KG named, −6 tools · spoke-genelab_cross · 15 queries Sonnet 5 · KG named, −6 tools · spoke-okn_cross · 17 queries Sonnet 5 · KG named, −6 tools · spoke-okn_cross · 14 queries Sonnet 5 · KG named, −6 tools · spoke-okn_cross · 12 queries Haiku 4.5 effort default KG named ≥541 Haiku 4.5 · KG named · biobricks-aopwiki_cross · 11 queries Haiku 4.5 · KG named · biobricks-aopwiki_cross · 8 queries Haiku 4.5 · KG named · biobricks-aopwiki_cross · 13 queries Haiku 4.5 · KG named · biomarkerkg_cross · 22 queries Haiku 4.5 · KG named · biomarkerkg_cross · 18 queries Haiku 4.5 · KG named · biomarkerkg_cross · 15 queries Haiku 4.5 · KG named · digcfdekg_cross · 13 queries Haiku 4.5 · KG named · digcfdekg_cross · 16 queries Haiku 4.5 · KG named · digcfdekg_cross · 18 queries Haiku 4.5 · KG named · gene-expression-atlas-okn_cross · 34 queries Haiku 4.5 · KG named · gene-expression-atlas-okn_cross · 31 queries Haiku 4.5 · KG named · gene-expression-atlas-okn_cross · 20 queries Haiku 4.5 · KG named · ncipidkg_cross · 18 queries Haiku 4.5 · KG named · ncipidkg_cross · 30 queries Haiku 4.5 · KG named · ncipidkg_cross · 24 queries Haiku 4.5 · KG named · nde_cross · 7 queries Haiku 4.5 · KG named · nde_cross · 23 queries Haiku 4.5 · KG named · nde_cross · 6 queries Haiku 4.5 · KG named · oard-kg_cross · 7 queries Haiku 4.5 · KG named · oard-kg_cross · 6 queries Haiku 4.5 · KG named · oard-kg_cross · 8 queries Haiku 4.5 · KG named · pankgraph_cross · 11 queries Haiku 4.5 · KG named · pankgraph_cross · 26 queries Haiku 4.5 · KG named · pankgraph_cross · 7 queries Haiku 4.5 · KG named · prokn_cross · 22 queries Haiku 4.5 · KG named · prokn_cross · 17 queries Haiku 4.5 · KG named · prokn_cross · 24 queries Haiku 4.5 · KG named · rdkg_cross · 10 queries Haiku 4.5 · KG named · rdkg_cross · 13 queries Haiku 4.5 · KG named · rdkg_cross · 19 queries Haiku 4.5 · KG named · spoke-genelab_cross · 8 queries Haiku 4.5 · KG named · spoke-genelab_cross · 10 queries Haiku 4.5 · KG named · spoke-genelab_cross · 3 queries Haiku 4.5 · KG named · spoke-okn_cross · 10 queries Haiku 4.5 · KG named · spoke-okn_cross · 9 queries Haiku 4.5 · KG named · spoke-okn_cross · 4 queries KG not named 576 Haiku 4.5 · KG not named · biobricks-aopwiki_cross · 19 queries Haiku 4.5 · KG not named · biobricks-aopwiki_cross · 11 queries Haiku 4.5 · KG not named · biobricks-aopwiki_cross · 10 queries Haiku 4.5 · KG not named · biomarkerkg_cross · 15 queries Haiku 4.5 · KG not named · biomarkerkg_cross · 16 queries Haiku 4.5 · KG not named · biomarkerkg_cross · 18 queries Haiku 4.5 · KG not named · digcfdekg_cross · 24 queries Haiku 4.5 · KG not named · digcfdekg_cross · 7 queries Haiku 4.5 · KG not named · digcfdekg_cross · 12 queries Haiku 4.5 · KG not named · gene-expression-atlas-okn_cross · 42 queries Haiku 4.5 · KG not named · gene-expression-atlas-okn_cross · 34 queries Haiku 4.5 · KG not named · gene-expression-atlas-okn_cross · 24 queries Haiku 4.5 · KG not named · ncipidkg_cross · 20 queries Haiku 4.5 · KG not named · ncipidkg_cross · 9 queries Haiku 4.5 · KG not named · ncipidkg_cross · 3 queries Haiku 4.5 · KG not named · nde_cross · 6 queries Haiku 4.5 · KG not named · nde_cross · 14 queries Haiku 4.5 · KG not named · nde_cross · 6 queries Haiku 4.5 · KG not named · oard-kg_cross · 21 queries Haiku 4.5 · KG not named · oard-kg_cross · 15 queries Haiku 4.5 · KG not named · oard-kg_cross · 15 queries Haiku 4.5 · KG not named · pankgraph_cross · 27 queries Haiku 4.5 · KG not named · pankgraph_cross · 16 queries Haiku 4.5 · KG not named · pankgraph_cross · 9 queries Haiku 4.5 · KG not named · prokn_cross · 14 queries Haiku 4.5 · KG not named · prokn_cross · 15 queries Haiku 4.5 · KG not named · prokn_cross · 26 queries Haiku 4.5 · KG not named · rdkg_cross · 3 queries Haiku 4.5 · KG not named · rdkg_cross · 2 queries Haiku 4.5 · KG not named · rdkg_cross · 14 queries Haiku 4.5 · KG not named · spoke-genelab_cross · 9 queries Haiku 4.5 · KG not named · spoke-genelab_cross · 10 queries Haiku 4.5 · KG not named · spoke-genelab_cross · 5 queries Haiku 4.5 · KG not named · spoke-okn_cross · 62 queries Haiku 4.5 · KG not named · spoke-okn_cross · 13 queries Haiku 4.5 · KG not named · spoke-okn_cross · 10 queries KG named, −6 tools ≥940 Haiku 4.5 · KG named, −6 tools · biobricks-aopwiki_cross · 8 queries Haiku 4.5 · KG named, −6 tools · biobricks-aopwiki_cross · 29 queries Haiku 4.5 · KG named, −6 tools · biobricks-aopwiki_cross · 25 queries Haiku 4.5 · KG named, −6 tools · biomarkerkg_cross · 41 queries Haiku 4.5 · KG named, −6 tools · biomarkerkg_cross · 50 queries Haiku 4.5 · KG named, −6 tools · biomarkerkg_cross · 31 queries Haiku 4.5 · KG named, −6 tools · digcfdekg_cross · 29 queries Haiku 4.5 · KG named, −6 tools · digcfdekg_cross · 25 queries Haiku 4.5 · KG named, −6 tools · digcfdekg_cross · 19 queries Haiku 4.5 · KG named, −6 tools · gene-expression-atlas-okn_cross · 39 queries Haiku 4.5 · KG named, −6 tools · gene-expression-atlas-okn_cross · 37 queries Haiku 4.5 · KG named, −6 tools · gene-expression-atlas-okn_cross · 52 queries Haiku 4.5 · KG named, −6 tools · ncipidkg_cross · 36 queries Haiku 4.5 · KG named, −6 tools · ncipidkg_cross · 48 queries Haiku 4.5 · KG named, −6 tools · ncipidkg_cross · 33 queries Haiku 4.5 · KG named, −6 tools · nde_cross · 27 queries Haiku 4.5 · KG named, −6 tools · nde_cross · 16 queries Haiku 4.5 · KG named, −6 tools · nde_cross · 21 queries Haiku 4.5 · KG named, −6 tools · oard-kg_cross · 32 queries Haiku 4.5 · KG named, −6 tools · oard-kg_cross · 4 queries Haiku 4.5 · KG named, −6 tools · oard-kg_cross · 22 queries Haiku 4.5 · KG named, −6 tools · pankgraph_cross · 34 queries Haiku 4.5 · KG named, −6 tools · pankgraph_cross · 4 queries Haiku 4.5 · KG named, −6 tools · pankgraph_cross · 4 queries Haiku 4.5 · KG named, −6 tools · prokn_cross · 21 queries Haiku 4.5 · KG named, −6 tools · prokn_cross · 38 queries Haiku 4.5 · KG named, −6 tools · prokn_cross · 27 queries Haiku 4.5 · KG named, −6 tools · rdkg_cross · 25 queries Haiku 4.5 · KG named, −6 tools · rdkg_cross · 24 queries Haiku 4.5 · KG named, −6 tools · rdkg_cross · 16 queries Haiku 4.5 · KG named, −6 tools · spoke-genelab_cross · 16 queries Haiku 4.5 · KG named, −6 tools · spoke-genelab_cross · 9 queries Haiku 4.5 · KG named, −6 tools · spoke-genelab_cross · 27 queries Haiku 4.5 · KG named, −6 tools · spoke-okn_cross · 6 queries Haiku 4.5 · KG named, −6 tools · spoke-okn_cross · 41 queries Haiku 4.5 · KG named, −6 tools · spoke-okn_cross · 24 queries biobricks-aopwiki biomarkerkg digcfdekg gene-expression-atlas-okn ncipidkg nde oard-kg pankgraph prokn rdkg spoke-genelab spoke-okn

Figure 3. SPARQL queries run per attempt, same layout, on a ramp diverging about the median attempt (14 queries). The call log is written as an episode runs, so an attempt killed at the timeout still reports what it got through.

Query counts rise when the tools go — Opus 344 → 533, Haiku 541 → 940 — but nowhere near as fast as server time did. Dividing one figure by the other gives the weight of an average query:

KG named −6 tools
Opus 51.46 s/query6.94 s/query
Sonnet 53.59 s/query6.09 s/query
Haiku 4.56.02 s/query4.56 s/query

Opus's queries become 4.8× more expensive each. It is not issuing more of the same work: without get_schema and the router it writes broader, heavier queries — rediscovering the shape of the graph by scanning it.

Every arm ran zero failed queries. Whatever else the ablation changes, it does not make these models produce invalid SPARQL.



6. What it cost

Cost per Attempt, by Model — Cross Graph Corpus Heatmap of US dollars per attempt, three models x three conditions. Cost per Attempt, by Model — Cross Graph Corpus $0.05 $5.10 median $0.52 hit the 900s timeout — no cost reported total Opus 5 effort high KG named $26.76 Opus 5 · KG named · biobricks-aopwiki_cross · $0.446 Opus 5 · KG named · biobricks-aopwiki_cross · $0.670 Opus 5 · KG named · biobricks-aopwiki_cross · $0.454 Opus 5 · KG named · biomarkerkg_cross · $0.842 Opus 5 · KG named · biomarkerkg_cross · $0.532 Opus 5 · KG named · biomarkerkg_cross · $0.646 Opus 5 · KG named · digcfdekg_cross · $0.489 Opus 5 · KG named · digcfdekg_cross · $0.331 Opus 5 · KG named · digcfdekg_cross · $0.305 Opus 5 · KG named · gene-expression-atlas-okn_cross · $1.355 Opus 5 · KG named · gene-expression-atlas-okn_cross · $1.667 Opus 5 · KG named · gene-expression-atlas-okn_cross · $1.515 Opus 5 · KG named · ncipidkg_cross · $1.976 Opus 5 · KG named · ncipidkg_cross · $0.632 Opus 5 · KG named · ncipidkg_cross · $1.367 Opus 5 · KG named · nde_cross · $0.744 Opus 5 · KG named · nde_cross · $0.746 Opus 5 · KG named · nde_cross · $0.400 Opus 5 · KG named · oard-kg_cross · $0.303 Opus 5 · KG named · oard-kg_cross · $0.316 Opus 5 · KG named · oard-kg_cross · $0.340 Opus 5 · KG named · pankgraph_cross · $0.492 Opus 5 · KG named · pankgraph_cross · $0.449 Opus 5 · KG named · pankgraph_cross · $0.341 Opus 5 · KG named · prokn_cross · $0.751 Opus 5 · KG named · prokn_cross · $0.883 Opus 5 · KG named · prokn_cross · $1.315 Opus 5 · KG named · rdkg_cross · $0.374 Opus 5 · KG named · rdkg_cross · $0.403 Opus 5 · KG named · rdkg_cross · $0.419 Opus 5 · KG named · spoke-genelab_cross · $0.316 Opus 5 · KG named · spoke-genelab_cross · $0.331 Opus 5 · KG named · spoke-genelab_cross · $0.344 Opus 5 · KG named · spoke-okn_cross · $1.068 Opus 5 · KG named · spoke-okn_cross · $0.985 Opus 5 · KG named · spoke-okn_cross · $2.215 KG not named $44.14 Opus 5 · KG not named · biobricks-aopwiki_cross · $0.495 Opus 5 · KG not named · biobricks-aopwiki_cross · $0.664 Opus 5 · KG not named · biobricks-aopwiki_cross · $0.781 Opus 5 · KG not named · biomarkerkg_cross · $0.797 Opus 5 · KG not named · biomarkerkg_cross · $0.961 Opus 5 · KG not named · biomarkerkg_cross · $1.088 Opus 5 · KG not named · digcfdekg_cross · $0.509 Opus 5 · KG not named · digcfdekg_cross · $0.848 Opus 5 · KG not named · digcfdekg_cross · $0.980 Opus 5 · KG not named · gene-expression-atlas-okn_cross · $2.167 Opus 5 · KG not named · gene-expression-atlas-okn_cross · $1.571 Opus 5 · KG not named · gene-expression-atlas-okn_cross · $1.883 Opus 5 · KG not named · ncipidkg_cross · $2.270 Opus 5 · KG not named · ncipidkg_cross · $2.310 Opus 5 · KG not named · ncipidkg_cross · $1.237 Opus 5 · KG not named · nde_cross · $1.240 Opus 5 · KG not named · nde_cross · $1.102 Opus 5 · KG not named · nde_cross · $1.497 Opus 5 · KG not named · oard-kg_cross · $0.708 Opus 5 · KG not named · oard-kg_cross · $0.620 Opus 5 · KG not named · oard-kg_cross · $0.673 Opus 5 · KG not named · pankgraph_cross · $0.649 Opus 5 · KG not named · pankgraph_cross · $0.898 Opus 5 · KG not named · pankgraph_cross · $0.584 Opus 5 · KG not named · prokn_cross · $2.056 Opus 5 · KG not named · prokn_cross · $3.416 Opus 5 · KG not named · prokn_cross · $3.516 Opus 5 · KG not named · rdkg_cross · $0.765 Opus 5 · KG not named · rdkg_cross · $0.762 Opus 5 · KG not named · rdkg_cross · $1.010 Opus 5 · KG not named · spoke-genelab_cross · $0.504 Opus 5 · KG not named · spoke-genelab_cross · $0.454 Opus 5 · KG not named · spoke-genelab_cross · $0.483 Opus 5 · KG not named · spoke-okn_cross · $1.402 Opus 5 · KG not named · spoke-okn_cross · $1.187 Opus 5 · KG not named · spoke-okn_cross · $2.050 KG named, −6 tools $34.12 Opus 5 · KG named, −6 tools · biobricks-aopwiki_cross · $0.587 Opus 5 · KG named, −6 tools · biobricks-aopwiki_cross · $0.829 Opus 5 · KG named, −6 tools · biobricks-aopwiki_cross · $0.560 Opus 5 · KG named, −6 tools · biomarkerkg_cross · $0.802 Opus 5 · KG named, −6 tools · biomarkerkg_cross · $1.064 Opus 5 · KG named, −6 tools · biomarkerkg_cross · $1.165 Opus 5 · KG named, −6 tools · digcfdekg_cross · $0.442 Opus 5 · KG named, −6 tools · digcfdekg_cross · $0.566 Opus 5 · KG named, −6 tools · digcfdekg_cross · $0.446 Opus 5 · KG named, −6 tools · gene-expression-atlas-okn_cross · $2.496 Opus 5 · KG named, −6 tools · gene-expression-atlas-okn_cross · $0.879 Opus 5 · KG named, −6 tools · gene-expression-atlas-okn_cross · $1.312 Opus 5 · KG named, −6 tools · ncipidkg_cross · $1.130 Opus 5 · KG named, −6 tools · ncipidkg_cross · $2.282 Opus 5 · KG named, −6 tools · ncipidkg_cross · $2.321 Opus 5 · KG named, −6 tools · nde_cross · $0.813 Opus 5 · KG named, −6 tools · nde_cross · $0.587 Opus 5 · KG named, −6 tools · nde_cross · $0.846 Opus 5 · KG named, −6 tools · oard-kg_cross · $1.009 Opus 5 · KG named, −6 tools · oard-kg_cross · $0.781 Opus 5 · KG named, −6 tools · oard-kg_cross · $0.760 Opus 5 · KG named, −6 tools · pankgraph_cross · $0.441 Opus 5 · KG named, −6 tools · pankgraph_cross · $0.428 Opus 5 · KG named, −6 tools · pankgraph_cross · $0.388 Opus 5 · KG named, −6 tools · prokn_cross · $1.127 Opus 5 · KG named, −6 tools · prokn_cross · $1.136 Opus 5 · KG named, −6 tools · prokn_cross · $0.911 Opus 5 · KG named, −6 tools · rdkg_cross · $0.528 Opus 5 · KG named, −6 tools · rdkg_cross · $0.733 Opus 5 · KG named, −6 tools · rdkg_cross · $0.489 Opus 5 · KG named, −6 tools · spoke-genelab_cross · $0.519 Opus 5 · KG named, −6 tools · spoke-genelab_cross · $0.357 Opus 5 · KG named, −6 tools · spoke-genelab_cross · $0.296 Opus 5 · KG named, −6 tools · spoke-okn_cross · $2.136 Opus 5 · KG named, −6 tools · spoke-okn_cross · $1.080 Opus 5 · KG named, −6 tools · spoke-okn_cross · $1.874 Sonnet 5 effort medium KG named ≥$29.97 Sonnet 5 · KG named · biobricks-aopwiki_cross · $0.344 Sonnet 5 · KG named · biobricks-aopwiki_cross · $0.357 Sonnet 5 · KG named · biobricks-aopwiki_cross · $0.261 Sonnet 5 · KG named · biomarkerkg_cross · $0.484 Sonnet 5 · KG named · biomarkerkg_cross · $0.439 Sonnet 5 · KG named · biomarkerkg_cross · $0.761 Sonnet 5 · KG named · digcfdekg_cross · $0.805 Sonnet 5 · KG named · digcfdekg_cross · $0.585 Sonnet 5 · KG named · digcfdekg_cross · $0.494 Sonnet 5 · KG named · gene-expression-atlas-okn_cross · $1.878 Sonnet 5 · KG named · gene-expression-atlas-okn_cross · $1.959 Sonnet 5 · KG named · gene-expression-atlas-okn_cross · $2.682 Sonnet 5 · KG named · ncipidkg_cross · $1.674 Sonnet 5 · KG named · ncipidkg_cross · $1.998 Sonnet 5 · KG named · ncipidkg_cross · $1.641 Sonnet 5 · KG named · nde_cross · $0.425 Sonnet 5 · KG named · nde_cross · hit the 900s timeout, no cost reported Sonnet 5 · KG named · nde_cross · $0.351 Sonnet 5 · KG named · oard-kg_cross · $0.366 Sonnet 5 · KG named · oard-kg_cross · $0.377 Sonnet 5 · KG named · oard-kg_cross · $0.369 Sonnet 5 · KG named · pankgraph_cross · $0.359 Sonnet 5 · KG named · pankgraph_cross · hit the 900s timeout, no cost reported Sonnet 5 · KG named · pankgraph_cross · hit the 900s timeout, no cost reported Sonnet 5 · KG named · prokn_cross · $1.134 Sonnet 5 · KG named · prokn_cross · $0.599 Sonnet 5 · KG named · prokn_cross · $0.903 Sonnet 5 · KG named · rdkg_cross · $0.325 Sonnet 5 · KG named · rdkg_cross · $0.345 Sonnet 5 · KG named · rdkg_cross · $0.185 Sonnet 5 · KG named · spoke-genelab_cross · $0.531 Sonnet 5 · KG named · spoke-genelab_cross · $0.700 Sonnet 5 · KG named · spoke-genelab_cross · $0.442 Sonnet 5 · KG named · spoke-okn_cross · $1.967 Sonnet 5 · KG named · spoke-okn_cross · $2.575 Sonnet 5 · KG named · spoke-okn_cross · $1.652 KG not named ≥$40.89 Sonnet 5 · KG not named · biobricks-aopwiki_cross · $0.544 Sonnet 5 · KG not named · biobricks-aopwiki_cross · $0.322 Sonnet 5 · KG not named · biobricks-aopwiki_cross · $0.309 Sonnet 5 · KG not named · biomarkerkg_cross · $1.040 Sonnet 5 · KG not named · biomarkerkg_cross · $1.649 Sonnet 5 · KG not named · biomarkerkg_cross · $0.551 Sonnet 5 · KG not named · digcfdekg_cross · $0.747 Sonnet 5 · KG not named · digcfdekg_cross · $0.743 Sonnet 5 · KG not named · digcfdekg_cross · $0.617 Sonnet 5 · KG not named · gene-expression-atlas-okn_cross · $3.673 Sonnet 5 · KG not named · gene-expression-atlas-okn_cross · $2.817 Sonnet 5 · KG not named · gene-expression-atlas-okn_cross · $2.112 Sonnet 5 · KG not named · ncipidkg_cross · $1.701 Sonnet 5 · KG not named · ncipidkg_cross · $2.235 Sonnet 5 · KG not named · ncipidkg_cross · $2.063 Sonnet 5 · KG not named · nde_cross · $0.495 Sonnet 5 · KG not named · nde_cross · $1.996 Sonnet 5 · KG not named · nde_cross · $0.883 Sonnet 5 · KG not named · oard-kg_cross · hit the 900s timeout, no cost reported Sonnet 5 · KG not named · oard-kg_cross · $1.175 Sonnet 5 · KG not named · oard-kg_cross · hit the 900s timeout, no cost reported Sonnet 5 · KG not named · pankgraph_cross · $0.954 Sonnet 5 · KG not named · pankgraph_cross · hit the 900s timeout, no cost reported Sonnet 5 · KG not named · pankgraph_cross · $0.944 Sonnet 5 · KG not named · prokn_cross · $4.238 Sonnet 5 · KG not named · prokn_cross · hit the 900s timeout, no cost reported Sonnet 5 · KG not named · prokn_cross · hit the 900s timeout, no cost reported Sonnet 5 · KG not named · rdkg_cross · $0.441 Sonnet 5 · KG not named · rdkg_cross · $0.663 Sonnet 5 · KG not named · rdkg_cross · hit the 900s timeout, no cost reported Sonnet 5 · KG not named · spoke-genelab_cross · $0.599 Sonnet 5 · KG not named · spoke-genelab_cross · hit the 900s timeout, no cost reported Sonnet 5 · KG not named · spoke-genelab_cross · $0.527 Sonnet 5 · KG not named · spoke-okn_cross · $1.852 Sonnet 5 · KG not named · spoke-okn_cross · $2.761 Sonnet 5 · KG not named · spoke-okn_cross · $2.240 KG named, −6 tools ≥$29.15 Sonnet 5 · KG named, −6 tools · biobricks-aopwiki_cross · $0.637 Sonnet 5 · KG named, −6 tools · biobricks-aopwiki_cross · $0.364 Sonnet 5 · KG named, −6 tools · biobricks-aopwiki_cross · $0.447 Sonnet 5 · KG named, −6 tools · biomarkerkg_cross · hit the 900s timeout, no cost reported Sonnet 5 · KG named, −6 tools · biomarkerkg_cross · $0.607 Sonnet 5 · KG named, −6 tools · biomarkerkg_cross · hit the 900s timeout, no cost reported Sonnet 5 · KG named, −6 tools · digcfdekg_cross · $0.476 Sonnet 5 · KG named, −6 tools · digcfdekg_cross · $2.010 Sonnet 5 · KG named, −6 tools · digcfdekg_cross · $0.845 Sonnet 5 · KG named, −6 tools · gene-expression-atlas-okn_cross · $2.548 Sonnet 5 · KG named, −6 tools · gene-expression-atlas-okn_cross · $0.584 Sonnet 5 · KG named, −6 tools · gene-expression-atlas-okn_cross · $1.875 Sonnet 5 · KG named, −6 tools · ncipidkg_cross · $1.522 Sonnet 5 · KG named, −6 tools · ncipidkg_cross · $1.269 Sonnet 5 · KG named, −6 tools · ncipidkg_cross · $1.333 Sonnet 5 · KG named, −6 tools · nde_cross · $0.283 Sonnet 5 · KG named, −6 tools · nde_cross · $0.429 Sonnet 5 · KG named, −6 tools · nde_cross · $0.317 Sonnet 5 · KG named, −6 tools · oard-kg_cross · $0.565 Sonnet 5 · KG named, −6 tools · oard-kg_cross · $0.470 Sonnet 5 · KG named, −6 tools · oard-kg_cross · $1.090 Sonnet 5 · KG named, −6 tools · pankgraph_cross · $0.288 Sonnet 5 · KG named, −6 tools · pankgraph_cross · $0.256 Sonnet 5 · KG named, −6 tools · pankgraph_cross · $0.320 Sonnet 5 · KG named, −6 tools · prokn_cross · $1.720 Sonnet 5 · KG named, −6 tools · prokn_cross · $0.684 Sonnet 5 · KG named, −6 tools · prokn_cross · $1.799 Sonnet 5 · KG named, −6 tools · rdkg_cross · hit the 900s timeout, no cost reported Sonnet 5 · KG named, −6 tools · rdkg_cross · $0.455 Sonnet 5 · KG named, −6 tools · rdkg_cross · $0.488 Sonnet 5 · KG named, −6 tools · spoke-genelab_cross · $0.385 Sonnet 5 · KG named, −6 tools · spoke-genelab_cross · $0.534 Sonnet 5 · KG named, −6 tools · spoke-genelab_cross · $0.427 Sonnet 5 · KG named, −6 tools · spoke-okn_cross · $1.602 Sonnet 5 · KG named, −6 tools · spoke-okn_cross · $1.333 Sonnet 5 · KG named, −6 tools · spoke-okn_cross · $1.194 Haiku 4.5 effort default KG named ≥$9.18 Haiku 4.5 · KG named · biobricks-aopwiki_cross · $0.153 Haiku 4.5 · KG named · biobricks-aopwiki_cross · $0.153 Haiku 4.5 · KG named · biobricks-aopwiki_cross · $0.129 Haiku 4.5 · KG named · biomarkerkg_cross · $0.500 Haiku 4.5 · KG named · biomarkerkg_cross · $0.314 Haiku 4.5 · KG named · biomarkerkg_cross · $0.346 Haiku 4.5 · KG named · digcfdekg_cross · $0.163 Haiku 4.5 · KG named · digcfdekg_cross · $0.310 Haiku 4.5 · KG named · digcfdekg_cross · $0.169 Haiku 4.5 · KG named · gene-expression-atlas-okn_cross · $0.566 Haiku 4.5 · KG named · gene-expression-atlas-okn_cross · $0.466 Haiku 4.5 · KG named · gene-expression-atlas-okn_cross · $0.380 Haiku 4.5 · KG named · ncipidkg_cross · $0.419 Haiku 4.5 · KG named · ncipidkg_cross · $0.257 Haiku 4.5 · KG named · ncipidkg_cross · $0.356 Haiku 4.5 · KG named · nde_cross · $0.131 Haiku 4.5 · KG named · nde_cross · $0.447 Haiku 4.5 · KG named · nde_cross · $0.129 Haiku 4.5 · KG named · oard-kg_cross · $0.233 Haiku 4.5 · KG named · oard-kg_cross · $0.297 Haiku 4.5 · KG named · oard-kg_cross · hit the 900s timeout, no cost reported Haiku 4.5 · KG named · pankgraph_cross · hit the 900s timeout, no cost reported Haiku 4.5 · KG named · pankgraph_cross · $0.180 Haiku 4.5 · KG named · pankgraph_cross · hit the 900s timeout, no cost reported Haiku 4.5 · KG named · prokn_cross · $0.353 Haiku 4.5 · KG named · prokn_cross · $0.426 Haiku 4.5 · KG named · prokn_cross · $0.361 Haiku 4.5 · KG named · rdkg_cross · hit the 900s timeout, no cost reported Haiku 4.5 · KG named · rdkg_cross · $0.214 Haiku 4.5 · KG named · rdkg_cross · hit the 900s timeout, no cost reported Haiku 4.5 · KG named · spoke-genelab_cross · $0.191 Haiku 4.5 · KG named · spoke-genelab_cross · $0.219 Haiku 4.5 · KG named · spoke-genelab_cross · $0.140 Haiku 4.5 · KG named · spoke-okn_cross · $0.338 Haiku 4.5 · KG named · spoke-okn_cross · $0.477 Haiku 4.5 · KG named · spoke-okn_cross · $0.360 KG not named $11.75 Haiku 4.5 · KG not named · biobricks-aopwiki_cross · $0.214 Haiku 4.5 · KG not named · biobricks-aopwiki_cross · $0.130 Haiku 4.5 · KG not named · biobricks-aopwiki_cross · $0.117 Haiku 4.5 · KG not named · biomarkerkg_cross · $0.340 Haiku 4.5 · KG not named · biomarkerkg_cross · $0.517 Haiku 4.5 · KG not named · biomarkerkg_cross · $0.294 Haiku 4.5 · KG not named · digcfdekg_cross · $0.345 Haiku 4.5 · KG not named · digcfdekg_cross · $0.156 Haiku 4.5 · KG not named · digcfdekg_cross · $0.307 Haiku 4.5 · KG not named · gene-expression-atlas-okn_cross · $0.754 Haiku 4.5 · KG not named · gene-expression-atlas-okn_cross · $0.651 Haiku 4.5 · KG not named · gene-expression-atlas-okn_cross · $0.477 Haiku 4.5 · KG not named · ncipidkg_cross · $0.450 Haiku 4.5 · KG not named · ncipidkg_cross · $0.327 Haiku 4.5 · KG not named · ncipidkg_cross · $0.249 Haiku 4.5 · KG not named · nde_cross · $0.225 Haiku 4.5 · KG not named · nde_cross · $0.428 Haiku 4.5 · KG not named · nde_cross · $0.190 Haiku 4.5 · KG not named · oard-kg_cross · $0.480 Haiku 4.5 · KG not named · oard-kg_cross · $0.342 Haiku 4.5 · KG not named · oard-kg_cross · $0.296 Haiku 4.5 · KG not named · pankgraph_cross · $0.294 Haiku 4.5 · KG not named · pankgraph_cross · $0.269 Haiku 4.5 · KG not named · pankgraph_cross · $0.210 Haiku 4.5 · KG not named · prokn_cross · $0.308 Haiku 4.5 · KG not named · prokn_cross · $0.311 Haiku 4.5 · KG not named · prokn_cross · $0.368 Haiku 4.5 · KG not named · rdkg_cross · $0.129 Haiku 4.5 · KG not named · rdkg_cross · $0.066 Haiku 4.5 · KG not named · rdkg_cross · $0.509 Haiku 4.5 · KG not named · spoke-genelab_cross · $0.200 Haiku 4.5 · KG not named · spoke-genelab_cross · $0.195 Haiku 4.5 · KG not named · spoke-genelab_cross · $0.227 Haiku 4.5 · KG not named · spoke-okn_cross · $0.766 Haiku 4.5 · KG not named · spoke-okn_cross · $0.413 Haiku 4.5 · KG not named · spoke-okn_cross · $0.194 KG named, −6 tools ≥$11.88 Haiku 4.5 · KG named, −6 tools · biobricks-aopwiki_cross · $0.795 Haiku 4.5 · KG named, −6 tools · biobricks-aopwiki_cross · $0.322 Haiku 4.5 · KG named, −6 tools · biobricks-aopwiki_cross · $0.246 Haiku 4.5 · KG named, −6 tools · biomarkerkg_cross · $0.653 Haiku 4.5 · KG named, −6 tools · biomarkerkg_cross · $0.550 Haiku 4.5 · KG named, −6 tools · biomarkerkg_cross · $0.416 Haiku 4.5 · KG named, −6 tools · digcfdekg_cross · $0.323 Haiku 4.5 · KG named, −6 tools · digcfdekg_cross · $0.256 Haiku 4.5 · KG named, −6 tools · digcfdekg_cross · $0.225 Haiku 4.5 · KG named, −6 tools · gene-expression-atlas-okn_cross · $0.560 Haiku 4.5 · KG named, −6 tools · gene-expression-atlas-okn_cross · $0.489 Haiku 4.5 · KG named, −6 tools · gene-expression-atlas-okn_cross · $0.772 Haiku 4.5 · KG named, −6 tools · ncipidkg_cross · $0.534 Haiku 4.5 · KG named, −6 tools · ncipidkg_cross · $0.610 Haiku 4.5 · KG named, −6 tools · ncipidkg_cross · $0.528 Haiku 4.5 · KG named, −6 tools · nde_cross · $0.356 Haiku 4.5 · KG named, −6 tools · nde_cross · $0.219 Haiku 4.5 · KG named, −6 tools · nde_cross · $0.284 Haiku 4.5 · KG named, −6 tools · oard-kg_cross · $0.349 Haiku 4.5 · KG named, −6 tools · oard-kg_cross · hit the 900s timeout, no cost reported Haiku 4.5 · KG named, −6 tools · oard-kg_cross · hit the 900s timeout, no cost reported Haiku 4.5 · KG named, −6 tools · pankgraph_cross · hit the 900s timeout, no cost reported Haiku 4.5 · KG named, −6 tools · pankgraph_cross · hit the 900s timeout, no cost reported Haiku 4.5 · KG named, −6 tools · pankgraph_cross · hit the 900s timeout, no cost reported Haiku 4.5 · KG named, −6 tools · prokn_cross · $0.438 Haiku 4.5 · KG named, −6 tools · prokn_cross · $0.343 Haiku 4.5 · KG named, −6 tools · prokn_cross · $0.305 Haiku 4.5 · KG named, −6 tools · rdkg_cross · hit the 900s timeout, no cost reported Haiku 4.5 · KG named, −6 tools · rdkg_cross · $0.252 Haiku 4.5 · KG named, −6 tools · rdkg_cross · $0.331 Haiku 4.5 · KG named, −6 tools · spoke-genelab_cross · $0.213 Haiku 4.5 · KG named, −6 tools · spoke-genelab_cross · hit the 900s timeout, no cost reported Haiku 4.5 · KG named, −6 tools · spoke-genelab_cross · $0.250 Haiku 4.5 · KG named, −6 tools · spoke-okn_cross · $0.509 Haiku 4.5 · KG named, −6 tools · spoke-okn_cross · $0.484 Haiku 4.5 · KG named, −6 tools · spoke-okn_cross · $0.265 biobricks-aopwiki biomarkerkg digcfdekg gene-expression-atlas-okn ncipidkg nde oard-kg pankgraph prokn rdkg spoke-genelab spoke-okn

Figure 4. Cost per attempt in US dollars, same layout, about a median attempt of $0.52. Blank squares are episodes killed before the agent host reported a cost, so those row totals are lower bounds. This is the only place in the study where cost is quantified.

Cost does not track server time. For both Opus and Sonnet the costliest arm is KG not named, while the slowest arm at the endpoint is −6 tools:

Costliest arm Slowest arm at the server
Opus 5KG not named — $44.14−6 tools — 3,697s
Sonnet 5KG not named — ≥$40.89−6 tools — ≥4,564s

Haiku is omitted because for it the two coincide, and its three totals are near-identical lower bounds.

Per attempt, Haiku costs $0.25–$0.33 against Opus's $0.74–$1.23. But it answered 28 attempts correctly to Opus's 99, in twice the wall-clock time. Over the whole study Opus cost $105.02 and Sonnet ≥$100.01, for 99 and 75 correct attempts. The cheap model was not a cheap way to run this benchmark.



7. Totals

Per arm, in absolute terms — the same numbers the figures' row totals carry:

Model Condition Server time Queries Cost Stalls
Opus 5all tools · KG named501s344$26.760
all tools · KG not named1,445s413$44.140
−6 tools · KG named3,697s533$34.120
Sonnet 5all tools · KG named≥1,947s542≥$29.973
all tools · KG not named≥2,476s723≥$40.897
−6 tools · KG named≥4,564s749≥$29.153
Haiku 4.5all tools · KG named≥3,256s541≥$9.185
all tools · KG not named2,394s576$11.750
−6 tools · KG named≥4,285s940≥$11.887

≥ marks a row containing an episode killed at the 900s timeout: its server time stopped early and its cost was never reported, so both understate, and they understate most in the arms that struggled most.

Per model, across all three arms:

Model Attempts exact Stalls Wall clock Server time Queries Cost
Opus 599/10805.7 h5,643s1,290$105.02
Sonnet 575/1081310.0 h≥8,987s2,014≥$100.01
Haiku 4.528/1081210.6 h≥9,935s2,057≥$32.81

Opus answered 3.5× as many attempts correctly as Haiku, in half the wall-clock time, for three times the price. Sonnet cost essentially the same as Opus for three-quarters of the accuracy and twice the time. A smaller model was not a cheaper way to run this benchmark — only Haiku was materially cheaper, and it was the one that mostly did not work.

8. Which tools were used

query, get_join_strategy and submit_csv appear in every arm. route_query and list_graphs appear almost exclusively when the KG is not named, which is the KG-hint axis behaving as designed. get_join_strategy is used throughout — this is the cross tier, where a join always has to be worked out.


9. Capability under a resource budget

Sections 4 to 7 report both ablations as costs in time and money, and section 3 reports almost none in accuracy — Opus's ever exact never leaves 12/12 whatever is taken away. Those two readings coexist only because nothing here was rationed: the single ceiling was the 900s agent timeout, which bound on 25 of 324 episodes and on none that answered correctly. Under a budget, efficiency is capability — and the study can be asked that question without running anything, because what each attempt spent is already recorded per episode. Below, an attempt counts only if it was correct and stayed inside the budget.

Nothing in this section is a lower bound. It reads the resource use of correct episodes only, and an episode killed at the timeout produced no answer — a failure at every budget, never in a numerator. The ≥ that qualifies the totals in section 7 has no counterpart here, and build_budget.py refuses to print at all if any correct episode has an incomplete record.

Under a server-time budget

Model Condition ≤10s ≤20s ≤40s ≤80s no cap
Opus 5all tools · KG named2629313434
all tools · KG not named1821242833
−6 tools · KG named45101732
Sonnet 5all tools · KG named1319232529
all tools · KG not named510151821
−6 tools · KG named2351325
Haiku 4.5all tools · KG named46111213
all tools · KG not named23368
−6 tools · KG named00017

Ration the endpoint and the ablated arm collapses where uncapped it looked nearly free. Opus falls from 32 correct to 5 at a 20-second budget, while its equipped arm only goes 34 → 29: a two-attempt difference becomes a twenty-four-attempt one. The KG-hint arm barely notices (33 → 21), because it was never spending its resource here.

Correct answers within a server-time budget of x per attempt, three models by three conditions. Answers Affordable at a Given Server-Time Budget, by Condition — Cross Graph Corpus all tools · KG named all tools · KG not named −6 tools · KG named Opus 5 0 7 14 21 28 34 2s 5s 10s 20s 50s 100s 200s 500s Opus 5 · all tools · KG named: 34 correct, cheapest 1.819s Opus 5 · all tools · KG not named: 33 correct, cheapest 1.682s Opus 5 · −6 tools · KG named: 32 correct, cheapest 3.298s Sonnet 5 2s 5s 10s 20s 50s 100s 200s 500s Sonnet 5 · all tools · KG named: 29 correct, cheapest 2.359s Sonnet 5 · all tools · KG not named: 21 correct, cheapest 3.264s Sonnet 5 · −6 tools · KG named: 25 correct, cheapest 5.976s Haiku 4.5 2s 5s 10s 20s 50s 100s 200s 500s Haiku 4.5 · all tools · KG named: 13 correct, cheapest 2.599s Haiku 4.5 · all tools · KG not named: 8 correct, cheapest 4.583s Haiku 4.5 · −6 tools · KG named: 7 correct, cheapest 70.024s server-time budget per attempt (seconds, log scale) answers correct

One panel per model, all six sharing one pair of axes so a difference in shape is a difference in the data and not in the scale. Each line steps up once per correct answer, ordered by what that answer cost, and flattens at that arm's uncapped total. So a point reads: at this budget per attempt, this arm would still have got this many right. The curves are exact at every budget, where the tables above sample four — and a table of four columns cannot show where two lines cross.

The ablated arm is shifted right in all three panels, and it is the same shift each time. That is what makes it a property of the toolkit rather than of a model: green tracks blue in shape and lags it in price, on models whose uncapped scores differ by a factor of two and a half. The KG-not-named arm sits between them, nearer to equipped than to ablated — withholding the graph name costs endpoint time, withholding the six tools costs an order of magnitude more of it.

Under a cost budget

Model Condition ≤$0.25 ≤$0.50 ≤$1.00 ≤$1.50 no cap
Opus 5all tools · KG named018263034
all tools · KG not named03192633
−6 tools · KG named08212832
Sonnet 5all tools · KG named115212129
all tools · KG not named03111321
−6 tools · KG named013172025
Haiku 4.5all tools · KG named1113131313
all tools · KG not named68888
−6 tools · KG named16777

Ration tokens instead and the ordering reverses in the two models with room to show it. At $0.50 Opus scores 18 equipped and 8 with the six tools withheld, but only 3 with the graph unnamed; Sonnet is 15 equipped, 13 ablated, 3 unnamed. The arm that survives an endpoint budget is the one a token budget breaks. Haiku does not reverse — its ablated arm is the worse of the two on both axes — but Haiku is the model section 10 reports as saturated, and its uncapped 13 / 8 / 7 is already inside the noise of a twelve-question set.

Correct answers within a token budget of x per attempt, three models by three conditions. Answers Affordable at a Given Token Budget, by Condition — Cross Graph Corpus all tools · KG named all tools · KG not named −6 tools · KG named Opus 5 0 7 14 21 28 34 $0.2 $0.5 $1 $2 $5 Opus 5 · all tools · KG named: 34 correct, cheapest $0.30321 Opus 5 · all tools · KG not named: 33 correct, cheapest $0.454412 Opus 5 · −6 tools · KG named: 32 correct, cheapest $0.296241 Sonnet 5 $0.2 $0.5 $1 $2 $5 Sonnet 5 · all tools · KG named: 29 correct, cheapest $0.184565 Sonnet 5 · all tools · KG not named: 21 correct, cheapest $0.308613 Sonnet 5 · −6 tools · KG named: 25 correct, cheapest $0.25582 Haiku 4.5 $0.2 $0.5 $1 $2 $5 Haiku 4.5 · all tools · KG named: 13 correct, cheapest $0.128727 Haiku 4.5 · all tools · KG not named: 8 correct, cheapest $0.129922 Haiku 4.5 · −6 tools · KG named: 7 correct, cheapest $0.219096 token budget per attempt (US dollars, log scale) answers correct

The two ablations swap places between the two figures. Read the panels side by side: under a server-time budget green (−6 tools) is the laggard and orange (KG not named) is close to the baseline; under a token budget it is the reverse, with green tracking blue closely and orange falling away. Same nine arms, same episodes, opposite conclusions — the only thing that changed is which resource is scarce.

This is the "two currencies" result of section 10 restated as capability rather than as overhead: whether withholding a tool costs you answers depends on which resource you are short of.

Budget needed to reach 50% of the equipped arm's uncapped score

Model Target Condition Server budget vs equipped Cost budget vs equipped
Opus 517/36all tools · KG named5.8s1.0×$0.491.0×
all tools · KG not named8.9s1.5×$0.901.8×
−6 tools · KG named76.2s13.1×$0.781.6×
Sonnet 515/36all tools · KG named10.4s1.0×$0.491.0×
all tools · KG not named39.0s3.7×$1.853.7×
−6 tools · KG named92.6s8.9×$0.571.1×
Haiku 4.57/36all tools · KG named24.2s1.0×$0.181.0×
all tools · KG not named82.7s3.4×$0.271.5×
−6 tools · KG named319.2s13.2×$0.613.4×

Reading a single fixed budget invites picking a flattering one, and the tables above span an eight-fold range in server time and a six-fold one in cost — enough room for a reader to find almost any headline. Inverting the question resists that: for each model, the smallest budget at which an arm still gets half of what the equipped arm managed with no budget at all.

The server column separates cleanly, and the same way in all three models — withholding the six tools costs 8.9–13.2× the endpoint budget, withholding the graph name 1.5–3.7×. The cost column is both smaller and inconsistent in direction (1.8× / 3.7× / 1.5× against 1.6× / 1.1× / 3.4×), so the token-budget reversal above is a two-model observation and not a law. The endpoint-budget result is the one that carries.

This budget was applied after the fact

Every number above is censoring, not a run under a constraint. Each episode was recorded with no budget in force, and a budget is then drawn across what it happened to spend. That assumes the agent's trajectory would have been identical up to the moment the budget bound — which is exactly what the 900s timeout does, and exactly what a real budget would not do.

The assumption fails in a known direction. An agent told it has twenty seconds of endpoint time would triage: fewer exploratory queries, narrower patterns, an earlier commit to an answer. It should therefore score better than truncating its unconstrained trajectory predicts. Read the capped columns as a floor on the capped arm's score, and the gaps as a ceiling on the effect. What this establishes is that the effect exists and which resource it is denominated in — not its size.

Running it prospectively

The harness is most of the way there. --agent-timeout is already a prospective wall-clock budget, and the proxy already times every call, so a cumulative server-time budget is the same mechanism one level down: refuse once an episode's endpoint total passes the ceiling, and record the refusal the way a withheld tool's is recorded, so a budget-exhausted episode is distinguishable in the log from a wrong answer. A token budget is harder and would not be symmetric — the agent host reports cost only on a clean exit, so it would have to be approximated from token accounting mid-episode rather than enforced exactly.

Two design points would matter more than the mechanism. Whether the agent is told its budget decides what is being measured: an unannounced ceiling reproduces the censoring above under real conditions, while an announced one measures triage, which is the more useful capability and the harder scoring problem. And the budget has to be fixed across arms, not per-arm, or the comparison dissolves. Both make it a fourth axis rather than a fourth condition, and axes are expensive: three budget levels across the three existing arms is nine cells, 324 episodes per model — the whole study again, three times over. A single ceiling added to the three arms is 108 episodes, and answers the narrower question of whether the censoring above survives enforcement.


10. Overall assessment

The two ablations stress different resources

Across all three models the two axes separate cleanly — and they separate the same way in each one, which is what makes the result trustworthy at n = 12.

Relative to the equipped arm Accuracy Median server time Queries Cost
KG not named−1 / −8 / −5 attempts1.4× / 1.4× / 1.5×1.20× / 1.33× / 1.06×1.65× / 1.36× / 1.28×
−6 tools−2 / −4 / −6 attempts9.5× / 5.3× / 4.5×1.55× / 1.38× / 1.74×1.27× / 0.97× / 1.29×

Values are Opus / Sonnet / Haiku.

Withholding the KG name is a reasoning cost. Token cost rises in all three models (1.28–1.65×) while endpoint work barely moves. The agent has to work out which two graphs the question is about, and that happens in the model rather than at the endpoint.

Section 9 restates this as capability rather than overhead. Give an agent a fixed endpoint budget and the ablated arm starts losing answers it does not lose here; give it a fixed token budget and the unnamed-graph arm does instead. Which tool is worth having depends on which resource is scarce — a question this study can only ask retrospectively, and section 9 says so.

Withholding the six discovery tools is an endpoint cost. The median attempt gets 4.5–9.5× slower at the server in all three models, while token cost stays essentially flat (0.97–1.29×). The agent compensates for the missing schema by interrogating the graph directly.

So an ablation that looks mild on one axis can be severe on the other, and neither time nor money alone describes what a tool is worth. get_schema and the router are cheap in tokens and enormous in endpoint load; naming the graph is the reverse.

What running the ablation on weaker models adds

The intuitive expectation — that a weaker model leans on the tools more, so the ablation shows a larger effect — is only half right, and the half that fails is the half that matters for measurement.

The attempt-level signal does grow as the model weakens. Removing the six tools costs Opus 2 attempts, Sonnet 4 and Haiku 6. On that measure the weaker the model, the more the tools are demonstrably worth.

The question-level signal collapses. On always exact the same ablation costs −2, −1 and −1. Haiku starts at 1/12 and cannot fall below 0/12, so the metric saturates before the effect can be seen; its two ablation deltas are indistinguishable from each other and from noise.

And for Haiku the failure sits upstream of the tools. Its ever exact is 8/12, 5/12 and 7/12 — it does not reliably reach a correct answer in any condition, and three questions are blank across all nine of their attempts. What a tool would have saved a model that is not succeeding either way is not measurable.

Sonnet is the informative middle case: capable enough for the metric to have room to move, weak enough that it does move. The KG-name ablation costs it 8 attempts and 4 questions — the largest single effect in the study, and one Opus is too strong to show.

A tooling ablation therefore needs a model that can already do the task. Too strong, and the accuracy deltas are small while the real result moves into efficiency, as it does for Opus. Too weak, and there is no signal at all. Report attempt-level counts alongside question-level ones, or the weak-model arm will read as saying nothing when it is in fact where the raw counts move most.


11. Limitations

12. Reproducing the numbers

export CORPUS=benchmarks-cross
uv run okn-benchmark reference --corpus "$CORPUS"          # ground truth, no model

for model in claude-opus-5 claude-sonnet-5 claude-haiku-4-5-20251001; do
  out=runs-${model}-cross
  # full toolkit, both KG-hint modes
  for hint in tags none; do
    uv run okn-benchmark run --corpus "$CORPUS" --tier cross --tools all-tools \
        --kg-hint "$hint" --out "$out" --profile profiles/mcp-proto-okn.local.toml \
        --model "$model" --repeat 3 --agent-timeout 900
  done
  # the same toolkit minus the six discovery tools
  uv run okn-benchmark run --corpus "$CORPUS" --tier cross --tools all-tools \
      --kg-hint tags --out "$out" --profile profiles/mcp-proto-okn.local.toml \
      --model "$model" --repeat 3 --agent-timeout 900 \
      --without-tool get_description --without-tool get_query_template \
      --without-tool get_schema --without-tool list_graphs \
      --without-tool route_query --without-tool visualize_schema
  uv run okn-benchmark report "$out" --markdown "$out/README.md"
done

uv run python results-cross/build_comparison.py                  # the six cross-model figures
uv run python results-cross/build_budget.py                      # the section 9 budget tables

Add --effort high for Opus and --effort medium for Sonnet to match the recorded runs; Haiku takes no --effort flag, so it runs at the CLI default. Each is that model's default.

Where the figures live:

File Contents
runs-*-cross/summary.csvone row per question × condition × attempt
runs-*-cross/conditions/*.jsoncondition settings, provenance and aggregates
runs-*-cross/<question>_results/ground_truth.csvexpected rows, diffable against any answer.csv
runs-*-cross/README.mdthe generated per-model report
results-cross/*-by-model.svgthe four cross-model grids, built by build_comparison.py
results-cross/budget-panels-*.svgthe section 9 affordability panels, from the same script
results-cross/build_budget.pythe section 9 tables, recomputed from the same episodes

Each conditions/*.json records the corpus and its ref, the profile, model, effort, agent version, reference endpoint and engine, and the scoring parameters — so every number is attributable to a specific build rather than to "the server" in the abstract.