The daily checkup
Every morning at 8, one job checks 18 things about the box. It fixes what is safe to fix. It emails the owner only if something is still wrong. Silence means all is well.
Where you see it
Most days, nowhere. That is the point. When something is wrong, the owner gets one email that says the box needs attention. The details sit on the Daily checkup card on the Health tab. The email is the "come look" ping. The tab is where the owner acts.
The card is written on every run, even quiet ones. So a quiet week and a dead week never look the same.
What happens, step by step
- At 8 a.m. the timer starts
healthcheck.py(the checkup). - It runs all 18 checks below.
- For anything with a safe, known fix, it applies the fix and checks that it worked.
- It writes its card for the Health tab.
- If anything is still wrong, it sends one email and files one batched report to Otto.
- If a repair was needed three days running, it raises a louder alarm. A repeat means a real cause.
| # | What it checks |
|---|---|
| 1 | The agent's own heartbeat is fresh. |
| 2 | Claude is still signed in. |
| 3 | The Google logins (mail and calendar) still work. |
| 4 | A tap-to-reconnect did not quietly half-fail. |
| 5 | Disk space. |
| 6 | Memory pressure. |
| 7 | No leftover browser programs are piling up. |
| 8 | The box's files match the folder in git (drift). |
| 9 | Secrets match between machines. |
| 10 | The six always-on services are running: sign-in, the agent page, Discord, the tool door, the WhatsApp bridge, the web server. |
| 11 | Every timer still exists and is still scheduled. |
| 12 | The chat page answers from the open internet. This catches an expired certificate or bad address setup that inside checks miss. |
| 13 | The overnight morning prep finished. |
| 14 | The help-bot gap check ran. |
| 15 | The inbox assistant is alive. |
| 16 | WhatsApp is still paired and fresh. |
| 17 | WhatsApp can actually send. |
| 18 | A login borrowed from another machine still works. |
Checks 13 to 15 and 18 watch routines from the reference install. A different owner's box watches its own.
What powers it
| Part | What it does |
|---|---|
healthcheck.py | Runs the 18 checks, applies safe fixes, writes the card, sends the email. |
agent-health.timer | Starts the checkup at 8 a.m. |
health_state.py | The shared card format every Health tab card uses. |
routine_report.py | Files whatever is left as one report to Otto. |
box-fresh | The repair it can run for memory and browser buildup. |
Why it works this way
Health is "is it up", not "is it right". The checkup never judges whether the agent's answers are any good. That is a separate, scored test.
It only emails on failure, because a daily "all fine" email stops being read. Then the one that matters gets missed too.
Check 17 exists because being paired and being able to send turned out to be two different things. WhatsApp looked connected while no message could leave.
Check 12 tests from the outside in. Every inside check can pass while no one on the internet can reach the page.
Connected to
- The Health tab: where the card shows.
- Self-repair: the repair the checkup runs for check 7.
- Otto, the fixer: who gets what the checkup could not fix.
- How changes reach the box: what check 8 compares against.