Repository navigation
v0.2.0
v0.2.0 — 2026-09-15
The release that measures itself. A new verb reports what packing a task is
worth with both arms measured, the corpus over bundlebox actually exercises
bundlebox, and five files that had grown past the point where a session reads a
region instead of a file are split.
Added
bb bench— the ablation. The same task twice: BARE searches the tree for
its terms and opens the top--capfiles whole, PACKED is the one
bb pinpointprompt for it. Both arms are token counts over text on disk, so
neither calls a model and two runs on one tree return the same number —
asserted in CI and inbb selftest. A task that costs MORE packed than bare
is printed in the table, not dropped.bb bench initderives a suite from the
open findings that name a file;bench initandbench runare stages of the
measuregear, so the number refreshes on the same tick that folds the ledger.- The command centre reports it. Four stat cards, each tagged MEASURED or
ESTIMATE so the two cannot be read as one kind of number, and two inline-SVG
charts: bare against packed per task, and the share saved across every run. No
CDN — a chart that needs a network is a blank rectangle on the box this page
is designed for. New routesGET /healthandGET /api/bench. - An ambiguity ledger on every brief.
bb pinpointnow states what the
brief does NOT settle — no gate detected, nothing in the symbol tables
matched, no region located, no evidence on file, a scope cut to fit, a
statement too thin to locate anything — scored, with the reasons kept separate
from the score. Stated, never filled in by guessing. anti-slopdetector. Eight JS/TS patterns that discard evidence or pay a
quadratic cost: adjacent eagerfilter/map, a reducer copying its
accumulator per element, chained assertions,anyin a contract, open
dictionaries, mocked modules,Reflectescapes. One rule firing once is
infoand can never be promoted into work; three rules in one file is
medium.- A corpus over bundlebox itself. Twenty scenarios, fifty-five steps — the
CLI's dry runs, the MCP handshake, the command centre's four routes, the
bench's own determinism — committed and run in CI against a live command
centre. Coverage 96.6%. A corpus persona can now declareexcluded: a
capability it must not run, with a reason, leaves the denominator instead of
being an open gap forever. bb helpis a table. Verb, effect, what it does, grouped by the question
each group answers. Theeffectcolumn readsspends/writes --apply/
records/reads, so which two verbs can cost money is read rather than
remembered.docs/prior-art.md: seven projects read, what came back and what did not.
Fixed
bb cron installwrote a line that ran nothing. No--apply, so the
unattended worker reportedwould-runevery thirty minutes and produced
nothing indefinitely while looking installed. It carries the flag now, and
refuses to install if the gear reaches a verb that can spend — checked against
the gear spec rather than assumed. A selftest holds both halves.- The coverage matcher compared the first token, so one step running
bb scanreported all twenty-threebb *capabilities as covered and a
one-step corpus read as 100%. It matches the whole command, understands
node bin/bb.js scanas the same capability as the documentedbb scan,
treats a declared--applyas significant, and matches each segment of a
shell line. bb genesisre-seeding a corpus rewrotepersona.jsonfrom a fixed field
list and silently dropped every key not on it.bb simulatemerged findings only when a run produced some, so findings
from a run against a service that was down could never be closed by a clean
run. A clean run is the evidence that closes them.- The
simulationsframe read every run ever stored, so one bad run poisoned
simulation-error-pctpermanently. It reads the latest run per profile; the
history stays on disk forbb simulate show. - A deliberate 404 probe was reported as a phantom call against an undeclared
route. A step asserting absence is not evidence of a missing route. - World derivation extracted a formula (
projected = overhead + ...), acd
and prose lines from fenced blocks as command capabilities, each of which
stayed permanently uncovered. .gitignoreexcluded directory contents rather than directories, because git
cannot re-include a path inside an excluded directory — written the old way,
the corpus would never have shipped.
Changed
- Five files past a third of one session's payload are split along the seams
they already declared, with each entry point kept as a barrel so no caller
outside the directory changed:kernel/src/scenario.rs→
scenario/{expect,steps}.rs;src/snapgen/tables.js→
{walk,symbols,views,sources}.js;src/git/index.js→
{repo,commit,forge}.js;src/pipeline/runner.js→{facts,report}.jswith
runGearsplit intodecide()andexecute();src/genesis/index.js→
{world,packs}.js.src/commandcenter/page.jsand
src/designlabs/scaffold.jscrossed the same bar and are split too. - The workspace's runbook service is the command centre, which answers
/health;bb runbook upstarts it and the smoke profile runs against it. - CI runs the corpus, the simulation, the bench determinism check and the evals.
Measured
225 node tests, 23 expert tests, 25 selftest checks, 0 lint errors, 0 open
high-severity findings, 10 of 10 pipeline stages holding.
On this tree, twelve bench tasks: 700.3k bare against 34.6k packed. That
percentage is a property of the tree as much as of the tool, which is why
bundlebox-projects/tokenlab sweeps it across three tree sizes and three read
budgets and reports 78%–97%. What holds across all nine of those rows is the
middle column: the packed arm is constant. A pinpoint prompt costs what the task
costs; the bare arm pays for the repository.