Uh oh!
There was an error while loading. Please reload this page.
Lint the release the same way we lint everything else - #625
Conversation
release.yml pinned golangci-lint at v2.9.0 while test.yml and security.yml had moved to v2.11.1. Nothing noticed, because the release gate is the one job no pull request runs. It surfaced as v0.9.0-rc.1 failing, on this: internal/commands/assignments.go:142:85: G115: integer overflow conversion int -> int32 (gosec) That conversion is guarded two lines above it — `position < 1 || position > math.MaxInt32` returns before the cast. gosec at v2.11.1 follows the bound and stays quiet; at v2.9.0 it does not. So the finding was a false positive that every PR check had already passed, and the only thing it blocked was a release tag. The pin is now in lockstep, and scripts/check-lint-lockstep.sh enforces that rather than trusting the "keep in lockstep" comments that were already there and had already failed. It reads the version off every golangci-lint-action step and fails when they disagree, naming the files: FAIL: golangci-lint pins disagree across workflows: .github/workflows/release.yml:v2.9.0 .github/workflows/security.yml:v2.11.1 .github/workflows/test.yml:v2.11.1 Wired into `make check`, the release gate, and test.yml ahead of the linter itself, so drift is reported as drift instead of as a version-specific finding in whichever job happens to be the odd one out. No change to assignments.go: the code was already correct.
Sensitive Change Detection (shadow mode)This PR modifies control-plane files:
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit:39d2233379
ℹ️ 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".
Uh oh!
There was an error while loading. Please reload this page.
The first version of this check parsed pins and compared them, so a step that declared no version was skipped rather than caught: delete release.yml's version line and the check reported success across the remaining two workflows. That is the same hole in a different shape. An unpinned step resolves to whatever golangci-lint-action defaults to, which moves on its own schedule and puts the release gate back on a version nothing else runs. Now every golangci-lint-action step must carry a version. Verified in all four states: agreeing pins pass, a drifted pin fails naming the files, a deleted version line fails as UNPINNED, and restoring it passes again.
jeremy
commented
Aug 5, 2026
Good catch — fixed in 66e9980, and you were right about the mechanism. The first version parsed pins and compared them, so a step with no Now every Verified in all four states — agreeing pins pass, a drifted pin fails naming the files, a deleted version line fails as UNPINNED, and restoring it passes again. |
Uh oh!
There was an error while loading. Please reload this page.
…or-roundtrip * origin/main: (96 commits) ci: bump the github-actions group with 6 updates (#639) Reject three more doomed invocations before draining stdin (#645) Stdin `-` support everywhere sensible; usage error for stray `-` elsewhere (#641) Add hey-cli Windows signing secrets to the release env manifest (#642) deps: bump the go-dependencies group with 5 updates (#638) Update nix flake and plugin version for v0.9.1 ci: bump the github-actions group with 4 updates (#633) Add basecamp files replace: publish a new version of an uploaded file (#634) Add basecamp files versions — HELD, blocked on the SDK (#622) Update nix flake and plugin version for v0.9.0 Make the Codex probe's timeout actually bound doctor (#629) Make the lockstep check catch stale agreement and .yaml workflows (#628) Keep refreshing opencode's other spelling (#627) Lint the release the same way we lint everything else (#625) Install the skill where opencode actually looks (#624) Take the communiques out of the source tree (#623) Correct the API coverage claim: 183/184, not 100% (#621) Stop echoing back step fields the caller never changed (#620) Drive the circuit breaker's clock from tests, not sleep() (#619) Tell agents the truth about card column moves (#618) ...
v0.9.0-rc.1failed. Nothing was wrong with the code.What happened
release.ymlpinned golangci-lint at v2.9.0.test.ymlandsecurity.ymlare on v2.11.1 — with a# keep in lockstep with test.yml Lintcomment on the latter.release.ymldrifted and nothing noticed, because the release gate is the one job no pull request ever runs.It surfaced as:
That conversion is guarded, two lines above it:
gosec at v2.11.1 follows that bound and stays quiet. At v2.9.0 it does not. So a false positive that every PR check had already passed took down a release tag, and
assignments.goneeds no change — it was already correct.The fix
Pin matched, plus
scripts/check-lint-lockstep.shto enforce it. The lockstep comments already existed and already failed; comments don't enforce.It reads the version off every
golangci-lint-actionstep and fails naming the files:Verified both directions: passes on this branch (3 workflows at v2.11.1), and fails as above when
release.ymlis reverted to v2.9.0.Wired into three places:
make check— localbin/citest.yml, before the linter step — so PRs catch it, which is the whole pointNext
Once this lands,
v0.9.0-rc.1gets re-cut asv0.9.0-rc.2. rc.1 published no release and no artifacts — every job after the gate was skipped — so nothing needs unpublishing. I'd rather leave the dead tag than retag it.bin/cigreen (EXIT=0).Summary by cubic
Align
golangci-lintversions across CI and enforce lockstep to prevent release failures from version drift.release.ymlnow pinsv2.11.1, and the check fails if any workflow drifts or has an unpinned step.golangci-linttov2.11.1in.github/workflows/release.yml(matchingtest.yml/security.yml).scripts/check-lint-lockstep.shto ensure allgolangci/golangci-lint-actionsteps are pinned and use the same version; report mismatches and missing pins.make check, the release quality gate, and intest.ymlbefore linting.Written for commit 66e9980. Summary will update on new commits.