How we track features and releases. Changed 2026-10-02: status, priority and target release
moved from spec/roadmap.md into GitHub. The file-based registry had drifted from both the code
and the issues (an audit that day found six FRs shipped while the file still listed them as
planned or active, and eight live FRs with no issue at all). One place to update is the fix.
| Fact | Lives in | Not in |
|---|---|---|
| A feature exists, its scope summary, its status | the GitHub issue, labelled FR |
spec/roadmap.md |
| Target release | the issue's milestone: the next minor (today 1.1) or 1.x (later) |
spec/roadmap.md |
| Work in progress | the MetaObjects Roadmap project board's Status field (Todo / In progress / Done) |
— |
| The design (why and how) | docs/superpowers/specs/*, ADRs in spec/decisions/* — linked from the issue, never copied into it |
the issue body |
| Release direction, FR number → issue → spec index, future themes, history | spec/roadmap.md |
— |
| What shipped in which version | CHANGELOG.md |
— |
An issue labelled FR with no milestone is untriaged. Triage means giving it a milestone or
closing it. There are only two open milestones at a time: the next minor and 1.x (later). When a
minor is cut, close its milestone and open the next one, choosing its contents from 1.x (later).
A feature gets an FR-0NN number when it gets a design spec, because the number names the spec
file and is cited across docs. Small feature requests can stay as plain FR-labelled issues
with no number. Allocate the next number as the highest in spec/roadmap.md's feature index + 1.
- New feature. Create the issue first, labelled
FRplus anarea:*label, with a milestone if one is known:If it has a spec, add one row to the feature index ingh issue create -R metaobjectsdev/metaobjects \ --title "FR-0NN — <title>" --label "FR,area:<x>" --milestone "<1.x>" \ --body-file <file> # one-paragraph summary, then the spec link and the target release
spec/roadmap.md(FR | title | issue | spec) in the same change that adds the spec. The index has no status column on purpose. - Status or target release changes. Change the issue (milestone, board
Status, a comment saying what changed and why). Nothing to edit in the repo. - Shipping. Close the issue with a comment naming the version and the commit or PR. Partial delivery: comment what shipped and what remains, and keep it open (or split the remainder into a new issue and close the original).
- Cutting a release. Every issue in the milestone is closed or moved to a later one, then the
milestone is closed.
CHANGELOG.mdremains the record of what shipped. - When the spec and the issue disagree about status, the issue wins. Specs are design records; they are not kept current with delivery.
"MetaObjects Roadmap", owned by the metaobjectsdev organisation:
- a built-in Auto-add workflow adds every issue in this repo labelled
FR; - the default view is grouped by milestone (the release columns);
- a
Statussingle-select (Todo / In progress / Done).
The board is a view over the issues, so losing or rebuilding it costs nothing. Creating or
scripting it needs the token's project scope: gh auth refresh -s project,read:project.
The adopter-facing roadmap on metaobjects.dev/roadmap (Now / Next / Later) is summarised from
the milestones: Now = the next minor's open FR issues, Next = the one after, Later =
1.x (later). Refresh it when a milestone's contents change.