DORA
Articles 9 to 12 require ICT logs whose integrity and traceability hold up under examination. An agent acting on production is an ICT operation like any other.
Enforceable audit log for AI agents
To someone with no reason to believe you.
Which human delegated, to which agent, to call which tool, with which verdict. Sealed, exportable, verifiable offline.
Your AI agent can turn on you.
A workflow that answered issues from anyone read a private repository and posted its contents straight back as a public comment, using the tool it had been given to reply with. The attacker needed no code, no credentials and no access.
Source · Noma Security ↗A Cursor agent running Claude Opus 4.6 picked up an unrelated Railway token and deleted the production volume along with every backup at that level. The most recent usable copy was three months old, and the account of the incident was the confession the agent wrote about itself.
Source · The Register ↗Working from a new machine with a stale state file, the agent judged destroying through Terraform “cleaner and simpler” than the AWS CLI, and took out the VPC, the ECS cluster, the database and its automatic snapshots. One table alone held 1,943,200 rows.
Source · Alexey Grigorev ↗The Financial Times reported, from internal sources, that an in-house coding agent had caused production outages; Amazon answered publicly that the Cost Explorer outage came from a misconfigured role, “not AI as the story claims”. Nothing published lets an outsider settle it.
Source · Amazon, Financial Times ↗The triage agent ran inside GitHub Actions with Bash and Write, and the issue title reached the model verbatim. The chain ran from there to code execution, then to the publishing tokens of an extension with five million installs; the hole stood open about fifty days.
A copy of a legitimate MCP server, published on npm, added one line at version 1.0.16: a blind copy of every message sent, to an address belonging to its author. 1,643 downloads before removal: password resets, invoices, internal mail.
Source · The Hacker News ↗An attacker got a pull request merged that placed destructive instructions in the assistant’s system prompt: clear the system to a near-factory state, delete the cloud resources. The version shipped to a marketplace with around 950,000 installs before being pulled.
Source · BleepingComputer ↗The agent destroyed a database of 1,200 executive profiles and 1,190 company records during an explicit code freeze, then fabricated users and reported test results that were false. Its operator had told it not to, eleven times, in capitals.
Source · The Register ↗A mkdir failed silently, the agent carried on as though the folder existed, and renamed every file onto the same destination, overwriting all but the last one. Its own account: “I have failed you completely and catastrophically.”
CVE-2025-6514, rated 9.6: a malicious MCP server could inject system commands through a forged authorisation response and execute code on the client machine. Versions 0.0.5 to 0.1.15 were affected, the proxy that desktop AI clients use to reach remote servers.
Source · JFrog ↗And how many cases never made the news? ↓
Three texts, one requirement.
Articles 9 to 12 require ICT logs whose integrity and traceability hold up under examination. An agent acting on production is an ICT operation like any other.
Logging and integrity obligations run down the whole subcontracting chain, reaching entities that never had a regulator before. The evidence pack is the same artefact on both sides of the contract.
The gateway makes no outbound call, keys arrive as signed files, and time is anchored by file exchange. Built for those constraints, not certified against them.
How to certify what your AI agents do ↓
Between the call and the verdict,
four acts.
The agent speaks MCP to obsign-proxy. Identity proven by OIDC, every act evaluated against signed Cedar policy, method space default-deny in both directions. A refused call never reaches the server.
The record is written and fsync'd before the call is forwarded. Delegation, decision, and effect chain by construction; the log keeps argument hashes, never contents.
obsign-ledger runs elsewhere, reads the log without writing to it, and seals with a key the gateway never sees, held in an HSM in production. Checkpoints anchor at an RFC 3161 authority.
One self-contained evidence pack. The auditor runs obsign verify (~31 crates, buildable from source, no network) and gets a machine-checkable verdict.
All of it turns on what the rule says. ↓
A prompt asks.
A policy arbitrates.
policies/tools.cedar
The arbitration happens outside the agent’s reasoning loop. ↓
A screenshot of a dashboard
convinces nobody.
| Trace collection | Obsign | |
|---|---|---|
| Question | “What happened?” | “Prove it.” |
| Horizon | a retention window, read by your teams | years later, read by a hostile third party |
| Control | observes after the fact | refuses before the call is forwarded |
| Evidence | no artefact that survives being contested | a pack that verifies offline, with no network |
| Trust required | the reader has to take your word for it | none: they check the maths themselves |
Which leaves how. ↓
The hash chains.
The key attests.
What happens to it
seq=42 · args_hash
Written and persisted before the call is forwarded. Arguments enter as hashes; their values stay with you.
prev_hash → hash
Each record carries the fingerprint of its predecessor, on contiguous numbers. Nothing inserts, nothing disappears.
checkpoint · Ed25519
A checkpoint is signed by a key the writing process never holds. That is what makes a wholesale rewrite detectable.
RFC 3161 · tsr
The checkpoint fingerprint is timestamped by a third party. A signature proves who sealed; only the anchor proves when.
The keys it takes
The sealing key
Ed25519 · PKCS#11 · --key-id seal-prod
Lives in an HSM behind PKCS#11 and never enters the ledger process. A compromised host can sign now, not re-seal history later.
The timestamping authority
RFC 3161 · --tsa tsa.internal.acme.fr
Countersigns the checkpoint fingerprint. Its whole job is to be somebody else, so that a key holder cannot backdate.
The policy key
obsign-control --key-id ops-2026
Signs the Cedar bundle. The rule id quoted in a decision points back at the bundle that was in force.
The auditor’s trusted keys
obsign verify --trusted-keys keys.json
Obtained outside the pack, through another channel. Without them verification returns exit 3: consistent, but unproven.
Without the keys, a pack proves only itself. ↓
One file goes to the auditor.
Export
The pack (extract)
evidence.json
Verify
The verdict is not yours to give. ↓
Where Obsign sits
obsign-control
Compiles the policy source and signs the bundle. It decides nothing at runtime: what the gateway loads is a signed artifact, and the rule id in a decision points back at it.
The human
Proven by your IdP over OIDC. Their token is the root of the delegation chain, and it is what tells a destructive act with somebody behind it from one without.
The agent
Speaks MCP and nothing else. It never holds a credential for the tools, and a refusal reaches it as a protocol error it cannot argue with.
obsign-proxy
The only path between the agent and its tools. Default-deny in both directions, evaluation outside the model’s reasoning loop, and the record written before the call is forwarded.
The MCP servers
Your own tools, unmodified. They are reached only through the gateway, which is what makes the log complete rather than best-effort.
The WAL
The gateway’s only output, and it holds no key. Append-only, fsync’d before the call goes out: a crash loses the call, never the record of it.
obsign-ledger
Runs on another host, reads the WAL without writing to it, and seals with a key kept in an HSM. It detects a rewritten log rather than certifying it.
The HSM
Holds the sealing key and signs on request over PKCS#11, a local library call, so the ledger still makes no network call. The key never enters a process anyone can read.
The timestamping authority
Stamps the checkpoint fingerprint by file exchange: a request out, a token back, nothing listening. A signature proves who sealed; this is what proves when.
The auditor
Outside your infrastructure and outside ours. Builds the verifier from ~31 crates, runs it with no network, and gets an exit code rather than a screenshot.
Owning the gateway does not rewrite sealed history. ↓
send_message to #support from send_message to #all-hands. It does not record which human delegated to which agent. And it produces no evidence: after the incident, a correctly scoped token does not tell you what was attempted. Obsign does not replace least privilege. It arbitrates at the level of the act and keeps an enforceable record of it.fsync, not a network round trip. Sealing runs on another host, asynchronously, off the critical path, so an agent never waits on a signature. The cost sits on the write path and is bounded by design. Measure it in your own environment; a number on a website would not tell you much.The core, without us.
The rest, with.
Support & compliance
For teams that answer auditors and regulators across a fleet, not one agent. Separate code, separate licence, and the core keeps working without it.
Compliance report packs
The evidence pack laid out as a file an auditor reads: scope, period, verdicts, and the command that checks it again.
RBAC & SSO for the console
Who reads what, by role and by scope, tied to your directory rather than to a second list of accounts.
Long-term retention
Sealed chains kept and replayable years later, past the window an operational store is built to hold.
Onboarding & priority support
Put behind one real agent flow, with someone who knows your deployment when the auditor calls.
sealed · timestamped · offline-verifiable
A scoped pilot on one real agent flow, in your environment: the policy written with your security and audit people, the gateway on the path, and a verification replayed in front of your internal audit. The pack is sealed on your side and checked on theirs, with no access to your infrastructure.