Barkup Bench
AtomBarkup Bench is our open research project measuring how large language models read and edit structured document trees. Every study is pre-registered: the hypotheses, task corpora, prompts, and analysis plan are committed to a public repository before a single model is called, and the results are published as found, corrections included.
The Findings in One Sentence
Give every node a stable id, never make the model reproduce anything it is not changing, and hand it everything the request assumes: the nodes it must read in the view, the goal it must satisfy in the memo. Everything the benchmark validated ships in the open-source barkup library, linked in the sidebar with the full article series below.
Barkup Bench · pre-registered · corrected 2026-07-06 · studies F–AO
Every id-stable interface works, until trees get big or sessions get long. Then only anchored patches do, and they barely need to see the tree.
What the Recipe Costs
Finding where to look costs one search call. Remembering the session costs two worked examples plus a memo, even 36 edits in. The view is a correctness contract: what the model must read, it must be shown. Views carry values; memos carry goals. The agent can be trusted to write the memo itself, and "undo that" needs an echo, not a transcript.
Asking Beats Guessing
The series-long villain fell too. Offered one sentence of permission, every model asked instead of guessing, 270 out of 270. The silence was protocol, not blindness. Re-running the whole core stack on claude-opus-4.8, the tier our surfaces actually ship, passed every gate: the frontier does not need the training wheels, though they cost nothing to keep.
Where the Late Studies Closed the Borders
Restating a goal the model merely read does nothing; where a goal comes from matters more than saying it aloud. The memo is flawless until its twenty-note cap, where it silently discards exactly what it exists to remember, so the eviction is now deterministic and goal-safe. Some gaps are capabilities, not prompts: the ambiguity fix rescued the model we do not run and added nothing to the one we do. And told nothing but "that was invalid," models fixed their patches anyway. The error message was for us, not them.
Methods & Provenance
Main study: 200 seeded tasks × 6 conditions × 4 models × 2 regimes at temperature 0 (July 2026). Every follow-up study is pre-registered by commit before its first scored run and published as found, corrections included; the full catalog lives in the study index below, one page per study. All numbers are protocol-v2 corrected: the original interface-reliability gaps were an artifact of conversation histories that hid the model's own tool calls (vercel/ai#16840). Charts show parity prompts, models pooled unless noted, with Wilson 95% intervals. Conditions: A HTML + whole-tree rewrite, B JSON + rewrite, C JSON + mutation tools, D HTML + tools, E JSON Patch, and F id-anchored patch.
H2 · task success by tree size
At benchmark sizes (5–150 nodes), no interface dominates
Whole-tree rewrite (A, B) leads granular tools (C, D) at every size tested. The gap peaks on small/medium trees and narrows; but never reverses; at ~150 nodes. JSON Patch (E) collapses to 69.6% on large trees; and the pre-registered addendum condition F (id-anchored patches) recovers it exactly to rewrite level at the lowest token cost.
Data table; success by condition × size (parity, pooled)
H4 · multi-turn reference tasks, by model
Corrected: multi-turn reference edits are near-parity
Success on “insert a node, then edit it by the id from your own output”; protocol v2. With the model's own tool history visible, every interface is near-parity (A 88.1% vs C 91.3%, n.s.); gemini's residual tools deficit is phase-1 editing accuracy, not follow-up dropout. Zero id-reference failures in any arm, ever. The dramatic v1 gaps live in the footgun chart below.
Data table; reference-family success by model × condition (parity)
H3 · mean tokens per solved task
Rewrite is cheap where trees are small; HTML is the terser artifact where they're large
Tools arms (C, D) resend a growing conversation every call, so they burn 4–5× more tokens on small/medium trees. At ~150 nodes the whole-artifact arms grow too; and the HTML dialect (A, 15.6k) undercuts JSON rewrite (B, 23.0k) by ~30%: the one place the format measurably matters.
Data table; mean total tokens per solved task (parity, pooled)
Overall · success per model × condition (parity, 200 tasks each)
Frontier models don't care; smaller models do
Per-cell task success. Down the sonnet-4.5 and gpt-5.4 rows the interface barely matters; down the haiku-4.5 and gemini-3.5-flash rows the tools arms give up 10–17 points against rewrite.
The follow-up series · studies G–AO
Every Study, One Page Each
The main study above set the baseline; everything since has been a pre-registered follow-up, each with its own charts, gates, and verdict. Grouped by theme, or subscribe to the Atom feed to hear about new studies as they publish:
Interface reliability
- Study G · One hidden SDK default, two very different benchmarks The original +33pp multi-turn gap was manufactured by conversation histories that omitted the model's own tool calls (the AI SDK v5→v7 response.messages trap).
- Study H · The crossover, found: above ~300 nodes, only anchored patches hold Whole-tree rewrite becomes frontier-only at scale (gemini-flash: 0/15 at ~1000 nodes; sonnet needs a streaming transport and ten minutes per rewrite).
Views & grounding
- Study I/J · The model doesn't need to see the tree: a ~1.5k-token view matches the full 85k-token input Show only the path to the referenced nodes plus their child lists (everything else collapsed or omitted with a count), and anchored-patch accuracy is statistically unchanged for both models at every size; sonnet on the .
- Study L · Finding the node is the expensive part: grounding costs 7–9 points, and navigation is a frontier-only trap Same edits, instructions rewritten without ids ("the image-atom named 'maple-ember'"), every description verified to match exactly one node.
- Study N · Stop walking, start searching: one find_nodes call grounds the edit on both model tiers Same id-free tasks as Study L; the expand tool replaced by a single content-search tool (a few words in, the 5 best keyword matches out, shown in place).
- Study Q · "Change every X inside Y" breaks everything; including the oracle One instruction, 2–32 targets, on the same large trees.
- Study U · The view that can't see the answer doesn't fail; it makes something up Focused views assume the instruction carries every value an edit needs.
- Study AN · Ask or act: tool availability dissolves the visibility-clause tax With a view tool simply available, the ~70% NEED-INFO tax on fully specified edits vanished on every tier; the tested fetch-before-ask prompt clause was redundant on the frontier and unsafe below it, so it stays unshipped.
Sessions & memory
- Study K · Sessions drift unless you re-show the tree; and showing a fresh view every turn is also the cheapest policy Twelve sequential patches against one evolving tree.
- Study M · The view carries the state, but history still earns its keep If a fresh view arrives every turn, does the model need conversation history at all? No; statelessness confirmed the constant-cost economics (~1.3k input tokens at step 1 and step 12 alike) but failed the accuracy gate:.
- Study O · Printing the position on every node does not rescue stateless sessions Study M's stateless failures were all placement edits, so Study O annotated every view child with its true 1-based position (plus a prompt line mapping ordinals to anchors) and re-ran the 2×2 of history × positions.
- Study P · History was a teacher all along: two canned examples replace the whole conversation If history isn't state (the view carries that) and isn't positional help (Study O), maybe it's worked precedent; and precedent can be faked.
- Study S · 36 edits later, nothing broke; except the cost curve Every prior session study ran 12 edits.
- Study T · The one thing statelessness can't do; and the three note lines that fix it Every prior session study used self-contained requests, so Study T built the missing class: callback steps whose required fact lives only in earlier conversation; a declared codename a later rename must use, and a stand.
- Study W · The agent writes the memo faithfully; even when history makes it redundant Studies T and V validated the memo with oracle extraction: the harness knew what to record.
- Study X · "Undo that" needs an echo, not a transcript The last structurally unmeasured request class: follow-ups that point at the previous edit; "also set that same node's…", "apply the same change to X", "actually, undo that." Anaphora steps ran against skeleton views (a.
- Study Y · The memo survives how people actually talk Every declaration in Studies T, V, and W was announced formulaically ("For later reference: the codename is X").
- Study AH · Perfect to the cap. At the cap, the goals die first. Every study that shipped the session-notes memo measured it at three to six notes; the shipped implementation caps it at twenty, with a normalize step that silently drops the excess.
- Study AK · The fix works where it can, and the frontier tier invented consolidation Study AH found that a twenty-first declaration at the memo's full cap always kills a note, and the victim is always a goal.
- Study AL · The gate fails on a moved baseline; and unproven does not ship Study AK left one pathway open: the app-side eviction cannot restore a note the model pruned before sending, and the mid tiers pruned goals client-side in 4 to 6 cells of ten.
- Study AM · The notice learned to ask for everything back Twice in two studies; both times unregistered; opus answered an eviction notice by re-sending the memo compressed into fewer sentences carrying all twenty-one needles: told a note had died, the frontier tier invented l.
- Study AQ · The powered fence: vindicated where it no longer matters, harmful where it does AL's fence sentence, powered 4× and aimed at the swap candidates: it closes sonnet's prune pathway completely (16/40 to 0/40, p=.00002), does nothing on gemini, is unnecessary on fable-5 (which spontaneously consolidates losslessly), and is actively harmful on kimi-k3 (prunes 5/40 to 18/40) — one sentence, four dispositions, and the fence line closes for the successor tiers.
- Study AR · Advertised headroom: one line of state outdoes the rule, and a binding number is poison A capacity state line ('an update may include up to 24 notes') harms nothing anywhere, erases cap-edge pruning completely on sonnet (18/40 to 0/40) and gemini (15/40 to 0/40, the first intervention ever to move it), perfects fable-5, and is inert on kimi-k3, whose losses turn out to be intrinsic lossy consolidation; the truecap arm shows a binding number is catastrophic.
Qualitative (Track 2)
- Study V · Views carry values, memos carry goals The series' first judge-graded study, run under a pre-registered pairwise protocol: both judges (gpt-5.4 primary, haiku-4.5 sensitivity; neither an editor) first had to pass a 50-pair calibration gate with planted verdi.
- Study AF · Saying the goal out loud doesn't make it yours One clause in the shipped session-notes rule had been inferred rather than measured: restate a goal from the memo in your own words before a goal-directed rewrite.
Standing context
- Study Z · The brand pack works; the rule you forgot is the hazard Production doc editors ship a standing context block with every request; company facts, client records, a styleguide; and nobody had measured whether models actually use it.
- Study AA · We tested our own headline and lost: strictness is not a capability gradient Study Z’s spec-conflict split was an accident with one conflict shape, so Study AA measured it on purpose: three registered conflict kinds (rule vs instruction, an explicit user countermand of a rule, rule vs rule), four.
Asking & calibration
- Study AC · The model always knew what it couldn’t see Twenty-eight studies of silent failure (90/90 invented values in U, 144/144 silent guesses in X, 120/120 oblivious polishes in V, zero clarifying questions anywhere) never once OFFERED the model a way out.
- Study AE · Only the frontier knows when a question is the right answer Study AC left two fears on the record: that the escape hatch would tax clear requests with unnecessary questions, and that an ask might be a dead end.
- Study AI · The obvious fix, measured: it helps exactly where we don't ship Study AE left an obvious fix on the table: the shipped ask sentence covers what the model cannot see, so ambiguous references (visible, but two of them) slipped through on the mid tiers.
- Study AG · The discourse gap closes on every tier; the visibility clause bites One border of the ask-path map was never tested: Study X's discourse construction, where "undo that" against a carrier-less editor failed 0 of 144 with every failure a valid silent guess.
Confirmations & machinery
- Study AD · The core stack transfers to the tier we actually ship Studies F through U validated the core editing stack on sonnet-4.5 and gemini-3.5-flash, but the downstream template-editing surface runs claude-opus-4.8, a tier whose benchmark data began at Study W.
- Study AJ · The error message didn't matter Returning barkup's structured validation issues verbatim has been a design commitment in every arm of this series, the closing instruction of playbook guideline 01, and standing guidance in the production codebase, and i.
- Study OW · The open-weight backfill: the cheapest model passed everything; two frontiers failed the same gate gpt-oss-120b clears all 13 shipped-guardrail regression gates at 33 cents; kimi-k3 and fable-5 both go 12/13, red on the same memo-cap-edge slice via cap-obedient goal pruning; kimi-k3 posts the best adjacent-class tag numbers measured; the guardrail stack proves tier-robust down to the cheapest open-weight model.
Agent-surface steering
- Study AO · Canonical-tag steering: the catalog read is the whole mechanism Unguided models never match a tag catalog's exact casing (0/36 clean everywhere); with a tags_list tool they consult it unprompted and land canonical on the first attempt; warnings alone cannot recover, and hard gating is unnecessary.
- Study AP · The off-catalog fork: one sentence settles the foreign branch; the registration loses the adjacent one The frontier tier refuses to tag off-catalog topics unaided (12/12 empty, replicating AO); one sentence of tool-description guidance closes the sub-frontier gap on every tier; a guarded tag_create tool stays fully disciplined; the adjacent-class gate failed on solo-authored acceptable sets, and the AP′ re-score under an independently authored key passes.
The article series · every post, in order
The Full Series
Every post in the Barkup Bench series, in order. Start at the top for the whole story, or jump straight to the current capstone, Hand It Everything It Needs.
- HTML as a Native Data Format for LLMs: Why We Encode Our Data in Markup Instead of JSON Jul 4, 2026
- We Benchmarked It: What Held Up in 'HTML as a Native Data Format for LLMs', and What Didn't Jul 6, 2026
- barkup 0.2: We Shipped What the Benchmark Told Us Jul 6, 2026
- A Deprecated Accessor That Still Typechecks Broke My Benchmark (and Maybe Your Agent) Jul 6, 2026
- We Found the Crossover (It Wasn't Where Anyone Looked) Jul 7, 2026
- The Model Doesn't Need to See Your Tree Jul 7, 2026
- Your Agent's Session Is Drifting (and the Fix Is Cheaper Than the Bug) Jul 7, 2026
- barkup 0.3: Focused Views, or Why the Model Doesn't Need to See Your Tree Jul 8, 2026
- Stable IDs Are All You Need: Seven Studies on Letting LLMs Edit Trees Jul 8, 2026
- We Tried to Delete the Hard Parts. The Benchmark Said No. Jul 8, 2026
- Then We Found the Cheap Part: One Search Call Grounds LLM Tree Edits Jul 9, 2026
- barkup 0.4: The Model Finds the Node Now Jul 9, 2026
- Your Agent Doesn't Need a Memory: Two Worked Examples Replace Session History Jul 10, 2026
- barkup 0.5: Your Code Finds the Targets Now Jul 10, 2026
- The Thirty-Sixth Edit: Long LLM Sessions Don't Need Memory Either Jul 10, 2026
- The Two Things Your Agent Can't See: Memos and Mentioned Nodes Jul 10, 2026
- Views Carry Values, Memos Carry Goals: Our First Judge-Graded Study Jul 11, 2026
- Who Writes the Memo? Auditing the Safety Net We Shipped Jul 12, 2026
- Hand It Everything It Needs: 23 Pre-Registered Studies on LLM Document Editing Jul 12, 2026
- Undo That: The One-Line Echo That Replaces a Transcript Jul 12, 2026
- Stronger LLMs Follow Conflicting Instructions More Literally, Not Less Jul 13, 2026
- The Model Always Knew What It Couldn't See Jul 13, 2026
- The Frontier Doesn't Need the Training Wheels (We Re-Ran Everything to Find Out) Jul 15, 2026
- Only the Frontier Knows When to Ask Jul 15, 2026
- Repeating the Goal Doesn't Make It Yours Jul 16, 2026
- The Twenty-First Note: How Three Neutral Components Compose into Silent Data Loss in LLM Memos Jul 16, 2026
- It Asked About Things It Already Knew Jul 16, 2026
- The Error Message Didn't Matter Jul 17, 2026