diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1eb8b897d73..08623c57194 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4468,9 +4468,32 @@ jobs: # backend through DEV_PROXY_TARGET. ⛔ No retry wrapper and no # `continue-on-error` anywhere in this job: a red run is a red check. # - # Gated as Build & E2E UI is. Not behind Build UI Deps: this job builds a - # larger closure (the CLI and the showcase app's) than the seven packages that - # job hands on, so it restores Build Core's turbo seed instead. + # Gated as Build & E2E UI is, OR'd with `core` (#27550). Build & E2E UI + # builds the Console against the seven packages it compiles from, so a diff + # that reaches none of them cannot move its answer. This job runs the Console + # against a REAL server, and a server-only diff (objectql, runtime, rest, a + # plugin, the showcase app) breaks the Console there with no ui path touched: + # the access, record-save, Studio-save and screen-flow defects that reached + # main before #27550 were all of that kind. `core` (packages/**, examples/**, + # apps/!(docs)/** and the root build inputs) is the widening, not a narrower + # list of the backend's closure: over the last 60 completed pull_request + # runs before #27550 (59 graded, one `action_required`), today's gate ran 35; + # `|| core` runs 55; a filter naming only the CLI's and the showcase app's + # 67-package dependency closure would run 50. The five runs between the two + # were skills-only diffs, and that closure would be a second hand-kept + # recognizer of the backend's dependency graph, the drift THE FILTER CONTRACT + # fails open against. On merge_group `core` is always 'true', so every queue + # entry runs this job too. + # + # Not behind Build UI Deps: this job builds a larger closure (the CLI and the + # showcase app's) than the seven packages that job hands on, so it restores + # Build Core's turbo seed instead. + # + # BUDGET: the "Run the live e2e specs" step stays under 2 minutes (14-24 s, + # median 21 s, over the 35 runs above). The widened gate puts this step on + # most pull requests and on every queue entry, so a spec that would push it + # over stays in `test:e2e:live:nightly` instead of joining the `:ci` + # allowlist. # # Ceiling: there is no CI population yet, so it is derived from one cold # local run on 4 shared cores (#27154, 2026-10-28), by the rule above Lint UI: @@ -4480,7 +4503,7 @@ jobs: live-e2e-ui: name: Live E2E UI needs: filter - if: ${{ !cancelled() && needs.filter.outputs.ui_tree != 'false' && (needs.filter.outputs.ui != 'false' || needs.filter.outputs.ui_consumers != 'false') }} + if: ${{ !cancelled() && needs.filter.outputs.ui_tree != 'false' && (needs.filter.outputs.ui != 'false' || needs.filter.outputs.ui_consumers != 'false' || needs.filter.outputs.core != 'false') }} runs-on: ubuntu-latest timeout-minutes: 40 permissions: