Windows · Verified · Approve
Preview snapshots work in the Windows desktop app
The desktop screenshot button and the agent snapshot tool both captured the scrolled preview correctly at c2eaa2ce. The opt-in text capture returned 46,021 UTF-16 code units in 12 reads, matching the live page exactly. Document and nested scroll positions stayed unchanged, and released, replaced, or navigated-away captures could no longer be read. Approve for the reviewed scope, with the remaining test limits recorded below.
Decision and scope
Source: source review, focused Vitest output, and actual desktop MCP results in the evidence bundle.
This follow-up answers Bilal's request to check that browser snapshots still work on Windows. I found no reproducible in-scope defect. No code was changed, pushed, or merged.
| Item | Reviewed value |
|---|---|
| Pull request | #15643 · Bil0000 / Bilal |
| Tested head | c2eaa2ce30af1726a58e5b697032d447fa54c90b |
| Compared base | 51f7f77f87318a5329d3bab15d513fda5654200b |
| Previous head | af4cb6394dfa1f4b20ed12e4ba479eee4fdc84fe |
| Previous base | 4ee6bfd50ef4a089440d5c3662db2298da9cc50e |
| Runtime | Windows 11 Home 10.0.26200 x64 · Electron 44.4.2 · vp 1.0.0 · pnpm 11.10.0 |
Source: pinned GitHub metadata, package resolution, and local OS/runtime inspection on 2026-10-05.
The current PR changes 16 files. The 243-file comparison between reviewed heads includes merges from main, so I separated those from the preview change. The snapshot page collector is unchanged since the prior review. The follow-up replaces disk text export through saveText with an in-memory capture and bounded reads.
The earlier Windows gaps are closed
The previous review could not verify the actual app. In this run, frozen dependency installation completed, the desktop build launched, and the Windows computer-use bridge operated the isolated app. Both snapshot entry points produced viewable PNGs. The earlier standalone UnknownVizError did not recur in this desktop flow.
The old uniwind patch is absent from the current main-based dependency graph. The PR does not change the current lockfile or package manifests. Those earlier setup failures are not evidence against this head.
What I saw in the real app
I launched a separate desktop instance with an empty T3 home and separate Electron app data. I used a local page with a long document, a nested scroller, visible controls, hidden text, and Unicode content. Native interaction exercised the screenshot button. A Codex turn in that same isolated app exercised the preview MCP tools; I inspected the tool outputs and saved images directly.
| Flow | Observed result |
|---|---|
| Desktop screenshot button | Saved PNGs at the top and after scrolling. Both images showed the visible page. |
Default agent snapshot, save:true | Returned an image in the chat and saved the scrolled viewport. Its PNG was byte-for-byte identical to the UI screenshot. |
| Scroll context | Document Y remained 1,133 px and nested Y remained 264 px. The snapshot reported visible controls Choose 4 through Choose 7. |
| Opt-in text capture | Reconstructed all 46,021 UTF-16 code units. All 12 chunks were contiguous and well formed; none exceeded 4,096 code units. Offscreen OMEGA was included and hidden text was excluded. |
| Release, replacement, navigation | Reads of invalidated capture IDs failed. The replacement capture could be read before navigation. |
| Compact response and combined save/capture | includeImage:false returned metadata without an inline image. Combined PNG save and text capture succeeded; a tail read reached the end. A default snapshot created no text capture ID. |
Source: observed native UI, persisted preview tool results, live DOM SHA-256 comparison, and PNG hashes in the evidence bundle. Fixture viewport was 477 × 700 px.
The reconstructed text SHA-256 equals the live page's body.innerText hash. This checks the contents, not just the reported length. The image comparison supports the visual inspection of the native app and the saved PNGs.
How the changed path works
preview_snapshot still describes the current viewport. With captureText:true, it also stores the page's loaded text in browser memory and returns a capture ID. preview_read_text reads bounded chunks by offset. preview_release_text ends the capture explicitly.
The server owns capture scope and cleanup. Captures belong to the environment, thread, provider session, and provider instance. Replacement, navigation, page lifecycle cleanup, and an idle timeout invalidate old handles. Chunk boundaries preserve Unicode surrogate pairs. This keeps large text out of the default screenshot response and avoids writing the text to disk.
Source: preview/Snapshot.ts and desktop SnapshotPage.ts.
Checks and remaining limits
| Check | Result |
|---|---|
| Frozen installation | Passed in 9 min 40.9 s |
| Focused tests | 335 passed across 10 files |
| Changed TypeScript format and lint | Passed for 14 files |
| Scoped typechecks | Desktop, contracts, server, and shared passed |
| Web, server, and desktop builds | Built and launched the real desktop app |
Source: install, test, format, lint, and scoped typecheck logs in the bundle; desktop startup observed through native computer use.
Confidence is high for local Windows snapshot behavior on this fixture. The real five-minute idle expiry was not waited out. Cancellation, concurrent ownership, failure injection, and broader clipping cases have focused-test coverage rather than this live acceptance pass. I did not test remote/relay/tunnel connections, another device, mobile, macOS, or a packaged installer. This is not a broad performance claim.
The relevant entry points are the desktop Browser panel and the preview MCP tools. The web renderer runs inside this Electron app, but standalone web was not separately accepted. No settings, command-palette, mobile, or provider-adapter behavior changed. Code review included wire contracts and release/invalidation paths.
Reproduce and inspect
Download the evidence bundle. It contains the fixture, observed tool results, screenshots, validation script, and check logs. Token-bearing runtime logs, credentials, and app state are excluded.
# From the dedicated checkout at the tested head
vp install --frozen-lockfile
vp run dev:desktop --home-dir E:/review-evidence/15643-c2eaa2ce/app-home
# Run the exact focused suite saved with the evidence
pwsh -NoProfile -File E:/review-evidence/15643-c2eaa2ce/run-tests.ps1
# Recheck captured outputs against the live DOM hash and saved PNGs
node E:/review-evidence/15643-c2eaa2ce/validate-evidence.cjs
The recorded launch also set APPDATA to a separate evidence directory. Open the included fixture through a local HTTP server, scroll the page and its nested pane, then use the screenshot button and the preview tools.
Raw validation result and exact test selection
{
"result": "pass",
"chunks": 12,
"textChars": 46021,
"utf8Bytes": 54421,
"sha256": "87965573d98a077fc5c38f13785a264bc005b88d7e52b117b7b91edd788697d4",
"matchesLiveDom": true,
"allChunksWellFormed": true,
"contiguousOffsets": true,
"maximumChunkChars": 4096,
"finalChunkChars": 965,
"offscreenTailPresent": true,
"hiddenTextExcluded": true,
"documentScrollY": 1133,
"nestedScrollY": 264,
"inViewportControls": [
"Nested scrolling test",
"Choose 4",
"Choose 5",
"Choose 6",
"Choose 7"
],
"uiAndAgentPngIdentical": true,
"pngSha256": "bb47a0c93d66c4a211572c7cb23ef7f967257a1ff55d0c600d28c2cff4923541",
"note": "Assertions compare observed real-app MCP outputs, live DOM hash, and saved PNGs. They supplement the native UI evidence."
}$env:NODE_COMPILE_CACHE='E:\review-evidence\15643-c2eaa2ce\node-compile-cache'
Set-Location 'E:\w\pr15643-c2eaa'
vp test run apps/desktop/src/preview/SnapshotPage.test.ts apps/desktop/src/preview/Manager.test.ts apps/server/src/mcp/McpHttpServer.test.ts apps/server/src/mcp/PreviewAutomationBroker.test.ts apps/server/src/mcp/toolkits/core.test.ts apps/server/src/preview/Snapshot.test.ts apps/server/src/mcp/toolkits/preview/tools.test.ts packages/contracts/src/previewAutomationSnapshot.test.ts packages/contracts/src/preview.test.ts packages/shared/src/t3McpToolPresentation.test.ts *> E:/review-evidence/15643-c2eaa2ce/tests.log
$code=$LASTEXITCODE
Add-Content E:/review-evidence/15643-c2eaa2ce/tests.log "EXIT_CODE=$code"
exit $code
Source: validation-summary.json and run-tests.ps1, reproduced verbatim. Full logs are in the downloadable bundle.
Generated 2026-10-05 · GPT-6-astra via Codex · PR #15643 at c2eaa2ce against 51f7f77f · Windows follow-up · revision 1