Downgrade Go 1.26.5 -> 1.25.12 to fix Windows exit-status flake - #4208
Review submitted — approved
Review summary: buildkite/agent PR #4208
Change reviewed
PR #4208 is a focused rollback of the repository's Go toolchain from 1.26.5 to 1.25.12. Its purpose is to avoid an intermittent Windows AMD64 Cmd.Wait failure (GetExitCodeProcess: The handle is invalid) first observed after the Go 1.26.5 upgrade.
The PR updates all four repository-owned toolchain declarations together:
go.modchanges the module's Go version to 1.25.12.mise.tomlselects Go 1.25.12 for local development and tasks..buildkite/Dockerfile-compileand.buildkite/Dockerfile-e2euse the Go 1.25.12 image and pin the same OCI image-index digest.
No Linear issue identifier was present in the branch name, PR title, or PR description, so there was no Linear issue or separate acceptance criteria to inspect.
Evidence examined
I read the complete diff and all four changed files, then searched the checkout for toolchain declarations and stale references to Go 1.26.5. The changed files are the only version declarations, and all now agree on 1.25.12. I also traced the two Dockerfiles to .buildkite/docker-compose.yml, where they provide the compile and end-to-end images.
I compared the change with the history of PR #4134 / commit 81f5cf03, which introduced Go 1.26.5. That upgrade changed the same Go, mise, and Docker-image locations; the repository had already used Go 1.25.12 Docker images before that upgrade. The new digest differs from the older pin because the upstream tag's image index has since changed.
I queried ECR Public directly for public.ecr.aws/docker/library/golang:1.25.12. The returned OCI image-index bytes hash to sha256:fe5d57d3b718e7a4986bae156c2d73f44973bfd313073aed08a4de6692bb6161, exactly matching both Dockerfiles, and the index contains the expected Linux architectures.
I also inspected golang/go#78046. It is relevant background about Cmd.Wait/watchCtx, although it closed with a documentation-only change and does not by itself establish this exact Windows handle failure. The rollback still has a concrete regression boundary and is small and reversible.
Checks run
The environment did not initially contain Go, so I downloaded the official Go 1.25.12 Linux AMD64 archive and verified its SHA-256 checksum against the Go release metadata. With GOTOOLCHAIN=local, I then ran:
go build -p=1 ./...— passed.GOOS=windows GOARCH=amd64 go build -p=1 ./...— passed.go vet -p=1 ./...— passed.go test ./internal/process/ ./internal/shell/— passed.go mod tidy -diff— passed with no diff.git diff --check— passed.
Initial attempts to run the two builds and vet concurrently were killed by the review container's memory limit while compiling large dependencies. Re-running those checks sequentially with package parallelism limited to one succeeded, so this was an environment resource issue rather than a source failure.
I did not run the full go test ./... suite or build the Docker images because Docker is not installed in the review environment. The registry manifest itself was independently verified as described above.
At review submission time, the GitHub check rollup showed both Socket checks passing and the main Buildkite agent build (#13865) still pending. The required-category-label check was failing because the PR had no category label; that is PR metadata rather than a defect in these changes. The provided buildsworth review build was also still in progress while this review was being produced.
Findings and verdict
I found no actionable code issues. The rollback is synchronized across local development, module metadata, and both CI container images; the pinned image digest is valid; and the project builds, cross-builds for Windows AMD64, vets, and passes the process/shell tests under Go 1.25.12 without automatic toolchain switching.
I submitted an APPROVE review with no inline comments: #4208 (review)
Trigger source: automatic.