Release notes: BoB 1.278.0
BoB 1.278.0 — release notes
Section titled “BoB 1.278.0 — release notes”Released: 2026-10-02 · Tag: v1.278.0 · Previous: 1.275.0 (2026-09-21)
Highlights
Section titled “Highlights”This release covers a two-week backlog drain: everything since 1.275.0, including the 1.276.0 and 1.277.0 tags that shipped without written notes.
- One command to start or resume a project.
bob readytakes a new directory, an existing checkout or anowner/repoit clones. It puts the project onbob vizand leaves it ready for warp-drive, without prompts and without waiting for other projects that are running. A project’s first manifest lands without a review PR. (#3158) bob statusis the front door. With no arguments it prints one line per scope (this host, the project you are in, the fleet), the runs going here with their viz links, and onenext:command. Bareboblists the everyday commands grouped by situation. (#2641, #2642, #2639)- Running BoB no longer fights your sessions. A deploy refused by a live session is queued and
runs itself when the last session ends. Host drift is measured against the deployed commit and never
blocks project work. A machine can be pinned to the stable or nightly channel so it never deploys a
working tree by accident.
bob warp attachfollows a run across segments. One cause files one todo, with the reason a human is needed. (#3162, #3160, #3171, #3163, #3161) bob vizis a real dashboard. It shows one tile per repo across machines, an Active now strip, type-to-filter, cards that expand in place and alert when a todo waits on you, and every BoB session (not only warp-drive). It can run as an always-on service, sit behind one tailnet address per machine, and start or stop a run from a chat box on each card. The Launchpad gains tile, board, port-map and graph views and a Cmd+K palette. (#2929, #2928, #2925, #3038, #2978, #3001, #2407, #3003, #2140, #2155)- Deploys, backups and CI you can declare.
bob deploydeploys to test or prod through the project’s adapter, behind the promotion ceiling, with a per-environment CI template. A project can declare a nightly D1 backup withbob backup setup | status | run | restore, and stale backups show up in the fleet audit. The farm’s CI runners declare their capacity, start every job clean, and roll out to private repos with one rollback. (#3081, #3080, #3083, #3084, #3085, #3086, #1732, #1730) - Briefings and release notes are published, not just written. One site publisher (
bob site publish) takes every page bound for the operator’s site. Each project has its own brief, and a drained area writes its own completion briefing. Every stable release now needs finished release notes like this page, and a release is refused if its tree carries operator data, client names or credentials. (#3103, #3040, #3169, #3060, #2290) - New state machines and docs that show their age.
bob decomposeturns an approved capability into tested child requirements, andbob doruns an hour of unstructured work toward a declared artifact. Every docs page shows the build it describes, and a monthly docs-review ritual keeps them honest. (#2976, #2979, #2620, #2625)
- Rate limits no longer stall a run. A GitHub rate limit is a degraded forge, not an outage. Writes are queued and replayed at the next item, a push never parks, and the queue never replays an edit that would wipe an issue body. (#3191, #3195, #3186, #3190)
- Checkpoints stop refusing BoB’s own files. The session ledger, the decision log and its locks, the
defect cache, loop notes, the generated
.dash/, dev-server files and the ports projection are all declared derived state. (#3096, #3124, #3077, #3076, #3167, #3066) - Self-redeploys finish on their own. The hand-off no longer waits for someone to type
/exitor times out. A failed continuation prints one retry command, andbob warp statusshows where it landed. (#3121, #3142, #3122) - Dev environments and ports. Port sync keeps
dev.json, the wrangler command and the local URL on one port, and no longer rewrites an unchanged file. An explicitfalseturns seeding off, andauth.users_file: nullmeans no test users. (#3168, #3189, #3075, #3166) - Cloudflare deploys go to the declared environment. A test deploy on a Workers project reads
wrangler.jsonc, detects SvelteKit correctly, and never runs a bare production deploy. (#3068) - Briefings. A publish checks every host a page is served on, so a private brief can no longer
go out public on the
pages.devhost. It deploys as the declared Cloudflare account, ignores its own.wrangler/cache, and builds the index from the briefings home, not the current directory. (#2895, #2984, #3018, #3154) - macOS.
bob groomand the test runner no longer need GNUtimeout.audit.js pullfindsnodeon a Mac target. Tests no longer write your shell history. (#3170, #2783, #2874, #3041, #3165) - bob viz. A dashboard self-update can no longer leave no server running. The health row shows the age of its verdict, a run resumed from another checkout is re-claimed, and several layout and focus slips are fixed. (#2987, #3099, #3305, #2956, #2963, #2967, #3347, #3357)
- Smaller fixes.
bob warp <verb>no longer hangs outside a git project. A flight plan refuses a duplicate plan. Dedupe never flags a requirement as a duplicate of its own parent, and cap-status no longer closes a capability over a placeholder line. Retiring a hook no longer leaves the source tree dirty. Every CLI now sets its exit code instead of cutting its output short. (#2939, #3199, #2985, #3196, #2897, #2815)
Upgrade: every machine
Section titled “Upgrade: every machine”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.
A laptop (dev-laptop)
Section titled “A laptop (dev-laptop)”bob update --to v1.278.0bob doctorA farm worker (farm-worker)
Section titled “A farm worker (farm-worker)”bob update --to v1.278.0bob doctorsystemctl --user list-timers | grep -E 'bob-(tick|snapshot)'The last command should list both the tick timer and the snapshot timer.
Expected: bob doctor ends green, and its version line names v1.278.0.
Upgrade: every project
Section titled “Upgrade: every project”In each project checkout on each machine:
cd <project> && bob readyExpected: READY — <project> is warp-drive-ready on this machine.
Action needed
Section titled “Action needed”Each of these is optional and one-time. A machine or project that skips one keeps working as before.
- Pin a laptop to releases. In the operator repo’s
machines.json, add"bob_channel": "stable"to the machine’s entry, then runbob update. Itsbob doctorversion line then readschannel: stable vX.Y.Z. (#3171) - Keep the dashboard up. On each machine where you want
bob vizalways on:bob viz --install-service. Thenbob doctorgrades the service. (#3001) - One tailnet address per machine. Declare a
serveblock for the machine inmachines.json, thenbob serve(report) andbob serve --apply. (#2407) - Name your clients for the release gate. Before you cut a release, list each client’s identifiers in
the operator profile:
operator.jsontenants[](anid, alabel,literals[]). Thenbob operator showmust validate. (#2290) - New
tracerlabel.bob readyin each project adds it with the standard label set. (#2738)
Breaking changes
Section titled “Breaking changes”- Bare
bobprints the everyday commands only. The full list isbob help --all. bob releaserefuses a stable release that has no finished notes indocs/releases/, or whose tree carries operator data, a client identifier or a credential.- On a machine declared
bob_channel: stableornightly,scripts/deploy.shdeploys the channel’s tag, not the working tree. Pass--channel checkoutto deploy the tree on purpose.
Known issues
Section titled “Known issues”- At automation Level 3, Claude Code’s auto mode can still block
wrangler deployandbob brief --publish. Run them yourself for now. (#2893) bob warp finalizefails in a worktree while master is checked out elsewhere. Finalize from the main checkout. (#3543)- A
dev.jsontop-leveldeploykey is rejected by the schema, sobob readycan block a project that follows the Cloudflare deploy docs. (#3313) - The briefings index can link to pages missing from the published bundle. (#3568)
Changes
Section titled “Changes”Full change list — 382 commit(s)
Features
Section titled “Features”- fleet-wide usage evidence from snapshots (#2899) (d7ba3d2)
- bob tour –fleet grades on a stated evidence base (#2899) (c95fcca)
- declared per-machine dashboard bind; loud warp viz flags (#2636) (c7cfd08)
- bob warp start brings the dashboard up with the run (#2636) (2b94376)
- one dashboard URL resolver; bob doctor prints the viz links (#2639) (f16bb71)
- bob warp status prints the live viz link (#2639) (ce7b1f6)
- bob viz / bob warp viz print every reachable URL, never a dead one (#2918) (f6f2eef)
- bob viz / bob warp viz –json give the reachable URL set (#2918) (02c4cef)
- one page-controls module; every bob viz region collapses (#2922) (358cd03)
- sort selects and folds on every bob viz list; pinned notices (#2922) (b9604e3)
- shareable bob viz view in the URL fragment; phone layout (#2922) (8f9da21)
- the fleet feed derives each project’s state; notices carry priority (#2477) (92f91d0)
- bob viz tile state mark, tile sort, machines open on the serving one (#2477) (5cb022d)
- Notices filter and linked selection between tiles and notices (#2477) (0ff12af)
- the fleet feed derives last_active_at and carries portfolio (#2923) (f118959)
- bob viz grid opens on what is active (#2923) (b7df99f)
- a push never moves a hovered or expanded bob viz tile (#2923) (6da0b79)
- bob-project-detail/1 — one project’s detail for the expanded card (#2924) (4c4c3d1)
- serve bob-project-detail/1 at
/bob/project/<machine>/<name>.json(#2924) (38c6a68) - bob viz compact card — head, now, last, health, spend (#2925) (7ec8122)
- bob-card.js — the expanded bob viz card, rendered from bob-project-detail/1 (#2925) (394c119)
- bob viz cards expand in place, with a #card= deep link (#2925) (a700ad5)
- bob viz Briefings pane — portfolio briefings and area briefs on /bob (#2926) (364eaee)
- a type-to-filter query narrows every bob viz region by name (#2927) (898037e)
- the bob viz filter box —
/focuses, Esc clears, #q= in the URL (#2927) (5d60e1e) - bob-fleet-feed/1 carries active_now[] — what is moving fleet-wide (#2928) (b16b6aa)
- the bob viz Active now strip leads /bob (#2928) (d3db807)
- bob-fleet-feed/1 knows repo identity across machines (#2929) (bae0acf)
- bob viz opens by project, one tile per repo across machines (#2929) (f096c0e)
- machine-engine.js — the transition engine a sibling machine shares with warp-drive (#2975) (adf4324)
- declare the decompose/do state files; document the shared engine and the concurrency rule (#2975) (0cbe6dc)
- decompose-testability — the judge on a child’s acceptance criteria (#2977) (4aba9cd)
- the testability gate blocks, records overrides, and marks abstentions (#2977) (3f1b58f)
- bob decompose — the machine, sourcing and drafting gates (#2976) (7bca4f7)
- bob decompose deduping and testability gates (#2976) (21ff68e)
- bob decompose tracing — file, list on the parent, read back (#2976) (3ce9405)
- bob do — the machine, the framing gate and the working budget (#2979) (af94966)
- bob do discarded gate and the concurrency rule both ways (#2979) (46790dc)
- bob do landing advances only on read-back evidence of the artifact (#2980) (edb7463)
- bob do recording links the artifact and its prompt both ways (#2980) (923089d)
- grade registry items by applicability before usage (#2900) (bed3c90)
- the disposition record and its validator (#2901) (3b838bb)
- bob u — Bob University’s CLI noun, bob learn its alias, and status (#2903) (41ce6d9)
- bob u exam and bob u dispose (#2903) (2435e3f)
- a certification carries its exam date; re-disposing keeps the record it replaces (#2904) (2eb3700)
- resolve the model a certified item runs on; a model change flags re-examine (#2904) (9889350)
- loop-notes review and retire –dry-run — the report-only loop-note queue (#2905) (802f0e4)
- continuing education as ritual evidence — the disposition backlog and the loop-note queue (#2905) (071607b)
- bob warp start converges a self-hosted host before it launches (#2472) (4e6e546)
- bob tick converges the host before it launches the run (#2472) (ba04672)
- a self-hosted run hands off to a redeploy instead of running stale (#2472) (6b54579)
- the redeploy continuation deploys after the retiring session exits (#2472) (3646abd)
- redeploys show in warp status, warp log and the session summary (#2472) (70d5252)
- live-check refuses only when the hooks block has drift (#2126) (c107879)
- a self-hosting redeploy runs beside other sessions on converged hooks (#2126) (feee9e7)
- untrack carries BoB’s own port settings instead of refusing (#2519) (ea836c9)
- www: brief — ready for client work today (2026-09-23), claimed by #3061 (#3061) (a98c6c5)
- the loop enters degraded mode on a forge outage and parks the landing instead of dying (#1751) (e9fd42b)
- a degraded run never looks normal, and a full requirement survives a forced forge outage (#1751) (b495712)
- bob viz: a project card’s details open in a full-screen modal (49a3430)
- one site publisher — producers hand site-publish/1 bundles to scripts/site/publish.js (#3103) (39a610c)
- bob brief –project — one brief per registered project, in its own repo (#3040) (e914865)
- the briefings index and the briefing page sort and filter by project (#3040) (486cc3e)
- bob viz’s Briefings pane lists project briefs, sorts by project, puts the selected project first (#3040) (66e420c)
- the briefings index reads every registered project’s brief issues (#3102) (0b40f1e)
- the briefings index lists open briefs first, folds closed ones under a count, names unread projects (#3102) (5e1a8d4)
- area briefs are views — –area renders pages, files an issue only on a decision (#3101) (b9f4a33)
- the briefings index lists area pages as views in their own Areas section (#3101) (7de192e)
- bob brief –reconcile ticks next actions whose issues closed (#3100) (6910648)
- reconcile moves brief state through states.json, rebuilds and publishes the index (#3100) (7803cd4)
- groom and tick call brief reconcile; tests and docs (#3100) (a492861)
- the handoff record — plain-English text, per-todo push dedupe, terminal list (#3058) (2311e82)
- the engine raises the handoff at every stop that needs Paul (#3058) (d00fcd6)
- the needs-you banner on bob viz and warp viz (#3058) (63802fb)
- the gh shim gates every call on a shared quota and retries a limit itself (#3190) (09b141b)
- the quota is measured and shown — health, doctor, snapshot, bob viz (#3190) (1865957)
- callers never give up on a rate limit (#3190) (3f798b0)
- the flight plan reads its items in one call; call sites measured (#3190) (6c4d19f)
- bob warp attach — one name per run, follows it across segments (#3163) (ab50a68)
- host drift is measured against the deployed commit, not the working tree (#3160) (97403b2)
- host drift is advisory; the host is graded once; honest leftovers become advisories (#3160) (dbddf38)
- the mid-run host re-check never stops a project; end-to-end test and docs (#3160) (ea0d381)
- one todo per cause — machine-scoped preflight todos, recurrence, auto-resolve (#3161) (cb15818)
- roll-ups and a stated reason a human is needed (#3161) (a4d33b1)
- one-time clean-up of the old filer’s preflight todos (#3161) (d371784)
- –allow-overlap builds a second plan on purpose and names the overlap (#3199) (d34bc53)
- one e2e-first test policy, declared once and carried by warp-drive (#3200) (3409c79)
- a bug’s regression test is one focused e2e reproduction (#3200) (310f336)
- tdd-flow writes red tests the test policy allows (#3200) (8fcfaf3)
- a machine declares its release channel; pinned machines deploy from the tag (#3171) (a0b7417)
- doctor, status and bob viz measure and show a machine’s release channel (#3171) (2570116)
- a stable release is the operator’s decision; channel docs (#3171) (70ec0e1)
- a refused deploy is queued, and a drain finishes it (#3162) (e9c22ec)
- BoB drains a queued deploy itself, and says one is queued (#3162) (71fce4e)
- the attach command in bob warp status and on the bob viz card (#3163) (1100c97)
- a run’s end reaps finished segment sessions itself (#3163) (3c69721)
- bob ready puts the project on bob viz before it exits (#3158) (4e208f2)
- bob ready starts a project from nothing, or from owner/repo (#3158) (2f5ae09)
- bob ready runs beside other projects and never needs a deploy (#3158) (7452877)
- first manifest lands without review; ready to work; bob ready is the one command in the docs (#3158) (8630d9c)
- detect a drained area and gather the evidence behind it (#3169) (b693afe)
- a model writes the completion briefing over its evidence (#3169) (fdc801e)
- a drained area is briefed, published and announced without anyone asking (#3169) (4df22fa)
- completion briefings on bob viz and in the portfolio briefing (#3169) (cbc62a0)
- release notes engine — draft, check and unreleased (#3060) (3f22639)
- bob release refuses without finished notes; the Release body is the notes (#3060) (864bf75)
- bob doctor and bob update point at the running release’s notes (#3060) (02d1871)
- public release-notes pages, leak-scanned, published through bob site publish (#3060) (5712529)
- todo-contract check warns on WS-4, WS-5 and WS-6 (#2989) (b98c396)
- record every live-session refusal in BOB_HOME (#2745) (f0671a3)
- ci-health.js — a 7-day CI report with per-job queue time (#2745) (8302c7f)
- declared runner capacity, a CI reserve slice, service control and updates (#1732) (732ccb9)
- every farm CI job starts clean, with HOME and ssh isolated (#1732) (1d41404)
- runner residue reaped on a declared schedule, and the farm CI trust boundary written down (#1732) (53b89b3)
- ci-rollout inventory — every repo of the declared owners, classified with its reason (#1730) (e5b6568)
- ci-rollout apply / verify / rollback — converge each repo, re-runnable, one-command rollback (#1730) (d27bb48)
- ci-rollout refuses an ambiguous name match; reference doc and first live dry run (#1730) (e28fdf8)
- utility-host is a machine role (#2543) (d239a24)
- fleet feed derives a needs-you fact from open todos (#3038) (7cf3398)
- bob viz cards alert when a todo waits on the project (#3038) (8f5915c)
- every bob viz pane narrows to one selected project (#3039) (857af15)
- one project selection across the bob viz page (#3039) (9c512f9)
- the selection proven end to end in a real browser (#3039) (f2ada5d)
- one session contract, bob-session-state/1, written by every BoB session (#2978) (4b648d7)
- bob viz shows every BoB session — /sessions, the feed and the tiles (#2978) (50b94e2)
- warp viz for every session kind, status links, docs (#2978) (7261806)
- bob viz Cost and churn sorts by every column, from its headers, opening on $ / merged req (#3097) (7ef101b)
- bob serve — declared tailscale serve front door (#2407) (21ca4dc)
- dashboards answer under
/<project>, bind loopback behind serve, links use the MagicDNS address (#2407) (bde4b51) - bob status with no arguments is the front door (#2641) (1775f41)
- bob status lists what is running here, with each dashboard’s viz URL (#2641) (9542404)
- declared everyday list and one-line taglines in the routing table; bob help –all (#2642) (cd18af1)
- bare bob prints the everyday commands grouped by situation; the full list moves to bob help –all (#2642) (1e640ce)
- the dashboard service engine and the server’s hand-over to its manager (#3001) (1d44c16)
- bob viz –install-service, launchers reuse the service, bob doctor grades it (#3001) (bc8f6c6)
- the declared operations table, the resolver and POST /bob/dispatch/resolve behind the trust gate (#3002) (d8ea90f)
- POST /bob/dispatch/start and /stop through the declared launcher and stopper; launch.sh exec and close (#3002) (cbcc673)
- dispatch aimed at a card’s project, stop by session kind, the token on /bob and /warp, card session rows (#3003) (7e9f71f)
- the chat module — reply turns, card session rows decided by the server, the controller and its history (#3003) (a8ce5d0)
- the chat input on every bob viz card and on warp viz — Enter, Escape, focus, phone width, docs (#3003) (482887d)
- the harness registry, and launch.sh reads its command from it (#3005) (1c73ed6)
- the dispatcher picks the harness from the registry and refuses a disabled one (#3005) (113bdc1)
- the harness selector on the chat input, Run starts the previewed harness, docs (#3005) (615bb9c)
- dev.schema declares the top-level deploy block the readers use, and provision.r2_buckets (#3080) (fce0784)
- test-env.js provision creates every declared test R2 bucket, idempotently (#3080) (b321f51)
- the wrangler scaffold edits wrangler.jsonc in place and writes env.test + env.prod (#3080) (fa753b3)
- the inventory declares environments and cred-check grades presence and rotation per env (#3082) (47331c6)
- cred-check due files one todo per environment; rotated –env records one env’s rotation (#3082) (bd60fc7)
- nanaawards’ secrets inventoried per environment; docs for the env axis (#3082) (b5d4c8f)
- bob deploy noun over deploy.sh, refused past the ceiling with the gate’s reason (#3081) (1850932)
- per-env CI template — push to main deploys test, the release tag deploys prod (#3081) (5415baf)
dev.jsonenvironments.<env>.backup, schema-validated, with one shared reader (#3083) (8760075)- backup Worker template — a scheduled Workflow exports D1 to R2 under a dated key (#3084) (5b81309)
- bob backup setup renders the backup Worker and converges its bucket and retention (#3084) (f63a22f)
- the backup Worker’s token inventoried, its template scanned for values, and the docs (#3084) (f247167)
- bob backup status reads the newest backup’s pointer, fresh or stale against the schedule (#3085) (5b600c5)
- bob backup run triggers the nightly Workflow and waits; restore loads TEST and verifies, prod behind a human gate (#3085) (4ca14e6)
- backup freshness on every snapshot project, summary.backups and the audit view’s Backups table (#3086) (5a3f213)
- bob status grades backups; bob tick and bob brief notice a missed backup once (#3086) (399d463)
- Actions budget probe in the snapshot, the audit view and the /what-next health line (#1695) (e8465c6)
- tracer-bullet standing conditional AC in /requirement (AC-01 through AC-10) (#2734) (ccb54a4)
- tracer label in the standard set, applied and inherited by /requirement (#2738) (b32e631)
- the tracer label reaches warp-drive state; isTracerWork and a warp status Slice line (#2738) (7c5784a)
- tracer-classify, the Jev noul that labels cross-layer work (#2738) (d16b115)
- /capability carves requirements by slice, not by layer (#2739) (24ca550)
- tracer on capabilities, inherited by bob decompose children (#2739) (fbc24ef)
- vertical-slice tiebreaker in chunking for tracer items, with the vertical_slice_first opt-out (#2736) (390c4b5)
- check-phase-instructions covers the phase overlays (#2736) (bb58402)
- BoB’s upstream declared once in scripts/bob/upstream.json; schema $ids checked against it (#2441) (9068161)
- shell defaults and copied templates read the declared upstream; last allow-list entries retired (#2441) (dbed0d1)
- tenants[] in the operator profile, the release path rule, one credential catalogue (#2290) (efa6cbf)
- release-content.js grades a release tree for operator data, client identifiers and credentials (#2290) (4420332)
- bob release refuses a tree with operator data, client identifiers or credentials; baseline allow-listed (#2290) (7a8f16a)
- the docs build stamps its version, SHA, branch and release distance as /version.json (#2620) (e06573f)
- every docs page opens with one provenance strip — build, release distance, dates, grade, source (#2620) (129ec3a)
- a build footer on every page, docs-verify proves the stamp renders, and the lifecycle docs describe it (#2620) (126904b)
- the docs-review ritual joins the vocabulary with its versioned checklist, carried by the review kit (#2625) (32e936d)
- the docs-review evidence packet — staleness, coverage, changes since the last run, the tutorial to walk and the live site (#2625) (d536cb5)
- derive the release each bob command first shipped in from git (#2622) (f178b47)
- both CLI references show the release each command first shipped in (#2622) (dee9d3e)
- scheduled retirements are declared once, and docs-check refuses a retired item presented as live (#2623) (4854ee7)
- a retiring page carries a banner, and generated references list retired items apart (#2623) (7661245)
- check-stdout-exit is part of make check (#2815) (76bf6f7)
- reversibility picks decide()’s stakes — classify() derives them (#2981) (327dad9)
- stakes_from: ‘classify’ in the caller registry; the seam doc explains both axes (#2981) (41fddc1)
- decide-lint — the static twin of the seam’s runtime refusal (#2982) (33d376a)
- check-decide-lint is part of make check; the seam doc names it beside the runtime refusal (#2982) (67609d1)
- decide() records every call; subagent spend is split by agent type (#2983) (9908fd3)
- token-report shows the share of spend that went to decision-shaped calls, by backend (#2983) (2439d4a)
- flight plans select session kits from issue labels (#2227) (50a1136)
- plan-scope diff splits kit additions from signal ones; forbidden kits stay off farm workers (#2227) (6abf855)
- bob provision status –context measures the description tokens a session loads (#2229) (47d8e70)
- bigbrain context baseline recorded; bob tour lists the costliest never-invoked items first (#2229) (3e89130)
- bob reap –sync-ignore writes a managed ignore block for every declared surface (#1688) (8e60d85)
- BOB_SOURCE .gitignore carries the reap block; the hand .dash/ entry moves into it (#1688) (1276163)
- bob promote scans the item with SkillSpector before copying it (#1328) (6ea3b06)
- SkillSpector CI gate on changed registry items, baseline sweep workflow, docs (#1328) (355462e)
- live SessionStart, Stop, SubagentStop and SessionEnd hook fixtures (#1839) (364340c)
- a flight plan can declare predecessor plans (#2298) (2bf406f)
- a plan waits while its predecessor runs; reconcile reports the release once (#2298) (9b1d7c5)
- a waiting plan ends kickoff cleanly and the tick skips it by name (#2298) (42765a3)
- per-project story config with a generic git-only fallback (#370) (a6a4204)
- update-story –init generates a first story page from a generic template (#370) (327c3d5)
- update-story is recommendable and documented for any project (#370) (d5eecc1)
- bob init offers a GitHub Project with an inferred profile (#256) (7efa0ae)
- bob dash status shows each project’s GitHub Project (#256) (de7eeac)
- the Launchpad opens as a responsive grid of project tiles (chunk 1/3: AC-01) (#2140) (be2be91)
- Launchpad tiles drag to reorder, move with Alt+←/→ and resize by span, persisted through the layout contract (chunk 2/3: AC-02, AC-03, AC-08) (#2140) (553a541)
- Launchpad tile moves animate with FLIP under 200 ms and not at all under reduced motion; the how-to documents tiles (chunk 3/3: AC-04, AC-05, AC-06, AC-07, AC-09) (#2140) (c47a86a)
- Launchpad view switcher — Tiles · List · Board · Ports, 1–4 shortcuts, saved view, ?view= override (chunk 1/3: AC-01, AC-05, AC-07) (#2141) (7a3625c)
- Launchpad board — liveness columns with count badges and empty states, cards, one grouping rule (chunk 1/3: AC-01, AC-05, AC-06) (#2142) (5d20c30)
- board group key (liveness · stack) saved as board.groupBy; cards slide between columns, still under reduced motion (chunk 2/3: AC-02, AC-03) (#2142) (69e437f)
- start a project from its board card through /action/start with the dot’s feedback; document the board (chunk 3/3: AC-04, AC-07) (#2142) (ef39ea7)
- Launchpad port map — ledger bands on one strip with hollow gaps, striped overlaps and a collision warning line, from the links index only (chunk 1/3: AC-01, AC-04, AC-06) (#2143) (eb79f83)
- port-map popover with link pills and Enter-to-dev; base port marked and lit while dev is up; stacked list under 600px (chunk 2/3: AC-02, AC-03, AC-05) (#2143) (a9a60b2)
- Launchpad design brief, linked from the how-to; the page compacts its inline CSS+JS and a test holds the 40 KB ceiling and zero external requests (chunk 1/3: AC-06, AC-08) (#2144) (60525b7)
- Launchpad on the brief’s tokens — a designed dark and light set each, AA contrast tested from the shipped CSS; system sans UI, mono identifiers, tabular ports (chunk 2/3: AC-01, AC-02, AC-04) (#2144) (7805665)
- live surfaces breathe a CSS-only glow (none under reduced motion); hover, active, focus and drag states for every control; before/after screenshots of each view in both themes (chunk 3/3: AC-03, AC-05, AC-07) (#2144) (a7509ad)
- the links index carries each project’s mirror host; graph edges (stack · mirror · ports) as a pure function and a seeded force simulation that settles in 120 ticks (chunk 1/3: AC-02, AC-09) (#2153) (8117ed6)
- Launchpad graph view — Graph segment on 5, inline SVG constellation with a legend per edge kind, drag to pin saved as graph.pins, double-click unpins, live nodes glow, Tab order and a screen-reader list (chunk 2/3: AC-01, AC-03, AC-04, AC-05, AC-07, AC-08) (#2153) (d5f6c04)
- graph nodes reveal their link pills on hover and focus, Enter opens dev, the filter dims rather than hides; the Graph section in the Launchpad how-to (chunk 3/3: AC-06, AC-10) (#2153) (fcf11f7)
- command palette model — items for every project, link pill, start action and view from the links index; fuzzy ranking by match quality then tile order (#2155) (9256960)
- Launchpad command palette — Cmd+K / Ctrl+K from any view opens a dialog over projects, links, views and start; arrows, Enter, Cmd+Enter; liveness dots; focus trapped and returned; 5.8 KB (chunk 2/3: AC-01, AC-02, AC-03, AC-04, AC-05) (#2155) (c8d9630)
- the / filter is untouched by the palette — / and digits inside it are search text; markup contract test; Keyboard section with the command palette in the Launchpad how-to (chunk 3/3: AC-06, AC-07, AC-08) (#2155) (78daa69)
Bug Fixes
Section titled “Bug Fixes”- fleet-usage.js sets process.exitCode instead of exiting (#2899) (3d15db4)
- todo-consume stale reads owner/repo#N from the named repo (#2912) (e644cb5)
- bob viz –tailnet replaces this project’s loopback dashboard (#2917) (083e628)
- the bob viz re-sort button stays put as the pointer reaches it (#2956) (ceedbce)
- a bob viz card keeps keyboard focus and its deep-link scroll (#2963) (12ba56e)
- pin the latest portfolio briefing past the Briefings pane fold (#2967) (00c7d54)
- bob brief –publish ignores the .wrangler/ cache its own deploy leaves (#3018) (0544f6c)
- BobU engines set process.exitCode instead of process.exit (#2903) (59e3c9c)
- release notes filename is kebab-case and names bob dev up (#3062) (915ca98)
- cloudflare adapter deploys to the declared wrangler env, never bare production (#3068) (85a291e)
- brief –publish probes every host the path is served on before it publishes (#2895) (f8bf33b)
- brief –publish deploys as a declared Cloudflare account, refused before the push (#2984) (39b98dc)
- the redeploy handoff waits for /exit instead of timing out after 120s (#3121) (8388e16)
- warp status viz test greps captured output, not a pipe (#3129) (7333573)
- one-launcher assertions count URL constructions, not url= tokens (#2944) (f8a811b)
- launchpad layout test reads its own fixture ledger (#2931) (04c923c)
- check-branch keeps the doc carve-out through a symlink (#2812) (9f64b75)
- bob groom bounds its run without GNU timeout (#2795) (6ceece6)
- the fleet snapshot grades credentials on an undeclared host (#2816) (bbca28d)
- scenarios-drift case 8 uses a flag its route does not declare (#3029) (00dbee4)
- cdprov goldens pin the derived-path list they render (#3028) (8724c0b)
- the test runner’s watchdog no longer holds the caller’s pipe (#2783) (607c8d9)
- the runner suite runs in its budget without coreutils timeout (#2874) (d824258)
- the labels check reads past a rate limit and never calls it an unreachable forge (#3195) (44af764)
- the forge queue never spools or replays an edit with an empty body (#3186) (ff73332)
- a rate limit is degraded, shown live, and never pauses the loop (#3191) (ef5fbdd)
- the engine replays the queue at item boundaries; a push never parks on a rate limit (#3191) (f8ea60b)
- the dead-run alert names the likely cause when the forge is degraded (#3191) (f9aea35)
- the redeploy continuation ends the retiring session itself (#3142) (dbe8205)
- the hand-off records where the continuation landed; warp status shows it (#3142) (d724e50)
- a failed redeploy continuation prints one retry command; continue runs without –wait-pid (#3122) (c9856dd)
- a usage error on the continuation is recorded; warp status marks a pass older than a failed redeploy as stale (#3122) (eea9316)
- preflight-todo-cleanup.js sets process.exitCode instead of process.exit (#3161) (005f206)
- a failed dashboard self-update is logged and retried, never silent (#2987) (0bf03b2)
- the self-update waits for a whole, stable import tree (#2987) (baae7e2)
- stream-freshness names a dirty-tree merge refusal instead of an empty conflict (#2782) (aed87eb)
- bob warp session start / finalize say why a stream sync refused (#2782) (1675d5f)
- the session ledger and decision log are derived state, never checkpoint work (#3096) (4ff0bc9)
- the decision-log lock files are derived state (#3124) (028af1d)
- the defect-status cache and generated .dash/ are derived state (#3077) (4bb4a76)
- loop-notes.json is declared derived, as the docs already said (#3076) (8f98b9a)
- the checkpoint tolerates the preflight waiver, dev-up’s server files and the ports projection (#3167) (de93b94)
- a fence-only .gitignore change is bookkeeping with or without an overlay (#3066) (e130232)
- tests never write the operator’s shell history or drive their tmux server (#3165) (4397ee9)
- sshRun puts Homebrew, nvm and ~/.claude/bin on the remote PATH (#3041) (7e374d7)
- warp’s project-root walk resolves a relative path first, so it ends (#2939) (f45ae3b)
- a hook retirement converges without leaving BOB_SOURCE dirty (#2897) (f8bcbac)
- a cap’s children are the refs that lead its checklist lines (#3196) (074a012)
- dedupe never offers an issue its own parent or children (#2985, #3073) (3ca19e6)
- the dedupe comment names what it left out; the eval scores req→cap pairs (#2985) (1c3833a)
- an explicit false in dev.json turns seed generation and migrations off (#3075) (41ad0b7)
- host-preflight refuses a value flag given without a value (#3072) (e87ced6)
- auth.users_file null means no test users (#3166) (34891c8)
- the ports sync leaves an unchanged dev.json byte-for-byte (#3189) (9becf8e)
- the port sync keeps command, server.port and access.localhost on one port (#3168) (36c7805)
- the briefings index is built in the briefings home, never the cwd project (#3154) (b782568)
- warp status reads the phase contract from the source checkout (#3143) (cc6b3e6)
- a passing warp preflight records the verdict bob viz shows (#3099) (e98afa6)
- the bob viz health row shows the ready verdict’s age (#3099) (c7fa6ea)
- bob ready does not fail init during a live warp run (#3099) (648b6f6)
- quarantine compares output, not just the exit code, when nothing parses (#3078) (3583163)
- flightplan build refuses a second plan over items an open plan holds (#3199) (4e3e627)
- a completed deploy clears the queued deploy it satisfied (#3162) (69aa325)
- a run driven from another checkout is re-claimed on its first transition (#3305) (c275c81)
- the docs detector resolves the run from the checkout the call acts on (#3306) (3dfa9ef)
- needs-you mark never cut by the tile name; todo row reads whole (#3347) (a65b5cd)
- warp viz for a machine run shows its host and names its panel (#3357) (4fce0da)
- vue-safe table cell and regenerated research section index (#2738) (9ae9f9d)
- tenant literals are matched in paths too, and the allow-list names no client (#2290) (720b99e)
- 53 CLIs set process.exitCode instead of exiting with main()’s result (#2815) (e45a21b)
- the 27 near-miss exits set process.exitCode; a usage constant is not a document (#2815) (4a7c727)
Refactoring
Section titled “Refactoring”- provision.js resolves BOB_SOURCE through scripts/lib/bob-source-resolve.js (#2497) (73b8968)
- retire cascade-engine; retired-items records a scripts directory (#3042) (8cd08dd)
- one research item — the command folds into the research skill (#3042) (899fc96)
- /pr is the pr skill — create-pr.sh builds the Requirements table (#3042) (fa9cff5)
Documentation
Section titled “Documentation”- add Run the Latest BoB how-to (#2896) (#2896) (b22d3e5)
- www: state-machinery brief decomposed into the tracker (#2798) (#2798) (42a7055)
- decide-seam lists decompose-testability beside groom-dedupe and brief-next-action (#2977) (ee80dd6)
- /capability, /use-case and /groom hand decomposition to bob decompose (#2976) (4805ab1)
- bob do how-to and the capability explanation (#2979) (3e8eeb1)
- bob do reference — the artifact set and the evidence each needs (#2980) (a325262)
- www: bob-university brief now records the plan running on the farm (#2992) (#2992) (a3ff0df)
- bob tour –applicability in the routing table and its reference (#2900) (4f9f002)
- check-dispositions in make check, and the dispositions reference (#2901) (ca660b8)
- the bob u how-to runs status → exam → dispose; dispose never writes BOB_HOME (#2903) (70d4002)
- the disposition reference describes re-examination (#2904) (36b4871)
- the rituals reference lists the continuing-education evidence (#2905) (4ee3088)
- www: bob-university brief records plan #2992 drained and the cull awaiting review (#2992) (#2992) (c84c28b)
- BoB in One Day says where you are, where a requirement comes from, and what each level asks (#2411) (fa1417a)
- BoB in One Day ends with one next step (#2411) (a6f54b2)
- release notes for v1.275.0 — highlights, fixes, per-machine and per-project upgrade steps (#3060) (6a61851)
- public release-notes page for iwpi.com/bob/releases (v1.275.0 + unreleased) (#3060) (b033367)
- www: operations brief for nanaawards — backups, TEST environment, who presses deploy (#3071) (#3071) (2c31c30)
- www: Less Chuff — briefings grooming and portfolio plan brief (#3098) (#3098) (8d3abb3)
- bob site publish route, site-publish reference, add-a-producer how-to (#3103) (7b0a066)
- the bob update live-session refusal, and how to find the named session (#2764) (f3f173e)
- the bob update not-fast-forward refusal, page restamped (#2764) (f5dbae0)
- no more “deploy from a plain terminal” handbacks (#3162) (e64fee7)
- release notes on the docs front page, their refusals in troubleshooting (#3060) (dae13e8)
- web-read rules WS-4 to WS-10 and the evidence behind them (#2989) (023ee89)
- todo, report, journal, status and briefing producers cite WS-4 to WS-10 (#2989) (141a9f1)
- CI health reference with the scoping and first measured baselines (#2745) (18b1c33)
- glossary defines machine role, utility-host included (#2543) (19c61eb)
- record the tailscale serve posture inside decision #1773 (#2407, #1773) (e47739a)
- the promote CI template and its prod trigger in the promotion how-to (#3081) (b9d3d37)
- the backup section in dev-lifecycle, its example validated by the test (#3083) (8354c08)
- the project-data restore runbook — Time Travel first, then bob backup restore — and its test (#3085) (62e4edc)
- backup freshness in CLAUDE.md, the snapshot, status, briefing and tick references (#3086) (0cd1ae5)
- brief — where BoB stands, 2026-09-29 (#3402) (662da40)
- Actions budget reference, the snapshot field, the index and CLAUDE.md (#1695) (726ea8a)
- the vertical-slice overlay in warp-drive.md and warp-drive-internals (#2736) (af1be1b)
- the product’s own upstream vs an operator’s bob_upstream; verification baseline after the burn-down (#2441) (3d08044)
- the Where BoB Talks to You tutorial — one stop per surface, step 3 on the learning path, generated through the registry (#2414) (e8a3ef1)
- Where BoB Talks to You — which surface when, what reaches each one, and when it breaks (#2414) (029f453)
- holding a docs review — the declaration, the packet, the tutorial walk and the restamp PR (#2625) (35bf592)
- the CLI reference explains Since and how it is derived (#2622) (29b9f8d)
- the subject frontmatter, the retirement banner and the retired-mentions gate (#2623) (aa69e53)
- the Holding a Ritual tutorial — step 5 on the learning path, generated through the registry (#2416) (df333b4)
- the portfolio-review stop and the ritual vocabulary; bob ritual decide finds the manifest in the operator repo (#2416) (a4bb8ca)
- the Watching BoB Work tutorial — step 4 on the learning path, one live run seen from the run, project, machine and fleet (#2417) (ac0e8f8)
- when something is wrong, and which view answers which question (#2417) (a8444c3)
- the A Night on the Farm tutorial — step 7 on the learning path, one project handed to the farm for a night and read in the morning (#2418) (c4926bc)
- what the farm never does, and when a night goes wrong (#2418) (bb159aa)
- after-measurement — delegation never fired on bigbrain’s first 10 chunks (#2705) (a7fa591)
- document the bob init GitHub Project offer and dashboard line (#256) (9276683)
- skill-evolution explanation — WikiSkill paper, BoB surface mapping, wiki layout (#1971) (ef514db)
- maintainer and proposer contracts, wiki-access rule, client-data boundary (#1971) (13c913c)
- reconcile trace-mining, #332, #106 and #1240 into one loop; link the explanation (#1971, #332, #106, #1240) (9271f4e)
- the port map in the Launchpad Views section — what each segment means, collisions, small screens, where the data comes from (chunk 3/3: AC-07, AC-08) (#2143) (93da5b8)
- Claude Code ecosystem triage — every link resolved and checked live, adopt / reference / skip per tool, multiplexers against warp-drive and bob fork, agent frameworks against BoB’s orchestration model (chunk 1/2: AC-01, AC-02, AC-03, AC-05) (#1052) (9b91894)
- the triage’s follow-ups are filed — Cloudflare MCP servers (#3548), warp state in bob fork windows (#3549), forked workers that release blocked items (#3550) (chunk 2/2: AC-04) (#1052, #3548, #3549, #3550) (2da6e14)
- awslabs/cli-agent-orchestrator evaluated, reference-only — a multi-CLI supervisor runtime BoB doesn’t need; scrollback-before-reap filed as #3552 (chunk 1/1: AC-01..AC-06) (#1048, #3552) (57412c5)
- FredAntB/Spec-Driven-Development evaluated, pass — prompt-only enforcement over local spec files BoB forbids; the Out of scope section filed as #3554 (chunk 1/1: AC-01..AC-05) (#1046, #3554) (da21138)
- ai-website-cloner-template evaluated, borrow patterns — inline full brief + size budget for swarm workers (#3557), the dropped verification command (#3556), its retired AGENTS.md sync scripts recorded on #500 (chunk 1/1: AC-01..AC-04) (#1239, #3557, #3556, #500) (3a616fa)
- SkillClaw evaluated, pass — its Claude Code proxy reroutes every request to a non-Anthropic provider and rewrites settings.json, it evolves skills without a wiki or an eval gate, and its dedup is a same-name merge; settled against #2387 (chunk 1/1: AC-01..AC-08) (#1240, #2387) (57c803e)
- claude-video evaluated, reference-only — /watch is a self-contained upstream plugin (Gemini or local frames+transcript engine, needs ffmpeg/yt-dlp BoB lacks); install it per machine when a need appears, never vendor (chunk 1/1: AC-01..AC-06) (#1024) (22cf14a)
- phuryn/pm-skills evaluated, reference-only with two patterns taken — intent-vs-code auditing as input to #2668, an unsteered release review filed as #3561; pre-mortem dropped for idea-stress-test (chunk 1/1: AC-01..AC-05) (#1029, #2668, #3561) (128e7d9)
- davidondrej/skills evaluated, reference-only — a personal 56-skill kit tied to its author’s tools; its tested catastrophic-command guard filed as #3563 (chunk 1/1: AC-01..AC-06) (#1045, #3563) (ecbbc74)
- hosted X MCP evaluated, reference-only — pay-per-use reads ($0.005/post) through a per-operator X app, user-context bridge acts as the operator; opt-in per project, wiring left to the first consumer #825 (chunk 1/1: AC-01..AC-07) (#837, #825) (1326c0d)
- PlayCanvas tooling evaluated, archive — React and web-components spiked (both render; ~590-614 kB gzip vs 302 kB engine-only), create-playcanvas is the scaffolder to use with bob ready after it, playcanvas-sync’s patterns already in BoB; no template (chunk 1/1: AC-01..AC-04) (#2312) (461d4bb)
- Briefings pane snapshots, stale and empty cases, screenshots (#2926) (8dfe7e5)
- cloudflare deploy env matrix — kind x format x env, never a bare test deploy (#3068) (a74ad95)
- portfolio-wide briefings index tests and reference docs (#3102) (bbe1d96)
- area-view tests, briefing.md decision-item rule, bob brief –area row (#3101) (ba676d8)
- no shipped shell script calls GNU timeout directly (#3170) (858cf95)
- neutral test fixtures — sample repos and URLs name the fictional operator (#2442) (de0ff33)
- views are projections of one page — list keeps the row markup, no refetch on switch, no-JS first paint (chunk 2/3: AC-02, AC-03, AC-04) (#2141) (6e8ecb1)
- the chosen view round-trips through the real /layout.json and /action/layout routes (chunk 3/3: AC-06) (#2141) (11ca88f)