Skip to content

ci(#1420): add the fr-gate caller so .github can join the train - #137

Merged
LukasWodka merged 3 commits into
developfrom
ci/1420-github-fr-gate-caller
Aug 4, 2026
Merged

ci(#1420): add the fr-gate caller so .github can join the train#137
LukasWodka merged 3 commits into
developfrom
ci/1420-github-fr-gate-caller

Conversation

@LukasWodka

@LukasWodkaLukasWodka commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Part of #1420 (D1 enrolment) and unblocks the .github half of #1276.

.github is joining the release train, and the train waits on gate / gate before a staging → prod hop. 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 make gate / gate required 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/*@main callers an accepted risk of record rather than an open item, and it means repo-inventory.yml's pinned_ref: main stays correct as written — no schema change needed. (Had the answer gone the other way, caller-drift.py:580 compares 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.yml on develop is not gating its own PR — main's version runs. .github cannot self-test a gate change before promoting it.

That is 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 start consuming it at @main. Previously .github went develop → main with 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

stepstate
staging branch created✅ from main @ ee105cea, so staging's ancestry already contains prod's — no reconciliation needed on the first hop
staging protected✅ 1 review, dismiss-stale, actionlint required, conversation resolution, no force-push
promotion-branches-merge-commit-only ruleset✅ created; main + staging merge-only, develop untouched
back-merge checknot needed — the 3 commits main has that develop lacks are all previous promotion merges (#120, #124, #127) and the file diff between them is empty, so no real change would be dropped

Still blocked on an owner action: the tracebloc-release-train App is not installed on .github. I verified it the reliable way — adding it to bypass_pull_request_allowances returns 200 OK and silently drops the value. Until it is installed, enrolling .github in repos.yml would create promotion PRs the train cannot merge.

branches: deliberately omits master: 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.yml so this repo runs the shared FR gate on pull requests targeting staging and main, matching other repos on the release train and enabling a gate / gate status check to be required before promotion.

The caller delegates to tracebloc/.github/.github/workflows/fr-gate.yml@main with secrets: inherit, pinned at @main like fleet callers. Inline comments document the self-host caveat (PRs that change the reusable still run main’s gate) and that master is omitted from branches: 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.

.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

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ 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.

Comment threadrepo-inventory.yml Outdated
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
@LukasWodka
LukasWodka merged commit b54a53d into developAug 4, 2026
2 checks passed
@LukasWodka
LukasWodka deleted the ci/1420-github-fr-gate-caller branch August 14, 2026 13:53
Sign up for freeto 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.

3 participants

@LukasWodka@saadqbal@divyasinghds