Convert planning/decisions to numbered ADRs in docs/adr - #8
Closed
lesnik512 wants to merge 1 commit into
Closed
Conversation
lesnik512
force-pushed
the
docs/native-adrs
branch
from
August 23, 2026 10:33
f62b49a to
1521c7a
Compare
Member
Author
|
Closed automatically when its base branch |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
planning/decisions/is a private convention at a private address. Every agentskill that reads decisions looks in
docs/adr/by default, sochat-apphad toeither configure each one or accept that
/domain-modelingwould eventuallystand up a second decision home next to the first.
planning/README.mdalreadyargues at length against exactly that: a prose copy of a fact another file owns
goes stale in the copy nobody edits, which is why
architecture/was deleted.Dated slugs also carry nothing here. All thirteen files are
2026-08-21, so thedate sorts them into an order that means nothing, and there is no short, stable
way to cite one.
Design
Move the thirteen decisions to
docs/adr/NNNN-slug.mdand keep the contentdiscipline that made them better than stock ADRs. This is a port, not a
replacement:
## Rejected: <option>,## Consequenceand## Revisit triggerall survive, and
docs/adr/README.mdrecords that the local standard isdeliberately stricter than the format
/domain-modelingwrites, which treatsrejected alternatives as optional and expects a three-sentence body.
Numbers are dependency order, not chronology. Reading
0001upwardintroduces the system in the order its decisions build on each other: identity
(
0001), auth (0002-0004), the error and authorization vocabulary(
0005-0006), write patterns (0007-0008), chat state (0009-0010),events (
0011-0012), then testing policy (0013). New ADRs take the nextfree number and land at the end regardless of where they belong conceptually;
renumbering would break every reference, so that cost is accepted.
summaryfrontmatter is dropped. It existed to feedjust index, anddated slugs needed it because they do not sort by meaning. Numbered slugs do. In
four of the thirteen files the slug and the
#title were already the samesentence with different punctuation, so
summarywas a third telling. Thedirectory listing is now the index: numbered, ordered, zero code, cannot drift.
Frontmatter appears only on a superseded ADR, so no frontmatter means accepted.
docs/adr/check.pyreplaces the half ofplanning/index.pythat validateddecisions, and validates more than it did.
_check_decisiononly ever checkedthe filename and a non-empty
summary; the new checker enforces contiguousunique numbering (the real hazard: two branches both grabbing
0014), theNNNN-slugname, a## Revisit triggeron every ADR, and thatsuperseded_byresolves to an ADR that exists. The revisit trigger was previously enforced for
deferred items only and held for decisions by habit; all thirteen already had
one, so enforcing it costs nothing today and stops the habit lapsing.
It lives beside the files it governs, following
planning/index.py's ownprecedent, and is wired into
just check-adrs, the CI lint job, andpyproject.toml's coverageomitlist for the same reason the other twoplanning/scripts are there.planning/keepsdeferred/and everything that serves it.index.pylosesload_decisions,_check_decision, thesuperseded_byrendering and theDecisions section;
links.pyis untouched.Non-goals
modern-di.planning/README.mdrecords this asdeviation 7 and states plainly that deviations 1-5 match
modern-diand thisone does not yet. Promotion to convention 3.0.0 waits until the layout has
been lived with, which is the whole point of not doing both repos at once.
CLAUDE.md's Vocabulary section toCONTEXT.md. That isthe next PR.
docs/agents/domain.mdstill names aCONTEXT.mdthat does notexist, and its own consumer rules say to proceed silently when it is absent.
decisions live, and this body plus deviation 7 is where that reasoning belongs.
thirteen is
0002's cross-link, repointed from the dated filename to0003.descriptive the directory is enough. Past roughly forty it would not be, and
that is the point to revisit, not now.
Verification
just test: 109 passed, total coverage 100.00% (Required test coverage of 100% reached). This matters more than it looks:--cov=.with--cov-fail-under=100would have failed on the new uncovered script had theomitentry been missed.just test-migrations: 4 passed.just lint:ruff formatreformatted 1 file (docs/adr/check.py),ruff checkandty checkboth clean underselect = ["ALL"].just check-adrs:adr: OK.just check-planning:planning: OK.just check-links:links: OK— the gate that covers the cross-referenceupdates in
CLAUDE.md,readme.md, the PR template,planning/README.mdandthe one deferred item that cites a decision.
number, a numbering gap, a malformed name, a missing revisit trigger and a
dangling
superseded_by: all five reported, exit 1.grepconfirms noplanning/decisionsreference remains anywhere in the repo.Note on the diff
This branch carries the staged
Justfile→justfilerename that was alreadyin the working tree, since the recipe for
just check-adrsis added to thatfile.