You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Follow-up to the serve paths-filter + PR canary change, addressing review
findings on the same PR:
- Document @canary and @serves-on-gpu in the e2e-cucumber README tag table,
and correct the now-stale "each job runs the whole suite" text and job
table to reflect PR canary mode (MI300X runs only @canary) and the Strix
lanes skipping on pull_request.
- Add a unit test that parses the real .feature files and asserts exactly
one @canary scenario, so a later refactor dropping/renaming the tag fails
cheaply instead of silently emptying the pre-merge serve smoke.
- Move the canary-mode skip after the host-applicability checks in resolve()
so a scenario inapplicable for a hard reason (no GPU / wrong OS) reports
that reason rather than the canary skip.
- Make the merge_group gating comment honest: the Strix lanes are
continue-on-error on merge_group too, so they are not a gating backstop —
a regression surfaces at nightly, a deliberate trade for serial hardware.
Signed-off-by: fredespi <fredrik.espinoza@gmail.com>
There is no tag-filter tiering. Each CI job runs the **whole** suite
92
-
(`cargo xtask e2e`, no `-t` filter); the harness resolves every scenario to
93
-
**pass / xfail / skip** at runtime from its capability tags plus the known-bug
94
-
matrix, then reconciles the actual result against that expectation.
91
+
There is no tag-filter tiering: a job runs `cargo xtask e2e` with no `-t` filter,
92
+
and the harness resolves every scenario to **pass / xfail / skip** at runtime from
93
+
its capability tags plus the known-bug matrix, then reconciles the actual result
94
+
against that expectation. Two env-gated modes narrow *which* scenarios actually
95
+
run (still via resolution, not a CLI filter): `E2E_PR_CANARY=1` on the per-PR
96
+
MI300X lane runs only the `@canary` serve (see the job table below), and
97
+
`E2E_INCLUDE_NIGHTLY` / `E2E_INCLUDE_LIFECYCLE` opt expensive scenarios in. Off
98
+
those modes (merge queue, push, nightly, dispatch) a job runs the whole suite.
95
99
96
100
Scenarios carry stable-id and capability tags:
97
101
@@ -104,6 +108,8 @@ Scenarios carry stable-id and capability tags:
104
108
|`@serve-timeout:<secs>`| Lengthen the serve-readiness wait for a genuinely slow serve (e.g. a large model). |
105
109
|`@nightly`| Expensive scenario skipped by default; included when `E2E_INCLUDE_NIGHTLY=1`. |
106
110
|`@lifecycle`| Expensive, OS-mutating release-lifecycle scenario (packaging + real installer + install/uninstall). Skipped by default; included when `E2E_INCLUDE_LIFECYCLE=1`. `E2E_ONLY_LIFECYCLE=1` selects only this set without bypassing expectation resolution. |
111
+
|`@canary`| The single minimal real-serve scenario used as the per-PR pre-merge smoke on the MI300X lane. In canary mode (`E2E_PR_CANARY=1`) it is the **only** GPU-serving scenario that runs; every other one resolves to skip. Exactly one scenario must carry this tag (enforced by a unit test). |
112
+
|`@serves-on-gpu`| Marks a scenario that does a **real**`rocm serve` on a GPU host even though it is not `@requires-gpu` (its assertion is engine-agnostic, so it also runs mock-backed on the no-GPU lane). Needed so canary mode skips it too; without the tag it would launch an extra real serve on every PR canary run. |
107
113
108
114
Known bugs are **not** tagged in the `.feature` files — they live in
109
115
`expectations.toml`, keyed by `@id`, each with a `when = { ... }` condition (e.g.
@@ -122,18 +128,28 @@ serve does not compete with the first for device memory, and the failure quotes
122
128
the service log tail plus the device's free-VRAM state, which is where the
123
129
engine's own reason for the stall is recorded.
124
130
125
-
CI runs one job per platform, each executing the full suite:
126
-
127
-
| Job | Platform | Blocking |
128
-
|---|---|---|
129
-
|`e2e`| Mock (no GPU, GitHub-hosted) | yes |
130
-
|`e2e-gpu`| MI300X (self-hosted) | no |
131
-
|`e2e-gpu-strix-ubuntu`| Strix Halo / Ubuntu (self-hosted) | no |
132
-
|`e2e-gpu-strix-windows`| Strix Halo / Windows (self-hosted) | no |
133
-
134
-
The blocking mock job passes when every applicable scenario is pass-or-xfail with
135
-
no XPASS or unexpected failure; the GPU jobs are non-blocking. The `e2e-report`
136
-
job consolidates all platforms' results into one cross-platform report.
131
+
CI runs one job per platform. Because real GPU serves are the wall-clock long
132
+
pole on scarce serial hardware, the heavy GPU lanes are narrowed on a
133
+
`pull_request` (see the `changes` job's `serve` paths-filter and the per-job
134
+
`if:`/`E2E_PR_CANARY` gating in `ci.yml`):
135
+
136
+
| Job | Platform | On `pull_request`| On merge_group / push / dispatch | Blocking |
137
+
|---|---|---|---|---|
138
+
|`e2e`| Mock (no GPU, GitHub-hosted) | full suite | full suite | yes |
139
+
|`e2e-gpu`| MI300X (self-hosted) |`@canary` scenario only (canary mode) | full suite | no |
140
+
|`e2e-gpu-strix-ubuntu`| Strix Halo / Ubuntu (self-hosted) | skipped | full suite | no |
141
+
|`e2e-gpu-strix-windows`| Strix Halo / Windows (self-hosted) | skipped | full suite | no |
142
+
143
+
Only serve-affecting PRs run the GPU lanes at all: they are gated on the `serve`
144
+
paths-filter, so a PR that can't touch serving skips the whole matrix. When a GPU
145
+
lane does run on a PR, only the MI300X `@canary` serve executes as a pre-merge
146
+
smoke; the two Strix lanes skip on PRs (their required checks report as skipped,
147
+
satisfying branch protection) and run the full suite in the merge queue and on
148
+
push. The blocking mock job passes when every applicable scenario is pass-or-xfail
149
+
with no XPASS or unexpected failure; the GPU jobs are non-blocking
150
+
(`continue-on-error`) on every trigger — including merge_group — so they surface
151
+
regressions without gating the queue. The `e2e-report` job consolidates all
152
+
platforms' results into one cross-platform report.
137
153
138
154
The nightly workflow runs three non-blocking jobs — the existing MI300X job and
139
155
new Strix Halo jobs on Ubuntu and Windows — with `E2E_INCLUDE_NIGHTLY=1`. The
0 commit comments