Overview  /  Audit

Audit chain

One append-only line per decision, allow or refuse. Each line carries the hash of the line before it, so editing, deleting or reordering any entry breaks the chain from that point on.

Chain state

Publish the head hash somewhere you do not control, and any later rewrite is detectable.

Entries
7
Allow
4
Block
3
Genesis
0000000000000000000000000000000000000000000000000000000000000000
Head hash
1ba6097630456930cc5bb05d810fdcc80e1faf1098d3e1029e0dcb0c2ed7612c

Check it yourself

The verifier is not special. Anyone holding the file can run it.

python -m cleared.cli verify

Edit any line and run it again: it reports the first broken entry and why.

What it does not do. A chain detects changes within a log. It does not stop someone replacing the entire log from genesis. That needs the head hash anchored somewhere external, which this demo does not do.

Every entry

Phone numbers are masked in the log itself, not just on this page. Live calls add intent and dispatched entries before the terminal one, so a call lost mid-flight can never be dialled twice.

#RefAccountDecisionReason / outcomeRecordedprev → hash
0 aud_26cff37a A-1001 allow promise_to_pay 2026-08-28 13:30:00 0000000000 → 41f9160f24
1 aud_8ce3400a A-1002 block OUTSIDE_CALL_WINDOW 2026-08-28 13:30:00 41f9160f24 → f1a1f08fdf
2 aud_02ab9627 A-1003 block NO_CONSENT 2026-08-28 13:30:00 f1a1f08fdf → 6523acbcff
3 aud_e95ff827 A-1004 block ON_SUPPRESSION_LIST 2026-08-28 13:30:00 6523acbcff → 60df5b17ac
4 aud_98654e5a A-1005 allow opt_out 2026-08-28 13:30:00 60df5b17ac → 8a3a03ebcb
5 aud_edfd6351 A-1006 allow no_answer 2026-08-28 13:30:00 8a3a03ebcb → b76fd9d475
6 aud_80358dda A-1007 allow dispute 2026-08-28 13:30:00 b76fd9d475 → 1ba6097630