$ node scripts/prove-scenario.ts scripts/scenarios/database-contention.e2e.ts --base 4121b30f78cd68c8aa033c949075ffcd9832be97 --head 2b686809eb7988292fd4a250ed67e503e69a7ef8 --upload-command 'ghdrop upload' ⊘ cache disabled Scope: all 42 workspace projects ✓ Lockfile passes supply-chain policies (verified 57m ago) Lockfile is up to date, resolution step is skipped Packages are hard linked from the content-addressable store to the virtual store. Content-addressable store is at: Virtual store is at: node_modules/.pnpm Progress: resolved 1074, reused 1074, downloaded 0, added 1059 Progress: resolved 1760, reused 1760, downloaded 0, added 1747 Packages: +1779 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Progress: resolved 1779, reused 1775, downloaded 0, added 1779, done Agent skills awaiting approval: e2e. Run "pnpm approve" to review them. . prepare$ vp config --no-agent . prepare: Done devDependencies: + @coderabbitai/config 1.2.0 + @effect/tsgo 0.67.1 + @shadcn/lint 0.1.5 + @types/node 24.12.4 + knip 6.34.0 + vite-plus 1.4.0 Done in 4s using pnpm v12.14.0 RUN e2e v0.23.0 run 01a1d99d-2f44-7db2-8c93-da762792e5b5 · targets: web, ios ✓ target "web" command at http://127.0.0.1:41045/.well-known/t3/environment ready 9.29s stdout | |web| scenarios/database-contention.e2e.ts > A claimed turn recovers after a 60 second external database write lock armed external write lock acquired after provider-turn.start claim external write lock released × |web| scenarios/database-contention.e2e.ts > A claimed turn recovers after a 60 second external database write lock 143.57s → expect.toBeVisible failed ❯ |web| scenarios/database-contention.e2e.ts (1 test | 1 failed) 143.57s ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Failed Tests 1 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ FAIL |web| scenarios/database-contention.e2e.ts > A claimed turn recovers after a 60 second external database write lock ASSERTION_FAILED: expect.toBeVisible failed locator: getByText("second fixture turn complete") expected: visible observed: no node (match count 0) ❯ scenarios/database-contention.e2e.ts:42:5 40| await new Promise(resolve => setTimeout(resolve, 30_000)); 41| await app.screenshot("after-contention-clears"); 42| await expect(screen.getByText("second fixture turn complete", {ex… | ^ 43| await screen.getByRole("textbox").fill("Third message after recov… 44| await screen.getByRole("textbox").press("Enter"); ❯ at http://127.0.0.1:41045/8c2584f9-a885-48d2-a541-89b9728fde72/mcp:f4359789-bdb4-4dd7-9e7a-41f16a9ed8d6 ❯ app 1 warning logged ❯ trace .e2e/prove/base/results/database-contention-a-claimed-turn-recovers-after-a-c8d5cea9f73de30b/trace.md ❯ video .e2e/prove/base/results/database-contention-a-claimed-turn-recovers-after-a-c8d5cea9f73de30b/attempt-1/video/video.webm ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/1]⎯ Test Files 1 failed | 0 passed (1) Tests 1 failed | 0 passed (1) Start at 10:32:00 Duration 154.08s (2m 34s, startup 9.29s) Traces .e2e/prove/base/results/ (1 page, trace.md in each test's directory) Screenshots .e2e/prove/base/results/database-contention-a-claimed-turn-recovers-after-a-c8d5cea9f73de30b/attempt-1/screenshots/001-after-contention-clears.png Markdown .e2e/prove/base/summary.md Failed × |web| scenarios/database-contention.e2e.ts:42 > A claimed turn recovers after a 60 second external database write lock ASSERTION_FAILED: expect.toBeVisible failed trace .e2e/prove/base/results/database-contention-a-claimed-turn-recovers-after-a-c8d5cea9f73de30b/trace.md Scope: all 42 workspace projects ✓ Lockfile passes supply-chain policies (verified 1h ago) Lockfile is up to date, resolution step is skipped Packages are hard linked from the content-addressable store to the virtual store. Content-addressable store is at: Virtual store is at: node_modules/.pnpm Progress: resolved 1112, reused 1112, downloaded 0, added 1097 Progress: resolved 1731, reused 1731, downloaded 0, added 1721 Packages: +1779 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Progress: resolved 1779, reused 1775, downloaded 0, added 1779, done Agent skills awaiting approval: e2e. Run "pnpm approve" to review them. . prepare$ vp config --no-agent . prepare: Done devDependencies: + @coderabbitai/config 1.2.0 + @effect/tsgo 0.67.1 + @shadcn/lint 0.1.5 + @types/node 24.12.4 + knip 6.34.0 + vite-plus 1.4.0 Done in 4s using pnpm v12.14.0 RUN e2e v0.23.0 run 01a1d99f-bbb8-7c79-871e-8d72ecbf362b · targets: web, ios ✓ target "web" command at http://127.0.0.1:38663/.well-known/t3/environment ready 6.61s stdout | |web| scenarios/database-contention.e2e.ts > A claimed turn recovers after a 60 second external database write lock armed external write lock acquired after provider-turn.start claim external write lock released ✓ |web| scenarios/database-contention.e2e.ts > A claimed turn recovers after a 60 second external database write lock 104.23s ✓ |web| scenarios/database-contention.e2e.ts (1 test) 104.23s Test Files 1 passed (1) Tests 1 passed (1) Start at 10:34:47 Duration 111.88s (1m 52s, startup 6.61s) Traces .e2e/prove/head/results/ (1 page, trace.md in each test's directory) Screenshots .e2e/prove/head/results/database-contention-a-claimed-turn-recovers-after-a-c8d5cea9f73de30b/attempt-1/screenshots/001-after-contention-clears.png .e2e/prove/head/results/database-contention-a-claimed-turn-recovers-after-a-c8d5cea9f73de30b/attempt-1/screenshots/002-subsequent-message-completes.png Markdown .e2e/prove/head/summary.md { "scenario": "A claimed turn recovers after a 60 second external database write lock", "failsOnBase": true, "passesOnHead": true, "couldNotRun": null, "baseSha": "4121b30f78cd68c8aa033c949075ffcd9832be97", "headSha": "2b686809eb7988292fd4a250ed67e503e69a7ef8", "verdict": "Proven: the scenario fails on base `4121b30f78` and passes on head `2b686809eb`.", "steps": { "base": [ { "step": "app.open ", "status": "passed" }, { "step": "expect.not.toHaveURL /\\/pair(?:[?#]|$)/", "status": "passed" }, { "step": "app.open /8c2584f9-a885-48d2-a541-89b9728fde72/mcp:f4359789-bdb4-4dd7-9e7a-41f16a9ed8d6", "status": "passed" }, { "step": "locator.fill getByRole(\"textbox\")", "status": "passed" }, { "step": "locator.press getByRole(\"textbox\")", "status": "passed" }, { "step": "app.screenshot after-contention-clears", "status": "passed" }, { "step": "expect.toBeVisible getByText(\"second fixture turn complete\")", "status": "failed" } ], "head": [ { "step": "app.open ", "status": "passed" }, { "step": "expect.not.toHaveURL /\\/pair(?:[?#]|$)/", "status": "passed" }, { "step": "app.open /addcf472-3806-404d-89de-c66b817be4d8/mcp:b65f9075-b45b-45c3-89ae-7d4cecce71a7", "status": "passed" }, { "step": "locator.fill getByRole(\"textbox\")", "status": "passed" }, { "step": "locator.press getByRole(\"textbox\")", "status": "passed" }, { "step": "app.screenshot after-contention-clears", "status": "passed" }, { "step": "expect.toBeVisible getByText(\"second fixture turn complete\")", "status": "passed" }, { "step": "locator.fill getByRole(\"textbox\")", "status": "passed" }, { "step": "locator.press getByRole(\"textbox\")", "status": "passed" }, { "step": "expect.toHaveCount getByText(\"first fixture turn complete\")", "status": "passed" }, { "step": "app.screenshot subsequent-message-completes", "status": "passed" } ] }, "captures": [ "", "", "", "" ], "videos": [ "", "" ], "markdown": "### Scenario: A claimed turn recovers after a 60 second external database write lock\n\n**Proven: the scenario fails on base `4121b30f78` and passes on head `2b686809eb`.**\n\n| | Base `4121b30f78` | Head `2b686809eb` |\n| --- | --- | --- |\n| Result | ❌ failed
ASSERTION_FAILED: expect.toBeVisible failed
locator: getByText(\"second fixture turn complete\")
expected: visible
observed: no node (match count 0) | ✅ passed |\n| after contention clears | ![Base 4121b30f78: after contention clears](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bfcbebc679c068e5/001-after-contention-clears.png) | ![Head 2b686809eb: after contention clears](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/fed9132adf17a277/001-after-contention-clears.png) |\n| failure | ![Base 4121b30f78: failure](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7ae35bba9b12c81a/002-failure.png) | |\n| subsequent message completes | | ![Head 2b686809eb: subsequent message completes](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/cabbd4a2e6d69b1e/002-subsequent-message-completes.png) |\n", "base": { "sha": "4121b30f78cd68c8aa033c949075ffcd9832be97", "status": "failed", "title": "A claimed turn recovers after a 60 second external database write lock", "message": "ASSERTION_FAILED: expect.toBeVisible failed\nlocator: getByText(\"second fixture turn complete\")\nexpected: visible\nobserved: no node (match count 0)", "steps": [ { "step": "app.open ", "status": "passed" }, { "step": "expect.not.toHaveURL /\\/pair(?:[?#]|$)/", "status": "passed" }, { "step": "app.open /8c2584f9-a885-48d2-a541-89b9728fde72/mcp:f4359789-bdb4-4dd7-9e7a-41f16a9ed8d6", "status": "passed" }, { "step": "locator.fill getByRole(\"textbox\")", "status": "passed" }, { "step": "locator.press getByRole(\"textbox\")", "status": "passed" }, { "step": "app.screenshot after-contention-clears", "status": "passed" }, { "step": "expect.toBeVisible getByText(\"second fixture turn complete\")", "status": "failed" } ], "captures": [ "", "" ], "videos": [ "" ] }, "head": { "sha": "2b686809eb7988292fd4a250ed67e503e69a7ef8", "status": "passed", "title": "A claimed turn recovers after a 60 second external database write lock", "steps": [ { "step": "app.open ", "status": "passed" }, { "step": "expect.not.toHaveURL /\\/pair(?:[?#]|$)/", "status": "passed" }, { "step": "app.open /addcf472-3806-404d-89de-c66b817be4d8/mcp:b65f9075-b45b-45c3-89ae-7d4cecce71a7", "status": "passed" }, { "step": "locator.fill getByRole(\"textbox\")", "status": "passed" }, { "step": "locator.press getByRole(\"textbox\")", "status": "passed" }, { "step": "app.screenshot after-contention-clears", "status": "passed" }, { "step": "expect.toBeVisible getByText(\"second fixture turn complete\")", "status": "passed" }, { "step": "locator.fill getByRole(\"textbox\")", "status": "passed" }, { "step": "locator.press getByRole(\"textbox\")", "status": "passed" }, { "step": "expect.toHaveCount getByText(\"first fixture turn complete\")", "status": "passed" }, { "step": "app.screenshot subsequent-message-completes", "status": "passed" } ], "captures": [ "", "" ], "videos": [ "" ] } }