Skip to content

Rebase-pushed commits get no CI runs under the default GITHUB_TOKEN — rebased PRs end up with run-less heads #125

Description

@mmcky

Found while design-reviewing #124, and pre-existing — it applies to the conflict-rebase force-push path that has shipped since rebase mode existed, not only to the new refresh input.

Empirical evidence

Harness run 29793647876 force-push rebased 13 PRs. Checking one:

PR #617 head: c3f5b3ea (committed 2026-07-21T01:39:27Z, by the rebase run)
check runs on that SHA: 0

Zero check runs on the new head. Commits pushed with the default GITHUB_TOKEN do not trigger workflows — GitHub's recursion guard — so every rebased PR's synchronize event fired into the void. The distributed rebase-translations.yml template passes secrets.GITHUB_TOKEN, and so do all five production target repos.

Why this is worse than it sounds

A rebased PR does not merely miss a CI refresh — it goes from stale-but-green to a head with no runs at all. With required status checks, that blocks merging until someone manually re-triggers. And the review workflow also does not re-run, so the force-pushed content (which conflict rebasing regenerates through the sync pipeline!) lands on the PR unreviewed. The re-translated content on those 13 harness PRs was never looked at by the review workflow.

Contrast with sync mode, which passes QUANTECON_SERVICES_PAT precisely so its PRs trigger the review workflow — the rebase template never adopted the same reasoning.

Options

  1. Template change: rebase-translations.yml passes the machine-user PAT (or a GitHub App token) as github-token, mirroring the sync workflows. One-line change per repo; the org secret already exists. Recommended.
  2. Action-side warning: rebase mode logs a prominent warning when it detects it pushed with a token that cannot trigger workflows (not directly detectable — it can at best note the caveat unconditionally).
  3. Documentation only — #124 already adds the caveat to the action reference and the template comment. That is the floor, not the fix.

Note option 1 has a real trade-off to weigh: the machine-user PAT grants broader rights to the rebase workflow than GITHUB_TOKEN does, and rebase runs on pull_request: closed events in target repos. Worth a deliberate decision rather than a reflex adoption.

Relationship to #123 / #124

#124's rebase-stale-siblings refresh has the same property (its whole purpose is re-running checks, so under GITHUB_TOKEN it is a no-op with extra commits). The docs/template caveat shipped there; this issue tracks the actual token decision and the estate rollout, since the same choice governs both paths.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions