0a26e77899
The handshake ran synchronously in Bridge::connect: on a build-id mismatch it sent Cmd::Shutdown and awaited a reply that never flushes (the daemon exits first), so request() hit its 5s timeout and the reconnect-retry respawned the daemon and re-sent Shutdown — a loop that produced repeated 'spaceshd listening' lines and a multi-second launch delay. The id stamps also differed between the separately-built daemon and GUI, so it fired on normal launches. - Remove the handshake auto-restart; `make install`/`reinstall` already kill and replace the daemon reliably. health.build stays for display in Settings. - Shutdown now goes through a fire-and-forget send (no reply wait, no retry), fixing the same loop for the Settings Restart button. - Makefile: `make app-bundle` builds just the .app via `tauri build --bundles app` (no .dmg, no hdiutil) and `reinstall` uses it — faster self-update that can't hang on a mounted DMG volume. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>