0004 — Roadmap items are issues labelled roadmap; epics are named, not numbered
Status: accepted (retires the numbering of story 009) Date: 2026-10-13 Story: stories/017-roadmap-items-are-issues.md
Context
Story 009 gave ROADMAP.md legal numbering with one hard rule: a cited
number never moves. Shipped items therefore stay in the file, ticked
and stamped, new items squeeze in with letters (1.6a), and the archive
step that would sweep done items out cannot run without breaking the
numbering. Three months on, two thirds of this repo's roadmap is
history and an epic could not be placed where it belonged.
A roadmap number is a position dressed as a name. The names that mean something are already on the forge: issue numbers are sequential and permanent, and labels say what an issue is. A roadmap item may inspire several stories, and it is done only when all of them are; that is a relationship between issues, not a property of a line in a file.
Options
| Option | Complexity | Testability | Domain clarity | Operational risk |
|---|---|---|---|---|
| A. Keep frozen numbers; shipped items stay on the roadmap | none | as today | one number means a position and a name | the roadmap fills with history; archive is impossible; insertions need letters |
| B. Provisional numbers, renumbered freely; shipped items leave at release | remove the frozen logic; add the move to the release | text transforms | a number is a position only, so citing one is nearly meaningless | numbers quoted in discussion go stale at every renumber |
C. Items are forge issues labelled roadmap; epics named; the file is a view; done means the issue is closed, then archived to the changelog |
tp roadmap talks to the forge; labels must exist; renumber goes |
format is pure text; the forge part behind the existing fake forge | an item has one permanent name, its issue; a story cites it; epics are what they are called | the lint needs the forge and a token, so offline it checks format only |
Decision
C. ROADMAP.md holds named epics in any order, each a list of
- #N text lines for open issues labelled roadmap. Capture is one
command that files the issue and writes the line. Stories cite their
roadmap item in the story file; a roadmap item is done when its stories
are all shipped and the human closes it, which the release prepare step
offers to do. Closed items leave the roadmap in the release commit that
names the version — the only commit at code level 1 that may carry it —
and land in CHANGELOG.md under that version. A gitignored in-flight
file carries what the tag run must do afterwards without a commit: close
the issues with the release link, tidy the story branch.
Consequences
Easier: the roadmap reads as a plan and stays short. An idea is captured
in one command. Nothing is ever renumbered; tp roadmap check becomes a
lint of format plus the forge's truth. The changelog's per-version
### Roadmap list is the record of what each release finished.
Harder: tp roadmap depends on the forge and a token for everything but
the format, and on two labels existing in every repo. Old stories and
issues that quote roadmap numbers (3.5) no longer resolve against the
file. Repos on story 009's rules migrate by hand, once.