Skip to main content
Every governed model call resolves to exactly one audit event. The event is emitted asynchronously by the SDK after the call completes, persisted by the EgisAI control plane on a partitioned table, surfaced live on the Requests dashboard, and streamed to the audit-evidence export ZIP as one CSV row in request_logs.csv. This page is the field-by-field reference an integrator needs to consume the audit event programmatically — whether that’s piping events into your own SIEM, running fairness analytics on the decision logs, or proving control coverage to a SOC 2 auditor.
Every text-bearing field in this schema is sampled from the post-sanitization payload. Raw PII never appears in an audit event by design — see the Privacy contract section below for the invariants the SDK guarantees before writing a row.

Schema version

The fields described here correspond to schema version 2 of the audit event (SDK 0.13.0+, control plane 0.13.0+). Pre-2 events are forward-compatible: missing fields are nullable in the schema and the dashboard treats their absence as “not recorded” rather than as a value. When we add fields, they ship as additive nullable columns. We do not re-write the semantics of existing fields — the EgisAI compliance contract treats historical audit rows as immutable.

One audit event = one model call

A single row in request_logs represents one step of one agent — one LLM call, one tool dispatch, one sub-agent spawn, one policy check. A logical agent task (a “run”) groups many steps under a shared run_id; the run-level roll-up has its own Run schema summarised at the bottom of this page.

Field reference

Identity & correlation

Provider & call shape

Governance verdict

The verdict triplet is the single most important set of fields for compliance. The SDK records each phase independently so an auditor can ask “which side fired and why” without back-querying the JSONB blobs.

Performance & cost

Compliance-safe text previews

These fields are populated by the SDK after passing through label-based PII redaction and a 2 KB truncation, so any value in these columns is guaranteed to be compliance-safe — typed labels (<SSN>, <EMAIL>) in place of values, bounded size, never raw PII.

Sanitization tally

When verdict = "sanitize", sanitizations records what was masked, in count-and-shape form only — never the original value.
The privacy contract is non-negotiable: a sanitization record carries count and mask shape only. There is no field that ever holds the original value, the original value’s hash, or anything from which the original value could be reconstructed.

Decision object

Both prompt_decision and response_decision use the same shape. null means the phase did not run (typically because the request phase blocked the call and the response never came back).

Matched-policies array

Each entry records one rule that saw the data, with its individual verdict and reason. The array is preserved in evaluation order — including rules whose verdict was dominated by a more restrictive match — so historical review is accurate.

Run roll-up

A Run is one logical agent task: the framework-detected outer call, plus every step (LLM call / tool dispatch / sub-agent spawn) the agent made inside it. Run rows live in a separate table and are exported to runs.csv. The run roll-up carries the worst-of-steps verdict so a single line on the dashboard’s Runs page tells the operator the strongest enforcement outcome across the entire task. Per-step detail lives in the request_logs rows that point at it via run_id / step_seq.

Privacy contract

The SDK guarantees the following invariants before any audit event leaves your environment:
  1. No raw PII fields. Every text-bearing field (request_text, request_text_before_redaction, response_preview, error, intent_summary) is sampled from the post-sanitization payload, after typed labels have replaced detected PII. The pre-sanitization payload is never serialised to an audit event.
  2. Sanitization records are count-only. sanitizations[].count and sanitizations[].pattern are the only signal — never the original matched values, never a reversible hash.
  3. Fail closed on PII. If the local PII engine errors mid-evaluation, the call is treated as if PII was detected and the audit event records the failure outcome rather than the un-scanned payload.
  4. Bounded size. Text previews are capped at 2 KB so a misconfigured payload can’t bloat your audit volume unbounded.
  5. Deterministic evaluation order. Phase 1 (deterministic local checks) always runs before Phase 2 (LLM-backed checks) on each side; a Phase 1 block short-circuits Phase 2 and the audit event records exactly which phase decided.
These invariants are tested in the SDK’s regression suite — see the public source at egisai/tests/test_smoke_privacy_contract.py.

Accessing audit events

The audit-evidence export is the supported path for procurement-style evidence reviews — see Audit-evidence export for the ZIP layout and the framework-control mapping shipped in the manifest.

What’s next

Verdicts

The three verdicts and what each one means in detail.

Audit-evidence export

The ZIP-of-CSVs format auditors actually consume.

Two-phase governance

Why request and response decisions are recorded independently.

Enforcement matrix

Where enforcement_status = "advisory" happens and why.