surface-bench

June 16, 2026 · View on GitHub

A pre-registered, provider-agnostic benchmark measuring how documentation accuracy changes an LLM coding agent's task performance, and through what mechanism. This card describes the released data so other researchers can reuse it. The study itself is written up in PAPER.md.

  • License: CC BY 4.0 (data, scenarios, research docs) — see LICENSE-DATA. The harness code is MIT — see LICENSE.
  • Citation: see CITATION.cff (GitHub renders a "Cite this repository" button).
  • No PII. All data are model completions on synthetic, author-written fixtures.

What's included

Two committed snapshots under results/, each fully re-gradeable from its raw model outputs:

SnapshotModeModelsCompletionsErrors
results/2026-06-13-pilot-full-matrix/single-shot (pilot)3 Claude1,3200
results/confirmatory-20260616T172420Z/multi-turn (confirmatory)5 across Anthropic / OpenAI / Google3,2500

The confirmatory run is the centerpiece (pre-registered, git-tagged prereg-v2-multi). Each snapshot carries a PROVENANCE.md documenting exactly how it was produced.

Each snapshot directory contains:

  • raw.jsonl — one JSON object per graded completion (the primary data; see schema below).
  • summary.json — computed aggregates (rates, deltas, tokens, verification, per-scenario/tier).
  • run.json — full run provenance (model ids + prices, trials, temperature, max_tokens, mode, max_turns, conditions, scenarios, surf --version, and any pre-declared excluded_scenarios).
  • report.md, *.png — the standalone human-readable write-up and figures.

Conditions

Every cell holds the same code, task, and model; only the documentation block changes:

Context shown to the agent
C0code only (no doc)
C1code + stale doc (true at T0; code has moved to T1)
C2code + fresh doc (matches T1)
C3code + stale doc + genuine surf check divergence report (includes corrected code)
Cwcode + stale doc + a content-free "may be outdated" warning

raw.jsonl schema

One object per completion. Fields common to all rows:

FieldTypeMeaning
scenariostrscenario id (e.g. cascade-quota-batcher-code)
task_typestrcode or qa
tierstrdifficulty tier (T1 buried, T2 premise, …)
conditionstrC0Cw (see above)
modelstrshort model name (haiku, sonnet, opus, gpt, gemini)
trialint0-based repetition index
outputstrthe model's raw final text (re-gradeable)
input_tokens / output_tokensinttoken usage
cost_usdfloatestimated cost at the prices in run.json
okboolsuccess — produced the current (T1) answer
misledboolmisled — asserted the stale (T0) claim
detailstrgrader detail (e.g. correct test passed)
parsedobjparser output (applied files / parsed verdict)

Multi-turn rows additionally carry:

FieldTypeMeaning
modestrmulti (single-shot pilot rows omit this)
turnsintagent turns used
stop_reasonstrwhy the loop ended (e.g. final_answer)
tool_callslistthe read-only tool calls made
verified_hiddenboolwhether the agent read the hidden dependency before answering
per_turn_tokenslistper-turn token counts

Failed cells (none in the released snapshots) would carry an error field instead of grades.

Loading

import json
rows = [json.loads(l) for l in open("results/confirmatory-20260616T172420Z/raw.jsonl")]

# e.g. success rate for stale docs (C1) per model
from collections import defaultdict
agg = defaultdict(list)
for r in rows:
    if r["condition"] == "C1":
        agg[r["model"]].append(r["ok"])
print({m: round(sum(v)/len(v), 3) for m, v in agg.items()})

Regenerate summary.json, report.md, and figures offline (no model calls, no spend):

uv sync
uv run python -m surface_bench.report results/confirmatory-20260616T172420Z
uv run python -m surface_bench.oracle  results/confirmatory-20260616T172420Z

Provenance & integrity

  • Pre-registration was git-tagged (prereg-v2-multi, surf 0.6.2) before the confirmatory run; hypotheses, conditions, metrics, and the analysis plan are frozen in PREREGISTRATION.md.
  • Grading is fully deterministic (hidden unit tests / fixed-format verdict rubrics) — no LLM judge. Ground truth for cascade scenarios is derived by probing the real hidden dependency.
  • Per-snapshot PROVENANCE.md records assembly, row counts, spend, and any oracle flags.

Limitations

Curated synthetic fixtures (not real repositories), a read-only agent loop (no edit/run/test thrash), Python and TypeScript only. See PAPER.md §8 for the full threats-to-validity treatment.

Citing this dataset

This dataset is archived on Zenodo with a permanent DOI:

DOI: 10.5281/zenodo.20722100 (concept DOI — always resolves to the latest version).

Machine-readable citation metadata is in CITATION.cff. Each tagged GitHub release is archived as a new Zenodo version under this concept DOI.