◆ REPORT

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

0blocking findings
335focused tests passed
12live text chunks

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.

ItemReviewed value
Pull request#15643 · Bil0000 / Bilal
Tested headc2eaa2ce30af1726a58e5b697032d447fa54c90b
Compared base51f7f77f87318a5329d3bab15d513fda5654200b
Previous headaf4cb6394dfa1f4b20ed12e4ba479eee4fdc84fe
Previous base4ee6bfd50ef4a089440d5c3662db2298da9cc50e
RuntimeWindows 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.

FlowObserved result
Desktop screenshot buttonSaved PNGs at the top and after scrolling. Both images showed the visible page.
Default agent snapshot, save:trueReturned an image in the chat and saved the scrolled viewport. Its PNG was byte-for-byte identical to the UI screenshot.
Scroll contextDocument Y remained 1,133 px and nested Y remained 264 px. The snapshot reported visible controls Choose 4 through Choose 7.
Opt-in text captureReconstructed 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, navigationReads of invalidated capture IDs failed. The replacement capture could be read before navigation.
Compact response and combined save/captureincludeImage: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 isolated Windows app shows the agent-returned snapshot beside the scrolled live preview.
The isolated Windows app shows the agent-returned snapshot beside the scrolled live preview. Open full image
The same app after text capture and lifecycle checks, with the preview still at the scrolled content.
The same app after text capture and lifecycle checks, with the preview still at the scrolled content. Open full image

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

CheckResult
Frozen installationPassed in 9 min 40.9 s
Focused tests335 passed across 10 files
Changed TypeScript format and lintPassed for 14 files
Scoped typechecksDesktop, contracts, server, and shared passed
Web, server, and desktop buildsBuilt 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