Skip to content

ci: migrate the gate off trailer-only onto the fleet hybrid gate - #20

Merged
forkwright merged 3 commits into
mainfrom
ci/migrate-to-hybrid-gate
Sep 3, 2026
Merged

ci: migrate the gate off trailer-only onto the fleet hybrid gate#20
forkwright merged 3 commits into
mainfrom
ci/migrate-to-hybrid-gate

Conversation

@forkwright

Copy link
Copy Markdown
Owner

Finding

pinax's required gate is the org-default trailer-only reusable: it verifies a Gate-Passed
trailer and nothing else. That trailer is minted by a full local gate, which needs a build box the
fleet does not currently declare — so a PR without one can never produce a passing required
check
. The gate is unsatisfiable, not strict.

Evidence

  • required_status_checks.contexts on main names call / gate-attestation, produced by the
    prior file's jobs: call: uses: …/gate-attestation.yml.
  • pinax's own .github/workflows/ci.yml already carries the diagnosis: "gate-attestation.yml here
    is still the org-default trailer-only reusable … unlike sphragis and heurema, which moved to
    forkwright/.github's hybrid-gate.yml (kanon#2522) … Until pinax makes that same move, this
    workflow … does not substitute for the Gate-Passed trailer branch protection requires."

    This is that move.
  • Surfaced concretely: ci: adopt the fleet release-PR healer #19 (adopting the fleet release-PR healer, a one-file change) is red for
    exactly this reason.

Desired correction

Call hybrid-gate.yml@main, matching koinon and sphragis. The trailer remains a fast path; a
trailer-less PR falls through to a real fmt/check/clippy/nextest build on a hosted runner,
mirroring ci.yml's existing jobs.

Input choices, each verified rather than copied:

  • doctest_cmd set — nextest does not execute doctests; ci.yml's own NOTE says so.
  • rust_toolchain: "stable" explicitly — hybrid-gate auto-detects from the caller's
    rust-toolchain.toml, and pinax has none (404), unlike koinon/sphragis which leave it empty
    because they do. Empty here would hand toolchain choice to whatever the action defaults to absent
    any file. Separate follow-up: add a rust-toolchain.toml (MSRV 1.94 is already declared) so
    this can drop back to empty and the pin lives in one place.
  • needs_fleet_repo_token: false — every workspace dependency is a crates.io crate
    (compact_str, proptest, snafu, xxhash-rust, tempfile) and every cross-crate edge is a
    local { path = … } pin, verified across all four manifests. No forkwright git dependency.
  • No concurrency: blockhybrid-gate.yml declares
    ${{ github.workflow }}-${{ github.ref }} itself and its comment states callers must not repeat
    that key or the shared group self-cancels. The prior file set exactly that key; dropped
    deliberately, not carried forward.
  • @main, not a SHAforkwright/.github publishes no tags, so a SHA pin has no dependabot
    bump path and simply freezes. First-party, same trust boundary; not the third-party
    supply-chain case a pin defends against.

Done when: gate / gate reports green here and pinax#19 can pass without a hand-minted trailer.

WARNING — branch protection changes with this, deliberately

The job id is gate, not call. Branch protection pins required contexts by name, so
call / gate-attestation can never report again once this merges, and gate / gate has never
reported before it.

required_status_checks is being swapped as part of this change — add gate / gate, remove
call / gate-attestationafter this PR's own gate / gate reports green and before it
merges. Not earlier (adding a context that cannot yet report strands every open PR) and not later
(leaving the old name strands every PR the moment this merges).

Renaming a gate job without that swap is exactly how politeia's main became unmergeable. Operator
approved the protection change explicitly.

The org-default reusable this replaces verifies a Gate-Passed trailer and
nothing else. That trailer is minted by a full local gate, which needs a build
box the fleet does not currently declare -- so a PR without one could never
produce a passing required check. The gate was unsatisfiable rather than
strict, and pinax's own ci.yml already carried a comment saying so and naming
this migration as the fix.

hybrid-gate keeps the trailer as a fast path and otherwise runs a real
fmt/check/clippy/nextest build on a hosted runner, mirroring ci.yml's existing
jobs. doctest_cmd is set because nextest does not execute doctests.

rust_toolchain is set explicitly to "stable" rather than left empty, which is
the fleet convention elsewhere: hybrid-gate auto-detects from the caller's
rust-toolchain.toml, and pinax has none -- unlike koinon and sphragis, which
leave it empty because they do. Leaving it empty here would hand toolchain
selection to whatever the action defaults to absent any file. Adding a
rust-toolchain.toml (MSRV 1.94 is already declared) would let this drop back
to empty, and is worth doing separately.

needs_fleet_repo_token is false: every workspace dependency is a crates.io
crate and every cross-crate edge is a local path pin -- no forkwright git
dependency in any of the four manifests.

WARNING: the job id is `gate`, not `call`. Branch protection pins required
contexts by name, so `call / gate-attestation` can never report again and
`gate / gate` had never reported before. Both were swapped in
required_status_checks as part of this change. Renaming the job without that
swap strands every future PR against a context that cannot exist, which is
how politeia's main became unmergeable.
@forkwright forkwright closed this Aug 26, 2026
@forkwright forkwright reopened this Aug 26, 2026
WHY an empty commit: PR #20 was created with zero workflow runs -- not held at
action_required, never created at all -- and a close/reopen raised nothing
either. A push from an authenticated user is the trigger path that does not
depend on how the PR was opened.
@forkwright

Copy link
Copy Markdown
Owner Author

Correction — merge-order conflict with #16

Verified against a fresh clone of origin/main: .github/workflows/gate-attestation.yml still carries the pre-either-merge call: job (SHA-pinned), confirming both this PR and #16 are diffed from the same base and neither has landed yet.

#16 only floats this file's uses: ref and its WHY comment (call: job stays, target stays gate-attestation.yml). This PR (#20) fully rewrites the job — callgate, target→hybrid-gate.yml. Whichever merges second will conflict on this file against what the first one landed.

#20 is the complete structural fix (it also carries the required-check swap this repo needs, already operator-approved per the WARNING above), so the clean order is: land #20 first, then rebase #16 to drop its now-superseded gate-attestation.yml hunk and keep only its release-please.yml float (untouched here) — or close that hunk of #16 outright since #20 subsumes it.

Left uncommented on #16 pointing back here. Not actioned directly — I don't hold merge authority on this repo's lane and won't push to another open PR's branch without the release-please.yml owner's intent; sequencing is for whoever lands these next.

…a startup_failure

The 2026-08-26 retrigger commit landed during the Actions billing outage;
the run died with startup_failure before gate / gate could report. Billing
is restored, so merge main and let the hybrid gate run for real.
@forkwright
forkwright merged commit 932104f into main Sep 3, 2026
13 checks passed
@forkwright
forkwright deleted the ci/migrate-to-hybrid-gate branch September 3, 2026 14:25
forkwright added a commit that referenced this pull request Sep 3, 2026
Main replaced the unsatisfiable trailer-only gate with the fleet hybrid
gate and branch protection now requires gate / gate. Merging main so this
PR can report the new required context.
forkwright added a commit that referenced this pull request Sep 3, 2026
)

Main replaced the unsatisfiable trailer-only gate with the fleet hybrid
gate and branch protection now requires gate / gate. Merging main so this
PR can report the new required context.
forkwright added a commit that referenced this pull request Sep 3, 2026
… gate (#20)

Main replaced the unsatisfiable trailer-only gate with the fleet hybrid
gate and branch protection now requires gate / gate. Merging main so this
PR can report the new required context.
forkwright added a commit that referenced this pull request Sep 3, 2026
…te (#20)

Main replaced the trailer-only gate-attestation call with the fleet hybrid
gate, already floating on @main -- that half of this PR is moot there.
Conflict on gate-attestation.yml resolves to main's version; the
release-please.yml float remains this PR's content.
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