Answers · AI evidence
How do I honor a GDPR erasure request when my AI agent's audit log is tamper-evident?
Last updated
TL;DR: Plan for it before the first entry, because a hash-chained or append-only log is built so entries can't be removed: deleting a row breaks the chain. GDPR doesn't bend for that. The EDPB's blockchain guidelines (02/2025, version 2.0, adopted 7 July 2026) say technical impossibility can't be used to justify non-compliance, and advise keeping personal data off the chain. So split every record. The details (who the agent acted for, emails, prompts, documents) go to an ordinary store you can delete from. The chained log gets only non-personal fields (action type, outcome, time) and a salted SHA-256 of the stored record. When a valid erasure request arrives and no exemption applies, delete the stored record and its salt, or the person's encryption key. The chain still verifies, and the hash left behind can't be linked back to the person. On Rightshold, record_action takes that hash as action_sha256, and its public ledger entry is a salted commitment that reveals nothing. The event fields you send (summary, client_event_id, tags) are kept and can't be deleted, so keep personal data out of them.
What should I check, step by step?
1. List what the agent's log holds and mark every field that could identify a person: names, emails, account or order numbers, IP addresses, free-text prompts and outputs, attached documents, and ids that point back to a customer record.
- Split each record in two. Personal details go to a store you control and can delete from (a database table or object store). The chained log gets only non-personal fields (action type, outcome, time, an internal random event id) and the SHA-256 of the full stored record.
- Salt every record: generate a random salt of at least 32 bytes, keep it with the stored record, and hash salt plus record. Without a salt, a hash of a short value such as an email address can be confirmed by guessing. The EDPB treats a salted or keyed hash as personal data while the salt exists, and as no longer linkable once the salt is deleted, provided it was long, random and never leaked.
- Or encrypt each person's records under their own key and delete the key to erase them (crypto-shredding). NIST SP 800-88 Rev. 2 accepts cryptographic erase only if the data was never stored in plaintext and every copy of the key is destroyed, so check backups, caches and key escrow.
- On Rightshold, send record_action with action_type, outcome, occurred_at and action_sha256 (the salted hash). Leave summary out or keep it generic ('refund issued'), and use a random id as client_event_id, never an email or a customer's order number. Recorded events can't be edited or deleted, so whatever you put in those fields stays.
- Enforce it on the stream: set require_action_sha256 to true and list allowed_action_types, so events without a hash or with an unexpected action type are refused.
- When an erasure request arrives, check the exemptions first (GDPR Article 17(3), for example a legal obligation to keep the record, or legal claims). If one applies, keep the record, limit who can open it and tell the person. If not, delete the stored record and its salt, or the key, from live systems without undue delay.
- Deal with backups: the ICO expects backup copies to be put beyond use until they are overwritten on their normal schedule, and every restore to re-apply the deletion list so erased records don't come back.
- Log the erasure itself without personal data: a new entry such as privacy.erasure_completed with the internal event ids affected and the date, so an auditor can see why those records can no longer be opened.
Why can't I just delete personal data from a tamper-evident AI agent log?
A tamper-evident log works because each entry commits to the one before it (or to a Merkle root), and the head is kept somewhere you don't control. Removing or editing an entry changes every hash after it, which is exactly what the log exists to expose. A log that keeps personal data inside its chained entries can't honor erasure without breaking its own proof.
- GDPR has no exception for that. Article 17 gives the right to erasure, Article 5(1)(c) and (e) require data minimisation and storage limitation, and Article 25 requires data protection by design. The EDPB says the rights to erasure and to object must be complied with by design, and that it isn't advisable to register personal data on a chain in clear text, encrypted or hashed form; it should be stored off-chain.
- Erasure isn't absolute. Article 17(3) lists exceptions, including processing needed to comply with a legal obligation and for the establishment, exercise or defence of legal claims. You may have to keep some audit records, so the design has to support both: keeping a record when an exemption applies, and making it unlinkable when none does.
How do I keep personal data out of a hash-chained AI agent log?
Store the agent's full record where you can delete it, and chain only a salted hash of it. Checking still works: anyone holding the stored record and its salt can recompute the hash and match it to the chained entry, and the chain shows the entry hasn't changed since it was written.
- Erasure then means deleting the stored record and its salt. The EDPB notes that once the salt or key is deleted, a hash made with a state-of-the-art function and a long random salt should no longer be linkable to the original data, unless the algorithm is broken or the salt leaked or was poorly chosen. Crypto-shredding reaches the same result for encrypted records, under NIST's conditions for cryptographic erase.
- Watch the fields that look harmless. An event id built from an email address, a tag holding a customer name, or a summary like 'refunded Jane Smith' puts personal data into the permanent part of the log.
What does Rightshold keep from a recorded agent action, and what can't it erase?
record_action appends the event to your account's private stream and puts a salted commitment to it on the public ledger, which reveals nothing unless you choose to open it. The event itself (action_type, outcome, occurred_at, summary, action_sha256, client_event_id, tags) is stored privately and can't be edited or deleted, so personal data sent in summary, client_event_id or tags stays for good. Send the salted hash in action_sha256 instead.
- Rightshold doesn't hold your stored records or salts, can't delete them for you and doesn't decide whether an exemption applies. A receipt proves what was submitted and when, and that it hasn't changed since. It doesn't prove the action happened. Not legal advice.
How do I ask Rightshold about this (free, no key)?
Add the MCP server https://www.rightshold.com/mcp to Claude, Cursor, ChatGPT, Grok or VS Code, then ask: “My support agent just issued a refund. I keep the customer's details and a random salt in my own database. Record the action with only the salted SHA-256 of that stored record, no customer details, so I can erase the details later without breaking the log.”
{
"tool": "record_action",
"arguments": {
"action_type": "refund.issued",
"outcome": "success",
"occurred_at": "2026-11-07T15:04:00Z",
"action_sha256": "SHA256_OF_SALT_PLUS_STORED_RECORD",
"client_event_id": "evt_7f3c9a1e52d0"
}
}- No key yet? Send accept_terms:true once to open a free account; the key comes back once.
- action_sha256 must be a 64-character hex SHA-256. Leave summary out, or keep it generic, because recorded events can't be edited or deleted.
- Set require_action_sha256 and allowed_action_types on the stream so events without a hash are refused.
- ledger_verify is free and keyless, and checks the public ledger the commitments sit on.
Rightshold records the events you send in a private, append-only stream and puts a salted commitment to each on its public ledger. It never holds your stored records, salts or keys, can't erase data you keep elsewhere and doesn't decide whether a GDPR exemption applies. Splitting records, salting, key deletion and backup handling are steps you run around those records. Not legal advice.
What are the sources?
- EUR-Lex: Regulation (EU) 2016/679 (GDPR), Articles 5, 17 and 25
- EDPB: Guidelines 02/2025 on processing of personal data through blockchain technologies (version 2.0, adopted 7 July 2026)
- ICO: Right to erasure (backups and 'beyond use')
- NIST SP 800-88 Rev. 2: Guidelines for Media Sanitization (cryptographic erase)
- Operations records on Rightshold
Related
- How to make an AI agent's audit log append-only so even an admin can't silently delete entries
- How to log every AI agent tool call for audit
- How to record the inputs an agent used for a payment or identity decision
- How to prove what an AI model said at a specific time
Not legal advice. JSON · Markdown · All answers
Get a free API key in one call
No card and no email needed. 100 free credits; the license and policy checks stay free without a key.
curl -s -X POST https://www.rightshold.com/v1/accounts/signup -H "Content-Type: application/json" -d '{"accept_terms":true}'
export RIGHTSHOLD_API_KEY=rs_... # the api_key from the reply (shown once)
curl -s https://www.rightshold.com/v1/licenses/check -H "Authorization: Bearer $RIGHTSHOLD_API_KEY" \
-H "Content-Type: application/json" -d '{"license":"MIT","intended_use":{"commercial_use":true}}'
