|
| 1 | +// SPDX-License-Identifier: MPL-2.0 |
| 2 | +// SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk> |
| 3 | += ADR 0006 — Clade Lifecycle Status (8 phases) |
| 4 | + |
| 5 | +Date: 2026-06-24 |
| 6 | + |
| 7 | +== Status |
| 8 | + |
| 9 | +Accepted. |
| 10 | + |
| 11 | +== Context |
| 12 | + |
| 13 | +ADR 0002 fixed the clade _taxonomy_ (where a repo sits: genus/species). It did |
| 14 | +not say anything about a repo's _life-phase_ (whether it is alive, ended, or |
| 15 | +something in between). The pre-existing `repo.vcl` schema carried an ad-hoc |
| 16 | +five-value status enum — `active stale archived experimental complete` — that |
| 17 | +conflated unlike things (`complete` is a completion metric, not a life-phase; |
| 18 | +`experimental` overlaps `incubating`) and had no room for the ended family |
| 19 | +(merged, superseded, extinct) or for renames. |
| 20 | + |
| 21 | +Two failure modes had to be designed out: |
| 22 | + |
| 23 | +. *The "misc"/redo trap* — a status set so coarse that real situations don't fit, |
| 24 | + so people invent a junk bucket or leave it blank, and the field rots until it |
| 25 | + is worthless. |
| 26 | +. *Identity drift* — treating a rename or a resurrection as if it created a new |
| 27 | + thing, losing the through-line of a single repository's history. |
| 28 | + |
| 29 | +== Decision |
| 30 | + |
| 31 | +Separate two layers that were previously tangled: |
| 32 | + |
| 33 | +* *Identity* (`uuid`) is immortal. It never changes for the life of the repo — |
| 34 | + not on rename, not on archival, not on resurrection. |
| 35 | +* *Status* (`phase`) is a mutable pointer to the current life-phase. Transitions |
| 36 | + are legal in *both* directions; no phase is terminal. |
| 37 | + |
| 38 | +*Eight phases*, mutually exclusive and exhaustive, in two families: |
| 39 | + |
| 40 | +[cols="1,3"] |
| 41 | +|=== |
| 42 | +| Living | `reserved` · `incubating` · `active` · `dormant` |
| 43 | +| Ended | `merged` · `superseded` · `archived` · `extinct` |
| 44 | +|=== |
| 45 | + |
| 46 | +Specifics live in *fields*, not in the enum, so the phase set stays small and |
| 47 | +never needs a "misc" bucket: |
| 48 | + |
| 49 | +* `status_since` — when the current phase began. |
| 50 | +* `present` — derived boolean (here / not-here-as-itself): `true` for |
| 51 | + `reserved|incubating|active|dormant|archived`, `false` for |
| 52 | + `merged|superseded|extinct`. The crisp binary, alongside the rich phase. |
| 53 | +* `aliases[]` — former prefixed-names. A *rename is not a phase change*: the old |
| 54 | + binomial moves here; `uuid` and `phase` are untouched. |
| 55 | +* `merged_into`, `superseded_by`, `successors[]` — the ended-family links. |
| 56 | +* `status_history[]` — append-only arc of `{phase, since, note}`. It records the |
| 57 | + full path, including resurrections: `extinct -> active` ("a Gitassic Park |
| 58 | + event") is a legal transition on the *same* uuid. Earlier rows are never |
| 59 | + rewritten. |
| 60 | + |
| 61 | +The per-repo declaration lives in `.machine_readable/CLADE.a2ml` under a |
| 62 | +`[status]` block (see this repo's own CLADE.a2ml as the reference exemplar). |
| 63 | +`clade-hygiene` gains CLADE-004 (phase present) and CLADE-005 (phase in the valid |
| 64 | +set). Existing repos are backfilled by an idempotent farm sweep |
| 65 | +(`clade-status-backfill.sh`), defaulting to `active`. |
| 66 | + |
| 67 | +== Consequences |
| 68 | + |
| 69 | +=== Positive |
| 70 | +- One immortal id + one mutable phase = no identity drift across rename/archive/revival. |
| 71 | +- Small, exhaustive enum → no "misc" bucket, no periodic re-do. |
| 72 | +- `present` gives consumers the cheap here/not-here answer; `status_history` |
| 73 | + preserves the full arc for anyone who needs it. |
| 74 | + |
| 75 | +=== Negative / Neutral |
| 76 | +- The old five-value enum is superseded; any tooling reading the previous values |
| 77 | + (`stale`, `experimental`, `complete`) must map them |
| 78 | + (`stale -> dormant`, `experimental -> incubating`, `complete -> active`). |
| 79 | +- `present` is derived, so writers must keep it consistent with `phase` (the |
| 80 | + backfill sweep and hygiene checks enforce this). |
| 81 | + |
| 82 | +== References |
| 83 | + |
| 84 | +- ADR 0002 — Clade Taxonomy (the genus/species layer this complements). |
| 85 | +- `verisim/schema/repo.vcl` (SEMANTIC + TEMPORAL modalities, schema 1.1.0). |
0 commit comments