build(deps): bump Go to 1.27.0 and the lint contract to golangci-lint 2.13.1 - #310
Open
kyle-sexton wants to merge 4 commits into
Open
build(deps): bump Go to 1.27.0 and the lint contract to golangci-lint 2.13.1#310kyle-sexton wants to merge 4 commits into
kyle-sexton wants to merge 4 commits into
Conversation
… 2.13.1 Releases the 2026-08-21 Go hold. Its recorded exit condition is met: golangci-lint v2.13.0 shipped go1.27 support (golangci/golangci-lint#6643) on 2026-08-19, v2.13.1 followed on 2026-08-20, and ci-workflows v0.17.2 absorbs 2.13.1 into the shared go-quality reusable this repo calls. Moves the coupled set together: go.mod's go directive, both setup-go pins in release.yml, release/dependencies.json go.version, and the AGENTS.md local lint contract (GOTOOLCHAIN go1.26.6 -> go1.27.0, golangci-lint v2.6.0 -> v2.13.1, with the >= 2.13.0 floor stated). The hold asked for a qualification rather than a mechanical pin, so it was performed: build, vet, and the full test suite (15/15 packages) pass under go1.27.0; the CGO_ENABLED=0 GOOS=windows cross-compile of ./cmd/... succeeds; go mod verify and govulncheck v1.7.0 are clean; and golangci-lint v2.13.1 built with GOTOOLCHAIN=go1.27.0 reports 0 issues, matching the v2.12.2/go1.26.6 baseline. The feared errcheck 1.10->1.20 and exhaustruct-deprecation delta surfaces no findings here. Go 1.27 switches encoding/json to the v2 implementation, which rejects invalid UTF-8 and duplicate object names; that is the one behavior change with real exposure in this module, and the existing suite (including the internal/control transport fuzz corpus) passes unchanged. Stacked on the ci-workflows v0.17.2 bump, which is what makes CI's lint lane able to lint a go1.27 module at all. Review-only per the docs/releases.md freshness policy; carries the do-not-merge label. Promotion additionally needs a new reviewed compatibility pair and a rolling-host rollout. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The go-quality lane's `go mod tidy` check failed on the previous commit: go1.27's tidy lays the require blocks out differently from go1.26.6. Pure reorganization, no dependency change. tidy consolidates the two indirect blocks into one and moves the five directly-imported go.opentelemetry.io/otel* modules (otel, metric, sdk, sdk/metric, trace) into the direct-require block, where they belong — they had been sitting in an indirect block without `// indirect` markers. No version moves and go.sum is byte-identical. `go mod tidy` is now idempotent under go1.27.0, and build, vet, tests (15/15), the Windows cross-compile, go mod verify, govulncheck, and golangci-lint v2.13.1 all remain clean. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This was referenced Aug 27, 2026
The reviewed-decision record still said the 14-day hard-fail window "closes on 2026-09-02" after the PR body was corrected to the 2026-09-03 scheduled run, so the committed evidence and the body disagreed on the one number the correction was about. Restates it with the arithmetic visible: go1.26.7 (2026-08-19T14:43:46Z) and go1.27.0 (2026-08-19T16:45:14Z) published the same day, the freshness check dates the row from the earliest unadopted tag, so ageDays first reaches 14 on the 2026-09-03 run. Raised in re-verification of #310. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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.
No linked issue
Summary
Review-only drain of the
gorow of #283: Go 1.26.6 → 1.27.0, releasing the hold recorded on 2026-08-21 inrelease/dependency-drift-review.json.Stacked on #309 (
build/ci-workflows-v0.17.2) and based on that branch, notmain. That is not a convenience — #309 is what raises the sharedgo-qualityreusable'sGOLANGCI_LINT_VERSIONto 2.13.1, and a golangci-lint older than 2.13.0 refuses to lint a go1.27 module outright. Without #309 this PR's lint lane cannot pass.Merge order for the whole cycle: #309 → this PR → #311. #309 is a hard prerequisite. #311 must come after this one because this PR replaces
release/dependency-drift-review.jsonwholesale; if #311 merged first, that replacement would silently delete #311's merged PowerShell decision and regress it topending(see #311's "Merge order" section).Two mechanical notes for whoever merges: #309 squash-merges to a new SHA, so this branch will need "Update branch" afterwards —
6251263will not be an ancestor ofmain. GitHub also retargets this PR's base tomainat that point; the body is deliberately free of closing keywords so the retarget cannot create a closing link to #283.This PR carries the
do-not-mergelabel and must not be merged autonomously.docs/releases.md("Freshness policy"): never auto-merge controller, runner, image, toolchain, Scale Set Client, Action, or release changes.Problem
The 2026-08-21 hold recorded a specific exit condition, and that condition is now met:
golangci-lint v2.13.0 shipped 2026-08-19 and v2.13.1 on 2026-08-20. ci-workflows v0.17.2 absorbs 2.13.1 into
go-quality.yml. The blocker is gone; what remains is the qualification the hold asked for, which this PR performs rather than assumes (see Verification).The freshness clock is closing, and 1.26.7 does not stop it
Worth flagging, because the drift table hides it.
scripts/Test-DependencyFreshness.ps1reports the Go row's "latest" as the newest stable release overall, so the table shows only1.27.0. Butgo1.26.7also exists — a patch on the currently pinned line — and the row's age is computed from the earliest unadopted tag, which isgo1.26.7.Both
go1.26.7(2026-08-19T14:43Z) andgo1.27.0(2026-08-19T16:45Z) published the same day. So:Enforce 14-day or critical drift gateindependency-drift.yml) trips on the 2026-09-03 scheduled run. Drift date is 2026-08-19T14:43:46Z, so the 14-day mark falls at 2026-09-02T14:43Z; the job's cron is17 4 * * *, so the 2026-09-02 morning run still seesageDays13 and 2026-09-03 is the first run to see 14.1.26.7instead would buy essentially nothing — the drift date would move by two hours, and1.27.0would still be unadopted.There is no cheap partial move here. Either 1.27.0 is adopted or the row hard-fails CI in roughly a week.
Fix
Moves the coupled set together:
go.mod:go 1.26.6→go 1.27.0, plus the require-block layoutgo mod tidyproduces under go1.27 (second commit). go1.27's tidy consolidates the two indirect blocks into one and moves the five directly-importedgo.opentelemetry.io/otel*modules (otel,metric,sdk,sdk/metric,trace) into the direct-require block, where they belong — they had been sitting inside an indirect block without// indirectmarkers. No version moves andgo.sumis byte-identical. CI's tidy check caught this on the first push;go mod tidyis now a no-op under go1.27.0..github/workflows/release.yml: bothsetup-gogo-versionpins (lines 47, 174) →1.27.0.release/dependencies.json:go.version→1.27.0. (scripts/Test-ReleasePins.ps1enforces that this equals thego.moddirective.) TheresolvedAtbump to2026-08-27T08:00:00Zarrives via build(deps): bump ci-workflows to v0.17.2 #309's branch, which this one merges in.AGENTS.md: the local lint contract —GOTOOLCHAIN=go1.26.6→go1.27.0,golangci-lint@v2.6.0→@v2.13.1, plus an explicit "v2.13.1 or newer" floor with the upstream issue reference, and a note that the version tracksGOLANGCI_LINT_VERSIONin the sharedgo-qualityreusable so local lint matches CI.release/dependency-drift-review.json: rewritten to the 2026-08-27 cycle.heldis now empty;goandci-workflowsmove tobumpedwith full rationale; the PowerShell row is listed underpendingbecause it ships as its own PR. A third commit restates the hard-fail date in that record so the committed evidence and this body agree on 2026-09-03.No Go source changes.
Go 1.27 breaking-change review against this codebase
encoding/jsonnow backed by the v2 implementation; "rejects invalid UTF-8 in JSON strings and rejects duplicate names within a JSON object"; error message text may differencoding/json(compatibility manifests, Docker API responses, runner job JSON, health-watch storage)internal/controltransport fuzz corpus. No test asserts on json error-message text.Response.Bodynow auto-drains unread content onCloseasynctimerchanGODEBUG removed;timechannels always unbufferedgrepfinds noGODEBUGusage anywhere in the repo. This has been the default since Go 1.23.crypto/tlsGODEBUGs removed (tlsunsafeekm,tlsrsakex,tls3des,tls10server,x509keypairleaf);gotypesaliasremovedGODEBUGusage in the repo or its workflows.net.UnixConnreturnsio.EOFdirectly rather than wrapped innet.OpErrorwindows/amd64andlinux/amd64.gocommand dropsbzrsupportVerification
Every gate below was run locally on this branch with
GOTOOLCHAIN=autoresolvinggo1.27.0from the newgo.moddirective.go build ./...go vet ./...go test ./...go-windows-buildlane)CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -trimpath ./cmd/...go mod verifyall modules verifiedgovulncheck@v1.7.0 ./...No vulnerabilities found.GOTOOLCHAIN=go1.27.0 GOFLAGS=-mod=mod go install .../golangci-lint@v2.13.1, thengolangci-lint run ./..../scripts/Test-ReleasePins.ps1Release and workflow pins are internally consistent.node --test .github/scripts/workflow-pin-metadata.test.cjsJSON.parseon bothrelease/*.jsonLinter-delta baseline. The hold's specific worry was the errcheck 1.10→1.20 / exhaustruct-deprecation delta. Measured directly on this tree: golangci-lint v2.12.2 (the pre-#309 CI version) reports 0 issues, and v2.13.1 also reports 0 issues — both against go1.26.6 and, for v2.13.1, against go1.27.0. The delta surfaces no new findings on this codebase.
Not run locally:
go test -race.-racerequires cgo, and this workstation isCGO_ENABLED=0Windows without a C toolchain (go: -race requires cgo). The race lane runs on Linux in the reusablego-qualityworkflow and must be green in CI before this merges.Related
build(deps): bump ci-workflows to v0.17.2 #309 — prerequisite, this PR is based on its branch. Merge order: build(deps): bump ci-workflows to v0.17.2 #309, then this.
[dependency-drift] Runner fleet pins require review #283 — standing drift evidence issue. Deliberately not closed, and this body carries no closing keyword.
dependency-drift.ymlreconciles that issue itself: it closes it whenhasDriftis false, and otherwise refreshes whichever matching issue is currentlystate: 'open'. It never reopens a closed one — closing it manually while rows remain outstanding makes the next daily run create a duplicate, which is what the 2026-08-21 maintainer note warns about.Note for whoever merges: this PR is stacked, so GitHub will retarget it to
mainonce build(deps): bump ci-workflows to v0.17.2 #309 merges. Its body is deliberately free of closing keywords so that retarget cannot create a closing link to [dependency-drift] Runner fleet pins require review #283.docs/releases.md— freshness policy: 7-day validation target, 14-day hard fail, never-auto-merge.Go 1.27 release notes · golangci-lint v2.13.0 · v2.13.1 · golangci-lint#6643
build(deps): bump setup-buildx-action to 4.3.0 and ci-workflows to v0.17.0 #291 — the 2026-08-21 partial drain that recorded the Go hold this PR releases.
Fleet rollout
Required.
release/dependencies.jsongo.versionis a compatibility-pair input that flows intocompatibility.json. Merging this PR does not promote anything: perdocs/releases.md, publication and promotion of a new compatibility pair go through the release workflow and the provisioning rolling-upgrade runbook, which is a separate operator procedure. This lane did not touch any runner host.This PR was prepared by an automated agent lane. It is review-only: the agent did not merge it and will not, and deliberately left issue 283 open.