AppImage launcher proof

Use separate clean checkouts of the base and head commits. Install dependencies with `vp i` in each.
Build synthetic releases with the repository's normal artifact builder:

```
vp run dist:desktop:artifact --platform linux --target AppImage --arch x64 --build-version VERSION --mock-updates --mock-update-server-port 19377 --output-dir OUTPUT
```

Base versions: 0.1.9 and 0.1.10. Head versions: 0.1.10 and 0.1.11.
The later package for each commit reused that checkout's compiled bundles with `--skip-build` and changed package version metadata. No application source was modified. All updates use electron-updater, actual AppImages, generated update manifests, and SHA-512 validation.

Serve the later package's output directory:

```
python3 -m http.server 19377 --bind 127.0.0.1 --directory OUTPUT
```

Keep drive.mjs and cdp.mjs together. Run each case on its own virtual desktop:

```
EVIDENCE_ROOT=SCRATCH EVIDENCE_INITIAL=INITIAL_APPIMAGE headless-desktop node drive.mjs before
EVIDENCE_ROOT=SCRATCH EVIDENCE_INITIAL=INITIAL_APPIMAGE headless-desktop node drive.mjs after
```

For `before`, install the base-built 0.1.9 AppImage and serve base-built 0.1.10.
For `after`, install head-built 0.1.10 and serve head-built 0.1.11.
For `transition`, install base-built 0.1.9 and serve head-built 0.1.11.

The driver creates a fresh synthetic HOME, copies the initial AppImage into its Applications directory, makes it executable, creates the stable T3-Code.AppImage symlink, and creates a desktop entry targeting the symlink. It launches using `gio launch`, completes onboarding without an agent, and calls the real desktop preload update actions. No provider turn or copied user database is needed.

AppImages run with their built-in APPIMAGE_EXTRACT_AND_RUN mode. The recording includes the real Electron window and a terminal displaying driver observations. The driver waits for matching screenshots 500 ms apart before stills. It accepts the update, watches the restart, checks the original path and stable symlink, clicks the app's close button, and launches the same desktop entry again. No screenshot contents are edited.

Observed results:
- Base: original versioned AppImage removed; stable symlink broken; launcher exits 1 and no app opens.
- Head: original version-free path remains; launcher exits 0 and app opens after quitting.
- Transition: the former versioned path becomes a relative symlink to T3-Code-x86_64.AppImage; the old launcher exits 0 and opens the app.
