Core Concepts
The evaluation model
Every evaluate() call passes through the same pipeline: intent analysis, blast radius estimation, policy matching, and decision. Understanding each stage makes the API predictable and your policies easier to write.
Action
An action is the operation the agent proposes to perform. Pass it as a dot-separated string: service.operation.
Examples:
crm.delete_contactsstripe.issue_refundgmail.bulk_senddatabase.drop_tables3.delete_bucket
The action string is not a strict enumeration — you define your own naming convention. Policies are matched by exact string or prefix. Use consistent naming within your system.
Intent
Intent is the natural-language goal the user gave the agent, passed as a string. It is used for one purpose: intent mismatch detection.
If the scope of the action (as described by context) appears to significantly exceed what the intent describes, Hivenora setsintent_mismatch: true in the response. This surfaces cases where an agent may be doing more than the user intended.
Example:
Intent is used for analysis only. It does not influence the policy rule engine — policies match on action and context, not intent. A malicious intent string cannot bypass a policy.
Context
Context is a structured object with metadata about the action. It is the primary input to blast radius estimation and policy evaluation.
Recognized context fields
Unknown context fields are ignored. You can pass any additional fields — they are stored in the audit record but do not affect evaluation.
Blast Radius
Blast radius is an estimate of potential impact, computed deterministically from context. The output is one of four levels:
Blast radius is computed before policy matching. The policy engine can use blast radius as a match condition. Example: "if blast_radius is critical, require_approval."
What determines blast radius
The computation considers: records affected, financial amount, reversibility, environment, and data sensitivity. The exact thresholds are deterministic and documented in the Control Room → Policy Editor. There is no LLM inference in this step.
The response includes blast_radius_factors — a list of human-readable strings explaining which inputs drove the classification:
Policy
A policy is a rule that maps action conditions to decisions. Policies are defined per agent in the Control Room.
Policy structure
Policies are evaluated in priority order. The first matching policy wins. If no policy matches, the default agent decision is applied (configurable per agent — either allow or require_approval).
Decision types
- allow — the action proceeds. Recorded in the audit log.
- require_approval — the action is paused. An approval request appears in the Control Room. Your application polls or receives a webhook.
- block — the action is refused. Not approvable.
Decision
The evaluation returns two decision fields:
decision— what the policy engine decidedeffective_decision— what is actually applied
In enforcement mode, these are always equal. In Shadow Mode,effective_decision is always allowregardless of what decision says. See the Shadow Mode docs for details.
The response also includes convenience booleans:
is_allowed—effective_decision === "allow"requires_approval—effective_decision === "require_approval"is_blocked—effective_decision === "block"
The evaluation pipeline
Every evaluate() call runs in this order: