hephaestus/crates
Erich Blume f6b27414a8
All checks were successful
Build / validate (pull_request) Successful in 8m39s
fix(heph): make macOS heph daemon restart race-free
`restart` bootstrapped immediately after `bootout`, but `launchctl bootout` is
asynchronous: launchd may still be killing/reaping the job and removing its
label when the command returns. Bootstrapping into that transitional domain
fails with a generic `5: Input/output error`, intermittently — the odds depend
on how fast hephd (sync client + SQLite + a heph-quickadd child) shuts down.

- Wait for the label to actually clear (poll `launchctl print`, bounded) before
  re-bootstrapping, and retry the bootstrap to cover the residual settle window.
- When the plist is unchanged (the common binary-upgrade restart), use
  `launchctl kickstart -k` to restart the loaded job atomically — no
  bootout/bootstrap, no race. The full reload path is reserved for genuine
  config changes, where launchd must re-read the plist.

Start's bootstrap shares the same retry helper.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 13:38:47 -07:00
..
heph fix(heph): make macOS heph daemon restart race-free 2026-06-08 13:38:47 -07:00
heph-core feat(heph-tui,heph-pwa): humanized recurrence + indented/counted/scrolling project sidebar 2026-06-05 17:44:43 -07:00
heph-quickadd style: cargo fmt — normalize earlier hand-committed files 2026-06-03 20:38:44 -07:00
heph-tui feat(heph-tui): show sync age in seconds under a minute 2026-06-06 11:24:09 -07:00
hephd feat(heph-tui,hephd): surface sync health (last-sync age, conflicts, auth failure) 2026-06-06 10:19:11 -07:00