# Rebuild C2: real dev app with a client-state harness

No live update was attempted. Start each checkout with its own fresh, explicitly selected T3 home; do not seed from any user's T3 home. Before revision: 4c361199f47f6ea32a2c14835df392640d0f7c63. After revision: 53d9b7c2892601b6b9999f97f2db5b3cbf272746.

```sh
# In each checkout, separately. Install was needed only in the new before checkout.
vp install
T3CODE_DEV_SEED=0 vp run dev --home-dir /tmp/lead-33239-r1/evidence-capture/before-home
# After checkout uses /tmp/lead-33239-r1/evidence-capture/after-home instead.
```

Record actual ports from the dev-runner log. Use each startup pairing URL once in the T3 Browser panel; do not publish it. Navigate to `/settings/access`. Use one incognito tab; viewport 390x844 CSS pixels, dark preference. Chrome 157 Linux x64, DPR 2, pointer capable, no device emulation, app/browser text scaling 100%, root font size 16px. Both app databases were created by their own revision with T3CODE_DEV_SEED=0. No projects or threads need seeding for the Settings Version row.

Run the SAME runtime-driver.mjs on each checkout to obtain `client-payloads.json`. Evaluate the function expression in client-state-driver.js, supplying `{checkout:<absolute checkout>, message:<C2-payload.message from that side>, side:'before'|'after'}`. Only the revision's actual error text and checkout path differ. This uses the existing app registry, update-state atom, toast manager, clipboard API and UI components; it does not replace their renderers, change their CSS sizes or contact a service launcher.

The driver freezes Date at 2026-11-10T12:00:00Z. Real timers continue for user interaction and copy feedback. Preview has no reduced-motion emulation switch; the driver suppresses CSS animations/transitions on both sides. Wait for fonts and the app's module requests to settle. Keep every scroll container at (0,0).

Move pointer to `[aria-label="Settings breadcrumb"]`, then execute the same sequence on each side:

1. `preview_recording_start`.
2. `preview_evaluate`: `window.__evidence.trigger()` (t=0; real service payload injected into client state).
3. Wait 2000 ms; `preview_act` click `button[aria-label="Copy error"]`; log `window.__evidence.event('click Copy error')`.
4. Wait 1000 ms; evaluate `window.__evidence.inspectCopy()`. This checks the full text supplied to a successfully resolved native clipboard write plus the real `Copied error` button. Clipboard read is denied in this browser; no read-back claim is made.
5. Wait 1700 ms; evaluate `window.__evidence.closeToast()` (toast manager close, not a live update action).
6. Wait 1200 ms; hover `[role="alert"] [data-slot="tooltip-trigger"]`; log the hover and `window.__evidence.inspectRow()`.
7. Wait 1200 ms; save a screenshot. Wait 500 ms; save another screenshot. Compare decoded pixels at zero tolerance; keep the second only if identical. If not, wait for the page to settle and repeat.
8. Hold the full tooltip for another 2500 ms and stop recording. Save `window.__evidence.audit` as JSON. The audit timestamps are relative to trigger; recording adds under 0.2 s startup overhead.

The uploaded before/after audit JSON preserves actual timestamps and copied strings. No native clipboard read was granted or claimed; the wrapped native write still executes unchanged and must resolve successfully. Video is the interaction proof; tooltip PNGs are supplementary settled frames. Compare stills using make-diffs.sh. Open each PNG/diff and sample the beginning, toast, copy feedback, reveal and final held frames of each recording before upload.

No desktop/mobile visual proof or real restart/reconnect is claimed. The web build also supplies the desktop renderer, but this capture used a browser. No provider turns were run.

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