Policies & Human Review
What are policies?
Policies are rules that automatically evaluate every trace. Each policy specifies conditions and an outcome:
| Outcome | Behavior | Trace status |
|---|---|---|
| Block | Hard stop. Agent action should be stopped. | blocked |
| Flag | Soft match. Routes to Review Queue. | flagged |
| Approve | Explicitly approve matching traces, skipping other rules. | approved |
Policy evaluation
All active policies are evaluated for every trace. The most restrictive outcome wins:
block > flag > approve
If two policies match — one flagging and one approving — the flag wins.
Policy templates
Adjudon provides pre-built policy templates for common scenarios. Access them via the dashboard or the API:
GET /api/v1/policies/templates
Authorization: Bearer <jwt>
Templates cover common patterns: PII in outputs, harmful content, low-confidence decisions, off-topic responses, and more.
Creating custom policies
Via the dashboard: Dashboard → Policies → Create Policy
Via the API:
curl -X POST https://api.adjudon.com/api/v1/policies \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <jwt>" \
-d '{
"name": "Block PII in outputs",
"outcome": "block",
"conditions": [...]
}'
Review Queue
Flagged traces appear in Dashboard → Reviews. The Review Queue is Adjudon's implementation of EU AI Act Article 14 (Human Oversight) — every flagged decision requires human sign-off.
Reviewers can take the following actions:
| Action | Description |
|---|---|
| Approve | Mark the decision as acceptable |
| Reject | Mark as a policy violation |
| Escalate | Forward to a senior reviewer |
| Assign | Assign to a specific team member |
| Bulk decision | Approve or reject multiple items at once |
Webhook notifications
Configure a webhook to receive real-time notifications when review decisions are made:
curl -X POST https://api.adjudon.com/api/v1/webhooks \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <jwt>" \
-d '{
"url": "https://your-server.com/adjudon-webhook",
"events": ["review.completed", "trace.blocked"]
}'
See Webhooks for payload formats and signature verification.
Handling blocked decisions in code
When a trace is blocked, the API returns 403. SDKs with raise_on_block=True raise AdjudonBlockedException:
from adjudon import Adjudon
from adjudon.exceptions import AdjudonBlockedException
client = Adjudon(api_key="adj_agent_abc123...", agent_id="my-agent", fail_mode="closed")
try:
result = client.trace(
input_context={"prompt": user_input},
output_decision={"action": "llm_response", "text": llm_response},
)
except AdjudonBlockedException as e:
# Do not send the response to the user
return "I cannot help with that request."
With fail_mode="open" (default), blocked decisions still raise AdjudonBlockedException with raise_on_block=True — but infrastructure errors (network, timeout) do not block your agent.