Cada evento cae en una fila JSONB-first. No hay columnas old_values / new_values separadas — la librería se mantiene orientada a eventos. Mirá el SQL en node_modules/tracevault/sql/ o usá generateInitSql para DDL combinado equivalente.
| Columna | Tipo | Notas |
|---|---|---|
| id | UUID | Generado por evento. |
| event | VARCHAR | Nombre del evento (obligatorio en emit). |
| actor_id | VARCHAR | Nullable. |
| actor_type | VARCHAR | Nullable. |
| target_id | VARCHAR | Nullable. |
| target_type | VARCHAR | Nullable. |
| data | JSONB | Payload libre. |
| meta | JSONB | Metadata libre. |
| mode | VARCHAR | sync | async. |
| occurred_at | TIMESTAMPTZ | Provisto o generado al emitir. |
| created_at | TIMESTAMPTZ | Default now() en DB. |
| correlation_id | VARCHAR | Nullable. |
| request_id | VARCHAR | Nullable. |
| environment | VARCHAR | Nullable. |
| outcome | VARCHAR(64) | Generado (002+). NULLIF(BTRIM(data->>'outcome'),''). Omitido en insert. |
| error_code | VARCHAR(255) | Generado. NULLIF(BTRIM(data->'error'->>'code'),''). Omitido en insert. |
| severity | VARCHAR(32) | Generado (003+). NULLIF(BTRIM(data->>'severity'),''). Omitido en insert. |
Las columnas generadas existen para lecturas indexadas y acotadas vía audit.query. Para analytics, filtros JSONB o joins, usá la herramienta SQL que ya tenés — Tracevault no bloquea acceso raw.
Referencia canónica: README.