$ node scripts/prove-scenario.ts scripts/scenarios/socket-loss-same-command.e2e.ts --base 3a8c250cb0c8056f2f563091fd412fe5db809fa1 --head 8ce300064f41c9704e5afcf21d8c1a1a6f1eb667 --upload-command 'ghdrop upload' ⊘ cache disabled Scope: all 42 workspace projects ✓ Lockfile passes supply-chain policies (verified 29m 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: [checkout] Virtual store is at: node_modules/.pnpm Progress: resolved 1077, reused 1077, downloaded 0, added 1062 Packages: +1678 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Progress: resolved 1678, reused 1674, downloaded 0, added 1678, 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 2.7s using pnpm v12.14.0 RUN e2e v0.23.0 [checkout] run 01a1ca08-fb3e-73fd-9e9b-3dc2086807fc · targets: web, ios ✓ target "web" command at http://127.0.0.1:35713/.well-known/t3/environment ready 4.59s ✓ target "ios" command at http://127.0.0.1:8190/status ready 5.72s × |web| scenarios/socket-loss-same-command.e2e.ts > A send survives a lost dispatch and a lost acknowledgement 33.29s → tap did not become actionable in time: locator.click: Timeout 24844ms ex… ❯ |web| scenarios/socket-loss-same-command.e2e.ts (1 test | 1 failed) 33.29s ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Failed Tests 1 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ FAIL |web| scenarios/socket-loss-same-command.e2e.ts > A send survives a lost dispatch and a lost acknowledgement ACTION_FAILED: tap did not become actionable in time: locator.click: Timeout 24844ms exceeded.
  • …
  • intercepts pointer events: getByText("Reconnect proof").first() ❯ at http://127.0.0.1:35713/draft/25989915-e916-4987-a97f-82e7e81a892d ❯ trace .e2e/prove/base/results/socket-loss-same-command-a-send-survives-a-lost-dispatch-0e4c37971b023175/trace.md ❯ video .e2e/prove/base/results/socket-loss-same-command-a-send-survives-a-lost-dispatch-0e4c37971b023175/attempt-1/video/video.webm ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/1]⎯ Test Files 1 failed | 0 passed (1) Tests 1 failed | 0 passed (1) Start at 09:55:49 Duration 44.52s (startup 10.31s) Traces .e2e/prove/base/results/ (1 page, trace.md in each test's directory) Markdown .e2e/prove/base/summary.md Failed × |web| scenarios/socket-loss-same-command.e2e.ts:4 > A send survives a lost dispatch and a lost acknowledgement ACTION_FAILED: tap did not become actionable in time: locator.click: Timeout 24844ms exceeded.
  • …
  • intercepts pointer events: getByText("Reconnect proof").first() trace .e2e/prove/base/results/socket-loss-same-command-a-send-survives-a-lost-dispatch-0e4c37971b023175/trace.md Scope: all 42 workspace projects ✓ Lockfile passes supply-chain policies (verified 30m 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: [checkout] Virtual store is at: node_modules/.pnpm Progress: resolved 1185, reused 1185, downloaded 0, added 1170 Packages: +1678 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Progress: resolved 1678, reused 1674, downloaded 0, added 1678, 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 2.7s using pnpm v12.14.0 RUN e2e v0.23.0 [checkout] run 01a1ca09-cd49-7085-8500-781b72f33b26 · targets: web, ios ✓ target "web" command at http://127.0.0.1:46165/.well-known/t3/environment ready 4.84s ✓ target "ios" command at http://127.0.0.1:8190/status ready 5.90s × |web| scenarios/socket-loss-same-command.e2e.ts > A send survives a lost dispatch and a lost acknowledgement 32.93s → tap did not become actionable in time: locator.click: Timeout 24890ms ex… ❯ |web| scenarios/socket-loss-same-command.e2e.ts (1 test | 1 failed) 32.93s ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Failed Tests 1 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ FAIL |web| scenarios/socket-loss-same-command.e2e.ts > A send survives a lost dispatch and a lost acknowledgement ACTION_FAILED: tap did not become actionable in time: locator.click: Timeout 24890ms exceeded.
  • …
  • intercepts pointer events: getByText("Reconnect proof").first() ❯ at http://127.0.0.1:46165/draft/f0b4f5d8-885d-4af8-8916-f1900ebc2ea2 ❯ trace .e2e/prove/head/results/socket-loss-same-command-a-send-survives-a-lost-dispatch-0e4c37971b023175/trace.md ❯ video .e2e/prove/head/results/socket-loss-same-command-a-send-survives-a-lost-dispatch-0e4c37971b023175/attempt-1/video/video.webm ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/1]⎯ Test Files 1 failed | 0 passed (1) Tests 1 failed | 0 passed (1) Start at 09:56:42 Duration 44.36s (startup 10.75s) Traces .e2e/prove/head/results/ (1 page, trace.md in each test's directory) Markdown .e2e/prove/head/summary.md Failed × |web| scenarios/socket-loss-same-command.e2e.ts:4 > A send survives a lost dispatch and a lost acknowledgement ACTION_FAILED: tap did not become actionable in time: locator.click: Timeout 24890ms exceeded.
  • …
  • intercepts pointer events: getByText("Reconnect proof").first() trace .e2e/prove/head/results/socket-loss-same-command-a-send-survives-a-lost-dispatch-0e4c37971b023175/trace.md { "scenario": "A send survives a lost dispatch and a lost acknowledgement", "failsOnBase": false, "passesOnHead": false, "baseSha": "3a8c250cb0c8056f2f563091fd412fe5db809fa1", "headSha": "8ce300064f41c9704e5afcf21d8c1a1a6f1eb667", "verdict": "Not proven: the scenario could not run on base `3a8c250cb0` (ACTION_FAILED: tap did not become actionable in time: locator.click: Timeout 24844ms exceeded.
  • …
  • intercepts pointer events: getByText(\"Reconnect proof\").first()).", "steps": { "base": [ { "step": "browser.addInitScript function", "status": "passed" }, { "step": "app.open ", "status": "passed" }, { "step": "locator.tap getByText(\"Reconnect proof\").first()", "status": "failed" } ], "head": [ { "step": "browser.addInitScript function", "status": "passed" }, { "step": "app.open ", "status": "passed" }, { "step": "locator.tap getByText(\"Reconnect proof\").first()", "status": "failed" } ] }, "captures": [ "[checkout]", "[checkout]" ], "videos": [ "[checkout]", "[checkout]" ], "markdown": "### Scenario: A send survives a lost dispatch and a lost acknowledgement\n\n**Not proven: the scenario could not run on base `3a8c250cb0` (ACTION_FAILED: tap did not become actionable in time: locator.click: Timeout 24844ms exceeded.
  • …
  • intercepts pointer events: getByText(\"Reconnect proof\").first()).**\n\n| | Base `3a8c250cb0` | Head `8ce300064f` |\n| --- | --- | --- |\n| Result | ⚠️ could not run
    ACTION_FAILED: tap did not become actionable in time: locator.click: Timeout 24844ms exceeded.
  • …
  • intercepts pointer events: getByText(\"Reconnect proof\").first() | ⚠️ could not run
    ACTION_FAILED: tap did not become actionable in time: locator.click: Timeout 24890ms exceeded.
  • …
  • intercepts pointer events: getByText(\"Reconnect proof\").first() |\n| failure | ![Base 3a8c250cb0: failure](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/732ca209a86de491/001-failure.png) | ![Head 8ce300064f: failure](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/cf38fd683bc3bf45/001-failure.png) |\n", "base": { "sha": "3a8c250cb0c8056f2f563091fd412fe5db809fa1", "status": "error", "title": "A send survives a lost dispatch and a lost acknowledgement", "message": "ACTION_FAILED: tap did not become actionable in time: locator.click: Timeout 24844ms exceeded.
  • …
  • intercepts pointer events: getByText(\"Reconnect proof\").first()", "steps": [ { "step": "browser.addInitScript function", "status": "passed" }, { "step": "app.open ", "status": "passed" }, { "step": "locator.tap getByText(\"Reconnect proof\").first()", "status": "failed" } ], "captures": [ "[checkout]" ], "videos": [ "[checkout]" ] }, "head": { "sha": "8ce300064f41c9704e5afcf21d8c1a1a6f1eb667", "status": "error", "title": "A send survives a lost dispatch and a lost acknowledgement", "message": "ACTION_FAILED: tap did not become actionable in time: locator.click: Timeout 24890ms exceeded.
  • …
  • intercepts pointer events: getByText(\"Reconnect proof\").first()", "steps": [ { "step": "browser.addInitScript function", "status": "passed" }, { "step": "app.open ", "status": "passed" }, { "step": "locator.tap getByText(\"Reconnect proof\").first()", "status": "failed" } ], "captures": [ "[checkout]" ], "videos": [ "[checkout]" ] } } $ node scripts/prove-scenario.ts scripts/scenarios/socket-loss-same-command.e2e.ts --base 3a8c250cb0c8056f2f563091fd412fe5db809fa1 --head 8ce300064f41c9704e5afcf21d8c1a1a6f1eb667 --upload-command 'ghdrop upload' ⊘ cache disabled Scope: all 42 workspace projects ✓ Lockfile passes supply-chain policies (verified 31m 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: [checkout] Virtual store is at: node_modules/.pnpm Progress: resolved 1134, reused 1134, downloaded 0, added 1119 Packages: +1678 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Progress: resolved 1678, reused 1674, downloaded 0, added 1678, 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 2.7s using pnpm v12.14.0 RUN e2e v0.23.0 [checkout] run 01a1ca0a-cbe2-7f0a-92ce-cbd51c985832 · targets: web, ios ✓ target "web" command at http://127.0.0.1:35157/.well-known/t3/environment ready 3.50s ✓ target "ios" command at http://127.0.0.1:8190/status ready 4.34s stdout | |web| scenarios/socket-loss-same-command.e2e.ts > A send survives a lost dispatch and a lost acknowledgement Socket proof { mode: '', frames: [ { commandId: '1a896564-4b3d-45a3-aca6-ce8e261eb0e8', text: '' }, { commandId: '63cb36c3-2041-4082-8d2b-a08a8a5e190d', text: '' } ], dropped: 2, connections: 4 } × |web| scenarios/socket-loss-same-command.e2e.ts > A send survives a lost dispatch and a lost acknowledgement 33.82s → expected [false,false] to equal [true,true] ❯ |web| scenarios/socket-loss-same-command.e2e.ts (1 test | 1 failed) 33.82s ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Failed Tests 1 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ FAIL |web| scenarios/socket-loss-same-command.e2e.ts > A send survives a lost dispatch and a lost acknowledgement ASSERTION_FAILED: expected [false,false] to equal [true,true] ❯ scenarios/socket-loss-same-command.e2e.ts:76:19 74| } 75| console.log("Socket proof", await browser.evaluate(() => (window as… 76| expect(results).toEqual([true, true]); | ^ 77| }); 78| ❯ at http://127.0.0.1:35157/3323f92f-43b9-4ebf-a994-0128fcd252a0/mcp%3A5a06e236-66e1-4119-9a74-2b44805bd562 ❯ app 1 error, 1 warning logged × console error: WebSocket connection to 'ws://127.0.0.1:35157/ws?clientSurface=web&clientAppVersion=0.1.8&clientDeviceType=desktop&clientOs=Linux&clientWebDeployment=server&clientBrowser=Chrome&connectionMethod=direct&clientDevice=f1e240fa5f4677fa551b9d3bd342c789a21df1572ea60d09fcab2a1ebdccf102&orchestrationProtoc… ❯ trace .e2e/prove/base/results/socket-loss-same-command-a-send-survives-a-lost-dispatch-0e4c37971b023175/trace.md ❯ video .e2e/prove/base/results/socket-loss-same-command-a-send-survives-a-lost-dispatch-0e4c37971b023175/attempt-1/video/video.webm ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/1]⎯ Test Files 1 failed | 0 passed (1) Tests 1 failed | 0 passed (1) Start at 09:57:47 Duration 42.26s (startup 7.84s) Traces .e2e/prove/base/results/ (1 page, trace.md in each test's directory) Screenshots .e2e/prove/base/results/socket-loss-same-command-a-send-survives-a-lost-dispatch-0e4c37971b023175/attempt-1/screenshots/001-dispatch-loss-recovered.png .e2e/prove/base/results/socket-loss-same-command-a-send-survives-a-lost-dispatch-0e4c37971b023175/attempt-1/screenshots/002-acknowledgement-loss-recovered.png Markdown .e2e/prove/base/summary.md Failed × |web| scenarios/socket-loss-same-command.e2e.ts:76 > A send survives a lost dispatch and a lost acknowledgement ASSERTION_FAILED: expected [false,false] to equal [true,true] trace .e2e/prove/base/results/socket-loss-same-command-a-send-survives-a-lost-dispatch-0e4c37971b023175/trace.md Scope: all 42 workspace projects ✓ Lockfile passes supply-chain policies (verified 32m 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: [checkout] Virtual store is at: node_modules/.pnpm Progress: resolved 1267, reused 1267, downloaded 0, added 1252 Packages: +1678 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Progress: resolved 1678, reused 1674, downloaded 0, added 1678, 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 2.5s using pnpm v12.14.0 RUN e2e v0.23.0 [checkout] run 01a1ca0b-9286-7e10-86e5-7d124260942d · targets: web, ios ✓ target "web" command at http://127.0.0.1:33339/.well-known/t3/environment ready 3.40s ✓ target "ios" command at http://127.0.0.1:8190/status ready 4.46s stdout | |web| scenarios/socket-loss-same-command.e2e.ts > A send survives a lost dispatch and a lost acknowledgement Socket proof { mode: '', frames: [ { commandId: '29c9e9c2-83e8-42e8-b7a5-a1ca55c4f49a', text: 'Deliver this message after connection loss' }, { commandId: '29c9e9c2-83e8-42e8-b7a5-a1ca55c4f49a', text: 'Deliver this message after connection loss' }, { commandId: '9edb98e8-5e42-424d-97cc-13b62b6d928a', text: 'Keep exactly one message after acknowledgement loss' }, { commandId: '9edb98e8-5e42-424d-97cc-13b62b6d928a', text: 'Keep exactly one message after acknowledgement loss' } ], dropped: 2, connections: 4 } ✓ |web| scenarios/socket-loss-same-command.e2e.ts > A send survives a lost dispatch and a lost acknowledgement 32.96s ✓ |web| scenarios/socket-loss-same-command.e2e.ts (1 test) 32.96s Test Files 1 passed (1) Tests 1 passed (1) Start at 09:58:38 Duration 41.47s (startup 7.85s) Traces .e2e/prove/head/results/ (1 page, trace.md in each test's directory) Screenshots .e2e/prove/head/results/socket-loss-same-command-a-send-survives-a-lost-dispatch-0e4c37971b023175/attempt-1/screenshots/001-dispatch-loss-recovered.png .e2e/prove/head/results/socket-loss-same-command-a-send-survives-a-lost-dispatch-0e4c37971b023175/attempt-1/screenshots/002-acknowledgement-loss-recovered.png Markdown .e2e/prove/head/summary.md { "scenario": "A send survives a lost dispatch and a lost acknowledgement", "failsOnBase": true, "passesOnHead": true, "baseSha": "3a8c250cb0c8056f2f563091fd412fe5db809fa1", "headSha": "8ce300064f41c9704e5afcf21d8c1a1a6f1eb667", "verdict": "Proven: the scenario fails on base `3a8c250cb0` and passes on head `8ce300064f`.", "steps": { "base": [ { "step": "browser.addInitScript function", "status": "passed" }, { "step": "app.open ", "status": "passed" }, { "step": "locator.tap getByRole(\"button\", name: \"Reconnect proof, Done, Socket recovery\")", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "locator.fill getByRole(\"textbox\")", "status": "passed" }, { "step": "locator.press getByRole(\"textbox\")", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "app.screenshot dispatch-loss-recovered", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "locator.fill getByRole(\"textbox\")", "status": "passed" }, { "step": "locator.press getByRole(\"textbox\")", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "app.screenshot acknowledgement-loss-recovered", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" } ], "head": [ { "step": "browser.addInitScript function", "status": "passed" }, { "step": "app.open ", "status": "passed" }, { "step": "locator.tap getByRole(\"button\", name: \"Reconnect proof, Done, Socket recovery\")", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "locator.fill getByRole(\"textbox\")", "status": "passed" }, { "step": "locator.press getByRole(\"textbox\")", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "app.screenshot dispatch-loss-recovered", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "locator.fill getByRole(\"textbox\")", "status": "passed" }, { "step": "locator.press getByRole(\"textbox\")", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "app.screenshot acknowledgement-loss-recovered", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" } ] }, "captures": [ "[checkout]", "[checkout]", "[checkout]", "[checkout]", "[checkout]" ], "videos": [ "[checkout]", "[checkout]" ], "markdown": "### Scenario: A send survives a lost dispatch and a lost acknowledgement\n\n**Proven: the scenario fails on base `3a8c250cb0` and passes on head `8ce300064f`.**\n\n| | Base `3a8c250cb0` | Head `8ce300064f` |\n| --- | --- | --- |\n| Result | ❌ failed
    ASSERTION_FAILED: expected [false,false] to equal [true,true] | ✅ passed |\n| dispatch loss recovered | ![Base 3a8c250cb0: dispatch loss recovered](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/681c09bea3d55989/001-dispatch-loss-recovered.png) | ![Head 8ce300064f: dispatch loss recovered](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/fe763a368defc52d/001-dispatch-loss-recovered.png) |\n| acknowledgement loss recovered | ![Base 3a8c250cb0: acknowledgement loss recovered](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7d1f2b1cad0a04ee/002-acknowledgement-loss-recovered.png) | ![Head 8ce300064f: acknowledgement loss recovered](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/18ac2417feb188a5/002-acknowledgement-loss-recovered.png) |\n| failure | ![Base 3a8c250cb0: failure](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7839ebc4dc09699c/003-failure.png) | |\n", "base": { "sha": "3a8c250cb0c8056f2f563091fd412fe5db809fa1", "status": "failed", "title": "A send survives a lost dispatch and a lost acknowledgement", "message": "ASSERTION_FAILED: expected [false,false] to equal [true,true]", "steps": [ { "step": "browser.addInitScript function", "status": "passed" }, { "step": "app.open ", "status": "passed" }, { "step": "locator.tap getByRole(\"button\", name: \"Reconnect proof, Done, Socket recovery\")", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "locator.fill getByRole(\"textbox\")", "status": "passed" }, { "step": "locator.press getByRole(\"textbox\")", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "app.screenshot dispatch-loss-recovered", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "locator.fill getByRole(\"textbox\")", "status": "passed" }, { "step": "locator.press getByRole(\"textbox\")", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "app.screenshot acknowledgement-loss-recovered", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" } ], "captures": [ "[checkout]", "[checkout]", "[checkout]" ], "videos": [ "[checkout]" ] }, "head": { "sha": "8ce300064f41c9704e5afcf21d8c1a1a6f1eb667", "status": "passed", "title": "A send survives a lost dispatch and a lost acknowledgement", "steps": [ { "step": "browser.addInitScript function", "status": "passed" }, { "step": "app.open ", "status": "passed" }, { "step": "locator.tap getByRole(\"button\", name: \"Reconnect proof, Done, Socket recovery\")", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "locator.fill getByRole(\"textbox\")", "status": "passed" }, { "step": "locator.press getByRole(\"textbox\")", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "app.screenshot dispatch-loss-recovered", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "locator.fill getByRole(\"textbox\")", "status": "passed" }, { "step": "locator.press getByRole(\"textbox\")", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "app.screenshot acknowledgement-loss-recovered", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" } ], "captures": [ "[checkout]", "[checkout]" ], "videos": [ "[checkout]" ] } } $ node scripts/prove-scenario.ts scripts/scenarios/socket-loss-same-command.e2e.ts --base 3a8c250cb0c8056f2f563091fd412fe5db809fa1 --head 8ce300064f41c9704e5afcf21d8c1a1a6f1eb667 --upload-command 'ghdrop upload' ⊘ cache disabled Scope: all 42 workspace projects ✓ Lockfile passes supply-chain policies (verified 34m 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: [checkout] Virtual store is at: node_modules/.pnpm Progress: resolved 1144, reused 1144, downloaded 0, added 1129 Packages: +1678 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Progress: resolved 1678, reused 1674, downloaded 0, added 1678, 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 2.6s using pnpm v12.14.0 RUN e2e v0.23.0 [checkout] run 01a1ca0d-1d6e-7a12-b897-e6941ef90f93 · targets: web, ios ✓ target "web" command at http://127.0.0.1:44749/.well-known/t3/environment ready 2.67s ✓ target "ios" command at http://127.0.0.1:8190/status ready 4.49s × |web| scenarios/socket-loss-same-command.e2e.ts > A send survives a lost dispatch and a lost acknowledgement 39.56s → expected [0,1] to equal [1,1] ❯ |web| scenarios/socket-loss-same-command.e2e.ts (1 test | 1 failed) 39.56s ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Failed Tests 1 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ FAIL |web| scenarios/socket-loss-same-command.e2e.ts > A send survives a lost dispatch and a lost acknowledgement ASSERTION_FAILED: expected [0,1] to equal [1,1] ❯ scenarios/socket-loss-same-command.e2e.ts:86:19 84| }); 85| await writeFile(`[scratch] 86| expect(durable).toEqual([1, 1]); | ^ 87| expect(results).toEqual([true, true]); 88| }); ❯ at http://127.0.0.1:44749/0abf388d-f11e-40a2-bcea-88745a1f04f1/mcp%3A44fb0e60-f945-4bd6-a107-83ae91e8c392 ❯ app 2 warnings logged ❯ trace .e2e/prove/base/results/socket-loss-same-command-a-send-survives-a-lost-dispatch-0e4c37971b023175/trace.md ❯ video .e2e/prove/base/results/socket-loss-same-command-a-send-survives-a-lost-dispatch-0e4c37971b023175/attempt-1/video/video.webm ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/1]⎯ Test Files 1 failed | 0 passed (1) Tests 1 failed | 0 passed (1) Start at 10:00:19 Duration 47.30s (startup 7.16s) Traces .e2e/prove/base/results/ (1 page, trace.md in each test's directory) Screenshots .e2e/prove/base/results/socket-loss-same-command-a-send-survives-a-lost-dispatch-0e4c37971b023175/attempt-1/screenshots/001-dispatch-loss-recovered.png .e2e/prove/base/results/socket-loss-same-command-a-send-survives-a-lost-dispatch-0e4c37971b023175/attempt-1/screenshots/002-acknowledgement-loss-recovered.png .e2e/prove/base/results/socket-loss-same-command-a-send-survives-a-lost-dispatch-0e4c37971b023175/attempt-1/screenshots/003-durable-after-reload.png Markdown .e2e/prove/base/summary.md Failed × |web| scenarios/socket-loss-same-command.e2e.ts:86 > A send survives a lost dispatch and a lost acknowledgement ASSERTION_FAILED: expected [0,1] to equal [1,1] trace .e2e/prove/base/results/socket-loss-same-command-a-send-survives-a-lost-dispatch-0e4c37971b023175/trace.md Scope: all 42 workspace projects ✓ Lockfile passes supply-chain policies (verified 35m 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: [checkout] Virtual store is at: node_modules/.pnpm Progress: resolved 1224, reused 1224, downloaded 0, added 1209 Packages: +1678 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Progress: resolved 1678, reused 1674, downloaded 0, added 1678, 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 2.6s using pnpm v12.14.0 RUN e2e v0.23.0 [checkout] run 01a1ca0d-fb94-73cb-b0a6-69c2ac327d83 · targets: web, ios ✓ target "web" command at http://127.0.0.1:40523/.well-known/t3/environment ready 3.54s ✓ target "ios" command at http://127.0.0.1:8190/status ready 4.92s ✓ |web| scenarios/socket-loss-same-command.e2e.ts > A send survives a lost dispatch and a lost acknowledgement 41.83s ✓ |web| scenarios/socket-loss-same-command.e2e.ts (1 test) 41.83s Test Files 1 passed (1) Tests 1 passed (1) Start at 10:01:16 Duration 50.96s (startup 8.47s) Traces .e2e/prove/head/results/ (1 page, trace.md in each test's directory) Screenshots .e2e/prove/head/results/socket-loss-same-command-a-send-survives-a-lost-dispatch-0e4c37971b023175/attempt-1/screenshots/001-dispatch-loss-recovered.png .e2e/prove/head/results/socket-loss-same-command-a-send-survives-a-lost-dispatch-0e4c37971b023175/attempt-1/screenshots/002-acknowledgement-loss-recovered.png .e2e/prove/head/results/socket-loss-same-command-a-send-survives-a-lost-dispatch-0e4c37971b023175/attempt-1/screenshots/003-durable-after-reload.png Markdown .e2e/prove/head/summary.md { "scenario": "A send survives a lost dispatch and a lost acknowledgement", "failsOnBase": true, "passesOnHead": true, "baseSha": "3a8c250cb0c8056f2f563091fd412fe5db809fa1", "headSha": "8ce300064f41c9704e5afcf21d8c1a1a6f1eb667", "verdict": "Proven: the scenario fails on base `3a8c250cb0` and passes on head `8ce300064f`.", "steps": { "base": [ { "step": "browser.addInitScript function", "status": "passed" }, { "step": "app.open ", "status": "passed" }, { "step": "locator.tap getByRole(\"button\", name: \"Reconnect proof, Done, Socket recovery\")", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "locator.fill getByRole(\"textbox\")", "status": "passed" }, { "step": "locator.press getByRole(\"textbox\")", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "app.screenshot dispatch-loss-recovered", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "locator.fill getByRole(\"textbox\")", "status": "passed" }, { "step": "locator.press getByRole(\"textbox\")", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "app.screenshot acknowledgement-loss-recovered", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "app.open /0abf388d-f11e-40a2-bcea-88745a1f04f1/mcp%3A44fb0e60-f945-4bd6-a107-83ae91e8c392", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "app.screenshot durable-after-reload", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" } ], "head": [ { "step": "browser.addInitScript function", "status": "passed" }, { "step": "app.open ", "status": "passed" }, { "step": "locator.tap getByRole(\"button\", name: \"Reconnect proof, Done, Socket recovery\")", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "locator.fill getByRole(\"textbox\")", "status": "passed" }, { "step": "locator.press getByRole(\"textbox\")", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "app.screenshot dispatch-loss-recovered", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "locator.fill getByRole(\"textbox\")", "status": "passed" }, { "step": "locator.press getByRole(\"textbox\")", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "app.screenshot acknowledgement-loss-recovered", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "app.open /701db498-15bd-4cff-a7ae-265ed9dc4e18/mcp%3A7839440b-a110-4811-af86-ad2efe8bc389", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "app.screenshot durable-after-reload", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" } ] }, "captures": [ "[checkout]", "[checkout]", "[checkout]", "[checkout]", "[checkout]", "[checkout]", "[checkout]" ], "videos": [ "[checkout]", "[checkout]" ], "markdown": "### Scenario: A send survives a lost dispatch and a lost acknowledgement\n\n**Proven: the scenario fails on base `3a8c250cb0` and passes on head `8ce300064f`.**\n\n| | Base `3a8c250cb0` | Head `8ce300064f` |\n| --- | --- | --- |\n| Result | ❌ failed
    ASSERTION_FAILED: expected [0,1] to equal [1,1] | ✅ passed |\n| dispatch loss recovered | ![Base 3a8c250cb0: dispatch loss recovered](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c26fb32857e63f7b/001-dispatch-loss-recovered.png) | ![Head 8ce300064f: dispatch loss recovered](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f5e74805fcd9bdf7/001-dispatch-loss-recovered.png) |\n| acknowledgement loss recovered | ![Base 3a8c250cb0: acknowledgement loss recovered](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2ddb60029a73e0fc/002-acknowledgement-loss-recovered.png) | ![Head 8ce300064f: acknowledgement loss recovered](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/62601b0439c4255c/002-acknowledgement-loss-recovered.png) |\n| durable after reload | ![Base 3a8c250cb0: durable after reload](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bc8af1185beaed2e/003-durable-after-reload.png) | ![Head 8ce300064f: durable after reload](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9ecff951958a129b/003-durable-after-reload.png) |\n| failure | ![Base 3a8c250cb0: failure](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/49083f83eaf7f067/004-failure.png) | |\n", "base": { "sha": "3a8c250cb0c8056f2f563091fd412fe5db809fa1", "status": "failed", "title": "A send survives a lost dispatch and a lost acknowledgement", "message": "ASSERTION_FAILED: expected [0,1] to equal [1,1]", "steps": [ { "step": "browser.addInitScript function", "status": "passed" }, { "step": "app.open ", "status": "passed" }, { "step": "locator.tap getByRole(\"button\", name: \"Reconnect proof, Done, Socket recovery\")", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "locator.fill getByRole(\"textbox\")", "status": "passed" }, { "step": "locator.press getByRole(\"textbox\")", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "app.screenshot dispatch-loss-recovered", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "locator.fill getByRole(\"textbox\")", "status": "passed" }, { "step": "locator.press getByRole(\"textbox\")", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "app.screenshot acknowledgement-loss-recovered", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "app.open /0abf388d-f11e-40a2-bcea-88745a1f04f1/mcp%3A44fb0e60-f945-4bd6-a107-83ae91e8c392", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "app.screenshot durable-after-reload", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" } ], "captures": [ "[checkout]", "[checkout]", "[checkout]", "[checkout]" ], "videos": [ "[checkout]" ] }, "head": { "sha": "8ce300064f41c9704e5afcf21d8c1a1a6f1eb667", "status": "passed", "title": "A send survives a lost dispatch and a lost acknowledgement", "steps": [ { "step": "browser.addInitScript function", "status": "passed" }, { "step": "app.open ", "status": "passed" }, { "step": "locator.tap getByRole(\"button\", name: \"Reconnect proof, Done, Socket recovery\")", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "locator.fill getByRole(\"textbox\")", "status": "passed" }, { "step": "locator.press getByRole(\"textbox\")", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "app.screenshot dispatch-loss-recovered", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "locator.fill getByRole(\"textbox\")", "status": "passed" }, { "step": "locator.press getByRole(\"textbox\")", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "app.screenshot acknowledgement-loss-recovered", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "app.open /701db498-15bd-4cff-a7ae-265ed9dc4e18/mcp%3A7839440b-a110-4811-af86-ad2efe8bc389", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "app.screenshot durable-after-reload", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" } ], "captures": [ "[checkout]", "[checkout]", "[checkout]" ], "videos": [ "[checkout]" ] } }