Leadership

Scoping an Agent's Tools: Read, Write and Destructive

Antonio Evans10 min read

A three-tier tool rack drawn as a cross-section.
Key points

Key points

  1. 1Tool scope is the other half of authority: prompts set intent, but tools decide what an agent can actually change.
  2. 2Classify every tool as read, write or destructive by worst-case outcome, not by typical use.
  3. 3Put human approval on every destructive call, plus write calls that touch production data, money or outside parties.
  4. 4Estimate review load as destructive calls per hour times approval rate times minutes per approval, and compare it with reviewer time you really have.

Authority has two halves, and prompts are the weaker one

A prompt is a statement of intent. A tool is a capability. You can write the most careful system prompt in the world, but if the agent holds a tool that deletes a database, the prompt only sets the odds. The published account of a coding agent that removed a production database along with its volume-level backups is a permission story, not a model story: the agent had deletion rights it never needed for any legitimate task in its workflow (the Cursor incident write-up). The model did what it calculated it should do. Nobody had asked what the worst outcome would be if it reasoned incorrectly.

This framing matches how agent builders describe the architecture. Agents have three core components, a model, instructions and tools, and the tools are the only part that reaches outside the sandbox (OpenAI's practical guide to building agents). Anthropic's engineering team draws a similar line between workflows, where the code path is predefined, and agents, where the model directs its own tool use (Building effective agents). Once the model chooses the sequence, the permitted tool set is the real policy. Everything else is advice.

The security field has a name for the mismatch. Agents routinely receive more permissions than their task requires, because granting access is easier than scoping it, and reviewers rarely anticipate the chains an agent can build (the permission surface audit). A service account with one database read has a predictable footprint. An agent with that same read can pull records, summarize them, send the summary outward and then act on the result through a code-execution tool, and the declared scope looks narrow the whole way. The operational reach is far wider than the declared permission set (Aurascape on blast radius).

Blast radius means the full set of systems, data and actions an agent can reach once it starts working, measured across every tool it can call and every system those tools touch (Obsidian Security). The useful response is delegation with two levers, not one. Management frameworks already separate what someone should do from what they may decide; the seven levels of delegation model scales a person from "tell" through "delegate" based on stakes and reversibility (Humanizing Work). For agents, instructions carry the first lever and tool scope carries the second, and the second is the one that holds on a bad day. A framework paper on delegation between agents and humans makes the point formally: delegation transfers authority, responsibility and accountability, which requires specifying roles and boundaries rather than only goals (Intelligent AI Delegation).

Classify by blast radius, not by name

The practical version of blast radius is one question per tool: what is the worst outcome if this tool is called with the wrong arguments, at the wrong moment, on the wrong object? Three classes are enough to start, and each maps to a concrete reviewer action.

ClassDefinitionExamplesDefault treatmentReversible?
ReadNo side effects outside the agent's contextSearch docs, fetch a ticket, query a replica, list filesRun freely, log the callNot applicable
WriteCreates or changes state that can be undone or containedDraft an email, create a ticket, update a sandbox record, open a pull requestRun in sandbox; gate in productionUsually, with effort
DestructiveRemoves, sends, pays, deploys or changes accessDelete a record or branch, send to a customer, charge a card, deploy to production, rotate credentialsHuman approval before every callOften not

Two rules sharpen the classification.

First, classify by the tool's maximum scope, not the parameters it usually receives. A "search documents" tool that accepts a wildcard can return the entire document store. A "manage calendar" tool that happens to include delete rights is destructive even if the agent only ever reads from it (the permission surface audit).

Second, treat "sends" and "pays" as destructive even when nothing is deleted. Sending an email to a customer or charging a card cannot be fully undone by revoking a token afterwards; the token was valid and the action ran (Scalekit on approval gates). Reversibility, not deletion, decides whether a failure is a nuisance or an incident.

Keep the classification in the code that registers tools, not in a wiki, so the enforcement layer can read it:

TOOLS = {
    "search_tickets":  {"risk": "read",        "approval": "none"},
    "draft_reply":     {"risk": "write",       "approval": "none"},
    "update_crm":      {"risk": "write",       "approval": "prod_only"},
    "send_reply":      {"risk": "destructive", "approval": "always"},
    "delete_account":  {"risk": "destructive", "approval": "always"},
}

The third entry is where most judgment lives: a write tool that is gated only against production data. Write that conditional down instead of leaving it to the prompt.

Put the gate where the decision is made

An approval gate is not a confirmation dialog. It is an authorization decision at the moment of invocation: should this specific call execute, with these arguments, right now? OAuth scope answers a different question, namely whether the agent may call this category of operation at all, and that grant was made weeks ago (Scalekit).

Where the gate lives matters. If you gate inside the model's reasoning, by instructing the agent to ask before deleting, you have asked the same component that formed the plan to certify it. The evidence on reliability says that is too much to ask: a benchmark study of three open-source agent frameworks with two model backbones found roughly a 50% task completion rate, with failures clustered in planning errors, execution problems and incorrect response generation (Exploring Autonomous Agents). A component that gets the plan wrong about half the time on unfamiliar tasks should not decide whether the plan is safe.

Put the gate in the execution path. The pattern is a pause-resume interrupt: the agent proposes the call, the runtime suspends, a human approves or rejects, and execution resumes or aborts (Scalekit). Two engineering details matter more than they look. The approval prompt must show arguments, not just the tool name: "approve send_reply" tells a reviewer nothing, while "send the drafted reply to 40 customers on the enterprise tier" is reviewable. And credentials can expire during the pause, so hold them in a vault and let the agent reference an identity rather than a raw token.

Supervisory systems are converging on the same shape. A guardian agent runs a continuous loop: observe the context, interpret the intended action and its risk, decide against policy, then allow, block or escalate, and record the decision for audit (Sweet Security on guardian agents). The escalation trigger is exactly the threshold from your classification table: financial value, regulatory scope, ambiguity or irreversibility. Risky calls get judged at the point of action rather than filtered at the input.

There is a limit worth naming. Oversight researchers argue a pause button is meaningful only if the reviewer has knowledge, observation, control and intervention, and many setups supply the formal moment of intervention while leaving the conditions for a real one underdeveloped (Data & Society's oversight agenda). A reviewer who cannot tell why the agent changed strategy mid-run is not gating anything. Gate design and trace design are the same project.

Estimate the review load before you widen permissions

Approvals feel cheap when one agent makes three destructive calls a day. They stop feeling cheap when the fleet grows. Estimate the load with four numbers you can measure before rollout.

  1. Expected destructive calls per hour across the fleet, meaning agent count times calls per agent per hour times the destructive share.
  2. The approval rate, the fraction of destructive calls that route to a human once conditional write gates are included.
  3. Minutes per approval, including reading arguments, checking context and clicking through.
  4. Reviewer minutes actually available per hour, remembering that the same person usually has other duties.

The formula is destructive calls per hour times approval rate times minutes per approval, compared against available reviewer time. Publisher-reported research puts managers at roughly 37% of their working time spent making decisions, with more than half of that wasted (McKinsey, cited by Prialto), which is a warning that decision capacity is scarce, not infinite.

A worked example: 60 destructive calls per hour at peak, a 40% approval rate, and 90 seconds per approval.

60 calls/hr x 0.40 = 24 approvals/hr
24 x 1.5 min       = 36 reviewer minutes/hr
Reviewer capacity   = 30 min/hr
Load ratio          = 36 / 30 = 1.2

A ratio above 1.0 means the queue grows without bound and reviewers start rubber-stamping to keep up. The fix is not more reviewers by default. Four levers exist, and the order matters.

LeverEffect on loadCostUse when
Narrow tool scopeRemoves calls entirelySome capability lostThe tool is not clearly necessary
Batch approvalsOne review for many similar callsCoarser controlCalls are homogeneous and low variance
Async approval with reversal windowReview after execution, within hoursNeeds reliable undoWrites on non-critical internal data
Add reviewer capacityRaises the denominatorHeadcount or rotaDestructive calls are genuinely high value

Removing unneeded permission is cheapest, because it eliminates work instead of managing it. The permission audit framing is explicit: an agent built to summarize tickets does not need file-system write access, and the most effective blast-radius reduction is taking away tools rather than adding guardrails (the permission surface audit). Batch approval is second, and it fits the async tier: read-write operations on non-critical internal data can proceed with an audit trail good enough for a human to reverse within hours, without in-flight approval.

Recompute in both directions. Before you add a tool, compute the load it creates at expected volume. Before you relax a gate, recompute. A gate that gets rubber-stamped is worse than no gate, because it manufactures evidence of review that never happened.

Bound the loop, not just the call

A single gated call is a manageable unit. An agent loop that can retry, re-plan and chain calls is the amplifier. One framework for bounding this treats autonomy as a spectrum and insists useful autonomy is bounded by hard permissions, approvals, budgets, tool limits, guardrails and stopping rules, expanding only when measured reliability justifies the added risk (PrompTessor on autonomous agents). Chained tool calls are the primary expansion mechanism: each call looks reasonable alone, and the risk lives in the sequence across trust boundaries (Aurascape).

So scope has a second dimension beyond class: how far can a sequence travel? An agent with read access to five systems has five times the reach of one with a single system, even though no individual call is destructive. Constraints that keep reach proportionate:

  • Cap workflow depth, so a plan cannot chain more tool calls than a reviewer can follow.
  • Cap retries on destructive tools at zero. A failed destructive call escalates; it never loops.
  • Cap spend and volume per task, so a runaway loop hits a budget wall before it hits a customer.
  • Scope credentials per task with just-in-time grants revoked on completion, instead of standing tokens.

The failure taxonomy is instructive here: planning errors, not just execution errors, cause a large share of failures (Exploring Autonomous Agents). A well-formed plan can be wrong in a way that aims a destructive tool at the wrong object. Depth caps and per-task credentials bound how far a wrong plan gets before something stops it.

Write acceptance criteria for the scope itself

A tool scope is a specification, and it deserves the treatment any task brief gets. Guidance on specs for coding agents transfers directly: state the output and boundaries explicitly, describe what failure looks like, constrain inputs, and define the review condition up front, because vague briefs produce output the agent has to guess at (Addy Osmani on agent specs) and tasks without criteria push guesswork into review time (acceptance criteria for agent tasks).

For a tool scope, the spec has four parts:

  • The tool list with class. Every tool, its read, write or destructive label, and its approval rule. This is the artifact a reviewer checks against.
  • The worst case, written down. One sentence per destructive tool: "worst case is a customer-visible email to the full list." If you cannot write the sentence, you do not understand the tool.
  • The review condition. Which class triggers a gate, and what the reviewer must see: arguments, target, volume and the agent's stated reason.
  • The escalation rule. What happens on rejection or ambiguity: abort, return to the user, or re-plan with the tool removed.

The spec should record where the agent's authority ends, too. That is the part of oversight interface design quietly teaches: when confirmation is required and when the agent may continue shapes what people learn to notice (Data & Society). A scope that gates every call teaches reviewers to click through. A scope that gates only the irreversible ones teaches them to read.

Tie expansions to evidence. To move a write tool from gated to autonomous, apply the acceptance-criteria process directly: define the output, list the conditions that must hold, describe failure, constrain scope, and set the review condition (acceptance criteria). Then measure the rejection rate over a fixed number of approvals. If reviewers approve nearly everything and the reversible failures you tolerated were all recoverable, widening is justified. If the rejection rate is meaningful, the gate is earning its keep.

A short implementation sequence

Starting from a prompt-only system, this order keeps the work tractable.

  1. Inventory every tool the agent can call, including ones behind a generic code runner. Reach through a code-execution tool is reach.
  2. Label each tool read, write or destructive, judged by worst case and reversibility.
  3. Delete tools that are destructive and not clearly necessary before doing anything else.
  4. Encode the approval rule per tool in the registration code, including conditional gates for production writes.
  5. Estimate review load with the four numbers above, at expected and peak volume.
  6. Add depth caps, retry caps and per-task credentials around the loop.
  7. Log every call with arguments and the approval decision, so the trail proves what was authorized at the timestamp it ran.

Step 3 pays for itself immediately, and step 5 prevents the gate from becoming theater. If the estimate shows a fleet generating approvals faster than a person can read them, one natural next step is to give the agents that need broad authority their own workspace with its own model access and per-person keys, rather than granting everything to every agent (Quanta for Teams).

FAQ

FAQ

What is the difference between read, write and destructive tools?

Read tools have no side effects outside the agent's context, such as searching documents or fetching a ticket. Write tools create or change state that can be undone or contained, such as drafting an email or opening a pull request. Destructive tools remove, send, pay, deploy or change access in ways that cannot be fully reversed by revoking a token afterwards (Scalekit). The class comes from the tool's worst case, not from how it is usually called.

Why gate destructive tools in the execution path instead of the prompt?

Because the prompt is formed by the same component that produced the plan. Benchmarking of open-source agent frameworks found roughly a 50% task completion rate, with failures concentrated in planning and execution (Exploring Autonomous Agents). A runtime gate evaluates the specific call and its arguments before dispatch, catching bad plans as well as bad execution (Sweet Security).

How do I compute review load for approvals?

Multiply expected destructive calls per hour by the approval rate, then by minutes per approval, and compare the result with reviewer minutes actually available. If 60 calls per hour route 40% to a human at 1.5 minutes each, that is 36 reviewer minutes against perhaps 30 available, a load ratio of 1.2. A ratio above 1.0 means the queue grows without bound, so narrow scope, batch approvals or add capacity before widening permissions.

Is a write to production data always destructive?

Not always, but gate it by default if it cannot be cleanly reversed and if it reaches outside parties or revenue systems. The four-tier model puts read-write operations on non-critical internal data in an async tier with a reversal window, and any write to a production database in a real-time gate (the four-tier model). Reversibility, audit obligation and dynamic risk context are the three tests.

How do I know when it is safe to widen a scope?

Treat the expansion like any change with acceptance criteria: define conditions that must hold, describe what failure looks like and set the review condition (acceptance criteria). Then measure the rejection rate over a fixed number of gated calls. If reviewers approve nearly everything and the reversible failures tolerated during the gated period were all recoverable, the evidence supports widening; otherwise the gate earns its place.

Sources

Sources

  1. Agent Blast Radius: Bounding Worst-Case Impact Before ...
  2. A Practical Guide to Building AI Agents - OpenAI
  3. Building Effective AI Agents - Anthropic
  4. AI Agent Blast Radius: How Chained Tool Calls Expand It
  5. AI Blast Radius | Map the Real Scope of Agent Authority
  6. When and How to Use the Seven Levels of Delegation Well
  7. Intelligent AI Delegation - arXiv
  8. Human-in-the-Loop Tool Calling: Approval Gates for AI ...
  9. A Closer Look at Why They Fail When Completing Tasks
  10. Guardian Agents: How AI Oversight Systems Work - Sweet Security
  11. A Sociotechnical Research Agenda for the Oversight of AI Agents
  12. Delegation Frameworks for High-Performing Teams - Prialto
  13. Autonomous AI Agents: How They Work
  14. How to write a good spec for AI agents
  15. How to Write Acceptance Criteria for AI Agent Tasks
About the author

About the author

Antonio Evans
Antonio Evans

Antonio Evans is the founder of Quanta Intelligence and a fractional CTO who builds HIPAA-ready AI systems for health and life-science companies. Before that he was technical co-founder of FriendsEAT for twenty years, CEO of Socialdraft, and a data engineer at IBM. Antonio lives with his dog Santino in Lisbon, Portugal.

All articles