Take x/crypto v0.56.0, raise the floor to Go 1.26, pin CI to 1.27.1 - #8
Conversation
govulncheck reported seven reachable advisories, all in x/crypto v0.43.0 and all reached through internal/computers/ssh_backend.go. Five are fixed in v0.52.0; GO-2026-6354 and GO-2026-6355, both SSH channel deadlock DoS, need v0.56.0. v0.56.0 declares go 1.26.0, so taking the fix raises the module's floor from 1.24.2. The intermediate option was considered and rejected. v0.52.0 needs only go 1.25.0, but Go supports the two most recent majors and the current release is 1.27, so 1.25 is already end of life: it would move the floor to an unsupported language version, clear five of seven, and leave vulncheck failing with two live DoS paths. Raising the floor is the cost either way, so it should buy the whole fix. The floor moves less than it appears. CI and the release pipeline already build with a 1.26 toolchain, and go.mod carries no toolchain line, so with the default GOTOOLCHAIN=auto a contributor on an older Go fetches a compliant toolchain rather than failing. Only builds pinned to GOTOOLCHAIN=local, chiefly distro packaging, have to move. x/sys and x/text come along as transitive upgrades. The three places that state the build requirement move with it. After this, govulncheck reports no reachable module advisories at all. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The remaining govulncheck findings are all standard library, and the highest of them is fixed in go1.26.6 -- so the 1.26.8 pin already covered them. 1.27.1 is the current release, and pinning the newer of the two supported majors is the position that needs the least maintenance. 1.26.8 was chosen while looking only within the 1.26 line; 1.27 was current the whole time. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 872e276f89
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| ## 1. Install and Start | ||
|
|
||
| packetcode requires Go 1.24.2 or newer when building from source. | ||
| packetcode requires Go 1.26.0 or newer when building from source. |
There was a problem hiding this comment.
Update the offline manual's Go prerequisite
Updating only the Markdown manuals leaves the user-facing offline manual inconsistent: README.md links docs/packetcode-manual.html as the offline HTML5 manual, but its install section at line 420 still says Go 1.24.2 is supported. Users following that copy with GOTOOLCHAIN=local or without toolchain-download access will fail immediately because go.mod now requires 1.26.0, so the HTML manual should be updated alongside this line.
Useful? React with 👍 / 👎.
This reverts commit 872e276. golangci-lint v2.9.0, the version CI pins, is itself built with Go 1.26 and cannot typecheck a 1.27 standard library. The lint job panicked outright: panic: file requires newer Go version go1.27 (application built with go1.26) So the CI toolchain cannot move ahead of the linter's own build, which the "pin the newer supported major" reasoning missed. 1.26.8 stays, and it loses nothing: every reachable stdlib advisory is fixed by go1.26.6, so vulncheck is green on 1.26.8 as well. Moving to 1.27 needs a golangci-lint release built against it, and is a separate change. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Closes the last red CI job.
vulncheckreported seven reachable advisories, all ingolang.org/x/cryptov0.43.0 and all reached throughinternal/computers/ssh_backend.go.Why 1.26 and not 1.25
The advisories split across two fix versions:
godirectivego 1.25.0go 1.26.0The v0.52.0 route looks like the cautious middle ground and is not:
golang.org/x/crypto/ssh". Both are called, sovulncheckkeeps failing and two live DoS paths stay open through the SSH backend.Raising the floor is the cost either way, so it should buy the whole fix rather than five sevenths of it.
What the floor actually costs
Less than it looks:
go.modhas notoolchainline, so under the defaultGOTOOLCHAIN=autoa contributor on an older Go fetches a compliant toolchain automatically instead of hitting a build error.GOTOOLCHAIN=local— chiefly distro packaging and air-gapped builds.x/sys(v0.38.0 → v0.47.0) andx/text(v0.30.0 → v0.41.0) come along as transitive upgrades. The bump was done withgo getrather than by applyingdocs/audit/patches/P10b-x-crypto-v0.56.0-go1.26.patch, because that patch was generated against an oldergo.modand would have carried a stalego.sum. The result matches its intent.Second commit: CI pin to 1.27.1
Separate and independently revertable. The remaining govulncheck findings are all standard library and the highest is fixed in
go1.26.6, so the existing 1.26.8 pin already covered them — but 1.27.1 is the current release, and pinning the newer of the two supported majors needs the least maintenance. Disclosure: I chose 1.26.8 earlier while looking only within the 1.26 line; 1.27 was current the whole time.Verification
Run on windows/amd64 against the branch tip:
govulncheck ./...(v1.3.0, the version CI pins)golangci-lint run --max-issues-per-linter=0 --max-same-issues=0 ./...underGOOS=linux,darwin,windowsgo build ./...for all three GOOSgo vet ./...go test -count=1 ./...The ten advisories govulncheck still reports locally are all standard library, and they appear only because this machine's toolchain is
go1.26.2:The highest is
go1.26.6, and CI now pins 1.27.1, so the job should be clean. That split is itself a useful confirmation: the stdlib set is governed by the toolchain pin, the module set by this dependency bump, and after this change the module set is empty.Two stale premises, deliberately not rewritten
Both are dated decision records rather than live instructions, so I left them alone rather than editing history — but each rests partly on a fact this PR changes:
BACKLOG.md:89— the 2026-08-14 decision to rejectcharm.land/catwalkcites "declaresgo 1.26.6against this repo's 1.24.2" as one of five reasons. That objection is now gone. The other four (prometheus and protobuf pulled in for 70 lines of stdlib HTTP, nomistralentry, MiniMax-M3 priced at the wrong tier, no tiered-pricing field) still stand, so the decision holds.docs/research/upstream-adoption-plan.md:439— argues against an import because "importing it forces a Go bump on every contributor and CI runner". That cost is now already paid.docs/audit/security-audit-2026-09-05.mdalso states the old floor. It is a dated audit record and is left as written.🤖 Generated with Claude Code