Uh oh!
There was an error while loading. Please reload this page.
Make the lockstep check catch stale agreement and .yaml workflows - #628
Merged
Conversation
Two holes in what shipped, both the same shape as the drift the check was written for. It globbed *.yml only. Every workflow here is .yml today so nothing was skipped, but GitHub honours .yaml just as well, and a .yaml workflow running a linter this check never opened is exactly the invisible drift it exists to catch. Scan both, and fail on an empty scan rather than passing a check that opened no files. It enforced agreement, not currency. Setting all three workflows to v2.9.0 passes cleanly and reproduces the release failure that motivated the check in the first place. So: a floor, next to WORKFLOW_DIR, moved in the same commit as the pins it constrains. Compare with sort -V. As strings v2.9.0 sorts above v2.11.1, because 9 > 1, so a lexical test would wave through the precise version that broke the release tag — and [ -gt ] parses neither. aur-publish.yml's pkgrel guard carries the same note for the same reason.
Uh oh!
There was an error while loading. Please reload this page.
jeremy added a commit
that referenced
this pull request
Aug 22, 2026
…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) ...
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 freeto 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.
Two holes in the check that shipped in #625. Neither is a live failure — all 15 workflows are
.ymland all three linting steps sit atv2.11.1— but both are the same shape as the drift the check exists to catch.It globbed
*.ymlonly. GitHub honours.yamljust as well, and a.yamlworkflow running a linter this check never opened is precisely the invisible drift it was written for. Now scans both, and fails on an empty scan rather than passing a check that opened no files.It enforced agreement, not currency. Verified: setting all three workflows to
v2.9.0passes cleanly and reproduces the release failure that motivated #625 — a gosec G115 false positive that blocked a tag after every PR check had gone green. So there is now a floor,MIN_VERSION, next toWORKFLOW_DIR, commented to say that raising it is deliberate and must happen in the same commit as the pins it constrains.Compared with
sort -V, and that is the point, not a detail. As stringsv2.9.0sorts abovev2.11.1because9>1, so a lexical test would wave through the exact version that broke the release tag;[ -gt ]parses neither.aur-publish.yml's pkgrel guard carries the same note for the same reason.Existing shape is untouched: the
awkstep-window parser, theUNPINNEDfailure mode added after the bot's find on #625, and the error output that names offending files.Verification
Ran the script directly in each state, asserting exit codes and restoring the tree between:
v2.11.1(today's tree)v2.9.0v2.12.0version:UNPINNED.yamlfixture with a matching pin.yamlfixture with a drifted pin.yamlfile.yamlfixture unpinnedUNPINNEDon the.yamlfileThe
.yamlcase is asserted as counted (3 → 4 steps, 15 → 16 workflows), not merely as a run that happened to pass; 5b and 5c confirm it is actually parsed, not just globbed.bin/cigreen (exit 0).Summary by cubic
Updates the golangci-lint lockstep check to catch stale pins and include
.yamlworkflows, preventing invisible drift and release breakage. It now scans both.ymland.yamlfiles and enforces a version floor.*.ymland*.yaml; fail on an empty workflow scan.MIN_VERSIONfloor for the pinned golangci-lint; fail if below.sort -Vto avoid incorrect lexical ordering.UNPINNEDchecks; output now includes step and workflow counts.Written for commit 6dc9163. Summary will update on new commits.