Step 1 — Request enters
A procurement agent — procurement-assistant, running
mistral/large-2 — receives a request to approve a
€200,000 invoice from a new supplier. The call is
wrapped with @sentinel.trace. The request enters
Sentinel before any payment function runs. Nothing about Sentinel
is visible to the agent.
Step 2 — Policy evaluates
Sentinel loads policies/procurement.py, version
2.1.0. SimpleRuleEvaluator runs the rule
amount_exceeds_threshold, comparing the invoice
amount against the agent's configured ceiling of
€100,000. The rule triggers. Evaluation is
deterministic, in-process, and takes microseconds.
Step 3 — Decision
The policy returns DENY. Sentinel raises
PolicyDeniedError before any call to the payment
function is made. The agent sees the denial. The downstream
system is never touched. The decision is append-only from this
moment on.
Step 4 — Trace written
Sentinel writes a DecisionTrace to the local
SQLiteStorage. The record captures the timestamp,
the agent, the hashed inputs (never the raw invoice), the policy
identifier and version, the rule that triggered, the rationale,
and the EU-DE data residency assertion. Storage is
synchronous — there is no async backend to lag or lose the write.
Step 5 — Evidence updated
A senior approver, finance.lead@org.eu, reviews the
record out-of-band and records a HumanOverride with
justification "approved escalation for Q2 capex".
Sentinel appends a second, linked record. The first record is
never modified.
At quarter-end, the audit lead runs
sentinel evidence-pack --since 2026-04-01 --until 2026-07-01 --financial-sector --output audit-q2.pdf.
Every record in the window — including this one — is bundled with
the EU AI Act and DORA coverage snapshot, a SHA-256 hash manifest,
and a sovereign attestation. The PDF is handed to the external
auditor.