fix(update): restart the stackvox daemon after an app update#124
Merged
Conversation
The in-app updater swaps the new bundle (with a fresh stackvox venv) into place but only kickstarted the panel agent — never the daemon. So the long-running `stackvox serve` kept executing the pre-update engine until the next login or crash, and engine fixes (streaming playback, pronunciation, ...) silently did not take effect after updating. Parameterize kickstartLaunchd(label:) and kickstart the daemon agent (com.stackonehq.stack-nudge-daemon) after the atomic swap. Non-fatal: launchd KeepAlive covers it on next login, and shell installs without the daemon agent just get a harmless no-op kickstart. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This was referenced Jul 10, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The in-app updater swaps a new bundle (with a fresh stackvox venv) into place but only kickstarted the panel launchd agent — never the daemon. So the long-running
stackvox servekept executing the pre-update engine until the next login or crash, and engine fixes (streaming playback, pronunciation, …) silently didn't take effect after an app update. This is how you can end up with a new client but a stale daemon doing the actual playback.Changes
panel/Updater.swift: parameterizekickstartLaunchd(_ label:)and addrestartDaemon(), called right after the atomic swap. It kickstartscom.stackonehq.stack-nudge-daemonso the daemon re-execs the stackvox engine the swap just installed.KeepAlivealready brings the daemon back on next login, and shell installs that never registered the daemon agent just get a harmless "not loaded" kickstart.Testing
swiftc -typecheck panel/*.swift shared/*.swift— clean (only the pre-existingonChange(of:perform:)deprecation warnings, unrelated to this change).launchctl print gui/$(id -u)/com.stackonehq.stack-nudge-daemon— and thatstackvox statusreports the updated engine version.Pairs with a companion stackvox change that makes
stackvox statusprint a client/daemon version-skew warning, so any remaining drift is visible rather than silent.Related issues
None.