Otto, the fixer
Every broken routine reports to one agent, Otto. He applies a known fix and then tells the owner. Anything else, he diagnoses and proposes. He never repairs anything silently.
Otto is an AI character, not staff. His folder is called routines-fixer, because that is the job.
Where you see it
Otto has a desk on the Office. The owner hears from him only when something broke, plus one line every Monday. When everything is green, the owner hears nothing. Mail that arrives every day stops being read.
Otto talks to no one outside the box. His only reader is the owner.
What happens, step by step
Say the email check stops leaving its proof file.
- The checker files one report into Otto's inbox. The alarm clock wakes him within 15 minutes.
- He reads his plan, memory, scoreboard, and recent log first. Only then does he open the inbox.
- He looks at the real box: the job's status, its log, its proof file. Never a note about it.
- He names the cause with evidence, or says he could not find it.
- He climbs the ladder (below).
- He writes the "before" state, then one row in his ledger.
- He reports what happened, in plain words.
The three rungs:
- Runbook. The break matches a known fix in
runbooks.md. He applies it, checks it, logs it, and tells the owner. Auto, then tell. Never auto and silent. - Diagnose and propose. No known fix fits. He finds the cause, writes the fix he would make and what it could affect, and raises one question. Then he waits for a yes.
- Hand it over. He cannot find the cause, or it needs the owner's hands. He says what he checked, what he ruled out, and what he would try next.
A fix counts only after the job's next run is green and 24 hours pass with no repeat. The same repair three days running is not a third fix. It is a real problem, raised as a question.
What powers it
| Part | What it does |
|---|---|
agent.md | Otto's contract: his job, his limits, his ladder. |
runbooks.md | The known fixes he may apply alone. One right answer each. |
fixes.jsonl | The ledger. One row per event. Rows are never edited or deleted, only replaced by a newer row. |
scoreboard.md | His numbers, worked out from the ledger, not from memory. |
routine_report.py | Files every break into his inbox. Which agent gets it is a setting, not a hard-coded name. |
What he may never do alone: redeploy the box, write to the owner's files, logins, or accounts, reach the outside world, tap a reconnect link, touch another agent's folder, change more than one file or setting per fix, or run any admin command outside a short fixed list.
His numbers:
- Breaks caused by things the system controls: target 0 a month.
- Breaks fixed without the owner: target 80%.
- Hours to repair.
- Budget: $30 a month. Past it, he stops and asks.
On Mondays he also reads the code of one routine and proposes one improvement, or logs "nothing needed". Reading only. He never changes a working routine on his own.
Why it works this way
The owner said: "I want everything always working and auto-fixing." One fixer for every routine means every break lands in one place, is fixed one way, and is counted in one ledger. The owner has one desk to check, not one per job.
Every automation needs three things: a done check on real output, one recovery path, and a loud alarm if even recovery fails. A checker is an automation too. The daily health check once broke with dozens of places to report a problem and zero places to fix one.
Connected to
- Proof it ran: how breaks are found and filed.
- The daily checkup: one of the three sources of his reports.
- How an agent wakes: the alarm clock that starts him.
- The trust ramp: why his runbook starts small.