Problem
Tool schemas and permissions govern access — which tools exist and who may call them. They do not govern authorization: whether the agent was allowed to act at all for a given request, and within what scope. That gap is where three recurring agent failures live:
- advice becomes action — the user asked for a recommendation and the agent executed anyway;
- scope expansion — one bounded edit ballooned into a dependent workflow;
- missing approval — an approval was clearly required and the agent proceeded.
AgentGovernancePlugin (policy-as-code allow/deny) and the HITL approval gateway answer "is this tool call permitted by policy?". Neither answers "was the agent authorized to act at all, and within what scope?" — and both require external infrastructure (a policy engine / an approval service).
Proposal
Add AuthorityRoutingPlugin, a self-contained BasePlugin that assigns an authority posture to every tool call before it runs:
| Posture |
Meaning |
| ADVISE |
Recommendations only; no tool side effects. |
| EXECUTE |
Act, within an explicitly bounded scope. |
| DEFER |
Pause and request authorization when scope/approval is unclear. |
| STOP |
Refuse when the work is not allowed. |
Two stages produce the final posture:
- Posture router (optional, caller-supplied callable — typically a model call) returning a validated verdict with a scope statement.
- Deterministic guard — an irreversibility keyword tripwire + an approval-state check — composed with the router under most-restrictive-wins: plain code can only make a posture stricter, never looser.
Design properties:
- Fail-closed — an unparseable or raised router verdict defaults to DEFER.
- Guard-only mode (no router) is fully deterministic and needs no model and no extra dependency.
- Complements, rather than duplicates, the existing governance plugins.
Scope
src/google/adk_community/plugins/authority_routing_plugin.py + export
tests/plugins/test_authority_routing_plugin.py (deterministic, no credentials)
contributing/samples/authority_routing/ (runnable sample with live output)
Happy to adjust the API surface or placement to match maintainer preferences. I have an implementation ready and will open a PR referencing this issue.
Problem
Tool schemas and permissions govern access — which tools exist and who may call them. They do not govern authorization: whether the agent was allowed to act at all for a given request, and within what scope. That gap is where three recurring agent failures live:
AgentGovernancePlugin(policy-as-code allow/deny) and the HITL approval gateway answer "is this tool call permitted by policy?". Neither answers "was the agent authorized to act at all, and within what scope?" — and both require external infrastructure (a policy engine / an approval service).Proposal
Add
AuthorityRoutingPlugin, a self-containedBasePluginthat assigns an authority posture to every tool call before it runs:Two stages produce the final posture:
Design properties:
Scope
src/google/adk_community/plugins/authority_routing_plugin.py+ exporttests/plugins/test_authority_routing_plugin.py(deterministic, no credentials)contributing/samples/authority_routing/(runnable sample with live output)Happy to adjust the API surface or placement to match maintainer preferences. I have an implementation ready and will open a PR referencing this issue.