Audit Model
Principles
- Audit is append-only by default.
- Mutation (
UPDATE/DELETE) is blocked at DB level. - Correlation IDs group related events from one operation.
- Export is admin-only and is itself audited.
Append-Only Enforcement
Claustrum enforces append-only behavior in Postgres with a trigger on audit_logs.
- Allowed:
INSERT - Blocked:
UPDATE,DELETE - Exception path: retention maintenance transaction sets
claustrum.audit_maintenance=on
This keeps regular app paths immutable while still allowing controlled retention operations.
Event Taxonomy
Access-related keys:
access.workspace_member.addedaccess.workspace_member.role_changedaccess.workspace_member.removedaccess.project_member.addedaccess.project_member.role_changedaccess.project_member.removed
Operational keys:
audit.exportaudit.retention.run
Correlation ID
audit_logs.correlation_id is used for batch-level traceability.
Typical producers:
- GitHub webhook delivery (
delivery_id) - GitHub permission sync job id
- OIDC sync transaction id
- Bulk role change operation id
Export
Endpoint:
GET /v1/audit/export
Supports:
format=csv|jsonworkspace_keyrequired- optional
project_key,source,action,from,to
Behavior:
- Streams output for large datasets
- Requires workspace admin
- Writes
audit.exportevent
Admin UI
Access Timeline supports:
- source/action/project/user/date filters
- correlation-based grouping (
Batch change (X events)) - expandable event details (
params,evidence,correlation_id) - CSV/JSON export