hephaestus/docs/changelog.d
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
..
+sync-age-seconds.feature.md feat(heph-tui): show sync age in seconds under a minute 2026-06-06 11:24:09 -07:00
.gitkeep
daemon-restart-race.bugfix.md fix(heph): make macOS heph daemon restart race-free 2026-06-08 13:38:47 -07:00
daemon-self-update-interval.feature.md feat(heph): bake daemon mode/hub/oidc/self-update-interval into the service 2026-06-08 13:25:15 -07:00