A scoped view of client tool policy

Each gate returns on failure, so a denied call never reaches the gates below it.

You are here
SourceAuthorizationSink

1. The gate order

Client-mode tool authorization runs these gates in order. Each one returns on failure, so the case that stops at enablement never reaches the authorization check, and its reason names the gate that actually closed.
  1. AllowlistIs the tool listed for this session?
    • BLOCKEDempty allowlist: Tool 'search' not in session allowlist
  2. EnablementIs a destructive tool enabled at all?
    • BLOCKEDshell_execute disabled: Destructive tool 'shell_execute' not enabled
  3. AuthorizationIs there a matching authorization event?
    • BLOCKEDshell_execute enabled, no authorization: Destructive tool 'shell_execute' requires authorization
  4. PermittedContinues to rate limiting and binding.
    • ALLOWEDNon-destructive tool, implicit allow
    • ALLOWEDAuthorization verified

Restricted decision matrix

ToolEnablement / allowlistAuthorizationDecisionGenerated reason
searchnot restrictednoneAllowNon-destructive tool, implicit allow
searchempty allowlistnoneDenyTool 'search' not in session allowlist
shell_executedisablednoneDenyDestructive tool 'shell_execute' not enabled
shell_executeenabledmissingDenyDestructive tool 'shell_execute' requires authorization
shell_executeenabledmatchingAllowAuthorization verified
Evidence, scope, and reproduction

Scope and instrumentation

These lanes assume principal trust, denylist, capability scopes, contamination and escalation policy, message binding, action and bidirectional scope checks, TTL, rate policy, and request binding have not already denied the call.

Adversary A1/A2AuthorizationT-IN5 · T-IN12A-AS2Source: PolicyEngine.check_tool_executionTest: tests/test_demo_scenarios.py

Exact fixture test: tests/test_demo_scenarios.py::test_policy_fixture

.venv/bin/python -m pytest tests/test_demo_scenarios.py::test_policy_fixture -q

Generated fixture