From b88cb3e36137a0c0f2fda80d8378d99cd75338c9 Mon Sep 17 00:00:00 2001 From: Danny Avila Date: Mon, 31 Aug 2026 09:54:53 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=91=90=20ci:=20Cancel=20the=20Playwright?= =?UTF-8?q?=20E2E=20Gate=20With=20Its=20Run=20(#15415)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .github/workflows/playwright-mock.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/playwright-mock.yml b/.github/workflows/playwright-mock.yml index 25b6f1c8f7..2d6de6b197 100644 --- a/.github/workflows/playwright-mock.yml +++ b/.github/workflows/playwright-mock.yml @@ -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' &&