Audit gate (per agent)
Each agent has an audit gate. When the model asks for a tool call, the gate decides before anything executes. It is a deterministic policy engine, not a language model, so the same request always gets the same answer.
What is checked, in order
Section titled “What is checked, in order”- Global forbids from the policy bundle (
forbiddenTools,forbiddenArgPatterns). - Grant: is
server/toolin the agent’stools? Otherwisetool_not_granted. - Arguments against the grant’s constraints: type, required, pattern, enum, const, length,
range, item count and
denypatterns. Unknown arguments are denied unlessallowAdditionalArgs: true. - Call limits:
maxCallsPerRunper grant. - Classification: the data level of the run must not exceed the tool’s clearance.
- Approval:
approval: requiredon the grant, orrequireApprovalToolsin the policy bundle.
All violations are collected and recorded. The result is one of allow, deny or
require_approval.
Reason codes
Section titled “Reason codes”tool_not_granted, tool_forbidden, arg_missing, arg_unknown, arg_type, arg_pattern,
arg_enum, arg_const, arg_length, arg_range, arg_items, arg_denied,
arg_forbidden_pattern, call_limit, classification, approval_required.
Example
Section titled “Example”tools: - server: tickets tool: update_ticket approval: required maxCallsPerRun: 1 args: key: { type: string, required: true, pattern: "^SEC-\\d+$" } status: { type: string, enum: [triaged, in-progress, done] }A call with key: OPS-1 is denied with arg_pattern; a valid call pauses the run until a human
approves it. The model only ever sees tools that are granted.