learn-web3-with-phoebe / Leader session 4 of 6
Learn Web3 with Phoebe · Leader session 4 of 6

You cannot take it back

Immutability is the property most often sold as the benefit, and from where a data team sits it is mostly a bill. Three things stop being available at once: correcting a wrong record, restating a period you have already published, and removing personal data on request. Each has a workaround and every workaround puts the cost somewhere else. Tonight is the three of them with their real bite, and then the one decision that is genuinely yours, which is what deliberately never goes on at all.

🟠 Leader track Anyone who has ever restated a number Anyone sitting in a design review 45 min
0-3 · Welcome 3-17 · Three things you cannot do 17-30 · What stays off 30-45 · Build-along and Q&A
Part 0

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.

Live = presented in the 45 minutes Self-study = the full depth, after class 🔍 Every diagram zooms

★ 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.

Real world

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.
Part 1 · covers the three consequences

Correct, restate, erase: three verbs that stop working

14 min live

Each 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.

Three verbs, each drawn as it normally works and as it works here. 1 · CORRECT NORMALLY row 41, wrong value UPDATE the table still has exactly one row ON THE LEDGER row 41, still wrong row 118, the fix the read path must apply this, every time, forever Annotate, never correct. The overlay never expires. 2 · RESTATE NORMALLY Q3 as published Q3 restated the earlier version is replaced outright ON THE LEDGER Q3 as published no mechanism a note beside the original is all there is, and a reader may never see it No restatement path. The old figure keeps circulating. 3 · ERASE NORMALLY the record the record is removed and stays removed ON THE LEDGER the record none exists the key held off the ledger destroying that is the only lever there is Removal is structurally unavailable, not merely hard. All three have workarounds, and every workaround moves the cost onto the read path or onto a boundary drawn at design time. None of them moves it back to where the mistake was made. The person who chose the design has moved on and the read path has not, which is why this arrives as a standing maintenance load on a data team rather than as a one-off incident with an owner.
🔍 Click to zoom - in all three panels something is still possible on the bottom row. In none of them is it the same thing as the top row, and the difference is paid by whoever reads next.
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.

Nothing was edited. Three mistakes, three fixes, and a read path that can never put any of them down. THE LEDGER, APPENDED ONLY 41 118 402 655 909 1,140 supersedes supersedes supersedes THE READ PATH CARRIES ALL OF IT month 3 · treat row 41 as superseded by row 118 month 7 · treat row 402 as superseded by row 655 month 11 · treat row 909 as superseded by row 1,140 the stack only grows, because the wrong rows are still there and still readable READER WHO APPLIES THE OVERLAY gets the corrected answer READER WHO QUERIES THE ROWS gets the original wrong answer, with no error, no null and no warning, on every run from now on A rule can only be retired when the row it corrects is gone, and the row is never gone. So the reporting layer grows with the count of historical errors and never shrinks. That is a budget line, not a lapse in discipline, and the only variable you control is how many rows you get wrong in the first place.
🔍 Click to zoom - the lower reader is not doing anything wrong. They are querying a public dataset in the obvious way, and there is no signal anywhere that tells them not to.
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.

Part 2 · covers the boundary

The only decision that is really yours: what stays off

13 min live

Nothing 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.

The boundary is drawn once, before anything is written, and it is the whole of the design decision. ON THE LEDGER · PERMANENT the fact that the event happened an opaque reference to the party what a stranger needs in order to recompute the result every item here is a decision that cannot be revisited later, so the list is kept as short as the product will allow OFF THE LEDGER · STILL CORRECTABLE who the party actually is the map from an opaque reference back to a person the correction registry and every superseding rule anything you might one day have to remove this side keeps all three verbs from the panels above The only thing that should cross the line is an opaque reference. Everything on the right can be corrected, restated or destroyed. Nothing on the left can be, at any price or with any effort. POSITION 1 · NOTHING ABOUT A PERSON GOES ON A reference that can be linked back to somebody is data about them, and a permanent record of it is a promise you cannot keep. Keep the ledger for events, nothing else. Its cost: much of the shared verifiability goes with it. POSITION 2 · A REFERENCE IS NOT A PERSON A reference is meaningless without a table you still hold and can destroy, so destroying it is a real remedy and the first position gives up the design for a definition. Its cost: the remedy depends on nobody else linking it first.
🔍 Click to zoom - the two positions below are not a beginner and an expert view. They are two defensible readings of the same boundary, and they lead to different products.
Live The warehouse loader, running in this page. The one correction you do have is on your side of the boundary, and this is what it buys.

...

...
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.

Part 3 · build-along

Draw the boundary for something you already run

15 min hands on

No 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.

Check yourself

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.

Before session 5

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.

Covered tonight

What this session covers

✓Correct becomes annotateThe wrong record stays, a second record supersedes it, and the relationship holds only if a reader applies it.
✓The read path carries it foreverA rule retires when its row is gone, so it never retires. The reporting layer grows with the error count.
✓Restatement has no mechanismYour derived figure can be reissued; the rows it came from cannot be withdrawn and still answer the obvious query.
✓Erasure is structurally unavailableNot hard, unavailable: there is nothing to call and nobody to ask. Obligations themselves live in learn-gdpr-with-phoebe.
✓The boundary as the real decisionWhat goes on, what stays off, and the fact that only an opaque reference should ever cross.
✓The disagreement, left openNothing person-shaped on the record at all, against a reference being meaningless without a destructible table.
◐What a shared ledger genuinely does betterAsked tonight in the homework. Session 5 makes the case at full strength and then draws its boundary.
◐Holding rows back against retracting themNamed tonight as two separate defences. Session 6 keeps them apart as a scoping question.
○What any law or regulation requiresNot stated here in any form. The obligations live in learn-gdpr-with-phoebe.
○Chain mechanics and how a record becomes permanentAssumed from learn-blockchain-with-phoebe rather than repeated.
○Anything about price, markets or holdingsOut of scope by design, and nothing here is advice of any kind.
Take this with you

Cheat sheet

The one sentence. What you put on is a decision you cannot revisit, so the design question is what deliberately stays off.
Correct. Becomes annotate. The wrong row stays readable and the fix is a second row beside it.
The silent failure. A raw query returns the old value with no error, no null and no warning.
Restate. No mechanism. You can reissue your derivation; you cannot withdraw the rows it came from.
Erase. Structurally unavailable, not difficult. The obligations themselves live in learn-gdpr-with-phoebe.
The read path. Grows with the count of historical errors and never shrinks. Budget for it.
The boundary. Only an opaque reference crosses. Everything correctable stays on your side of the line.
The open argument. Nothing person-shaped on at all, against a reference with a destructible table. Unresolved, and they fail differently.