Since August 2, 2026, high-risk AI systems placed on the EU market must technically allow the automatic recording of events (logs) over their lifetime — and supervisory practice expects those logs to be tamper-evident. This guide summarizes what Article 12 of the EU AI Act actually requires, why plain log files don't meet the bar, and the three architectures teams use to make logs tamper-evident — including external hash anchoring, which you can implement in an afternoon with any independent witness service (mpps.io is one).
The regulation's record-keeping requirement has four practical parts:
Non-compliance with high-risk system obligations carries fines up to €15 million or 3% of global annual turnover, whichever is higher (Article 99).
Every logging stack can produce a log file. The question an auditor or opposing counsel asks is different: "How do I know these logs weren't edited after the incident?" A file on a disk you control, in a database you administer, proves nothing about tampering — whoever operates the system can rewrite it. "Appropriate to the intended purpose" in Article 12 is increasingly interpreted as requiring tamper evidence: the property that any modification of the record is detectable.
Write logs to storage that physically or contractually prevents modification — AWS S3 Object Lock in Compliance Mode, Azure immutable blobs, dedicated appliances. Strong within one cloud account, and often sufficient. Weakness: the operator configures the storage, so an auditor must trust that the lock was on from day one and that no parallel unlocked copy was substituted. It is tamper-resistant, but the proof still lives entirely inside the operator's trust boundary.
Chain each log record to the previous one with a hash (like a mini-blockchain inside your log pipeline). Any in-place edit breaks the chain. Weakness: whoever holds the chain can recompute the entire tail after an edit. Without an external reference point, a rewritten chain is indistinguishable from the original.
Periodically — per event, per batch, or per day — compute a hash of your log segment (or the head of your internal hash chain) and register it with a party outside your trust boundary. The external party signs and stores the hash with a timestamp. Later, anyone can recompute the hash from your logs and compare it to the anchored receipt. If the logs were modified after anchoring, the hashes will not match — and you cannot alter the receipt, because you never controlled it.
This is the same principle behind RFC 3161 timestamping and certificate transparency logs. It composes with the other two architectures: WORM storage plus external anchoring gives you both retention and independently checkable integrity. Because only hashes leave your system, no log content — and no personal data under GDPR — is disclosed to the anchoring party.
Any independent timestamping or attestation service works as the witness. Using mpps.io (free, no API key), a nightly cron anchoring your log segment looks like this:
> HASH=$(sha256sum /var/log/ai-system/decisions-$(date +%F).log | awk '{print "sha256:" $1}') curl -X POST https://api.mpps.io/v1/receipts \ -H "Content-Type: application/json" \ -d "{ \"action\": \"log.segment.anchor\", \"subject\": \"decisions-$(date +%F).log\", \"artifact_hashes\": [{\"label\": \"daily-log\", \"sha256\": \"$HASH\"}], \"context\": {\"system\": \"credit-scoring-v2\", \"period\": \"$(date +%F)\"} }"
The response is an HSM-signed receipt with a UUID, a timestamp, and a verify URL. Store the UUID beside the log segment. At audit time: recompute the hash, fetch the receipt (or verify its signature offline with the published public key), show they match. The receipt itself is held in S3 Object Lock Compliance Mode for 10 years — outside your infrastructure and outside your control.