Guide

How do I stop an AI agent paying, sending, or deleting without me?

Updated

Short answer

Put the stops in code, not in a prompt. Waldo, a free and open source MCP server for macOS, gates four kinds of act: money, sending as you, passwords and keys, and destructive changes. The code decides when a gate applies, from facts it reads off the screen. Then it asks you, and only a real click from your own mouse can say yes. The agent cannot give its own yes.

An AI agent with hands can do real things. It can press Pay. It can send an email as you. It can type a password, or empty the Trash. Waldo gives any AI agent hands on your Mac, and he stops at four kinds of act every time. He asks you first, and he waits for your own click.

What are the four hard stops?

The hard stops live in Waldo’s code, not in a prompt. No model, however clever, can talk its way past them. Each gate catches a kind of act:

Gate It catches
Money Buttons such as Pay, Buy, Place order, and Transfer. Any click on a bank, broker, or checkout page.
Sending as you Buttons such as Send, Post, Reply, and Submit. Return in a chat app. Cmd+Return anywhere.
Passwords and keys Typing into a password field. Any click in Keychain Access, Passwords, 1Password, or a system password dialog.
Destructive changes Buttons such as Delete, Erase, Reset, and Sign out. A drop on the Trash. Cmd+Delete in Finder. Disk Utility.

A rule about what an act is, such as a Transfer button, asks every time. A rule about where you are, such as a bank’s site, offers a yes for ten minutes.

Why put the gates in code instead of a prompt?

A rule in a prompt is advice to the model. A model can be talked out of advice. A web page or an email can carry hidden instructions that try. The OWASP project for AI security calls this indirect prompt injection. Its list of defences includes “Require human approval for high-risk actions” and “Enforce privilege control and least privilege access” (OWASP LLM01:2025 Prompt Injection).

Waldo does both, in code. The model does not decide whether a gate applies. The code does, from facts it reads off the screen: the app, the web address, the label about to be clicked, and the key about to be pressed. Every input needs a ticket that only the gate can issue, so code that skips the gate does not compile.

Who can say yes?

Only you. No agent can approve itself. The ask panel shows what the agent wants to do, and how the panel behaves is fixed:

A click posted by software is refused. So is a press sent through the accessibility API. Both are tested.

Can I see or change the rules?

Yes. The rules are plain lists in crates/waldo-core/src/gate.rs in the Waldo repo. Run waldo policy to print them. Save an edited copy as policy.json in ~/Library/Application Support/Waldo to change them. A file that does not parse stops every tool, so a typo cannot switch the gates off.

Every tool call and every gate answer is one line in ~/Library/Application Support/Waldo/audit.jsonl. Text typed into a password field is logged as a count only. waldo log prints the last lines.

What do the hard stops not stop?

Read this part before you turn Waldo on.

Found a way past a gate? That is a security bug. Report it privately, as SECURITY.md explains.

How do I turn the hard stops on?

Install Waldo. The gates come with him, for every agent that borrows his hands: Claude Code, Codex, Gemini CLI, Cursor, or any agent that speaks MCP. The steps are on the install section, and below.

When you need everything to stop at once, push your pointer into the top-left corner of the screen. That is the panic corner.

Step by step

  1. Install WaldoBuild Waldo from source and put it on your PATH with make install. The gates come with him. There is nothing extra to set up.
  2. Grant the permissionsRun waldo grant. macOS asks for Accessibility and Screen Recording, for the app that starts Waldo. For most people that is the terminal.
  3. Lend him to your agentRun make register for Claude Code, or add the command waldo mcp to any other agent's MCP settings.
  4. Read the rulesRun waldo policy to print what each gate catches.
  5. Answer with your own clickWhen a gate trips, the ask panel shows what the agent wants to do. Allow needs a real click from your mouse or trackpad. No answer in two minutes is a no.

People also ask

Can the AI approve its own actions?

No. The ask panel takes no keys and refuses any click that did not come from your own mouse. A click posted by software is refused. So is a press sent through the accessibility API. Both are tested.

What happens if nobody answers the ask panel?

No answer in two minutes is a no. When you are away, nobody can click Allow, so gated acts are refused.

Can I change what the gates catch?

Yes. Run waldo policy to print the rules. Save an edited copy as policy.json in ~/Library/Application Support/Waldo to change them. A file that does not parse stops every tool, so a typo cannot switch the gates off.

Do hard stops protect against prompt injection?

They stop instructions hidden in a web page or an email from paying, sending, or deleting without you. They are guard rails, not a jail. A session that set out to cheat could use its own shell to get round them.

How do I report a way past a gate?

Report it privately through the Security tab of the Waldo repo on GitHub, or write to info@justusewaldo.com. Do not open a public issue for it.

Install

Give your AI a hand.

Free and open source. Build him once, then lend him to any agent.

$ git clone https://github.com/justusewaldo/waldo
$ cd waldo && make install && waldo grant