Skip to content

Release notes: BoB 1.283.0

Released: 2026-10-17 · Tag: v1.283.0 · Previous: 1.282.0 (2026-10-12)

  • BoB can now tell you how many hours its agents worked, per project. bob labor report reads the Claude Code transcripts on a machine and turns them into active-hours per project per day. Time between events closer than a gap (default 10 minutes, set once in the operator’s config/billing.json) counts as one working span, a tool call waiting for its result is never idle, and parallel sessions on one project count once per wall-clock hour. (#4420)
  • Hours roll up to a job. _meta.billing in a project’s manifest names the client job and whether it bills. bob labor report --by job groups hours under each job, lists anything unmapped as unbilled so it is never dropped, and treats BoB’s own projects as overhead. bob provision status prints the billing line per project. (#4423)
  • Hours and cost across the whole fleet. Every machine’s snapshot carries each project’s hours and list-price token cost for the last 30 days. The fleet view shows them as a Labor table, and bob labor report --fleet prints the same roll-up, naming a machine whose snapshot is stale or missing and marking the total partial when one is. (#4422)
  • The token ledger stops missing killed sessions. bob labor reconcile gives every transcript on a machine one priced ledger record. bob tick runs it each cycle, and the snapshot, bob status and bob doctor report how many transcripts are still unrecorded. (#4421)
  • bob site publish refuses to deploy when it cannot confirm it holds the live site’s content, so it can no longer wipe pages it does not know about. (#4418)
  • A multi-item warp run pins its own integration branch at kickoff, so master CI runs once at finalize instead of once per item. (#4405)
  • bob warp status reads a state file with no history as no session instead of crashing. (#4163)
  • Master CI is green again: four suites no longer depend on the farm login account’s state, the committed docs section index is regenerated, and test-bob-tick passes on macOS, where TMPDIR ends in a slash. (#4416)
  • The iBoB tutorial’s farm-run and SSH-fingerprint steps work as written on a real iPhone. (#2292)

Close every Claude Code window on the machine first. A deploy refuses while a session is live (it would switch off the hooks in running sessions); a refused deploy is queued and runs when the last session ends.

Terminal window
bob update --to v1.283.0
bob doctor
Terminal window
bob update --to v1.283.0
bob doctor
systemctl --user list-timers | grep -E 'bob-(tick|snapshot)'

The last command should list both the tick timer and the snapshot timer.

Terminal window
bob update --to v1.283.0
bob doctor

Expected: bob doctor ends green, and its version line names v1.283.0.

In each project checkout on each machine:

Terminal window
cd <project> && bob ready

Expected: READY — <project> is warp-drive-ready on this machine.

  • Map each client project to its job, once. Add _meta.billing to the project’s manifest in the operator repo, for example {"job": "acme", "billable": true}. A project without it still meters hours but reports them under unbilled (unmapped). BoB’s own projects use {"job": "overhead", "billable": false}. Check with:

    Terminal window
    bob provision status

    Expected: a billing: line per project naming its job.

  • Optional: set the gap. Create config/billing.json in the operator repo with {"gap_minutes": 10} to pin the idle gap; without it the product default of 10 minutes applies and the report names default as its source.

None.

  • Ledger dollar figures are list-price and notional: the fleet runs on a subscription, so they are a cost signal, not a bill.
Full change list — 20 commit(s)
  • bob labor report meters agent active-hours per project from the transcripts here (#4420) (d6ff96f)
  • bob labor reconcile prices every transcript the token ledger missed, once each (#4421) (3d64075)
  • the fleet snapshot, bob tick, bob status and bob doctor carry the ledger’s unrecorded count (#4421) (110478b)
  • the fleet snapshot carries labor hours and COGS per project, and the view rolls them up (#4422) (88f7bb6)
  • bob labor report –fleet rolls hours and COGS up from the snapshots, stale and never named, the total partial (#4422) (c679e34)
  • _meta.billing maps a project to a client job, and bob labor report –by job groups hours under it (#4423) (8f0c92b)
  • bob provision status prints the billing line, the product projects are overhead, the docs name _meta.billing (#4423) (83bf4ac)
  • the iBoB-from-iPhone tutorial’s farm run and fingerprint steps work as written (#2292) (3bfc224)
  • a multi-item warp run pins its own integration branch and ships it in one push (#4405) (bc47706)
  • state-machine.js status reads a state file with no history as no session (#4163) (7e6960f)
  • master green after v1.282.0 — cli.md names the release, and one SIGPIPE site in test-warp-auto-stream (7342314)
  • bob site publish refuses to deploy over a live site origin does not hold (#4419) (#4418, #4419) (5cfef20)
  • the snapshot’s token-ledger keys are token_ledger — the session evidence ledger already owned ledger (#4421) (35d950f)
  • docs/reference/index.md regenerated — master CI red on the stale section index since v1.282.0 (30960fc)
  • the control terminal tests give tmux a real shell (#4416) (22ed821)
  • the labor meter’s gap rule, tool rule and billing.json states are pinned (#4420) (de1ba14)
  • the labor meter’s subagent fold is pinned and the suite is complete (#4420) (648cc8c)
  • the reconcile’s surfaces are pinned — snapshot, tick digest, bob status and bob doctor (#4421) (b60a39c)
  • test-bob-tick normalizes its sandbox path — macOS TMPDIR ends in a slash and the wiki assertions never matched (0e61447)