@@ -45,11 +45,13 @@ jobs:
4545 - '.nvmrc'
4646 - 'tsconfig*.json'
4747 - '.github/workflows/pr-health-checks.yml'
48+ - '.github/actions/**'
4849 library:
4950 - 'library/**'
5051 - 'pnpm-lock.yaml'
5152 - 'pnpm-workspace.yaml'
5253 - '.github/workflows/pr-health-checks.yml'
54+ - '.github/actions/**'
5355
5456 # No path filter: a stale CDN version can drift in via a doc edit OR a bump,
5557 # so check every PR. Pure Node — no pnpm install needed.
8284 - name : Checkout repository
8385 uses : actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
8486
85- - name : Install pnpm
86- uses : pnpm/action-setup@ac6db6d3c1f721f886538a378a2d73e85697340a # v6.0.8
87-
88- - name : Set up Node
89- uses : actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
90- with :
91- node-version-file : " .nvmrc"
92- cache : " pnpm"
93-
94- - name : Install dependencies
95- run : pnpm install --frozen-lockfile
87+ - name : Setup pnpm + Node + install
88+ uses : ./.github/actions/setup
9689
9790 - name : Run Lint
9891 run : pnpm run lint
@@ -140,17 +133,8 @@ jobs:
140133 - name : Checkout repository
141134 uses : actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
142135
143- - name : Install pnpm
144- uses : pnpm/action-setup@ac6db6d3c1f721f886538a378a2d73e85697340a # v6.0.8
145-
146- - name : Set up Node
147- uses : actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
148- with :
149- node-version-file : " .nvmrc"
150- cache : " pnpm"
151-
152- - name : Install dependencies
153- run : pnpm install --frozen-lockfile
136+ - name : Setup pnpm + Node + install
137+ uses : ./.github/actions/setup
154138
155139 - name : Build library and server
156140 run : pnpm run build:lib && pnpm run build:server
@@ -167,17 +151,8 @@ jobs:
167151 - name : Checkout repository
168152 uses : actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
169153
170- - name : Install pnpm
171- uses : pnpm/action-setup@ac6db6d3c1f721f886538a378a2d73e85697340a # v6.0.8
172-
173- - name : Set up Node
174- uses : actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
175- with :
176- node-version-file : " .nvmrc"
177- cache : " pnpm"
178-
179- - name : Install dependencies
180- run : pnpm install --frozen-lockfile
154+ - name : Setup pnpm + Node + install
155+ uses : ./.github/actions/setup
181156
182157 - name : Build
183158 run : pnpm run build:lib
@@ -206,8 +181,11 @@ jobs:
206181 - name : Run E2E tests
207182 run : pnpm --filter @tumaet/webapp exec playwright test tests/e2e/
208183
209- - name : Run performance budget tests
210- run : pnpm --filter @tumaet/webapp run test:perf
184+ # The chromium document-growth budget runs in the scheduled
185+ # nightly-checks workflow, not here — the Firefox budget (perf-firefox-
186+ # tests below) is the per-PR guard for the exam-freeze regression, since
187+ # Firefox is the engine the freeze was reported on and its GC surfaces
188+ # unbounded growth sooner.
211189
212190 - name : Upload Playwright report
213191 if : ${{ failure() }}
@@ -241,17 +219,8 @@ jobs:
241219 - name : Checkout repository
242220 uses : actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
243221
244- - name : Install pnpm
245- uses : pnpm/action-setup@ac6db6d3c1f721f886538a378a2d73e85697340a # v6.0.8
246-
247- - name : Set up Node
248- uses : actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
249- with :
250- node-version-file : " .nvmrc"
251- cache : " pnpm"
252-
253- - name : Install dependencies
254- run : pnpm install --frozen-lockfile
222+ - name : Setup pnpm + Node + install
223+ uses : ./.github/actions/setup
255224
256225 - name : Build
257226 run : pnpm run build:lib
@@ -307,19 +276,13 @@ jobs:
307276 - name : Checkout repository
308277 uses : actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
309278
310- - name : Install pnpm
311- uses : pnpm/action-setup@ac6db6d3c1f721f886538a378a2d73e85697340a # v6.0.8
312-
313- - name : Set up Node 22 LTS
314- uses : actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
279+ - name : Setup pnpm + Node 22 + install
280+ # Node 22 (the library's published floor) instead of the repo's .nvmrc,
281+ # and engine-strict off so the root `>=24.15.0` gate doesn't reject it.
282+ uses : ./.github/actions/setup
315283 with :
316284 node-version : " 22"
317- cache : " pnpm"
318-
319- - name : Install dependencies
320- # `engine-strict=true` rejects Node 22 against the root `>=24.15.0`
321- # gate; library workspace is `>=22`, so install with the flag off.
322- run : pnpm install --frozen-lockfile --config.engine-strict=false
285+ engine-strict : " false"
323286
324287 - name : Build library
325288 run : pnpm --filter @tumaet/apollon run build
@@ -361,53 +324,11 @@ jobs:
361324 # of >10% (size-limit default) per artifact.
362325 run : pnpm run size
363326
364- # Baseline regeneration: see docs/development/visual-tests.md.
365- visual-regression-tests :
366- needs : [detect-changes]
367- if : needs.detect-changes.outputs.should-skip != 'true' && needs.detect-changes.outputs.code == 'true'
368- runs-on : ubuntu-latest
369- timeout-minutes : 30
370- container :
371- image : mcr.microsoft.com/playwright:v1.59.1-noble
372- steps :
373- - name : Checkout repository
374- uses : actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
375-
376- - name : Install Node 24
377- shell : bash
378- run : |
379- set -euo pipefail
380- curl -fsSL https://deb.nodesource.com/setup_24.x | bash -
381- apt-get install -y nodejs
382- node --version
383-
384- - name : Install pnpm
385- uses : pnpm/action-setup@ac6db6d3c1f721f886538a378a2d73e85697340a # v6.0.8
386-
387- - name : Install dependencies
388- run : pnpm install --frozen-lockfile
389-
390- - name : Build
391- run : pnpm run build:lib
392-
393- - name : Run visual regression tests
394- run : pnpm --filter @tumaet/webapp exec playwright test tests/visual/
395-
396- - name : Upload Playwright report
397- if : ${{ failure() }}
398- uses : actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
399- with :
400- name : playwright-report-visual
401- path : standalone/webapp/playwright-report/
402- retention-days : 14
403-
404- - name : Upload Playwright test results
405- if : ${{ failure() }}
406- uses : actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
407- with :
408- name : playwright-test-results-visual
409- path : standalone/webapp/test-results/
410- retention-days : 14
327+ # NOTE: visual-regression and the chromium document-growth budget moved to
328+ # the scheduled `nightly-checks.yml` workflow (run on demand via Run
329+ # workflow). They are rendering/cross-engine guards, not per-PR correctness
330+ # gates. The Firefox document-growth budget (the exam-freeze guard) stays
331+ # per-PR above.
411332
412333 # Gate job — set this as the required status check in branch protection.
413334 # Correctly handles skipped jobs (docs-only, duplicate runs).
@@ -424,7 +345,6 @@ jobs:
424345 library-node22-compat,
425346 e2e-tests,
426347 perf-firefox-tests,
427- visual-regression-tests,
428348 ]
429349 if : always()
430350 steps :
0 commit comments