diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 41c5a3755bc..522e171e501 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -280,6 +280,11 @@ jobs: - '.nvmrc' - '.github/actions/setup-workspace/**' - '.github/actions/setup-pnpm/**' + # setup-pnpm materialises the pnpm the root manifest's + # `packageManager` field pins (#27717), so a diff confined to + # that field changes the pnpm Build Docs installs with. `core:` + # already carries this row for its own jobs. + - 'package.json' core: - 'packages/**' - 'examples/**' @@ -361,6 +366,19 @@ jobs: - 'ui/scripts/check-dist-completeness.mjs' - 'ui/scripts/invoked-as.mjs' - 'ui/scripts/vitest-invocation-guard.mjs' + # TEST INPUTS outside every package (#27961): each `$TURBO_ROOT$/…` + # input of turbo.json's generic `test` task. That task runs for + # every package Test Core tests, so a diff confined to one moves + # every `#test` hash, and before these rows Test Core first ran on + # it in the merge queue. `vitest.preset.mts` above and the + # `vite-*.ts` / `vitest-invocation-guard.mjs` build rows cover the + # other three; check-ci-filter-parity derives the set from + # turbo.json and reds while one is uncovered here. + - 'ui/vitest.config.mts' + - 'ui/vitest.setup.*' + - 'ui/scripts/test-shard-*' + - 'ui/apps/console/vitest.config.ts' + - 'ui/apps/console/vite.config.ts' # BUILD CORE'S GUARDS (#21341): every repository script the # build-core job's own steps run (named by a `run:` step or # reached through its `pnpm check:*` alias) and each one's @@ -533,6 +551,11 @@ jobs: # PR, nor in the queue, where these outputs read the same diff. - '.nvmrc' - '.github/actions/setup-pnpm/**' + # The root manifest, because setup-pnpm reads its `packageManager` + # field to pick the pnpm every ui job runs (#27717). A diff + # confined to a pnpm bump matched no list here, so the ui jobs + # skipped on the PR and in the queue alike. + - 'package.json' # The seven packages objectui installs from this tree (the set its # `.objectstack-pin` used to pack). A change here compiles and builds # the Console in the same PR — the check the retired Spec Shape Gate diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 996f62765f6..9afd03982ee 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -790,8 +790,13 @@ jobs: # explicitly does not ask for. ⛔ It is also not a licence to sweep the # rest of that remainder from here; that is a separate card. # - # What runs here is the self-tests, not the modules' callers: for the first - # three the callers are the two routing gates named above, which already run on + # `ui/scripts/invoked-as.mjs`, the ui tree's twin of the entry predicate, + # joined beside it (#27283): `ci.yml`'s `core:` filter names it as a build + # input, so `check:self-test-wired` counts it as a script CI runs, and its + # `--self-test` ran nowhere else. + # + # What runs here is the self-tests, not the modules' callers: for the three + # #10608 modules the callers are the two routing gates named above, which already run on # every PR; for `import-prerequisite` the callers are the 45 importing # gates, whose ordinary runs take the branch where the dependency IS # present and therefore observe none of what the self-test pins. @@ -799,25 +804,27 @@ jobs: # INVOCATION IDIOM note at the top of this file. # `ts-parse` spawns ~20 real node children (~10 s measured, and the spawns # are the point — they pin that a caller's try/catch cannot swallow the - # refusal); the other three are in-process fixtures, ~0.6 s combined. + # refusal); the others are in-process fixtures, ~0.9 s combined. # # ⭐ Collected rather than sequenced, for the reason spelled out at the # `Shallow-history guard self-tests` step below (#10814): under `bash -e` a # bare sequence stops at the first failure, so a red `ts-parse` would leave # the entry-predicate, comment-mask and prerequisite-frame self-tests UNRUN # while the log shows only the one failure. `ts-parse` is both the slowest - # of the four and the one that spawns real children, so it is the likeliest - # to be red — precisely the masking direction. The four modules are - # independent of one another, so collecting loses nothing. + # of them and the one that spawns real children, so it is the likeliest + # to be red — precisely the masking direction. The modules are + # independent of one another, so collecting loses nothing. This note, the + # step name and its last line name no member count: the list below is the + # one place that says how many run. # # ⭐ Collected is also why the fourth leg is HERE rather than in a step of # its own: Actions skips a job's remaining steps once a step fails, so a # standalone step further down this job would be masked by every gate above # it — the same defect one level up, and the split `check-step-collectors` # explicitly refuses as a remedy. Inside this block the frame's self-test - # prints its own verdict whatever the other three do, and it does so early + # prints its own verdict whatever the others do, and it does so early # in the job. - - name: scripts/ shared-module self-tests (parse · entry predicate · comment mask · prerequisite frame) + - name: scripts/ shared-module self-tests (parse · entry predicate, root and ui · comment mask · prerequisite frame) id: scripts-shared-module-self-tests-parse-entry continue-on-error: true run: | @@ -850,7 +857,7 @@ jobs: printf "%s" "$failed" exit 1 fi - echo "scripts/ shared-module self-tests — all four ran and passed" + echo "scripts/ shared-module self-tests — every one ran and passed" # Every `scripts/**` TypeScript parse goes through ONE module (#10133 / # #10573), and this is the half that keeps it that way (#10574). diff --git a/scripts/check-ci-filter-parity.mjs b/scripts/check-ci-filter-parity.mjs index 44654807bc8..72cb93a1a85 100644 --- a/scripts/check-ci-filter-parity.mjs +++ b/scripts/check-ci-filter-parity.mjs @@ -190,8 +190,10 @@ * script a PACKAGE's own manifest runs (`pnpm --filter