Concepts

Audit log

The append-only, hash-chained record of the actions people and keys take in Sentinel.

When someone changes something that matters, Sentinel appends an entry to the audit log: who did it (an API key, sentinel-admin or bootstrap), what they did, to which record, and the details. Regulators and auditors rely on it, so it's built to make tampering obvious.

What gets recorded

ActionWhen
alert.updatedAn alert's status or assignee changes
alert.note_addedA note is added to an alert
alert.closure_requested, alert.closure_approved, alert.closure_rejectedEach step of closing an alert
alert.closedA screening alert closes by itself because every match was cleared and approved
screening.match_resolvedSomeone records a decision about a screening match
screening.resolution_approved, screening.resolution_rejectedA second person approves a cleared match, or anyone sends it back
rule.created, rule.activatedA rule draft is created or approved
rule.seededsentinel-admin rules seed installs the built-in rules
api_key.created, api_key.revokedA key is created or revoked
api_key.bootstrappedThe bootstrap key is stored on a fresh install

Each change and its audit entry are written in the same database transaction, so one never exists without the other.

Events, decisions and screening results aren't audit entries. They're kept in their own tables, which are only ever added to by the API, and each decision stores the rule versions and feature values behind it.

Each entry has:

FieldMeaning
seqPosition in the log
actorThe key ID, or sentinel-admin or bootstrap
actionWhat happened, for example alert.updated
target_type, target_idThe record it happened to
dataThe details of the change, as JSON
created_atWhen it was written
prev_hashThe previous entry's hash
hashThis entry's hash

Append-only

Database triggers refuse any UPDATE, DELETE or TRUNCATE on the audit table. Entries can only be added.

Hash-chained

Each entry's hash covers the previous entry's hash. Change one entry and every later hash stops matching.

Entryprev_hashhash
n − 1…0a7e19c2…
n0a7e19c2…9f2c41b8…
n + 19f2c41b8…e2c97f45…

The details:

  • Each hash is SHA-256 over the previous hash and every field of the entry.
  • Each field is length-prefixed, so values can't be shifted between fields to forge a match.
  • Chains are per organisation and written under a lock, so entries never interleave.

Verifying the chain

Terminal
sentinel-admin audit verify -org default

It walks the organisation's chain from the start. If every entry matches it prints how many it checked. Otherwise it reports the first entry that doesn't match and exits with an error.

Not built yet

There's no API or dashboard screen for reading the audit log, and no signed export for auditors. For now, read the audit_log table directly and run audit verify.

Sentinel is a Somu Labs product. © 2026 Somu Labs Ltd.