fix(ci): stop fanning out the whole cockpit e2e matrix for unrelated changes - #939
Merged
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Contributor
…changes PR #932 changed three files under apps/website/src and ran 41 `Cockpit — e2e` lanes. Two independent scoping defects stacked up. 1. apps/cockpit carried `scope:cockpit-e2e`. The cockpit-e2e matrix dispatches `nx e2e` for the standalone Angular cap apps under cockpit/**; none of the 40 caps depends on the apps/cockpit Next.js shell, and no workflow runs the shell's own `e2e` target. The tag could never select real work — only over-select. And it did: apps/cockpit statically depends on apps/website, so a website-only PR made the shell nx-affected and flipped cockpit_e2e true. 2. cockpit-matrix matched affected projects on `cap.angular` only. A cap is two unlinked nx projects (Angular app + python backend), so a python-only cap change attributed nothing, which main() reads as "nx found no cap" and answers with the full fleet — 40 lanes to cover one cap. Measured on this checkout, before → after: website-only (PR #932 base..head) 41 lanes → 0 (job gate is now false) python-only cap change 40 lanes → 1 (the cap that changed) libs/chat change 40 lanes → 40 (unchanged; no coverage lost) The python sibling's nx name is read from its own project.json rather than derived from the path, because a wrong guess fails open to the full fleet without ever reporting that it guessed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
blove
force-pushed
the
blove/ci-cockpit-e2e-scoping
branch
from
September 1, 2026 22:31
6bae069 to
753d40d
Compare
blove
enabled auto-merge (squash)
September 1, 2026 22:31
Contributor
blove
added a commit
that referenced
this pull request
Sep 1, 2026
#921 added apps/cockpit/e2e/control-plane.spec.ts — 7 Playwright tests over the operational sidebar: the real Angular handshake without blank or unresponsive states, operational controls reachable at four viewports, forced colors preserving control boundaries and keyboard focus, and reduced motion disabling loader and drawer animation. Nothing ever ran it. The suite sits behind `nx e2e cockpit`, and the cockpit-e2e matrix only dispatches caps derived from walking cockpit/** — apps/cockpit is never a candidate. No other job named the target either: grepping every workflow for `nx e2e` returns examples-chat-angular, examples-ag-ui-angular, the cap matrix, and website. So this has been dead coverage for its whole life. Verified it actually passes before wiring it up — 7/7 in 24s locally. It goes in the existing `cockpit` job rather than a new one because it is cheap, it reuses that job's `npm ci`, the `cockpit` scope already gates the shell, and required-pr-checks already aggregates the job — so it becomes merge-blocking with no gate change. The playwright config already sets retries: 2 on CI. Found while auditing the tags I removed from apps/cockpit in #939. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This was referenced Sep 1, 2026
blove
added a commit
that referenced
this pull request
Sep 2, 2026
#921 added apps/cockpit/e2e/control-plane.spec.ts — 7 Playwright tests over the operational sidebar: the real Angular handshake without blank or unresponsive states, operational controls reachable at four viewports, forced colors preserving control boundaries and keyboard focus, and reduced motion disabling loader and drawer animation. Nothing ever ran it. The suite sits behind `nx e2e cockpit`, and the cockpit-e2e matrix only dispatches caps derived from walking cockpit/** — apps/cockpit is never a candidate. No other job named the target either: grepping every workflow for `nx e2e` returns examples-chat-angular, examples-ag-ui-angular, the cap matrix, and website. So this has been dead coverage for its whole life. Verified it actually passes before wiring it up — 7/7 in 24s locally. It goes in the existing `cockpit` job rather than a new one because it is cheap, it reuses that job's `npm ci`, the `cockpit` scope already gates the shell, and required-pr-checks already aggregates the job — so it becomes merge-blocking with no gate change. The playwright config already sets retries: 2 on CI. Found while auditing the tags I removed from apps/cockpit in #939. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
blove
added a commit
that referenced
this pull request
Sep 2, 2026
#921 added apps/cockpit/e2e/control-plane.spec.ts — 7 Playwright tests over the operational sidebar: the real Angular handshake without blank or unresponsive states, operational controls reachable at four viewports, forced colors preserving control boundaries and keyboard focus, and reduced motion disabling loader and drawer animation. Nothing ever ran it. The suite sits behind `nx e2e cockpit`, and the cockpit-e2e matrix only dispatches caps derived from walking cockpit/** — apps/cockpit is never a candidate. No other job named the target either: grepping every workflow for `nx e2e` returns examples-chat-angular, examples-ag-ui-angular, the cap matrix, and website. So this has been dead coverage for its whole life. Verified it actually passes before wiring it up — 7/7 in 24s locally. It goes in the existing `cockpit` job rather than a new one because it is cheap, it reuses that job's `npm ci`, the `cockpit` scope already gates the shell, and required-pr-checks already aggregates the job — so it becomes merge-blocking with no gate change. The playwright config already sets retries: 2 on CI. Found while auditing the tags I removed from apps/cockpit in #939. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
blove
added a commit
that referenced
this pull request
Sep 2, 2026
) #921 added apps/cockpit/e2e/control-plane.spec.ts — 7 Playwright tests over the operational sidebar: the real Angular handshake without blank or unresponsive states, operational controls reachable at four viewports, forced colors preserving control boundaries and keyboard focus, and reduced motion disabling loader and drawer animation. Nothing ever ran it. The suite sits behind `nx e2e cockpit`, and the cockpit-e2e matrix only dispatches caps derived from walking cockpit/** — apps/cockpit is never a candidate. No other job named the target either: grepping every workflow for `nx e2e` returns examples-chat-angular, examples-ag-ui-angular, the cap matrix, and website. So this has been dead coverage for its whole life. Verified it actually passes before wiring it up — 7/7 in 24s locally. It goes in the existing `cockpit` job rather than a new one because it is cheap, it reuses that job's `npm ci`, the `cockpit` scope already gates the shell, and required-pr-checks already aggregates the job — so it becomes merge-blocking with no gate change. The playwright config already sets retries: 2 on CI. Found while auditing the tags I removed from apps/cockpit in #939. Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
PR #932 changed exactly three files under
apps/website/srcand ran 41Cockpit — e2elanes. Two independent scoping defects stacked.1. The cockpit shell claimed the e2e matrix
apps/cockpit/project.jsoncarriedscope:cockpit-e2e. But the matrix dispatchesnx e2efor the standalone Angular cap apps undercockpit/**, and:apps/cockpitNext.js shell (checked against the nx project graph)e2etargetSo the tag could never select real work — only over-select. And it did:
apps/cockpitstatically depends onapps/website, so a website-only PR made the shell nx-affected and flippedcockpit_e2etrue. From that run'sCI scopelog:2. A cap was only matchable by its Angular name
A cap is two independent nx projects — the Angular app that owns the
e2etarget and the python backend — with no edge between them.cockpit-matrix.mjsmatched affected projects oncap.angularonly, so a python-only cap change attributed nothing, whichmain()reads as "nx found no cap" and answers with the full fleet.Measured, before → after
base..head)if:gate is now falselibs/chatchange(40 vs 41 is drift in the cap count since that run, not an effect of this change.)
Notes
project.jsonrather than derived from the path. A convention-derived guess would fail open to the full fleet without ever reporting that it guessed.{angular, python}shape;pythonNameis internal to attribution.Tests
Both new spec groups were confirmed failing before the fix:
After:
node --testover all six suites 125/125,nx test scriptsvitest 71/71 (baseline),nx lint scriptsclean. No new spec file, soscripts/vite.config.mtsexcludeand the ci.ymlnode --testinvocation need no change.Left alone deliberately
scope:cockpit-examplesandscope:cockpit-deploy-smokeon the shell are also broad, but those jobs are cheap and already self-scope (Cockpit — build all examplescorrectly logged "No affected cockpit angular projects" on #932). Separately:apps/cockpithas ane2etarget that no workflow runs — worth a look, but not this PR.🤖 Generated with Claude Code