The audit trail
Everyauthorize call, whatever the verdict, is appended to the evidence feed
as a policy_decision event. You do not instrument anything; the PDP writes it
server-side:
- Append-only. The feed (
events.jsonl) is never rewritten; corrections are new events. - Complete. Allows are recorded alongside blocks, so absence of a record is itself evidence.
- Self-describing. Each event carries the rule, the matching policy, the original and final content, and the session that ties it to the conversation.
Signed verification records
For decisions that must survive scrutiny after the fact, seal them. The sign endpoint canonicalizes a decision and produces a tamper-evident envelope (akhara.verification_record.envelope.v1):
{ "valid": true } or { "valid": false } answer: the record either is the
decision that was made, or it has been altered.
Signing covers the canonicalized decision, so cosmetic reformatting does not
break verification but any change to the verdict, rule, or content does.
Trajectories
A single verdict rarely answers a reviewer’s real question, which is “what was the agent doing at the time?” Trajectories answer it:- Eval runs produce a full trace per run (
akhara.harbor.trace_export.v1) with every step, screenshot, and verifier result. Latch steps are flagged, so you can see where a policy stopped or escalated the agent. See Running. - Live sessions are stitched by
session: every decision the PEP requested during a conversation shares one session id in the feed, in order. - Your own trace events can be appended with
POST /api/events, so agent-side context lands in the same append-only feed as the decisions.
permitId closes the loop: because a consequential action only executes
with a one-time permit, and the permit appears in the decision event, every
side effect is joinable to the exact verdict, rule, and trajectory that
authorized it.
API: evidence endpoints
Ingest events, seal decisions, verify sealed records.

