# Question click evidence

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

This is browser evidence from two real T3 Code development apps in separate worktrees.
Base: [17a6a01d84](https://git.cafe/pingdotgg/t3code/commit/17a6a01d84e3adf9f29df2639d6b6079a434e1b2).
Head: [497d68859b](https://git.cafe/pingdotgg/t3code/commit/497d68859b3acad096f32e60a014cfc74366fd92).
The base is the locally computed merge-base of the requested head and origin/main.
Two fetch attempts returned HTTP 503; both commits were already present locally.

Both databases were created fresh by their own app version with T3CODE_DEV_SEED=0.
No real user database was read or copied. The same seed.py was applied to each
checkout's built-in Question replay transcript before launching replay sessions.
Application UI and server code were unchanged. The only checkout modification was
synthetic replay input, removed with the worktrees after verification.

Surface: real web app, Linux Chromium, 1280 by 800 CSS pixels, light appearance,
sidebar and thread details closed. Browser input was sent over local CDP;
recordings used agent-browser and ffmpeg at 30 fps with its cursor overlay.
The telemetry overlay observes DOM changes and input; it does not patch application
handlers. It reports performance.now() from option DOM appearance, event.isTrusted,
and event.detail. This is not a unit test or component harness.

First-party Claude OAuth was unavailable, so this verifies the question UI with
synthetic ACP elicitation through the built-in replay provider, not Claude itself.

## Matching steps

1. Start a new Question replay thread. Click Alpha on initial appearance.
2. After observing the outcome for 350 ms and waiting another 300 ms, click Alpha
   again if the question is still present. Base has already submitted it.
3. Wait for a two-question request. Answer the first after 650 ms. Click Alpha on
   the second immediately after automatic advance. Repeat the delayed-click check.
4. Wait for the Expand request, collapse its card, wait 650 ms, expand, and click
   Alpha as the options appear. The driver waits 80 ms for the moving row before
   taking its coordinates. Repeat the delayed-click check.
5. Wait for the Settings request. Open Appearance settings, close using Escape,
   and click Alpha immediately on return. Repeat the delayed-click check.
6. Focus Alpha on the Keyboard request and press Enter after 100 ms.

All option activations were trusted browser input. Pointer clicks have detail=1;
Enter generates detail=0. The same run.mjs and driver.js drove both final runs.

## Observed timings

| Scenario | Base | Head |
| --- | --- | --- |
| Initial pointer | 67 ms; submits | 74 ms; unanswered |
| First of two, delayed pointer | 657 ms; advances | 660 ms; advances |
| Second question, pointer | 10 ms; submits | 15 ms; unanswered |
| Expansion, pointer | 259 ms; submits | 209 ms; unanswered |
| Return from Settings, pointer | 82 ms; submits | 170 ms; unanswered |
| Enter | 114 ms; submits | 177 ms; submits |

On head, delayed retries at 750, 701, 909, and 870 ms respectively submitted the
initial, second, expanded, and returned questions. The final transcript on both
sides says “All five question scenarios answered.”

The videos retain original timing. Identical small rectangles mask private
provider labels during the first two seconds and the far-right environment label.
They do not cover the question options, input timing, selection, or submission.
All recordings were inspected using decoded frame sheets and full-size frames
before upload. No still image is submitted as evidence.

## Scripts

- seed.py CHECKOUT: install identical synthetic replay requests.
- driver.js: inject into the already paired, loaded real app through Runtime.evaluate.
  Call proof.init('BEFORE', '17a6a01d84') or proof.init('AFTER', '497d68859b').
- cdp.mjs: local DevTools connection helper, port 9223.
- run.mjs before|after: run the identical interaction sequence, write structured
  observations in a new timestamped runs directory. Start the browser recording before invoking it.

Launch each app with `T3CODE_DEV_SEED=0 vp run dev` from its own worktree. Pair a
browser with that app's generated token privately, use 1280 by 800 and light
appearance, create a synthetic project, and allow initial dependency loading to
finish. Launch Chromium with an isolated profile, --remote-debugging-port=9223,
--password-store=basic, --no-sandbox, and --disable-dev-shm-usage. The basic password
store was required to avoid local navigation stalls in this environment.

Not covered: actual Claude AskUserQuestion integration, the Electron shell,
multi-select options, Usage modal, Space activation, and sub-150 ms expansion.
