$ 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 |  |  |\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 |  |  |\n| acknowledgement loss recovered |  |  |\n| failure |  | |\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 |  |  |\n| acknowledgement loss recovered |  |  |\n| durable after reload |  |  |\n| failure |  | |\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]"
]
}
}