Skip to content

lock-sync gate: list it in actions.lock (cures 7 startup failures) + clause 4 coverage check - #287

Merged
hyperpolymath merged 4 commits into
mainfrom
fix/gate-workflow-dispatch
Sep 22, 2026
Merged

hyperpolymath merged 4 commits into
mainfrom
fix/gate-workflow-dispatch

Conversation

@hyperpolymath

@hyperpolymath hyperpolymath commented Sep 22, 2026

Copy link
Copy Markdown
Owner

What this fixes

lock-sync-gate.yml in this repository failed 7 consecutive times with
startup_failure and jobs=0, while every sibling workflow started normally on
the same pushes. The cause is now identified and cured.

Cause

A workflow file with no key in .github/workflows/actions.lock is refused by
GitHub at startup even when it contains zero uses: refs and therefore has
nothing to pin. This repository's lock listed 24 of its 25 workflow files;
the one omission was the gate itself.

The fix is one line, in the spelling gh actions-lock already uses for other
zero-uses: workflows in this same lockfile (labels.yml):

    '.github/workflows/lock-sync-gate.yml': []

Evidence — single-variable flip, reproduced independently

repo before after the one-line key
hyperpolymath/verisimdb (here) 7 consecutive startup_failure success, twice since
hyperpolymath/blocky-writer 2 of 2 startup_failure success

A control commit that touched the tree but not the lock still failed, and an
empty commit after the cure passed — so this is a property of the lock's
contents, not a re-indexing side effect of any lock change.

⚠️ Correction to the earlier framing of this PR. It was opened on the theory
that the cluster of failures was a platform incident inside a
13:49:37Z–14:20:14Z window, with workflow_dispatch: added as an observability
handle to test that. That theory was wrong for this repo. The window does
explain the other 13 repositories — each had succeeded at least once and only
failed inside it — but this repository had never succeeded once (0/6, plus a
minimal probe workflow dying the same way seven weeks earlier). The per-repo
success/failure tally is what separated the two diseases.

The gate could not defend its own fix

  • clauses 1–3 ask: is every uses: locked under its own workflow path?
  • GitHub asks: is every workflow file represented in the lock?

A workflow with no uses: satisfies clauses 1–3 vacuously and is still
refused — which is precisely how this gate died 7 times while its own checker
reported the lock in sync. Thirteen other repositories passed the gate with the
same gap present
, so a green gate was not evidence of a complete lock.

Clause 4 (COVERAGE), added here, diffs the set of files under
.github/workflows/ against the set of lockfile keys and fails on any file with
no key, naming it and quoting the empty-list form. Remediation step 4 warns that
re-running gh actions-lock may not fix it, because omitting the file is the
tool's own defect.

Mutation-tested, both directions

mutant expected result
delete the lock-sync-gate.yml key gate fails ✅ fails, names the file
delete the unrelated labels.yml key gate fails ✅ fails, names the file
unmutated tree gate passes ✅ passes

Also included

workflow_dispatch: on the gate. A startup-failed run cannot be re-run
(gh run rerun refuses it), which is what made this defect expensive to
diagnose; a dispatch handle makes it reproducible on demand. It is kept as a
permanent affordance, not as the fix.

Residual reds on this PR

governance and hypatia-scan fail for an unrelated, already-filed cause —
phantom blob pins of the standards reusable workflows
(hyperpolymath/standards#987). Security Scan and rust-ci are their own
pre-existing cases. None is a regression from this change; per the stopping rule
they are issues, not blockers.

🤖 Generated with Claude Code

https://claude.ai/code/session_01X3hgXxWm6umMgZkjYyHnnm

The gate is the one workflow in this repo with no manual trigger, so when it
fails at startup there is no way to re-observe it: `gh run rerun` refuses a
startup_failure, and the only other triggers are `pull_request` and `push` to
main. That left verisimdb with six startup_failures and no way to take a clean
seventh measurement.

Adding `workflow_dispatch:` costs nothing (the gate still carries zero real
`uses:` refs, so it cannot desync against actions.lock) and makes the gate
re-observable on demand.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X3hgXxWm6umMgZkjYyHnnm
@coderabbitai

coderabbitai Bot commented Sep 22, 2026

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Advanced

Run ID: ca1c2481-89c3-468d-ac81-b40e8393a62d

📥 Commits

Reviewing files that changed from the base of the PR and between 8eea7ca and 454bf27.

📒 Files selected for processing (1)
  • .github/workflows/lock-sync-gate.yml

Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review.

📜 Recent review details
⏰ Context from checks skipped due to timeout. (25)
  • GitHub Check: scan / rust-secrets
  • GitHub Check: scan / shell-secrets
  • GitHub Check: pr-fuzzing (address)
  • GitHub Check: scan / gitleaks
  • GitHub Check: spark-theatre-gate / SPARK Theatre Gate
  • GitHub Check: hex audit
  • GitHub Check: compile + test (1.17, 27)
  • GitHub Check: benchee scripts compile
  • GitHub Check: coverage
  • GitHub Check: analyze (javascript-typescript, none)
  • GitHub Check: fuzz targets compile (fuzz/Cargo.toml)
  • GitHub Check: cargo-llvm-cov (≥60%)
  • GitHub Check: cargo audit
  • GitHub Check: cargo test
  • GitHub Check: clippy (all-targets)
  • GitHub Check: fuzz targets compile (rust-core/fuzz/Cargo.toml)
  • GitHub Check: cargo doc
  • GitHub Check: rustfmt
  • GitHub Check: cargo deny
  • GitHub Check: benchmarks compile
  • GitHub Check: Validate DEED manifests
  • GitHub Check: Elixir build validation
  • GitHub Check: Rust build validation
  • GitHub Check: reuse lint
  • GitHub Check: reuse lint
🔇 Additional comments (1)
.github/workflows/lock-sync-gate.yml (1)

23-23: LGTM!


📝 Summary

Summary by CodeRabbit

  • Chores
    • Added the ability to manually run the lock synchronisation check workflow, alongside its existing automatic triggers.

Walkthrough

The lock-sync gate workflow now supports manual execution through workflow_dispatch, in addition to its existing pull-request and main branch push triggers.

Changes

Lock-sync gate workflow

Layer / File(s) Summary
Manual workflow trigger
.github/workflows/lock-sync-gate.yml
The workflow now declares a workflow_dispatch trigger.

Priority: ⬇️ Low

Estimated code review effort: 1 (Trivial) | ~5 minutes

Change: Feature

Merge Risk: ⚪ Minimal · up to 454bf

The workflow is mergeable; this change enables manual gate runs without altering existing triggers or behavior.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 0…
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title refers to the lock-sync gate, which is the changed workflow, but it mainly describes lockfile and coverage changes that are not shown in the changeset. It remains partially related to the ac…
Description check ✅ Passed The description is related to the lock-sync gate and explicitly documents the added workflow_dispatch trigger. It also describes additional lockfile and coverage changes that are not present in the st…
✨ Finishing Touches
🛠️ Fix failing CI checks
  • Commit to this branch
  • Create a new PR

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.

❤️ Share

A rabbit taps the workflow door
Manual runs can start once more
The lock-sync gate stands ready
Its triggers now run steady
One small switch keeps checks in store

Comment @coderabbitai help to get the list of available commands.

hyperpolymath and others added 3 commits September 22, 2026 18:58
verisimdb's actions.lock lists 24 of its 25 workflow files. The single omission
is lock-sync-gate.yml, and it is the single workflow that cannot start: 7 of 7
runs are startup_failure, including one 22 minutes before and one 3.5 hours
after the estate-wide startup incident window, plus a minimal zzz-probe.yml
that died the same way on 2026-08-03.

The gate carries zero real 'uses:' refs by design, so its entry is the empty
list. This tests whether GitHub requires every workflow to be represented in
actions.lock once the lockfile exists, rather than only those with refs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X3hgXxWm6umMgZkjYyHnnm
The lock-entry commit flipped the gate from 7 consecutive startup_failure runs
to success. That is one observation. This empty commit takes a second, with the
cured actions.lock unchanged, to distinguish a cure from a coincidence.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X3hgXxWm6umMgZkjYyHnnm
The gate could not defend the fix this PR ships. Clauses 1-3 ask "is every
`uses:` locked under its own workflow path?" GitHub asks a DIFFERENT question:
"is every workflow FILE represented in the lock?" A workflow with no `uses:`
satisfies clauses 1-3 vacuously and GitHub still refuses to start it - which is
exactly how lock-sync-gate.yml failed here 7 times running while the checker
reported the lock in sync. Thirteen other repositories passed the gate with the
same gap present, so a green gate was not evidence of a complete lock.

Clause 4 diffs the set of files under .github/workflows/ against the set of
lockfile keys, fails on any file with no key, names it, and quotes the
empty-list form to add. Remediation step 4 warns that re-running
`gh actions-lock` may not fix it, because omitting the file is the tool's own
defect.

Mutation-tested both ways: deleting the lock-sync-gate key fails the gate, and
deleting the unrelated labels.yml key fails it too; the unmutated tree passes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X3hgXxWm6umMgZkjYyHnnm
@hyperpolymath hyperpolymath changed the title fix(ci): give the lock-sync gate a workflow_dispatch trigger lock-sync gate: list it in actions.lock (cures 7 startup failures) + clause 4 coverage check Sep 22, 2026
@coderabbitai

coderabbitai Bot commented Sep 22, 2026

Copy link
Copy Markdown
Contributor

Coding Agent task started: View task and status

The task will inspect the CI failures, validate its fix, and commit the fix to this branch automatically.

Note: Fixing CI failures is a beta feature and may encounter errors. Expect some limitations and changes as we gather feedback and continue to improve it.

⏭️ 1 check(s) skipped — already failing on `main` (not caused by this PR)
  • GitHub Actions: rust-ci / 8_clippy (all-targets).txt

@hyperpolymath
hyperpolymath merged commit 15bcd0f into main Sep 22, 2026
28 of 32 checks passed
@hyperpolymath
hyperpolymath deleted the fix/gate-workflow-dispatch branch September 22, 2026 19:12
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