Desktop update-track save evidence

Run each commit in its own checkout after `vp i`:

```
APP_VERSION=1.2.3 vp run build:desktop:bundle
(cd apps/desktop && node node_modules/electron/install.js)
```

Place stage.py and driver.cjs in one evidence directory. Stage each checkout with:

```
python3 stage.py "$BASE_CHECKOUT" "$EVIDENCE_DIR/base-app"
python3 stage.py "$HEAD_CHECKOUT" "$EVIDENCE_DIR/head-app"
EVIDENCE_CHECKOUT="$HEAD_CHECKOUT" headless-desktop node "$EVIDENCE_DIR/driver.cjs" base
EVIDENCE_CHECKOUT="$HEAD_CHECKOUT" headless-desktop node "$EVIDENCE_DIR/driver.cjs" head
```

The staged Electron apps use their actual compiled main process, preload, server, and web client. Both have package version 1.2.3 and a local generic update feed. The desktop mock-feed setting changes only the feed URL. No update service, reducer, IPC handler, settings service, or updater event is mocked. The driver creates a fresh home per run, skips onboarding without importing data, and opens About at 1100 x 780 in the default light theme.

The driver replaces the scratch desktop-settings.json destination with a directory. The real settings writer then fails its atomic rename when desktopBridge.setUpdateChannel("nightly", "1.2.5-nightly.20261028.1") invokes the real desktop IPC. The promise rejects with DesktopUpdateChannelPersistenceError and the track stays latest (Stable). The HTTP feed then changes to Stable 1.2.4, and the driver clicks the real Check for Updates button and hovers the resulting action. It records the interaction and captures two identical screenshots 500 ms apart. Public captures are cropped to the About update controls to exclude unrelated installation paths.

Before: Up to Date, Stable, availableVersion null.
After: Download, Stable, availableVersion 1.2.4 (in the captured IPC state).

This proves the failed-save and subsequent Stable offer path through the real packaged desktop app. The guarded track-switch dialog, public release service, downloads, installation, and other operating systems were not exercised. No tests are used as evidence.

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