v0.1.29: heartbeat starvation signal
heartbeat: surface tasks nudged-but-never-started
The heartbeat reaper already force-closes runaway in_progress tasks. This adds a signal for the opposite silent failure: a task that gets nudged every tick but never leaves todo (started_at stays empty) — which is what the codex/grok listen-loop watchdog starvation produces (a task /goal goes active but the agent is yanked back into wait_for_message before it runs task start).
- Per-task nudge counts tracked in the registry (
.agents[<name>].heartbeat.nudges), pruned once a task leavestodo. - After 3 nudges with no start, the tick logs a
WARNand reports astarvedcount in its summary instead of re-nudging silently forever.
Defense-in-depth — the root-cause watchdog liveness fix is shipping separately in the telegram-codex/telegram-grok plugins.