Babysitter Watchdog

What runs when the babysitter falls asleep. Built 2026-09-07 21:18 from its own 918-run log.

Live heartbeats

babysitter
--
5 min interval
watchdog
--
15 min interval
this page
--
rebuilt each sweep
muted streak
0
fires at 24

The problem, measured on its own log

FindingNumberWhat it means
Cycles that found chats and raised nothing107 of 156 (68 percent)The alarm carried a subset of what the detector found
Sweeps that crashed outright1A NameError on 09-06 produced one log line and no notification
Largest silent gap454 minOvernight machine sleep, which looks exactly like a dead daemon
A chat parked 8.9 days1 alert, everIdle time was absent from the dedup key, so a quiet chat nagged once

A chat that goes quiet and the babysitter going quiet produce the same signature. Neither one raises anything, and both look like calm.

Fix 1 idle ladder

The dedup key was uuid : rules : turns/500. A dead chat's turn count never grows, so its key froze the moment it stopped working. The key now carries an idle step, crossing at 1h 4h 12h 1d 3d 7d, so a parked chat returns to the alarm on a widening schedule instead of once.

Result on the first sweep after the change: 28 chats re-armed, including one at 20.3 days idle that had been frozen out of the alarm entirely.

Fix 2 seven detectors on silence

IDFires whenThe failure it catches
D1_STALLEDno stamped log line for 13 min on a 5 min jobthe daemon stopped and nothing said so
D2_EXITFAILlaunchd reports a non-zero last exit codethe script died on its own terms
D3_SWEEPFAILSWEEP-FAILED appears in lines newer than the last checkthe 09-06 NameError, which told nobody
D4_CRASHTraceback, NameError or SyntaxError in fresh linesa python fault inside a run that still exits 0
D5_PAGESTALElive board stamp older than 35 minlocal build fresh, GitHub Pages build silently failed
D6_PUSHLOSTa push logged inside the poll window with no matching ntfy messagecurl swallowed by || true while the log says pushed
D7_MUTED24 straight cycles that found chats and raised nothingthe exact bug that started this, caught generically

Machine sleep is suppressed by comparison. The watchdog records its own last run. When the babysitter's gap and the watchdog's gap match within 3 minutes, both clocks paused together, so the Mac slept and nothing is broken. A gap on the babysitter alone still alarms.

Who watches the watchdog. Each one asserts the other. The babysitter pushes WATCHDOG DOWN when the watchdog heartbeat passes 45 minutes, and the watchdog pushes on any of the seven above. Two independent launchd jobs on different intervals, so one dying is caught by the other, and both dying at once shows as two stale heartbeats at the top of this page.

Proof

CheckEvidence
Detector selftest11 of 11 behaved correctly, including two negative cases
Idle ladder livenew_alerts=28, pushed 28 at 21:18:21
Watchdog under launchdcom.drwu.babysit-watchdog, 900s, pushed 2 real alarms on its first pass
Both push topics2 of 2 confirmed by ntfy poll
Second watchdog passzero alarms, muted streak back to 0