prove.log $ node scripts/prove-scenario.ts scripts/scenarios/tailscale-client-address.e2e.ts --base cf82fb858458be25daeccf811f213d6ed73979f1 --head 2358fe0591d6a80d9efde973024e92d5e35665cc --upload-command 'ghdrop upload' ⊘ cache disabled Scope: all 42 workspace projects ✓ Lockfile passes supply-chain policies (verified 30s 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 51, reused 51, downloaded 0, added 36 Progress: resolved 84, reused 84, downloaded 0, added 69 Progress: resolved 116, reused 116, downloaded 0, added 101 Progress: resolved 148, reused 148, downloaded 0, added 133 Progress: resolved 169, reused 169, downloaded 0, added 154 Progress: resolved 194, reused 194, downloaded 0, added 179 Progress: resolved 814, reused 814, downloaded 0, added 799 Progress: resolved 1581, reused 1581, downloaded 0, added 1567 Packages: +1779 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Progress: resolved 1779, reused 1775, downloaded 0, added 1779, done .../esbuild@0.28.2/node_modules/esbuild postinstall$ node install.js .../node_modules/node-pty install$ node scripts/prebuild.js || node-gyp rebuild .../react-native-enriched-markdown postinstall$ node postinstall.mjs .../node_modules/node-pty install: > Checking prebuilds... .../node_modules/node-pty install: Done .../node_modules/node-pty postinstall$ node scripts/post-install.js .../node_modules/node-pty postinstall: > Cleaning release folder... .../node_modules/node-pty postinstall: > Moving conpty.dll... .../node_modules/node-pty postinstall: SKIPPED (not Windows) .../node_modules/node-pty postinstall: Done .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] restoring vendored native assets ... .../esbuild@0.28.2/node_modules/esbuild postinstall: Done .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] fetching runtime v0.26.3 from https://github.com/tree-sitter/tree-sitter/archive/refs/tags/v0.26.3.tar.gz .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] runtime -> react-native-enriched-markdown/cpp/highlight/vendor/tree-sitter/src .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-json@0.24.8 ... .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-html@0.23.2 ... .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-css@0.23.2 ... .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading @tree-sitter-grammars/tree-sitter-markdown@0.3.2 ... .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading @tree-sitter-grammars/tree-sitter-yaml@0.7.1 ... .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-go@0.23.4 ... .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-java@0.23.5 ... .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-javascript@0.23.1 ... .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-python@0.23.6 ... .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-c@0.23.5 ... .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-rust@0.23.2 ... .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-bash@0.23.3 ... .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-typescript@0.23.2 ... .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-cpp@0.23.4 ... .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-swift@0.7.0 ... .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-php@0.24.2 ... .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-ruby@0.23.1 ... .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-c-sharp@0.23.1 ... .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] json -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/json .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] html -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/html .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] css -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/css .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] markdown -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/markdown .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] yaml -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/yaml .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] go -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/go .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] java -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/java .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] javascript -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/javascript .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] python -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/python .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] c -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/c .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] rust -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/rust .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] bash -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/bash .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] typescript -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/typescript .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] tsx -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/tsx .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] cpp -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/cpp .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] swift -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/swift .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] php -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/php .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] ruby -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/ruby .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] c-sharp -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/c-sharp .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] grammar sources ready. .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] done. .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] fetching xcframework from https://github.com/erweixin/RaTeX/releases/download/v0.1.15/RaTeX.xcframework.zip .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] fetching source from https://github.com/erweixin/RaTeX/archive/refs/tags/v0.1.15.tar.gz .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] RaTeX v0.1.15 -> .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] done. .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] postinstall complete. .../react-native-enriched-markdown postinstall: 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 15.3s using pnpm v12.14.0 RUN e2e v0.23.0 run 01a1d182-e79f-796a-be7c-bce6bbcf93ae · targets: web, ios ✓ target "web" command at http://127.0.0.1:36009/.well-known/t3/environment ready 6.52s ✓ target "ios" command at http://127.0.0.1:8190/status ready 6.78s × |web| scenarios/tailscale-client-address.e2e.ts > Authorized clients preserves the paired phone's Tailscale address 33.21s → locator matched no nodes within getByText("Authorized clients") ❯ |web| scenarios/tailscale-client-address.e2e.ts (1 test | 1 failed) 33.21s ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Failed Tests 1 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ FAIL |web| scenarios/tailscale-client-address.e2e.ts > Authorized clients preserves the paired phone's Tailscale address LOCATOR_NOT_FOUND: locator matched no nodes within getByText("Authorized clients") ❯ scenarios/tailscale-client-address.e2e.ts:24:3 22| if (response.status !== 200 || !response.headers.get("set-cookie"))… 23| await t3.open("/settings/access"); 24| await screen.getByText("Authorized clients", { exact: true }).tap(); | ^ 25| await screen.getByText("iOS", { exact: false }).first().waitFor({ s… 26| await app.screenshot("authorized-clients"); ❯ at http://127.0.0.1:36009/pair ❯ app 5 errors, 5 warnings logged × console error: WebSocket connection to 'ws://127.0.0.1:36009/ws?clientSurface=web&clientAppVersion=0.1.9&clientDeviceType=desktop&clientOs=Linux&clientWebDeployment=server&clientBrowser=Chrome&connectionMethod=direct&clientDevice=ff6a19e1c1630eda10949d17c2492656eb03e2ddffd9cb9af6533f82ab7ae69e&orchestrationProtoc… × console error: WebSocket connection to 'ws://127.0.0.1:36009/ws?clientSurface=web&clientAppVersion=0.1.9&clientDeviceType=desktop&clientOs=Linux&clientWebDeployment=server&clientBrowser=Chrome&connectionMethod=direct&clientDevice=ff6a19e1c1630eda10949d17c2492656eb03e2ddffd9cb9af6533f82ab7ae69e&orchestrationProtoc… × console error: WebSocket connection to 'ws://127.0.0.1:36009/ws?clientSurface=web&clientAppVersion=0.1.9&clientDeviceType=desktop&clientOs=Linux&clientWebDeployment=server&clientBrowser=Chrome&connectionMethod=direct&clientDevice=ff6a19e1c1630eda10949d17c2492656eb03e2ddffd9cb9af6533f82ab7ae69e&orchestrationProtoc… 2 more app errors logged ❯ trace .e2e/prove/base/results/tailscale-client-address-authorized-clients-preserves-the-8e1688a24d679702/trace.md ❯ video .e2e/prove/base/results/tailscale-client-address-authorized-clients-preserves-the-8e1688a24d679702/attempt-1/video/video.webm ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/1]⎯ Test Files 1 failed | 0 passed (1) Tests 1 failed | 0 passed (1) Start at 20:46:21 Duration 47.39s (startup 13.30s) Traces .e2e/prove/base/results/ (1 page, trace.md in each test's directory) Markdown .e2e/prove/base/summary.md Failed × |web| scenarios/tailscale-client-address.e2e.ts:24 > Authorized clients preserves the paired phone's Tailscale address LOCATOR_NOT_FOUND: locator matched no nodes within getByText("Authorized clients") trace .e2e/prove/base/results/tailscale-client-address-authorized-clients-preserves-the-8e1688a24d679702/trace.md Scope: all 42 workspace projects ✓ Lockfile passes supply-chain policies (verified 1m 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 1068, reused 1068, downloaded 0, added 1053 Progress: resolved 1756, reused 1755, downloaded 0, added 1745 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 01a1d183-e613-7556-926c-6233225fb226 · targets: web, ios ✓ target "web" command at http://127.0.0.1:40053/.well-known/t3/environment ready 5.96s ✓ target "ios" command at http://127.0.0.1:8190/status ready 6.08s ✓ |web| scenarios/tailscale-client-address.e2e.ts > Authorized clients preserves the paired phone's Tailscale address 9.76s ✓ |web| scenarios/tailscale-client-address.e2e.ts (1 test) 9.76s Test Files 1 passed (1) Tests 1 passed (1) Start at 20:47:25 Duration 22.60s (startup 12.04s) Traces .e2e/prove/head/results/ (1 page, trace.md in each test's directory) Screenshots .e2e/prove/head/results/tailscale-client-address-authorized-clients-preserves-the-8e1688a24d679702/attempt-1/screenshots/001-authorized-clients.png Markdown .e2e/prove/head/summary.md { "scenario": "Authorized clients preserves the paired phone's Tailscale address", "failsOnBase": false, "passesOnHead": true, "baseSha": "cf82fb858458be25daeccf811f213d6ed73979f1", "headSha": "2358fe0591d6a80d9efde973024e92d5e35665cc", "verdict": "Not proven: the scenario could not run on base `cf82fb8584` (LOCATOR_NOT_FOUND: locator matched no nodes within getByText(\"Authorized clients\")).", "steps": { "base": [ { "step": "app.open ", "status": "passed" }, { "step": "app.open /settings/access", "status": "passed" }, { "step": "locator.tap getByText(\"Authorized clients\")", "status": "failed" } ], "head": [ { "step": "app.open ", "status": "passed" }, { "step": "locator.waitFor getByText(\"Pairing evidence\").first() → visible", "status": "passed" }, { "step": "app.open /settings/access", "status": "passed" }, { "step": "locator.tap getByText(\"Authorized clients\")", "status": "passed" }, { "step": "locator.waitFor getByText(\"iOS\").first() → visible", "status": "passed" }, { "step": "app.screenshot authorized-clients", "status": "passed" }, { "step": "expect.toBeVisible getByText(\"100.64.0.2\")", "status": "passed" } ] }, "captures": [ "", "" ], "videos": [ "", "" ], "markdown": "### Scenario: Authorized clients preserves the paired phone's Tailscale address\n\n**Not proven: the scenario could not run on base `cf82fb8584` (LOCATOR_NOT_FOUND: locator matched no nodes within getByText(\"Authorized clients\")).**\n\n| | Base `cf82fb8584` | Head `2358fe0591` |\n| --- | --- | --- |\n| Result | ⚠️ could not run
LOCATOR_NOT_FOUND: locator matched no nodes within getByText(\"Authorized clients\") | ✅ passed |\n| failure | ![Base cf82fb8584: failure](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/700b980d4e44a5a3/001-failure.png) | |\n| authorized clients | | ![Head 2358fe0591: authorized clients](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/56d3ce0c80971025/001-authorized-clients.png) |\n", "base": { "sha": "cf82fb858458be25daeccf811f213d6ed73979f1", "status": "error", "title": "Authorized clients preserves the paired phone's Tailscale address", "message": "LOCATOR_NOT_FOUND: locator matched no nodes within getByText(\"Authorized clients\")", "steps": [ { "step": "app.open ", "status": "passed" }, { "step": "app.open /settings/access", "status": "passed" }, { "step": "locator.tap getByText(\"Authorized clients\")", "status": "failed" } ], "captures": [ "" ], "videos": [ "" ] }, "head": { "sha": "2358fe0591d6a80d9efde973024e92d5e35665cc", "status": "passed", "title": "Authorized clients preserves the paired phone's Tailscale address", "steps": [ { "step": "app.open ", "status": "passed" }, { "step": "locator.waitFor getByText(\"Pairing evidence\").first() → visible", "status": "passed" }, { "step": "app.open /settings/access", "status": "passed" }, { "step": "locator.tap getByText(\"Authorized clients\")", "status": "passed" }, { "step": "locator.waitFor getByText(\"iOS\").first() → visible", "status": "passed" }, { "step": "app.screenshot authorized-clients", "status": "passed" }, { "step": "expect.toBeVisible getByText(\"100.64.0.2\")", "status": "passed" } ], "captures": [ "" ], "videos": [ "" ] } } prove-retry.log $ node scripts/prove-scenario.ts scripts/scenarios/tailscale-client-address.e2e.ts --base cf82fb858458be25daeccf811f213d6ed73979f1 --head 2358fe0591d6a80d9efde973024e92d5e35665cc --upload-command 'ghdrop upload' ⊘ cache disabled Scope: all 42 workspace projects ✓ Lockfile passes supply-chain policies (verified 2m 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 1350, reused 1350, downloaded 0, added 1335 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 3s using pnpm v12.14.0 RUN e2e v0.23.0 run 01a1d184-a42e-7879-b22c-63bce76e3e1c · targets: web, ios ✓ target "web" command at http://127.0.0.1:35687/.well-known/t3/environment ready 4.30s ✓ target "ios" command at http://127.0.0.1:8190/status ready 5.55s × |web| scenarios/tailscale-client-address.e2e.ts > Authorized clients preserves the paired phone's Tailscale address 26.16s → expect.toBeVisible failed ❯ |web| scenarios/tailscale-client-address.e2e.ts (1 test | 1 failed) 26.16s ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Failed Tests 1 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ FAIL |web| scenarios/tailscale-client-address.e2e.ts > Authorized clients preserves the paired phone's Tailscale address ASSERTION_FAILED: expect.toBeVisible failed locator: getByText("100.64.0.2") expected: visible observed: no node (match count 0) ❯ scenarios/tailscale-client-address.e2e.ts:30:3 28| await screen.getByText("iOS", { exact: false }).first().waitFor({ s… 29| await app.screenshot("authorized-clients"); 30| await expect(screen.getByText("100.64.0.2", { exact: false })).toBe… | ^ 31| }); 32| ❯ at http://127.0.0.1:35687/settings/access ❯ trace .e2e/prove/base/results/tailscale-client-address-authorized-clients-preserves-the-8e1688a24d679702/trace.md ❯ video .e2e/prove/base/results/tailscale-client-address-authorized-clients-preserves-the-8e1688a24d679702/attempt-1/video/video.webm ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/1]⎯ Test Files 1 failed | 0 passed (1) Tests 1 failed | 0 passed (1) Start at 20:48:13 Duration 36.72s (startup 9.86s) Traces .e2e/prove/base/results/ (1 page, trace.md in each test's directory) Screenshots .e2e/prove/base/results/tailscale-client-address-authorized-clients-preserves-the-8e1688a24d679702/attempt-1/screenshots/001-authorized-clients.png Markdown .e2e/prove/base/summary.md Failed × |web| scenarios/tailscale-client-address.e2e.ts:30 > Authorized clients preserves the paired phone's Tailscale address ASSERTION_FAILED: expect.toBeVisible failed trace .e2e/prove/base/results/tailscale-client-address-authorized-clients-preserves-the-8e1688a24d679702/trace.md Scope: all 42 workspace projects ✓ Lockfile passes supply-chain policies (verified 3m 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 1264, reused 1264, downloaded 0, added 1249 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 3.1s using pnpm v12.14.0 RUN e2e v0.23.0 run 01a1d185-5deb-77ba-ae3d-608e46054f2d · targets: web, ios ✓ target "web" command at http://127.0.0.1:34029/.well-known/t3/environment ready 5.60s ✓ target "ios" command at http://127.0.0.1:8190/status ready 6.51s ✓ |web| scenarios/tailscale-client-address.e2e.ts > Authorized clients preserves the paired phone's Tailscale address 9.92s ✓ |web| scenarios/tailscale-client-address.e2e.ts (1 test) 9.92s Test Files 1 passed (1) Tests 1 passed (1) Start at 20:49:01 Duration 22.88s (startup 12.11s) Traces .e2e/prove/head/results/ (1 page, trace.md in each test's directory) Screenshots .e2e/prove/head/results/tailscale-client-address-authorized-clients-preserves-the-8e1688a24d679702/attempt-1/screenshots/001-authorized-clients.png Markdown .e2e/prove/head/summary.md { "scenario": "Authorized clients preserves the paired phone's Tailscale address", "failsOnBase": true, "passesOnHead": true, "baseSha": "cf82fb858458be25daeccf811f213d6ed73979f1", "headSha": "2358fe0591d6a80d9efde973024e92d5e35665cc", "verdict": "Proven: the scenario fails on base `cf82fb8584` and passes on head `2358fe0591`.", "steps": { "base": [ { "step": "app.open ", "status": "passed" }, { "step": "locator.waitFor getByText(\"Pairing evidence\").first() → visible", "status": "passed" }, { "step": "app.open /settings/access", "status": "passed" }, { "step": "locator.tap getByText(\"Authorized clients\")", "status": "passed" }, { "step": "locator.waitFor getByText(\"iOS\").first() → visible", "status": "passed" }, { "step": "app.screenshot authorized-clients", "status": "passed" }, { "step": "expect.toBeVisible getByText(\"100.64.0.2\")", "status": "failed" } ], "head": [ { "step": "app.open ", "status": "passed" }, { "step": "locator.waitFor getByText(\"Pairing evidence\").first() → visible", "status": "passed" }, { "step": "app.open /settings/access", "status": "passed" }, { "step": "locator.tap getByText(\"Authorized clients\")", "status": "passed" }, { "step": "locator.waitFor getByText(\"iOS\").first() → visible", "status": "passed" }, { "step": "app.screenshot authorized-clients", "status": "passed" }, { "step": "expect.toBeVisible getByText(\"100.64.0.2\")", "status": "passed" } ] }, "captures": [ "", "", "" ], "videos": [ "", "" ], "markdown": "### Scenario: Authorized clients preserves the paired phone's Tailscale address\n\n**Proven: the scenario fails on base `cf82fb8584` and passes on head `2358fe0591`.**\n\n| | Base `cf82fb8584` | Head `2358fe0591` |\n| --- | --- | --- |\n| Result | ❌ failed
ASSERTION_FAILED: expect.toBeVisible failed
locator: getByText(\"100.64.0.2\")
expected: visible
observed: no node (match count 0) | ✅ passed |\n| authorized clients | ![Base cf82fb8584: authorized clients](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/43c73256e38ea442/001-authorized-clients.png) | ![Head 2358fe0591: authorized clients](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a52344ba1b8fdcd4/001-authorized-clients.png) |\n| failure | ![Base cf82fb8584: failure](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d204d94ff5250e15/002-failure.png) | |\n", "base": { "sha": "cf82fb858458be25daeccf811f213d6ed73979f1", "status": "failed", "title": "Authorized clients preserves the paired phone's Tailscale address", "message": "ASSERTION_FAILED: expect.toBeVisible failed\nlocator: getByText(\"100.64.0.2\")\nexpected: visible\nobserved: no node (match count 0)", "steps": [ { "step": "app.open ", "status": "passed" }, { "step": "locator.waitFor getByText(\"Pairing evidence\").first() → visible", "status": "passed" }, { "step": "app.open /settings/access", "status": "passed" }, { "step": "locator.tap getByText(\"Authorized clients\")", "status": "passed" }, { "step": "locator.waitFor getByText(\"iOS\").first() → visible", "status": "passed" }, { "step": "app.screenshot authorized-clients", "status": "passed" }, { "step": "expect.toBeVisible getByText(\"100.64.0.2\")", "status": "failed" } ], "captures": [ "", "" ], "videos": [ "" ] }, "head": { "sha": "2358fe0591d6a80d9efde973024e92d5e35665cc", "status": "passed", "title": "Authorized clients preserves the paired phone's Tailscale address", "steps": [ { "step": "app.open ", "status": "passed" }, { "step": "locator.waitFor getByText(\"Pairing evidence\").first() → visible", "status": "passed" }, { "step": "app.open /settings/access", "status": "passed" }, { "step": "locator.tap getByText(\"Authorized clients\")", "status": "passed" }, { "step": "locator.waitFor getByText(\"iOS\").first() → visible", "status": "passed" }, { "step": "app.screenshot authorized-clients", "status": "passed" }, { "step": "expect.toBeVisible getByText(\"100.64.0.2\")", "status": "passed" } ], "captures": [ "" ], "videos": [ "" ] } } prove-captures.log $ node scripts/prove-scenario.ts scripts/scenarios/tailscale-client-address.e2e.ts --base cf82fb858458be25daeccf811f213d6ed73979f1 --head 2358fe0591d6a80d9efde973024e92d5e35665cc --upload-command 'ghdrop upload' ⊘ cache disabled Scope: all 42 workspace projects ✓ Lockfile passes supply-chain policies (verified 4m 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 1413, reused 1413, downloaded 0, added 1396 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 2.7s using pnpm v12.14.0 RUN e2e v0.23.0 run 01a1d186-8848-74df-95c6-95ce057a1699 · targets: web, ios ✓ target "web" command at http://127.0.0.1:36175/.well-known/t3/environment ready 4.37s ✓ target "ios" command at http://127.0.0.1:8190/status ready 5.66s × |web| scenarios/tailscale-client-address.e2e.ts > Authorized clients preserves the paired phone's Tailscale address 26.14s → expect.toBeVisible failed ❯ |web| scenarios/tailscale-client-address.e2e.ts (1 test | 1 failed) 26.14s ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Failed Tests 1 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ FAIL |web| scenarios/tailscale-client-address.e2e.ts > Authorized clients preserves the paired phone's Tailscale address ASSERTION_FAILED: expect.toBeVisible failed locator: getByText("100.64.0.2") expected: visible observed: no node (match count 0) ❯ scenarios/tailscale-client-address.e2e.ts:45:3 43| }); 44| await app.screenshot("authorized-clients"); 45| await expect(screen.getByText("100.64.0.2", { exact: false })).toBe… | ^ 46| }); 47| ❯ at http://127.0.0.1:36175/settings/access ❯ trace .e2e/prove/base/results/tailscale-client-address-authorized-clients-preserves-the-8e1688a24d679702/trace.md ❯ video .e2e/prove/base/results/tailscale-client-address-authorized-clients-preserves-the-8e1688a24d679702/attempt-1/video/video.webm ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/1]⎯ Test Files 1 failed | 0 passed (1) Tests 1 failed | 0 passed (1) Start at 20:50:17 Duration 36.93s (startup 10.02s) Traces .e2e/prove/base/results/ (1 page, trace.md in each test's directory) Screenshots .e2e/prove/base/results/tailscale-client-address-authorized-clients-preserves-the-8e1688a24d679702/attempt-1/screenshots/001-authorized-clients.png Markdown .e2e/prove/base/summary.md Failed × |web| scenarios/tailscale-client-address.e2e.ts:45 > Authorized clients preserves the paired phone's Tailscale address ASSERTION_FAILED: expect.toBeVisible failed trace .e2e/prove/base/results/tailscale-client-address-authorized-clients-preserves-the-8e1688a24d679702/trace.md Scope: all 42 workspace projects ✓ Lockfile passes supply-chain policies (verified 5m 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 1289, reused 1289, downloaded 0, added 1275 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 2.9s using pnpm v12.14.0 RUN e2e v0.23.0 run 01a1d187-44bf-7978-bed9-df28025d117a · targets: web, ios ✓ target "web" command at http://127.0.0.1:37685/.well-known/t3/environment ready 4.35s ✓ target "ios" command at http://127.0.0.1:8190/status ready 5.46s ✓ |web| scenarios/tailscale-client-address.e2e.ts > Authorized clients preserves the paired phone's Tailscale address 9.97s ✓ |web| scenarios/tailscale-client-address.e2e.ts (1 test) 9.97s Test Files 1 passed (1) Tests 1 passed (1) Start at 20:51:06 Duration 20.67s (startup 9.81s) Traces .e2e/prove/head/results/ (1 page, trace.md in each test's directory) Screenshots .e2e/prove/head/results/tailscale-client-address-authorized-clients-preserves-the-8e1688a24d679702/attempt-1/screenshots/001-authorized-clients.png Markdown .e2e/prove/head/summary.md { "scenario": "Authorized clients preserves the paired phone's Tailscale address", "failsOnBase": true, "passesOnHead": true, "baseSha": "cf82fb858458be25daeccf811f213d6ed73979f1", "headSha": "2358fe0591d6a80d9efde973024e92d5e35665cc", "verdict": "Proven: the scenario fails on base `cf82fb8584` and passes on head `2358fe0591`.", "steps": { "base": [ { "step": "app.open ", "status": "passed" }, { "step": "locator.waitFor getByText(\"Pairing evidence\").first() → visible", "status": "passed" }, { "step": "app.open /settings/access", "status": "passed" }, { "step": "locator.tap getByText(\"Authorized clients\")", "status": "passed" }, { "step": "locator.waitFor getByText(\"iOS\").first() → visible", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "app.screenshot authorized-clients", "status": "passed" }, { "step": "expect.toBeVisible getByText(\"100.64.0.2\")", "status": "failed" } ], "head": [ { "step": "app.open ", "status": "passed" }, { "step": "locator.waitFor getByText(\"Pairing evidence\").first() → visible", "status": "passed" }, { "step": "app.open /settings/access", "status": "passed" }, { "step": "locator.tap getByText(\"Authorized clients\")", "status": "passed" }, { "step": "locator.waitFor getByText(\"iOS\").first() → visible", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "app.screenshot authorized-clients", "status": "passed" }, { "step": "expect.toBeVisible getByText(\"100.64.0.2\")", "status": "passed" } ] }, "captures": [ "", "", "" ], "videos": [ "", "" ], "markdown": "### Scenario: Authorized clients preserves the paired phone's Tailscale address\n\n**Proven: the scenario fails on base `cf82fb8584` and passes on head `2358fe0591`.**\n\n| | Base `cf82fb8584` | Head `2358fe0591` |\n| --- | --- | --- |\n| Result | ❌ failed
ASSERTION_FAILED: expect.toBeVisible failed
locator: getByText(\"100.64.0.2\")
expected: visible
observed: no node (match count 0) | ✅ passed |\n| authorized clients | ![Base cf82fb8584: authorized clients](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/cc374e13fdc57aec/001-authorized-clients.png) | ![Head 2358fe0591: authorized clients](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7f02cfef36f2ff3b/001-authorized-clients.png) |\n| failure | ![Base cf82fb8584: failure](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6ca5616091bed27d/002-failure.png) | |\n", "base": { "sha": "cf82fb858458be25daeccf811f213d6ed73979f1", "status": "failed", "title": "Authorized clients preserves the paired phone's Tailscale address", "message": "ASSERTION_FAILED: expect.toBeVisible failed\nlocator: getByText(\"100.64.0.2\")\nexpected: visible\nobserved: no node (match count 0)", "steps": [ { "step": "app.open ", "status": "passed" }, { "step": "locator.waitFor getByText(\"Pairing evidence\").first() → visible", "status": "passed" }, { "step": "app.open /settings/access", "status": "passed" }, { "step": "locator.tap getByText(\"Authorized clients\")", "status": "passed" }, { "step": "locator.waitFor getByText(\"iOS\").first() → visible", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "app.screenshot authorized-clients", "status": "passed" }, { "step": "expect.toBeVisible getByText(\"100.64.0.2\")", "status": "failed" } ], "captures": [ "", "" ], "videos": [ "" ] }, "head": { "sha": "2358fe0591d6a80d9efde973024e92d5e35665cc", "status": "passed", "title": "Authorized clients preserves the paired phone's Tailscale address", "steps": [ { "step": "app.open ", "status": "passed" }, { "step": "locator.waitFor getByText(\"Pairing evidence\").first() → visible", "status": "passed" }, { "step": "app.open /settings/access", "status": "passed" }, { "step": "locator.tap getByText(\"Authorized clients\")", "status": "passed" }, { "step": "locator.waitFor getByText(\"iOS\").first() → visible", "status": "passed" }, { "step": "browser.evaluate ", "status": "passed" }, { "step": "app.screenshot authorized-clients", "status": "passed" }, { "step": "expect.toBeVisible getByText(\"100.64.0.2\")", "status": "passed" } ], "captures": [ "" ], "videos": [ "" ] } }