Repository navigation
v0.8.0
v0.8.0 — 2026-09-22
The release where a probability model watches the agent, and Jev's word reaches
the price of a lane.
Until now Jev was asked one kind of question, whether a contested shape is
deliberate, and only the ask queue read the answer. This release gives the
answer two more readers. Triage prices a finding with it, and a new verb,
bb foreman, asks Jev about the agent's run itself: is it stuck, off track,
finished, verified. Every Jev call now survives a slow reply.
Added
bb foreman — a responsibility policy over the coding agent (#64).
The design is thruwire/foreman's, ported
into the Python expert (expert/bundlebox_expert/foreman.py, stdlib only).
Six responsibilities own twelve yes/no checks: human escalation, repository
instructions, documentation (routed, asked only when the job calls for docs),
worker health, completion and verification. Jev answers every check in one
call. A deterministic policy turns the probabilities into one of continue,
steer, stop, verify, resume, finish or escalate. Thresholds and priorities are
thruwire's.
bb foreman [--job "..."] [--since <rev>] [--active] score the run, pick one action
bb foreman verify [--cmd "npm test"] run verification against the current tree
bb foreman replay [--set <check>=<bar>] re-decide the timeline under other bars
bb foreman label <#> right|wrong mark a recorded action for replay
bb foreman log | checks
- Without a key the checks come from what the box already records:
grapple's drift window for stuck and off track, git's changes for work done,
and the lastbb foreman verifyrun. Evidence cannot tell whether a job's
requirements are met, so on evidence alonefinishneeds a passing
verification. - A run's commits are its work (#65). A run is measured from a base
commit:--since, else the base its first assessment recorded, else HEAD at
the session's first tool call. Before this, a run that committed as it went
looked like a run that had done nothing. - A verification is tied to the tree's content hash, built with
git write-treein a throwaway index. Committing a verified tree keeps it
verified. Editing it makes the verification stale. - Every assessment is a row of
.bundlebox/var/foreman-timeline.jsonl,
with the scores and state it was decided on.replayre-runs any threshold
change and counts candidate fixes and regressions against the labels.
thruwire lists this calibration tooling as missing. - The PostToolUse hook steers a live session. Every
foreman.hook_every
tool calls (10) it assesses the session with the agent marked active, so
only steer and stop can fire. It ships asforeman.hook: "observe": the row
is recorded and nothing is injected."steer"puts the steer or stop into
the agent's window. Jev stays out of the hook unlessforeman.hook_jevis
set, and then gets one attempt, because the hook is killed at 15s.
Measured on this repository with Jev, one session's work, --since 2c5c471:
with the job stated as row 0's loose text the policy said resume
(implementation_complete 0.49). With a --job naming what shipped, the same
commits, tree and verification gave finish (0.92). Jev scores the run
against the job you state.
Changed
Jev's probability reaches the price of a lane (#63). Triage priced every
heuristic finding off one method constant, PRECISION.heuristic = 0.6. Jev's
p now enters expectedValue as a prior on that constant, weighted by the
code windows Jev read (at most 3, shrunk at n/(n+4)). p=1.0 moves a heuristic
from 0.60 to 0.34, not to 0. On a medium finding at 150k tokens, ev goes 0.8
to 0.51, under the 0.6 floor, so the lane does not open. A person's answer
retires the opinion for its shape.
The Jev call retries a timeout, a 429 and a 5xx (#67), up to twice after
the first attempt: 500ms then 1s, or the server's Retry-After up to 5s. A
refused connection or a 4xx returns at once. One bb foreman request timed
out at 8s and the same request answered in 2.1s moments later; before this,
that one slow reply dropped Jev for the whole assessment.
Fixed
- The read guard denies only lines its quote can hand back (#68). A
region's quote is capped at 6000 characters when recorded and 2600 when
served. A region spanningsrc/wire/hooks.js:292-825arrived as ~30 lines,
and reads of lines 414-443 were denied with a quote that did not contain
them. A ranged read is now denied only when the quote carries every line, a
whole read only when every region arrives whole. - The foreman hook records a base for a session entry that has none (#66).
Entries written before bases existed never got one, and the run fell back to
HEAD: 0 commits, and a clean tree read as no work. - The MCP registry job waits ten minutes for npm, not one (054d5e5).
v0.7.1's record went red on a 404 while npm was still processing the
tarball.