Product/Evidence and assurance

A request log tells you a call happened. Evidence tells you the control held.

Every gateway writes logs. Logs are timestamps, token counts and status codes, kept for two weeks, editable by whoever owns the log store. An auditor asking whether EU personal data was minimised on 14 March cannot be answered from that. This page is what obstruo keeps instead.

See an evidence pack Anatomy of one record
Why this is not logging

Six things a log cannot do

Evidence has to survive a question asked months later by someone who does not trust the system that produced it. That is a different design goal from observability.

THE QUESTIONORDINARY PROXY LOGOBSTRUO RECORD
Which rule was in force at the time?Not capturedPolicy version pinned to the request
What was removed before it left?Payload stored raw, or not at allCategory counts, and the redacted text
What did the agent actually do?One line per HTTP callModel turns and tool calls as one chain
Has anyone edited the history?Anyone with store access canAppend-only, hash-chained, verifiable
Who approved this model or tool?Lives in a ticket somewhereApproval linked to the record it enabled
Which clause does this satisfy?Mapped by hand each auditFramework references on the control
LLM audit MCP and tool audit Call-chain graph Integrity status Redaction evidence Incident linkage Retention Approvals Framework mappings
Anatomy of one record

One request, one linked record

The unit of evidence is not a log line. It is a record that connects the caller, the decision, the rule that produced it, what was removed, where it went, and what it touched. Everything else on this page is a view over that record.

Record req_8f31c04a 14 Mar 2026, 09:41:22.184 UTC
CALLER
claims-triage, project Claims automation
DECISION
Allowed, redacted
POLICY VERSION
eu-personal-data v14
REDACTED
3 entities, 2 categories
ROUTED TO
EU model provider, eu-central
TOOLS TOUCHED
2 reads, 1 write denied
APPROVAL
Model approved 2 Feb, by the DPO
INCIDENT
INC-2041, open
INTEGRITY
Sealed, chain verified
FRAMEWORK REFERENCES CARRIED BY THIS RECORD
GDPR, Article 32 EU AI Act, Article 14 ISO 27001, A.8.16 ISO 42001, 6.1.2
The record keeps the redacted text alongside the decision. Content storage can be switched off per project, or, in a raw-audit project, extended to the original content with a documented reason and an accepted risk.
01 LLM audit

Every model call, with the decision that shaped it

The LLM audit is queryable by project, agent, model, provider, region, decision and date. A reviewer filters to the population they care about and reads the decisions, not the payloads. Only the redacted text is kept, so the audit itself does not become the largest concentration of personal data you own. Raw-audit projects are the deliberate exception, and are labelled as such.

Filter by agent, model, region, decision or policy version
Refusals carry the control that refused them, not a generic 403
Read-only auditor role, with its own reads recorded
LLM auditagent = claims-triage
REQUESTMODELDECISION
req_8f31c04achat-euAllowed, redacted
req_8f31bd77chat-euAllowed, redacted
req_8f31b902cheap-batchRefused, non-EU
req_8f31b4e1chat-euAllowed, budget warning
req_8f31afc8chat-euRefused, fail closed
Redacted bodies, unless this is a raw-audit project
MCP and tool auditlast 15 min
TOOL CALLSERVERRESULT
claims.record.readpostgres-mcpAllowed
crm.contact.readcrm-mcpRedacted
payments.refundpayments-mcpDenied
unregistered serverunknownRefused
DENIED CALL, RECORDED SHAPE OF THE ARGUMENTS
payments.refund({ claim_id: string, amount: number, iban: redacted })
Denied by high-risk-agent baseline v6, writes not permitted
02 MCP and tool audit

What the agent tried to do, not only what it said

A model call is speech. A tool call is an action against a real system, and it is the part an auditor cares about. Every tool invocation is recorded with the server, the action, the permission that allowed or denied it, and the shape of the arguments. Attempted actions are kept, not only successful ones.

Attempted, denied and refused calls are all first-class records
Argument schema kept, argument values redacted
Tool responses carry their own redaction record
03 Call-chain graph

One task is not one request

A single instruction becomes a dozen model turns and tool calls, often across several agents. Read as flat log lines, that is unintelligible. The call-chain graph keeps the parent and child relationships, so a reviewer can follow one task from the instruction to the last action and see exactly where a control fired.

Model turns, tool calls and sub-agents in one tree
Agent-to-agent delegation kept as an edge, not lost
The node where enforcement happened is marked in the chain
Chainchain_4b12 · 7 nodes · 3.9s
Instruction, settle claim 44192
claims-triage, turn 1chat-eu
claims.record.readallowed
crm.contact.readredacted
claims-triage, turn 2chat-eu
payments.refunddenied here
Escalated to a human queue
The chain is the answer to what happened. The record is the answer to why.
Integrity statusCHAIN VERIFIED
Records sealed4,182,551 of 4,182,551
Last verification runToday, 04:00 UTC
Gaps in sequenceNone
Administrative deletionsNot permitted
SEGMENT SEAL
prev 9c41…7ab2 → seal 3f08…1d94
Each segment seals the one before it. Removing a record breaks every seal after it.
04 Integrity status

Evidence nobody can quietly edit, including us

An audit trail that an administrator can rewrite is not evidence, it is a report. Records are append-only and hash-chained in segments, verification runs on a schedule, and the current integrity state is visible to your auditor role rather than asserted in a PDF.

Append-only, no edit or delete path for any role
Hash-chained segments, so a gap is detectable, not deniable
Integrity state exported with every evidence pack
05 Redaction evidence

Prove minimisation without keeping the personal data

The uncomfortable part of proving redaction is that the proof usually requires keeping what you redacted. obstruo records the standard that applied, the categories detected, how many entities were replaced and what happened on failure. Counts, categories and the tokenized text, never the original values.

Per-request category counts, in both directions
The standard and its version, not just the word redacted
Fail-closed events recorded as refusals, with the reason
Redaction evidenceeu-gdpr-strict v14
CATEGORYENTITIESDIRECTION
Name1Outbound
Bank account1Outbound
Card number1Outbound
Name, from tool response2Inbound
Re-identified inside your boundaryYes, on response
Original values are not retained. What is retained is enough to demonstrate the control ran.
INC-2041OPEN
CauseUnpermitted write attempt
Opened byControl plane, automatically
OwnerClaims platform lead
SeverityMedium
LINKED EVIDENCE
req_8f31c04aand 4 records in the chain
high-risk-agent baseline v6
claims-triage, agent register entry
Policy change proposed, awaiting approval
06 Incident linkage

The block is the start of the record, not the end of it

When a guardrail fires or an agent reaches for something it was not given, an incident opens with the request that caused it already attached. Compliance works it from there: severity, owner, the policy involved, the action taken, and the policy change that closed it. Nothing is reconstructed from provider dashboards a week later.

Opened automatically from a blocked request or fired guardrail
Carries the whole chain, the agent and the policy version
Closure links to the control change that fixed the cause
07 Retention

Keep evidence longer than you keep data

Storage minimisation and audit obligations pull in opposite directions. They only reconcile if the two things have separate lifetimes. Metadata records can be kept for years because they hold no personal data, while redacted content expires quickly, per class and per project.

Retention set per data class, not one policy for everything
Expiry is enforced, and the expiry itself is recorded
Legal hold suspends expiry for a named scope, with an owner
Retention scheduleorganisation default
CLASSKEPT FORPAYLOAD
Decision records7 yearsNone
Tool call records7 yearsSchema only
Redaction counts7 yearsNone
Incident working notes3 yearsText
Redacted prompts and responses30 daysTokenized text
Legal hold active on 1 project, expiry suspended until closed
Approval queue
New model, eu-central vision
Requested by the claims team, awaiting compliance
PENDING
New model, us-east reasoning
Research, transfer basis SCC, reviewed by the DPO
APPROVED
analytics-mcp as upstream
Blocked until the DPA is countersigned
BLOCKED
Each decision is linked to the records it later enabled
08 Approvals

Nothing new reaches a project without a name on it

Before a new model or MCP server becomes available to a project, someone in compliance approves it. The request carries the reason, the requester and the approver, and the decision is recorded against the model or server it unlocked. Months later, any record produced under that decision points back to it.

Reason, requester and approver on every request
Blocked until approved, so nothing goes live quietly
Exceptions carry a scope and an expiry date, and then lapse
09 Framework mappings

Map the control once, answer every framework

Frameworks overlap heavily. The same redaction control satisfies a GDPR clause, an ISO control and a SOC 2 criterion, and answers half a customer questionnaire. Mapping lives on the control, so evidence inherits it instead of being re-mapped by hand each cycle.

CONTROLSATISFIES
EU personal data redaction GDPR Art. 32GDPR Art. 5(1)(c)ISO 27001 A.8.11SOC 2 CC6.1
Human oversight on high-risk agents AI Act Art. 14ISO 42001 8.4
Approved models and providers GDPR Art. 28ISO 27001 A.5.19ISO 42001 6.1.2
Append-only audit trail AI Act Art. 12ISO 27001 A.8.15SOC 2 CC7.2
Processor register and residency GDPR Art. 30GDPR Chap. VSOC 2 CC9.2
Mappings are our reading of the clauses, kept current and open to your auditor's judgement. We do not claim they replace an assessment.
10 Evidence exports

An export, not a project

The point of all of this is the moment an auditor or an enterprise buyer asks a question. Scope a pack by project, agent, framework or date range and it comes out with the control state, the counts, the exceptions and the integrity proof, in a form you can hand to someone outside your organisation.

Scoped by project, agent, framework or date range
PDF for reviewers, JSON and CSV for their tooling
Scheduled exports, and a read-only auditor role instead of a new one
Audit response Customer security review Internal audit Certification file
Evidence pack, Q2 2026COMPLETE
Governed requests4,182,551
Tool calls, 1,046 denied612,388
Redaction events318,904
Open exceptions3
Incidents closed7 of 9
Integrity proofIncluded
PDF JSON CSV Signed manifest
Where the controls behind this evidence are configured

Evidence is a by-product. The policies, registries and redaction standards that generate it live on the governance page, and the enforcement that produces each decision is on runtime controls.

Governance Runtime controls

Your AI. Your data. Your control.

Bring the question your last security review could not answer. We will show you the record that answers it.

See obstruo in action See pricing