👐 ci: Cancel the Playwright E2E Gate With Its Run (#15415)

The `e2e` fan-in gate guarded itself with `always()`, so a run superseded by
`concurrency: cancel-in-progress` still dispatched it onto a fresh runner after
every other job had gone `cancelled`. It then read
`needs.e2e_shards.result == 'cancelled'`, took the `!= 'success'` branch, and
exited 1 — leaving the required `e2e` check red on a run that was never
adjudicated, and burning a runner slot to do it.

`!cancelled()` keeps the property the gate actually needs, running when a shard
fails so the failure is reported rather than skipped, and drops the one it never
wanted. It also matches `e2e_shards` and `mcp_tool_list_changed`, which already
guard themselves this way; run 33391962579 shows both lanes running normally
past a skipped `codegraph_select`, so a skipped dependency still reaches the
gate.


Claude-Session: https://claude.ai/code/session_012jJbt9x1sCu8ggJQmdjoMy

Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
Danny Avila 2026-08-31 09:54:53 -04:00 • committed by GitHub
parent 81338cef95
commit b88cb3e361
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -532,8 +532,13 @@ jobs:
e2e:
name: e2e
# `!cancelled()`, not `always()`: the gate has to survive a failed shard to report it, but a
# run superseded by `cancel-in-progress` has nothing to adjudicate. Under `always()` it was
# still dispatched onto a fresh runner while every other job went `cancelled`, then read
# `needs.e2e_shards.result == 'cancelled'` and exited 1 — so each superseded push left this
# required check red instead of cancelled. Matches the two lanes it gates.
if: >-
always() &&
!cancelled() &&
(github.event_name == 'schedule' ||
github.event_name == 'workflow_dispatch' ||
(github.event_name == 'pull_request' &&