The decision trail
The trail is what you follow backwards when somebody asks "why did this happen?", six months later, in front of an auditor, about an action taken by an agent nobody remembers configuring.
Each link is deliberate.
action → audit event → policy that matched → policy version
↓
recorded decision → source event → the URLLink 1, the audit event
Every request appends exactly one event. Not zero for allowed actions, not two for approved ones. One.
It records who (the agent, and the org if set), what (action, target, environment), the decision, the risk level, every policy that matched, the advisory signals that fired, and the session.
memnox audit
memnox audit --project acme-checkoutThe console shows the same record on its Activity screen.
Link 2, the policy that matched
The event names the rules by id, so a verdict is never explained as "blocked by
policy". It is explained as "blocked by no-recursive-delete-in-payments,
which says: Recursive delete is not an agent action here."
The reason string in your YAML is what the human eventually reads. Write it for that person.
Link 3, the policy version
Every event records policyVersion, the content hash of the rule set in
force at that instant.
This is the link people skip and later need. Rules change. Without the version, a verdict from March cannot be explained by the file as it stands today, and "the rules were different then" is an assertion rather than a fact.
memnox policy versionThe console keeps the same history, and can roll back to any version in it.
Link 4, the decision behind the rule
Where a verdict was escalated by decision memory, the trail continues into the
organizational graph: the decision node, its
approver, and the evidenced_by edge to the source event.
Link 5, the original
The source event carries the permalink. The trail ends where it started: a Slack message, a pull request, a minute of a recording.
That is the property that makes the rest of it worth anything. Nothing in the chain is Memnox's word for it.
Replaying
Because nothing in the decision path is random, model-derived, or read from a wall clock inside the engine, a recorded decision can be recomputed:
memnox replay <sessionId> # every decision in one agent session
memnox explain <eventId> # why this event got this verdictAnd a candidate rule set can be tested against real history before it ships:
memnox policy simulate -f candidate.yamlIt reports every decision that would differ, and warns loudly where an action becomes more permissive. That warning is the point of the command.
Tamper evidence
Each event stores prevHash, and hash = sha256(canonical event + prevHash),
computed at append time. Editing or deleting a record breaks the chain from that
point onward.
memnox audit verify
# Audit chain intact — 128401 events verified.
# …or: Audit chain BROKEN at event #91 (0f3a…): content-mismatchConsole → Audit, with one event expanded showing matched policies, signals and policyVersion
screenshot slot, save as public/screens/…png and set src

