Gitmoot v0.8.1
The daemon becomes tunable without restarts — and restarts become safe. This release closes the #559 footgun end-to-end, hardens job recovery, and ships the first version of the web dashboard. Everything new is additive; defaults are unchanged.
What's new since v0.8.0
Tune the daemon live (#559, closed)
-
Per-repo concurrency (#576) — cap one repo's parallelism from config, without restarting the shared daemon:
[repos."owner/repo"]max_parallel = 1Repos without a section keep the global
--workers/--parallelbehavior. The old "relaunch with--parallel N" hint now points at this knob instead of a destructive restart. -
Warm SIGHUP reload (#577) —
kill -HUP <daemon-pid>re-reads[daemon]config and appliesworkers/scheduler/pollto the running daemon: no teardown, no dropped in-flight jobs, no environment re-inheritance. The live worker limit is picked up on the next dispatch pass. Explicit launch flags stay pinned across reloads. -
Runtime auth survives restarts (#578, hardened by #588) — the daemon persists its Claude token to an owner-only
0600file and adaemon restartfrom a token-less shell recovers it automatically. Recovery is restart-only (a deliberately token-lessdaemon startwon't resurrect it), a recovered token is flagged as possibly stale/revoked (verify withgitmoot doctor, which live- probes validity), anddaemon stop --forget-runtime-authinvalidates it. -
Loud auth-drop warning (#581) — if a (re)start would still come up without Claude auth, the daemon says so at start time instead of failing jobs silently hours later.
--repoondaemon run/startis documented accurately: it scopes the daemon to that single repo (polling + job claims); omit it to supervise every enabled repo.
Daemon reliability
- Worker loops survive transient errors, escalate persistent ones (#555) — a single failing tick no longer kills the supervisor, while a persistent infra fault (disk full, corrupt store) still escalates to systemd instead of spinning silently. Polls are time-bounded so a wedged poll can't hold the checkout lock forever.
- Stale-running recovery: configurable + #536-safe (#560) — the recovery
window is tunable (
GITMOOT_STALE_RUNNING_AFTER; the smallest honored value is 1m — below-1m/malformed values fall back to the 30m default), recovery is prompt at lease expiry, and runtime leases now carry a teardown grace margin so a live worker finishing up can never be requeued onto its own dirty worktree. --watch-issuespolling no longer burns a core (#566) — per-issue comment pagination collapses into onesince=-bounded repo-wide call per repo per tick; unchanged repos cost almost nothing.- See why a job is stuck (#552) —
job list/job showsurface a concise reason for queued/blocked jobs (lock wait, retry schedule, auth) anddoctorvalidates runtime auth proactively.
Web dashboard (#503)
gitmoot dashboard --webserves a live orchestration view: the delegation graph with real node timing, run summaries, prompt/output inspection, and an auto-refreshing run list.
Templates & heartbeats, finalized
- GitHub-backed templates (#476) —
agent template publish, bulkpull,[template_remote]default config, anddiffagainst the pulled source complete the backup/share round-trip started in v0.8.0. - Heartbeat schedules (#533) — write-side CLI (
agent heartbeat add/list/enable/disable/remove), thereviewaction (fixed end-to-end by its own E2E), and per-heartbeat observability.
Verification
- Mutation-proven full-chain E2Es now cover the template round-trip, the live heartbeat loop, restart auth warning/recovery, warm reload, and per-repo caps (#567 #568 #581 #591 #592 #593). The CI race step is explicitly bounded (#573).
Thanks @gaijinjoe — the wedged-worker and stale-recovery fixes build directly on his PRs (#555, #560), co-authored.