Skip to content

ci: gate release PRs behind one Release gate context - #6154

Merged
kixelated merged 2 commits into
mainfrom
quest/m0/ci/release-gates
Oct 21, 2026
Merged

kixelated merged 2 commits into
mainfrom
quest/m0/ci/release-gates

Conversation

@kixelated

@kixelated kixelated commented Oct 21, 2026 •

Copy link
Copy Markdown
Collaborator

Implements quest/m0/ci/release-gates.md.

Settings the maintainer must change (no ruleset is changed here)

None until the next cut merges into release. Then:

  1. Release ruleset 24392632: add required status check Release gate from GitHub Actions (integration 15368), beside Check. Main ruleset 2420853 already requires only Check, and release already dropped Test.
  2. Edit the title of each open release PR (or push to it) so it reports Release gate; edited reruns the gate.

Adding it earlier blocks every release PR, because a release PR runs the workflows merged with release.

Summary

PRs into release get one required context, Release gate, instead of a ruleset entry per job.

  • New .github/workflows/release-gate.yml runs on every release PR (no path filters). A Scope job diffs the PR with dorny/paths-filter and each optional workflow is called when its paths match; Platform and Features are always called. The Release gate job fails when any call (or the scope) failed or was cancelled; skipped calls pass.
  • The 21 workflows that ran on release PRs lose their own pull_request trigger; the six without one gain workflow_call. Their path lists move verbatim into the gate's filter, comments included. Their closed guards go too.
  • sh/gh/ts-paths.py now reads the gate's ts: filter (with a unit test), and the dispatch scope follows it.
  • smoke.yml loses its pull_request trigger. It ran on main PRs, which sh/gh/queue.test.ts forbids, so just gh test (nightly) failed on main since moq-dev/moq#6046. Merges still run it against the published packages.
  • sh/gh/queue.test.ts asserts the new policy: only check.yml and release-gate.yml take pull_request, every former release PR workflow is called, each filter, output and condition lines up, the gate needs every job, and the verdict fails on failure or cancellation but passes skips.
  • The quest becomes a condition: once the next cut carries this workflow to release, the maintainer adds the context.

Why one context: a called workflow's result rolls up every job inside it, so a failed Platform scope or moq-ffi build fails the gate. With per-job contexts, a failed upstream job skips its dependents, and GitHub counts a skipped required check as passing. One context also means renaming a job or adding a workflow never needs a ruleset edit. always() runs the gate even in a cancelled run, so an edited rerun cannot leave a skipped, passing context on the same commit while it runs.

The filter diffs with git (token: "", full checkout). The REST file list stops at 3,000 files, which a cut can exceed. GitHub's own paths trigger filter stops at 300.

Decisions

Accepted on the coordinator's AFK delegation (2026-10-20), taking the recommended option for each; not maintainer-confirmed.

  1. One Release gate context, not a required context per job (the quest's original plan), for the skipped-dependent and rename reasons above. The rejected alternative kept each workflow's own trigger, added a scope job to each path-filtered workflow, and listed about 30 job names in the ruleset.
  2. Keep the per-workflow path selection, not calling every workflow on every release PR. Release PRs come a few a day, and the selection avoids running five macOS Dart FFI builds or the TS suite on a JS-only backport. Dropping it would have deleted the 250-line filter and ts-paths.py, at that runner cost.
  3. New dependency dorny/paths-filter v4.0.3 (pinned SHA), not hand-rolled glob matching. It is maintained and matches globs with picomatch (dot: true), like the paths triggers it replaces.

Public API / wire impact

None. CI only.

Checks

  • just check origin/main: pass
  • just gh check (actionlint, alert coverage, check-runs): pass
  • bun sh/gh/queue.test.ts: pass (failed on main before this, on smoke.yml)
  • python3 sh/gh/ts-paths.test.py, python3 sh/gh/ts-paths.py: pass
  • Not run: a real release PR. Nothing here can exercise release-gate.yml before a PR into release does. The cut that carries it will run it before the ruleset requires it.

Follow-ups

  • Nightly could call release-gate.yml's set instead of listing the optional workflows a second time, but nightly passes benchmarks: true to Platform and skips path selection. Not recommended for now.

(Written by Claude Opus 5.5)

🤖 Generated with Claude Code

kixelated and others added 2 commits October 20, 2026 21:39
release-gate.yml runs on every PR into release, calls Platform, Features,
and each optional workflow whose paths the diff touches, and fails its
`Release gate` job when any of them fails or is cancelled. The optional
workflows drop their own pull_request triggers, so release can require one
context that always reports.

smoke.yml drops its main PR trigger, which the queue policy test forbids.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated

Copy link
Copy Markdown
Collaborator Author

Quest start outcome: implemented and opened as a draft, since three decisions are open (see the description). I recommend option one for each: one Release gate context, keeping the per-workflow path selection, and dorny/paths-filter.

No ruleset was changed. After the next cut lands on release, the maintainer adds Release gate to release ruleset 24392632, then edits the title of each open release PR so it reruns the gate.

(Written by Claude Opus 5.5)

@kixelated
kixelated marked this pull request as ready for review October 21, 2026 05:08
@coderabbitai

coderabbitai Bot commented Oct 21, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 24 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used all 4 included reviews currently available.

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 8a27cfe8-875d-4f28-a126-9145a4e07b79
📥 Commits

Reviewing files that changed from the base of the PR and between 9477a58 and 9afd91c.

📒 Files selected for processing: 31
  • .github/workflows/android.yml
  • .github/workflows/audio-quality.yml
  • .github/workflows/cpp.yml
  • .github/workflows/features.yml
  • .github/workflows/interop.yml
  • .github/workflows/moq-sh.yml
  • .github/workflows/nightly.yml
  • .github/workflows/obs.yml
  • .github/workflows/oss-scanner.yml
  • .github/workflows/platform.yml
  • .github/workflows/release-dart-ffi.yml
  • .github/workflows/release-dart.yml
  • .github/workflows/release-gate.yml
  • .github/workflows/release-go-ffi.yml
  • .github/workflows/release-js.yml
  • .github/workflows/release-kt-lib.yml
  • .github/workflows/release-swift-lib.yml
  • .github/workflows/runner-vm.yml
  • .github/workflows/smoke.yml
  • .github/workflows/ts.yml
  • .github/workflows/uring.yml
  • .github/workflows/video.yml
  • .github/workflows/wasm.yml
  • .github/workflows/x11.yml
  • quest/m0/ci/README.md
  • quest/m0/ci/mbx-r2-verify.md
  • quest/m0/ci/release-gates.md
  • sh/dispatch.sh
  • sh/gh/queue.test.ts
  • sh/gh/ts-paths.py
  • sh/gh/ts-paths.test.py
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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

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

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-21T06:01:52.696262Z 9afd91c Manual request
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@kixelated

Copy link
Copy Markdown
Collaborator Author

@codex review

The review started on ready has shown "running" for nearly an hour without a result.

(Written by Claude Opus 5.5)

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. More of your lovely PRs please.

Reviewed commit: 9afd91c1c3

ℹ️ 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".

@kixelated

Copy link
Copy Markdown
Collaborator Author

Enqueuing at 9afd91c1c377046d3bd3bd6b65a641fdfed1a154, the head Codex reviewed with no findings. CodeRabbit hit its rate limit and did not review.

The three decisions in the description (one Release gate context, per-workflow path selection kept, dorny/paths-filter) were accepted on the coordinator's AFK delegation (2026-10-20). The maintainer has not confirmed them.

No ruleset changed. Once the next cut carries release-gate.yml to release, the maintainer adds Release gate to release ruleset 24392632, then edits the title of each open release PR so it reports. The quest file tracks this.

(Written by Claude Opus 5.5)

@kixelated
kixelated added this pull request to the merge queue Oct 21, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Oct 21, 2026
@kixelated
kixelated added this pull request to the merge queue Oct 21, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Oct 21, 2026
@kixelated
kixelated added this pull request to the merge queue Oct 21, 2026
@kixelated
kixelated removed this pull request from the merge queue due to a manual request Oct 21, 2026
@kixelated
kixelated added this pull request to the merge queue Oct 21, 2026
Merged via the queue into main with commit a9b1646 Oct 21, 2026
11 checks passed
@kixelated
kixelated deleted the quest/m0/ci/release-gates branch October 21, 2026 22:07
kixelated added a commit that referenced this pull request Oct 22, 2026
Move c.yml under release-gate.yml, as #6154 did for every release-PR workflow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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