The real flow quits the app (or mutates the checkout), so the update UI
was unreviewable. Two permanent dry runs:
- desktop: __SIMULATE_UPDATE__() drives the real update stores through
realistic stage/log transitions with selectable terminal states
(restart/error/manual/guiSkew, client or backend); npm run
dev:fake-update auto-plays it at boot. Dev-only, vite-aliased out of
shipped builds.
- installer: --update --simulate plays the exact stage/log event stream
in the real Tauri window with no process spawned and nothing modified;
npm run tauri:simulate-update[-fail][-dark]. Gated to debug_assertions;
release binaries ignore the flag.