
Technical Guide
Autonomy isn't binary. A layered model spanning tool, action, data, delegation, autonomy level, and context — distinguishing suggestion from irreversible action.
Autonomous systems require a different approach to permissions than traditional software. The question is no longer simply can this identity reach this system, but how much initiative this agent should be trusted with inside that system, and under what conditions.
Most permission models inherited from human-user software treat access as a single switch: granted or denied. That model breaks down for agents, because an agent does not just hold access — it decides what to do with it. The same agent that is perfectly safe drafting a document can be dangerous if it is allowed to send, publish, or delete without a second thought.
The answer is not to lock agents down until they are useless. It is to build a permission model with enough resolution to distinguish a suggestion from an irreversible action. This post lays out that model as six layers, then shows how they combine into an autonomy spectrum that maps cleanly onto real enterprise workflows.
Traditional applications perform predefined actions through predictable workflows. A payroll system runs the payroll job. A ticketing tool moves a ticket through fixed states. The set of things the software can do is enumerated by its developers, and a user's permissions simply gate which of those fixed paths they can trigger.
AI agents are dynamic. A single agent may interpret a request in natural language, choose which tools to call, retrieve information it decides is relevant, chain several steps together, and select an action that no one wrote down in advance. Two users asking the same question can send the agent down two entirely different sequences of tool calls.
That flexibility is the whole point — and the whole problem. It means you cannot secure an agent by enumerating its workflows, because the workflows are generated at runtime. You have to secure the boundaries of what it may attempt instead. This does not mean agents should have unlimited freedom. It means the permission model needs to be more precise than a binary grant.
A good permission model for autonomous systems is not a single rule. It is a stack of independent layers, each answering a different question. An action is allowed only when it passes through all of them. The six layers below build from the broadest grant — what the agent can reach at all — to the narrowest — whether this specific action is permitted right now.
Treating these as separate layers matters because they fail differently. A misconfigured tool grant is a wide-open door; a misconfigured autonomy level is a quiet over-reach. Keeping them distinct lets you reason about each risk on its own terms.
The first layer is the coarsest: which systems can the agent connect to at all? A procurement agent might be wired to the vendor catalog, the contracts repository, and the approvals workflow — and nothing else. It has no reason to touch the HR system, the source-code hosting platform, or the production database, so those tools are simply not in its reach.
Tool access is where least privilege starts. Every tool an agent can reach is part of its blast radius, whether or not it ever uses that tool. Granting connectivity “just in case” is the most common way agents accumulate quiet, unused access that nobody remembers approving.
Reaching a system is not the same as being allowed to do everything in it. The second layer scopes what the agent can do inside each tool. Connectivity to the marketing automation platform might permit reading campaign metrics and drafting email content, while creating audiences, scheduling sends, and editing billing are off the table.
This is where the read/write asymmetry becomes critical. Many systems collapse all access into a single API token, so an agent that can query also can mutate. A precise model breaks that token's effective permissions into named actions and grants them individually:
# Marketing automation agent — action scopes
tool: marketing-automation
actions:
campaigns.read: allow
campaign_content.draft: allow
audiences.create: deny
campaigns.schedule: require_approval
billing.update: denyThe same agent, the same tool — but a clear line between what it may do freely, what it may do with a human checkpoint, and what it may never do.
Action scopes still operate at the level of capability. The third layer narrows which specific records the agent may touch: which documents, projects, fields, rows, accounts, or repositories are in scope. An action like records.read is meaningless without knowing which records.
Consider a financial-analytics agent that summarizes spend. It may be permitted to read the general-ledger table — but only the cost centers belonging to the requesting manager's department, never the executive compensation ledger, and never row-level detail for accounts outside the user's region. Data access is frequently the layer where a coarse grant becomes a real exposure, because the action looks innocent while the data it touches is not.
In practice, data scoping is best expressed as a filter the agent cannot remove rather than a list it is trusted to respect — a constraint applied at the data boundary, not an instruction in the prompt.
Agents rarely act on their own authority. The fourth layer asks whose authority the agent is acting under, and how much of that person's access it inherits. When an agent acts on behalf of a user, the safe default is the intersection of the agent's own permissions and the user's — the agent should never be able to do something the requesting user could not do themselves.
A legal-review agent illustrates the trap. If it simply inherits whatever access its service account holds, a paralegal could prompt it into reading a sealed matter the paralegal has no right to see. Bind the agent to the requesting user's authorization, and the same prompt quietly returns nothing — the agent could not exceed the human it acts for.
The fifth layer is the one most permission systems forget entirely: even when an action is fully authorized, should the agent perform it automatically, or pause for a human? Authorization says the action is allowed. Autonomy level says how much initiative the agent may take in exercising it.
This is best thought of as a graduated dial rather than an on/off switch:
The right level is rarely uniform across an agent. An IT-operations agent might restart a stateless service autonomously, drain a node only with approval, and merely suggest a change to a firewall rule. The dial is set per action, and the riskier or more irreversible the action, the more a human stays in the loop.
The final layer is conditional: are there circumstances under which an otherwise-permitted action should be allowed or denied? The same action can be fine in one context and unacceptable in another, and a static grant cannot tell them apart.
A sales agent might be allowed to apply a discount up to ten percent autonomously, but anything deeper requires approval. A data-pipeline agent might be free to run transformations during business hours but blocked from triggering a full reprocessing job during the month-end close. An action's value, its timing, its reversibility, and the volume of records it touches are all context signals worth evaluating at runtime.
# Sales agent — context-aware action
action: opportunity.apply_discount
rules:
- when: discount_pct <= 10
then: execute_autonomously
- when: discount_pct > 10 and discount_pct <= 25
then: require_approval
- when: discount_pct > 25
then: denyContext is what turns a permission model from a static map into a live control. It lets the same agent be trusted with routine cases and held back on the exceptional ones — without an administrator rewriting grants by hand.
Put the six layers together and a single principle emerges: autonomy is not binary. Most enterprise agents are semi-autonomous. They assist, recommend, prepare, or execute within boundaries — and the same agent can sit at different points on the spectrum for different actions.
The practical job of a permission model is to distinguish four very different things that older systems lump together:
The further along this spectrum an action sits, the more the other layers should tighten around it. An irreversible action deserves narrow tool access, an explicit action grant, scoped data, the requesting user's authority, a human approval, and context checks — all at once. A suggestion needs almost none of that.
Reversibility is the cheapest risk signal you have. When in doubt, the question is not “is this allowed?” but “can this be undone?” — and irreversible actions should always cost a human's attention.
The six layers are not a sequence you adopt one quarter at a time — they are facets of a single decision the platform makes every time an agent reaches for an action. In practice, three habits make the model hold up.
Start from the action, not the agent. Catalog the actions an agent can attempt, sort them by reversibility, and set the autonomy dial and context rules per action. A recruiting agent reading a candidate pipeline and the same agent sending a rejection email are different risk decisions, even though they share a tool grant.
Enforce at the boundary, not in the prompt. Every layer in this model should be applied where the agent meets the system — the gateway, the tool adapter, the data filter — not described as a rule the model is asked to follow. A prompt instruction not to send external email is a suggestion to the agent; a denied action scope is a guarantee.
Make the decision auditable. When an action runs, the record should capture which user it acted for, which permission allowed it, which autonomy level governed it, and whether an approval was required. That trail is what lets you tune the dials with evidence rather than guesswork — loosening where approvals are never rejected, tightening where they routinely are.
Autonomous systems need permissions that distinguish between suggestion, draft, execution, and irreversible action — and a model with the resolution to set each of the six layers independently for each thing an agent might do.
The goal is not to make agents powerless. It is to give them the right amount of power for the right workflow under the right controls. An agent that drafts freely, executes the reversible, and pauses for the irreversible is both genuinely useful and genuinely safe.
That balance — calibrated, layered, and enforced at the boundary — is what makes autonomy safe enough for enterprise use.