Skip to main content
Enforcement you cannot prove is not enforcement. The control plane writes every decision to an append-only audit trail, can seal any decision into a cryptographically signed verification record, and captures full agent trajectories so each consequential action has a tamper-evident context for compliance review.

The audit trail

Every authorize 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:
Three properties make this an audit trail rather than a log:
  • 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.
The console at console.akhara.dev renders the same feed live under Home → Live Enforcement Feed.

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):
During an audit or incident review, anyone holding the envelope can verify it and get a { "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.
The 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.