Uh oh!
There was an error while loading. Please reload this page.
ci(#1420): add the fr-gate caller so .github can join the train - #137
Merged
Conversation
.github is enrolling in the release train (D1), and the train waits on `gate / gate` before a staging -> prod hop. This repo had no fr-gate caller at all, so there was no such check to wait on -- #1276 correctly refused to make `gate / gate` required here for that reason. Pinned @main like every other caller. Open question 3 is answered in favour of branch promotion: one standard process for every repo, because a second promotion model is how drift starts. Names the consequence rather than leaving it to be discovered: this repo hosts the reusable, so a change to fr-gate.yml on develop is not gating its own PR -- main's version runs. That is exactly why the develop -> staging -> main path matters more here than anywhere else. `staging` is the only place a new gate runs against real board state before sixteen repos consume it at @main. `branches:` omits `master`: this repo has never had one, and listing a branch that does not exist is how dead filters accumulate (backend#1428). Refs #1420, #1276
Paired with the repos.yml entry. .github now has everything the train needs: staging branch created from main @ ee105ce, so its ancestry already contains prod's -- no reconciliation on the first hop staging protection 1 review, dismiss-stale, actionlint required, conversation resolution, no force-push fr-gate caller this PR -- there was none, which is why #1276 could not make gate / gate required here App bypass tracebloc-release-train on staging AND main, verified by read-back (that write returns 200 and silently drops the value when the App is not installed) merge-commit-only ruleset on main + staging; develop untouched Open question 3 answered in favour of branch promotion, so .github runs the same develop -> staging -> main path as every other enrolled repo. One process, because a second promotion model for one repo is how drift starts. Refs #1420, #1405
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit c86c462. Configure here.
Uh oh!
There was an error while loading. Please reload this page.
Bugbot is right, and the problem is my sequencing, not the flip. I bundled the inventory flip here to avoid opening a fourth PR. But caller-drift compares live repos.yml against the checked-out inventory, so asserting release_train: true while release-train#26 is unmerged makes this PR fail its own validation -- and #26 is ordered AFTER #137, because the fr-gate caller has to reach develop first or settle waits on a check that never appears. That is circular: #137 cannot be green until #26 merges, and #26 should not merge until #137 has. One red window between the two files is unavoidable, but it belongs on develop where it is visible and expected, not inside a PR that cannot go green. So this PR is now the caller only. The flip follows #26. Refs #1420
saadqbal
approved these changes
Aug 4, 2026
Uh oh!
There was an error while loading. Please reload this page.
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.

Part of #1420 (D1 enrolment) and unblocks the
.githubhalf of #1276..githubis joining the release train, and the train waits ongate / gatebefore astaging → prodhop. This repo had no fr-gate caller at all, so no such check existed to wait on — which is exactly why #1276 correctly refused to makegate / gaterequired here.Open question 3, answered
Pinned
@main, like every other caller. The decision is branch promotion, one standard process for every repo — a second promotion model for one repo is how drift starts, and the drift is more expensive than the blast radius it would avoid.That makes the 118
tracebloc/*@maincallers an accepted risk of record rather than an open item, and it meansrepo-inventory.yml'spinned_ref: mainstays correct as written — no schema change needed. (Had the answer gone the other way,caller-drift.py:580compares that value with!=, so every correctly-pinned caller would have become drift.)The consequence, named rather than discovered
This repo hosts the reusable, so a change to
fr-gate.ymlondevelopis not gating its own PR — main's version runs..githubcannot self-test a gate change before promoting it.That is why the
develop → staging → mainpath matters more here than anywhere else:stagingis the only place a new gate runs against real board state before sixteen repos start consuming it at@main. Previously.githubwentdevelop → mainwith no intermediate, so a gate change reached the whole fleet on its first successful run.Also in this PR's scope, already done outside it
stagingbranch createdmain@ee105cea, so staging's ancestry already contains prod's — no reconciliation needed on the first hopstagingprotectedactionlintrequired, conversation resolution, no force-pushpromotion-branches-merge-commit-onlyrulesetmain+stagingmerge-only,developuntouchedmainhas thatdeveloplacks are all previous promotion merges (#120, #124, #127) and the file diff between them is empty, so no real change would be droppedStill blocked on an owner action: the
tracebloc-release-trainApp is not installed on.github. I verified it the reliable way — adding it tobypass_pull_request_allowancesreturns200 OKand silently drops the value. Until it is installed, enrolling.githubinrepos.ymlwould create promotion PRs the train cannot merge.branches:deliberately omitsmaster: this repo has never had one, and listing a branch that does not exist is how the dead filters in #1428 accumulated.Note
Low Risk
CI-only addition wiring an existing reusable workflow; no application, auth, or data-path changes.
Overview
Adds
.github/workflows/fr-gate-caller.ymlso this repo runs the shared FR gate on pull requests targetingstagingandmain, matching other repos on the release train and enabling agate / gatestatus check to be required before promotion.The caller delegates to
tracebloc/.github/.github/workflows/fr-gate.yml@mainwithsecrets: inherit, pinned at@mainlike fleet callers. Inline comments document the self-host caveat (PRs that change the reusable still run main’s gate) and thatmasteris omitted frombranches:because this repo has no such branch.Reviewed by Cursor Bugbot for commit aa25769. Bugbot is set up for automated code reviews on this repo. Configure here.