Beads v1.3.2
v1.3.2 — the second patch release on the 1.3 line. Released 2026-10-24, cut from
hotfix/1.3.1 at 9b65b9e19. It ships exactly the code that was qualified as v1.3.2-rc.3; the
only change since that candidate is the version stamp.
There is no schema migration, and the embedded Dolt engine is unchanged (Dolt 2.2.0). Upgrading
from v1.3.1 or any v1.3.2 release candidate is a binary swap. If you are coming from v1.3.0 or
earlier, read the v1.3.1 release notes
first — everything in them applies, and this release adds to it.
This is a fix-only release. It closes two ways v1.3.1's new retention and backup paths could lose
data, makes the post-commit blocked-state recheck safe under concurrent writes, lets a
least-privilege Dolt user write again, removes an export stall on large wisp sets, and rebuilds with
Go 1.26.10 and patched dependencies. It also carries an upgrade note for every store that crossed
migration 0059 under bd 1.3.0 or later: read it before you upgrade.
Highlights
bd purgeno longer deletes the closed root of a chain that still has live work under it
(#7041, fixes #7031). v1.3.1's live-dependent protection only covered a closed bead a live bead
pointed at directly, so an orchestrator'sbd purge --wisps-plane --older-than ...retention
sweep could delete a closed root above a closed child above an open grandchild, orphaning both.
Protection now propagates up the whole closed chain.- Auto-backup never claims a commit the snapshot does not contain (#7044, fixes #7032). The
watermark is read before the sync, so a commit that lands mid-sync stays pending for the next
backup instead of being skipped as "no changes". - The fan-in recheck no longer reverts concurrent writes (#7146, backport of #6876, fixes
#7030). On the Dolt server backend, the post-commit blocked-state recheck could write rows other
sessions had just committed back to their earlier values. It now runs in its own transaction and
publishes its Dolt commit after that transaction commits. - A least-privilege Dolt user can write again (#7786, backport of #7322).
bd create --graph,
bd mol wisp,bd historyandbd recompute-blockedno longer fail withcommand deniedfor a
server user granted EXECUTE on onlydolt_add/dolt_commit. bd export --allno longer stalls on workspaces with many wisps (#7603, backport of #6444,
with #7785). Bulk readers read at most 200 ids per statement, and a repeated id is read once.- Security rebuild. Release binaries build with Go 1.26.10 (#7732), and
x/net,x/crypto,
grpcandthriftare raised past every fixable advisory that reaches the binary (#6355,
#7495).
Upgrading Notes
- After upgrading from bd 1.3.0 or earlier, run
bd recompute-blockedonce per workspace
(#7037). Migration 0059, first shipped in v1.3.0, recomputes the storedis_blockedflag with a
recursive query. On Dolt servers older than 2.4.0, and on the embedded engine, a query-planner bug
(dolthub/dolt#11886, fixed in Dolt 2.4.0) drops
the query'sparent-childedge filter, so blockedness spreads across every dependency type,
includingrelates-to,discovered-fromandtracks. Beads that are not blocked are marked
blocked and silently disappear frombd readyandbd list --ready. The flag is stored, so the
damage persists until it is recomputed, and nothing in v1.3.2 repairs it automatically. This
applies to every workspace whose store crossed migration 0059 under bd 1.3.0 or later, which
includes a workspace now on v1.3.1 that was first created by 1.2.x or earlier. The command is
idempotent, reportsrows_corrected, and changes nothing on a workspace that was not affected. bd purgekeeps more closed beads (#7041). Every closed bead in a chain above a live bead is
now kept and counted inlive_dependent_skipped, on every backend. A retention sweep that used to
delete such a root no longer does, so its purged count can drop.- The
bd purge --limit Nconfirmation suggests a--forcecommand that keeps--limit
(#7540, fixes #7534). The suggested command used to drop--limit, so running it as printed
deleted every eligible row instead of N. If you copied that suggestion into a script, check it. - A negative
--older-thanthat overflows is refused onbd purgeandbd prune(#7540, fixes
#7524). A large negative day count, such as--older-than=-213503d, used to wrap to a small
positive age and purge. bd exportfails when it cannot classify wisp-plane rows (#7603). When thewispstable
exists but its membership cannot be read, export now fails withfailed to classify wisp-plane rowsinstead of silently exporting without wisp markers. Only a missingwispstable is
tolerated.
Fixed
bd purgekeeps the whole closed chain above a live bead (#7041, fixes #7031). Take a closed
root R, a closed child S1 and an open grandchild S2. v1.3.1 protected S1, because S2 is live, but
not R, because its only dependent S1 is closed, so purge deleted R and orphaned S1 and S2;
--dry-runreported the same deletion. Protection now propagates through closed candidates until
nothing changes, on the Dolt server, embedded and proxied backends.- The auto-backup watermark no longer runs ahead of the snapshot (#7044, fixes #7032).
Auto-backup read Dolt HEAD after the sync and recorded it as the newest commit backed up, so a
commit that landed during the sync was recorded as backed up although the snapshot lacked it, and
auto-backup then reported "no changes since last backup" until HEAD moved again. Only opted-in
auto-backup (backup.enabled: true) was affected;bd backup syncrecords no commit watermark. - The post-commit blocked-state recheck no longer reverts concurrent writes (#7146, backport of
#6876, fixes #7030). v1.3.1's #6716 fan-in fix minted its Dolt commit while its own SQL
transaction was still open.DOLT_ADDstages the table from the session's BEGIN-time root, so the
commit could writeissuesrows that other sessions had just committed back to their BEGIN-time
values. The recheck runs only when unblocking writes (closes, dependency removals, deletes) race,
which is exactly when this matters. The recompute now runs alone in its own retried transaction
and the Dolt commit is published after it. A failed trailing commit is counted as
post_tx_commit_droppedand logged, instead of being reported as a recheck failure, because the
flag repair itself is already committed. - A least-privilege Dolt user can write again (#7786, backport of #7322). Two fresh-connection
paths ranCALL DOLT_CHECKOUTeven when the session was already on the requested branch: the
fallback for the ignored-tables transaction, and the pinned connection used by long-timeout
versioned reads and the blocked recompute. A server user granted EXECUTE on only
dolt_add/dolt_commitis denied even that no-op checkout. The checkout now runs only when the
session is on a different branch. bd export --allno longer stalls on workspaces with many wisps (#7603, backport of #6444).
The bulk label, comment, dependency and issue readers sent every id in oneIN (...)list, and
Dolt's cost grows faster than linearly in the list length; one reported workspace stopped
completing exports past about 21k wisps. The readers now read at most 200 ids per statement, and
export reads the wisp-plane relations only for ids that are wisps. A repeated id is read once, so
batching never duplicates or drops a row (#7785).bd purge --limit Nconfirmation and--older-thanoverflow (#7784, backport of #7540, fixes
#7534 and #7524). See Upgrading Notes.
Security
- Release binaries build with Go 1.26.10 (#7787, backport of #7732), which distrusts the
compromised eMudhra intermediate CAs incrypto/x509.release.ymluses uv 0.13.4, which ships
the same distrust. - Dependency floors raised (#7787):
golang.org/x/netv0.60.0 andgolang.org/x/crypto
v0.57.0 (backport of #6355), andgoogle.golang.org/grpcv1.83.2 andgithub.com/apache/thrift
v0.24.0 (backport of #7495).govulncheckreported 16 reachable advisories on rc.2's module set
and none on rc.3's, which is the v1.3.2 module set.
Validation
- v1.3.2 is the qualified rc.3 code. The tag (
9b65b9e19) differs fromv1.3.2-rc.3
(0dee73e43) only in the version stamp, the CHANGELOG, thebd infodigest, and package and
plugin version metadata. - Every fix landed on
hotfix/1.3.1as acherry-pick -xPR of a commit already onmain,
tested at its head. The backport PRs (#7220, #7146, #7786, #7784, #7603, #7787) and the three
RC prep PRs (#7221, #7461, #7788) each passed the full PR matrix of 120–122 checks, including the
requiredCI Gate / Requiredgate that PRs intohotfix/**now run (#7198, ported in #7217). The
promotion PR (#7809) passed 121 checks plus the Nightly Full Tests workflow by dispatch, once for
the full test suite
(40042534271) and once for the
PR Linux command suite
(40042536408). - The release pipeline completed green (run
40044707863):
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 (40044708076) and
Cross-Version Smoke Tests
(40044707912) 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. All three release candidates also
completed their release pipelines. - Qualified against a real downstream consumer before the tag. Gas City's
hotfix/1.5.1
branch, pinned tov1.3.2-rc.3, passed its full RC Gate on the first attempt:
40034407401, at
9d970f7cc8. No job failed: the Linux CI parity tiers (including the beads topology
acceptance, the bd CLI contract jobs against the current and minimum-supported bd, and a contract
radar against beadsmain), acceptance A, B and C, all integration shards, tutorial goldens 1–6,
the four worker-core providers, the goreleaser snapshot, and the full macOS regression set.
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):
brew install beadsQuick Install (macOS/Linux/FreeBSD):
curl -sSL https://raw.githubusercontent.com/gastownhall/beads/main/scripts/install.sh | bashWindows (PowerShell):
irm https://raw.githubusercontent.com/gastownhall/beads/main/install.ps1 | iexManual 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. Then run
bd recompute-blocked once per workspace if the first upgrading note applies to you.
Contributors
Thanks to everyone who contributed to v1.3.2 (between v1.3.1 and v1.3.2):
@bee-ghosttrack, @bourgois, @brandonmartin, @julianknutsen, @rjgeng
Full Changelog: v1.3.1...v1.3.2