From 73ed03e573fc78794f50412d28430c988602c7f4 Mon Sep 17 00:00:00 2001 From: Constantin Jais <74049135+constantin-jais@users.noreply.github.com> Date: Fri, 9 Oct 2026 18:52:42 +0200 Subject: [PATCH 1/2] fix(e2e): move to Playwright 1.64.0 and drop the Firefox COOP workaround (generation Q) - @playwright/test 1.62.1 -> 1.64.0 in packages/ui, packages/starter/starter and packages/starter/bun-app. - playwright-core RPC patch carried forward as patches/playwright-core@1.64.0.patch: 1.64.0 still deletes the callback (coreBundle.js line 65438) before validating the result outside any try (line 65450). Same hunk body, offset 63496 -> 65447. Bundle SHA-256: original 2325ca4c...b7e0, patched 5b55e239...10ac. - Remove the two TODO(playwright-1.64) Firefox prefs browser.tabs.remote.useCrossOriginOpenerPolicy=false (revert of #8). bun.lock is NOT regenerated in this commit: @playwright/test 1.64.0 was published 2026-10-07T20:44:27Z and the fleet minimumReleaseAge (259200 s) refuses it until 2026-10-10T20:44:28Z. Draft until then. Claude-Session: https://claude.ai/code/session_01PMoUXeFXjbix7AgGYByh5K Signed-off-by: Constantin Jais <74049135+constantin-jais@users.noreply.github.com> --- docs/playwright-validation.md | 29 +++++++++++++------ package.json | 2 +- packages/starter/bun-app/package.json | 2 +- packages/starter/bun-app/playwright.config.ts | 8 +---- packages/starter/starter/package.json | 2 +- packages/starter/starter/playwright.config.ts | 8 +---- packages/ui/package.json | 2 +- ...2.1.patch => playwright-core@1.64.0.patch} | 2 +- ...e => playwright-core@1.64.0.patch.license} | 0 scripts/playwright-rpc-regression-child.cjs | 2 +- 10 files changed, 28 insertions(+), 29 deletions(-) rename patches/{playwright-core@1.62.1.patch => playwright-core@1.64.0.patch} (96%) rename patches/{playwright-core@1.62.1.patch.license => playwright-core@1.64.0.patch.license} (100%) diff --git a/docs/playwright-validation.md b/docs/playwright-validation.md index 961577f..ba55bca 100644 --- a/docs/playwright-validation.md +++ b/docs/playwright-validation.md @@ -1,7 +1,7 @@ # Playwright validation patch -The workspace pins Playwright Core 1.62.1. Bun applies -`patches/playwright-core@1.62.1.patch` during installation; use the committed lockfile. +The workspace pins Playwright Core 1.64.0. Bun applies +`patches/playwright-core@1.64.0.patch` during installation; use the committed lockfile. `bun run check:playwright` checks the installed starter dependency with four synthetic protocol cases. The workspace `check` command includes this gate. @@ -10,23 +10,34 @@ It requires the repository-pinned Node 26.5.0. Browser E2E remain separate. The patch rejects the pending RPC promise when result validation throws. Upstream removes that callback before validation, leaving the promise unsettled and throwing outside it. Invalid results remain errors. Event validation is unchanged. -Upstream 1.62.1 still ships the unpatched code: its `lib/coreBundle.js` deletes the -callback and then calls the result validator outside any `try` (line 63499), so the -patch is carried forward, re-derived for the 1.62.1 line offsets. +Upstream 1.64.0 still ships the unpatched code: its `lib/coreBundle.js` deletes the +callback (line 65438) and then calls the result validator outside any `try` +(line 65450), so the patch is carried forward, re-derived for the 1.64.0 line +offsets. The hunk body is unchanged from the 1.62.1 patch; only its offset moved +from 63496 to 65447. The patch modifies the distributed `lib/coreBundle.js` from the Apache-2.0 Playwright package. Its attribution is retained in the adjacent `.license` file. -The original bundle SHA-256 is -`9393fa79e1c67c74edc26b610d65a4f7ed73d345a762465cc88340a33a2454ac`; +The original 1.64.0 bundle SHA-256 is +`2325ca4c1c83070e89dc49fb82525508f0a68e0cf12e2a624277968da216b7e0`; the patched bundle SHA-256 is -`72a5af51a1e77ee468a07b3094f2642f507052a332c574f91e981909d9f0cea8`. +`5b55e2391e6afe560230c9228098edc37b3e7f5c505a911aa2c09927c18010ac`. This is a validation candidate. Synthetic protocol regression tests and local browser tests do not establish the cause of every CI failure. Keep the patch only with passing required CI; reassess it when upgrading Playwright and remove it when an upstream version passes the same regression tests without it. -## Why Playwright 1.62.1 and not 1.61.1 +## Why Playwright 1.64.0 + +Playwright 1.64.0 contains the change that closed microsoft/playwright#42731 +(microsoft/playwright#42788, merge `b30584c2`, an ancestor of tag `v1.64.0`): the +first Firefox navigation to a `Cross-Origin-Opener-Policy: same-origin` page no +longer hangs. The starter Firefox projects therefore no longer set +`browser.tabs.remote.useCrossOriginOpenerPolicy=false`, the temporary workaround +carried on 1.62.1. + +## Why Playwright 1.62.1 and not 1.61.1 (history) Playwright 1.61.1 installs Chrome for Testing 149.0.7827.55 (Chromium revision 1228, headless shell revision 1228 as well). On the hosted `ubuntu-24.04` runner diff --git a/package.json b/package.json index da86134..577fbd3 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,6 @@ "@libre-ai/auth-web": "file:../ai-work-supervision/packages/auth-web" }, "patchedDependencies": { - "playwright-core@1.62.1": "patches/playwright-core@1.62.1.patch" + "playwright-core@1.64.0": "patches/playwright-core@1.64.0.patch" } } diff --git a/packages/starter/bun-app/package.json b/packages/starter/bun-app/package.json index 6273782..c25f476 100644 --- a/packages/starter/bun-app/package.json +++ b/packages/starter/bun-app/package.json @@ -27,6 +27,6 @@ }, "devDependencies": { "@libre-ai/contracts": "file:../../../../schemas-and-contracts/packages/sdk-ts", - "@playwright/test": "1.62.1" + "@playwright/test": "1.64.0" } } diff --git a/packages/starter/bun-app/playwright.config.ts b/packages/starter/bun-app/playwright.config.ts index ddb54df..5f77db5 100644 --- a/packages/starter/bun-app/playwright.config.ts +++ b/packages/starter/bun-app/playwright.config.ts @@ -12,13 +12,7 @@ export default defineConfig({ { name: "firefox", testMatch: /(reference|hydration-marker)\.e2e\.ts/, - use: { - ...devices["Desktop Firefox"], - // TODO(playwright-1.64): remove once @playwright/test >= 1.64.0 (microsoft/playwright#42731) — Juggler loses a message on COOP-triggered context replacement. - launchOptions: { - firefoxUserPrefs: { "browser.tabs.remote.useCrossOriginOpenerPolicy": false }, - }, - }, + use: { ...devices["Desktop Firefox"] }, }, { name: "webkit", diff --git a/packages/starter/starter/package.json b/packages/starter/starter/package.json index b44d7cc..f041e8b 100644 --- a/packages/starter/starter/package.json +++ b/packages/starter/starter/package.json @@ -28,6 +28,6 @@ "react-dom": "19.2.7" }, "devDependencies": { - "@playwright/test": "1.62.1" + "@playwright/test": "1.64.0" } } diff --git a/packages/starter/starter/playwright.config.ts b/packages/starter/starter/playwright.config.ts index 04a4eae..b521e92 100644 --- a/packages/starter/starter/playwright.config.ts +++ b/packages/starter/starter/playwright.config.ts @@ -22,13 +22,7 @@ export default defineConfig({ { name: "firefox", testMatch: /journal\.e2e\.ts/, - use: { - ...devices["Desktop Firefox"], - // TODO(playwright-1.64): remove once @playwright/test >= 1.64.0 (microsoft/playwright#42731) — Juggler loses a message on COOP-triggered context replacement. - launchOptions: { - firefoxUserPrefs: { "browser.tabs.remote.useCrossOriginOpenerPolicy": false }, - }, - }, + use: { ...devices["Desktop Firefox"] }, }, { name: "webkit", diff --git a/packages/ui/package.json b/packages/ui/package.json index 24f7a9f..f4ad1d3 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -90,7 +90,7 @@ "devDependencies": { "@biomejs/biome": "2.5.3", "@libre-ai/governance": "file:../../../project-governance", - "@playwright/test": "1.62.1", + "@playwright/test": "1.64.0", "@types/bun": "1.3.14", "@types/react": "19.2.17", "@types/react-dom": "19.2.3", diff --git a/patches/playwright-core@1.62.1.patch b/patches/playwright-core@1.64.0.patch similarity index 96% rename from patches/playwright-core@1.62.1.patch rename to patches/playwright-core@1.64.0.patch index 31492f3..8e3fca9 100644 --- a/patches/playwright-core@1.62.1.patch +++ b/patches/playwright-core@1.64.0.patch @@ -1,6 +1,6 @@ --- a/lib/coreBundle.js +++ b/lib/coreBundle.js -@@ -63496,8 +63496,12 @@ +@@ -65447,8 +65447,12 @@ parsedError.details = detailsValidator(errorDetails ?? {}, "", this._validatorFromWireContext()); callback.reject(parsedError); } else { diff --git a/patches/playwright-core@1.62.1.patch.license b/patches/playwright-core@1.64.0.patch.license similarity index 100% rename from patches/playwright-core@1.62.1.patch.license rename to patches/playwright-core@1.64.0.patch.license diff --git a/scripts/playwright-rpc-regression-child.cjs b/scripts/playwright-rpc-regression-child.cjs index 462adbc..f389b86 100644 --- a/scripts/playwright-rpc-regression-child.cjs +++ b/scripts/playwright-rpc-regression-child.cjs @@ -16,7 +16,7 @@ const coreEntry = createRequire(playwrightEntry).resolve("playwright-core"); const packageRoot = path.dirname(coreEntry); assert.equal( JSON.parse(fs.readFileSync(path.join(packageRoot, "package.json"))).version, - "1.62.1", + "1.64.0", ); const bundle = path.join(packageRoot, "lib/coreBundle.js"); const hash = () => From 7214d417ad27b0ae8f3b1ddd769df6bc61fa605d Mon Sep 17 00:00:00 2001 From: Constantin <74049135+constantin-jais@users.noreply.github.com> Date: Wed, 14 Oct 2026 02:33:05 +0200 Subject: [PATCH 2/2] fix(deps): regenerate bun.lock for Playwright 1.64.0 The branch bumped @playwright/test to 1.64.0 in package.json but left bun.lock at 1.62.1, so the composition's `bun install --frozen-lockfile` cannot succeed. Regenerated against the composition closure at the refs of the governance manifest (the same siblings CI installs). Claude-Session: https://claude.ai/code/session_01Ko8UiKoRqWQjuKZfPJkfvr Signed-off-by: Constantin <74049135+constantin-jais@users.noreply.github.com> --- bun.lock | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/bun.lock b/bun.lock index d2d2584..e32feab 100644 --- a/bun.lock +++ b/bun.lock @@ -25,7 +25,7 @@ }, "devDependencies": { "@libre-ai/contracts": "file:../../../../schemas-and-contracts/packages/sdk-ts", - "@playwright/test": "1.62.1", + "@playwright/test": "1.64.0", }, }, "packages/starter/starter": { @@ -40,7 +40,7 @@ "react-dom": "19.2.7", }, "devDependencies": { - "@playwright/test": "1.62.1", + "@playwright/test": "1.64.0", }, }, "packages/testing": { @@ -65,7 +65,7 @@ "devDependencies": { "@biomejs/biome": "2.5.3", "@libre-ai/governance": "file:../../../project-governance", - "@playwright/test": "1.62.1", + "@playwright/test": "1.64.0", "@types/bun": "1.3.14", "@types/react": "19.2.17", "@types/react-dom": "19.2.3", @@ -105,7 +105,7 @@ }, }, "patchedDependencies": { - "playwright-core@1.62.1": "patches/playwright-core@1.62.1.patch", + "playwright-core@1.64.0": "patches/playwright-core@1.64.0.patch", }, "overrides": { "@libre-ai/auth-web": "file:../ai-work-supervision/packages/auth-web", @@ -151,7 +151,7 @@ "@libre-ai/web-platform": ["@libre-ai/web-platform@workspace:packages/web-platform"], - "@playwright/test": ["@playwright/test@1.62.1", "", { "dependencies": { "playwright": "1.62.1" }, "bin": { "playwright": "cli.js" } }, "sha512-DTcUc8qii+cpHvtOwggMtBRMjKZHXYWdw8syRYu2vtzuq4Wxphqq4NfCs5Zt44L6mA8rfDfj+PHnxFc/FeK6mQ=="], + "@playwright/test": ["@playwright/test@1.64.0", "", { "dependencies": { "playwright": "1.64.0" }, "bin": { "playwright": "cli.js" } }, "sha512-oTN9FNYuN6bqQMwiho6jJKLCG2/QOYCixGXuCjRmzOq23eODeukuY2XiAVoVpAECbuezMt1MHQjAiQxK8F+Y+g=="], "@react-types/shared": ["@react-types/shared@3.36.1", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-AzsuD9OfxTOZMMvTRhlN3oHBwOmFN7tDh27LzqmHt4+uOgPhJT7ZM7/kVs/8/o0WxayMUIk3hBmCFRHv1FUoag=="], @@ -229,9 +229,9 @@ "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "playwright": ["playwright@1.62.1", "", { "dependencies": { "playwright-core": "1.62.1" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg=="], + "playwright": ["playwright@1.64.0", "", { "dependencies": { "playwright-core": "1.64.0" }, "bin": { "playwright": "cli.js" } }, "sha512-kVzTnYFYEyQ9RGzBjNCd2+yEqWmVbxl3AHPynv3qQ6JTjv4a+kwRcnqQwIpuP3NnrnIrE/Q6wWAIAvMfIE2/Yg=="], - "playwright-core": ["playwright-core@1.62.1", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw=="], + "playwright-core": ["playwright-core@1.64.0", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-T9r+MZkTECl2+oUcZ26YgZzTrYidTsIhYYkJix+6iDOymOb1FB2RLLSOxRGnZGv5DStt+aduIVbt+E8WygXYpg=="], "react": ["react@19.2.7", "", {}, "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ=="], @@ -261,7 +261,7 @@ "@libre-ai/starter-gates/@libre-ai/governance": ["@libre-ai/governance@file:../project-governance", { "dependencies": { "ajv": "8.20.0", "ajv-formats": "3.0.1", "entities": "8.0.0" }, "devDependencies": { "@biomejs/biome": "2.5.3", "@types/bun": "1.3.14", "typescript": "7.0.2" } }], - "@libre-ai/starter-template/@libre-ai/auth-web": ["@libre-ai/auth-web@file:../ai-work-supervision/packages/auth-web", { "devDependencies": { "@biomejs/biome": "2.5.3", "@libre-ai/governance": "file:../../../project-governance", "@playwright/test": "1.61.1", "@types/bun": "1.3.14", "@types/react": "19.2.17", "@types/react-dom": "19.2.3", "typescript": "7.0.2" }, "peerDependencies": { "@libre-ai/contracts": "=0.1.0", "@libre-ai/web-platform": "=0.1.0" } }], + "@libre-ai/starter-template/@libre-ai/auth-web": ["@libre-ai/auth-web@file:../ai-work-supervision/packages/auth-web", { "devDependencies": { "@biomejs/biome": "2.5.3", "@libre-ai/governance": "file:../../../project-governance", "@playwright/test": "1.62.1", "@types/bun": "1.3.14", "@types/react": "19.2.17", "@types/react-dom": "19.2.3", "typescript": "7.0.2" }, "peerDependencies": { "@libre-ai/contracts": "=0.1.0", "@libre-ai/web-platform": "=0.1.0" } }], "@libre-ai/starter-template/@libre-ai/contracts": ["@libre-ai/contracts@file:../schemas-and-contracts/packages/sdk-ts", { "dependencies": { "ajv": "8.20.0", "ajv-formats": "3.0.1" }, "devDependencies": { "@biomejs/biome": "2.5.3", "@libre-ai/governance": "file:../../../project-governance", "@types/bun": "1.3.14", "typescript": "7.0.2" } }], @@ -277,12 +277,12 @@ "@libre-ai/starter-template/@libre-ai/auth-web/@libre-ai/governance": ["@libre-ai/governance@file:../project-governance", {}], - "@libre-ai/starter-template/@libre-ai/auth-web/@playwright/test": ["@playwright/test@1.61.1", "", { "dependencies": { "playwright": "1.61.1" }, "bin": { "playwright": "cli.js" } }, "sha512-8nKv6+0RJSL9FE4jYOEGXnPeM/Hg12qZpmqzZjRh3qM0Y7c3z1mrOTfFLids72RDQYVh9WpLEfR5WdpNX4fkig=="], + "@libre-ai/starter-template/@libre-ai/auth-web/@playwright/test": ["@playwright/test@1.62.1", "", { "dependencies": { "playwright": "1.62.1" }, "bin": { "playwright": "cli.js" } }, "sha512-DTcUc8qii+cpHvtOwggMtBRMjKZHXYWdw8syRYu2vtzuq4Wxphqq4NfCs5Zt44L6mA8rfDfj+PHnxFc/FeK6mQ=="], "@libre-ai/starter-template/@libre-ai/contracts/@libre-ai/governance": ["@libre-ai/governance@file:../project-governance", {}], - "@libre-ai/starter-template/@libre-ai/auth-web/@playwright/test/playwright": ["playwright@1.61.1", "", { "dependencies": { "playwright-core": "1.61.1" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ=="], + "@libre-ai/starter-template/@libre-ai/auth-web/@playwright/test/playwright": ["playwright@1.62.1", "", { "dependencies": { "playwright-core": "1.62.1" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg=="], - "@libre-ai/starter-template/@libre-ai/auth-web/@playwright/test/playwright/playwright-core": ["playwright-core@1.61.1", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg=="], + "@libre-ai/starter-template/@libre-ai/auth-web/@playwright/test/playwright/playwright-core": ["playwright-core@1.62.1", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw=="], } }