audit
engine-dmo audit: The audit log's integrity: walk its hash chain and report every break. Every subcommand, argument and flag.
The audit log’s integrity.
| Command | What it does |
|---|---|
engine-dmo audit verify | Walk the audit log’s hash chain: every row’s content, every link, and holes where rows were deleted |
engine-dmo audit verify
Walk each realm’s hash chain in link order: each row’s content hash recomputed, each link recomputed from the one before, and the sequence checked for holes.
engine-dmo audit verify [flags] It takes no flags of its own. The chain exists only with audit.hash_chain on. --json prints the command’s own JSON document. Runs in a project and needs the database.
member: 412 links from 1 to 412, head 7c1e...
staff: 1842 links from 1 to 1842, head 9f2c..., 2 rewritten by erasure
system: 9120 links from 1 to 9120, head 41ab... Each line gives the realm’s links, where the walk starts, its head, how many rows an erasure rewrote and how many were written while the chain was off. The walk starts later than 1 once retention has pruned the oldest rows, which is not a break. Each break follows on its own line:
| Break | Means |
|---|---|
content | A row changed with the database trigger off |
rewrite | A row rewritten in a transaction that recorded no erasure |
link | A forged or recomputed link |
gap | Rows deleted from inside the chain |
| Exit | When |
|---|---|
0 | Every realm is intact |
1 | Any break, or no database connection |
3 | Nothing is chained: set audit.hash_chain: true and restart the engine |
Each run writes audit.verify to the audit log, with whether the chain was intact.
Under --json:
{
"enabled": true,
"realms": [
{
"realm": "staff",
"links": 1842,
"first_seq": 1,
"head_seq": 1842,
"head_hash": "9f2c...",
"head_at": "2026-11-02T09:14:03Z",
"erased": 2,
"unchained": 0,
"breaks": [{ "kind": "gap", "seq": 17, "id": 0, "missing": 3 }]
}
]
} A gap’s seq is the first missing link and its missing how many; any other break’s id is the row. See Data protection duties.