The retention question nobody asks
Agent transcripts don’t delete themselves — nobody has to decide to keep them, only to delete them, and until someone writes that job they accumulate by default — and a UI that promises a user their chat history is quietly making a retention commitment on someone else’s behalf.
Somebody asks how long agent transcripts are kept. The answer comes back as “we keep them”, said in the tone of a feature. And it is a feature: users like their history, support needs it to reproduce a complaint, the eval team wants a corpus. Everyone in the room hears an answer, and the meeting moves on.
“We keep them” is not an answer. It is missing a number, and this lesson is about why the number is almost never there, why that is an ordinary engineering outcome rather than negligence, and why the law reads it as a gap anyway.
The correct causal direction
The tempting sentence is that transcripts are kept forever by default. It is close to true in practice and it is not a claim any source supports, so here is the version that is defensible.
Nothing has to decide to keep data. Something has to decide to delete it. A transcripts table accumulates because writing rows is the feature and deleting them is a separate piece of work that no user story asked for. Until somebody writes that job, the store grows, and that is not a default anyone chose — it is the absence of a decision, which looks identical from the outside and is a very different sentence in a meeting.
The law then arrives from the other direction. Article 5(1)(e) requires that personal data be:
“kept in a form which permits identification of data subjects for no longer than is necessary for the purposes for which the personal data are processed” (GDPR, Article 5(1)(e))
Read what that does and does not say. It does not describe what databases do when unattended; regulations do not make claims about engineering defaults. It imposes an affirmative, ongoing obligation to have decided on a period, tied to a purpose, and to keep data no longer than that. Unbounded retention is not the state the law describes as normal. It is the state the law describes as non-compliant.
Two systems that get conflated, constantly
The fastest way to lose this argument is to mix up the model vendor’s logs with the product’s own database. They are different systems, with different defaults, different owners and different retention periods, and the conflation runs in both directions.
- The model vendor’s API-layer logs. Bounded, documented, and measured in days. OpenAI, documenting its own platform, states a default retention window of 30 days for chat completions for abuse-monitoring purposes (OpenAI data controls — a vendor documenting its own product, cited here only to draw the contrast). Whatever the number is for the provider your team uses, it is a published number belonging to a system your company does not run.
- Your product’s transcript store. Not bounded by anything unless someone bounded it, because it is a table your team wrote. There is no vendor page to check. There is a schema and a cron job that either exists or does not.
Cite the first as evidence about the second and you are wrong in a way that will be corrected immediately. The model vendor’s 30 days says nothing about your chat history sidebar, and a team that answers “30 days, it is in the provider’s docs” has answered about the wrong database. That substitution is the specific thing to listen for.
There are more than two stores, which is the part that makes this awkward rather than merely unanswered. The trace backend from the trace-view lesson has its own retention. So does the session-replay vendor. So does the error reporter, and the analytics warehouse, and whatever the eval team copied into a bucket in March. Each has its own period and its own owner, and an erasure request has to reach every one of them.
Policy text is not a retention control
OWASP’s 2026 entry on sensitive information disclosure states the engineering version of the same point in its first tier of mitigations: technically enforce no-train and no-retain commitments rather than policy text alone. A retention policy in a document, with no mechanism that carries it out, is a statement of intent. The store keeps growing exactly as fast as it did before the document was written.
That gives your flag its second question. Not just “what is the period?” but “what enforces it?” A named job, on a schedule, with a way to tell whether it ran, is a control. A paragraph in a policy is a paragraph.
Where people get burned
This course looked for a retention default stated in NIST’s AI Risk Management Framework material and did not find one: a direct check of NIST’s own AI RMF page returned nothing about retention. Treat that as weak evidence rather than a settled absence, because the Generative AI Profile document itself was not read end to end. Several compliance-automation sites do attribute retention claims to that profile. They sell the remediation, they are the same genre of source this course declines to cite about SOC 2, and none of them was used here. If you need a NIST citation for retention, somebody has to open the primary document first.
The commitment a UI makes on someone else’s behalf
Here is where this stops being a backend concern. A chat history sidebar is a promise. “Your conversations”, listed by date, scrolling back to the beginning, is a product statement that these persist and will be there tomorrow. Users read it that way, correctly, because that is what it says.
Nobody wrote that promise down as a retention decision. It was a layout choice, made in a design review, by someone thinking about whether the sidebar should be collapsible. But it now constrains what a deletion period can be, because shortening retention becomes a visible product regression rather than an internal cleanup. The person who will have to answer an erasure request, and the person who will have to defend a retention period to an auditor, both inherit a constraint set by a component.
A few more of these, all of them layout decisions with retention consequences:
- Infinite scroll on history. Implies no horizon. Pagination with a visible end implies one.
- Search across all past conversations. Implies an index, which is a second store with its own retention and its own deletion path.
- “Restore” or an undo on a deleted thread. Means deletion is a flag, not a deletion. Anything downstream reading the raw table still sees the row.
- Exporting a transcript. Creates a copy in a place with no retention policy at all, usually somebody’s downloads folder or a shared drive.
None of these is wrong, and the point is not to remove them. The point is that each one is a retention commitment made in a design review by someone who did not know they were making one, and you are now the person in that review who does.
Check your recall
Answer from memory — no scrolling back.
Retrieval check
Why does the retention question have to be asked per store rather than once?
Check your answer
Because each store has a different owner and a different default, and an answer about one gets heard as an answer about all of them. The transcript table belongs to the product team. The trace backend belongs to whoever bought it, and its retention is a plan setting. The session-replay recordings belong to whoever owns that account. The eval corpus belongs to whoever pulled it, and quite often nobody has thought of it as a store at all.
The practical test is an erasure request. If a user asks for their data to be deleted, list every place a row has to come out of, and name who executes each deletion. The length of that list is the answer to how many retention questions there actually are, and it is usually longer than the number of people who think they own one.
Hands on
Put a number, or a blank, against every store
Done when: A table of every store holding agent transcript data for one surface — product database, trace backend, replay vendor, error reporter, analytics, any eval copy — with four columns: the retention period, whether it is enforced by a mechanism or stated in policy text, the role that owns it, and how you established each. Any cell you could not establish reads “not established”. Plus the one sentence you would say in the meeting.
- List the stores. Start from the surface and follow the data: what the app writes, what the SDKs send, what anyone has ever copied out for analysis. The last category is the one that gets forgotten and it is usually the least governed.
- For each store, find the period. For vendor products it is in the product settings or the plan; for your own database it is a job that either exists in the repository or does not. Write down how you found each one.
- For each, mark enforced or stated. Enforced means you found the mechanism. Stated means you found a sentence in a document. The distinction is the flag.
- Name one role per store. If you write two roles for a store, you have not found the owner — and that is a finding in itself, which the module on raising it properly picks up directly.
- Check the UI side. Write down every element on your surface that implies durability: history list, search, restore, export. Each one is a constraint on how short the period can go without a visible product change.
- Write the literal sentence you would say. Something with a number shaped hole in it, addressed to a named role. Put it in the
FLAG-LOG.mdrow and bring the table in. I will push on any period you were told rather than saw, and on any store you did not think of until step five.
What this does not cover
This module has produced a stack of observations and no owners. Every flag in your log now has a “what I saw” and a “why it matters here”, and empty columns after that, which is the state the log was designed to reach at this point rather than a gap in it.
The module on raising it properly fills the rest in, and it opens on the thing that makes a telemetry choice a governance question rather than a preference: the SOC 2 lesson, and the mechanism by which a vendor a front-end team installed ends up inside somebody else’s audit scope. After that comes naming the single role that can close each flag, raising it with a severity that does not block a release, and writing the pass condition that lets you stop carrying it.
Read this next — primary source
Regulation (EU) 2016/679 (GDPR), Article 5(1)(e) — storage limitationEUR-Lex, Official Journal L 119, 4 May 2016 — free, the regulation itself, fetched 2026-09-05.
This lesson takes one sub-paragraph, and the reason to read Article 5 whole is that the other five principles are the same shape: each one requires a decision to have been made and to be demonstrable, and none of them describes what a system does on its own. Reading them together is what fixes the causal direction in your head, which is the entire correction this lesson is built on. It takes about four minutes.
Stuck, curious, or think this lesson is wrong? Ask your teaching agent. The lessons are the scaffold; the conversation is where the learning gets unstuck.