bundlebox · benchmarks

What the same task costs, with the factory and without it.

Two arms on the same checkout, the same issue text and the same estimator. Bare is what an agent does with a shell: grep the tree, read what came back, open the top files. bundlebox is one bb pinpoint brief. Neither arm called a model, so none of these numbers is a guess about one.

SWE-bench Verified · 100 instances · 2026-09-22 · 967.3s
bundlebox's own findings · 12 tasks · 2026-09-22 · 32.5s

context per task

67.5%

less than bare — 8.7k → 2.8k tokens

gold files located

64.3%

in the packed scope, against 24.6% bare

cost per 1k tasks

$29.42

saved on Opus 5 at list price

tasks per 1M tokens

352

against 114 bare — 3.1×

Localisation is a file-level score against the maintainer's own patch. It is not a resolve rate: no model was called and no test was run.

SWE-bench Verified · 100 instances

Context put in the window, per task

Same issue text, same checkout, same estimator. Bare greps the tree, reads what came back, then opens an 80-line range in each of the top 10 files; bundlebox answers with one bb pinpoint brief. Averaged over 100 instances and over this repository's own 12 open findings.

bare Claudebundlebox Claude
SWE-bench Verified (100 instances)8.7k tok2.8k tokbundlebox's own findings (12 tasks)23.1k tok4.5k tok

67.5% less on SWE-bench (3.1×) and 80.7% less here (5.2×). Both arms are token counts over text on disk. Neither called a model.

Table view
suitebare / taskbundlebox / tasksavedratio
SWE-bench Verified8.7k2.8k67.5%3.1×
bundlebox findings23.1k4.5k80.7%5.2×

derived · list prices as of 2026-09-13

What one task costs to read, in dollars

The measured token counts above, multiplied by each model's published input price. Derived, not measured: no request was sent. One task, read once, no cache.

bare Claudebundlebox Claude
Opus 54.4¢1.4¢Sonnet 51.7¢0.57¢Haiku 4.50.87¢0.28¢

Per 1,000 tasks that is $43.59 against $14.17 on Opus 5 — $29.42 saved. Prices: vendor pricing pages (Anthropic, OpenAI, Google), see docs/prices.md.

Table view
modelbare / taskbundlebox / taskbare / 1k tasksbundlebox / 1k tasks
Opus 54.4¢1.4¢$43.59$14.17
Sonnet 51.7¢0.57¢$17.43$5.67
Haiku 4.50.87¢0.28¢$8.72$2.83

SWE-bench Verified · 126 gold files

Did the files the maintainer changed make the window?

Scored against patch, the fix that ships with the dataset. In scope means the brief budgets the file to be read; named means it is also pointed at as a ranked candidate. This is a localisation score, not a resolve rate.

bare Claudebundlebox Claude
Gold files recalled24.6%64.3%Instances with every gold file26%61%Instances with at least one30%70%

64.3% of gold files are inside the packed scope against 24.6% for the bare arm, and 83.3% are at least named. Whole instances: bundlebox has every gold file in scope on 61 of 100 against 26 bare — and the bare arm read 10 whole files to get there.

Table view
measurebare Claudebundlebox Claude
gold files recalled24.6% (31/126)64.3% (81/126)
gold files named—83.3% (105/126)
instances with every gold file26/10061/100
instances with at least one30/10070/100
files put in front of the model10 read whole6.8 in scope (avg)

measured wall-clock · per arm

Time to a window, and the time the model then spends reading it

The one chart that does not favour bundlebox. Building a brief is real local work: 8.9s against 246ms to grep and read. That is the trade — seconds of your CPU for tokens of the model's window.

bare Claudebundlebox Claude
Assembling the window — SWE-bench, a repo bb has never seen (100 instances)246ms8.9s

Most of that is a first visit: 6.6s of the 8.9s is building the symbol space for a repository bb has never scanned, which a workspace pays once rather than per task. Against it, the window the model then has to read: 8.7k tokens bare, 2.8k packed. Prefill is the model's time rather than yours and scales with the count — set a rate and the arithmetic follows.

Table view
stagebare Claudebundlebox Claude
assemble the window — repo never scanned246ms8.9s
— of which: the first-visit symbol space—6.6s
tokens the model must then read8.7k2.8k

SWE-bench Verified · every instance

The gap, instance by instance

Not an average. Each x is one of the 100 instances, sorted by what the bare arm cost. The bundlebox curve stays flat because a brief is budgeted; the bare curve is whatever the tree happened to contain.

bare Claudebundlebox Claude
02.8k5.6k8.4k11.2kmost contextleast — 100 instances

Widest gap: django__django-12663 at 10.8k against 2.1k. 0 instance(s) cost more packed than bare; they are counted in every total on this page.

derived from the measured averages

Tasks you get from a million input tokens

The same budget, divided by what one task costs to read.

bare Claudebundlebox Claude
Tasks per 1M input tokens114 tasks352 tasks

352 against 114 — 3.1× the work from the same budget.

Table view
budgetbare Claudebundlebox Claude
1M input tokens114 tasks352 tasks

150 recorded runs

Every run the store has kept

One measure per panel, because a single flattering run is not evidence and two suites are not two arms. The step on 1cdb60a is the baseline changing: the bare arm stopped reading matched files whole and started opening one 80-line range per hit. Everything left of it is measured against a more wasteful bare arm.

Context saved — bundlebox's own findings0%50%100%bare arm re-modelled — 1cdb60a80.7%09-1509-22Context saved — SWE-bench Verified0%50%100%bare arm re-modelled — 1cdb60a67%09-1509-22Gold files located — SWE-bench Verified0%50%100%63.3%09-1509-22

131 runs on this repository's findings, 19 on SWE-bench. Localisation is the line that moved on its own merits: 57.1% of gold files on the first recorded run, 63.3% on the last. The baseline change did not touch it.

DeepSWE

A benchmark this page has no number on

Everything above is a context measurement: what goes in the window, and whether the right files are in it. It is deliberately not a resolve rate. DeepSWE is a resolve rate, on 113 long-horizon tasks with program-based verifiers — the measurement this repository keeps saying it does not make.

So the board is here as published, the column bundlebox would act on is marked, and the size of run it would take to say anything is worked out. No bundlebox row is drawn, because none has been measured. The arm is written and the harness is validated; what is missing is the trials.

published · 113 tasks · 2026-09-22

DeepSWE, as the board reports it

A real resolve rate on 113 long-horizon tasks, pass@1, single attempt, all on mini-swe-agent, for consistency across models. These are Datacurve's measurements, not ours — read off the public board and reproduced nowhere in this repository. Anthropic models are marked.

0%25%50%75%100%gpt-6-astra74% ±3gemini-3.8-flash74% ±1claude-opus-574% ±4gpt-5.6-sol73% ±3claude-fable-570% ±3glm-5.369% ±3kimi-k369% ±5grok-4.667% ±2gpt-5.6-luna67% ±4gpt-5.567% ±6claude-sonnet-5 (bundlebox)≥67% ±3gemini-3.7-flash65% ±3glm-5.3-flash63% ±4deepseek-v4-pro63% ±6claude-opus-4.859% ±2qwen3.8-max57% ±3muse-spark-1.255% ±2claude-sonnet-554% ±4deepseek-v4-flash53% ±4gemini-3.6-flash47% ±4glm-5.244% ±2gemini-3.5-flash36% ±4

The board's own reading is that leading coding benchmarks are saturating at the frontier: the top nine sit inside eight points of each other with intervals of ±1 to ±6, so most of that ordering is not separable. claude-sonnet-5 scores 54% ±4.

The hollow green row is not a result and not a prediction. bundlebox has never been run on this benchmark. It marks the bar: on all 113 tasks the smallest gain separable from 54% is 10.1-15.4 points depending on how often the two arms disagree, so anything below about 67% would be indistinguishable from changing nothing. It is drawn so the empty space is visible rather than implied.

Table view
modelscore$/tasktokens/tasksteps
gpt-6-astra74% ±3$4.4330k29
gemini-3.8-flash74% ±1$2.36143k166
claude-opus-574% ±4$11.84118k99
gpt-5.6-sol73% ±3$6.4660k61
claude-fable-570% ±3$13.4180k68
glm-5.369% ±3$3.9980k124
kimi-k369% ±5$4.6581k98
grok-4.667% ±2$3.4550k70
gpt-5.6-luna67% ±4$0.6173k102
gpt-5.567% ±6$7.2346k82
gemini-3.7-flash65% ±3$2.0394k117
glm-5.3-flash63% ±4$0.2473k123
deepseek-v4-pro63% ±6$1.67106k155
claude-opus-4.859% ±2$13.22135k120
qwen3.8-max57% ±3$3.7395k111
muse-spark-1.255% ±2$3.7099k101
claude-sonnet-554% ±4$26.40214k268
deepseek-v4-flash53% ±4$0.46108k153
gemini-3.6-flash47% ±4$2.2196k117
glm-5.244% ±2$3.9278k129
gemini-3.5-flash36% ±4$3.4576k105
claude-sonnet-5 (bundlebox)≥67% to be detectable — never run———

published · the axis bundlebox acts on

Context per task, on the same board

bundlebox changes neither the model, the scaffold nor the task. It changes what goes in the window. So this is the column where it could act at all — and it is the column claude-sonnet-5 is worst on.

0k55k110k165k220kgpt-6-astra30kgemini-3.8-flash143kclaude-opus-5118kgpt-5.6-sol60kclaude-fable-580kglm-5.380kkimi-k381kgrok-4.650kgpt-5.6-luna73kgpt-5.546kgemini-3.7-flash94kglm-5.3-flash73kdeepseek-v4-pro106kclaude-opus-4.8135kqwen3.8-max95kmuse-spark-1.299kclaude-sonnet-5214kdeepseek-v4-flash108kgemini-3.6-flash96kglm-5.278kgemini-3.5-flash76k

claude-sonnet-5 spends 214k tokens and $26.40 across 268 steps per task — 2.6× the median of 81k, and the dearest row on the board — to land 54%. Nothing here says bundlebox would move that. It says this is where a change would have to show up.

derived · arithmetic over the board

What a run here could actually tell you

Both arms run the same tasks, so the test is McNemar's on the tasks where they disagree. How many that is — the discordance rate — is not known until a run happens, so this is drawn as a band across three assumptions rather than one line. Derived, not measured.

01020304050113 tasks — the whole corpus15%25%35%10113500tasks per arm (log)armsdisagreepts

On all 113 tasks the smallest gain separable from 54% is 10.1 to 15.4 points depending on how often the arms disagree — about 13 at the middle assumption. A 10-point gain needs 118 to 275 tasks, so this corpus is borderline for ten points and adequate for fifteen. Treating the two arms as independent samples instead of pairs would put that figure near 376 and understate the benchmark badly.

Table view
tasks per arm15% discordance25%35%
1014.2 pts23.8 pts33.2 pts
2514.2 pts23.8 pts31.6 pts
5014.2 pts19.3 pts22.9 pts
11310.1 pts13 pts15.4 pts
2506.8 pts8.8 pts10.4 pts
5004.8 pts6.2 pts7.4 pts
10003.4 pts4.4 pts5.2 pts

Method

How the two arms are run

For each instance: clone the repository at the instance's own base_commit (blobless), hand bb only the issue text, and take two arms — BARE (search the tree, open the top N files whole) and PACKED (one bb pinpoint prompt). Score both file sets against the files the maintainer's own patch touched, which ships with the dataset. Both token counts come from bb's estimator over text on disk. Neither arm called a model.

The bare arm

Grep the checkout for the task's terms, read the search output, then open a 80-line range around the first hit in each of the top 10 files. This is the cheapest honest baseline: it is what a shell gives an agent that has no index.

The bundlebox arm

One bb pinpoint prompt for the same task — the located regions, the scope it may edit, the evidence already on file, and a budget. At most 12 files enter scope.

What is measured and what is not

Reproduce

npm i -g bundlebox
bb bench swebench run --n 100   # the public instances above
bb bench run                     # this repository's open findings
node scripts/benchmark-page.mjs  # rebuild this page from both

The run writes every instance id it used, so the number can be reproduced or contradicted.