Vibe Engines
YouTube

Vibe Engines is free, interactive AI engineering & system design — runs in your browser. Pick a learning path

System Design

Design an Audit Trail

Step 1 / 9

Learn system design by building an audit and compliance trail step by step.

The numbers to beatwho·what·when·whereper eventat the momentnot laterone schemaqueryable

The whole design, in writing

Every step of the build above, written out: the problem each piece solves, the option that was taken and the ones that were not, the numbers, and how it fails in production.

The big idea

What is an audit trail?

A customer’s security and compliance team needs to answer, at any time: who accessed or changed this, and when? — and to trust the answer completely, even against the people the log is meant to hold accountable. Ordinary application logs aren’t enough: they’re unstructured, incomplete, mutable, and not built to be trusted evidence.

Build a purpose-built trail: capture a structured who/what/when on every action, write it to an append-only immutable store, make it tamper-evident with hash chaining, enforce a retention window, and let auditors query it under access control. It turns "we think it was fine" into provable evidence.

Step 1 · The skeleton

Record what happens

The naive version: the Application writes a line to a log store when something happens. It works until an auditor asks a precise question — and you find the logs are patchy, mutable, and missing the who or the when.

ActorApplicationImmutable Store
New in this step: Actor, Application, Immutable Store. · swipe to pan the diagram

Stand up the Application writing events to a dedicated audit store, separate from ordinary debug logs. Everything that follows makes those events complete, trustworthy, and durable enough to be evidence.

Why this piece earns its place

The thing this skeleton quietly assumes is that the application remembers to emit. Coverage becomes a property of every code path rather than of the system, and a missing entry is the one defect a trail can never show you — an action nobody recorded looks exactly like an action that never happened. So I wouldn’t leave the emit scattered across call sites. Put it at a chokepoint every consequential action already crosses — the authorization check, the service boundary, the layer that has already resolved who the caller is — because that is also where identity is in hand, and a new endpoint inherits the recording instead of having to remember it. Then treat the set of auditable actions as a reviewed inventory with a test per entry, not a convention. The other half of the assumption is that this store stays separate. Keep it separate from day one: the moment audit events share a pipeline with debug output they inherit that pipeline’s sampling, its rotation and its retention, and every one of those silently destroys evidence.

What the new pieces do

Actorclient
Anyone who does something worth recording — a user viewing a record, an admin changing a setting, a service calling an API. Every consequential action needs a trace.
Applicationbackend
The system doing the real work. On every consequential action it emits an audit event — the moment the record is created, not reconstructed later from ordinary logs.
Immutable Storedata
Write-once, read-many storage that cannot be edited or deleted before its retention expires. The foundation: an audit log you can change is not an audit log.

Step 2 · Capture the facts

Structured who / what / when

"User did something" is useless to an auditor. You need the full fact — identity, action, target, timestamp, source — captured consistently on every consequential action, not reconstructed later from scattered logs that may not agree.

ApplicationAudit CaptureImmutable Store
New in this step: Audit Capture. · swipe to pan the diagram

An auditor asks "who changed this record, and when?" What must every audit event capture?

  1. Recording only the action leaves out the who, the when, and the target — exactly what an auditor needs. A trail that can’t answer "who and when" isn’t an audit trail. Completeness is the point.

  2. Debug logs are inconsistent, incomplete, and may be rotated away before the auditor asks. Audit events must be captured deliberately at the moment of the action, in a fixed structure, not reverse-engineered afterward.

  3. Capture each action as a consistent structured record — identity, action, target, timestamp, source, and before/after where relevant — at the moment it happens. That’s a fact an auditor can query and trust.

Add an Audit Capture step that records a structured event for every consequential action — who, what, when, where, and before/after where it matters — the moment it happens, in a consistent schema an auditor can query.

Why this piece earns its place

The knob this step introduces is scope: which actions count as consequential, and how much of each one you copy into the record. I’d set it from the questions an auditor actually asks — who changed permissions, who read this customer’s file, who exported data — and work backwards to the events that answer them. Too narrow and the gaps stay invisible until a review asks the one question you didn’t record. Too wide and two costs land together: every hot read path now carries a write, and the full before/after of sensitive rows gets copied into the one store you deliberately cannot edit and cannot delete early. Duplicating the sensitive database into the place with the strongest write-once guarantee is how a trail becomes the largest liability in the system. So record identifiers and the shape of the change — target, field, old and new where that is meaningful — rather than whole records, and decide it per action instead of by a blanket rule.

  • who·what·when·whereper event
  • at the momentnot later
  • one schemaqueryable

What the new pieces do

Audit Captureservice
Records a structured event for every action: who (identity), what (action + target), when (timestamp), where (IP/session), and the before/after where it matters.

Back of the envelope

structured event per action
identity, action, target, time, source
captured at the moment
never reconstructed from debug logs
consistent schema
so the trail is queryable

Step 3 · Can’t be changed

Append-only + immutable

If an audit entry can be edited or deleted, the trail is worthless — the very people it holds accountable could rewrite history, and an auditor can’t trust any of it. And writing audit synchronously on the hot path would slow the app.

Audit Capturewho · what · whenAppend Pipelinedurable, orderedImmutable Storeappend-only / WORM
New in this step: Append Pipeline.

The people an audit log holds accountable could edit it. How do you make the trail trustworthy?

  1. An audit store must be write-once, read-many: entries can be added but never modified or deleted before retention expires. If no one — not even an admin — can change history, the trail becomes trustworthy. Carry events over a durable pipeline so audit never blocks the app.

  2. Admins are exactly the people an audit log needs to hold accountable, so "admins can edit" defeats the purpose. The guarantee must be that no one can edit — enforced by the storage being append-only, not by permissions.

  3. Backups help against loss but not against tampering — a determined insider edits the live log and the backup, or edits before the backup runs. Immutability has to be a property of the store, not a recovery afterthought.

Write audit events to an append-only, immutable (WORM) store — entries can be added but never edited or deleted before retention expires. Carry them over a durable Append Pipeline so auditing never blocks or slows the application.

Why this piece earns its place

Taking the write off the hot path buys latency and costs a window. The action commits, the event is still in flight, and a crash in between loses it — and because the store is append-only you can’t quietly slot the missing entry in afterwards without weakening the exact property that makes the trail worth having. So make the handoff atomic at the source: write the event in the same transaction as the change it describes, into an outbox the pipeline drains, so either the event exists or the action didn’t happen. Then give every source a monotonic sequence number, because a gap you can see is an incident and a gap you can’t see is a false clean bill of health. The related call is backpressure. When the pipeline saturates something has to give, and for genuinely consequential actions I’d fail the action rather than drop the record — an operation nobody can account for is worse than an operation that didn’t run. That is the business’s call to make deliberately, not to discover during an incident.

  • append-onlyWORM
  • no editsno deletes
  • offthe hot path

What the new pieces do

Append Pipelinecache
A durable, ordered pipeline that carries events to the immutable store without blocking the app — so audit never slows the hot path, and no event is lost on a spike.

Back of the envelope

write-once, read-many
add entries, never modify
immutable even to admins
the point of an audit log
durable async pipeline
audit never blocks the app

Step 4 · Prove it wasn’t altered

Tamper-evidence

Append-only stops ordinary edits, but a privileged attacker who reaches the storage layer could still splice in, delete, or reorder records. You need to be able to prove the trail is intact, not just assert it.

Tamper-Evidencehash chain / signImmutable Storeappend-only / WORM
New in this step: Tamper-Evidence.

A privileged attacker reaches the storage and alters records. How do you make tampering detectable?

  1. Encryption protects confidentiality, not integrity — an attacker who can write can still splice or delete ciphertext records without being detected. You need tamper-evidence (detect changes), which encryption alone doesn’t give.

  2. Each entry includes a hash of the previous entry, forming a chain; any edit, deletion, or reorder changes a hash and breaks the chain, which is detectable. Periodically signing or publishing the chain head anchors it. Tampering becomes provable, not just prohibited.

  3. Dual storage helps only if an attacker can’t reach both, and comparing copies is expensive and racy. A hash chain gives tamper-evidence within a single store, cheaply and verifiably — the standard approach.

Make the trail tamper-evident: each entry includes a hash of the previous one, forming a chain, and you periodically sign or publish the chain head. Any edit, deletion, or reorder breaks a hash and is detectable — you can prove the log is intact.

Why this piece earns its place

A chain on its own only proves internal consistency, and an attacker who can rewrite entries can usually recompute every hash after the one they touched — the chain then validates perfectly against a head they also rewrote. All the weight sits on the anchor. The head has to leave this trust domain on a schedule: signed with a key the audit system can’t use by itself, published to a system with different operators, or countersigned by the customer. What anchoring buys is a boundary in time — everything before the last anchor is frozen, everything after it is still forgeable by whoever holds write access. So the interval is the real knob: anchor rarely and you hand an attacker a wide editable tail; anchor constantly and you pay signing cost plus a dependency on that external system staying up. The last piece is that none of it matters unless verification runs. Re-walk the chain on a schedule and on every export, and alarm on the walk failing to finish — a verifier that quietly stopped looks identical to a trail that keeps passing.

  • hash chainper entry
  • break = detecttamper-evident
  • signthe head

What the new pieces do

Tamper-Evidenceservice
Chains each entry to a hash of the previous one (and periodically signs the head). Any edit, deletion, or reordering breaks the chain and is detectable — proof, not trust.

Back of the envelope

each entry hashes the previous
a verifiable chain
any change breaks the chain
detectable tampering
periodically sign the head
anchors the history

Step 5 · Keep it the right length

Retention + archival

Regulations require keeping records for a set period (often years) — but keeping everything hot forever is expensive, and keeping some data too long is itself a compliance and privacy risk. The trail needs a defined lifecycle.

Append Pipelinedurable, orderedRetentionarchive + expireImmutable Storeappend-only / WORM
New in this step: Retention.

Add Retention: enforce the required window per record type, move older entries to cheap cold/archival storage, and delete once the window (and any legal hold) expires. The trail satisfies the regulation without growing without bound or over-retaining.

Why this piece earns its place

Retention promises in two directions at once, and the day they collide is the day an erasure request lands against an entry whose window still has years to run. The store is doing exactly what it was configured to do, and there is no lever to honour the request. Step 2 already kept whole records out of this store; what retention adds is that the identifiers left behind still resolve to a person, so the request reaches them anyway. So encrypt any personal payload under a per-subject key held outside the audit store, and erase by destroying the key — the entry stays, its place in the chain stays, and the content simply becomes unreadable. That relocates the hard part rather than removing it: the key store now has to outlive every window it serves, and a key lost early is an erasure nobody asked for. The second collision is with expiry itself. Dropping old entries removes links from a structure built to detect exactly that, so segment the chain per retention period and keep each segment’s signed digest after its entries go, or a routine lifecycle job is indistinguishable from tampering. And legal hold has to suspend expiry mid-window, which means the policy is data the system evaluates, not a value stamped onto each object at write time.

  • N yearsretention
  • hot → coldtiering
  • legal holdoverride

What the new pieces do

Retentionservice
Enforces the compliance retention window — keep for N years, then archive to cold storage or delete — so the trail satisfies the regulation without growing without bound.

Back of the envelope

retention window per type
satisfy the regulation
archive old to cold storage
cheap long-term keeping
delete past the window
over-retention is a risk too

Step 6 · Let auditors in — carefully

Query + access control

Auditors need to search the trail fast — by actor, target, or time — but the audit log itself contains sensitive data, and reading it is a privileged, sensitive action. Uncontrolled access to the audit log is its own breach.

AuditorRetentionQuery IndexAccess + Redact
New in this step: Auditor, Query Index, Access + Redact. · swipe to pan the diagram

Build a Query Index over the immutable store so auditors search quickly without touching the records, and put it behind Access + Redact: control who may read, redact sensitive fields on read, and — crucially — audit the audit access itself. Reading the trail is a recorded action too.

Why this piece earns its place

Look at what an auditor actually reads. The entries are immutable and chain-verified, but the index in front of them is a derived, mutable copy living outside that guarantee — and it is the surface every answer comes from. Drop documents from it, or alter one, and the auditor sees a false view of a store that is perfectly intact and still verifies. So the index is a cache and never the record: rebuild it from the store, resolve every result back to the entries it names and verify their chain segment before the answer is shown, and treat a disagreement between a count from the index and a count from the store as an incident rather than a reindex job. Redaction has the same shape — it happens on read, so the unredacted field is still there, and the control is only as strong as the path that can’t be bypassed. Then bound the recursion this step creates: reads are recorded, and those records are themselves readable, so keep a read event to who, which query and when, or one broad investigation buries the actions you were looking for.

  • indexfor search
  • redacton read
  • auditthe auditors

What the new pieces do

Auditorclient
A compliance officer, security reviewer, or investigator who needs to answer "who accessed this, and when?" — and to trust that the answer hasn’t been tampered with.
Query Indexdata
An index built over the immutable store so auditors can search by actor, target, or time range quickly — without being able to modify the underlying records.
Access + Redactservice
Controls who may read the trail and redacts sensitive fields on read — because the audit log itself contains sensitive data, and reading it is an audited action too.

Back of the envelope

index over immutable store
fast search, no mutation
access control + redaction
the log holds sensitive data
audit the audit access
reading the trail is recorded

You did it

You just designed an audit & compliance trail.

ActorAuditorApplicationAudit CaptureAppend PipelineRetentionTamper-EvidenceImmutable StoreQuery IndexAccess + Redact
The finished design, end to end. · swipe to pan the diagram

Everything you assembled, in order

  • A dedicated audit trail is evidence, not debug output — different guarantees.
  • Capture a structured who/what/when/where on every consequential action, at the moment.
  • Write append-only to immutable (WORM) storage — unrewritable even by admins.
  • Hash-chain entries so any tampering breaks the chain and is provably detectable.
  • Enforce retention: keep long enough for the rule, archive, and delete when allowed.
  • Index for auditors, gate and redact access, and audit the audit access itself.

Where an interviewer pokes next

Getting the boxes right is the easy half. These are the questions that separate a candidate who drew the diagram from one who has run the thing. Answer each one out loud before you open it.

  1. Why aren’t normal application logs enough for compliance?

    Debug/application logs are built to help engineers fix problems, not to be trusted evidence. They’re typically unstructured, incomplete (only what someone thought to log), mutable, rotated away after days, and not integrity-protected. A compliance audit trail has fundamentally different requirements: complete capture of every consequential action in a consistent structure, immutability so it can’t be rewritten, tamper-evidence so alteration is detectable, defined retention, and controlled access. You build it as a separate, purpose-designed system rather than trying to mine debug logs after the fact.

  2. Why must an audit log be append-only and immutable?

    Because its entire value is that it can be trusted against the people it holds accountable — and if any of them (including admins) can edit or delete entries, the trail proves nothing. Append-only, write-once storage guarantees history can be added to but never rewritten before retention expires, which is what makes it credible evidence. Permissions alone don’t suffice, since the privileged users are exactly the threat; immutability has to be a property of the storage itself. An audit log you can change is not an audit log.

  3. How does hash chaining make a log tamper-evident?

    Each entry includes a cryptographic hash of the previous entry, so the records form a chain where every link depends on all the history before it. If someone edits, deletes, or reorders any entry, its hash changes, which breaks the link to the next entry, and the chain no longer validates — the tampering is detectable even if the attacker had write access. Periodically signing or publishing the current chain head (to a separate system) anchors the history so an attacker can’t rebuild a consistent fake chain. This turns "trust us, it wasn’t altered" into a property anyone can verify.

  4. Why does retention cut both ways?

    Compliance requires keeping audit records for a minimum period — often several years — so you can answer questions long after the fact, which argues for keeping data. But keeping personal or sensitive data longer than necessary is itself a compliance and privacy risk (GDPR data-minimization, breach exposure), which argues for deleting it. So retention is a two-sided control: keep at least as long as the regulation demands (with legal-hold overrides that pause deletion during an investigation), and delete once that window passes. Tiered storage — hot for recent, cold archival for older, then deletion — implements the lifecycle economically.

  5. Why must you control and audit access to the audit log?

    Because the audit trail concentrates sensitive information — who did what, when, to whose data — so unrestricted access to it is its own privacy breach, and a malicious insider could use it for reconnaissance. So reading the trail must be tightly access-controlled, sensitive fields redacted on read, and — importantly — every read of the audit log is itself an audited action. That last point closes the loop: the people who watch the system are themselves watched, so no one can quietly browse the accountability record. It’s a common gap that a good security review will probe.

Check yourself — the answers, and why

Seven steps in, these are the calls you should be able to make cold. Pick one, then read why.

  1. Ordinary application logs are insufficient for compliance because they’re…

    An audit trail needs completeness, immutability, tamper-evidence, retention, and controlled access.

  2. An audit log must be append-only and immutable so that…

    Its value is being trusted against the people it holds accountable; permissions alone don’t suffice.

  3. Hash-chaining entries makes tampering…

    Each entry hashes the previous; a change breaks the link so the chain no longer validates.

  4. Retention policy cuts both ways because…

    Keep at least the required window (with legal holds), then delete — data-minimization matters too.

  5. Access to the audit log must itself be…

    The log holds sensitive data; the watchers get watched, so no one browses it quietly.

How you’d open this design in an interview

Before any boxes: agree what it must do, pin the qualities that shape everything, then build — naming each trade-off as you make it. The walkthrough above is that exact order.

What it must do

Agree on these before drawing a single box.

  • Capture: a structured who / what / when / where for every consequential action, at the moment it happens.
  • Append-only: write entries to immutable (WORM) storage — added, never edited or deleted.
  • Prove integrity: hash-chain entries so any edit, deletion or reorder is detectable.
  • Retain: keep for the compliance window, archive to cold storage, then delete when allowed.
  • Query: auditors search by actor, target or time under access control, sensitive fields redacted.

The qualities that shape everything

Each one names the mechanism that buys it.

Trustworthy, complete facts
A structured event — identity, action, target, timestamp, source — captured at the moment of the action in one consistent schema, never reconstructed from debug logs.
History unrewritable even by admins
Append-only, write-once (WORM) storage: entries can be added but never modified or deleted before retention expires.
Auditing never blocks the app
A durable, ordered append pipeline carries events to the immutable store off the hot path, so no event is lost on a spike.
Prove the trail wasn’t altered
Hash-chain each entry to the previous one and periodically sign the head, so any change breaks the chain and is detectable — proof, not assertion.
Satisfy retention without over-retaining
A per-type retention window with cold archival and deletion past the window (and legal-hold overrides) — over-retaining sensitive data is its own risk.
Reading the trail is itself controlled
A query index behind access control and field redaction, and every read of the trail is an audited action too — the watchers get watched.

The trade-offs you say out loud

Senior signal isn’t the boxes — it’s naming what you gave up and why it was the right price.

A structured event per action over reconstructing from debug logs

Debug logs are inconsistent, incomplete and rotated away before the auditor asks, and recording only the action drops the who, when and target. A consistent schema captured at the moment is a fact an auditor can query and trust.

Append-only, immutable storage over admin-only edit permissions

Admins are exactly the people an audit log must hold accountable, so “admins can edit” defeats the purpose. Immutability has to be a property of the store, not a permission — an audit log you can change is not an audit log.

Hash-chaining with a signed head over encrypting the log

Encryption protects confidentiality, not integrity — an attacker who can write can still splice or delete records undetected. Chaining each entry to a hash of the previous makes any change break the chain, turning tampering from prohibited into provable.

Deleting past the retention window over keeping everything forever

Over-retaining personal data is itself a compliance and privacy risk (data-minimization), while under-retaining fails the rule. Retention cuts both ways: keep at least the required window with legal-hold overrides, then delete.

Auditing the audit access over unrestricted auditor access

The trail concentrates sensitive who-did-what data, so uncontrolled reads are their own breach. Gate and redact reads, and record every read — reading accountability data is a privileged action too.

The answer, out loud

What a strong answer to “Design an Audit Logging & Compliance Trail” sounds like, first question to last trade-off. It is about 7 minutes of talking; the whiteboard and the interviewer fill the rest of the 45. Read it aloud once, then close the page and give it yourself.

  1. 0–4 min

    What makes this different from logging

    Before I draw anything I want to say what this system is for, because it decides every choice after it. We already have logs. What we don’t have is evidence — something a customer’s security reviewer, or a regulator, can use to answer who accessed or changed a thing, and then believe the answer even though we run the system. That second half is the hard part. The trail has to hold up against the people who operate it, including our own admins. Everything I add is there to make a specific doubt unreasonable.

  2. 4–9 min

    Start with a dedicated trail

    So the first thing I’d do is separate it. The application emits audit events into its own store, not into the same place as debug output. People often want to skip this and mine the existing logs instead, and it fails for boring reasons rather than clever ones: those logs only contain what somebody happened to print, they get rotated away on their own schedule, and they can be edited. So this is a separate system with its own guarantees, and the rest of the session is me adding each guarantee in turn.

    Built in step 1: Record what happens
  3. 9–16 min

    What an event has to contain

    Next, what goes in one entry. I want a fixed structure on every consequential action: who — the resolved identity, not just a session token — what, meaning the action and the specific target, when, and where the request came from, plus the before and after when something changed. The reason I insist on one schema across all actions is that an auditor should be able to query the trail, not read it like prose. And I want this written at the moment the action happens. If it can be reconstructed afterwards, someone will reconstruct it differently later, and now there are two versions of the truth and no way to tell which one the system meant.

    Built in step 2: Structured who / what / when
  4. 16–23 min

    Make it unrewritable, off the hot path

    Now the part I’d push hardest on. This store has to be append-only and write-once. The usual counter-proposal is to restrict edits to admins, and that concedes the whole argument, because admins are exactly who the trail is supposed to hold accountable. If anyone can edit it, an auditor has no reason to trust any entry, including the ones nobody touched. So immutability is a property of the storage, not a permission somebody can be granted. The practical worry is that audit now sits in the request path, so I’d carry events over a durable, ordered pipeline into the store. The app doesn’t wait on it and a spike doesn’t lose events.

    Built in step 3: Append-only + immutable
  5. 23–30 min

    Being able to prove it, not assert it

    Append-only stops the ordinary case, but someone with access to the storage layer underneath could still splice a record in or take one out. At this point I can only assert the trail is intact, and I’d rather be able to prove it. So each entry carries a hash of the one before it. Any edit, deletion or reorder changes a hash and the chain stops validating, so tampering becomes something you detect rather than something you forbid and hope. People sometimes suggest encrypting the log instead. That protects confidentiality, which is a different problem — an attacker who can write can still remove a ciphertext record and nobody is any wiser. And I’d sign the head of the chain periodically so the history is anchored to something outside this system.

    Built in step 4: Tamper-evidence
  6. 30–36 min

    Keeping it exactly as long as we should

    Retention I’d frame as a control that cuts both ways, because people usually only see one side of it. We have to keep records long enough to answer questions later, so there’s a required window per record type. But holding personal data longer than we need is itself a risk and, under data-protection rules, its own violation — keeping everything forever isn’t the safe default it sounds like. So the lifecycle is explicit: hot while it’s queried often, archived to cold storage as it ages, deleted once the window passes, with legal hold able to pause that deletion while an investigation is open.

    Built in step 5: Retention + archival
  7. 36–42 min

    Letting auditors in without opening a hole

    Last piece is reading it. Auditors need to search by actor, by target, by time range, and that wants an index over the store rather than scanning it. But I’d flag that this trail is now one of the most sensitive datasets we own — it’s a record of who touched whose data — so unrestricted access to it is a breach with extra steps. So reads are access-controlled, sensitive fields are redacted on the way out, and every read is itself an audited action. That last one closes the loop: the people watching the system are watched too, and nobody browses the accountability record quietly.

    Built in step 6: Query + access control
  8. 42–45 min

    The trade-off, and what I’d do next

    To close: the trade I’ve made throughout is trustworthiness over convenience. An immutable, chained, retained store is harder to operate than a log table — you can’t fix a bad entry, anything you might ever have to erase has to be kept out of it from the start, and you pay to keep and to verify. I think that’s the right side to be on, because a trail that’s easy to change is worth nothing at the moment it matters. With more time I’d work through two things: how we evidence that an erasure actually happened, given the way to honour one here is to destroy the key that made a record readable, and the record that would show it is the one we just made unreadable — and how an auditor verifies the chain themselves rather than taking our verification on trust.

What this teaches

Learn system design by building an audit and compliance trail step by step. An interactive guide covering structured capture of who-did-what-when, an append-only immutable store, tamper-evidence with hash chaining, retention and archival for compliance windows, and access-controlled querying that redacts sensitive data — the audit system a forward deployed engineer needs to pass a customer’s security review.

Key takeaways

  • A dedicated audit trail is evidence, not debug output — different guarantees.
  • Capture a structured who/what/when/where on every consequential action, at the moment.
  • Write append-only to immutable (WORM) storage — unrewritable even by admins.
  • Hash-chain entries so any tampering breaks the chain and is provably detectable.
  • Enforce retention: keep long enough for the rule, archive, and delete when allowed.
  • Index for auditors, gate and redact access, and audit the audit access itself.

Concepts covered

  • What is an audit trail?
  • Record what happens
  • Structured who / what / when
  • Append-only + immutable
  • Tamper-evidence
  • Retention + archival
  • Query + access control
built to prove who did what, not memorized — capture, append-only, tamper-evident, retain, redact.
Finished this one? 0 / 65 System Designs done
NextDesign Enterprise SSO & Provisioning Next in “Become a Forward Deployed Engineer” · step 44 of 63

Explore the topic

See this alongside everything else on the same subject — handbooks, system designs, challenges and tools, in one place.

More System Designs