PaddySpeaks A Visual Field Guide All articles →

Privacy engineering · September 2026

Every arrow
is a decision.

A visual field guide to privacy engineering: why “delete” is rarely deletion, how two harmless tables name a stranger, and how a promise becomes a mechanism.

Scroll ↓  Every figure below is interactive.  ·  The interactive companion to the PaddySpeaks field guide, Privacy Engineering (2026 edition).

01 Cold open

What could an organization know about one person?

Not their name. Nobody needs their name. Watch what happens when five ordinary identifiers — each collected for a perfectly reasonable reason — are allowed to meet.

None of these is secret on its own. The email arrived at sign-up. The device ID came with the app. The payment token is how checkout works. The location ping powers “stores near you”. The cookie keeps you logged in. The harm is not in any one of them. It is in the join.

“Likely pregnant” is not far-fetched. In 2012, public reporting described a retailer’s purchase model that predicted pregnancy — reportedly before a customer’s family knew. The broken assumption: “we only use what customers gave us.” Inference counts as collection.

Five identifiers. Zero names. One person.

Illustrative · no real person or data

TakeawayPersonal data is not a column. It is what the columns become when they are joined.

The discipline, in one line

Privacy engineering turns promises into mechanisms.

A privacy policy is a promise written in English. A database is not written in English. Somewhere between the two there has to be a chain of things that actually happen — and every link in that chain is somebody’s job.

  1. 01Promise“We delete your data when you close your account.”
  2. 02ArchitectureWhich systems hold it, and how they connect.
  3. 03DataThe actual fields, copies and identifiers.
  4. 04ControlThe job, gate or check that enforces it.
  5. 05EvidenceLogs and tests that show the control ran.
  6. 06Runtime behaviorWhat production does at 3 a.m. on a Sunday.
Hat 01 · before launch

Reviewer

Reads designs before launch and finds the exposure nobody drew on the whiteboard.

Output: findings, required changes, a risk rating
Hat 02 · in the platform

Builder

Ships the controls: consent propagation, retention, deletion, purpose enforcement, identity isolation, access control, privacy-enhancing technologies, deployment gates.

Output: libraries, platforms, deploy gates
Hat 03 · in production

Auditor

Checks what really runs: logs, joins, retention and runtime enforcement — not what the design said, not what the policy says.

Output: invariants, dashboards, incident fixes

Lawyers write what must be true. Product decides what users should feel. The privacy engineer makes the system actually behave that way. The job is not saying no. It is finding the design where the product works and the exposure shrinks.

02 The history hole

“Delete” is a word, not a mechanism.

Here is a week in a shared document. On Monday someone pastes a salary sheet into it: forty names, forty numbers. On Tuesday they delete the table. The doc looks safe. On Friday a contractor is added as an Editor. At 4 p.m. the contractor opens File › Version history › Monday. Every name, every number.

Google Docs, like most modern editors, keeps a version history — being able to rewind is the feature. Per Google’s own help pages, owners and editors can open that history; commenters and viewers cannot. Scrub the week, then change who is looking.

Q3 planning — shared doc
Friday’s contractor has the role

Illustrative scenario and people. The roles and the missing per-version delete are as described in Google Docs Editors Help, as summarised in the PaddySpeaks field guide.

Who can open the past

✓ Owner✓ Editor✗ Commenter✗ Viewer

The cruel part: an editor added today sees every version from before they joined — and a link set to “anyone can edit” hands the history to strangers.

!

You can’t delete one old version

Native Docs keep their history; there is no per-version delete.

1

Make a copy

File › Make a copy. History doesn’t travel — leave comments unticked.

2

Share the copy, not the original

Viewers and commenters never see history at all.

3

Retire the original

Trash holds it 30 days; your organization’s retention rules may hold it longer.

Permission to edit the present is permission to read the past.

Docs are the loudest example. Not the only one.

Every tool that remembers edits is a leak waiting for the wrong reader. Eight places “deleted” data keeps living:

01 · Version history

Docs, Sheets, Slides, wikis

Docs, Sheets, Slides, Notion, Confluence: every editor can rewind.

02 · Hidden metadata

Word files

A 2003 UK government dossier’s Word file named the officials who had edited it.

03 · Fake redaction

PDF black boxes

A 2019 court filing for Paul Manafort used black boxes over text you could still copy.

04 · Code history

Git

A password committed and then deleted lives on in every clone and fork. Rotate it.

05 · Sent messages

Email & chat

Edits, recalls and unsends rarely reach copies already in inboxes, exports and backups.

06 · Trash & backups

Drives & servers

Recycle bins, snapshots and legal holds keep “deleted” files for weeks or years.

07 · Indexes & caches

Search & previews

Search indexes, previews and thumbnails keep their own copy of what you removed.

08 · AI memory

Assistants & models

An assistant’s memory, logs or training set may hold what the source no longer does.

Six design rules for engineers who build history — and a one-minute check for everyone else
  1. Separate the permissions. Seeing today’s document shouldn’t automatically mean seeing every past version.
  2. Purge across time. A redaction must reach old versions, backups and indexes — with an audit trail.
  3. Share snapshots, not live files. Send a flattened copy to outsiders; keep the working draft inside.
  4. Give history a retention clock. Old versions are data too: expire them like logs.
  5. Scan the past on share. Before a new person gets access, check old versions for secrets and personal data.
  6. Treat exposure as permanent. A leaked key or password is burned. Rotate it — deleting isn’t enough.

Before you hit share

  • Does this person need Editor, or just Viewer?
  • Is the link set to “anyone”?
  • Was anything sensitive ever in this file?
  • Are resolved comments hiding secrets?
  • Would a clean copy be safer?

TakeawayDelete removes it from your view. History keeps it for everyone else. If it was ever in the document, assume it’s still in the document.

03 Promise → mechanism

Move privacy out of documents and into machines.

Take one promise almost every company makes: “We don’t log personal data.” Now ask what, exactly, stops an engineer from typing logger.info(user) at 6 p.m. on a Friday.

The answer sits somewhere on a ladder. The bottom rungs depend on people remembering. The top rungs depend on machines refusing. Climb it.

Every rung up is harder to build and harder to bypass. Rule of thumb: every hard gate should trace back to a real postmortem. And mind the gap between rungs 3 and 4 — pre-deploy is not runtime. A check that passed at merge says nothing about the batch job that runs tonight.

TakeawayA promise nobody can violate by accident is worth more than a promise everybody has read.

04 The review

Eight questions. Every feature.

Privacy reviews go wrong in two ways: they become a forty-page questionnaire nobody reads, or a vibe. The fix is a short, fixed set of questions that works on any feature — even one you have never seen — asked in the same order every time, each with the red flag to listen for.

Here they are, applied to one ordinary feature: a smart reorder reminder that nudges shoppers when they are probably running low on something they buy regularly. Pick a question.

Applied to · Smart reorder reminder

Review outcomeShip — with four conditions.

  1. Sensitive product categories are excluded from reminders by default.
  2. The cadence (“every 28 days”) is stored; raw baskets expire after 90 days.
  3. The messaging vendor receives a template ID and a token — never the product name.
  4. Cadence data is purpose-bound to reminders; ad systems cannot read it.

The DATA question needs a scale.

“Is it personal?” is too blunt to act on. Tier the data first. The tier decides the default controls — so reviewers debate exceptions, not basics. One subtlety matters more than the rest: tier data by what it reveals, not by the column type. A list of SKUs is “just purchase history” — until one of them is a pregnancy test.

T0

Public

Published prices, public profile fields.Integrity checks; no special handling
T1

Internal

Aggregate metrics, config, non-personal logs.Access control; standard retention
T2

Personal

Email, device ID, a usage event.Purpose tags, retention limits, access logging
T3

Sensitive

Precise location, contacts, messages, financial data.Minimize, encrypt, need-to-know access, short TTL
T4

Special

Health, biometrics, children’s data, sexual orientation, government IDs.Avoid collecting; on-device first; explicit consent; strongest isolation

TakeawaySame eight questions, same order, every feature. Consistency is what turns a review into an instrument.

05 The map

Every arrow is a decision.

Architecture diagrams are drawn to explain how the system works. Privacy review reads the same diagram differently: each arrow is a copy, made for a reason, kept for a time, readable by someone. Most of those decisions were never made on purpose — they were made by default.

Data moves through a lifecycle. A good review asks one question — and names one control — at every stage. Tap a stage.

An illustrative system for an online shop. Orange arrows leave your trust boundary or change purpose. Select any arrow — in the diagram or the list — to open its privacy object.

The orange arrows are where the case files come from.

Every one of these started as an ordinary marketing or analytics integration. The pixel or SDK behaved exactly as designed. What failed was a review that never asked where the events went.

FTC · 2023

GoodRx

Shared prescription and health details with ad platforms through pixels and SDKs, despite privacy promises. First Health Breach Notification Rule case: $1.5M penalty and a ban on sharing health data for ads.

A “standard” pixel on a health page is a health-data disclosure.

FTC · 2023

BetterHelp

Online counseling service shared emails, IP addresses and intake answers with advertisers after promising privacy. $7.8M for refunds; barred from sharing health data for advertising.

Hashed emails of therapy seekers are still health data.

FTC · 2022 →

Kochava

Location broker sold precise coordinates tied to mobile ad IDs, exposing visits to clinics, places of worship and shelters. A proposed settlement bars selling sensitive location data without express consent.

An “anonymous” ad ID plus precise location is a person.

Companion demo The Privacy Command Center draws this map for an entire (fictional) company, Northstar — every flow, owner and control, on synthetic data.

TakeawayIf an arrow has no purpose, no retention and no owner, it is not a design. It is an accident with a network connection.

06 Linkability

Two harmless tables name a stranger.

On the left, a health dataset with the names removed — the textbook definition of “de-identified”. On the right, a public list of the kind many places publish. Neither table, alone, tells you who has which diagnosis.

Now join them on the three columns they share.

Clinic visits — “de-identified”No names
ZIPBirth dateSexDiagnosis
021391974-02-11MAsthma
021391961-07-31FDepression
021411988-11-03FMigraine
ON zip, birth_date, sex
Public listNo health data
NameZIPBirth dateSex
J. Okafor021421990-05-19M
R. Alvarez021391961-07-31F
M. Chen021391974-02-11F
R. Alvarez02139 · 1961-07-31 · F→ DepressionFictional people. Real technique.

How many columns does it take to find one person?

In 2000, Latanya Sweeney estimated that about 87% of the US population is likely to be uniquely identified by just three things: five-digit ZIP code, gender and full date of birth. None of those looks like an identifier. Together they usually are one. Try it on a crowd of 1,000 synthetic people — your target is in there somewhere.

Add what you know about the target
1,000

people match. No one is identified.

Synthetic population · computed live

Five failures every privacy engineer should know.

Each broke a different assumption. Learn the assumption, not just the headline.

2006

AOL search logs

Released “anonymized” search logs keyed by user number. Reporters identified a real person from her queries alone.

“Removing names makes data anonymous.”

2006–08

Netflix Prize

Researchers re-identified subscribers by matching “anonymous” movie ratings against public IMDb reviews.

“Data nobody else has is safe to publish.”

2012

Retail inference

A retailer’s purchase model predicted pregnancy — reportedly before a customer’s family knew.

“We only use what customers gave us.”

2018

Fitness heatmap

A global activity heatmap outlined the layout of sensitive military sites around the world.

“Aggregates can’t reveal anything sensitive.”

2018

Cambridge Analytica

A quiz app used friend permissions to harvest data on tens of millions who never used it.

“One user’s consent covers their friends.”

So choose the weakest identifier that still works.

Identifiers are not equal. A global, durable one (an email, a phone number, a government ID) links a person across every system that sees it — and hashing an email does not change that: the same email hashes the same way everywhere. Move right along the spectrum whenever the feature allows. The review question is always: can we use a weaker, rotating, scoped or purpose-specific identifier?

Takeaway“We removed the names” is not anonymization. Linkability is the risk; identifiers are the lever.

07 Purpose drift

Purpose is checked when data is used — not just when it’s collected.

Nobody sets out to misuse a phone number. It is collected, carefully, for two-factor authentication. It sits in a table. Two years later a growth team discovers the table, and the number is “already there”. That is purpose drift: the data did not move; the reason did.

Consent screens and privacy notices happen once, at collection. Drift happens at every read. So the check has to run at every read too. Press the button to run a use-time purpose check against six real-world-shaped requests.

Same data. Different flow. Different verdict.

Diagnosis
Your doctorExpected by everyone involved
Your insurerOnly with a clear, disclosed basis
Your employerBreaks the norm of the clinic
Precise location
Turn-by-turn mapsThe reason you shared it
A friend you choseYou set the flow yourself
A data brokerSold on without your knowledge
Purchase history
Receipts & returnsPart of the transaction
Fraud checksFine if proportionate
Pregnancy inference for adsA new, sensitive fact

Helen Nissenbaum’s contextual integrity (Privacy in Context, 2010): privacy breaks when information flows against the norms of the context it came from. The reviewer’s move: don’t ask “is this data sensitive?” — ask “does this flow match what the user expected when they shared it?”

Field
phone_number
Collected forAccount security
@purpose("account_security", "fraud_prevention")
@tier(T2)  @retain(account_lifetime)
phone_number: Phone

read(phone_number, purpose="ad_targeting")
→ DENY  purpose not in allow-list
$150MCivil penalty · 2022

This is not hypothetical. In May 2022 the U.S. Federal Trade Commission and the Department of Justice announced that Twitter would pay a $150 million civil penalty to settle allegations that it had used phone numbers and email addresses — collected from users for account-security purposes such as two-factor authentication — to serve targeted advertising. The data had not been stolen or leaked. It had simply been reused.

TakeawayBind purpose to the data, and evaluate it at the moment of use. A purpose written only in a privacy notice cannot stop a query.

08 The burn button

Complexity is where consent goes to die.

The story, as it’s commonly retold from Apple’s iDVD era: a team showed Steve Jobs a many-step design for burning a DVD. He went to the whiteboard, drew one window with one button, and wrote a single word. Burn.

The product absorbs the complexity. It never hands it to the person. Now look at what most consent flows hand the person instead. Try to make a genuine choice in the banner — then press the button.

We value your privacy

We and our 847 partners store and access information on your device and process personal data based on consent and legitimate interest for…

Strictly necessaryAlways on
Measure content performance
Personalised ads & profiles
Precise geolocation data
Legitimate interest (object ▾)
ACCEPT ALL

Manage 847 partners · reject

Decisions this screen hands the person
852

Five purposes, 847 partners, one pre-ticked “legitimate interest” — and one bright button that says yes.

The banner is an illustrative composite. The question is the kind of single system prompt apps must show on iPhone before tracking across other companies’ apps.

That prompt shipped in 2021 as App Tracking Transparency: apps must ask, and silence means no. One honest, identical question in every app — and a “no” that apps must respect. When asked plainly, most people say no. (It was also good strategy for its maker; regulators in France and Italy later fined Apple over how the rules treated its own apps. Both things are true.)

But a “no” is only a promise until it reaches every system that acts on the person. That is the next scene.

TakeawayThe best privacy setting is the default nobody has to find. One honest question beats 847 toggles.

09 Consent

Consent is state, not a checkbox.

A checkbox is a moment. Consent is a value that changes over time — unknown, granted, revoked, expired — and every system that acts on a person has to know its current value. That makes consent a distributed-systems problem: the truth changes in one place and must arrive everywhere else.

Grant consent, then revoke it, and watch the revocation propagate. Every consumer still acting on “granted” after the person said no is stale.

TakeawayYour real consent latency is the slowest consumer’s. Measure P99, not the demo.

10 Time

After the decision is made, do we still need the raw event?

Retention is a risk multiplier. Every extra day is another day for breach, subpoena, misuse, inference and scope creep. A raw event is most useful in the first days of its life — to compute a feature, fire a reminder, catch a fraud. After that, its usefulness decays fast. Its risk does not decay at all: a two-year-old row leaks exactly as well as a two-day-old one.

Drag the retention window. Watch how little value you give up, and how much exposure you stop carrying.

Usefulness of a raw event decays with age while its breach exposure stays flat. The shaded regions show what a retention window keeps. keep 30 d usefulness exposure per row age of the raw event (days, square-root scale)
Value retained76%of the event’s lifetime usefulness
Rows at risk on any given day60Mat 2 million events a day
Exposure vs keeping two years4%of the stored mass
Illustrative model · usefulness halves every ~15 days

Raw becomes derived becomes aggregate.

The answer is rarely “keep nothing”. It is: keep the conclusion, not the evidence. Each step down this ladder is narrower, less identifying and safe to keep for longer.

Raw event

What happened

{account: 81723, sku: "PRN-VIT-60", ts: "2026-09-12T23:41:07Z", lat: 37.7793, lng: -122.4193}

Lives 30 days

Derived feature

What it means

{account: 81723, category: "vitamins", cadence_days: 28}

Lives 180 days

Aggregate

What we learned

{week: "2026-W37", category: "vitamins", reorders: 14203} -- groups ≥ 50

Lives 3 years

Illustrative lifetimes. The right numbers depend on the feature, the law that applies to you and the promise you made — which is the point: they should be chosen, written down and enforced by a job, not inherited from a default of “forever”.

Now design as if “Forget me” had to work.

Imagine one button that erases a person everywhere. One “delete my account” fans out to every place the data was ever copied — miss one and the promise breaks. Deletion is a distributed-systems problem. Mark the stores your deletion genuinely reaches today.

0/9

TombstonesMark the record deleted so late-arriving copies can’t resurrect it.
Crypto-shreddingEncrypt per person; destroy the key to delete everywhere at once.
VerificationRe-query after the deadline; alert on any survivor.

If you can’t build the Forget-me button, you don’t control the data. The data controls you.

TakeawayThe only data that can’t be subpoenaed, breached or sold is data you never kept.

11 Threat modeling

Think like the adversary. Then like the person.

Security threat models ask who can break in. Privacy threat models ask a wider question: what can anyone — including us, legitimately, doing our jobs — learn or do that the person would not expect? LINDDUN, a privacy threat-modeling framework from KU Leuven, names seven categories — the STRIDE of privacy. Walk every category across every element of your data-flow diagram.

L

Linking

Can items or actions be tied to the same person?

I

Identifying

Can someone learn who the person is?

N

Non-repudiation

Is a person unable to deny an action they’d want to?

D

Detecting

Can someone tell that data about a person exists?

D

Data disclosure

Is personal data exposed more than necessary?

U

Unawareness & unintervenability

Are users uninformed, or unable to act?

N

Non-compliance

Does it violate law, policy, or promise?

Outsider · breach, theft → encryption, isolation, minimal stored data Partner · over-collection, reuse → contracts, scoped APIs, aggregation, audits Insider · excess or curious access → need-to-know, access logs, break-glass review Tracker · cross-context linkability → partitioning, rotating IDs Future you · retention, scope creep → TTLs, purpose enforcement, deletion by default

Always walk the whole chain: technical issue → privacy harm → human consequence.

“Unencrypted column” does not move a roadmap. “A partner learns about a diagnosis” does. Pick an issue.

Technical issue

Privacy harm

Human consequence

TakeawayThe privacy question: what can an actor learn or infer — even if the system behaves exactly as designed? Put “future you” on the list.

12 Your worst day

Decide the worst case before launch.

Think of a windshield. The outer glass is security: it stops most stones. The plastic interlayer is privacy engineering: when the glass does crack, it holds the pieces together and keeps them out of the passengers’ laps. Stopping the stone is security’s job. Privacy decides how much the break can hurt.

You can’t promise zero. You can decide, before launch, the most a failure could ever cost. Same event, five designs: someone steals the message server.

DAMAGE = What you collected× How long you kept it× How identifiable it is× Who holds the key
Blast radius of the stolen server under the selected design. The ember circle shrinks as the design improves. 100 DAMAGE INDEX

Illustrative index  The four factors are scored 0–1 for a hypothetical messaging service and multiplied; the result is scaled so the worst design is 100. It compares designs; it does not predict harm.

The floor. Even the best design leaves something: metadata, the unlocked phone in your hand, and the person you sent it to.

TakeawayYou can’t stop every fire. You can decide, in advance, how many rooms it reaches.

13 Privacy-enhancing technologies

PETs are answers. Start with the threat.

Differential privacy, federated learning, secure enclaves: the vocabulary is seductive, and teams reach for it before they have said what they are defending against. Sort the technologies by what they change — the data you hold, the form it takes, or who can see a computation — and choose from the threat backwards.

Every PET has a price: some utility, some trust in someone, some risk left over. The expert habit: state the threat model before naming the technology. Pick a threat.

Differential privacy runs on a budget. Budgets run out.

Each differentially private answer spends some privacy loss, measured as epsilon (ε). Under basic composition the spends add up, and once the budget is gone the honest answer to the next query is no. Here the dataset has a total budget of ε = 4. Four queries have already run.

ε per query?per person?per day?per dataset?per release?

“ε = 4” is meaningless until you say epsilon per what. A budget of 4 per day is a very different promise from 4 for the life of the dataset. And cache released answers: asking the same question again spends budget again.

Q5 · weekly reorders by ZIP
requests ε = 1.0

TakeawayAsk “what threat are we addressing?” before “which PET?” — and write down the utility you paid and the trust you assumed.

14 The north star

Six questions. For every piece of personal data.

  1. Why do we have it?
  2. Where did it come from?
  3. Where does it go?
  4. Who can see, join or infer from it?
  5. When will it disappear?
  6. Can we prove the first five?

If you cannot answer, the uncertainty is the finding.

Policy says what should happen. Architecture determines whether it actually happens. Every arrow is a decision — make it on purpose.

Open the Privacy Command Center →

A working demo on synthetic data for Northstar, a fictional company: every flow, identifier, retention clock and control from this essay, in one place.

Sources & notes

  1. Paddy Iyer, Privacy Engineering — A Visual Field Guide, PaddySpeaks, 2026 edition. The frameworks in this essay — the three hats, the eight questions and their red flags, the tiers, the lifecycle controls, the enforcement ladder, the breach budget, the history hole, the burn button and the Forget-me button — come from it, as do the case-file summaries.
  2. Latanya Sweeney, Simple Demographics Often Identify People Uniquely, Carnegie Mellon University, Data Privacy Working Paper 3, 2000 — the estimate that about 87% of the US population is likely uniquely identified by five-digit ZIP, gender and date of birth.
  3. U.S. Federal Trade Commission, announcement of 25 May 2022: Twitter to pay a $150 million civil penalty to settle allegations that it used phone numbers and email addresses collected for account security to target advertising.
  4. Google Docs Editors Help: version history and sharing roles; Google Drive trash policy.
  5. Case files, from public reporting as summarised in the field guide: AOL search logs (NYT, 2006); Netflix Prize (Narayanan & Shmatikov, 2008); retail pregnancy inference (NYT, 2012); fitness heatmap (Guardian / NYT, 2018); Cambridge Analytica (2018); UK Iraq dossier Word metadata (2003); Manafort court-filing redaction (2019); FTC actions on GoodRx (2023), BetterHelp (2023) and Kochava (2022 onward).
  6. Helen Nissenbaum, Privacy in Context, Stanford University Press, 2010 — contextual integrity.
  7. LINDDUN privacy threat modeling framework, DistriNet research group, KU Leuven (linddun.org).
  8. Cynthia Dwork and Aaron Roth, The Algorithmic Foundations of Differential Privacy, 2014 — privacy loss, composition and budgets.

Everything else is illustrative: the people, documents, systems, latencies, retention periods and breach numbers are invented to show mechanisms, and are labelled as such where they appear. Nothing here is legal advice. The Steve Jobs “Burn” story is an anecdote as commonly retold, not a documented quotation; the consent banner is an illustrative composite.