Skip to main content

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 = 1

    Repos without a section keep the global --workers/--parallel behavior. 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 applies workers/scheduler/poll to 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 0600 file and a daemon restart from a token-less shell recovers it automatically. Recovery is restart-only (a deliberately token-less daemon start won't resurrect it), a recovered token is flagged as possibly stale/revoked (verify with gitmoot doctor, which live- probes validity), and daemon stop --forget-runtime-auth invalidates 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. --repo on daemon run/start is 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-issues polling no longer burns a core (#566) — per-issue comment pagination collapses into one since=-bounded repo-wide call per repo per tick; unchanged repos cost almost nothing.
  • See why a job is stuck (#552) — job list/job show surface a concise reason for queued/blocked jobs (lock wait, retry schedule, auth) and doctor validates runtime auth proactively.

Web dashboard (#503)

  • gitmoot dashboard --web serves 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, bulk pull, [template_remote] default config, and diff against 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), the review action (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.