Every mutation writes exactly one audit row; UPDATE/DELETE blocked for everyone, exportable under Object-Lock.
One immutable row per mutation — and a tamper-evident archive on demand.
Every write goes through trackFields to produce a field-level diff, then writeAudit in fail-closed mode: if the audit write fails, the caller's own mutation rolls back — no orphaned state. DB triggers block UPDATE/DELETE on the log for every role including service_role. Auditors query via RLS, and a cron (guarded by secret + lock) exports to S3 Object-Lock with KMS encryption.
No mutation without a record — and no record that can be erased. writeAudit is fail-closed so the mutation rolls back if the audit write fails. DB triggers block UPDATE/DELETE for everyone. A cron-driven S3 Object-Lock export produces a tamper-evident archive.