Pi heartbeat
every ~30s · touch()
+ ensure_runtime (FF)
last_active_at
kept fresh
in Postgres
idle reaper
stop if idle ≥
RUNTIME_IDLE_SEC (1800s)
only fires if no heartbeat