# Snapshot evidence

Both sides run the actual T3 Code development server and web app from separate detached worktrees. Each server started with T3CODE_DEV_SEED=0 and its own database. Only synthetic inventory content was used. No tests or mocked browser responses are used as proof.

The deterministic ACP driver receives a thread-scoped credential from T3 Code and calls that running server's /mcp HTTP endpoint. This avoids model inference and preserves exactly the same tool sequence. The browser, accessibility tree extraction, screenshot capture, and response bounding are the real application's implementations.

The screenshots and recordings show a summary computed by driver.mjs from the actual returned payload, rendered by T3 Code's real chat UI. Full unmodified snapshot responses and tool transcripts are included separately. The visible text excerpt displayed in chat is limited to 300 characters for readability; after-snapshot-response.json contains all 2,000 retained characters plus the ellipsis.

Environment for both sides: Linux x86_64; Node 26; T3 Code dev server; server-owned Chromium; synthetic page viewport 1280 x 800, light appearance. The observing web client used Chromium at 1440 x 1100 CSS pixels, device scale 2, light appearance. Captures were cropped identically to the chat output to exclude unrelated application details. Video crops are scaled to 1240 x 1248. The still crops had zero different pixels in two captures separated by at least 500 ms. Both videos were decoded and their frame contact sheets inspected before upload.

Base: d756fed7aaac06134bc68cbe0047e6f14b0e9aa2
Head: 9d4c402fc822aa8a20be6a557e403e56331e3f81

## Run the same sequence

1. In each checkout, install with `vp i`, then run `T3CODE_DEV_SEED=0 vp run dev`. Retain the server and web ports printed by the runner. Pair a browser with each web client.
2. Run `node fixture.mjs` once. It serves a heading and a static 2,000-row, two-column table on port 18845. The rendered innerText is 84,026 characters.
3. From each checkout, add a project with `node apps/server/src/bin.ts project add --base-dir .t3 --title 'Snapshot evidence' .` and issue a temporary local auth token into a private file with `node apps/server/src/bin.ts auth session issue --base-dir .t3 --token-only`.
4. From each checkout, run `node setup.mjs SERVER_PORT AUTH_FILE DRIVER_PATH OUTPUT_DIRECTORY`, substituting the actual paths and port. This registers the deterministic driver through server.updateSettings and enables browser access. Use a separate output directory per server. Never upload the auth file.
5. From each checkout, run `node apps/server/src/bin.ts thread start --base-dir .t3 --provider snapshotDriver --model snapshot --title 'Snapshot evidence' --json . 'Open the inventory fixture and capture its snapshot.'`. Here snapshot is a deterministic fixture scenario, with no model inference. The returned thread waits for the recording gate.
6. Navigate each observing web client to that thread, start recording, then create a file named `start` in the corresponding output directory.
7. The driver calls preview_status, preview_open on the fixture, preview_resize to 1280 x 800, preview_set_appearance to light, preview_evaluate to count rows/columns/innerText, and preview_snapshot with includeImage:false and save omitted. It writes the actual responses into a new timestamped output directory and displays the computed summary in chat.
8. Inspect visibleText, the omission notice, and the truncated accessibilityTree in both responses. Stop recording after the summary appears; capture stable stills.

Using save:true without includeImage returns only the screenshot path, so the reproduction deliberately uses the default metadata-returning snapshot mode.

## Observed

Before: visibleText is just the ellipsis; the notice says visibleText after 0 characters. The tree retains 10,000 characters plus an ellipsis. Bounded metadata text is 10,615 bytes.

After: visibleText retains 2,000 characters plus an ellipsis, beginning with the heading and table rows. The tree still retains 10,000 characters plus an ellipsis. Bounded metadata text is 12,709 bytes, below the 20,000-byte target.

AI-assisted; verified with the tests and tools listed above.
