Adjudicate 2026-07-29: drop the wedged-loop heartbeat, add a hang-bounding fold-in
Heartbeat dropped: a Docker healthcheck badge restarts nothing under this container's setup, spark-control's tile would need its own change to read it, and serial per-room polling (a review may run 10 min) makes any staleness threshold either too loose to be timely or noisy mid-review. No wedge has ever been observed. Reopens on an observed wedge plus confirmation the tile already renders Docker health. Replaced by a fold-in, since the realistic failure is a hang rather than a crash: bound the two unbounded awaits in src/bot.py and stop the process if the poll task ever dies, letting restart: unless-stopped and the existing spark-control tile cover it. AGENTS.md Current state reconciled to match. Phase 3's onboard-3-repos verify item stands (inside the 14-day skip window).
This commit is contained in:
+8
-5
@@ -12,11 +12,14 @@ Phases beyond the first milestone (threaded single-flow review + merge/reject/de
|
||||
task walks the rooms in turn), so "no interleaving" is trivially satisfied; the thing actually worth
|
||||
watching at 3+ repos is a long review **head-of-line-blocking** the next room's poll, i.e. the latency
|
||||
problem the deferred poll→webhook item anticipates.)*
|
||||
- Emit a heartbeat the poll loop touches, so a **wedged** bot (container up, sync/poll loop silently
|
||||
stuck) is distinguishable from a healthy one — today it looks identical from outside. Crash detection
|
||||
is already covered by spark-control's tile, which reads the container's docker state; this is only the
|
||||
gap that leaves. Lightest correct form is a heartbeat file a Docker healthcheck or any monitor can
|
||||
read, **not** an HTTP status server (this repo has no HTTP surface; don't add one for a badge).
|
||||
|
||||
## Fold-ins — do opportunistically, never a session of their own
|
||||
- *(fold-in, not a session of its own)* Next time `src/bot.py`'s SSH or Matrix-send path is edited:
|
||||
bound the two unbounded awaits (`await proc.wait()` after the timeout kill in `ssh_run`;
|
||||
`client.room_send` in `say()`), and attach a done-callback to the poll task that stops the process
|
||||
if it ever dies, so the existing `restart: unless-stopped` + spark-control tile cover it. No hang
|
||||
has been observed; this is "unbounded is not a defensible default in a loop with no supervisor",
|
||||
not a fix for a diagnosed bug. *(adjudicated 2026-07-29: fold-in only)*
|
||||
|
||||
## Deferred / non-goals
|
||||
- Not a Claude-session bot (that's matrix-bridge); not Maubot (revisit at ~6+ bots or web-UI mgmt);
|
||||
|
||||
Reference in New Issue
Block a user