For one person and the agents they run.

Your agents ask you first.

Claude Code, Cursor, a ChatGPT or Claude connector, your own script, an agent with a wallet. One set of rules for all of them, one inbox where the moments that matter wait for your yes, wherever you are, one record of what they tried.

Free under 500 actions a month and one connection. No card. $12 a month after that.

What it catches

Claude Code, through your MCP tools

Merge payments-service into main?

rule: merges to main wait for you. Expires in 41 min.

Merges to main wait for you. The rule is yours. The agent cannot talk its way past it, and it is not told where the line is.

Cursor agent, through your MCP tools

Attach AdministratorAccess to role/deploy?

rule: permission changes wait. Expires in 38 min.

Permission changes wait. Anything with no rule at all is blocked. Silence is never permission.

Shopping agent, wallet on Coinbase

Pay $340.00 to a new seller?

rule: new sellers wait at any amount. Approved amounts are exact.

Money moves once, for exactly what you approved. $350 under a $340 approval is refused. A lost reply is never retried on a guess.

Three steps, once

1

Connect an agent

One MCP URL for Claude Code, Cursor or a connector. One line for your own code.

2

Say what waits for you

Start from "observe everything". Add the rules that matter: production, money above an amount, sending to many people.

3

Approve where you already are

In your assistant, by Slack DM, on Telegram or on WhatsApp. Every decision leaves a receipt you keep.

Free to start. $12 a month when you need more.

Free under 500 actions a month and one connection, no card. $12 a month, or $99 a year, for three connections, 5,000 actions and 30 days of receipts.

Start Personal See pricing

When someone else has to say yes, that's Business.

Transparent by design

The code that keeps your agents in check is open source. Read it, run the same checks we run, and keep every receipt in a format you own.

Trust is something you verify, not something we ask for.

Read the code on GitHub

$ ctrlrun verify
ctrlrun verify — ctrlrun 0.12.2, catalogue ctrlrun.guarantees/v7
policy     ctrlrun.yaml (ctrlrun.policy/v2, mode: enforce)
store      sqlite, scratch (created and destroyed for this run)

G1   mutated approval refused         PASS  stripe.refund
G2   replayed approval refused        PASS  stripe.refund
G3   duplicate effect refused         PASS  stripe.refund
G4   one winner under concurrency     PASS  stripe.refund (8 processes)
G5   ambiguous blocks a blind retry   PASS  stripe.refund
G7   no principal refused             PASS  stripe.refund
G10  unknown exception is ambiguous   PASS  stripe.refund
G11  an altered receipt is detected   PASS  stripe.refund
G12  a byte written is ambiguous      PASS  stripe.refund
…
20/20 declared guarantees pass. 12 not applicable: G8, G9, G13, G15, G17, G19, G22, G23, G24, G25, G26, G27.