ci: stop cancelling in-progress runs on main (3 commits shipped unverified) - #67
Merged
Conversation
Every push to main shares one concurrency group key (github.ref is always refs/heads/main), so with cancel-in-progress: true, merging several PRs in quick succession cancels each previous merge's run. That happened on 2026-07-31: six PRs merged inside ~30s and three merge commits -- c08afed, b694214, 5cd73eb -- landed on main, and in production, with cancelled as their only CI verdict. The cumulative state was green afterwards so nothing shipped broken, but those commits are individually unverified; a later bisect or revert would land on a commit CI never actually passed. Superseding is correct for a PR, where only the tip matters, and wrong for main, where every merge commit is a deployable artifact. Gate it on the ref rather than dropping the concurrency group, which would also lose the push+pull_request double-run guard that made it worth having.
This was referenced Jul 31, 2026
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.
Came out of auditing why CI "keeps failing". It mostly wasn't — but this is the one real gap the audit found.
The gap
concurrency.groupis keyed ongithub.ref, which isrefs/heads/mainfor every push to main. Withcancel-in-progress: true, each merge cancels the previous merge's still-running check.On 2026-07-31 six PRs merged inside ~30 seconds, and three merge commits ended up on
main— and in production — withcancelledas their only CI verdict:c08afedb6942145cd73ebThe cumulative state was green immediately afterwards (
ee885a8success), so nothing shipped broken — I verified the merged tree locally and in production. But those three commits are individually unverified. A later bisect or revert would land on a commit CI never actually passed, and the run history says "cancelled" where it should say pass or fail.Fix
Superseding is correct for a PR — only the tip commit matters — and wrong for
main, where every merge commit is a deployable artifact.Gating on the ref rather than dropping the concurrency block entirely, because the block also serves its original purpose:
on: [pull_request, push]both fire for a PR branch, and the group stops that double-run. That guard is still wanted.Honest note on cause
I caused the pile-up by merging six PRs back to back. The config permitted it silently, which is the part worth fixing — the next batch merge would do the same thing.
What the rest of the CI audit found (no change needed)
#60(merged 03:37Z; latest failure 03:33Z). All of them were the same inheritedrepo_qualityfixture time bomb that#60fixed. Since then,mainis green.dependabot/npm_and_yarn/frontend/typescript-7.0.2—#20, blocked upstream.#20/#21still fail for the reasons already recorded inPROGRESS_LOG, re-confirmed from the job logs today:typescript-eslint does not support TS 7.0.andError while loading rule 'react/display-name': contextOrFilename.getFilename is not a function. Both come from tooling bundled insideeslint-config-next, whose latest stable is still16.2.12— the version already installed. Not fixable here; merging either would turnmainred.Verification
Workflow YAML parses;
concurrency.cancel-in-progressresolves to the expression string and all four jobs (backend,frontend,config,dependency-review) are intact.