| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| beads-v1.3.1.spdx.json | 2026-10-01 | 1.7 MB | |
| checksums.txt | 2026-10-01 | 881 Bytes | |
| beads_1.3.1_darwin_amd64.tar.gz | 2026-10-01 | 53.5 MB | |
| beads_1.3.1_darwin_arm64.tar.gz | 2026-10-01 | 48.4 MB | |
| beads_1.3.1_contract_corpus.tar.gz | 2026-09-30 | 4.1 kB | |
| beads_1.3.1_linux_arm64.tar.gz | 2026-09-30 | 49.4 MB | |
| beads_1.3.1_linux_amd64.tar.gz | 2026-09-30 | 53.3 MB | |
| beads_1.3.1_freebsd_amd64.tar.gz | 2026-09-30 | 32.0 MB | |
| beads_1.3.1_windows_arm64.zip | 2026-09-30 | 30.4 MB | |
| beads_1.3.1_windows_amd64.zip | 2026-09-30 | 54.1 MB | |
| beads_1.3.1_android_arm64.tar.gz | 2026-09-30 | 31.4 MB | |
| README.md | 2026-09-30 | 26.7 kB | |
| v1.3.1 source code.tar.gz | 2026-09-30 | 10.0 MB | |
| v1.3.1 source code.zip | 2026-09-30 | 12.3 MB | |
| Totals: 14 Items | 376.6 MB | 0 | |
Beads v1.3.1
v1.3.1 — the first patch release on the 1.3 line. Released 2026-09-30, cut from hotfix/1.3.1
at c1c4b642a. It ships exactly the code that was qualified as v1.3.1-rc.2; the only change since
that candidate is the version stamp.
There is no schema migration. Upgrading from v1.3.0, v1.3.1-rc.1 or v1.3.1-rc.2 is a binary swap. If you are still on v1.2.2 or earlier, read the v1.3.0 release notes first — everything in them applies, and this release adds to it.
The release is mostly about proxied-server mode, which became the default topology in 1.3.0: it gets
a backup path, honors dolt.auto-commit, can watch a bead, and stops reporting a dead backend as
running. Alongside that it fixes a fan-in stall that hid ready work, gives orchestrators a bounded
wisp-retention sweep, and corrects several commands whose exit codes or output scripts could not
trust. Several of those corrections change behaviour a script may depend on, so read the upgrading
notes.
Highlights
- A proxied-server workspace has a backup path (#6582, [#6584], [#6694], [#6879]). In v1.3.0
bd backupwas refused outright on a proxied workspace, which was listed as a known issue. On a proxied workspace whose Dolt server bd runs itself,bd backup init,sync,remove,statusandrestorenow work, and an explicitbackup.enabled=trueturns on the same throttled auto-backup direct mode takes. Auto-backup stays off by default. On a proxied workspace pointed at a Dolt server bd does not own, the family stays refused by design, because a backup remote registered there would be global to every client of that server. - Fan-in no longer stalls ready work (#6716; [#6719], [#6942]). Closing two blockers of one
dependent at the same time — formula fan-in with parallel workers, or a close racing a
bd dep removeor a delete — could leave the dependentis_blocked=1and missing frombd readyuntil someone ranbd recompute-blocked. Every write that takes a blocker away now rechecks its dependents after it commits, on the Dolt store, on every proxied-server write route, and insideRunInTransaction. bd purgecan run an orchestrator's wisp retention sweep (#6883).bd purge --wisps-plane --older-than 168h --forcereplaces a rawDELETE FROM wispsstep.--limitdrains a large backlog in bounded transactions,--older-thantakes hours, and a closed bead that live work still depends on is always kept.- Proxied-server mode catches up with direct mode.
dolt.auto-commit=batch/offtake effect andbd dolt commitworks (#6499).bd show --watchworks (#6933).bd dolt startno longer launches a second sql-server over the proxy's data directory, andbd dolt statusreports the proxy and its backend truthfully (#6580). The proxy retires when its Dolt backend exits cleanly instead of staying up in front of a dead store (#6937). Refusals that remain now say whether they are permanent (reason: design) or a gap with an owner (reason: unimplemented) (#6582). - The smart migrate gate stops wedging clones that are behind the remote (#6575; [#6659], [#6695]).
A clone level with the remote on schema but behind it on data used to auto-migrate in place,
after which every
bd dolt pullrefused (#6368). The gate now stops and tells you to runbd dolt pullfirst, andbd dolt pullis allowed to run from that state. - Exit codes and output scripts can rely on. A
bd closebatch with a refused id exits non-zero (#6740, [#6771]). A pipedbd queryis no longer silently capped at 50 rows (#6744).bd sqlno longer drops the rows of CTE queries orCALLresult sets (#6932).
Upgrading Notes
- No migration, but behaviour changes. The list below is everything in this release that can change what a script sees. Each item is described in full under Changed or Fixed.
bd show --watch <id>exits 1 when the id cannot be found, on both the direct and proxied routes. It used to exit 0 (#6933).bd sqloutput changed in two places (#6932). In direct server mode, a multi-statement write, or a write the parser cannot classify, now printsOK/{"status":"ok"}instead ofOK, N rows affected/{"rows_affected":N}. Proxied mode already did this.bd sql --readonlynow refuses a statement it cannot parse (for examplePRAGMA) instead of running it as a read.- A failure to read the custom issue types is now an error (#6934).
bd types,bd create --graphandbd config set storage-class.*fail instead of continuing as if there were no custom types. BEADS_DIRmust point at the.beadsdirectory itself (#6938). ABEADS_DIRthat names a project root (BEADS_DIR=$repoinstead ofBEADS_DIR=$repo/.beads), or a.beadsthat does not exist yet, used to work by accident because discovery walked up to the nearest workspace. It now fails with "no beads database found". Fix the variable; behaviour withBEADS_DIRunset is unchanged.bd purgealways keeps closed beads that a live bead depends on (#6883). This coversparent-child,tracksandblocksedges, and there is no flag to turn it off. The held-back count is reported aslive_dependent_skipped.bd prunedoes not apply this protection.--older-thanonbd purgeandbd pruneis exact at hour precision (#6883).12hused to round up to one day and now means 12 hours, sobd prune --older-than 12hdeletes rows closed 12–24 hours ago that it used to keep.36hused to floor to one day and now means 36 hours. Day values (7,7d,2w) are unchanged.bd closewith several ids exits non-zero when any of them fails to close (#6740, [#6771]). The ids that can close still close, and a finalError: N of M issues failed to closeline is added. An id that was already closed still counts as success.- An unflagged piped
bd queryis no longer capped at 50 rows (#6744). It followsbd list's policy: an explicit--limitwins, piped stdout is unlimited, agent mode on a terminal gets 20, and a terminal gets 50. Pass--limitif a pipeline relied on the cap. - On a proxied workspace with
dolt.auto-commitset tobatchoroff, writes stop being committed to Dolt history one at a time (#6499). The setting used to be ignored there. Changes now accumulate in the server's working set untilbd dolt commit, anddolt log,dolt pushand backups do not see them before that. The default,on, is unchanged. bd dolt status --jsonhas a new shape on a proxied workspace (#6580). The always-false{"running": false, "pid": 0, "port": 0}is replaced byrunning(now describing the proxy) plusproxy_*andbackend_*fields.pidandportare gone. This is the rc.1 change most likely to break a parser. Other topologies keep their output.bd config set <dotted.key>writes a nested mapping (#6578). Where.beads/config.yamlalready had the flat spelling (a top-leveldolt.host: ...), that entry is removed and re-written underdolt:. Two writes that used to exit 0 without a visible effect now exit 1: setting a dotted key under a parent that holds a scalar, and setting one in a file whose top level is not a mapping. If another tool writes flat dotted keys to the same file, check for a duplicated key afterbd config set(#6594, open).bd readyandbd list --readygrow for workspaces with customactive-category statuses (#5918). Those issues were always meant to be ready work and now appear. Counts and dashboards will read higher.bd list --wisp-type <t>without--include-ephemeralis now refused instead of printing an empty listing for every input (#6098).- Opening a store against an unreachable Dolt server now waits before failing, up to about 40s
per open (#6003). This applies only to proxied-server workspaces and to
bd serve. Embedded workspaces, and ordinary CLI commands in a server-mode workspace, are unaffected. Bad credentials, an unknown database and an unresolvable hostname still fail immediately. bd backup syncfails after 5 seconds if another backup of the same workspace is running, rather than overlapping with it. A backup sync that would leave the manifest ahead of its chunk files now fails at that point instead of corrupting the backup quietly (#5931). A backup already in that state is not repaired by upgrading and has to be re-seeded.bd doctorwarns about a missing.beads/dolt-server-config.yamlgitignore pattern on every workspace created before this release (#5978). Runbd doctor --fixonce to add it.
Added
- The
bd backupfamily on a proxied-server workspace bd runs the Dolt server for (#6584, [#6694]).init,sync,remove,statusandrestoreare routed over the proxied provider.bd backup restorestops the proxy and its Dolt child before replacing the database, so the next command relaunches against the restored data. On a proxied workspace pointed at an external host, socket, or team-server database, the family is still refused with codeproxy.backup.unsupported, now carrying"reason": "design".CALL DOLT_BACKUP('add', …)would register the remote on the server for every client, and afile://destination would resolve on the server's filesystem. - Opt-in auto-backup on a managed-local proxied workspace (#6879). With
backup.enabled=true(orBD_BACKUP_ENABLED=1) the post-command hook takes the same change-detected Dolt-native backup into.beads/backupthat it takes in direct mode. It is off by default, as on every server-mode workspace. It does nothing on an external or team-server topology, under strict--readonly,bd serve,--dry-run/--inspect, or a migration freeze.bd backup statusnow reportsauto: off in proxied-server mode; set backup.enabled=true to opt ininstead of blaming a missing git remote. A per-workspace.beads/backup.lockstops auto-backup andbd backup syncfrom running at the same time. bd purge --wisps-plane,--limit, and hour-precision--older-than(#6883).--wisps-planeselects every closed row in the wisps table, including--no-historybeads. It works on embedded, server and proxied workspaces, and requires--older-thanor--pattern.--limit Ncaps one run at N beads, oldest-closed first. With--jsonthe output then addsremainingandhas_more; loop whilehas_moreis true.--older-thanaccepts36h,168h,90m, and values down to1s. A value too large to represent (for example213504d) is refused instead of wrapping to a tiny age.bd list --include-ephemeral(#6098). This is the flag--wisp-typeneeds to reach any rows.bd list --include-ephemeral --wisp-type heartbeatis the working form. It is off by default, so the default listing is unchanged.bd typeslists system types (#6934). A new "System types" section showsmessage,molecule,gateandevent, andbd types --jsongains an additivesystem_typesfield.
Changed
- Proxied-server refusals carry a
reason(#6582). The JSON a refused command prints gainsreason: design(expected to stay: shared history, multi-repo routing, destructive admin, strict--readonly) orreason: unimplemented(a gap with a named owner). Codes, messages and exit statuses are unchanged. A command with no proxied route now fails with the typedproxy.store.unroutedinstead of an internal string. bd backup restore --jsonprints{"restored": true, "source": "<dir>"}on every topology, where it used to print nothing. On failure,bd backup init/sync/remove/restorenow print a single error line instead of the error followed by the full usage text. Exit statuses are unchanged.dolt.auto-commit=batch/offtake effect on a proxied workspace, andbd dolt commitworks there (#6499, [#4995]). Commands that are explicit commit points (bd batch,bd mol bond/pour/squash,bd mol wisp create, the wisp half ofbd mol burn) still commit, andbd servewrites still commit per write.bd vc commit's proxied refusal now points atbd dolt commit.bd purgekeeps closed beads a live bead depends on, and--older-thanis exact (#6883). See Upgrading Notes.bd ready/bd list --readyinclude customactive-category statuses (#5918, [#5831]). Customwip/done/frozen/unspecified statuses andin_progressstay out. The--readyfooter and help text still describe the default as open-only, which now understates the set (#6187, [#6188], open).- The
--readyfooter names the status selector that applied (#5924). With an explicit--statusit now reads<selector> only. - Store opens retry transient connection failures for up to 30s (#6003), with each attempt
capped at 10s, so about 40s is the realistic worst case for one open. A provider open pings twice,
so a narrow ordering can reach about 80s. Only proxied-server workspaces and
bd servetake this path. - The Dolt bump rejects a backup manifest update that references a missing table file (#5931, [#4070]). This catches the corruption when it happens instead of at some later sync. It is a mitigation: backup publish is still not atomic.
bd dolt status --jsonreports the proxy and its backend separately on a proxied workspace (#6580), andbd config setwrites dotted keys nested (#6578). See Upgrading Notes.
Fixed
- An explicit
BEADS_DIRis authoritative during workspace discovery (#6938). ABEADS_DIRnaming a directory with no project files used to be ignored. Discovery then walked up from the current directory and rebound to the parent workspace, sobd initrefused with "already initialized" andbd create/bd listused the parent's store.bd initnow initializes the named directory, andbd import,bd setupandbd bootstraptarget it. - Concurrent unblocking no longer leaves a dependent stuck as blocked (#6716; [#6719], [#6942]).
Covered: the Dolt store write transactions; every proxied-server write route (
bd closesingle and batch,bd update --status,bd dep remove,bd delete,bd batch,bd serve);RunInTransaction(bd batchdirect,bd cook,bd mol squash/burn, SDK callers); the wisp writers; and the legacy dependency removal behindbd duplicates --merge. bd closereports a partial batch failure (#6648; [#6740], [#6771]). In--jsonmode the summary is a compact JSON line on stderr naming the failed ids, matchingbd update, and eachfailed[]entry carries the same refusal text on both routes.--claim-nextstill claims when part of the batch closed, and the summary names the claimed id.bd sqlclassifies statements with the Dolt SQL parser (#6932). In proxied mode,WITH ... SELECTandWITH RECURSIVEqueries were misread as writes and printedOK, 0 rows affected; they now return their rows. Statements that may both write and return rows (CALL,EXPLAIN ANALYZEof a write,RETURNING) are committed and their rows printed, soCALL DOLT_BRANCH(...)-style result sets are no longer discarded.bd queryappliesbd list's piped-output limit policy (#6229, [#6744]).bd show --watchworks under--proxied-server(#6933). It was refused withproxy.watch.unsupported. It now shares the direct route's loop: re-read every 2s, redraw on a status orupdated_atchange, stop cleanly on Ctrl+C/SIGTERM. Each poll uses its own short unit of work, so a long watch does not hold a transaction open.- A proxy retires when its Dolt backend exits cleanly (#6937). It used to notice only a non-zero
exit. A gracefully stopped backend left the proxy adoptable in front of a dead store, and with
--proxied-server-idle-timeout 0that never cleared.bd dolt statusnow reports such a proxy as "not serving" (running: false, withproxy_pidstill set), including one started by an older bd. bd dolt startis refused on a proxied workspace withproxy.dolt_start.conflict(#6580). It used to launch an unsupervised sql-server over the proxy's data directory or adopt the proxy's own Dolt child, which was a v1.3.0 known issue.bd dolt statusnow reads the proxy's own records instead of a PID file proxied mode never writes, so it no longer says "not running" while the proxy is serving.- The smart migrate gate stops a data-behind clone instead of auto-migrating it (#6575; [#6659],
[#6695]). A clone that has commits left to pull, whether or not it also has its own, is told to
run
bd dolt pullfirst, and is told when that pull will merge rather than fast-forward.bd dolt pullopens leniently for this one refusal, which changes the v1.3.0 upgrade note that said the gate refusesbd dolt pulltoo. Commands that keep working (bd list,bd ready,bd show,bd dolt commit) print the pull-first guidance instead of the migrate-or-adopt bullets.--jsoncallers get a singlepull-firstoption and adata_behind_shapeoffast-forwardordiverged. For a fast-forward on a non-shared store,human_decision_requiredisfalse. On a shared server the guidance namesbd migrate schema --forceas the consent step. A proxied workspace reaches the same stop, with the guidance naming the host the pull has to run on (pull-first-on-server-host).BD_SMART_GATE=0,bd migrate --forceandBD_ALLOW_REMOTE_MIGRATE=1behave as before. - A clone missing its local
events,bd_events_journalorbd_events_seqtable recreates it on open (#6547). These dolt-ignored tables could be absent on a clone that was otherwise at the latest schema, and bd never created them. That was the write-dead store listed under v1.3.0's known issues (#6142). The migration runner now replays the creating migrations from each table's own floor. - Deleting or purging a wisp removes its dependent rows on stores without the wisp foreign keys
(#6487; [#6563], [#6627]). Wisp deletes (including
bd purge,bd mol burnand wisp GC) leftwisp_dependenciesedges andwisp_labels,wisp_events,wisp_commentsandwisp_child_countersrows behind. This is a forward fix: orphans already in a store are not cleaned up. - A server-mode workspace with an empty
.beads/doltis no longer refused as legacy (#5682, [#6935]). When the gitignored.local_versionwitness was missing, every command, includingbd init, was refused and nothing could repair it. An empty root is now admitted and the witness written. A pre-1.0 witness, or a non-empty.beads/dolt, is still refused. bd typeslists exactly the typesbd create --typeaccepts (#6934). Server mode droppedconfig.yamlcustom types once the database had any, and proxiedbd config set storage-class.*ignored types registered in the database. Every mode now uses one rule.- A dotted config key round-trips (#6578).
bd config set sync.remotewrote a top-level key whose name contained the dot, whichbd config getfound and bd's direct reader did not, sobd init --remoterecorded a remote that was then not found.bd config unsetnow removes the nested form too. bd list --status <s> --readyhonors--status(#5832, [#5924]). It used to drop it and return the unfiltered ready set.bd gate checkresolves bead gates whose target lives in a prefix-routed rig (#5859), reading the owning store throughroutes.jsonlwithout writing to it.- Smaller fixes.
bd doctorand the gitignore template cover the generated.beads/dolt-server-config.yaml, which holds a per-machine port and path (#5978). The missing-prefix error points atbd init --prefix/bd bootstrapinstead of aconfig.yamlkey that has no effect (#5916, [#5936]).bd create --filesays it creates one issue per##heading and suggests--body-file(#5921). The list truncation hint no longer leaves a padded blank line under the prompt (#5685, [#5927]).bd setup claudeandbd initstop rewriting.claude/settings.jsonwhen nothing changed (#5693, [#5944]).
Validation
- v1.3.1 is the qualified rc.2 code. The tag (
c1c4b642a) differs fromv1.3.1-rc.2(696e3967b) only in the version stamp, the CHANGELOG, and package and plugin version metadata. - The rc.1 content and the first rc.2 changes landed on
release/1.3.0through PRs (#6578, [#6580], [#6653], [#6659], [#6695], [#6547] among them), each green across the full PR matrix of 119–122 checks. - The
hotfix/1.3.1work landed in four batch PRs, each tested at its merged head. Batch 1 (#6905: proxied backup and the purge changes) passed the full PR matrix, 121 checks green. Batches 2–4 (#6936, [#6945], [#6947]) each ran the Nightly Full Tests workflow twice by dispatch, once for the full test suite and once for the PR Linux command suite, alongside the Migration Test Harness (15 historical upgrade lanes, v0.9.1 through v1.2.2 → candidate) and the managed-local proxied lifecycle lane. All green at the merged heads. Batch 2's first full-suite run failed inTestHistoryDirectOnlyRefusalContract, a release-branch-only test that still expected proxiedbd dolt committo be refused after [#6499]. A test-only adaptation (70867888f) fixed it before merge. - The release pipeline completed green (run
36775172697):
verify-version-consistency, both goreleaser legs (linux and macOS), both package gates (MCP and npm),publish-pypi,publish-npmand release attestation. The tag-triggered Migration Test Harness and Cross-Version Smoke Tests also passed. 11 assets were published: linux amd64/arm64, darwin amd64/arm64, windows amd64/arm64, freebsd amd64, android arm64, the contract corpus, an SPDX SBOM and checksums. Both release candidates also completed their release pipelines. - Qualified against a real downstream consumer before the tag. Gas City's v1.5.0 release branch,
pinned to
v1.3.1-rc.2, ran its RC Gate twice. GitHub marks both runs failed overall. Every failure was triaged, and none of them came from bd. - 36621609134: every Linux tier passed, including the beads topology and proxied-native acceptance jobs, the bd CLI contract jobs, all 29 integration shards and tutorial goldens 1–6. The failures were a GitHub release-asset download 500, empty responses from an external inference provider, and a macOS-only Gas City test-fixture symlink bug unrelated to bd.
- 36672304937, at a product-identical head with that fixture fixed: everything passed, including every macOS job, except one acceptance shard. That shard did not run either attempt because of the same external-provider preflight failure, and the integration and tutorial tiers that depend on it were skipped. Their results carry over from the first run.
- The gascity-packs inference suites passed against bd
v1.3.1-rc.2. The full superpowers, compound-engineering and bmad suites passed on the first try, the gastown suite passed, and all five smokes passed (superpowers, compound, gstack, bmad, gastown). The full gstack suite did not complete: its first attempt hit a host-load startup timeout and its retry hit the build deadline while still iterating, with no failed step. On a proxied-server fixture, Gas City'smol-dog-backuporder synced 2/2 databases through the new proxied backup path withunsupported: 0, and thereaperandjsonl-exportorders also succeeded, with no direct Dolt access.
Installing
Pre-compiled binaries for Linux, macOS (Intel & Apple Silicon), Windows (AMD64 & ARM64), Android/Termux (ARM64), and FreeBSD are attached to this release.
Homebrew (macOS/Linux):
:::bash
brew install beads
Quick Install (macOS/Linux/FreeBSD):
:::bash
curl -sSL https://raw.githubusercontent.com/gastownhall/beads/main/scripts/install.sh | bash
Windows (PowerShell):
:::powershell
irm https://raw.githubusercontent.com/gastownhall/beads/main/install.ps1 | iex
Manual Install: Download the appropriate binary for your platform below, extract it, and place it in your PATH.
Whichever method you use, run which -a bd afterwards. A second, older bd earlier in PATH is
the mixed-version fleet problem described in the v1.3.0 upgrading notes.
Contributors
Thanks to everyone who contributed to v1.3.1 (between v1.3.0 and v1.3.1):
@A3Ackerman, @aspiers, @bourgois, @harry-miller-trimble, @julianknutsen, @mattdoka, @postoso, @quad341, @swedeinasia-flow, @vishnujayvel
Full Changelog: https://github.com/gastownhall/beads/compare/v1.3.0...v1.3.1