# PR 17031 real-app capture retry — PARTIAL, acceptance matrix incomplete

Supersedes the previous absent-worktree report. Scope: [#17031](https://git.cafe/pingdotgg/t3code/pulls/17031). Before: [977a188](https://git.cafe/pingdotgg/t3code/commit/977a18823cf8e067476193e29947e2d3950a25f2). After/restored source: [34fcb08](https://git.cafe/pingdotgg/t3code/commit/34fcb08ce3146c0b6424d676b1d05ec8b49014c4). Worktree `/home/ubuntu/wt/pr-17031`, clean at handoff. No commits, pushes, PR comments or other forge writes. No other worktree, subagent or remote machine used. Parent's install completed; I did not reinstall.

## Outcome by matrix row

| Row | Provenance | Result |
|---|---|---|
| R1 | REAL PROVIDER | Actual OpenCode 1.18.18 / `openai/gpt-6.1-sol`, Code Mode enabled, discovered T3 tools and invoked `html_render` through `execute` on both exact revisions. Before: persisted reference and HTML file exist, zero inline frames. After: one inline page above final reply, usable after reload. Eight whole-app PNGs total: each revision × 1440×900 / 390×844 × light/dark, scale 1. |
| R2 | REAL PROVIDER ATTEMPT, BLOCKED | Installed Grok 1.0.67's actual ACP initialize advertises only `grok.com`; T3 requests `xai.api_key`, so session open fails before tool use. Provider status had reported authenticated, but that was insufficient. Generic local ACP registration of the same binary also reports unauthenticated; no successful tool row. `devin` executable absent. No live Grok/Devin HTML tool output, no R2 before/after page captures or interaction recording. Mandatory real ACP acceptance is NOT satisfied. |
| U1/U2/U3 | UNIT / ACP MOCK | After: five focused files, 192 passed. Mobile after: 41 passed. Before: same six file paths, 223 passed. New head-only assertions are absent from before; before passing does not imply regression cases passed there. Mock ACP/nested cases remain synthetic. No live nested Grok evidence. |
| S1 | SERVER INTEGRATION + explicitly labeled APP REPLAY | External harness invokes actual `ProjectionStoreV2.getThreadAttachmentIds` over migrated SQLite memory DB: before collects neither own execute reference; after collects own wrapped and bare, rejects foreign and `isError`. Actual app deletion at head removes own wrapped and bare files; foreign file survives and remains interactive. Bare/foreign/`isError` lifecycle rows were manually inserted into disposable canonical SQL while server stopped; wrapped row was real OpenCode. Guest serving, MCP App control, and before-revision filesystem deletion not exercised. `isError` evidence is not coverage of every possible failed-status/output combination. |
| V1 | REAL APP BLOCKED | Enabled Guest links in disposable settings and actually attempted Create link on both revisions. Both return `Guest links need a running T3 Connect tunnel.` Two blocker captures only. No guest UI or guest endpoint serving proven; required eight guest PNGs and guest recordings missing. No external account/tunnel set up. |
| M1 | EXPLICIT NATIVE FALLBACK | `emulator -list-avds` → command not found, exit 127. No remote host used. Native HTML WebView rendering, interaction and theme UNVERIFIED. Mobile threadActivity test fallback passed on both revisions. Narrow web screenshots are not native proof. |

## Real provider provenance

After thread `602a1fd4-edb5-413d-a7a1-cd36c0ffb24a`, item `turn-item:provider:opencode:native-item:prt_17af413670017ahIb3D3WXKj4A`, completed `execute`, attachment `602a1fd4-edb5-413d-a7a1-cd36c0ffb24a-1c8c16c3-c4dc-4329-907b-079a2a9ee044-html`.

Before thread `a12890aa-5d2d-4497-ba35-f66ca50a852f`, item `turn-item:provider:opencode:native-item:prt_17af86bb50012gqgiPgcY7bZjO`, completed `execute`, attachment `a12890aa-5d2d-4497-ba35-f66ca50a852f-bb693346-dd23-47a4-8def-788dff861543-html`.

Both persisted output values are JSON strings shaped `{htmlRender:{attachmentId,title,height,heights},message}`. Published title is `OPENCode-EXECUTE`, height 260. Original HTML supplied to the actual provider calls is byte-identical: SHA256 `a62e076d2984ccdb86586b961fc589bcdf9fd8686ccb94689c5537518f8dea76`. Raw persisted input/output row exports are attached. Captured OpenCode subprocess PIDs 3219861/3219888 both had `OPENCODE_EXPERIMENTAL_CODE_MODE=1`; these were retired during later restarts. Provider rows were not fabricated or transplanted to before.

Unavoidable input variation: first after prompt generated the fixture HTML; my wording accidentally requested a second wrapper. That attempt returned `{htmlRender:{htmlRender:ref,message}}` and is NOT counted as supported-shape proof. A correction asked the provider to return the original tool result directly, retaining identical HTML. Before received that exact HTML explicitly and returned the direct result. Thus prompts/history and generated thread titles differ, while the page input, provider/model, Code Mode, heights and capture viewport/theme match. The first after turn was interrupted by a dev watcher restart caused by focused test config generation; T3 resumed it. The counted corrected call completed. The UI was reloaded before settled captures; this attempt does not independently establish live insertion without reload.

## Capture method and observations

`preview_status` returned `available:false, visible:false, tabId:null`. User explicitly authorized headed Chromium/Xvfb instead. Chrome for Testing 148.0.7778.96 at `/home/ubuntu/.cache/ms-playwright/chromium-1223/chrome-linux64/chrome`, Playwright from apps/web, Xvfb display `:91`, screen 1440×1000×24. Screenshots are full CSS application viewports; videos use real `ffmpeg -f x11grab -video_size 1440x1000 -framerate 20 -i :91.0`, libx264, yuv420p. No screenshot slideshows. The continuous video is a single first-140-second segment copied from the original x11 recording; it includes loading/inspection pauses. The 30-second after flow and 25-second before flow are additional continuous recordings. After flow begins from an already-interacted inline count; the longer continuous recording contains the earlier zero state. Fullscreen has its own frame state. Before has no inline button or fullscreen control; those steps are unavailable, not simulated.

After captures: fonts awaited, attachment button loaded, consecutive iframe heights matched; exactly one inline iframe. Desktop frame width/scrollWidth 728/728, narrow frame 358/358. Light/dark root appearance observed. The increment button, fullscreen interaction, closing back to usable inline, theme changes, narrow scrolling and reload were exercised. Reload resets local counter to zero and preserves the published page; clicking then yields Count: 1. Whole-app screenshots retain thread chrome/final reply. Before captures: zero iframes, no document horizontal overflow, completed final reply. The before recording's final reload wait used an incorrect generated-title locator and timed out after showing the actual page; settled PNGs were subsequently recaptured with the correct generic header locator. Do not claim that video has a successful scripted persistence assertion.

S1 lifecycle used actual app Thread actions → Delete → Confirm. Persisted owner deletedAt: `2026-10-27T01:32:47.816Z`. Saved before/after filesystem existence and actual surviving foreign page capture. The real after owner thread was intentionally deleted for this disposable lifecycle test, so it is no longer available to reopen; its row export and captures are retained. The before provider thread survives and now renders when viewed under restored head. The double-wrapped unsupported file and excluded error fixture are not evidence of cleanup failures for supported references.

## Exact verification commands

All run from `/home/ubuntu/wt/pr-17031` unless noted. Exit 0 for each test command and both SQL harness runs.

- After: `vp test run packages/shared/src/htmlRender.test.ts packages/shared/src/toolOutput.test.ts packages/provider-acp/src/server/runtimeModel.test.ts apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts apps/web/src/session-logic.test.ts` — 5 files / 192 tests passed.
- After: `vp test run apps/mobile/src/lib/threadActivity.test.ts` — 1 file / 41 tests passed.
- After: `vp test run apps/server/src/attachmentStore.test.ts apps/server/src/guest/guestView.test.ts apps/server/src/guest/GuestShareService.test.ts apps/server/src/orchestration-v2/ProjectionStore.test.ts` — 4 files / 78 tests passed. Existing tests do not substitute for missing live guest coverage or full S1 matrix.
- Before: `vp test run apps/mobile/src/lib/threadActivity.test.ts packages/shared/src/htmlRender.test.ts packages/shared/src/toolOutput.test.ts packages/provider-acp/src/server/runtimeModel.test.ts apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts apps/web/src/session-logic.test.ts` — 6 files / 223 tests passed.
- Both revisions, cwd apps/server: `node /tmp/pr-17031-sql-harness.mjs` — actual service/SQL read, external scratch harness, no source edits. Harness remains local for audit.

## Isolation, limits and handoff

Only `/tmp/ev-17031` runtime data and artificial fixtures used. Never read/copied/wrote `~/.t3/userdata`. No pairing URLs, credentials, cookies, configuration secrets or signed asset URLs are included in published artifacts. No forge writes except requested ghdrop artifact uploads. No native simulator, desktop Electron shell, relay/tunnel path, additional ACP provider or live nested child established. No new controls/contracts/entry points are introduced by the diff, so settings/palette/keybinding expansion does not apply.

Only 8 of the matrix's required 24 settled success PNGs exist: missing 8 R2 and 8 guest frames. Blocker images are not counted. R2, V1 and native visual rows remain UNVERIFIED; S1 is partial. This is useful partial evidence, not a complete matrix or blanket merge-readiness approval. Execute-output trust is the maintainer's accepted policy and is not a finding.

Final source is reviewed head and clean. Final dev runner observed PID 3238716, backend port-owner PID 3238779 (cwd confirmed `/home/ubuntu/wt/pr-17031/apps/server`), Vite PID 3238766. Browser driver host PID 3238805 remains; final recorded Xvfb shell PID 3238723 and initial final launcher PID 3238454 are no longer live. Unified sessions: dev 76717, browser 54988, Xvfb 97263. Prior sessions/processes were interrupted when the parent notification aborted a turn; old PID files can be stale. `/tmp/pr-17031-processes.json` records a status snapshot. All finite ffmpeg recordings have finished; original longer recording finalized on interruption. Parent owns cleanup; no process killed by name/pattern.

## Artifact links

The index below labels Before/After in filenames, and file prefixes map directly to matrix IDs. PNG names include revision/width/theme; recordings and row exports retain their provenance described above.
![R1-before-1440-light.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e5c7599a7fdbf90c/R1-before-1440-light.png)
![R1-before-1440-dark.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/402429ccb7ad7ab7/R1-before-1440-dark.png)
![R1-before-390-light.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/37f307e72a86055a/R1-before-390-light.png)
![R1-before-390-dark.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d2040ffcc043d592/R1-before-390-dark.png)
![R1-after-1440-light.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6ba704aa893e3bb0/R1-after-1440-light.png)
![R1-after-1440-dark.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bb4fc94c9c26f21a/R1-after-1440-dark.png)
![R1-after-390-light.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/31493199fb2fea33/R1-after-390-light.png)
![R1-after-390-dark.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2c9c79db2a181a6c/R1-after-390-dark.png)
[R1-before-flow.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/031e0ec178e77e3b/R1-before-flow.mp4)
[R1-after-flow.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/196a31f1f802e403/R1-after-flow.mp4)
[R1-after-continuous-x11.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/cdb0ef8fa87f5e6f/R1-after-continuous-x11.mp4)
[R1-before-real-provider-row.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/06f25dcac3c25dfa/R1-before-real-provider-row.json)
[R1-after-corrected-real-provider-row.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/90bacc649886e51f/R1-after-corrected-real-provider-row.json)
[R2-real-grok-blocker.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1649cf7c25ed2a74/R2-real-grok-blocker.txt)
![V1-before-blocked-connect.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d58c889cb7cde196/V1-before-blocked-connect.png)
![V1-after-blocked-connect.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9d2958029dc82af6/V1-after-blocked-connect.png)
[S1-before-sql.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1ba11269bfd1432c/S1-before-sql.txt)
[S1-after-sql.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8031a327de1c2f4a/S1-after-sql.txt)
[S1-lifecycle.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d4b8f80d911a6b3a/S1-lifecycle.json)
![S1-foreign-thread-survives.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/dc4b5689734e81fe/S1-foreign-thread-survives.png)
[U1-U3-M1-before-tests.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8a3082174dcc4b60/U1-U3-M1-before-tests.txt)
[U1-U3-after-tests.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/75e08640e19cae08/U1-U3-after-tests.txt)
[S1-existing-server-after-tests.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3bcf54e57b9b183a/S1-existing-server-after-tests.txt)
[M1-mobile-after-tests.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/825d5ccb6ea36364/M1-mobile-after-tests.txt)
[M1-native-command.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bc90516a3a43d8a9/M1-native-command.txt)
[M1-native-unverified.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/03d60af166964590/M1-native-unverified.txt)
