Permissions and refusal
agent/permissions.py
first match wins · default = DENY
check
{{ callText }}
tool
argument_pattern
decision
{{ r.tool }}
{{ r.pattern }}
{{ r.decision }}
—
no matching rule
{{ defaultDecision }}
{{ outTitle }}
{{ outBody }}
RunResult.denied_calls += DeniedCall
trace.span("tool.denied", reason=...)
the loop continues · the agent can adapt
A wrongly denied command is an annoyance. A wrongly allowed one is an incident.
{{ line }}
{{ caption }}
←
{{ playLabel }}
→