RM table of contents — every roadmap item and where it actually lives¶
The single complete list. Nothing else was: ROADMAP.md's detail table covered
RM4–RM7 / RM10–RM17 / RM20–RM27, USE_CASES.md's covered RM1–RM14 / RM18–RM22, neither
was sorted, RM28–RM35 lived only as prose paragraphs, and the major-version items are not numbered at
all. So RM33 was genuinely unfindable. This file exists to make that impossible. ROADMAP.md's active
list ran empty after the 0.6 batch, filled again with RM74–RM79, and emptied again when those shipped —
which does not retire the argument in either direction. An item that moves leaves a pointer at where it
used to live, and that is the same defect one document over.
Paged by number since 2026-09-25, because one file had grown past 600 lines. Each page holds every item in its hundred, under the status or round heading it had in the single file:
Add an entry whenever you add an item, on the page for its hundred. A new item goes under that
page's ⏳ Open, no release decided heading until its release is decided. A new hundred opens its
own page, which also goes into mkdocs.yml's nav beside the others. Search all pages at
once with grep -n 'RM47' docs/RM_TOC*.md. Page labels never spell an unfiled number with the
RM prefix: the allocator counts every RMn string under docs/ as used, and a label reading
"up to 299" that way once made it skip to 301. If you find yourself wanting a second index somewhere
else, don't: two partial lists of the same 35 items is what caused this one.
Claim the number with .claude/rm-next.py, never by reading the highest one off this file. An
index is not an allocator: reading a number claims nothing, so two sessions a minute apart read the
same answer and both write it — which happened on 2026-09-01, when two sessions sharing one working
tree filed different work as RM159 (git 741ec59 renumbered one to RM161). The allocator scans every
document under docs/ and reserves the next number in the same locked write, appending a
🔷 reserved row under Reservations below. When you write the item, put its real row on the page for
its hundred and delete the reservation, or --release it, which leaves a ✖ tombstone here, because
ids are never reused.
Shipped items now live in two files, which is exactly why this one is worth keeping. ROADMAP_HISTORY.md starts at the 0.6 design round; ROADMAP_HISTORY_PRE_0_6.md holds the 0.5 line and everything before it. A reader should never have to guess which half an item is in — follow the link from here.
Format of an entry: the number links to the authoritative entry, the one to edit. also in lists every other document that mentions it, so a rename or a status change can be propagated without grepping.
🔷 Reservations — numbers claimed, entries not yet written¶
The allocator writes here. A row below is a number some session has claimed; it moves to its page when the entry is written.
🔒 The major bucket — unnumbered on purpose, and that is why it hides¶
Everything needing a major lives in one table in
ROADMAP § The 1.0 cleanup. These have no RMn
number, which is why they are easy to lose. They are not deferred features — each breaks a rule
Principle 3/8 protects, so a minor cannot carry it.
Read this list under the amended cadence (CONSTITUTION § 0.6 amendment, 2026-08-12): deprecate in a
minor, remove at the next major. An item whose replacement already exists takes its warn-only
deprecation in a 0.x release and is gone at 1.0, not deprecated at 1.0 and lingering to 2.0 — the
entries below still phrased the old way are stale, not decided. What genuinely keeps the old shape is
whatever Principle 8 makes mandatory (state, the pathogenic/benign booleans), because an author
cannot comply with a warning about a field they must still set. Every item here also owes an upgrade
line under RM52, which is release-blocking for 1.0.
VariantRow.state— deprecate at 1.0, remove at 2.0; a derived alias ofdirectionsince 0.3statevaluesalt/ref— drop from the read-vocabulary; genotype-relative descriptorsVariantRow.pathogenic/benign— deprecate → remove; lossy aliases ofclin_sigStudyRow.p_value: str— retype (the numeric companionp_value_numshipped in 0.5)weights.parquetend— split by the charter amendment: wiring it is 0.6 work, only the removal is major. Either way it needs an end-coordinate convention (interbase-half-open vs inclusive), the same choice RM15 must make. The authoredstartis settled: 1-based VCF POS, pinned by a testweights.parquetlikely_pathogenic/likely_benign— remove; dead output, wiring rejected in 0.5VariantRow.weightvseffect_size— review whetherweightis subsumed- Deprecated flag / vocab aliases — collapse to the canonical vocab
ModuleManifest.authors+ free-formcurator— fold into RM14's structured recordStudyRow.pmidrequired — doi-first: require ≥1 of{doi, pmid}; a requiredness demotion. Pairs with RM50, which carries the PMCID axis and theLiteratureRowkeysources.csv— rename (recommendation:licensing.csv). The input half is RM51 and shipped in 0.6.0; what waits for the major issources.parquet(insideartifact.digest) and themanifest.sourceskey — both removals. The old CSV spelling is deprecated in 0.6 beside the alias and removed at 1.0, on the amended cadence this item prompted. It is a licensing/attribution ledger whose name collides with thesourcecolumn meaning "which link answered" (the overload RM33 had to split) and with the ordinary sense in whichstudies.csv/literature.csvare sources toofetched_at— rename on all seven sidecar models (updated_atorrecorded_at; the choice encodes a semantic decision about whether a provenance-column rewrite restamps). The name says fetch; measured, a re-run never restamps, so the value dates when the row's facts were set. Outside every fact set, so no signature moves and onlyartifact.digestdoes — which is why the disposition is to bundle it with thesources.parquetrename above, not to schedule it alone- Compiler
ensembl_cacheshim — remove the deprecated parameter outright - ~~Coordinate-first identity~~ — resolved in 0.5 by VRS; kept struck through for traceability
The other trackers¶
| Tracker | Where | What it holds |
|---|---|---|
| Reserved namespace | ROADMAP § Reserved namespace | Names withheld because a release will plausibly claim them (Principle 5). Three: reference_db, plus callable_element / quality_element, the two element-rule columns RM54 decided against building. |
| Freeform idea-book | ROADMAP § Freeform suggestions | Unshaped ideas — the 0.5 book, plus Parked in 0.5 (recorded so they are not re-proposed as new) and a 0.6 book below it. |
| Not format scope | ROADMAP § Annotating core | Half of every source assessed: anything that calls or interprets is a consumer's job. |
| Design threads | PROPOSAL_0_6_PT2, PROPOSAL_0_6, PROPOSAL_0_5_1, PROPOSAL_0_5, PROPOSAL_0_4_1 | Where an item's shape was argued before it became an RMn, one file per release line — two for 0.6, because a second round of items landed behind the first and PT2 re-asked which release they belonged to. |
| Dogfooding ledgers | DOGFOOD_0_6.md (the plan) + DOGFOOD_0_6_FINDINGS.md (what it found) | Findings from using the shipped CLIs on real modules. Only the surface half becomes an RMn — RM68–RM72 — so the fix half is findable here and nowhere in this index, by design. |
| What shipped | CHANGELOG.md | Newest first. The statuses above summarize it. |
Where an item comes from¶
An RMn is stage 5 of the design cycle, not its start: a field report
(CONSUMER_SUGGESTIONS) → run it against the bricks
(USE_CASES) → shape it (the release's proposal file) → then either shipped
(recorded in COMPILER.md's coverage table) or parked as an RMn. An item with no
trail through those was found by dogfooding or by an audit: RM31–RM35 came from the 2026-08-03 round,
RM53–RM67 from the VCF 4.4 audit, and RM68–RM72 from dogfooding the 0.6 batch on 2026-08-13.