gum v2.0.1
This tag carries no code change. It exists because the v2.0.0 tree failed the project's own gofmt gate, and a formatting gate is only proven once a tag ships a tree that passes it.
Highlights
- The binary behaves exactly like v2.0.0. The only Go difference is column
make fmt-checkresolvesgofmtfrom the Go minor that CI pins instead ofmake fmtis a new target and is the supported way to format this module.- The release workflow runs
make fmt-checkbefore it publishes, so no later - The v2.0.0 release notes gained a Verification section and a corrected
alignment inside one map literal in cmd/gum/root.go.
whatever is on PATH, so a maintainer on a newer Go cannot write files the gate rejects.
tag can ship a tree the test workflow rejects.
Reproducibility recipe.
Install
curl -fsSL https://raw.githubusercontent.com/ehmo/gum/main/install.sh | GUM_VERSION=v2.0.1 bash
gum --version
gum doctorUpgrade notes
None. No config, catalog, wire-format, or behavior change. Upgrading from v2.0.0 changes only the reported version string.
Added
make fmtformats./cmdand./internalwith the pinnedgofmt.- The
pre-release-testsjob in.github/workflows/release.ymlruns
make fmt-check.
Changed
make fmt-checkandmake fmtresolvegofmtfromGOFMT_MINOR, default
go1.26, and fall back to fetching GOFMT_TOOLCHAIN, default go1.26.7, when the host runs a different minor. A host already on the pinned minor uses its own gofmt and downloads nothing.
Fixed
- The v2.0.0 tree failed
make fmt-checkunder the Go minor CI pins.
gofmt changed its alignment rules between Go 1.26 and Go 1.27: 1.27 splits the adapter map literal in cmd/gum/root.go into two alignment groups where 1.26 keeps one. The gate ran the host gofmt, so a 1.26 CI runner rejected what a 1.27 host had just written. The test workflow had failed on that one file since commit e73ee74, including on the commit that v2.0.0 tags.
Security
No vulnerability fixes and no dependency change. govulncheck reports the same result as v2.0.0: 0 vulnerabilities in code this project calls, and one finding, GO-2026-5932 in module golang.org/x/crypto, which has no fixed version and no called symbol.
Known limitations
Unchanged from v2.0.0.
- No catalog variant declares
default_fields, so the §770 requirement that - Nothing converts a plugin registry variant row into a dispatchable catalog
- No catalog variant declares a non-
fullexecution_support, so field_mask_mode="dual_fetch"is refused rather than implemented.- The §10.2 HTTP and ETag cache backend has no production reader or writer.
- macOS binaries are not notarized. The Homebrew formula clears quarantine
- The
v2.0.0tag tree still failsmake fmt-check. A published tag is not
every variant carry them is still unmet and the stage-1 field mask has nothing to inject. --fields completion is therefore empty.
variant, so gum plugin install runs no catalog validation.
unsupported_capabilities and "partial" are declared and tested but not exercised by shipped data.
http.db and http-wal.db are created and never used.
during installation. For standalone installs, inspect with spctl --assess --type execute --verbose gum and use xattr -d com.apple.quarantine gum if Gatekeeper rejects the binary.
moved, because its binaries, checksums and provenance all name that commit.
Token savings
Unchanged from v2.0.0. This release does not touch output shaping. Measured with the release fixtures using a local build stamped 2.0.1, run from the apps/gum directory of the matching source checkout:
gum gain --fixture-replay --format=toon
gum gain --fixture-replay --format=json| Default format | Total calls | Total tokens in | Total tokens saved | Aggregate savings |
|---|---|---|---|---|
toon |
10 | 3,922 | 0 | 0 % |
json |
10 | 3,922 | -12 | 0.31 % overhead |
Verification
All seven jobs in the v2.0.1 release workflow passed: tag validation, live docs match, tests, govulncheck, the GoReleaser build, the independent four-platform rebuild, and the provenance comparison. The pre-release-tests job ran the new gofmt step and it passed, which is the check the v2.0.0 tree failed.
The four downloaded archives matched checksums.txt, and each one matched its subject digest in gum-v2.0.1.intoto.jsonl at commit 2557cfe4ac6b5bf98b83b83813f80991223adaca. The binary extracted from each of the four archives matched its entry in release-binaries.sha256.
A local rebuild reproduced all four published binaries. The command in Reproducibility below, run from a clean clone at tag v2.0.1 on one darwin/arm64 host with GOTOOLCHAIN=go1.26.7, produced these hashes:
| Target | sha256 |
|---|---|
| darwin/amd64 | 791a418ba73f850b3685fd146fa34e2bf04cd22a993337328aa8390be7a15a47 |
| darwin/arm64 | bf563a8d1041f92bdf8255acf856a377011cd53e55cb653cb985f4590c5cabc8 |
| linux/amd64 | f0336ce18ff1b475d3c341a3804a1dd59f08f5b7301ec332a9a37bd7dc870f7c |
| linux/arm64 | c8a794e183b47d66f6fdd79bc3f9c53e9bc01414ee7e093c1312a644aa7b1907 |
Each hash matches the matching line in release-binaries.sha256.
The Homebrew installation reports 2.0.1 and gum doctor passed every check. brew audit --strict --online --os=all --arch=all ehmo/tap/gum and brew test ehmo/tap/gum both passed, and the tap-drift workflow confirms both formulae point at this release.
Reproducibility
git clone https://github.com/ehmo/gum.git
cd gum && git checkout v2.0.1
cd apps/gum
GOTOOLCHAIN=go1.26.7 CGO_ENABLED=0 GOOS=<os> GOARCH=<arch> go build -trimpath \
-ldflags='-s -w -X main.version=2.0.1' ./cmd/gum
sha256sum gumBuild from a full clone, not from a linked git worktree. Go embeds the commit revision in the binary, and it silently skips that stamp in a linked worktree, which changes the hash.
