fix(ci): resync actions.lock and add a lock-sync recurrence gate - #94
Merged
Merged
Conversation
GitHub refuses a run at startup, creating zero jobs, when a workflow carries a `uses:` ref that the lockfile does not record under that workflow's own path. It matches by LITERAL STRING; `gh actions-lock` matches by resolved commit, so a lock entry naming a tag that dereferences to the pinned SHA passes the tool and still kills the run. Regenerate the lock, make it transitively closed, and add a lock-sync gate carrying no `uses:` of its own so it cannot be disabled by the desync it detects. No workflow YAML is modified. Refs: hyperpolymath/standards#968 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01X3hgXxWm6umMgZkjYyHnnm
|
Warning Review limit reachedNext included review available in 8 minutes. View limit detailsLimit details: You’ve used the included review currently available. You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Review configuration: ⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Advanced Run ID: ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (2)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
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.
What this fixes
.github/workflows/actions.lockhad drifted from the workflow YAML. That drift isnot cosmetic: GitHub refuses such a run at startup, creating zero jobs, and
reports only "This run likely failed because of a workflow file issue." Most of a
repository's CI can be silently dead for days without a single red tick, because a
run that never starts posts no check.
Measured across the estate on 2026-09-22: 13 of 37 repositories swept were in
this state.
Why it happened here
GitHub's startup check compares the lockfile ref to the workflow's
uses:ref as aliteral string.
gh actions-lockcompares them by resolved commit. The twodisagree whenever a lock entry names a tag that dereferences to exactly the commit
the YAML pins — the tool prints
All N workflows validand GitHub still kills therun.
Proof, on
hyperpolymath/awesome-nickel/codeql.yml:uses:ad035f4e(09-21)codeql-action/init@v4.38.0codeql-action@v4.38.09d83550d(09-22)codeql-action/init@b96794f0…codeql-action@v4.38.0startup_failure, jobs=0v4.38.0dereferences tob96794f0…— the same commit the YAML pins — and the runstill died. A cross-workflow control at the same heads (
boj-build.yml, lock-matched)was green, so the lock is not globally broken; the failure is scoped to the one
workflow whose entry mismatches.
What changed
.github/workflows/actions.lockregenerated and made transitively closed. A refnamed under
workflows:or inside another record's nesteduses:with no top-leveldependencies:record is a dangling edge and kills the run at startup.below.
gh actions-lockwas run with--no-migrate-local-actions, which prevents itrewriting
uses: ./…intouses: $/…— an invalid form that itself causes startupdeath.
The recurrence gate (the actual defect)
Regenerating alone is a one-week fix: Dependabot rewrites
uses:refs in the YAML on aschedule and cannot touch the lockfile, so the repo re-breaks on the next grouped
bump. This PR therefore also adds:
.github/workflows/lock-sync-gate.yml— fails any PR whose lockfile has drifted.scripts/check-lock-sync.sh— the check itself.The gate deliberately carries no
uses:of its own — it checks out by callinggitin a
run:step instead ofactions/checkout, so it has no lockfile entry to go staleand is structurally immune to the very failure it detects. It also has no
paths:filter, on purpose: a filtered workflow never reports on PRs that miss the filter, which
would deadlock any branch ruleset requiring this check.
The gate hard-fails on desync. It is not
continue-on-errorand not a::warning::,which cannot fail a job.
Note on
gh actions-lock --verify-localThe gate does not call
gh actions-lock --verify-local, which was the originallyproposed mechanism. That tool is measured wrong in both directions: it reports STALE on
job-level reusable-workflow refs it cannot parse (upstream #129 — 5 repos in this sweep
are false reds from exactly that), and it reports valid on the tag-vs-SHA literal
mismatch above.
check-lock-sync.shtests literal-string equality, which is what GitHubactually enforces.
Expected on this PR
Workflows that have not executed since the desync began will run here for the first
time, and some may go red for reasons unrelated to this change. Per the estate stopping
rule each becomes its own issue with acceptance criteria, not a blocker on this PR.
Tracking: hyperpolymath/standards#968
🤖 Generated with Claude Code
https://claude.ai/code/session_01X3hgXxWm6umMgZkjYyHnnm