Hideo Tanaka 7 min readAn AI agent becomes consequential when it can cross the boundary between proposing an action and performing one. Reading a support ticket is not the same as closing it. Drafting a refund is not the same as issuing one. The difference is permission.
Most teams approach this boundary from the wrong direction. They connect an agent to a broad API, add a system prompt describing what it should avoid, then inspect failures after deployment. A safer and more useful approach is to design an agent permission map first: a precise account of what the agent may observe, propose, execute, and reverse.
This guide takes you from an undefined automation idea to a concrete permission map that engineering, security, and operations can implement.
Step 1: Define the Job as an Outcome, Not a Persona
Begin with one sentence describing the operational outcome. Avoid character descriptions such as “helpful sales assistant” or “autonomous support specialist.” Personas influence language; they do not establish authority.
Use this structure: When a trigger occurs, the agent gathers specified evidence, recommends or performs a bounded action, and records the result.
Consider a support agent:
When a customer requests a refund, the agent gathers the order record, delivery status, refund policy, and account history; determines whether the request matches a defined policy path; prepares or issues the permitted refund; and records its evidence and action.
This sentence reveals four control surfaces: trigger, evidence, action, and record. It also exposes ambiguities. Which refund paths are “permitted”? How much account history is necessary? Can the action be reversed?
The common mistake
Teams define a broad mission such as “resolve customer issues.” That phrase silently bundles dozens of powers: viewing personal data, changing subscriptions, issuing credits, contacting customers, and closing cases. If the outcome cannot be stated narrowly, the permission boundary cannot be narrow either.
Step 2: Decompose the Job Into Atomic Actions
List every external action the agent may need. Treat reading and searching as actions, not harmless preliminaries. A broad search endpoint can expose more information than a narrow write endpoint can alter.
For the refund workflow, atomic actions might include:
- Read the current support ticket.
- Read the order linked to that ticket.
- Check delivery status for that order.
- Retrieve the applicable refund policy version.
- Read prior refunds associated with the account.
- Draft a customer response.
- Create a refund proposal.
- Issue an approved refund.
- Add an internal note to the ticket.
- Send the customer response.
- Close the ticket.
Separate actions that an existing interface combines. If one endpoint both updates and closes a ticket, build a constrained wrapper or expose distinct agent tools. The tool boundary should reflect the permission boundary.
The common mistake
Teams map permissions to applications: “access to the CRM” or “access to payments.” Applications are containers, not capabilities. The useful unit is an operation on a specific resource under specific conditions.
Step 3: Classify Each Action by Consequence
Now classify actions according to what happens if the agent is wrong. Avoid a single label such as low, medium, or high risk; it hides the reason an action matters. Use several dimensions.
| Dimension | Question | Refund example |
|---|---|---|
| Data exposure | What information becomes visible? | Reading unrelated orders exposes unnecessary customer data. |
| Financial effect | Can money, credit, or liability move? | Issuing a refund changes the merchant balance. |
| External communication | Will a person treat the output as official? | Sending a message creates a customer commitment. |
| Operational effect | Does the action change workflow state? | Closing a ticket can remove it from active queues. |
| Reversibility | Can the action be reliably undone? | An internal draft is easy to discard; a processed refund may not be. |
| Propagation | Can the result trigger other systems? | A ticket status may initiate reporting or retention workflows. |
This classification determines where to permit direct execution, require approval, or prohibit the action. A reversible internal note may be allowed automatically. A customer-facing promise may require review even when it has no immediate financial effect.
The common mistake
Teams focus only on monetary loss. An agent can create contractual expectations, disclose private information, corrupt records, or trigger downstream automation without transferring funds.
Step 4: Specify Scope, Preconditions, and Limits
A permission should never be merely “agent may issue refunds.” Express it as a constrained rule:
The agent may propose a refund only for the order referenced by the active ticket, using the policy version effective for that order, after confirming delivery status and absence of an existing completed refund.
Add four kinds of constraints:
- Resource scope: Which customer, order, ticket, repository, or workspace may be touched?
- Temporal scope: For how long is access valid, and how fresh must evidence be?
- Volume scope: How many actions may occur within one case or operational window?
- State preconditions: What facts must be true immediately before execution?
Enforce these conditions outside the model. The agent can supply an order identifier, but the tool wrapper should verify that the order is linked to the active ticket. The agent can state that no refund exists, but the payment service should check again when execution begins.
The common mistake
Teams place limits in the system prompt and call them controls. A prompt communicates policy to the model; an authorization layer enforces policy despite model error, prompt injection, or malformed context.
Step 5: Design an Authority Ladder
Not every action needs the same degree of autonomy. Assign each atomic action to an authority level.
- Observe: Read only the minimum data required for the active case.
- Draft: Prepare content or parameters without changing external state.
- Propose: Create a structured action request with evidence and expected effect.
- Execute with approval: Perform the action after an authorized person or deterministic policy approves it.
- Execute autonomously: Perform a narrowly bounded, enforceable, and monitored action.
- Prohibited: Refuse the capability entirely, including through indirect tool combinations.
For the worked example, the agent might autonomously read the linked order, draft a response, and add a clearly attributed internal note. It might propose a refund and require human approval before issuance. It might be prohibited from changing payout details or viewing unrelated payment instruments.
Approval should bind to the exact proposed action. If the amount, destination, order, or message changes after approval, require approval again. Otherwise, the human approves one object while the system executes another.
The common mistake
A generic “human in the loop” button creates ceremonial oversight. Reviewers need the proposed action, supporting evidence, policy path, expected consequence, and meaningful alternatives—not a transcript dense with model reasoning.
Step 6: Turn the Map Into Enforceable Tools
Translate each approved capability into a narrow tool contract. Prefer get_linked_order(ticket_id) over search_orders(query), and propose_refund(order_id, reason_code) over a general payment mutation endpoint.
Each tool should implement:
- Authenticated agent identity and delegated user or workflow identity.
- Schema validation for every argument.
- Server-side resource and state checks.
- Short-lived authorization for sensitive operations.
- Idempotency protection against duplicate execution.
- A structured result containing status, effect, and record identifier.
- An immutable audit event linking trigger, evidence, approval, action, and outcome.
Do not return secrets or broad records when the agent needs a boolean, category, or filtered field. Data minimization improves security and reduces irrelevant context that can misdirect the model.
The common mistake
Teams expose existing administrative APIs because they are convenient. Those interfaces were often designed for trusted software or skilled operators. Agent tools should be safer abstractions, not thin renamings of privileged endpoints.
Step 7: Test the Boundary, Not Just the Happy Path
Create tests that attempt to cross every constraint. Ask the agent to access an unrelated order, reuse stale approval, split one prohibited action into several permitted ones, repeat an operation after a timeout, and follow hostile instructions embedded in a ticket.
Test the enforcement layer directly as well. A model refusal is not evidence that the system is secure. Send malformed and adversarial tool calls without involving the model. Confirm that unauthorized requests fail predictably and leave audit records.
Finally, test recovery: revoke credentials, disable one capability, pause the agent, locate all actions from a case, and compensate for an incorrect reversible action. A permission system is incomplete if authority cannot be withdrawn quickly.
The common mistake
Teams measure whether the agent completes the workflow but not whether it stays inside the smallest legitimate route. Success includes refusing irrelevant access and escalating when evidence is incomplete.
The Concrete Deliverable
Your final permission map should contain one row per atomic action, with columns for resource scope, required evidence, preconditions, authority level, approver, enforcement point, audit fields, expiration, and recovery method. Connect every production tool to a row. If a tool has no row, it should not be available. If a row has no enforcement point, it is an aspiration rather than a control.
The deeper design principle is simple: an agent should not inherit authority merely because it can reason about an action. Capability and permission are separate architectures. Build the permission map first, and autonomy becomes something you can grant deliberately, observe precisely, and retract without dismantling the entire system.
This post was drafted with AI assistance and reviewed against our editorial policy before publication. Corrections are made at the source, on the page, with the date shown.
From our own rounds
Measured on The Curator, from real sessions people played on this site — not a third-party dataset.
- Rounds played here
- 172
- Questions per round
- 1.7
Rate this article
Discussion
Comments are moderated. Read our editorial policy.