Disposal and retirement across artifact kinds — survey (2026-07-25, updated after ADR 056 shipped)
Working file for question 4 (retirement protocol), widened from notes to every artifact kind. Trigger: an investigation into why adopted proposals were not deleted found that the proposal contract specified the lifecycle transition (proposal → ADR) but not the disposal operation — and that the rest of the KB handled end-of-life with five different operations, only some of them written down.
The proposals half shipped the same day as ADR 056; lifecycle-model.md keeps the reasoning that produced it. What this file now holds is the audit data behind that decision, the per-kind status after it, the archive-versus-delete test that generalized it, and what each kind still lacks — an eligibility trigger for notes, a destination for source snapshots. Design that shipped is stated here in one line with a pointer — the contracts carry it; restating it here would fork it.
The trigger case: adopted proposals (resolved by ADR 056)
kb/reference/proposals/README.md said a converged proposal "becomes an ADR and the proposal is superseded by it," and its lifecycle line ended in "ADR (decided and implemented) — or retirement." Neither the README nor ADR 028 said what supersession or retirement did to the file. Compare the workshop contract, explicit from the start ("extract durable conclusions … delete the workshop directory"). Practice went three ways:
- Deleted — six times, and this was the settled practice (corrected 2026-07-25 from "once", after the documentation-site redirect map turned up the rest). ADR 046 retired the verifiable-quotes proposal; ADR 050 adopted and deleted three; ADR 051 two more. Each deleted file got a
properdocs.ymlredirect to its adopting ADR — a real convention, invisible torgoverkb/and to a shallow clone, which is why the first pass of this survey missed it and undercounted. Note the direction of travel: the deletions (2026-07-12/13) came after the two retentions (07-11/12), so practice was converging on deletion, and ADR 056 reversed it deliberately. The redirect convention carried over — it now points at the archived file. - Kept with an ad-hoc banner, twice. source-genre (adopted by ADR 045) and assertion-force (retired by ADR 044) carried blockquote banners — "this document remains as design history." The source-genre description had been hand-edited to
Proposal (adopted):, a prefix outside the contract's vocabulary at the time; the collection-localdesign-proposaltype has since sanctioned it, so an archived-and-adopted proposal stays distinguishable in a description sweep. These two are the KB's first archived proposals, migrated as ADR 056's worked cases. - Partial adoption, per the written rule. factored-dependency-pairs (one item adopted by ADR 041) and gate-learning follow the partial-adoption clause (shipped content moves out, adoption noted) — the one disposal path the contract already defined. ADR 056 left it in place: a partially adopted proposal still holds undecided content, so it stays in the frontier.
Three forces kept the retained ones in place, and each is now answered:
- ADRs linked back. ADR 045 carried a
supersedes:edge — "the proposal this decision adopts" — and cited the proposal in its Context; collections-never-own-frontmatter-semantics cited assertion-force as "the retired proposal." Answered by provenance is a tag, not a pointer: those links were re-extracted or demoted to title mentions during the migration. Within the frontier,supersedesbetween two live artifacts is untouched. - The ADR didn't preserve the design object. True, and the reason deletion was rejected. Answered by the
## Considered alternativesrequirement on ADRs dated 2026-07-25 or later, which moves the decision-relevant subset into the ADR itself. - Nothing enforced the directory's claim. Still true in the sense that no validator checks lifecycle state — but the claim is now structural rather than asserted: decided proposals leave the directory, so
ls kb/reference/proposals/is the frontier and drift shows up as a file, not as a stale field. Thedesign-proposaltype routes review to design quality only, as the retireddesign-proposaltrait did before it.
The original defect — two of three observed behaviors unlicensed, the directory's contract disagreeing with its contents — is closed.
Survey: end-of-life per artifact kind
| Artifact kind | Contract says | Practice shows | Gap |
|---|---|---|---|
Workshop (kb/work/) |
Delete on close; remove index entry (COLLECTION.md) | Deletions happen (epistack workshops deleted 2026-07-23); citing docs leave a "recoverable from git history" pointer | Works. But the git-history pointer is fragile — see tensions below |
Proposal (kb/reference/proposals/) |
Extract, then move to archive/ as a link sink; partial adoption keeps the residual in the frontier (README, ADR 056) |
Two archived (the ADR 044/045 pair) as the worked migration; frontier is live-only as of 2026-07-25 | Operation defined and exercised; the validator enforces the archive link boundary. Remaining: n=2 on the extraction step |
ADR (kb/reference/adr/) |
Status enum accepted / superseded / deprecated on the type; files never deleted; decisions dated 2026-07-25+ carry ## Considered alternatives |
Superseded ADRs stay in place, status flipped, chained by supersedes edges |
Archive-in-place works today (ADR 028 killed the one stale state, proposed, by removing it from the enum), but is not terminal — see "ADRs archive too, eventually" below |
Note (kb/notes/) |
No lifecycle field since ADR 044 removed the fused global status; optional user verification replaces maturation. Retirement/deletion: nothing |
Notes get revised in place; full-pass machinery has delete/merge branches gated on human authority; no written staleness→disposal protocol | The live gap now. Question 4's original target. ADR 044 answered the maturation half (question 3) and left the retirement half untouched |
| Vocabulary / term | No general contract | Terms are retired by ADR (ADR 053 retired "distillation" with no successor; ADR 042 retired register-as-closed-taxonomy) | Works case-by-case; retirement-by-ADR is the de facto operation |
Source snapshot / ingest (kb/sources/) |
Nothing — no retirement, supersession, or refresh language in the collection contract | No observed retirements | Latent. Captures are treated as permanent; a wrong or dead capture has no defined exit |
| Review state (store) | commonplace-freshness-retire removes a registered baseline "when an artifact or target should leave global status" (commands.md); ADR 036 makes acceptance current-state |
Codified and idempotent | None — the one codified retirement operation in the system, but it covers DB targets, not documents |
| Tag-README / tag | Marks (complete / covered_by) maintained per type contract |
— | Tag retirement (a tag emptying out, a README orphaned) undefined; low pressure |
| Instruction / skill (system-definition artifacts) | Behavioral authority names consumer/channel/force; promotion by copying (ADR 037) | Retirement = removal from runtime surfaces | Un-promotion / decommissioning not written, but the behavioral-authority frame at least makes "inert" detectable |
The disposal-operation inventory
Six distinct operations, five of them now licensed by a contract where they occur:
- Delete, pointer in git history — workshops (licensed there). The one unlicensed proposal deletion is history: ADR 056 replaced it for that kind, keeping the site redirect.
- Archive in place with a status flip — ADRs (
superseded/deprecated), licensed by the type spec. - Extract, then move to a link-sink archive subtree — proposals, licensed by ADR 056 and the two proposals READMEs. New; replaces the ad-hoc banner imitation, which survives only as an archive-internal convenience (the archived file's banner links out to its ADR).
- Retire a DB target — freshness baselines, licensed and codified.
- Content moves out, residual stays — partial proposal adoption, licensed by the proposals README.
- Retire by ADR, no file operation — vocabulary terms (ADR 053, ADR 042). De facto rather than written down, and cheap because a term has no file to dispose of.
Nothing yet for notes and source snapshots; that is where the survey still has work.
Design tensions
- Delete vs. inbound links — resolved for proposals. Deletion breaks
supersedesedges and design-history citations, and the link vocabulary's supersession semantics require a surviving target. ADR 056 answers by keeping the target and cutting the edge instead: provenance demotes to a title mention, so the ADR needs no live target, while frontier-to-frontiersupersedesedges are untouched. Generalizes to any kind whose successors currently cite it as history. - Archive-in-place vs. directory contract — superseded by the search-surface framing. A directory that promises "only live X here" cannot archive in place unless the contract names the archived state; ADRs solve this because their type anticipates
superseded. Proposals imitated the mechanism (banner) without amending the contract — and once the cost was priced as search surface rather than link breakage, in-place marking failed anyway, because a marked file stays inside every default listing andrgsweep. Directory separation replaced it. - Git history is not an archive — stands, unchanged. The "recoverable from git history" pointer assumes deep history; this session's clone starts 2026-07-18, so everything deleted before that is invisible here. Deletion stays fine for value-consumed layers (workshops); for anything a durable artifact cites as history, in-repo retention is the only navigable archive.
- Enforcement boundary — the one fully mechanical lifecycle rule is built: the validator fails a library artifact that links into
proposals/archive/, while permitting the archive README andkb/work/exceptions. No semantic lifecycle state is validator-checked: nothing checks that asupersededADR names its successor or that an archived proposal was fully extracted. Marks doctrine (enforced-or-omitted, per tag-readme) applies to those semantic states: if lifecycle state is worth recording, it is worth checking; otherwise omit it. That doctrine is why ADR 056 declined a frontmatter lifecycle field.
Per-kind direction after ADR 056
The framing that decided the proposals case, kept because it is what the remaining kinds will be decided against: the operative cost of retaining a stale artifact is not storage but the search surface — texts are cheap to store, expensive to index and to receive as irrelevant search results. The KB's theory already carries this: flat memory predicts specific cross-contamination failures (operational debris pollutes search) and knowledge storage does not imply contextual activation (cue dilution). So the axis is not "delete vs. keep" but "in the frontier vs. out of it, and still citable vs. not."
- Workshops — delete, unchanged; URL continuity settled 2026-07-27 as a deliberate non-goal. The early decision stands and works. It can never be guaranteed that nothing useful remains; the bet is that the expected retrieval value of the residue does not cover its standing search-surface cost, and practice has borne this out. (Transferable claim candidate for
kb/notes/when the map is extracted.)
Checking the closure protocol against retire-artifact.md exposed a second axis the deletion bet had never separated: kb/work/ is published, and 84 closed workshops have left one redirect_maps entry between them — roughly 460 dead public URLs. That is now recorded in kb/work/COLLECTION.md as intended rather than as debt. Workshops stay published because a live one is worth showing to someone for consultation; their URLs are not durable addresses, and a closed workshop often has several successors or none, so there is frequently no honest redirect target. The lesson for the map: search-surface cost and URL continuity are independent axes. Every other kind happens to pair them — a retired note dies on both, an archived proposal survives on both — so the disposal framing had silently treated them as one. Workshops are the case that separates them: deleted from the frontier, never redirected, still published while alive.
Baseline retirement is a non-issue here empirically: commonplace-freshness-status --missing reports zero orphaned inputs repository-wide, and no workshop file has ever been a review target.
- Proposals — shipped. Archive by directory separation, extraction-gated, link sink, provenance as a title tag: ADR 056, with the operating rules in proposals/README.md and archive/README.md. Two consequences bind other kinds: the ADR type now requires ## Considered alternatives for decisions dated 2026-07-25 or later (dated prose, not schema — the corpus audit killed the one-line schema addition), and the KB now has two sink layers under one rule, pre-frontier (kb/work/, deleted after extraction) and post-frontier (the archive, retained after extraction).
- Notes — mechanics shipped 2026-07-26, eligibility still open. retire-artifact.md is the disposal operation this file said did not exist. It was written from an ops trigger — 17 artifacts had left orphaned freshness baselines across three past events — not from this line of work, which is why it sat unlinked and unnoticed here for a day. The note branch is delete: retarget inbound, properdocs redirect, retire baselines. What is still missing is the trigger: proposals have a crisp one (adopted or retired), notes have none, and nothing routes a staleness signal anywhere. That, not the mechanics, is what remains of question 4.
- Source snapshots — not a disposal gap; this survey miscategorized them (corrected 2026-07-27). They were listed as a kind with no exit, on the assumption that a superseded capture becomes residue. It does not. A snapshot is a standing input to a live fail-severity check: ADR 046 has commonplace-validate resolve every verbatim quote against the source it links, with mismatch failing, so retiring a snapshot would break quote validation for every note citing it. Re-evaluation — re-reading a capture against questions that did not exist when it was taken — is a second recurring use. And the search-surface cost that drives this whole framing is near zero here: kb/sources/ is a separate collection, and cp-skill-connect already prospects the matching .ingest.md rather than the snapshot itself.
A kind whose retention is load-bearing and whose standing cost is near zero has no disposal question to answer. Revisit trigger: connect or another sweep starting to struggle with the volume (428 files / 13M as of 2026-07-27). Distinct and still unhandled: an erroneous capture — wrong page, truncated, dead — which would validate quotes against the wrong text. That is a correctness repair (re-capture), not a retirement.
- State in the store → commonplace-freshness-retire and kin; already right.
ADRs archive too, eventually (design sketch, deliberately unbuilt)
The archive-in-place model for ADRs is not terminal: after some time, ADRs also leave the frontier. This is what the coordinate reading predicts — an ADR is not a frontier-forever kind, it is an artifact whose attention tier decays as its decision entrenches or is superseded; the lifecycle is a trajectory through the coordinate space, not a fixed placement. ADR 056 records it as a free choice left open.
- Time is the proxy; inbound citation is the signal. Two cohorts: superseded/deprecated ADRs are eligible immediately (their status already says "not current"); accepted ADRs become eligible when cold. Coldness is measurable: frontier artifacts citing the ADR by path. An ADR is archivable when its remaining inbound links have been re-extracted or demoted to tags — countable with
rg, hence checkable, and it makes archiving lazy work rather than a deadline. - The tag convention already exists. The KB routinely writes "ADR 026" in prose without a path (AGENTS.md does it). Number + title is a stable identifier — richer than proposals get — so demotion from pointer to tag is mostly converting path links into a form the corpus already uses.
- Extraction obligation is lighter than for proposals. An ADR's binding content must already be in the descriptive reference surface (that is
kb/reference/'s job); what needs absorbing at archive time is only the residual rationale that other frontier artifacts were reaching through their citations. The## Considered alternativesrequirement makes new ADRs self-contained by construction, which shrinks it further. - Discovery: the
adr/index may list archived ADRs by number and title without links (a tag list is admissible under the sink rule); or the archive carries its own interior README. - Sequencing: not yet. Worked-case-first. The proposals archive is the first case and proved the machinery (the move, the tag demotion, the boundary check by hand). Nearly every current ADR is still warmly cited — the system is young — so no real cohort exists. Revisit when the first genuinely cold or superseded ADRs accumulate; do not build the eviction machinery ahead of them.
Working hypothesis: tiers are generated, not enumerated (2026-07-25)
Maintainer conjecture: frontier and archive are only the first two categories — ADRs already sit oddly (frontier artifacts that are also storage of history, in converted, compressed form) — and more will come; "eventually it is like with cache."
The cache analogy is not loose: several of its mechanisms are already built or already decided, under other names:
- Refill-on-miss = re-extraction. When the frontier lacks something the archive has, the repair recomputes into the frontier rather than pointing at the backing store — which is exactly what the link-sink rule enforces. A cache holds copies, not pointers into RAM; the no-frontier→archive-links rule is that same discipline.
- Writeback-before-eviction = the extraction obligation. Workshops and archived proposals are evicted only after their durable content is written back to the library.
- Invalidation = the freshness system. Snapshot-pinned baselines over
(note, criterion)pairs are cache-coherence machinery for derived judgments (freshness architecture); make-like staleness detection is the same idea for the document graph. - Coherent-or-absent = the marks doctrine. A mark is defined as a cached recomputable value that must be enforced or omitted (tag-readme, a derived copy of recomputable truth must be checked or absent).
- Derived fast path with fallback to the generator — the theory-methodology-derivation workshop is designing this pattern for methodology itself.
One refinement the analogy needs before it can carry the lifecycle map: there are two different derived-artifact relations, and only one of them is a cache.
- Recomputable cache — marks, generated indexes, arguably descriptions. Deterministically recomputable from ground truth; maintenance rule is checked-or-absent; staleness is repaired by recompute.
- Committed compression — ADRs, notes promoted from workshops. Lossy, judgment-laden, not recomputable: re-running the process would not reproduce them. At the moment of commitment they become the new ground truth; the raw material behind them demotes to provenance. An ADR is therefore not a cache of its proposal — it is the original record of the decision, whose subject is historical. That is why ADRs belong in the frontier while the proposal goes to the archive, and why their maintenance rule is supersession (a new decision) rather than invalidation-and-recompute.
ADR 056 is the first shipped instance of the distinction: the ADR absorbs the decision-relevant subset (committed compression, so the ADR gets fatter and self-contained) while the proposal's texture goes to a sink that no live link reaches. The label "committed compression" is still a placeholder — ADR 053 retired distillation without a successor, and this is not a bid to re-mint it.
The proliferation worry resolves if new tiers are read as coordinates on named axes rather than as new kinds: standing attention cost (always-loaded → indexed → default-swept → on-demand → git-only), link-graph role (source, sink), and relation to ground truth (original, recomputable cache, committed compression). Under those axes, "frontier" and "archive" are just two frequently-occupied points, and an artifact like an ADR is unproblematic — original record, frontier attention tier. The KB has made exactly this move twice before when a closed taxonomy started sprouting members: registers became open profiles (ADR 042), the genre enum became an open field (ADR 045). Guardrail, same as those cases: worked-case-first — name a new tier only when an artifact actually earns it, and let the axes absorb the pressure until then.
The archive-versus-delete test (2026-07-27)
Retirement became polymorphic: one procedure, one branch, and the destination declared as a single line in the artifact's type spec. design-proposal archives; every other type deletes. The two branches differ in exactly two respects — inbound links retarget under delete and must not under archive, and the disposal command is git rm versus git mv plus a banner. Everything else is common, including the properdocs redirect, which archiving needs too because the URL changes.
The generating test went through two versions, and the first was wrong in an instructive way.
First attempt: archive a dated record of deliberation, delete a current statement of content. This reproduced ADR 056's own justification, which turns out to be false — and falsified by ADR 056 itself. That ADR argues twice that a proposal's design object "is not recoverable from an ADR that records only the choice," then decides, in the same document, that every ADR from that date must carry the option space, the deciding forces, and the free choices. The general form never supported the premise either: Nygard's Context is where the forces in tension are called out, and kb/reference/types/adr.md now states outright that the ADR is the only frontier carrier of that reasoning once the design work is archived. The session recorded in lifecycle-model.md noticed that "each rule created the debt the next one paid" but never checked whether paying that debt spent the original justification. It had.
Corrected test: what survives a complete extraction. Archive when the residue is irreproducible observation — dated current-state anchors and the corpus measurements a design rested on, which nobody can re-derive once the system has moved on, and which are the evidence a now-load-bearing commitment can still be audited against. Delete when the residue is claims, which a successor either carries or falsifies. Deliberation is never grounds for archiving: an artifact whose only residue is dialectic has an incomplete extraction.
This also repairs the workshop contrast, which had been resting on the same bad premise ("a workshop's value is consumed by extraction, while a proposal's option space and forces stay useful"). The honest version: a proposal's measurements warranted a commitment that shipped, so something still has a claim on them; a workshop's warranted nothing once the investigation closed. That makes the workshop deletion bet a consequence of the general test rather than a separate stipulation.
Edge case checked: retired proposals (foreclosed rather than adopted) still fit, since their evidence warranted a negative commitment that also shipped — which is what the assertion-force proposal under ADR 044 is.
What this file feeds
- Question 4's remaining half is now one thing: note retirement eligibility — what signals a note should retire. The mechanics exist; the trigger does not. Source snapshots left the list entirely once they turned out to have a standing consumer.
- The corrected archive-versus-delete test is the strongest promotion candidate this workshop has produced, but it is n=1 —
design-proposalis the only type that archives, and no other kind currently in the KB is a candidate. Do not manufacture a second case; the test now lives in retire-artifact.md where the next real one will exercise it. - The final life-cycle map note should carry the operation inventory and the frontier/sink framing, if they survive that case — the promotion candidates are listed under "Still open" in lifecycle-model.md.