Skip to content

v0.7.0

Choose a tag to compare

@github-actions github-actions released this 22 Sep 10:24
· 73 commits to main since this release
5e8bc49

v0.7.0 — 2026-09-22

The release where the locate is aimed, the work is labelled, and the factory is
put under its own microscope.

v0.6.0 measured the loop against itself. This one acts on what the measurement
said. The content search was returning an arbitrary twelve files and now
returns the best twelve, scored. Four fitted heads went in and every one of
them abstains until it beats its own holdout. bb intent replaced the fix
that every prompt was being labelled with in silence. And a fifth mainboard
category reads this box's own output, because bb mainboard gaps reported a
healthy queue while fifty-nine of its sixty-two units were the same finding.

Measured

grepHits, 100 SWE-bench Verified instances (78 django, 22 astropy), 126 gold
files, same instances each run, no model called:

arm in scope named packed ratio
before 73/126 57.9% 75.4% 333.7k 2.6x
scored grep, slice 6 82/126 65.1% 83.3% 336.3k 2.6x
scored grep, slice 12 81/126 64.3% 83.3% 283.3k 3.1x

MAX_FILES 6 -> 12 is a cost change and not a recall one: recall moves by one
gold file of 126 and the prompt is 16% smaller. Instances where a plain grep
reached a gold file the brief never mentioned: 2 before, 0 after. bb pinpoint
stays at 0 model tokens, 0.54s against a 0.78s baseline and a 1s gate — the
first version lowercased every file to search it and doubled the locate to
1.5s.

What each fitted head has to stand on, on this tree:

task-head         n=12, 10 of 12 fires led to an edit — no win over the regex yet
confidence prior  18 acted_on of 156 — the constant stays
symbol space      2,945 symbols x terms, stdlib SVD, 1.6s, 95 KB
locate aim        unknown, n=3 over 1 brief, against a floor of 12 over 4

Every one abstains until it beats its holdout, which today means none of them
steers. That is the result, not a step before it.

bb genesis --finding swept over all 945 open findings: the 28 that name a
route or a command each derived a capability, the rest derived the row saying
they could not, and every one derived a rule.

Round trips, from the shapes the sessions actually recorded: 1.04 tool calls
per turn, npm run -> npm test -> npm run the most common three-command run
here, and git status -> git diff recurring 17 times across the 18 sessions
that run either.

Added

bb intent — which kind of unit a prompt is. fix, verify, investigate,
build or write, decided from a table fitted offline rather than from a model at
prompt time. The kind picks the output reserve reserveFor reads, and the
shipped table reserves 12k for a fix against 40k for an investigation, so the
label moves ~28k of window between room-to-write and code-to-read. Until this
existed autoPinpoint passed fix for every prompt — a wrong answer on every
question that is not one, billed every turn. Five one-vs-rest heads rather than
one multiclass fit, so a kind the join never labelled falls back on its own
instead of taking the other four down, each carrying its own useful. Same
prompt plus same table gives the same kind every time, offline, and the
derivation comes back with the decision. Fitted at session end, the one budget
allowed to call Jev.

bb case — everything the board knows about one subject. Six subsystems
can each be right and leave nobody able to say what happened: a declared
service down, a corpus that cannot run, eleven spun sessions, tokens-per-turn
at 2.3x its ceiling, one detector owning 89% of the queue. Nothing here
collects anything — every row was already in the store — and a subject is
equality on a value a row already names: a file, or a service, stage,
session, detector, corpus, base, url, view or area in its
evidence. Deliberately not a connected component: the first build used one and
produced a single case of 622 rows, because a duplication finding bridges the
two files it names and enough bridges merge the tree. occurred.js dates a row
from git:last-touch or from the evidence itself and reports how many rows it
could place, rather than copying first_seen and turning every timeline into a
record of when the scans ran.

The proofhouse — FACTORY, a fifth mainboard category whose subject is this
box.
bb mainboard gaps reported "Agent: 62 unit(s) ready of 66" while
fifty-nine of those were one fileless finding scoped to the whole repository,
6.9M projected tokens, every part verdict FITS, and nothing in the tree could
say so. Four checks, each arithmetic over an artefact already on disk, each
naming what it read in its evidence. A check that cannot look reports blind
instead of nothing. It runs last in the tick, because a queue is worth checking
once it is full, and it is wired into the factory gear as an optional step.

bb genesis --finding <id> and --ticket <file>. Two inlets beside the
document: the row's path is the surface, its detail is the rule, the routes and
commands it names are capabilities, and everything it cannot settle is an
unknown row.

bb genesis practice. The round loop that sends packs, verifies what came
back, keeps or rejects each scenario and records the lessons. It resolves the
persona's base against services.json and starts what declares it — services
declared and none at this base is a mismatch it refuses to run at, no services
at all is a base a person keeps up. A round that keeps a red-under-a-rule
scenario compiles and routes what it merged, so it ends holding a budgeted unit
and a lane. Two stops: a ceiling re-read at the top of every round, and
coverage holding across two rounds.

bb gates run and bb situation. At 1.04 tool calls per turn every turn
is a full replay, so the cheapest saving is a verb that answers a whole
situation in one call. gates run runs each distinct gate once and stops at
the first failure; situation returns the tree, the gates, the stale
artefacts, the packed work and the last echos run.

bb grapple, asking Jev. A calibrated opinion on each contested shape
before the queue is ranked, behind TYPESAFE_API_KEY, off with BB_JEV=off,
and null on any failure. jev.probabilities() exposes the same call to a
caller that composes its own state, so the prompt path gets the same treatment
as opinions().

spends: true on a pipeline stage, refused by the runner unless
bridge.enabled, bridge.daily_budget_usd and lanes.daily_budget_usd are
all set, with the missing one named. bb cron install --spend writes the line
for it as a separate list, so the default install has no branch to get wrong,
and the three keys are read at the tick — unsetting one stops the loop without
touching the crontab.

over_by in bb tokens budget: the fold gap reported, not closed.

ui steps in the corpus: four verbs, a driver declared in persona.json,
no model between the step and the action. page reads a local HTML file,
playwright and adb are imported at run time and report their absence rather
than throwing.

Changed

grepHits scores before it slices. It scored nothing and stopped at the
first twelve files matching any of the four longest terms, in directory order.
It now scores every file by how many distinct long terms it carries, returns
the best twelve, runs on every locate rather than only when the symbol tables
went quiet, and weights its hits by that count instead of a flat 1.

ambiguity() can now be unresolved. Its eight signals were all presence
tests, so a locate that matched three irrelevant symbols reported nothing
wrong. PRECISION gains lexical and for_rule() becomes a ninth signal that
fires only on a measured locate under its own prior. locate-replay scores
only the EXCEPTION rows — an obedient agent edits inside the scope by
construction, so an in-scope edit measures obedience and not aim — and drops a
file changed and changed back inside one window first.

per_detector reads the open count, not the run. Four rows a run over a
hundred runs never tripped a per-run limit: 285 duplicate-blocks and 200
oversight:duplication rows sat on an 875-row board while every run stayed
inside its budget. A row whose actuator closes it is exempt; a plan- actuator
is not, because it writes the plan behind a decision and leaves the finding
open. 485 rows now report as counts and every suppressed count is printed
rather than dropped.

aggregate() splits by intent kind. Re-reading while investigating is
reading; re-reading while fixing is the waste the rule was written for, and
averaging the two hides both. buckmaster joins sessions to intent rows for
the label and prints the split only when more than one kind is present.
reserveSamples reads intent rows too, so the reserve table is checkable
against located prompts and not only against the sessions a lane ran.

bb lathe apply reads grapple's proposals. Every row past the bar is
reported as proposed with the step still missing. Nothing from grapple becomes
a file and the ledger is untouched, so reach and tombstone are unaffected. An
absent file reports present: false rather than that grapple earned nothing.

One similarity in janitor/heap.js over terms, files, prefix and title,
with an optional fitted table and the Jaccard as the documented fallback;
bench/gate.js delegates to it. converge.rs is kept on purpose: the arc is
the independent second opinion.

Fixed

The repository root is not a scope. A finding with no files whose only
location is . is about the workspace, not about code in it. Handing . to
context.evaluate expanded it to every file in the tree, reported SPLIT, and
returned one window-sized slice of the repository per part — twelve such
findings compiled to fifty-nine units holding 6.8M projected tokens. A
directory below the root still counts, because ui-generic files one row per
directory and those files are the finding. An empty scope is a state the brief
already names.

The packed bench arm builds the target's symbol space before ranking, and
the run records in how many targets it was built, so a mixed run cannot be read
as one number.