# Evidence preparation handoff

Preparation only, 2026-10-24 22:05–22:17 UTC. All affected matrix rows A–G remain INSUFFICIENT: no BEFORE execution, required X11 recordings, stability samples, or same-checkpoint before/after diff images. These after-only screenshots do not fulfill that matrix. No merge-readiness verdict is claimed.

Replacement draft [#24555](https://github.com/pingdotgg/t3code/pull/24555), replacing [#21113](https://github.com/pingdotgg/t3code/pull/21113). Worktree exclusively /home/ubuntu/wt/pr-21113, clean at fe552d7d57bef4c4b5a04dbc34628b3a1c2dd830 throughout. No revision switch, code change, commit, push, comment, watch, tests, or provider turn. T3 preview only; owned tab tab_3_3d5ebdef-0fe2-4040-8336-16beaf86568e closed successfully. No installed preview runtime modification.

## Real runtime observations

Two real loopback T3 slots, fresh homes, T3CODE_DEV_SEED=0 and --no-seed throughout; no live database seeding, sharing, or Connect. Backend listeners 127.0.0.1; Vite listeners ::1. Native preview Chrome used 1280x800 CSS, evaluated DPR 2; saved screenshot dimensions 1280x800. Light appearance observed, no explicit theme lock. No DPR-1, width, theme, timing, or stability qualification for required evidence.

1. D: paired B using A Settings → Connections → Add environment, pasting B's private startup URL into Host. Both real environments connected and published distinct scratch roots. Add project → B → Local folder added /tmp/ev-21113/prep/Remote work, creating an empty draft without submitting it. Stopped captured B backend PID 2534798. B became reconnecting; cached ordinary project/draft and hero remained. Headline click sent real projects.ensureScratch to ws://localhost:7844/ws (A), created A's No project record at A's published root, and navigated to an A draft. Shell snapshots showed zero persisted threads on both machines.
2. D contentful: returned to the remembered B draft, typed unsent Keep this draft, clicked headline. The existing draft route remained, its environment/project retargeted to A scratch, and text survived. Reverse ordinary-project selection through the actual headline picker restored Remote work on unavailable B, preserving text.
3. M shortcut: stopped B's Vite PID 2534785, reused the remote slot with a fresh B2 identity on a distinct loopback origin, and paired via Connections. A and B2 connected/rootful; remembered current B unavailable. Ctrl+Alt+N displayed Could not start without a project / Several of your machines can start a thread without a project. Open a thread on the one you want first. Route and B draft/prompt stayed unchanged. Passive WebSocket send instrumentation recorded zero RPC requests during the immediate action. m-state.json retains settled identities/draft/shell state; its later traffic includes only background client activity. ambiguity-toast.png captured the actual visible toast.
4. Rootless primary: stopped A through retained terminal, git init in its disposable /tmp home, restarted fresh process. A connected but published scratchWorkspaceRoot=null. Sole eligible B2 headline fallback created B2 No project and retargeted the contentful draft while preserving text. rootless-fallback-state.json records the actual B2 scratch project and selected environment. Instrumentation was not active for this click; shell/project/draft state establishes destination.
5. Z: stopped B2 backend PID 2541265. A connected/rootless, both remembered remotes reconnecting. Ctrl+Alt+N showed None of your machines can start a thread without a project right now. Immediate RPC log empty, route and draft/prompt unchanged. zero-toast-state.json records this state. /new?prompt=Proof%2021113 rendered Could not open the link plus the same None reason; no persisted thread appeared (zero-prompt-state.json).
6. R preparation: stopped A, moved its fixture .git outside home, moved scratch directory aside, placed a regular file at scratch, restarted. A connected and advertised its scratch root. /new?prompt=Proof%2021113 rendered This machine could not start a thread without a project. with the real Failed to create the folder for threads without a project toast. No new draft or persisted thread. Existing scratch project record was retained in this preparation: this differs from exact matrix seed R, which requires no existing scratch project. failure-prompt-state.json and folder-failure.png preserve the observed result. init-fresh-seed.sh has a fresh home-failure option for the later exact seed; that fresh option was syntax checked, not executed.
7. E: fresh home-empty (git initialized/rootless) and home-empty-b (normal/rootful). After primary identity changed, old browser auth needed startup-token entry on the real Pair page. Removed old fixture remotes through Connections → More actions → Remove from this device → Confirm, then paired fresh B through UI. Both actual shells had zero projects and zero threads. / showed Add a project, or start without one and Start without a project. /welcome showed the wizard over that hero; closed without operating setup. Clicking Start sent projects.ensureScratch to ws://localhost:8044/ws, created B's scratch project, and navigated to its draft. empty-hero-settled.json records B draft and zero persisted threads. No business state or RPC responses were mocked.

## Actual identities

Original A a412d2fb-3513-413b-a6fa-85b55ad586af; RA /tmp/ev-21113/prep/home-a/scratch.
Original B ae677e42-fe7b-46a8-89a7-01063577dd21; RB /tmp/ev-21113/prep/home-b/scratch.
B2 43019719-189b-4bce-86a0-fbd3a4ed1986; root /tmp/ev-21113/prep/home-b2/scratch.
Empty A a541c250-997e-444e-99e0-eef21866325c; root absent.
Empty B 58b450c8-c474-4e29-b193-bef167dad167; root /tmp/ev-21113/prep/home-empty-b/scratch.

## Reusable drivers and retained fixture state

start-slot.sh runs a chosen slot in a retained terminal, asserts pinned AFTER SHA, disables seeding, loopback only. Capture the terminal session and actual listener PIDs/cwd each launch; never kill by pattern. Numeric DEV_INSTANCE is a port offset: use 2111/2211/2311, not 2111301. init-fresh-seed.sh refuses existing homes and prepares fresh normal/empty/failure homes. Scripts are syntax checked; do not describe unexecuted branches as tested. probe.js is an expression for preview_evaluate; pass its trimmed text. It reads the real app atom registry, shell, published config root, and sanitized draft data without changing business logic. observe-rpc.js passively wraps WebSocket.send and retains only origin/path and method tag, excluding headers, payloads, tokens and responses. Reinstall/reset after navigation and await settled app state before probing.

Stopped homes and private snapshots are under /tmp/ev-21113/prep/snapshots. They contain fixture auth/secrets and MUST NOT be uploaded. a-rootful is a stopped rootful snapshot; a-failure contains the blocking regular file. a-rootless-prestart has fixture .git; b-stopped and b2-stopped preserve their projects. empty-stopped and empty-b-stopped preserve final E state after scratch creation, not its zero-project start. Browser remotes from D/M were subsequently removed for E; m-state.json preserves sanitized draft data, but no full IndexedDB/auth snapshot was exported. Later recording must re-pair through UI and restore equivalent browser state, not claim the earlier D/M browser session remains ready.

## Remaining preparation gaps

- C own-root collision seed not constructed or exercised.
- D/M/Z palette global/nested actions and absent-action checkpoints not exercised; D shortcut success not exercised. M ambiguity shortcut and Z zero shortcut were exercised only after-only.
- M prompt preference needs a real persisted stopped B1 thread with no provider turn through supported launch RPC. No persisted thread was created; do not substitute active draft preference. M prompt paths unverified.
- Missing-repository and missing-PR prompt-link entry paths unexercised for M/Z/R. Only bare /new prompt checked for Z/R.
- R exact fresh home/no-existing-project option remains unexecuted.
- L desktop-bridge HTTP fallback/native-file guard harness not prepared or exercised. No native OS integration claim.
- No primary ordinary Local work project was added (directory exists only); no full browser/DB reset driver or exact repeated-revision seed is proven.
- Every required BEFORE/AFTER, size/theme, continuous X11 recording, stability sample pair, and threshold-zero/threshold-16 diff remains missing. Approval for headed Xvfb workflow remains unanswered. Working headless preview can verify the app but cannot satisfy x11grab recording. No alternate automation or preview recorder used.

## Cleanup proof and private logs

All captured backend/Vite PIDs are gone (ledger.json aliveAtCleanup=false): A 2534725/2534711; B 2534798/2534785; B2 2541265/2541251; rootless A 2543950/2543937; failure A 2545501/2545488; empty A 2546582/2546557; empty B 2547865/2547852. Backend disconnects used those captured PIDs; remaining runners stopped through retained terminal sessions. Two transient B2 launches/restores were stopped via their own terminal sessions 65810/2246 before moving on. Final ss returned no listeners for backend ports 15884/15984/16084 or Vite 7844/7944/8044. No owned server remains running. No Xvfb or recorder started. Shared preview browser left untouched; owned tab closed.

Private local logs (not uploaded): /tmp/ev-21113/prep/{a,b,b2,a-rootless,a-failure,empty,b2-restored,empty-b}.private.log. Pairing URL scratch files *.pair.private also private. All fixture homes live under /tmp. Preview snapshot tool automatically wrote screenshots to its normal app-owned browser-artifacts location; only those newly returned screenshot files were copied to prep for sanitation/publication. No live userdata database was read, seeded, opened read-write or modified by this work.

FRICTION capture-runtime|happened: working T3 preview remains headless/DPR2, incompatible with mandatory X11 capture; headed authorization unanswered|prevention: explicit authorized headed workflow before recording; retain A–G INSUFFICIENT.

FRICTION runbook|happened: numeric DEV_INSTANCE values above 65535 exhausted ports on first launch; no server started in those failed attempts|prevention: known bounded offsets 2111/2211/2311 in published launcher.

FRICTION fixture-state|happened: changing primary home/identity on the same origin retained browser auth/cache and old remotes; welcome-screen wait timed out|prevention: real Pair page token entry and UI removal/re-pairing; explicitly capture/reset browser state for later comparative runs.

FRICTION tooling|happened: preview_evaluate rejects leading/trailing whitespace; role locator does not accept exact attribute|prevention: trim driver text; use supported role syntax and snapshot refs.
