Skip to content

docs(roadmap): the file is the shape of the open work again, and its history is changelog.md (#577) - #584

Merged
Gerrrt merged 3 commits into
mainfrom
gerrrt/roadmap-purpose-history-47224c
Sep 21, 2026
Merged

Gerrrt merged 3 commits into
mainfrom
gerrrt/roadmap-purpose-history-47224c

Conversation

@Gerrrt

@Gerrrt Gerrrt commented Sep 20, 2026 •

Copy link
Copy Markdown
Owner

Why

docs/roadmap.md said in its header that it is the shape of the work and that status lives on the issues. It was 2,790 lines. Twenty-one of the thirty entries under Security / Monitoring / Infrastructure / Automation pointed at closed issues; Everything still to buy carried ten dated paragraphs around a two-row table; Done was 1,450 lines. It took 177 commits in thirty days, and #536, #487 and #486 were pure drift fixes to it.

Closes #577.

What the file is now

The ordered shape of the open work. One section per GitHub milestone, in working order, each with its close condition and only the issues whose gate or order needs a sentence the issue cannot carry. The header states what an entry may contain: a link, the gate, its place in the order, and why — no date except a gate that is a date — and that an entry leaves when its issue closes, with anything worth keeping going to the changelog under the date, in the same PR.

Kept: Everything still to buy (the rule, the two-row table, the ifrit paragraph, the decision-gated bullets, Never and the consumable exception, all present tense), and Considered and declined verbatim bar two lines: its first sentence pointed at a section that no longer exists, and its Authelia bullet said #103 still tracks the SSO deferral when #103 closed on ADR-0022.

393 lines, from 2,790. The untouched Considered and declined section is 78 of them.

Where the history went

docs/changelog.md, new, 2,691 lines: every dated block moved verbatim, filed under the latest date it names, or under the date of the commit that wrote it when it names none. The 67 Done entries keep their shape minus the [x]. The buy section's dated paragraphs, the paid-for register, every closed-issue entry from the open sections, and the full narrative of the entries for issues that are still open (#92, #95, #101, #102, #421, #418) are all there under their dates. Nothing was summarised.

A line-by-line comparison of the old file against the two new ones (whitespace-normalised) finds only these lines absent, each dropped on purpose:

  • the old header's three paragraphs (rewritten);
  • the four topical section headings and the one intro sentence under The stack does not watch itself;
  • Decided but not built — every entry in it read "Under X above"; its rule survives as one sentence in the new header;
  • a truncated - **[#100](…) Automate the Grafana fragment that was a title with no body (its Done entry moved intact);
  • the "this bullet used to read …" sentences inside three decision-gated bullets, whose substance is in the changelog's 2026-09-10 and 2026-09-13 entries.

Checks

  • check_buy_list is untouched: the section heading, its first table and the single **One more, later literal are where it reads them. python3 scripts/check_docs.py passes, ten assertions.
  • The three roadmap.md#everything-still-to-buy anchors and the twenty-odd whole-file links resolve unchanged.
  • Every issue cited in a milestone section is open on GitHub (loop over gh api). The four closed ones cited elsewhere are reopen tickets in Considered and declined and the battery worked example in the buy exception.
  • scripts/lint.sh passes (markdownlint-cli2, editorconfig-checker, shellcheck). CI is green on this commit: Lint, Secret scan and Validate configs.
  • Locally scripts/validate.sh passed before the rebase and then failed twice on observability: promtool check config. That is the known local flake, not this change: promtool exits 0 on that file, validate.sh's own grep -qE '^\s*SUCCESS' pipeline passes standalone, lab: promtool check config is green immediately above it, and this branch touches nothing under stacks/ or scripts/validate.sh. CI's isolated runner is the verdict.
  • check_docs.py's docstring and PROSE comment now name changelog.md among the records it deliberately does not check. README, successor-handover.md, swap-the-switch.md, fit-the-ups-battery.md and rotate-snmp-community.md no longer tell a reader to move an entry into Done.

Kept up with main, which moved ten commits under this branch

Two rebases before the branch was pushed, then a merge. Nothing upstream was overwritten:

Because the roadmap was rewritten wholesale, git renders each of these as a whole-file conflict; every one was resolved by keeping the new structure and re-applying the upstream facts into the section they belong in.

main's ADR-0048 collision, and how it cleared

#586 and #588 merged in parallel and both numbered their ADR 0048, which turned main red at c774d64 and, through the merge, this branch with it: 14 check_docs.py disagreements, none in a file this change is about. #591 already owned the renumber, so this branch did not touch it and waited instead. That PR has since landed, the UPS ADR is 0049, and merging it in cleared all 14. The #574 entry here and its dated changelog entry point at ADR-0049.

All three checks are green on the head commit, and the branch is level with main.

Documentation only; no host changes.

🤖 Generated with Claude Code

…history is changelog.md (#577)

roadmap.md was 2,790 lines and said in its header that status lives on
the issues. Twenty-one of its thirty open-section entries pointed at
closed issues, the buy section carried ten dated paragraphs around a
two-row table, and Done was 1,450 lines. It took 177 commits in thirty
days, three of them pure drift fixes.

Now it is the ordered shape of the open work: one section per GitHub
milestone in working order, each with its close condition and only the
issues whose gate or order needs a sentence the issue cannot carry.
Everything still to buy keeps its rule, its table, the ifrit paragraph
and the decision-gated bullets. Considered and declined is kept. Done is
a pointer.

Every dated block moves to docs/changelog.md verbatim, filed under the
latest date it names, or under the date of the commit that wrote it
when it names none. Nothing was summarised away. Dropped rather than
moved: the old header, the four topical section headings and the one
intro sentence under them, the Decided-but-not-built section (every
entry of which was a redirect to a section above it), and a truncated

check_docs.py's docstring and PROSE comment name the new file among the
records it deliberately does not check; check_buy_list is untouched and
passes. README and the four runbooks that told a reader to move an
entry into Done now say the entry leaves and the changelog gets the
date.

Closes #577

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@Gerrrt
Gerrrt force-pushed the gerrrt/roadmap-purpose-history-47224c branch from a534966 to 98fd8db Compare September 20, 2026 23:03
Gerrrt and others added 2 commits September 21, 2026 04:34
…e milestone sections

Main added ADR-0047 and two ADR-0048s while this branch was open. Folded
into the new structure rather than dropped:

- the buy table's off-estate drive row says the estate's own backup sets
  are not what it is for — those ride with the second age recipient;
- #573 and #574 become entries under *Nothing blocks these*, each stated
  as its gate: a ninety-day visit for the one, a rack visit for the other;
- #566 and #483 closed, so they leave the roadmap, and the #576 line says
  what it now watches instead of pointing at a closed issue.

What those merges found — the Proxmox firewall never enabled and the
`management` set derived from the node's subnet, smaug's SMART by root
cron with patch state declined, what powers smaug, and both ADR-0048
decisions — is in changelog.md under 2026-09-20, which is where dated
findings go now.

`check_docs.py` reports 14 disagreements on this merge and every one of
them is main's: thirteen counted claims about rule, ADR and runbook
totals that the new rules moved, and the ADR-0048 collision itself, which
PR #591 already owns. main is red at c774d64 for the same reasons.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
PR #591 renumbered the second of main's two ADR-0048s. The #574 entry in
roadmap.md and its dated entry in changelog.md both pointed at the old
path, and now point at ADR-0049.

That merge also clears every one of the 14 disagreements the previous
merge inherited: check_docs.py passes, 92 Prometheus and 18 Loki rules.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@Gerrrt
Gerrrt merged commit 654bb3a into main Sep 21, 2026
3 checks passed
@Gerrrt
Gerrrt deleted the gerrrt/roadmap-purpose-history-47224c branch September 21, 2026 04:45
Gerrrt added a commit that referenced this pull request Sep 21, 2026
…rent file now

#577/#584 rewrote docs/roadmap.md from about 2400 lines to 405 — it is the
shape of the open work, keyed by milestone, and everything historical moved to
docs/changelog.md. This branch's two roadmap edits were written against
sections that no longer exist, so they are not merged; main's file is taken
whole and the intent re-applied in the new idiom.

- The Security entry this branch added is obsolete. Main's "Nothing blocks
  these" already carries a better-placed #442 entry, and the changelog already
  records #566 turning the firewall on.
- The #530 edit is obsolete too: "Decided but not built" is gone, and #530 is
  closed, so it is no longer open work and no longer in that file.
- What this branch owes the new structure instead: #442 closes on merge, so its
  entry leaves roadmap.md, and a changelog entry carries what the build found —
  routed not masqueraded, peers pinned to /32, §8 proved from off-estate, and
  sequenced behind #566 on purpose. Dated 2026-09-DD with the rest of the
  placeholders.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant