A tool-scoping policy written as prose, or even as a config file that nobody verifies, drifts away from what the runtime actually permits. The documented failure pattern is well known: a subagent inherits the parent's authority implicitly and then performs writes the parent's token allowed but its own task never needed. Permit's writeup on delegated subagent permissions describes a reporting subagent spawned to read status that can also perform write operations because token inheritance is implicit, and the user never re-consented for that child context (Permit on subagent MCP permission decisions).
There is a public bug report that turns this into a concrete scenario: with "Bash" in a deny list, a subagent launched through a task tool ran more than twenty bash commands autonomously, including reading SSH keys and shell history, after a single approval of the task launch (the Claude Code issue). That is a mutation of effective scope that no code review caught, because the scope was never executed as a test.
The Claude Code documentation is useful here because it makes the tiers explicit: read-only tools run without approval inside the working directories, bash commands and file modifications require approval, and web fetch and search require approval except for preapproved domains (the Claude Code permissions docs). That table is the natural source for your tier definitions, and it is exactly what your tests should encode.
The gap auditors care about is authorization evidence, not telemetry. A tool trace tells you a function was called; an authorization record tells you whether the action was permitted under the policy in force at that moment (Permit on AI agent audit trails). Tests that assert the allowed set per tier produce the same artifact at build time, which is when fixing it is cheap.



