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 · 19.9s

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.7k tok4.8k tok

67.5% less on SWE-bench (3.1×) and 79.7% less here (4.9×). 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.7k4.8k79.7%4.9×

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 named83.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.9sAssembling the window — a workspace already scanned (12 tasks)38ms1.6s

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 space6.6s
assemble the window — workspace already scanned38ms1.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

142 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 — 1cdb60a79.7%09-1509-22Context saved — SWE-bench Verified0%50%100%bare arm re-modelled — 1cdb60a67.5%09-1509-22Gold files located — SWE-bench Verified0%50%100%64.3%09-1509-22

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

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.