{"course":{"slug":"agents-and-automation","title":"Agents and Automation","url":"https://addaly.com/learn/agents-and-automation","level":"intermediate","track":"build"},"lesson":{"slug":"disclosure-and-audit","title":"Telling people, and keeping the receipts","url":"https://addaly.com/learn/agents-and-automation/disclosure-and-audit","position":46,"of":72,"minutes":8,"answer":"Record the run, the prompt version and the pinned model id with every action, and name the person accountable: 'the system decided' is not an answer anyone accepts.","keyIdea":"Record the run, the prompt version and the pinned model id with every action, and name the person accountable: 'the system decided' is not an answer anyone accepts."},"body":{"format":"markdown","text":"## People are owed the fact\n\nWhen an automated system writes to a person, say so. Transparency duties of this kind now appear in law in several jurisdictions, including the European Union's AI Act; the details vary and will keep moving. The practical reason does not move: a person who knows they are dealing with a machine behaves usefully differently. They stop writing three paragraphs of context. They ask for a human when they need one. And they do not discover it later, which is the outcome that costs you the relationship.\n\n## Disclosure that does not irritate anyone\n\nA banner reading *this response was generated by artificial intelligence* is legally tidy and reads as a disclaimer. What works better is naming the accountability:\n\n> Drafted automatically and checked by Priya in support. Reply to this email and a person will read it.\n\nThat sentence tells the reader three things (how it was made, who is responsible, how to reach a human) and it does not sound like a warning label. Keep it short, and keep it near the content rather than in a footer.\n\n## What an audit record has to contain\n\nPer action taken in the world:\n\n- **what** was done, with the arguments\n- **which run and step**, linking to the full trace\n- **the model id, pinned** to a dated version rather than a floating alias\n- **the prompt version**: a hash, or the commit it came from\n- **the inputs** that led to it, or a reference to them\n- **who approved it**, if anybody did\n- **when**, in UTC, with the local timezone recorded separately if it matters\n\nThe prompt version is the field people leave out and then need. Six months later somebody asks why a refund was approved in April. Without the prompt that was in force that day, the honest answer is that you do not know, and there is no way to reconstruct it.\n\n## Pin the model\n\nIf your code names a floating alias, the model can change underneath you with no change in your repository. Your audit trail will say nothing happened, your evaluation numbers will move, and the investigation will start in the wrong place. Pin the version, upgrade deliberately, and record the upgrade like any other deploy.\n\n## Retention, and the store everybody forgets\n\nTraces are full of personal data. Decide three things before you turn tracing on: how long you keep them, who can read them, and what is redacted at write time.\n\nThen make sure a deletion request actually reaches the trace store. Teams build careful deletion for the main database and leave a year of transcripts sitting in an observability tool that never made it onto the data map. If you promise erasure, the promise covers everywhere.\n\n## Name a person\n\nEvery automation has one named owner, written in the repository. Not a team, a person, with a deputy.\n\nThis is not bureaucracy. When something goes wrong the first question is always who is going to look at it, and an automation that belongs to everybody belongs to nobody at 3am. It is also the answer to the question a customer, a regulator or your own board will ask, in those words: *who decided this?* The answer has to be a name."},"check":{"question":"A refund agent has been live for eight months. A customer disputes a refusal from April. The team has full traces including every message sent to the model. What are they still most likely to be unable to answer?","options":[{"text":"What the customer originally asked for.","correct":false,"tempting":"Present in the trace by definition, since the request is the first message in the run."},{"text":"Which rules and which model version were in force that day, because the prompt version was never recorded and the code named a floating model alias.","correct":true},{"text":"Whether the refund was eventually paid.","correct":false,"tempting":"Answerable from the payments system independently of the agent, and the easiest fact in the whole dispute to establish."},{"text":"How long the run took.","correct":false,"tempting":"Recorded in the trace, and in any case irrelevant to why the decision went the way it did."}]},"prev":{"slug":"irreversible-actions","title":"Money, messages and deletions","url":"https://addaly.com/learn/agents-and-automation/irreversible-actions"},"next":{"slug":"the-classifier-router","title":"Pattern: one call, one label, then code","url":"https://addaly.com/learn/agents-and-automation/the-classifier-router"},"authorship":"Founder and series editor: Dr Mustafa Mun. Written by AI models to a written standard. Exam keys checked blind by a second model: 3,665 of 3,666 agreed. Academic review invited.","review":{"status":"Draft, open for academic review"},"cite":"Addaly (2026) 'Telling people, and keeping the receipts', in Agents and Automation. Edited by M. Mun. Addaly. Available at: https://addaly.com/learn/agents-and-automation/disclosure-and-audit (Accessed: 13 October 2026).","licence":{"name":"CC BY-NC-SA 4.0","url":"https://creativecommons.org/licenses/by-nc-sa/4.0/"},"reader":{"schema":1,"title":"Telling people, and keeping the receipts","courseTitle":"Agents and Automation","module":{"index":5,"slug":"safety-and-blast-radius","title":"Permissions, injection and blast radius"},"answer":null,"keyIdea":"Record the run, the prompt version and the pinned model id with every action, and name the person accountable: ‘the system decided’ is not an answer anyone accepts.","hero":{"kind":"plate","image":null,"alt":null,"caption":null},"blocks":[{"t":"h2","id":"people-are-owed-the-fact","runs":[{"text":"People are owed the fact"}]},{"t":"p","runs":[{"text":"When an automated system writes to a person, say so. Transparency duties of this kind now appear in law in several jurisdictions, including the European Union’s AI Act; the details vary and will keep moving. The practical reason does not move: a person who knows they are dealing with a machine behaves usefully differently. They stop writing three paragraphs of context. They ask for a human when they need one. And they do not discover it later, which is the outcome that costs you the relationship."}]},{"t":"h2","id":"disclosure-that-does-not-irritate-anyone","runs":[{"text":"Disclosure that does not irritate anyone"}]},{"t":"p","runs":[{"text":"A banner reading "},{"text":"this response was generated by artificial intelligence","i":true},{"text":" is legally tidy and reads as a disclaimer. What works better is naming the accountability:"}]},{"t":"quote","runs":[{"text":"Drafted automatically and checked by Priya in support. Reply to this email and a person will read it."}]},{"t":"p","runs":[{"text":"That sentence tells the reader three things (how it was made, who is responsible, how to reach a human) and it does not sound like a warning label. Keep it short, and keep it near the content rather than in a footer."}]},{"t":"h2","id":"what-an-audit-record-has-to-contain","runs":[{"text":"What an audit record has to contain"}]},{"t":"p","runs":[{"text":"Per action taken in the world:"}]},{"t":"ul","items":[[{"text":"what","b":true},{"text":" was done, with the arguments"}],[{"text":"which run and step","b":true},{"text":", linking to the full trace"}],[{"text":"the model id, pinned","b":true},{"text":" to a dated version rather than a floating alias"}],[{"text":"the prompt version","b":true},{"text":": a hash, or the commit it came from"}],[{"text":"the inputs","b":true},{"text":" that led to it, or a reference to them"}],[{"text":"who approved it","b":true},{"text":", if anybody did"}],[{"text":"when","b":true},{"text":", in UTC, with the local timezone recorded separately if it matters"}]]},{"t":"p","runs":[{"text":"The prompt version is the field people leave out and then need. Six months later somebody asks why a refund was approved in April. Without the prompt that was in force that day, the honest answer is that you do not know, and there is no way to reconstruct it."}]},{"t":"h2","id":"pin-the-model","runs":[{"text":"Pin the model"}]},{"t":"p","runs":[{"text":"If your code names a floating alias, the model can change underneath you with no change in your repository. Your audit trail will say nothing happened, your evaluation numbers will move, and the investigation will start in the wrong place. Pin the version, upgrade deliberately, and record the upgrade like any other deploy."}]},{"t":"h2","id":"retention-and-the-store-everybody-forgets","runs":[{"text":"Retention, and the store everybody forgets"}]},{"t":"p","runs":[{"text":"Traces are full of personal data. Decide three things before you turn tracing on: how long you keep them, who can read them, and what is redacted at write time."}]},{"t":"p","runs":[{"text":"Then make sure a deletion request actually reaches the trace store. Teams build careful deletion for the main database and leave a year of transcripts sitting in an observability tool that never made it onto the data map. If you promise erasure, the promise covers everywhere."}]},{"t":"h2","id":"name-a-person","runs":[{"text":"Name a person"}]},{"t":"p","runs":[{"text":"Every automation has one named owner, written in the repository. Not a team, a person, with a deputy."}]},{"t":"p","runs":[{"text":"This is not bureaucracy. When something goes wrong the first question is always who is going to look at it, and an automation that belongs to everybody belongs to nobody at 3am. It is also the answer to the question a customer, a regulator or your own board will ask, in those words: "},{"text":"who decided this?","i":true},{"text":" The answer has to be a name."}]}],"check":{"question":[{"text":"A refund agent has been live for eight months. A customer disputes a refusal from April. The team has full traces including every message sent to the model. What are they still most likely to be unable to answer?"}],"options":[{"text":[{"text":"What the customer originally asked for."}],"correct":false,"tempting":[{"text":"Present in the trace by definition, since the request is the first message in the run."}]},{"text":[{"text":"Which rules and which model version were in force that day, because the prompt version was never recorded and the code named a floating model alias."}],"correct":true,"tempting":null},{"text":[{"text":"Whether the refund was eventually paid."}],"correct":false,"tempting":[{"text":"Answerable from the payments system independently of the agent, and the easiest fact in the whole dispute to establish."}]},{"text":[{"text":"How long the run took."}],"correct":false,"tempting":[{"text":"Recorded in the trace, and in any case irrelevant to why the decision went the way it did."}]}],"order":[2,1,3,0],"why":null},"prev":{"slug":"irreversible-actions","title":"Money, messages and deletions","minutes":8},"next":{"slug":"the-classifier-router","title":"Pattern: one call, one label, then code","minutes":9}}}