What's new
fix silent updater-spawn failure on Windows (drop DETACHED_PROCESS)
Live-tested the actual v4.1.8->v4.1.9 update path today and found the
update silently never happened: install_update correctly downloaded the
new exe and wrote a correct updater script, but spawning it via
Command::new("cmd")...creation_flags(DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP
| CREATE_NO_WINDOW).spawn() never actually produced a running process.
Confirmed via CreateProcess P/Invoke + .NET Process.Start controls that
DETACHED_PROCESS combined with CREATE_NO_WINDOW fails outright
(ERROR_INVALID_NAME) in this environment, while CREATE_NO_WINDOW alone
(matching .NET's own CreateNoWindow behavior) works correctly.
Removed DETACHED_PROCESS (redundant with CREATE_NO_WINDOW anyway) and
added a post-spawn liveness check (log a warning if the script exits
within 300ms) so a fast-failing spawn is never silently invisible again.
Portable builds for Windows, macOS (Apple Silicon + Intel), and Linux. The app auto-updates itself on next launch.