# Side-chat find evidence

Surface: real web app, separately installed and started from the base and head worktrees. Linux Chromium, dark appearance, device scale factor 2. Wide viewport: 1440 × 900 CSS pixels. Narrow viewport: 900 × 900 CSS pixels. Recordings are 2880 × 1800 and 1800 × 1800 pixels respectively.

Base: 3a8c250cb0c8056f2f563091fd412fe5db809fa1
Head: ee31f12cceb29b265e46cb5f7ee30f5723528c3e

## Seed each environment

1. Install dependencies with `vp i`.
2. Start `T3CODE_DEV_SEED=0 vp run dev`. Use its own fresh worktree database. Pair the browser with that server; never include the pairing token in evidence.
3. Rename the initial project to `Evidence` using `node apps/server/src/bin.ts project rename --base-dir .t3 <project-id> Evidence`.
4. In the authenticated app, call `window.t3dev.replay('todo-list')`. This creates a saved thread using the free Replay provider and completes a deterministic synthetic reply.
5. Hide the thread details panel. Type `/side Searchable pineapple` into the main composer and press Enter. Wait for the side chat's reply `todo list fixture complete` to finish.
6. Set dark appearance and 1440 × 900 viewport.

Both sides have identical user/assistant message text. Automatically generated side-chat titles and message timestamps differ; these are incidental and are visible in the recordings.

## Driver

`driver.js` contains the executed T3 preview-tool orchestration functions. It expects the `tools` bindings and an authenticated `tabId`. No token, app state modification, test mock, or replacement keyboard handler is involved. DOM evaluation only focuses existing elements, reads observations, clicks the Settings close button, and adds a pointer-transparent evidence caption.

Run `runEvidence(tools, tabId, label, false)` for the wide flow, `runEvidence(tools, tabId, label, true)` for narrow, and `runRetention(tools, tabId, label)` for Settings/resize/tab lifecycle. Each capture begins with the original side chat open and no find bar. Reopen a sheet closed by Escape with Toggle right panel before beginning another sequence; return to 1440 × 900 for retention.

Wide flow: focus the side composer, conversation, and Bring back button in turn; Ctrl+F; enter `pineapple` if the app exposes a find field; Escape. For the conversation case, focus the conversation before Escape. The other Escape presses originate in the find input when available.

Narrow flow: 900 × 900; side composer; Ctrl+F; enter `pineapple` if find opens; Escape twice. The head keeps the sheet open after the first Escape and closes it after the second. The base cannot open find and closes the sheet after the first Escape.

Retention flow: Ctrl+F from side composer; search `pineapple` if available; open Settings and close Settings; resize 1440 → 900 → 1440; focus side conversation and Escape; reopen find and search `pineapple`; close the side-chat tab with Close side chat; reopen it with Ctrl+Shift+T; Ctrl+F again. Head retains the query through Settings and resizes, restores composer focus on conversation Escape, and opens an empty find field after tab close/reopen. Base never exposes side-chat find, so query retention cannot be compared independently there.

`observations.json` records DOM readings taken during the recordings; these supplement the videos and are not test results. Videos were visually inspected through extracted contact sheets before upload. No still screenshots are offered as evidence.

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