A records request came back with assistant transcripts nobody could redact
In short
A conversation log becomes part of the education record when it persists and can be resolved to an identifiable student — including through a join you control, such as a session id that maps to a login event. Inventory every store by that test rather than by which team owns it, then decide per store: redact at write, tokenise, or do not log it at all.
Key takeaways
- Resolvability is the test: if any join you control reaches a named student, the row is inside the boundary.
- Session ids are not anonymisation. One login event in a second log undoes the whole assumption.
- Error trackers and session replay tools are the two stores teams forget, and both capture verbatim text by default.
- Redaction at write loses information permanently. That is the point, and it is why the decision belongs to design.
- A thread naming two students cannot be exported whole, so segment per utterance before anyone asks you to.
- Producing a transcript export in under a day is an engineering requirement, not a legal one.
Assistant transcripts became part of the education record the moment they were stored and could be traced back to a named student. Nothing had to be decided for that to happen, which is exactly why nobody noticed: logging is infrastructure work, and infrastructure work is not where anyone expects a records classification to change. The request that surfaces it — a parent asking to inspect, a student asking for deletion, a district asking what you hold — simply reads the boundary as it actually is.
The observable is always the same. Someone asks for everything you hold about one student, and the team can produce the obvious tables in an hour and then spends a week arguing about conversation logs, error payloads and an analytics warehouse nobody has looked at since it was built. That week is the finding. Where the boundary sits legally is the institution's counsel's call under FERPA and, for younger learners or European operations, the applicable child-data rules. What is yours is knowing which stores are in play — and the definition work behind that sits in where the education record starts and stops, in the schema.
Inventory the logs by resolvability, not by system
The useful question is not whether a store is a student data store. It is whether a row in it can be resolved to a named student using joins you control. Two hops still count: a transcript keyed only by session id is resolvable if a login event 200 milliseconds earlier in another log carries the same session id and a user id. Teams call that pseudonymous. A records request does not.
- List every destination a request can write to: application logs, the conversation store, the error tracker, analytics, the data warehouse, search and vector indexes, message queues, object storage, session replay, and anything the model provider retains.
- For each one, take a real row and try to reach a named student from it using only systems your team can query. Write down the join path and how many hops it took.
- Grep a week of each store for the identifier formats that actually appear in your product — student number patterns, email domains, the local phone format — because free text is where the surprises live rather than in structured columns.
- Record who owns each store, its current retention setting, and whether a deletion request today would reach it.
- Mark every store where the answer to the resolvability test is yes but the retention setting was chosen by whoever set the tool up. That intersection is the actual exposure.
| Store | What lands there | Resolvable to a student? | Usual default action |
|---|---|---|---|
| Conversation store in your own database | Full transcript, retrieved passages, tool calls | Yes, by construction | Classify as inside; retain deliberately, not by omission |
| Application logs shipped to Datadog or CloudWatch | Request lines, sometimes the whole prompt at debug level | Yes, once session joins to auth | Redact at write; never log message bodies at info level |
| Error tracker such as Sentry | Exception context, request body, breadcrumbs of recent input | Yes, frequently verbatim | Disable body capture and scrub before send, not after |
| Analytics events through Segment, Mixpanel or GA4 | Event payloads that quietly include question text | Yes, via the user id already on the event | Keep counters and categories, drop free text |
| Session replay tooling | Rendered screen content including the conversation | Yes, visually, and it defeats field-level redaction | Exclude from student-facing surfaces |
| Vector or search index built over transcripts | Chunks of the conversation, embedded and stored | Yes — derived stores inherit the class of the source | Same access rules and same deletion path as the source |
| Model provider retention | Prompts and completions on the vendor's side | Yes where identifiers are inside the text | Contractual, and narrower than the marketing suggests |
That last row deserves its own reading, because a no-retention term does less than teams assume and covers fewer paths than they check — what a no-retention term actually covers walks through the three places data still lands.
How identifiers actually get into a log
Ranked by how often they turn out to be the culprit, rather than by how alarming they sound.
- Authenticated sessions logged verbatim. The transcript is written with the user id attached because that is what makes the conversation resumable. Entirely reasonable, and it is the single largest store in scope.
- Identifiers typed into free text. A student writes their own name, roll number and date of birth into a question about fees; a staff member pastes a whole email thread. No schema anticipates this, and no column-level rule catches it.
- Third-party observability. Error trackers capture request bodies by default, and one unhandled exception in the message handler copies a conversation into a system with its own retention, its own access list and its own subprocessors.
- Prompt and response caches. A cache keyed by prompt hash still stores the prompt, and caches are usually built for latency by someone who was not in the privacy conversation.
- Analytics payloads. Someone adds question text to an event so the product team can see what people ask, and the education record quietly acquires a copy in a warehouse with a different access model — which is also how staff end up able to see students outside their caseload through a reporting view.
Redact at write, tokenise, or do not log it
Every store in the inventory resolves to one of three answers. Choosing per store is the work; choosing one answer for everything is what produced the problem.
| Treatment | Use it when | What it costs | Failure mode |
|---|---|---|---|
| Redact at write | Operational logs, error payloads, analytics — anywhere the text is a debugging convenience | Debuggability. You will not be able to reconstruct the exact input to a bug report | Detection is lossy on free text; something always gets through |
| Tokenise | The conversation store itself, where the student must be identifiable to the product | A key store to protect, and a real deletion path through it | Deleting the mapping without deleting the rows leaves orphaned content that is still readable |
| Do not log | Session replay, verbose prompt logging, anything whose value is convenience | Nothing that matters, usually | It gets re-enabled during an incident and never turned off again |
Producing the export when the request lands
Two structural problems make transcript exports harder than table exports, and both are cheaper to solve before a request arrives than during one.
- Segment at the utterance, not the thread. A conversation between a staff member and an assistant can name several students, and an institution releasing records to one family usually releases only the part relating to that student. A thread stored as a single blob cannot be split under time pressure.
- Attach the subject of each utterance where it is known — which student the message is about, not just who typed it. Author and subject are different fields and only one of them is on the session.
- Keep retrieved passages alongside the answer. If the assistant quoted a record back to someone, the export needs to show what was disclosed, and that is not reconstructable later from a prompt template.
- Rehearse it. Pick a test student, run the full export across every store in the inventory, and time it. A rehearsal that takes 6 hours is a system that works; one that takes 3 days is a system that will fail its first real request.
- Write down the stores deliberately excluded from the export and why, and have that list reviewed by whoever answers the institution's questionnaires. Silence about an excluded store is what turns a routine request into an incident.
A log is not outside the education record because it was written by a framework. It is inside the moment somebody can start from a row and end up at a child.
What to change in the build
- Make the log destination list a reviewed artefact. New destinations are added constantly, and a list that is not owned goes stale within a quarter.
- Enforce the classification in continuous integration: a new field on an event schema that carries free text should fail the build unless it is declared and treated.
- Set retention per store deliberately rather than accepting a vendor default of 30 or 90 days, and hold the deletion path to the same standard as the primary database — the failure pattern when you do not is deleted student records reappearing after the next sync.
- Push logging configuration into the deployment rather than the code, so an institution can lower it. Where the product is installed centrally through Jamf or Intune, that belongs in the managed configuration — the same surface as shipping an app a school can deploy silently.
- Keep retention scheduling itself where it belongs, as a per-record-type policy with a named clock owner rather than a global number: retention clocks per record type covers that decision.
None of this is expensive if it is decided at design time and most of it is painful afterwards, which is the honest argument for treating logging classification as part of the first build rather than a hardening pass — the way we scope MVP and product builds for institutional buyers. The rest of this silo sits under student data privacy, engineered, within our education and edtech work.
Frequently asked questions
Short answers to the follow-ups this page tends to raise.
Are AI chatbot transcripts student records?
Treat them as inside the education record wherever they persist and an identifiable student can be reached from them. Medium is irrelevant to the definition, so a stored conversation counts in the same way a stored email or advising note does. Whether a specific log falls inside is the institution's determination, but designing on the assumption that it does is the only position that survives a request.
How long should we keep education chatbot conversation logs?
For as long as a named purpose requires, decided per store and written down, rather than for whatever the tool defaulted to. Operational logs supporting debugging rarely need more than a couple of weeks; a transcript that is part of an advising history may need to follow the same clock as advising notes. The failure is not a long period — it is a period nobody chose.
Can we anonymise transcripts instead of deleting them?
Only if the result genuinely cannot be re-identified, which is a higher bar than removing names. Session ids that join to a login event are not anonymous, and free text often identifies a student through context alone — a class, a teacher's name, a circumstance. In a small cohort, deletion is usually more defensible and simpler to prove than an anonymisation claim you would have to defend.
What should an education assistant log at all?
Log what you need to run and improve the service, in the least identifying form that still works: conversation id, timestamps, latency, retrieval sources, escalation outcome, and category labels instead of raw text. Where the transcript itself is needed for advising continuity, store it once in a classified store with real access control, and keep it out of every other destination.
- student privacy
- logging
- records requests
- assistant design
The work behind this page
Builds from our portfolio that this page draws on.
AskVault
An AI internal knowledge-search platform that answers employee questions from your own docs — grounded in citations, with knowledge gaps surfaced and deflection tracked.
Productivity AINotewell
An AI meeting assistant that records and transcribes every meeting, extracts the decisions and action items, assigns owners and due dates, and tracks follow-through until it's done.
Productivity AIRead next
- Where the education record starts and stops, in the schemaThe education record is not a system boundary you can draw around one database. It is a property of fields, which is why transcripts, prompt logs, error payloads and backups keep landing inside it.definition
- You deleted the student, and the next roster sync put them backRunning the delete job a second time is the reflex and it is almost always wrong. Probe each store immediately after deletion and again after the next sync — the two results separate re-creation from incomplete deletion.diagnostic
- A student data privacy agreement, read as an engineering specificationSchools bind vendors with a standard agreement plus an exhibit naming every data element collected. Five of its clauses are build work, and the exhibit is a schema diff in disguise.definition
- After the term rollover, staff can see students who are not theirsThe role model is probably fine. What is missing is the moment where an ended assignment removes an access that was granted when it began — and rollover is when a year of those omissions becomes visible at once.diagnostic
- Directory information is a per-student flag your code has to honourSchools designate their own directory information list, and any family can opt out mid-year. That makes it a dated per-student flag every outbound surface reads at render time.definition
- The school official exception, and what it obliges a vendor to buildA vendor holding student records stands inside the school's own permission, not outside FERPA. Each condition of that permission converts into something you build and evidence.definition
Working on something in this space?
Tell us where you are in a sentence or two. We'll tell you honestly whether we're the right team, and what a sensible first slice of the work looks like.
Start the conversation