Repository navigation
build: the toolchain floor moves to Go 1.27.1, and so does what it reports (ADR 0086) - #129
Merged
Merged
Conversation
…ports (ADR 0086) Dependabot's first Docker pull request proposed a minor Go release and the guard held: go.mod and the build image disagreed, so CI's vulnerability gate would have inspected a standard library the image does not contain (ADR 0038 §3). Moving both halves is two lines. What makes it a slice is that this agent reports GODEBUG defaults out of other people's binaries, and a minor release is when that vocabulary changes. Measured against go1.27.1: - `fips140ems` is new, has no version-dependent default, and turns off the enforcement of extended master secret in FIPS 140-3 mode. It reaches a binary only because someone wrote the line, which is the class ADR 0081 §1 called the stronger signal. It joins the allow-list. - Go 1.27 removed `tls10server`, `tls3des`, `tlsrsakex` and `tlsunsafeekm`. They stay: the binaries this reads were built by every toolchain, and an image built last year still carries them. - `tracebacklabels` and `x509sslcertoverrideplatform` arrived and stay off the list; the ADR says why. Two tools move with the floor. golangci-lint v2.11.4 is built with Go 1.26 and refuses a module targeting 1.27 before reading its config, so the pin becomes v2.13.2 — which then reports that `ecdsa.PublicKey`'s X and Y have been deprecated since Go 1.26. internal/nodeauth now assembles the uncompressed point and parses it, which also rejects a point that is not on the curve, so a JWKS entry that cannot be a key is refused where it is read. go test -race ./... && golangci-lint run # 0 issues, v2.13.2 on GOOS=linux make vulncheck # 0 reachable, 3 uncalled (ADR 0038 §2) make image-scan # binary is go1.27.1, 0 findings TestGoInventoryEndToEnd # PASS 727s in kind, real tokens Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KeZECJXTDHL6Nts95eKMJA
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Replaces #128. Dependabot proposed the same bump; this takes it deliberately, with the review a minor Go release needs.
Why the bot's PR could not merge
The guard from #127 caught it:
go.modsaid 1.26.7, the build image said 1.27.1. CI'ssetup-goreadsgo-version-file: go.mod, somake vulncheckwould have been inspecting a standard library the released image does not contain — exactly what ADR 0038 §3 called one fact in two files.What a minor release changes for this agent
This agent reports GODEBUG defaults out of other people's binaries (ADR 0050, ADR 0081), and a minor release is when that vocabulary moves. Measured on go1.27.1 against go1.26.7, it moved in both directions.
One name joins the allow-list.
fips140ems— new in 1.27, backported to 1.26.6 — has no version-dependent default, so it reaches a binary only because someone wrote a//go:debugline. What that line turns off is in the toolchain's owndoc/godebug.md: the enforcement of extended master secret in FIPS 140-3 mode. It passes both of ADR 0081's tests, including §1's point that a directive is a decision while a lagging default is only a lag. Measured, not assumed:Four names stay although Go removed them.
tls10server,tls3des,tlsrsakex,tlsunsafeekmare in 1.27's newRemovedlist — using an old value is now a build error. They stay on ours: the list describes binaries in a customer's cluster, which were built by every toolchain rather than by ours. An image built last year with Go 1.25 still carriestls10server=1, and that is still the fact worth reporting. A test pins this so a later tidy-up does not blind the agent to old builds.Two arrivals stay off.
tracebacklabelsgoverns what a traceback prints.x509sslcertoverrideplatformapplies only to Windows and Darwin, and its old value is the stricter one — its presence in a Linux container's build would mean nothing we could report honestly.Two tools moved with the floor
golangci-lintv2.11.4 is built with Go 1.26 and refuses a module targeting 1.27 before reading its configuration — a hard stop, not a finding. The pin moves to v2.13.2, whose published binary is built with go1.27.0 (verified bygo version -mon the release asset).That version then reported something worth the slice on its own:
ecdsa.PublicKey'sXandYhave been deprecated since Go 1.26, andinternal/nodeauthbuilt every JWKS key by assigning them. It now assembles the uncompressed point and callsecdsa.ParseUncompressedPublicKey, which rejects a point that is not on the curve. The comment that stood there — that an off-curve point cannot verify a signature anyway — was true and is no longer the argument: a JWKS entry that cannot be a key is refused where it is read.Its other finding is a false one and only off Linux: where
startCaptureis a stub that always fails,err != nilis always true. CI lints the Linux build, where it is not.Evidence
One thing found and not fixed here
make identity-e2efails onmaintoday, before this change. A control run of the same test against an image built fromb495a1afails identically, so it is not the toolchain. The cause is a race in the test rather than in the agent:waitDeploymentPodreturns onRunning, and the probe then reaches the controller through its Service, which has no endpoint until the pod is Ready — readiness means the informer caches synced (ADR 0069). Connections inside that window are refused. Worth its own PR, in the same family as #121.🤖 Generated with Claude Code
https://claude.ai/code/session_01KeZECJXTDHL6Nts95eKMJA