What the regulator usually requires
Different frameworks use different language but converge on the same expectation: an automated decision should carry a stable identifier of the rule that made it, a human-readable reason, and a path for an affected human to understand why.
The remainder of this page describes the four surfaces that deliver on
these obligations.
Surface 1 — programmatic, in your code
If your code wants to inspect a verdict directly, every patched provider call returns enough structured information to react to. ThePolicyDecision object returned by the public policy primitives is the
machine-readable contract:
PermissionError (default on_block="raise") carrying the same fields in
its message, or a framework-shaped refusal object (on_block="stub") with
the same reason code surfaced in the content. See
Blocking behavior.
Surface 2 — structural, in the audit event
Every governed call writes a structured audit event with the decision embedded as nested objects. The full schema is in Audit-event schema; the explainability-relevant fields are:- Verdict precedence is explicit. The top-level
verdictis the dominant outcome; the per-phase decisions show what each side decided independently. - Every rule that fired is preserved. A rule whose individual
verdict was
sanitizeis still inmatched_policieseven if a later rule’sblockdominated. Review is accurate without inference. - Reason codes are stable. Codes like
prompt_blocked,output_pii,tool_denied,output_too_largeare designed for switch-statement consumption and do not change across releases. - Enforcement honesty.
enforcement_statusdistinguishesenforced(the policy physically prevented the action) fromadvisory(the policy decided block but the framework had already executed the call). Auditors can find the latter via aWHERE verdict='block' AND enforcement_status='advisory'query — see Enforcement matrix.
Surface 3 — visual, on the dashboard
The Requests page renders every audit row in a list. Clicking a row opens a request-detail drawer with five panels designed for review:- Decision summary card — verdict pill, matched policy name, reason, risk badge, enforcement badge.
- Two-phase decision strip — separate request and response cards showing what each side decided and which rules matched.
- Decision narrative — a one-line natural-language story (“the agent tried to draft an HR letter; EgisAI redacted 2 SSNs before the model saw them”).
- Matched policies list — every rule that fired, in evaluation order, with its individual verdict and reason.
- Post-redaction text preview —
request_text/request_text_before_redaction/response_preview, all post-redaction, with a diff view when sanitize fired.
Surface 4 — aggregate, in the evidence export
For audit-cycle review, the Audit-evidence export ZIP carries the same decisions at scale. The export’s manifest pre-stamps each CSV with the framework controls it satisfies, so an auditor can review by control id without back-mapping the rows. The aggregate view answers the regulator-style questions the per-row view can’t:- “Show me every call this quarter where a fairness policy fired.”
- “Show me the policy inventory the day the system rejected this decision, with versions.”
- “Show me every operator action that touched the PII policies in the last six months.”
How this maps to a customer obligation
When an operator’s downstream regulator asks “how do you explain decisions made by your AI?”, the answer threads through the four surfaces above:A worked example
A customer-service agent at a financial-services company is blocked from returning a wire-instruction format. The audit row reads:verdict:blockenforcement_status:enforcedresponse_decision.reason_code:output_blockedresponse_decision.matched_policy:wire-instruction-output-blockmatched_policies[0].message: “Response matched deny regexwire-instruction-format; refused before delivery to caller.”
What EgisAI does not explain
To be unambiguous:- We do not explain the business reason the operator authored the policy. That’s authoring intent that lives in the operator’s policy authoring notes.
- We do not explain why a model produced a particular response. The audit shows the response and the policies that fired on it; the causal explanation of the model’s behavior belongs to the model vendor.
- We do not run causal counterfactuals. The
decision_narrativefield may include an optional counterfactual when the dashboard’s enrichment thinks one is helpful, but it is best-effort narrative, not a guaranteed causal claim.
What’s next
Verdicts
The three verdicts and the reason-code vocabulary.
Audit-event schema
Every field, every type, every privacy invariant.
Contesting a block
What an operator can do when a decision was wrong.
Enforcement matrix
Where the
advisory rather than enforced distinction matters.