Skip to content

ci: unpin the toolchain drift that is failing lint and test-lib - #115

Merged
Koeng101 merged 1 commit into
mainfrom
fix/ci-toolchains
Sep 25, 2026
Merged

Koeng101 merged 1 commit into
mainfrom
fix/ci-toolchains

Conversation

@Koeng101

Copy link
Copy Markdown
Owner

Two checks fail on every PR right now, neither of them from the code under test. Both are toolchain drift.

test-lib (macos-latest) — macOS 26 rejects the binaries

macos-latest is now macOS 26.6.2 (macos-26-arm64). Its dyld refuses a Mach-O with no LC_UUID load command, so every test binary aborts at launch:

dyld[2110]: missing LC_UUID load command in .../b112/bio.test
signal: abort trap
FAIL github.com/koeng101/dnadesign/lib/bio  0.003s

Not two packages — all of lib.

The toolchain is the cause, and it is not the one the matrix names. setup-go installs 1.21.13, then go.work's go 1.22.5 triggers the auto-switch (go: downloading go1.22.5 (darwin/arm64)), and that linker emits no LC_UUID. Measured on macOS arm64 with otool -l | grep -c LC_UUID:

toolchain LC_UUID
go1.22.5 0
go1.22.7 0
go1.23.12 0
go1.24.0 1

So bumping 1.21 → 1.22 would not have fixed it. The matrix moves to 1.24.x, the first that works. This is the toolchain, not the language version: lib/go.mod still declares go 1.22.0, and that is still what the code is compiled against.

lint — the linter is older than the Go it reads

file requires newer Go version go1.26 (application built with go1.24) (typecheck)

The job had no setup-go, so golangci-lint type-checked against the runner's preinstalled Go, which has moved to 1.26, while golangci-lint-action@v2.5.2 with version: latest resolves to golangci-lint 1.64.8, built with go1.24. A linter cannot read a standard library newer than the one it was built against.

Pinned both — go-version: 1.24.x and version: v1.64.8 — so they cannot drift apart again, and modernised the two actions.

The consequence: lint runs for the first time in a while

It reports 16 issues, every one of them in bio/slow5/svb — vendored stream-vbyte SIMD and cpuid code that carries its own README and Apache-2.0 LICENSE. They are naming, gofmt and unused-symbol style. Reformatting a third-party copy only diverges it from upstream, so a new lib/.golangci.yml excludes that directory. First-party lib is clean.

Verified locally (macOS 15.6.1, arm64)

  • go test ./lib/... passes under GOTOOLCHAIN=go1.24.0.
  • golangci-lint v1.64.8 exits 0 with this config.
  • The LC_UUID table above is from otool on binaries built by each toolchain.

Separate from #114, which is a library fix; this is only CI. Landing this first would give #114 a clean board.

Two failures on every PR, neither from the code.

test-lib (macos-latest): the runner image is now macOS 26, whose dyld
refuses a binary with no LC_UUID load command, so every test binary
aborts at launch -- "missing LC_UUID load command", 0.003s, across all of
lib. setup-go installed 1.21.13, but go.work asks for 1.22.5 and the
toolchain auto-switch downloaded it, and go1.22.5's darwin linker does
not emit LC_UUID. Checked which does, on macOS arm64:

    go1.22.5  LC_UUID 0        go1.23.12  LC_UUID 0
    go1.22.7  LC_UUID 0        go1.24.0   LC_UUID 1

So the matrix moves to 1.24.x, the first that works. This is the
toolchain only -- lib/go.mod still declares go 1.22.0, which is still
the language version the code is compiled against.

lint: the job had no setup-go, so golangci-lint type-checked against the
runner's preinstalled Go, which has moved to 1.26, while the action's
"latest" resolves to golangci-lint 1.64.8 built with go1.24 -- "file
requires newer Go version go1.26 (application built with go1.24)".
Pin both, so they cannot drift apart again.

That makes lint run for the first time in a while, and it reports 16
issues, all of them in bio/slow5/svb -- vendored stream-vbyte SIMD and
cpuid code with its own README and Apache-2.0 LICENSE. Excluded in a new
lib/.golangci.yml rather than reformatting a third-party copy away from
upstream. lib itself is clean.

Verified locally on macOS: the full lib suite passes under go1.24.0, and
golangci-lint v1.64.8 exits 0 with this config.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@Koeng101
Koeng101 merged commit ee20142 into main Sep 25, 2026
8 of 9 checks passed
@Koeng101
Koeng101 deleted the fix/ci-toolchains branch September 25, 2026 21:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant