From 55676f274b20c2f55b84bbe07a5bac9c43e21c0d Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 20 Oct 2026 14:18:47 +0000 Subject: [PATCH 1/2] Give the settings boundary browser test a 20 s default timeout [skip changelog] The first test loads the full shell bundle in real Chromium; on a loaded CI runner it passes Bun's 5 s default and the remaining tests cascade. It failed this way on #1995, #1996, #1998 and #1999 while passing on beta and #1997. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01RwsemkhoUGyeQkdkKFmUmw --- packages/shell/src/settingsBoundary.test.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/shell/src/settingsBoundary.test.ts b/packages/shell/src/settingsBoundary.test.ts index 351e95bd9..dda88ac95 100644 --- a/packages/shell/src/settingsBoundary.test.ts +++ b/packages/shell/src/settingsBoundary.test.ts @@ -1,10 +1,14 @@ -import { afterAll, afterEach, beforeAll, beforeEach, expect, test } from "bun:test"; +import { afterAll, afterEach, beforeAll, beforeEach, expect, setDefaultTimeout, test } from "bun:test"; import { execFileSync } from "node:child_process"; import { mkdir, rm, symlink } from "node:fs/promises"; import { resolve } from "node:path"; import { chromium, type Browser, type Page } from "playwright-core"; import { buildBrowserFixture, findChromeExecutable } from "../../../scripts/browser-lib"; +// Real Chromium: the first page load compiles the whole shell bundle, which overruns Bun's 5 s +// default on a loaded CI runner and then cascades into every later test in the file. +setDefaultTimeout(20_000); + const scratch = resolve(import.meta.dir, "../../../.scratch/settings-boundary-test"); let browser: Browser, page: Page, server: ReturnType; beforeAll(async () => { From a9704f0a157a064a461be86e1a5c10b2d5020744 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 20 Oct 2026 14:25:20 +0000 Subject: [PATCH 2/2] Run CI tests with a 20 s default timeout instead of patching one file [skip changelog] After the settings boundary test got 20 s, the same runner timed out hudInputBoundary and the Rapier slope test instead: whichever cold-start browser/WASM suite runs first under load passes Bun's 5 s default. All pass locally. Set the default for the CI test command; tests with their own timeout keep it. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01RwsemkhoUGyeQkdkKFmUmw --- .github/workflows/ci.yml | 4 +++- packages/shell/src/settingsBoundary.test.ts | 6 +----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0e2cf6000..49c7817d6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -84,7 +84,9 @@ jobs: - run: bun run games:clone env: GAMES_CLONE_TOKEN: ${{ secrets.GAMES_CLONE_TOKEN }} - - run: bun test packages apps/dev scripts + # Browser and physics suites cold-start Chromium/WASM; on a loaded runner the first test in a + # file can pass Bun's 5 s default and cascade through the file. Tests with their own timeout keep it. + - run: bun test --timeout 20000 packages apps/dev scripts web-build: runs-on: ubuntu-latest diff --git a/packages/shell/src/settingsBoundary.test.ts b/packages/shell/src/settingsBoundary.test.ts index dda88ac95..351e95bd9 100644 --- a/packages/shell/src/settingsBoundary.test.ts +++ b/packages/shell/src/settingsBoundary.test.ts @@ -1,14 +1,10 @@ -import { afterAll, afterEach, beforeAll, beforeEach, expect, setDefaultTimeout, test } from "bun:test"; +import { afterAll, afterEach, beforeAll, beforeEach, expect, test } from "bun:test"; import { execFileSync } from "node:child_process"; import { mkdir, rm, symlink } from "node:fs/promises"; import { resolve } from "node:path"; import { chromium, type Browser, type Page } from "playwright-core"; import { buildBrowserFixture, findChromeExecutable } from "../../../scripts/browser-lib"; -// Real Chromium: the first page load compiles the whole shell bundle, which overruns Bun's 5 s -// default on a loaded CI runner and then cascades into every later test in the file. -setDefaultTimeout(20_000); - const scratch = resolve(import.meta.dir, "../../../.scratch/settings-boundary-test"); let browser: Browser, page: Page, server: ReturnType; beforeAll(async () => {