What runs when the babysitter falls asleep. Built 2026-09-07 21:18 from its own 918-run log.
| Finding | Number | What it means |
|---|---|---|
| Cycles that found chats and raised nothing | 107 of 156 (68 percent) | The alarm carried a subset of what the detector found |
| Sweeps that crashed outright | 1 | A NameError on 09-06 produced one log line and no notification |
| Largest silent gap | 454 min | Overnight machine sleep, which looks exactly like a dead daemon |
| A chat parked 8.9 days | 1 alert, ever | Idle 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.
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.
| ID | Fires when | The failure it catches |
|---|---|---|
D1_STALLED | no stamped log line for 13 min on a 5 min job | the daemon stopped and nothing said so |
D2_EXITFAIL | launchd reports a non-zero last exit code | the script died on its own terms |
D3_SWEEPFAIL | SWEEP-FAILED appears in lines newer than the last check | the 09-06 NameError, which told nobody |
D4_CRASH | Traceback, NameError or SyntaxError in fresh lines | a python fault inside a run that still exits 0 |
D5_PAGESTALE | live board stamp older than 35 min | local build fresh, GitHub Pages build silently failed |
D6_PUSHLOST | a push logged inside the poll window with no matching ntfy message | curl swallowed by || true while the log says pushed |
D7_MUTED | 24 straight cycles that found chats and raised nothing | the 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.
| Check | Evidence |
|---|---|
| Detector selftest | 11 of 11 behaved correctly, including two negative cases |
| Idle ladder live | new_alerts=28, pushed 28 at 21:18:21 |
| Watchdog under launchd | com.drwu.babysit-watchdog, 900s, pushed 2 real alarms on its first pass |
| Both push topics | 2 of 2 confirmed by ntfy poll |
| Second watchdog pass | zero alarms, muted streak back to 0 |