# X_AUDIT_SINK_MISSING

## Means

an action declares `audit: true` and no sink is installed

## Typical cause

`apps/<app>/runtime.ts` names no `auditSink`. Raised **before the input parse** — it is the one audit failure with nothing committed behind it, and there is deliberately no logger-backed default: a line nobody stores would satisfy the declaration while recording nothing

## Fix

`auditSink: postgresAuditSink({ executor })` in `export const runtime = { … }`, `apps/<app>/runtime.ts` ([Adapters](/adapters#auditsink)). Two ship: `postgresAuditSink({ executor })` — append-only `x_audit`, one row per record, no purge — and `memoryAuditSink()`, which is a **bounded ring that drops** (1,000 records, oldest first, `dropped` counts them) and is the dev sink, not a system of record. Nothing applies `SQL_AUDIT_TABLE` at boot yet, so run that DDL once against the app's database before naming the Postgres sink

[Actions](/error-codes#actions)
