Field notes · 2026-08-25 · RunVouch
Cronitor for AI agents: what changes when the job is an LLM
A cron monitor tells you the job ran. An AI agent also needs a cost cap, loop detection and an outcome check. What to keep and what to add.
I have used cron monitors for years, and for the last two years I have had a crypto trading bot running unattended on a box I do not look at before coffee. The monitor earned its keep. When the machine rebooted at 3am and the job never fired, I knew within the hour. Then I started putting LLM agents on those same schedules, and the monitor kept telling me everything was fine while the agent did nothing useful for three nights in a row.
RunVouch is a dead man's switch, cost cap and outcome check for unattended AI agents: it alerts you when a scheduled agent misses its window, fails, loops, overspends or produces no output. I built it because the cron monitor I already had was correct and still useless for this.
What a cron monitor like Cronitor actually sees
Cron monitors are built around process-level truth. Cronitor tracks three events per job, a run, a complete and a fail, plus duration, and it can alert when a job does not run on schedule, when duration goes above a maximum or below a minimum, or after a threshold of consecutive failures. Healthchecks.io is even more direct: your job pings a URL, silence past the grace period is an alert, and you signal a failure by appending /fail or the exit status to the ping URL. Their own docs are honest about the limit, which is that the service cannot see what happened inside the job.
For a bash script that rotates backups, that model is complete. Start, end, exit code, wall clock. There is nothing else worth knowing. I still run exactly that for my infrastructure jobs and I am not proposing you drop it.
What changes when the job is an LLM
Four things break the process model, and all four bit me before I wrote any code.
- Exit 0 stops meaning success. An agent that decides the repo looks fine, writes a paragraph explaining why it is not going to act, and returns cleanly is indistinguishable from an agent that did the work. Both are green.
- The job has a bill that moves. A backup script costs the same every night. An agent that picks up an extra tool call loop can cost twenty times its median run. Claude Code exports cost and token metrics over OpenTelemetry, but that integration is export only, so the alerting is yours to build. Anthropic's own routines announcement covers schedules, API triggers and daily limits per plan, and says nothing about what happens when a routine fails.
- Failure often looks like repetition, not a crash. The classic unattended agent failure is calling the same tool with the same input over and over, each attempt a paid round trip, exit code zero at the end.
- Blast radius is real. The AI Incident Database entry for the Replit agent records a production database deleted during a code freeze on 18 July 2025, followed by the agent misreporting what it had done. Whatever you conclude from that, a monitor that only reports duration would have called that run a success.
Cronitor for AI agents: the checks a scheduled agent needs
RunVouch keeps the three checks a cron monitor already gives you and adds five that only make sense when the job thinks.
MISSED: no run inside the cadence you declared. This is the heartbeat, same as before.FAILED: non-zero exit. Same as before.STALLED: a run started and never reported an end. Same as a maximum duration alert.NO_EVIDENCE: the run ended cleanly but the artifact it was supposed to produce is not there or is not fresh. This is the one that catches the polite refusal.BUDGET_RUNandBUDGET_DAY: a hard ceiling per run and per day, in dollars.RETRY_STORM: the same tool called with byte identical input eight times or more in one run.DRIFT: this run's shape compared against the median absolute deviation of the last seven runs. A job that normally takes four minutes and twelve tool calls, then takes forty seconds and two, is drifting even though it exited zero.
How to monitor a cron AI agent in practice
Declare the agent once, then wrap the command:
rv agent nightly-report --cadence 24h --cap-run-cost 2 --evidence rv run nightly-report --evidence-file out/report.html -- claude -p "write the daily report"
The client is stdlib only and fails open. If the RunVouch API is down or your key is wrong, rv run still runs your command and still returns its exit code. Monitoring that can break the job is worse than no monitoring.
For Claude Code specifically there is a plugin that hangs off the hook system. SessionStart, PostToolUse and Stop give session boundaries and every tool call, and the transcript gives real tokens and cost, so you get budget and retry storm detection without wrapping anything. There is also an MCP server, published in the official registry as com.runvouch/runvouch, and Python and Node clients for agents that are not shell shaped.
Alerts go to Telegram, Slack or a webhook. On a budget or storm alert RunVouch can call a pause webhook so the next scheduled run does not start. It never kills a running process. A half-finished agent that has written three files and not the fourth is a worse state than a finished expensive one, and the process is on your machine, not mine.
Keep the cron monitor, add the agent watchdog
These are not competitors. My backup jobs and my tunnel checks still ping a plain heartbeat monitor, because did it run is genuinely the whole question there. The agents get RunVouch, because did it run is the least interesting of the eight things that can go wrong. Running both on the same job is fine and costs you one extra line in the crontab.
Free covers 3 agents. Solo is $9 a month, Team is $29. The server is MIT licensed if you would rather run it yourself, and the hosted version runs in the EU.
Frequently asked questions
Can I use Cronitor or Healthchecks.io for AI agents?
Yes, and they will correctly tell you when the agent did not run or exited non-zero. What they cannot tell you is that the run cost eleven dollars, called the same tool nine times, or exited clean without writing the report, because that information never reaches an HTTP ping.
Does RunVouch stop the agent when it hits the cost cap?
It alerts, and it can call a webhook you control to pause the agent before the next run. It does not kill a running process. Deciding when it is safe to interrupt a half-done agent is a call only your code can make.
What if RunVouch itself is down?
Your job runs anyway. The rv client fails open by design, so a network error or an expired key is logged and ignored, and the wrapped command's exit code is passed through untouched. You lose the monitoring for that run, not the run.
Related field notes
- My Claude Code cron ran up $1,800 in two nights. The watchdog that stops it at $2
- Claude Code Routine failed silently? How to know your scheduled agent actually ran
- The dead man's switch for AI agents (and why a ping isn't enough)
Try it: free for 3 agents · Docs: Claude Code · cron