# Stalled desktop update download reproduction

Build each commit with `vp i`, then `vp run dist:desktop:linux --build-version 0.1.8 --output-dir <artifact-directory>`.
Extract each AppImage with `--appimage-extract` in separate directories. Set each extracted `resources/app-update.yml` to:

```yaml
provider: generic
url: http://127.0.0.1:18944
updaterCacheDirName: proof-updater
```

From the corresponding checkout, run `headless-desktop node updater-proof-driver.cjs <extracted-t3code-executable> <before-or-after>` with `PROOF_ROOT` set to an empty scratch directory.

The driver launches the real packaged app with a fresh T3 home and configuration directory, completes first-run setup without importing history, and opens Settings / About. It checks the feed, clicks Download, and waits 62 seconds. The local HTTP feed advertises a synthetic 0.1.9 AppImage; its asset endpoint deliberately sends neither response headers nor data. No updater, IPC, timer, or error result is mocked. Stable final screenshots require two identical screenshots 500 milliseconds apart. If Download becomes available, the driver clicks it again to demonstrate retry.

Observed base: still Downloading after 62 seconds, no timeout toast.
Observed head: timeout after about 60 seconds, toast includes `Error: Request timed out`, Download restored; clicking it starts another download.

Both runs used Linux x64 packaged Electron 44.10.1 under Xvfb, 1440 by 900, light theme, no imported projects or threads. Releases were assigned local version 0.1.8 solely to offer the synthetic 0.1.9 update. The only packaged configuration changed was app-update.yml. Videos retain real-time playback; they omit first-run setup and crop to the same About update panel to exclude unrelated private paths. Final screenshots use the same crop.

Not covered: packaged macOS arm64, Netskope/TLS inspection, differential fallback, successful download/install, and redaction of arbitrary URL-bearing error causes.

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