[ARCHITECTURE & CONCEPTS]
[
12/18/25
]
When Agents Delegate to Agents, Who Authorizes the Action?
[Author]:
Amjad Fatmi
Single-agent authorization is hard enough. Most teams have not solved it. But the ecosystem has moved on without waiting for that problem to be resolved. Multi-agent systems are in production. Agents are delegating to other agents. Orchestrators are spinning up sub-agents, routing tasks, and chaining actions across multiple reasoning processes.
Nobody has answered the authorization question for this architecture. Not the frameworks. Not the protocols. Not the platforms. The question is not even clearly stated in most places.
This post states it clearly, shows where it breaks in the systems teams are actually using, and explains what a solution requires.
The delegation problem
In a single-agent system, the authorization question is: should this agent be permitted to take this action? The agent proposes. Something either authorizes the proposal or it does not.
In a multi-agent system, the question forks. When Agent A delegates a task to Agent B, and Agent B takes an action, the authorization question becomes:
Who authorized Agent A to delegate this task?
Who authorized Agent B to accept this delegation?
Which policy applies to Agent B's action, Agent A's policy, Agent B's policy, or some combined policy?
If Agent B was wrong or manipulated, who is accountable?
If Agent B creates Agent C, does authorization compose transitively?
None of these questions are answered by any of the major multi-agent frameworks. They are either not addressed at all, or they are implicitly answered by "the agent that delegated is trusted, so whatever it delegates is permitted."
That implicit answer is wrong. And it has specific, demonstrable failure modes.
How delegation actually works in practice
CrewAI
CrewAI is one of the most widely deployed multi-agent frameworks. The mental model is intuitive: a Crew of specialized Agents, each with a Role, a Goal, and a Backstory, collaborate on Tasks orchestrated by a Process.
What happens during execution: the researcher browses, queries, and retrieves. The writer receives that output and produces a report, writes files, sends emails. Each agent has its own tools. Each agent executes its tools when it decides to.
The authorization question: who decided the writer should email stakeholders? The Task description said so. Who authorized that task? The developer who wrote the code. When was that authorization made? At development time, not at execution time.
If the researcher retrieved a manipulated document that contained embedded instructions changing the report content or the email recipients, the writer would execute those changes. The task authorized email. The authorization was class-level, not instance-level. The specific recipients, the specific content, the specific attachment, none of those were individually authorized.
AutoGen
AutoGen's model is conversational. Agents communicate through messages, and actions are triggered by the conversation flow. An orchestrator agent instructs worker agents by sending them messages.
The authorization problem in AutoGen is structural. The Orchestrator sends messages to the Coder. The Coder sends code to the Executor. The Executor runs the code. This is a delegation chain: Orchestrator → Coder → Executor. Each step is an authorization event. None of them are evaluated.
human_input_mode="NEVER" is the most commonly used setting in production AutoGen deployments. It means the Executor runs whatever code the Coder sends without human review. The Orchestrator's instructions to the Coder are messages -- probabilistic LLM outputs. The Coder's code is a probabilistic LLM output. The Executor runs both without any gate.
OpenAI Agents SDK
The OpenAI Agents SDK formalizes handoffs between agents. An agent can transfer control to another agent using a handoff. The SDK handles the mechanics of the transfer.
When the triage agent decides to hand off to the billing agent, the SDK transfers control. The billing agent then takes over with the customer context. It can call process_refund, check_balance, and update_billing.
The authorization gap: the triage agent decided to hand off. The handoff was configured by the developer. The billing agent received a customer context that may contain manipulated content from the customer. The billing agent can call process_refund because it is in its tool list. The specific refund amount, the specific order, the specific account, none of these are individually authorized.
Where it gets worse: visual builders
LangFlow and n8n abstract the code away. Non-technical users build multi-agent workflows by connecting nodes visually. The authorization problem does not disappear. It becomes invisible.
In n8n, a workflow might connect an AI Agent node to an HTTP Request node to a Gmail node. Each connection is a delegation. The AI agent decides what to send to the HTTP endpoint. The HTTP node sends it. The Gmail node sends the result.
The user who built this workflow authorized the general shape of it at design time. They did not authorize any specific HTTP request, any specific email, any specific payload. Those decisions are made by the AI agent at runtime. The visual interface implies that the workflow is under control. The authorization reality is that individual action instances are never evaluated.
The scale of this problem for non-technical users is worse than for engineering teams. Engineers can at least read the code and understand what is permitted. A non-technical user looking at a node graph has no visibility into what the AI agent will decide to do with each execution.
The extreme case: Manus
Manus represents where multi-agent orchestration is heading. Fully autonomous, multi-step, multi-agent execution with minimal human involvement. It spins up sub-agents, coordinates their actions, synthesizes results, and produces outcomes across complex real-world tasks.
The authorization surface of a system like this is enormous. Each sub-agent can take actions. Those actions may themselves involve further delegation. The authorization chain extends arbitrarily deep. Who authorized the action at step seven of a fifteen-step task that was initiated by a top-level orchestrator acting on a user prompt from twenty minutes ago?
Without an authorization layer, the answer is: nobody authorized it individually. The user authorized the top-level task. Every subsequent action is a probabilistic inference chain extending from that original authorization. The deeper the chain, the further each action is from any human-reviewed decision.
This is not theoretical. Manus-class systems have been demonstrated exfiltrating data, accessing unauthorized resources, and taking unintended actions during extended autonomous tasks, not because the systems are malicious but because the authorization chain breaks down over extended execution without explicit per-action evaluation.
Enterprise scale: Google ADK and Vertex AI Agent Builder
Google's Agent Development Kit and Vertex AI Agent Builder bring this problem to enterprise scale. An organization deploying agent workflows across business processes has agents touching CRM systems, financial databases, HR records, and external APIs. The agents operate on behalf of employees with varying levels of authorization.
The enterprise multi-agent problem adds a dimension: identity. When an agent acts on behalf of a user, does the agent have the user's authorization? Can the agent do things the user could do but would never choose to authorize? If the user has read access to financial records, does an agent acting on their behalf have the same access? What about agents acting on behalf of service accounts with broader permissions?
Google's platforms inherit IAM policies, which is meaningful for identity-level authorization. But IAM answers "is this service account permitted to call this API?" not "should this specific agent action, in this specific context, execute right now?" The same gap that exists in single-agent deployments exists in enterprise multi-agent deployments at larger scale with more consequential systems.
The three unsolved problems
Problem 1: Delegation provenance
When Agent A delegates to Agent B, there is no standard mechanism for recording:
What was delegated
What authority Agent A had to delegate it
Whether Agent B accepted within defined boundaries
The delegation event is not an authorization event. It is a computational event. The fact that a delegation occurred does not mean the delegation was authorized, and it does not constrain what Agent B can do with the delegated task.
Problem 2: Authority composition
When authorization chains through multiple agents, the authority of each downstream agent is at most the authority of the upstream agent that delegated to it. An agent cannot delegate authority it does not have.
This principle - the principle of attenuation is well understood in security. It is completely unenforced in every multi-agent framework in common use. Agent B can do anything its tool list permits, regardless of whether Agent A that delegated to it had the authority to authorize those actions.

Problem 3: Policy applicability
When Agent B takes an action, whose policy should govern it? The policy of the organization deploying the system? The policy of Agent A that delegated? The policy defined for Agent B specifically? Some intersection of all of these?
This question is not answered by any current framework. In practice, if policy exists at all, it applies at the agent registration level (what tools can this agent class use?) not at the action instance level (should this specific action execute right now, under this delegation context, given current system state?).
What a solution requires
An authorization layer for multi-agent systems needs to do four things that no current framework does.
1. Evaluate each action instance regardless of delegation depth. An action that reaches the execution boundary must be evaluated against policy at that moment, regardless of how many delegation steps preceded it. The depth of the delegation chain does not confer authorization.
2. Enforce attenuated capabilities across delegation boundaries. The authority a delegating agent can grant must be bounded by the authority that agent itself has. Delegation cannot amplify permissions. The permit issued to Agent B must be a subset of the permit that Agent A itself holds.
3. Record the delegation chain in the authorization record. Each DPR for an action in a multi-agent system should include the delegation provenance: who originated the task, through which agents it passed, and what authority each agent claimed. This makes forensic investigation possible after the fact.
4. Apply policy at the action instance level, not the agent class level. "This agent is permitted to use this tool" is not authorization. "This specific action, proposed by this agent, under this delegation context, given current system state, is permitted" is authorization. The difference is the entire gap.

Faramesh's action authorization boundary applies at the execution moment regardless of which agent in a multi-agent chain proposed the action. The canonical action representation normalizes the action whether it came from a CrewAI agent, an AutoGen executor, an OpenAI SDK handoff, or a LangFlow node. The same policy evaluates it. The same DPR records it. The same fail-closed default applies.
The delegation chain problem, knowing which agent authorized what across a multi-step orchestration is an extension of the core authorization architecture. Each step in the delegation chain produces an authorization event. The chain of events is the authorization record for the entire orchestration.
The gap will get more expensive
Multi-agent systems are getting more capable, more autonomous, and more connected to production systems. The authorization gap that is tolerable in a single-agent research assistant is not tolerable in a multi-agent system that manages customer data, triggers financial transactions, and orchestrates code deployments.
The frameworks are not going to solve this. Authorization is not a framework concern. It is an infrastructure concern. Frameworks define how agents communicate and coordinate. Authorization defines what any agent in that system is permitted to actually do.
That boundary - between the multi-agent coordination layer and the execution authorization layer is where the gap lives. And it is currently empty in every major multi-agent deployment in production.
Faramesh's execution boundary applies uniformly across single-agent and multi-agent deployments. The before_tool_call hook fires regardless of which agent in a coordination chain proposed the action.
