# Reproduce the editor-discovery evidence

Issue [#33443](https://git.cafe/pingdotgg/t3code/issues/33443). Baseline [7b248349bd](https://git.cafe/pingdotgg/t3code/commit/7b248349bdc066b1488f52083662597ab22d6fe3), fixed [58adedf070](https://git.cafe/pingdotgg/t3code/commit/58adedf070cb9fe6596a1dabfa30da9c253fc692).

All paths in these scratch drivers are explicit fixture paths. Create fresh checkouts at `/home/ubuntu/wt/issue-33443-before` and `/home/ubuntu/wt/issue-33443`, install with `vp install`, and start with no preexisting `.t3` databases. Never copy or migrate live userdata. `servers.py` always sets `T3CODE_DEV_SEED=0`, removes display/WSL variables and Vite origin overrides, and records the process group it starts. Read its timestamped server log locally for ports and pairing; never upload the log or pairing URL.

1. Run `seed-files.sh` to create the synthetic workspace. Use the supplied genuine Ubuntu OpenZFS 2.2.2 wrapper at `/tmp/issue-lead-33443-r1/zfsbin/zed`. Its extracted libraries and binary belong to the issue lead. The `codebin/code` script is a simulated VS Code executable and only writes launch arguments. No VS Code installation or GUI launch is claimed.
2. For real Zed, download `https://zed.dev/api/releases/stable/latest/zed-linux-x86_64.tar.gz` into this scratch directory, extract `zed.app`, and create `zedbin/zed` as a symlink to its `zed.app/bin/zed`. The captured download reported Zed 1.27.0. `resolver-probe.mjs` creates the separate, explicitly simulated `zeditor` variant and the remapped absolute-fallback fixture. Do not modify HOME or installed binaries.
3. Run `python3 servers.py start <before|after> <E0|E1|E2>`. Pair an owned T3 preview tab with its local server. Evaluate `seed-app.js` on the authenticated app page; it uses production client RPC commands to create a stopped thread with the built-in Replay showcase fixture. It sends no agent turn. Save its returned route, navigate there, and fully reload after seeding. Wait for the empty conversation prompt.
4. On each origin, set `localStorage['t3code:last-editor']` to JSON `"zed"` and reload before a row. Run the function in `capture-driver.js` with `{tools,tabId,side,row,width,theme,settle,scratch}`; `settle` is the text of `settle.js`. The `tools` adapter is the T3 preview tool set plus terminal `exec_command`, as used by the capture session. Repeat 1440/dark, 1440/light, 390/light, 390/dark. The height is 1000 or 844 respectively. The function closes side panels, opens Thread details if needed, records opening Choose editor, waits for settled frames, and requires ImageMagick AE=0 between two screenshots 500 ms apart. Full-surface frames are retained.
5. Run `files-driver.js` once per side/row at 1440x1000 dark for the file-tree context menu and compact file-preview chooser. E0 fixed has no Open with submenu, so it hovers the first surviving menu item instead. Each context/preview still also requires AE=0 over 500 ms. The file preview renders its source in a shadow root; wait for `diffs-container`, not a light-DOM text match.
6. Stop and restart servers between rows; editor discovery is cached. `servers.py stop <side>` terminates only its recorded process group. Confirm the four captured ports are free before restarting. `path-check.txt` in each run records command lookup. Standard fallback directories were checked for executable editor candidates as well; `gio` exists, but without DISPLAY/WAYLAND it was not offered as a file manager.
7. Run `node --input-type=module < resolver-probe.mjs` from each checkout's `apps/server`, saving stdout. This executes the production resolver with Node services. It compares E0/N0 and E1/N1, real Zed, a zeditor stub, and a Path-service remapping of the home fallback directory to a scratch symlink. The remapping is a labelled resolver harness; HOME and installed files are unchanged.
8. For the additional selection/launch recording, start both sides as E2A after the resolver script has created the zeditor stub. Run `selection-driver.js`. It selects VS Code, selects Zed, then presses Ctrl+O. The two lines in `variant-launches.txt` are the resulting simulated Zed launches, one from each revision. This proves routing, not a real GUI launch. The E1 fixed Ctrl+O separately wrote `code-launches.txt`.
9. For the separate remote projection, evaluate `desktop-harness.js` on the isolated fixed dev page. It renders the production picker in a fresh AtomRegistry per scenario and uses the production remote-capable-editors atom, without replacing that atom. Only presentation and a deferred desktopBridge response are fixture inputs. The registry retains initial presentation values across the asynchronous React mount. Run `remote-driver.js` with before/fixed probe lists: E0 `["zed"]` / `[]`, E1 `["vscode","zed"]` / `["vscode"]`, E2 both `["vscode","zed"]`. The recording shows initial VS Code fallback, opens the chooser, then releases the probe. The harness is visibly labelled. It does not validate Electron IPC, viewer-process executable discovery, or SSH launch.
10. Run `diff-images.py <final-directory>` to generate amplified zero-fuzz and 2%-fuzz ImageMagick masks. `make-sheets.py` assembles the evidence sheets; `review-videos.py` extracts review frames. Inspect every retained image and recording before publishing. `publish.py` uploads only enumerated synthetic artifacts with `ghdrop upload -m` and preserves its output verbatim. `build-evidence.py` assembles the public index and Evidence section from those immutable URLs.

The clock is frozen at 2026-11-09 18:00 UTC, font scaling is 100%, and scroll is at the top. `settle.js` awaits loaded fonts and 700 ms without resource activity. T3 preview has no native reduced-motion setting; the driver overrides the JS media query and suppresses animation/transitions/caret with CSS. No fixture changes application labels or editor discovery results.

All recordings and captures are synthetic. No live database, runtime model identifiers, tokens, or server logs are published. AI-assisted; verified with the tests and tools listed above.
