Field notes · 2026-08-25 · RunVouch

The dead man's switch for AI agents (and why a ping isn't enough)

A ping monitor knows a job ran. For an agent that is the least interesting fact. What a dead man's switch has to check when the job is an LLM.

A dead man's switch is the oldest trick in operations: the job has to check in, and silence is the alarm. Healthchecks.io and Cronitor built good businesses on it for cron. I used Healthchecks for years and still think it is the right shape. But when the job became an agent, the switch stopped catching what actually went wrong.

RunVouch is a dead man's switch, cost cap and outcome check for unattended AI agents: it expects a heartbeat per run, alerts when a run or a day crosses a dollar cap, and tells you when a run is missed, stalled, looping or produced no evidence.

What a ping monitor knows, and what it can't

A ping monitor knows exactly one thing: at some moment, something sent an HTTP request to a URL. From that it derives "the job ran" and, with a schedule, "the job is late". That is enough when the job is a backup script: if it ran, it almost certainly did the thing, because the thing is deterministic.

An agent is not deterministic. It can run to completion, exit zero, send the ping, and have done nothing useful. Anthropic says this plainly about Claude Code Routines: a green status "does not mean the task in your prompt succeeded" (docs). The ping is sent by the same process that may have gone wrong, so the ping inherits the agent's blind spots.

The four questions a dead man's switch for agents has to answer

Why the clock has to live outside the agent

Every one of those checks has the same design rule: the thing that notices must not be the thing that fails. An agent cannot report that it never started. A hung agent is, by definition, not reporting. A looping agent is convinced it is making progress. So the expected cadence, the max runtime, the evidence rule and the cost cap all live on the watchdog's side, and the agent's only job is to check in with facts: started, tool called, ended with this exit code and this evidence.

The corollary is that the watchdog must never be able to take the job down. rv run fails open: if RunVouch is unreachable, your command runs exactly as before and you lose one run of monitoring, not the run.

Two lines around any job

rv agent nightly-report --cadence 24h --cap-run-cost 2 --evidence
rv run nightly-report --evidence-file out/report.html -- claude -p "build tonight's report"

For Claude Code there is a plugin that does this through hooks; for Python and Node there are one-file clients; for everything else two HTTP calls. Alerts go to Telegram, Slack or a webhook. If you already run Healthchecks or Cronitor for classic cron, keep them — RunVouch is for the jobs where "it ran" is not the question.

FAQ

Isn't this just Healthchecks with extra fields?
The heartbeat part is the same idea, deliberately. The difference is evidence, retry-storm detection and cost caps — three checks that need to know about tool calls and outcomes, which a ping URL cannot carry.

What counts as evidence?
A file that exists, is non-empty and was modified during the run; an HTTPS URL that returns 200 after the run; or a boolean/assertion your code supplies. You decide up front what "done" looks like.

Does it need my prompts or outputs?
No. It receives timestamps, exit status, tool names, a hash of tool inputs, cost and token counts, output size and evidence verdicts. Prompts and outputs stay with you.


Try it: free for 3 agents · Docs: Claude Code · cron