What happened
On gh stack submit, PRs are created a few seconds before the stack object itself exists. pull_request workflows with a branches: filter are evaluated against each PR's literal base at open time, so mid-stack PRs are filtered out and never dispatched. They are not re-evaluated once the stack is registered, so they permanently show no checks.
This contradicts the documented behaviour in Optimizing CI for stacked pull requests: "A workflow configured to run on pull_request events targeting main runs for every pull request in the stack."
Reproduction
-
In a repo with the stacks preview enabled, add a workflow with:
on:
pull_request:
branches: [ "main" ]
-
Create a 4-branch stack and gh stack submit.
-
Observe CI runs only on the bottom PR and the topmost PR. The middle PRs get a check suite with zero runs.
Observed timeline
Stack of 4 (PRs #10–#13, stack #14, stack.base.ref = main, size: 4):
| Time (UTC) |
Event |
Workflow dispatched |
| 13:24:13 |
PR #10 opened (7 → main) |
yes — literal base is already main |
| 13:24:17 |
PR #11 opened (8 → 7) |
no — check suite 85146388656, latest_check_runs_count: 0 |
| 13:24:21 |
PR #12 opened (9 → 8) |
no — check suite 85146406327, latest_check_runs_count: 0 |
| 13:24:24 |
PR #13 opened (10 → 9) |
no — first check suite, 0 runs |
| 13:24:26 |
stack #14 created (GET /repos/{owner}/{repo}/stacks/14 → created_at) |
|
| 13:24:31 |
second check suite on PR #13's head |
yes — this is the run that appears |
The bottom PR runs because its base is literally main, independent of any stack awareness. The top PR runs because its dispatch landed after stack registration at 13:24:26 and got a second check suite. PRs #11 and #12 had their opened events fully processed before the stack existed, were rejected by the branches: [main] filter, and nothing re-dispatched them afterwards.
Reproduced identically on an earlier stack of 3 in the same repo: bottom PR ran, middle skipped, top ran.
Expected behavior
Every PR in the stack is evaluated against stack.base.ref, as documented — either by creating the stack before its PRs, or by re-evaluating pull_request workflow triggers for all member PRs once the stack is registered.
Actual behavior
Only PRs whose trigger evaluation happens after stack registration get stack-aware treatment. Mid-stack PRs are silently left with no checks, which is indistinguishable from "queued" and blocks merge on repos with required checks.
Not a duplicate of
Workaround
Remove the branches: filter from the pull_request trigger so CI runs regardless of base.
What happened
On
gh stack submit, PRs are created a few seconds before the stack object itself exists.pull_requestworkflows with abranches:filter are evaluated against each PR's literal base at open time, so mid-stack PRs are filtered out and never dispatched. They are not re-evaluated once the stack is registered, so they permanently show no checks.This contradicts the documented behaviour in Optimizing CI for stacked pull requests: "A workflow configured to run on
pull_requestevents targetingmainruns for every pull request in the stack."Reproduction
In a repo with the stacks preview enabled, add a workflow with:
Create a 4-branch stack and
gh stack submit.Observe CI runs only on the bottom PR and the topmost PR. The middle PRs get a check suite with zero runs.
Observed timeline
Stack of 4 (PRs #10–#13, stack #14,
stack.base.ref = main,size: 4):7→main)main8→7)85146388656,latest_check_runs_count: 09→8)85146406327,latest_check_runs_count: 010→9)GET /repos/{owner}/{repo}/stacks/14→created_at)The bottom PR runs because its base is literally
main, independent of any stack awareness. The top PR runs because its dispatch landed after stack registration at 13:24:26 and got a second check suite. PRs #11 and #12 had theiropenedevents fully processed before the stack existed, were rejected by thebranches: [main]filter, and nothing re-dispatched them afterwards.Reproduced identically on an earlier stack of 3 in the same repo: bottom PR ran, middle skipped, top ran.
Expected behavior
Every PR in the stack is evaluated against
stack.base.ref, as documented — either by creating the stack before its PRs, or by re-evaluatingpull_requestworkflow triggers for all member PRs once the stack is registered.Actual behavior
Only PRs whose trigger evaluation happens after stack registration get stack-aware treatment. Mid-stack PRs are silently left with no checks, which is indistinguishable from "queued" and blocks merge on repos with required checks.
Not a duplicate of
refs/pull/N/mergeon stacked PRs silently prevents allpull_requestworkflows from running #319 — merge refs are healthy here:refs/pull/{10,11,12,13}/mergeall exist and point at current commits, and all four PRs reportmergeable: true.pathsfilters being selected from the topmost PR. This isbranchesfilters and a registration-ordering race; the affected PRs get a check suite with zero runs rather than a workflow selected from the wrong PR.Workaround
Remove the
branches:filter from thepull_requesttrigger so CI runs regardless of base.