chore: bump Go toolchain to 1.25.13 to clear stdlib advisories - #296
Conversation
Six advisories published against go1.25.12 turned the govulncheck job red on every PR (GO-2026-5026, -5972, -6089, -6090, -6218 in the standard library, all "Fixed in: net/http@go1.25.13"). The job is not a required check, so it was failing silently rather than blocking, which is worse: a permanently red gate stops being read. Bumps go.mod and all four setup-go pins in ci.yml, plus the pins in release-stable.yml and dev-release.yml. The release workflows matter most and are easy to miss: bumping only CI would turn the gate green while shipping user binaries still linked against the vulnerable stdlib. govulncheck now reports only GO-2026-5932, the openpgp advisory the job already allowlists, so the gate passes for the reason it is meant to. Verified the toolchain change moves no user-visible surface, two independent ways: scripts/release-surface.sh reports the 2610 contract-bearing lines in gen/ identical, and dumping --help for all 289 command nodes from binaries built with 1.25.12 and 1.25.13 gives byte-identical output (same sha256). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
miguel-heygen
left a comment
There was a problem hiding this comment.
Exact-head review at 3070cc1.\n\nThe 1.25.13 bump is complete across all six setup-go consumers: four CI jobs plus both workflows that build downloadable release artifacts. Repository-wide search finds no other Go version pin. I verified the actual govulncheck job installed go1.25.13 and reported only the documented GO-2026-5932 allowlist entry; the five reachable standard-library findings are gone. The official Go vulnerability record for GO-2026-5026 also marks versions before go1.25.13 affected, matching the fix boundary. All required checks are green.\n\nThe release-process documentation detail belongs naturally in stacked #297, where the toolchain source actually becomes go.mod.\n\nVerdict: APPROVE\nReasoning: CI and both release artifact paths use the fixed toolchain, the vulnerability gate is meaningful again, and no version pin was missed.\n\n— Magi
Description
The
govulncheckjob has been failing on every PR in this repo. Six advisories were publishedagainst
go1.25.12, and five of them are standard-library issues that govulncheck traces into codethis CLI genuinely calls:
The sixth,
GO-2026-5932(x/crypto/openpgp), is already allowlisted by that job for a documentedreason and is unaffected by this change.
govulncheckis not a required status check, so this was failing without blocking anything. That isthe part worth fixing rather than tolerating: a gate that is permanently red stops being read, and
the next genuine advisory would have landed in a job everyone had learned to ignore.
The fix bumps the toolchain to
1.25.13in all six places it is pinned: thegodirective ingo.mod, the foursetup-gopins inci.yml, and one each inrelease-stable.ymlanddev-release.yml.The two release workflows are the easy ones to miss and the ones that matter most. They build the
binaries users actually download. Bumping only CI would have turned the gate green while continuing
to ship artifacts linked against the vulnerable stdlib, which is a worse state than a red check:
the signal would say fixed while the shipped thing was not.
Nothing else in the repo pins a Go version. There is no Dockerfile,
.tool-versions, mise/asdfconfig, or devcontainer, and
.goreleaser.yamlpins no Go version. The README badge readsGo 1.25(minor only), so a patch bump does not stale it.One consequence worth naming: raising the
godirective means a contributor running withGOTOOLCHAIN=localandgo1.25.12installed now gets a build error instead of a silent buildagainst the older stdlib. That is the intended direction. The default
GOTOOLCHAIN=autofetches1.25.13transparently, and CI pinsGOTOOLCHAIN: localalongside asetup-gothat installs1.25.13, so the two stay consistent.Testing
govulncheckv1.1.4 output (theversion
ci.ymlinstalls) on this branch: exit code 3, ids found =GO-2026-5932only,unallowlisted = none, so the gate passes for the reason it is meant to. All five stdlib advisories
clear.
make testpasses ongo1.25.13.make lintreports 0 issues.scripts/release-surface.sh diffreports no change, with non-empty inputs on both sides (2610contract-bearing lines each), so it is not the silent-empty result that script's own comments
warn reads like a clean bill.
ldflagsversion string, dumped--helpfor all 289 command nodes from each, and diffed: byte-identical, same sha256.The
surface-reportCI job only runs whengen/changes, so it will not report on this PR. Thelocal checks above stand in for it deliberately.