repositoryStandards v1.1.20

status: Accepted date: 2026-08-09


ADR-046: the backlog is the one index; open questions and ideas get a type

Context

Three files answered "what's live in this repo" independently: backlog.md (intents with a DoD, per ADR-010), docs/open-questions/README.md (24 standing doubts, each with a decision in force or none), docs/ideas/README.md (features not yet approved). Each keeps its own table, its own columns, its own status words. A reader - or the generated dashboard - has to open three files to see everything currently live, and the dashboard's Backlog tab already reads only backlog.md, so open questions and ideas were invisible there even though the Documents tab already merged them elsewhere.

Nothing about the three kinds' own nature demanded three tables. docs/method/taxonomy.md's own test for when a split needs a record - "is this a live, contestable trade-off that gets re-litigated?" - names this one.

Decision

One table, three kinds, a type column. backlog.md gains type with values task, bug, open-question, idea. Existing rows default to task. The two folder tables (docs/open-questions/README.md, docs/ideas/README.md) are removed; the folders and their per-topic files stay, now linked from the backlog row instead of indexed by a separate table. Each README keeps its prose - what the type means, how it differs from its neighbors, the front-door framing for new maintainers - since that explanation belongs to the type, not to the table that used to sit under it.

Decision records stay separate. An ADR or BDR is a record of a fork taken; a backlog row is a live intent or a standing doubt. Folding records into the backlog would either lose the immutability a record is for, or force every accepted ADR into an open-ended table it does not belong in. This was checked directly with the owner rather than assumed.

Status is per-type, not one shared vocabulary. task and bug keep todo / doing / blocked / done unchanged. idea keeps its existing vocabulary verbatim: idea / exploring / approved | parked | dropped, graduating to graduated.

open-question gets two values: open (nothing decided yet) and decided (a decision stands). This needed its own shape because an open question does not have a completion state - the whole point of the type, stated in docs/open-questions/README.md since before this record, is that a decided entry is still actively open to a better answer. That is not a task sitting at 90% done; it is the type's permanent condition. A third state for "currently being re-litigated" was considered and dropped: every decided entry is equally open to challenge at all times, so there is no structural difference in openness between one decided last week and one decided a year ago - only a difference in how strong the standing answer is, and that already lives in the row's why text (the doubt, in one line) rather than needing a field of its own. Reusing done for a decided open question was also considered and dropped: done reads as settled-forever to a task-shaped reader, which is the opposite of what the type means to say.

Consequences

  • standard/scripts/generate-dashboard/index.mjs's parseBacklog()/asItem() and src/page.js's backlog-tab rendering gain optional support for type and a per-type status legend - backward compatible, since an adopter's backlog.md without a type column reads every row as task exactly as it does today.
  • docs/open-questions/README.md and docs/ideas/README.md lose their tables, replaced by a pointer to backlog.md; docs/README.md and tools/docsite.mjs's nav are untouched, since neither depends on the table - the open-questions.html / ideas.html pages still generate from the same folders, just without the table each used to embed. CONTRIBUTING.md gets one wording fix: a new open question is now added to backlog.md, not listed in the README.
  • This is a repo-own (zone 1) decision. The shipped standard's R14 (ideas) and R15 (backlog) contracts for adopters are untouched - an adopter is not required to run a docs/open-questions/ folder at all, and one that does keeps whatever shape it already has. Nothing here supersedes ADR-010; it extends the backlog's shape to also carry the two artifact classes ADR-010 already named as neighbors, without changing what ADR-010 decided about the tracker bridge.

Compliance

backlog.md parses with a type column on every row; docs/open-questions/README.md and docs/ideas/README.md carry no table; every topic that had a table row now has an equivalent backlog.md row linking to its still-existing detail file.

Revisit when

The row's why text proves insufficient to signal how strong a decided open question's standing answer is. This record considered and dropped both a third re-litigation status and reusing done for a decided open question, on the assumption that free text in the row already carries that signal - if that assumption fails in practice, the status vocabulary for open-question needs a structured field, not just prose.