The homework question nobody could answer
Session 3 ended by asking you to find a published figure you would now withdraw, and then to work out how you would issue the correction. On a normal warehouse that second half takes a minute to answer and the answer is boring. Here it is the session. Larkfield's team reached the same point in their second month, with a reward issued against the wrong address and a figure already in a board pack, and discovered that every correction move they knew depended on being able to change something.
★ What you walk out with tonight. The three capabilities an append-only record removes, drawn as mechanisms so you can see what is left in each case rather than just what is gone. The read path as the place the cost actually lands, and why it never gets lighter. The boundary decision that is the only real lever, set at design time and not revisitable afterwards. And the disagreement about putting anything to do with a person on a permanent record, argued from both sides and left open, because it is open.
LiveWhy this is a cost and not a scandal4 min▶
It would be easy to spend forty five minutes being appalled, and it would be a waste of the time. An append-only record is doing exactly what it was chosen to do, and session 5 makes the case for it properly. The useful posture tonight is the one a finance function takes with a fixed cost: name it, size it, put it in the right budget line, and stop being surprised by it every quarter.
What makes it awkward is that the cost is invisible at the moment of the decision and visible every month afterwards. Nobody experiences the loss of a correction path on the day the design is signed off. They experience it eighteen months later, in a read path that has accumulated a dozen rules nobody can safely remove, maintained by people who were not in the room.
Larkfield's wrong record was not a bug in anything. A reward was issued against an address that a user had supplied incorrectly, the mechanism did precisely what it was told, and the row is correct as a record of what happened. It is only wrong as a statement about who was rewarded, which is the sense every downstream report reads it in.
Self-studyThe words that keep coming back4 min▶
- Append only. New records can be added, existing ones cannot be altered. Session 1 named it; tonight it has consequences.
- Annotation. A later record that says something about an earlier one. The only correction shape available, and it is not a correction.
- Supersede. The relationship an annotation asserts. It has meaning only if the reader applies it, and nothing makes them.
- Read path. Everything between the stored rows and the answer. This is where every correction ends up living, permanently.
- Restatement. Reissuing a published period on a corrected basis. Standard practice elsewhere, and it has no mechanism here.
- Erasure. Removing personal data on request. What any regime obliges is not settled here; the obligations live in learn-gdpr-with-phoebe.
- Opaque reference. An identifier that means nothing without a separate table, kept somewhere you can still destroy.
- The boundary. The line between what goes on the record and what stays off it. Part 2, and the only decision here that is really yours.
Correct, restate, erase: three verbs that stop working
14 min liveEach of the three is worth seeing as a before and after rather than as a rule, because in every case something is still possible and it is not the same thing. The gap between what you can still do and what you used to do is where the cost sits, and in all three cases it lands on a reader rather than on the writer who caused it.
LiveA correction is a second row, and the reader has to know4 min▶
The mechanical part is simple enough that it hides the problem. A wrong record stays exactly where it is and a new record is appended saying what should have been recorded. The pair of them is now the truth, and neither one alone is.
Everything difficult follows from that last clause. A query written against the raw rows returns the wrong answer, and it returns it confidently, with no error, no null and no flag. The correctness of every figure now depends on a piece of logic sitting in the read path, and that logic has to be present in every read path: the warehouse view, the notebook somebody wrote in a hurry, the export a partner pulls, the query an auditor runs themselves because the data is public and they can.
That last one is the part people miss. When the rows are readable by outsiders, you do not control who reads them or how, so you cannot guarantee that your correction logic is applied. You can publish it, and publishing it is the right move, and it is still a request rather than a control.
LiveThe read path only ever gets heavier4 min▶
A correction in a normal warehouse has a lifespan. The row is fixed, the incident is closed, and in three years nothing in the codebase remembers it happened. That is the property being given up, and it is worth naming precisely because nobody misses it until it is gone.
Here every correction is a permanent addition to the read path, and the reason it is permanent is not laziness. The wrong row is still there, still readable, and will still be read by somebody in three years, so the rule that supersedes it cannot be retired while the row exists, which is always. A read path with twelve supersede rules in it is not a badly maintained read path. It is a correctly maintained one, after twelve mistakes.
What a leader should take from this is a budget line rather than a lament. The maintenance cost of the reporting layer grows with the count of historical errors and never shrinks, so the thing worth managing down is the error rate at the point of writing, and the thing worth resourcing is the read path itself.
Self-studyRestatement, and why "we reissued the numbers" is not available5 min▶
Restatement is the move a reporting function reaches for when a published period turns out to have been computed on a wrong basis. The period is recomputed, the new version is issued, the old version is withdrawn, and there is an established etiquette for saying so. It works because the published figures were an assertion by one party who can withdraw them.
Here the inputs were not asserted by you and cannot be withdrawn by you. You can recompute and reissue your own derived figure, and you should, but the rows the old figure was computed from are still sitting there, still public, and still produce the old figure for anyone who runs the obvious query. A restatement in this setting is a claim competing with a computation, and the computation is the one a sceptical reader will run.
There is a version of this that works and it is unglamorous: publish the derivation, version it, and make the superseding relationship part of what you publish rather than part of what you announce. Then the sceptical reader running their own query is running yours. It does not remove the old answer from the world, because nothing can, and it does give the new one somewhere to stand.
The only decision that is really yours: what stays off
13 min liveNothing in part 1 is negotiable once a record exists, which makes the interesting question the one asked before anything is written. What goes on is permanent, so the design conversation worth having is not about what to put on the record. It is about what deliberately never goes near it, decided once, by people who will not be maintaining the read path.
...
LiveYour side of the boundary still has a delete4 min▶
Switch the loader to retract and the wrong rows go to zero. That is worth pausing on, because it is the clearest demonstration of what the boundary actually buys. The warehouse is yours, so inside it the verbs from part 1 all still work: you can correct, you can restate, you can remove. The record upstream has none of them.
So the boundary is not a compliance diagram or a governance artefact. It is the line between the part of your estate where a mistake is recoverable and the part where it is not, and every item you move across it to the permanent side is a capability you are giving up for that item, forever, in exchange for something. Part of the job in a design review is making sure somebody says out loud what the something is.
Two honest notes about this box. The upstream event causing rows to be replaced is a chain reorganisation, which is taught properly on the practitioner track and returns in session 6 as a scoping question. And holding rows back until they settle is a separate defence from retracting them, with a different cost; conflating the two is a known trap and session 6 keeps them apart.
LiveErasure is unavailable, which is not the same as difficult4 min▶
Most hard things in a data estate are hard in a way that yields to effort. A field is scattered across nine systems, so you find the nine, you write the deletes, you prove it. Expensive, tedious, done. The reason this one is different in kind is that no amount of effort produces a mechanism, because there is nothing to call and nobody to ask. The record does not have an owner who could remove it if they wanted to.
What obligations attach to any of this belongs in learn-gdpr-with-phoebe and is not settled here. What belongs here is the design consequence, which holds regardless of which regime you are under: if a capability might be required of you later and is structurally unavailable on the permanent side, the only place to provide it is on the other side of the boundary, and the only time to arrange that is before the first record is written.
In practice that means the lever people reach for is destroying the link rather than the record: keep the map from an opaque reference to a person in a store you control, and destroy the map. Whether that is a remedy or the appearance of one is the argument below, and it is a real argument.
Self-studyWhere serious people disagree5 min▶
One camp holds that nothing capable of being linked to a person belongs on a permanent public record, in any form, including an opaque reference. Their argument is that an opaque reference is only opaque against the linking ability available today. The record lasts indefinitely, linking ability improves, and session 2 and session 3 already showed what structure alone gives you without any external table at all. On this view, promising that a reference cannot be resolved is a promise about the future that nobody is able to make, and the design that avoids making it is the only one that stays honest.
The other camp holds that this collapses a real distinction and, taken seriously, forbids most of what the arrangement is for. A reference with no table behind it is not information about a person in any usable sense, and holding the table somewhere destructible gives you a genuine remedy with a genuine effect: destroy it and the linkage is gone from your side permanently. They also point out that the first position is not free. Move everything identity-shaped off and what stays on the record is too thin for a third party to check anything, which throws away the one advantage session 1 credited on the plus side and session 5 argues for at full strength.
Both camps have shipped systems and both have been right in different projects. The genuinely unresolved part is empirical and about the future: how resolvable a reference becomes over the life of a permanent record, which nobody knows. Notice that the two positions fail differently rather than one failing worse. The first fails quietly, by building something too thin to be worth the machinery, and that failure is survivable. The second fails loudly and late, when a reference that was opaque at design time stops being opaque and the record is still there. Which failure you would rather explain is a legitimate way to choose, and it is not the same answer for every product.
Draw the boundary for something you already run
15 min hands onNo code. Six steps on a dataset your team owns and on the live box above, said out loud in the room. The aim is to leave with one boundary drawn on paper and one honest sentence about what it costs on each side.
Count your last twelve corrections
Pull the actual number of times a row was changed rather than added in the last year. Then imagine every one of them still sitting in the read path as a rule. That is the maintenance load you would have signed up for.
Pick one and rewrite it as an annotation
Take a real correction and express it the only way available here: the wrong record stays, a new record supersedes it, the read path applies the relationship. Write the rule in one line and say who would have to know about it.
Find the reader who would miss it
Name a real person or system that queries your rows in a way you do not control. An export, a partner feed, a notebook, an auditor. That reader is the one who gets the old answer, and naming them is more useful than any policy about it.
Toggle the loader and read both rows
Set the live box to append only and then to retract. Write down both figures. Then say in one sentence why the second one is available to you at all, in terms of which side of the boundary the warehouse is on.
Draw the two columns
For a product you are actually being asked about, list what would go on the permanent side and what would stay off. Be specific about the reference that crosses. Then look at the left column and ask whether a stranger could check anything at all with only that.
Say which of the two positions you hold, and its cost
Pick one of the two panels and defend it for thirty seconds, then state its failure mode without being prompted. Anyone who can only do the first half has a preference rather than a position. Keep the answer for session 6.
The habit to keep. In any design review where something permanent is being proposed, ask what would happen if this particular record turned out to be wrong, and make somebody describe the sequence of events out loud. The answer is either a mechanism or an embarrassed silence, and you learn which in about ten seconds. The silence is the signal that the boundary has not been drawn yet.
Three questions
Larkfield appends a record that supersedes an earlier wrong one. What has actually changed for a downstream consumer who was already reading those rows?
An annotation asserts a relationship. Nothing enforces it. A query written against the raw rows keeps returning the original value, confidently and silently, and when the rows are public you do not control who is running such a query.
Why does the correction logic in the read path never get retired, even years later?
The retirement condition simply never arrives. That makes the reporting layer grow with the count of historical errors and never shrink, which is a budget line to plan for rather than a failure of discipline to correct.
Two people in a design review disagree about whether an opaque reference to a customer may go on the permanent record. What is the honest description of that disagreement?
One side says a reference is opaque only against today's linking ability and the record outlives that. The other says a reference with no table behind it is not usable information and destroying the table is a real remedy. Both have shipped systems, and the disagreement is about the future rather than about the present.
Homework
Twenty minutes, on the boundary you drew in step 5 and on one thing that is genuinely better here.
Write the design review question down
One sentence you will actually ask next time something permanent is proposed, plus the follow-up for when the answer is vague. Put it somewhere you will see it before the meeting rather than after.
Bring one thing this arrangement does better
Four sessions in, the ledger has cost Larkfield a great deal and given it one thing back. Write down what you think that one thing is, in a sentence, before session 5 argues the credit side at full strength.