0.20.0 — fleet-wide liveness: supervised + wake-path watchdogs, remote receiver/agent health, mesh fleet
Fleet-wide liveness truth: every stall mode of a receiver is now detectable, most are auto-recovered, and each node's health is visible from every other node — plus two receive-path crash-class fixes. All new presence fields (recv/agent/wake) are additive, advisory, and display-only; older peers ignore them and read as "unknown" (mixed-version-safe).
- #158/#164 —
watch --supervisedstall-watchdog: a supervised receiver with a stale heartbeat recovers itself (close-response, then os._exit under a KeepAlive restarter). - #166/#167 — presence carries receiver-health: pong/ack frames stamp the sender's own
recv: healthy|stalled. - #169 —
mesh fleet: read-only fleet health table (last-seen, posture/status, RECEIVER/AGENT columns). - #170/#171 — agent-liveness heartbeat: distinguishes a live agent from a bare watcher; propagated as a raw
agent: active|idlecolumn. - #173/#175 — receive-path type-gating: crafted authenticated frames carrying non-strings where state strings are expected can no longer crash the receive loop.
- #158/#176 — wake-path watchdog: detects deliveries buffered while no agent drains them; SIGTERMs a positively-identified wedged defer-mode hook (relay/unknown-mode holders never touched, pid-reuse guarded) so the wake path re-arms; surfaces the unarmed case via classification logs,
mesh status, and awake: ok|stalledpresence key. - #168 — no session URLs in the public record (repo attribution kill-switch + CLAUDE.md hard constraint).
See CHANGELOG.md for detail. Upgrade nodes with pipx install --force a2acast (or your install method) and restart long-lived mesh processes to cycle onto the new code.