Retraction Is a Social Act, Not a Delete
A document freezes the moment it stops being private, not the moment it's saved. Revising it afterwards doesn't edit it; it creates a new document linked back to the old one. The old one keeps existing, keeps its own audience, and keeps being wrong if it was wrong. This page is about what that buys, and what it costs the author who has to live with it.
Mutable until it's seen
DocumentNode.mutable is computed, not authored: it's true exactly when dissemination === 'private'. A private document is a working draft, edited freely in place. The instant it circulates, gets submitted, or gets published, that door closes. The trigger is social exposure, not persistence to disk: a document can sit written and saved for terms without ever locking, as long as nobody else has read it yet.
Once locked, a revision is a new node. DocumentLineage records the edge back to the parent, tagged with a derivationType: revision, extraction, synthesis, response, translation, or collection. A single document can carry several of these simultaneously, a revision of one parent and a response to a different one at once, because the type is a property of the relationship, not of the document as a whole.
Dropping a claim doesn't retract it
This is the sharpest edge in the model, and it's stated directly in DerivationEvent's own documentation: when a new document derives from an old one and the author quietly drops a commitment along the way, that doesn't retract the claim from the parent. If the parent is circulated or published, the dropped assertion is still standing in the world, under the author's name, whether or not the author still believes it. The new document and the old one can now assert incompatible things, and nothing in the system reconciles that automatically.
DerivationEvent tracks the derivation honestly rather than papering over it: inheritedCommitments carried forward unchanged, modifiedCommitments carried forward with a reason for the change, and droppedCommitments, claims present in the parent that simply didn't make it into the child. A reviewer, or a rival scholar, or the player's own later self, can read that gap and ask what changed and why.
What retracting a document actually does
Retraction doesn't delete anything. The node persists, flagged, its content still readable; the design doc states this outright: retraction is a social act performed on a document, not an edit. What retraction triggers is a cascade through the lineage graph: every descendant that inherited a now-retracted commitment gets flagged as tainted.
Not every tainted descendant is tainted equally, and this is where the shipped type is honestly narrower than the design doc's fuller picture. Doc 10 §7.1 describes three distinct outcomes for a descendant: one that independently dropped the retracted claim during its own derivation is clean; one that carried the claim forward but backed it with genuinely independent evidence is defensible; one that inherited the claim without review and has nothing else supporting it is fully tainted. The shipped TaintedLineage carries the mechanics that let a reader work that distinction out (pathFromRetracted, the lineage chain back to the retraction; affectedCommitments, which specific claims are at stake) but doesn't carry a degree field naming clean, defensible or fully-tainted directly. The doc's degree-of-taint judgement is real design intent; nothing in the shipped types computes it yet.
pathFromRetracted. Two children of the same retracted parent can end up clean or tainted depending on what each independently carried forward.Retraction has a price, scaled to how far the claim travelled
The design doc ties retraction cost to four factors: dissemination state at the time, the venue's prestige, how many citations the document has picked up, and how many terms it's been standing. The intuition is straightforward once stated: retracting a private note nobody read costs nothing, because nobody built on it. Retracting a published, well-cited, long-standing claim at a prestigious venue costs real reputation, because other people's work now stands on ground that just moved. The cost model is specified at the design level (doc 10 §7.2) rather than shipped as a type yet; it is the natural next piece once retraction itself lands as engine behaviour.
Retraction carries a scope: 'full' | 'partial' field and a publicAwareness number that the shipped Retraction interface doesn't have; the shipped version keeps documentId, reason, a timestamp and taintedDescendants, and folds the rest into future work. Similarly, doc 10's sketched TaintedLineage carries a playerAware/resolved pair the shipped type doesn't. Neither is a contradiction between doc and code: the shipped shapes are an authored subset, narrowed against what the type actually needs to support today, not a drifted copy of what the doc specifies.docs/10-document-tradition-system.md §1–2, §7 · Types: src/lib/types/documents.ts (DocumentNode, DocumentLineage, DerivationEvent, Retraction, TaintedLineage)