Release notes: BoB 1.275.0
BoB 1.275.0 — release notes
Section titled “BoB 1.275.0 — release notes”Released: 2026-09-21 · Tag: v1.275.0 · Previous: 1.274.1 (2026-09-18)
This is the first BoB release with written release notes. The generated change list stays in
CHANGELOG.md and on the GitHub Release. This page says what the release means for
you and what to run.
Highlights
Section titled “Highlights”- Maintenance work has its own issue type. Use
/taskto file a dependency bump, CVE fix, runtime upgrade or cleanup. It has a Verification checklist in place of acceptance criteria. Warp-drive,/what-next, grooming and flight plans all accept tasks, and a task’s checklist is its definition of done. (#1957, #1958, #1959, #1960) - Briefings are things you can find. Every brief gets its own issue and an HTML page
(
bob brief --html). A generated index sorts them by recency and priority, and each area label can have its own brief (bob brief --area).bob brief --publishputs them on the web. A timer can post a brief after every farm tick. (#2790–#2793, #2820, #2872, #2246) - The docs keep themselves honest. Every page shows when it was last changed and last
reviewed, and stale pages are graded and gated. Every
bobcommand is reachable from a how-to, and every error you can hit has an entry on one troubleshooting page. There is also a one-pagebobCLI reference, organised by job. (#2551–#2554, #2562, #2607) - Cheaper, smarter model use. A written model-assignment policy decides which model does
which job. Duplicate detection for incoming issues runs on Jev, a fast judgment model. A
project manifest can declare its own
_workflowsettings. (#2680, #2672, #2681, #2703) - Background servers are visible.
bob doctorlists running dashboard servers with their age and address.bob dash serve --stop --allstops them. (#2563) - Two new tutorials. “Your First Product with BoB” and “Coming Back to a Project” form a learning path in the docs. (#2412, #2413, #2415)
- Deploying beside a running session.
deploy.shno longer counts Claude Code’s pre-warmed spare processes as live sessions. It no longer crashes on a manifest without a project name, and its guard only refuses for the real hazard. (#2746, #2763, #2766) - Warp-drive runs. A self-hosted run no longer blocks itself after its own first merge. Hooks no longer act on another session’s run, and a repeated checkpoint is idempotent. (#2136, #2306, #2168)
- Git dirt after provisioning. The managed ignore block now matches across machines, and a
provision overlay no longer leaks into
.gitignore. (#2093, #2247) - Test isolation. Test suites no longer write into your real operator repo. (#2679, #2776)
- Viz and dashboards.
bob vizshows the machines again, andbob warp vizreports a tailnet-bound dashboard instead of timing out. (#2544, #2560, #2640) - Releases.
bob releaseno longer exits 0 when GitHub refuses an oversized release body. (#2557) - Dev environments.
bob dev upnow provisions test users through the d1, sqlite and supabase adapters.bob initno longer writes a brokendev.jsoninto a repo that ignores it. (#2452, #2463) - A flight plan no longer reads “no longer depends on #NN” as a dependency.
cap-statusno longer follows another repo’s issue by number. (#2310, #2686) - The whole bug pile from flight plan 2778 is closed (47 of 47). (#2873)
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, because it would switch off the hooks in running sessions until they restart.
bob update --to v1.275.0 # fetch, move the checkout to the tag, deploy, then bob doctorOr by hand, from the BoB source checkout:
cd ~/projects/bigbrain && git fetch --tags && git checkout master && git pull --ff-onlyscripts/deploy.sh && bob doctorExpected: bob doctor ends green. Its version line names the release, or checkout
with the source SHA when you run master.
Farm workers only: check that the unattended tick timer and the snapshot timer are installed:
systemctl --user list-timers | grep -E 'bob-(tick|snapshot)'Upgrade: every project
Section titled “Upgrade: every project”In each project checkout on each machine:
cd <project> && bob readybob ready retargets .claude links to this machine, adds the new task label, projects the
port band and checks the manifests. Expected: READY — <project> is warp-drive-ready on this machine.
If the project still commits its .claude links (git shows M/D under .claude/ after
every bob ready), migrate it once:
bob provision untrack # report onlybob provision untrack --apply # untrack, ignore, one local commit; add --push to push itAction needed (one time)
Section titled “Action needed (one time)”| What | Who | Command |
|---|---|---|
Add the task label to every project repo |
each project | bob ready (it reconciles labels) |
| Operator repo must resolve (manifests moved out of BoB) | every machine | bob operator show → exit 0 |
| Briefing timer (optional) | the farm | bob brief --install-timer |
| Jev key for duplicate detection (optional) | the machine that grooms | bob secrets check names it if missing |
| Stop stale dashboard servers | any machine | bob dash serve --stop --all |
Breaking changes
Section titled “Breaking changes”None. Project manifests now live in your operator repo, not in BoB’s source. That moved in 1.274.x, and the old location still works (with a warning) until 2026-10-31.
Known issues
Section titled “Known issues”- On some machines
make checkfails atcheck-projects(a project listed with no manifest) and atcheck-pipefail-sigpipein one test file. Both are tracked bugs and do not affect running BoB. (#2890, #2945) - A few legacy
.claude/journal/templateslinks are reported as “uncovered” bybob provision untrackand left tracked. They are harmless.
Changes
Section titled “Changes”Full change list — 154 entries (the generated CHANGELOG.md section)
Features
Section titled “Features”- #1957: /task registry command for maintenance work (a4888e7), closes #1957 #2597 #2615
- #1957: task label in the standard label set (0a0190a), closes #1957
- #1958: /what-next ranks and labels tasks; task queue-and-ready test (03e4de5), closes #1958 #2597 #2615
- #1958: flight plans seat task items; groom readiness exempts task from ACs (4f3a207), closes #1958
- #1958: the warp-drive queue admits approved task issues (034cb3f), closes #1958
- #1959: task addendum and the Verification-checklist DoD gate (2190f43), closes #1959
- #1959: task is a third work_type with its own phase labels (cf47a6e), closes #1959
- #2246: the bob-brief timer and a briefing at the end of every tick (50ef681), closes #2246 #2888
- #2246: the briefing’s schedule, quiet hours, retention and dir are declared (51e1daa), closes #2246
- #2412: the tutorials index is a learning path — order: and prerequisites: in frontmatter, a derived “Next tutorial” line (158332e), closes #2412
- #2412: tutorial registry — render-scenarios renders every declared tutorial, the drift gate judges each entry (9522d79), closes #2412
- #2551: every docs page renders last changed and last reviewed (bc73132), closes #2551
- #2551: every published page carries a review date, gated in docs-check (f8e0b42), closes #2551
- #2552: /doc-audit reports each page’s staleness grade (2a8cd1c), closes #2552
- #2552: grade docs fresh / aging / stale against a declared per-mode policy (08d1eb2), closes #2552
- #2553: every shipped bob command is reachable from a how-to — make check-howto-coverage gates the routing table, reference-only is declared on the row (1313e57), closes #2553
- #2554: docs currency is a named gate on every stable release and promote (213af41), closes #2554 #2552 #2553 #2236
- #2562: make check-troubleshooting — a stale troubleshooting entry fails the build (34010b9), closes #2562
- #2563: bob doctor lists running dashboard servers with age, bind and staleness (515a4d3), closes #2563
- #2563: enumerate running dashboard servers; bob dash serve –stop –all (d76e244), closes #2563
- #2607: declared docs-site nav — sidebar order, collapsed sections, pinned Start here, search scope (8e0897d), closes #2607
- #2607: one-page bob CLI reference, organised by job (ae7e3cc), closes #2607
- #2672: Jev client primitive, one batched call with a pinned version that fails open (ad14ade), closes #2672
- #2672: vendor the TypeSafe agent skill and declare the Jev API key (6ededb7), closes #2672 #1
- #2680: agent model tiers follow the model-assignment policy (e6f7571), closes #2680 #2701
- #2680: model-assignment policy in the llm-tiering skill; intake stays on Opus (0246ff9), closes #2680 #2649 #2680 #2699
- #2681: dedupe eval against the 2026-09-19 intake burst: precision 1.00, recall 0.30 at 0.85 (ba08489), closes #2681 #2647 -#2675 #2649 #1974 #2672 #2667 #2681 #2649 #2659 #2667 #1831
- #2681: issue-dedupe flags an incoming issue that duplicates an older open one, on Jev (221f82a), closes #2681 #2672
- #2681: Jev vs Haiku 4.5 benchmark on the dedupe set; declare the bodfeed API key (f7ad719), closes #2681 #2681
- #2703: a provision manifest can declare _workflow keys (d53a63d), closes #2703 #2680 #2270 #2041
- #2718: unwire strip-ai-boilerplate; attribution is off in the Claude Code settings instead (861843f), closes #2718
- #2735: /requirement is one universal command (2524fc9), closes #2735 #2741
- #2735: make check refuses an item name that exists on both sides (a7083f0), closes #2735 #2748
- #2740: make check fails when a derived phase-instruction copy diverges (9336bca), closes #2740 #2757
- #2790: a brief with no state, or two, is drift the gate reports (ae1b19a), closes #2790
- #2790: the brief vocabulary is declared once and gated (cb1a31b), closes #2790
- #2791: bob brief –html renders the page; stdout is one line (b091e8d), closes #2791
- #2792: a generated briefings index, sortable by date and priority (30c1b15), closes #2792 #2793
- #2793: adopt the six published briefs as brief entities (1b4157e), closes #2793 #2798 -#2803
- #2793: every adopted brief links back to its issue (f6ea0ca), closes #2793 #2798 -#2803
- #2817: the decide() seam, built before the second Jev call site (c923106), closes #2817 #2798 #2798
- #2818: a brief proposes its own next action, and says so when it cannot (71c7040), closes #2818 #2817 #2789
- #2819: the in-page write path — a tick goes to the issue, verified (dab1d4f), closes #2819 #2818 #2789 #2267 #2823 -#2870
- #2820: a brief per area label, to plan BoB’s next moves (fba59dd), closes #2820 #2818
- #2872: bob brief –publish copies the set to the declared target (d9170a3), closes #2872
- #2872: every generated page says whether it is live (2283d69), closes #2872
- #2872: the brief publish target is declared operator data (693cdd6), closes #2872
- todo-writing: todos are written for zero context (be9de25)
- www: a sixth briefing on waking a stale project (772ef00)
- www: five session briefings at www/bob/briefings (366647c)
Bug Fixes
Section titled “Bug Fixes”- #1446: the deploy verifier lowercases derived routes on Starlight (f6e4df4), closes #1446
- #2093: bob init converges the universal link set, in both directions (cccd1a1), closes #2093 #1479 #1924
- #2107: the stamp takes a key of BoB’s own, so no harness field is shadowed (31101c0), closes #2107
- #2113, #2787: a writer that validates, a gate that grades repo content (173bf9d), closes #2113 #2787 #2040 #2062 #2772 #2772
- #2121: a number is a count only when it claims to be one (53dcc30), closes #2121 #858 #2087 #858 #30
- #2131: the lock’s path is baked into the trap, so releasing it cannot fail (cc6d945), closes #2131
- #2136: a self-hosted run says what it deferred, not just what it allowed (23728ff), closes #2136 #2099
- #2168,#2250: a checkpoint is a boundary, and a chunk sequence starts empty (173f4ea), closes #2168 #2250 #2040 #2168 #2250 #2092 #2168 #2250
- #2172,#2722: a flag is not a path, and a folded description is not an object (7da328f), closes #2172 #2722
- #2210: the refresh summary separates its parts with a space (3dc03a5), closes #2210
- #2247: an overlay’s paths are session state, so they never enter a tracked file (7115f37), closes #2247
- #2248,#2209: a report reports, and the exit code is the documented one (21c8a53), closes #2248 #2209 #2084
- #2306: three warp hooks act for the session that owns the run, not the checkout (8386d15), closes #2306 #2275 #1830 #2275 #1831 #2306
- #2310: a negated mention is not a depends_on edge (8287c9f), closes #2310 #2054 #2057 #2045 #2048 #2054 #2057 #2054 #2057 #2054 #2297 #2772 #12 #12
- #2316: every dangling link names the command that would actually clear it (6329f46), closes #2316 #1953 #411 #707
- #2381: a CLI sets its exit code and lets the document finish (d6ec414), closes #2381 #2815
- #2385: a failed call fires its own event, so the detectors listen there too (918a5ec), closes #2385 #1897 #2385 #1831
- #2452,#2814: step 4 reaches the adapter, and the adapter can write a user (e576d60), closes #2452 #2814
- #2463: a dev.json is written for a dev-server project, and nowhere else (74079a4), closes #2463 #1573
- #2479: a tree with no remote owns no tracker, so it files nothing outward (0614c45), closes #2479 #2169 #2479
- #2486: a gh stub reads the body, because the real gh does (e59c537), closes #2486 #1794
- #2516: skills/synced is Claude Code’s, not deploy output — deploy leaves it alone and host-drift does not grade it (e7311c7), closes #2516
- #2518: check-legacy-names reads the warp pane name as a label, not the alias (6922a4f), closes #2518 #2091 #2397
- #2536: untrack only what the managed ignore block covers (a198b2b), closes #2536
- #2544: the deployed copy finds machines.json — operator-data reads stop passing a __dirname root as an explicit BOB_SOURCE, and bob viz names an unreadable registry (687734d), closes #2544 #1220 #2270 #1220
- #2555: vue-safe-lint catches a pipe tearing a table-cell code span, and the commit gate lints every docs-site source (fac0a75), closes #2555 #2561
- #2557: a long Release body is capped, never dropped — and a failed publish exits 5, never 0 (f340a32), closes #2557
- #2558: harness-owned paths are declared once — deploy.sh and host-drift.js both read scripts/lib/harness-owned-paths.json (0874322), closes #2558 #2516 #2558 #2530
- #2560: bob warp viz surfaces the server’s refusal and names the bind conflict (8800ad4), closes #2560
- #2561: the lint asks the Vue compiler’s question, not markdown’s (a045c7c), closes #2561
- #2590: retire the in-tree PM graveyard, and stop naming a moved ledger (459936c), closes #2590 #535 #2089 #2089 #2270
- #2607: link the generated catalogs by site path so doc-governance passes in CI (2d60e31), closes #2607
- #2608: stamp a canonical UTC commit date, whatever git spells it (c02a8a1), closes #2608 #2590
- #2615,#2813: a count is a number, so the fleet’s two wc dialects agree (990d549), closes #2615 #2813 #1976 #2615 #2693
- #2627: bob operator init refuses the product and never shadows a live fleet (8d9a235), closes #2627
- #2635: check-intake materialises the intake config before typecheck and test (6963786), closes #2635 #2270 #2635
- #2635: operator data is read through the resolver — checks and tests stop reading it from the checkout (9f21dc0), closes #2635 #2270 #2270 #2679 #2679
- #2640: –list prints the URL the server actually answers on (746e869), closes #2640
- #2672: typesafe-ai is opt-in — the orchestrator stops recommending it to every project (bf4c66c), closes #2672 #2672 #1980
- #2679: tests never write the real operator repo — runner sandbox, guard, per-suite sandboxes (674e9d4), closes #2679 #2270 #2635 #2627 #2635 #2684
- #2679: the sample operator carries a complete, valid intake config (f4666ec), closes #2679 #2684
- #2685: count subagent transcripts and price usage per message model (4663f07), closes #2685 #384 #2696
- #2686: a ref says whose issue it is, and cap-status listens (93b9505), closes #2686 #2649 paulirv/bodfeed#67 #67
- #2689: a generated product page owns its owner:, not the operator (ddf7445), closes #2689 #2268
- #2692: the doc-orphan gate says when it could not run, and its test copies all of doc-keeper (505663f), closes #2692 #2552
- #2693: the cli.md retirement-date check reads the date, not the wording around it (93332a9), closes #2693 #2607
- #2696: canonicalise a git date where it is read, not where it is rendered (d23d3a2), closes #2696 #2608 #2608 #2696 #2040
- #2715: two label descriptions fit the limit the forge actually enforces (1eed535), closes #2715
- #2719: nine Node readers of _workflow go through the resolver (7579ea3), closes #2719 #2041 #2703 #2703 #2552
- #2735: check-provisions knows a promoted item is not a broken one (621841e), closes #2735 #1872 #412 #2735
- #2740: a _workflow key can no longer pass as live on prose alone (2932031), closes #2740 #2757
- #2746,#2766: deploy when there is nothing hazardous to write (68b3b2f), closes #2746 #2766 #1997 #2040 #2111 #2743 #2040 #2766 #2744
- #2748: CI runs the gate its full clone exists for (de1c4f1), closes #2748 #2735 #2314
- #2749: the CI-runner todo assignee comes from the operator profile (b27f5ef), closes #2749 #2269
- #2763: a daemon spare slot is not a live session (71aecc6), closes #2763 #2040 #1831 #2766
- #2763: drop the operator literal from the captured ps fixtures (0cfe5a9), closes #2763
- #2772: a lint grades what git tracks, declared once for both gates (d9be8ae), closes #2772 #2509 #2701
- #2772: check-legacy-names scans tracked files, not the build output (278c3e5), closes #2772 #2509 #2701
- #2776: every suite carries its own operator, so a direct run is safe (a73eddb), closes #2776 #2783 #2776
- #2776: the operator sandbox guard lives in the resolver, not the runner (c85e48f), closes #2776 #2679 #2783 #2776
- #2777: a bug is verified by what goes red, not by the words “regression test” (7aa9cc6), closes #2777 #2052 #2749
- #2792: sorting by priority puts P1 first, not after P4 (7ae7205), closes #2792
- #2819: brief-tick answers under its path-route mount prefix (e0af2d8), closes #2819
- #2820: a report-only –area run leaves no pages behind (40d6b8c), closes #2820
Documentation
Section titled “Documentation”- #1959: /warp-drive selects work_type task; task loop documented (3b701ab), closes #1959 #2597 #2615
- #1960: /groom treats a parentless task as well-formed (6b97b38), closes #1960
- #1960: task documented as a work type; warp status shows its label (e7019bc), closes #1960 #1956
- #2246: regenerate docs/reference/cli.md from the routing table (45f8bee), closes #2246 #2805
- #2412: the tutorial registry, the learning path and “Next tutorial” — verification-system, documentation standard, scenarios authoring note (0dae7e0), closes #2412
- #2413: Your First Product with BoB, Monday and Tuesday — vision, two capabilities, four requirements, groom, flight plan (055b42c), closes #2413
- #2413: Your First Product with BoB, Wednesday to Friday — dev up, a forked wave, the integration branch, finalize, release, retro and journal (78f842c), closes #2413
- #2415: Coming Back to a BoB Project — why the first hour back is a fixed routine, stop by stop (9d6172d)
- #2415: the Coming Back to a Project tutorial — step 3 on the learning path, generated through the registry (f292c3e), closes #2415
- #2536: declare bob provision ignore-paths and the coverage rule (d1e86ab), closes #2536
- #2551: the documentation standard states the two-signal page-age rule (8a4fb32), closes #2551
- #2552: triage the 17 pages dated 2026-06-22; standard §3.4 staleness policy (12fb73d), closes #2552 #2270
- #2553: how-tos for bob operator and bob secrets — the first-time operator setup in order, the scaffold-shadowing recovery, and the secrets presence check (31d2003), closes #2553
- #2553: how-tos for bob ritual, bob brief, bob tour and bob provision untrack (b7aa21e), closes #2553 #2544
- #2554: versioning how-to documents the docs currency gate (b73503e), closes #2554
- #2557: versioning how-to — when the GitHub Release does not publish (183916b), closes #2557
- #2560: troubleshooting entry for the warp viz bind conflict (761c34c), closes #2560 #2597
- #2562: link the troubleshooting page from both indexes and bob –help (8b60a5d), closes #2562
- #2562: troubleshooting page keyed by the verbatim error text (7d2f471), closes #2562 #2560 #2270 #2463
- #2563: running dashboards in bob doctor — troubleshooting entry and CLI how-to (32b4d37), closes #2563 #2560
- #2607: Start here on the docs home, CLI reference first under Reference (707d349), closes #2607
- #2635: a bare checkout is expected to fail check-provisions (69bb54c), closes #2635 #2509 #1479
- #2667: jev-model-router evaluated, no-go; the model-assignment policy names the router’s role (e84a796), closes #2667 #2680 #2672 #2711
- #2672: the llm-tiering skill takes Jev as a backend, with a worked triage example (311f16a), closes #2672
- #2680: bigbrain declares delegate_mechanical_chunks in its manifest (ac0bc0b), closes #2680 #2680 #2703 #2719 #2704 #2705
- #2680: delegate_mechanical_chunks recommendation; per-project opt-in, fleet default off (d710b2c), closes #2680 #2704 #2705 #2703
- #2681: /groom Step 2b runs the dedupe pass; duplicate is a declared label (19c203a), closes #2681 #2715
- #2685: document the subagent bucket and per-model pricing (ce0a497), closes #2685 #2589
- #2740: warp-drive-internals states where instructions and config come from (c24d256), closes #2740
- #2772: name the issue that owns the named-file case (2fa48f8), closes #2772 #2787 #2772 #2772 #2787 #1837
- groom: fold business cases #2207 and #1670 into vision §Roadmap; personas and the single-developer non-goal revised per #2207 (13c407d), closes #2023 #2214 #2220 #1665 #2214 #2220
- #2640: hold –list to the resolver, not to a URL it composes itself (9414442), closes #2640
- #2689: the no-operator workarounds become the operator-independence check (1a46adb), closes #2689 #2679 #2689
- #2703: the manifest _workflow layer, proved and documented (fc32e52), closes #2703 #2679 #2725 #2703
- #2719: js-leak keeps the _workflow chokepoint enforced (1741542), closes #2719 #2719
- #2749: hold that the CI-runner todo’s assignee is read, not written in (8db229b), closes #2749 #2749 #2749 #2772
- #2763: pin the #2040 refusal and the captured spare fixture (c1d6bf9), closes #2763
- #2766: the guard that must never throw is held to it (c8dfa56), closes #2766
- #2872: the gate refuses, orphans survive, a dirty checkout is not deployed (c65f360), closes #2872
- #2873: two suites that were right on macOS and wrong on the farm runner (4c5068b), closes #2873 #2248