d1264a7797
Test / test (pull_request) Successful in 24m6s
The exit push spawned a detached task on AppExit, which process teardown almost always killed before the network round-trip completed — the final session's sync silently never happened (2026-07-06 review, finding M3). Local persistence meant no data loss, but stats stayed unsynced until the next launch. push_on_exit now blocks the closing app's final frame for at most EXIT_PUSH_TIMEOUT (2s) via tokio::time::timeout: long enough for one healthy round-trip, short enough that quitting never feels hung when the server is unreachable. Timeout and errors are logged and skipped — the next launch's pull/push converges as before. Closes review finding M3. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>