Skip to main content
The output of policy evaluation. What the runtime enforces.

Definition

A Decision is what a policy returns. The runtime enforces it. There is no ambiguity: the Decision is the contract between policy and runtime. Start with two types. That is enough to build the first control loop:

Decision Types

Fields

Computed Properties

  • allowed: True if type == "allow"
  • denied: True if type == "deny"
  • requires_approval: True if type == "approval_required"

Composition Rules

When multiple policies match a capability, the engine composes their decisions:
  1. No policies match: allow by default
  2. Any matching policy denies: return that deny decision immediately
  3. All matching policies allow: return the last allow decision by priority order
Only allow and deny participate in composition today.

Examples

When using the @runtime.before_capability decorator, policy name and version are annotated onto the Decision automatically.

Future Decision Space

The Decision type space is intentionally structured for expansion:
  • approval_required: pause the action, send an ApprovalRequest, resume when a human approves, or deny when they reject
  • redact: strip or mask sensitive fields from the output before returning it
  • transform_input: mutate the input before execution
  • transform_output: mutate the output after execution
  • route: redirect to a different model, tool, or capability
  • sandbox: execute with constrained network, filesystem, or time access
  • log_only: allow but record for later review
The important property is that the decision is structured. A structured decision can be audited, composed, explained, and eventually served from a central policy system.