Great framing—especially the distinction between user identity, agent identity, delegated authority, tool access, and runtime policy enforcement. In enterprise agent systems, collapsing those into one “trusted agent” boundary is where many of the hardest failures begin.
I would draw the most important trust boundary at the point where an agent’s reasoning becomes an external effect.
An LLM or agent should be able to interpret a request, retrieve context, plan, and propose an action. But it should not be the ultimate authority for whether that action is permitted. Tool invocation, data access, API calls, workflow changes, and user-impacting outputs should cross a separate policy-enforcement layer that evaluates the request using more than the model’s intent.
Conceptually:
allow=f(initiating user,agent identity,delegated scope,requested tool,target resource,data sensitivity,runtime context,risk level)allow=f(initiating user,agent identity,delegated scope,requested tool,target resource,data sensitivity,runtime context,risk level)
A few design principles I have found important:
-
Treat agent output as untrusted intent. A tool call proposed by the model is not an authorization decision. It should be schema-validated, policy-checked, and constrained before execution.
-
Use separate identities. The user should remain the initiating principal; the agent should have its own workload identity; and downstream access should use a short-lived, narrowly scoped delegation rather than broad, standing credentials.
-
Put the gateway in front of effectful tools. The agent gateway should mediate tool/API access, validate parameters, enforce allowlists and resource constraints, apply rate/cost limits, and produce a durable audit event for every attempted action—not only successful ones.
-
Make delegation explicit and attenuating. An agent should never gain more authority than the initiating user, and ideally receives less: a capability limited to a specific action, target resource, time window, and budget.
-
Separate planning from execution. It is safer for an agent to produce a structured action proposal—such as a typed tool-call manifest—than to hold direct access to production APIs, databases, deployment systems, or external communications.
-
Require human approval for irreversible or high-impact actions. Examples include production deployments, financial transactions, external publication, permission changes, deletion, bulk data exports, or actions that exceed a budget/risk threshold.
-
Make observability part of the authorization design. The audit record should link user request, agent/version, retrieved context, policy evaluation, delegated credential, tool request, response, downstream resource, and final outcome. Otherwise post-incident reconstruction becomes guesswork.
One subtle risk is that retrieval context and tool outputs can become indirect instruction channels. So I would also treat documents, webpages, tickets, and API responses as untrusted data by default: they can inform the agent, but they should not be able to expand permissions, override policy, or trigger actions by themselves.
A useful mental model is:
text
User request
→ authenticated session
→ agent planning / retrieval
→ structured action proposal
→ policy and authorization gateway
→ short-lived scoped delegation
→ tool or service execution
→ immutable audit and observability record
For research and engineering workflows, this distinction is particularly valuable. An agent may propose code, an experiment, a cloud job, or a publication artifact—but separate gates should decide whether it can modify a baseline, spend compute, submit a hardware job, access restricted data, or publish externally.
The key architectural principle for me is:
The agent can recommend an action; an independently governed policy layer decides whether the action may occur.
That separation makes the system easier to reason about, easier to audit, and much safer to scale across teams and tool ecosystems.