Skip to content

Commit a37b899

Browse files
lesnik512claude
andauthored
chore(planning): bump convention to 2.0.0 (flat change files) (#93)
Applies the lesnik512/planning-convention APPLY.md 1.x->2.0.0 update: swap index.py + templates (glossary.md added, plan.md template dropped), flatten all 59 change folders into flat change files and drop their committed plan.md (48 removed), merge the 2.0.0 convention prose into planning/README.md, align CLAUDE.md/Justfile wording, and record planning/.convention-version=2.0.0. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 0689c0f commit a37b899

116 files changed

Lines changed: 170 additions & 41659 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎CLAUDE.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ Guidance for AI agents (Claude Code, etc.) working in this repository.
1010

1111
- [`architecture/`](architecture/) (repo root) — the per-capability living truth, one file per capability ([`architecture/README.md`](architecture/README.md) is the index). The promotion target on every ship. **Read the relevant file before changing that capability.**
1212
- [`planning/README.md`](planning/README.md) — the planning convention (Quick path + the two-axis convention) and the generated change Index.
13-
- [`planning/changes/<YYYY-MM-DD.NN-slug>/`](planning/changes/) — per-change bundles (`design.md` + `plan.md`, or `change.md` for the lightweight lane).
13+
- [`planning/changes/<YYYY-MM-DD.NN-slug>.md`](planning/changes/) — flat change files, one per change (design template for the full lane, change template for the lightweight lane).
1414
- [`planning/decisions/`](planning/decisions/), [`planning/audits/`](planning/audits/), [`planning/retros/`](planning/retros/), [`planning/releases/`](planning/releases/), [`planning/deferred.md`](planning/deferred.md) — decisions, findings sweeps, retrospectives, release notes, and deferred items.
1515

1616
## Workflow
1717

18-
Planning follows the portable two-axis convention — `architecture/` (repo root) is the living **truth home** and promotion target; `planning/changes/` holds the per-change bundles. **Start at the [Quick path](planning/README.md#quick-path-start-here)** in `planning/README.md` to choose a lane (Full / Lightweight / Tiny), create a bundle, and ship — that file is the authoritative spec. Run `just check-planning` to validate bundles and `just index` to print the change listing.
18+
Planning follows the portable two-axis convention — `architecture/` (repo root) is the living **truth home** and promotion target; `planning/changes/` holds the flat change files. **Start at the [Quick path](planning/README.md#quick-path-start-here)** in `planning/README.md` to choose a lane (Full / Lightweight / Tiny), create a change file, and ship — that file is the authoritative spec. Run `just check-planning` to validate changes and `just index` to print the change listing.
1919

2020
## Commands
2121

‎Justfile‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ lint-ci:
2121
index:
2222
uv run python planning/index.py
2323

24-
# Validate planning bundles + decisions; CI runs this via lint-ci.
24+
# Validate planning changes + decisions; CI runs this via lint-ci.
2525
check-planning:
2626
uv run python planning/index.py --check
2727

‎planning/.convention-version‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.0.0
1+
2.0.0

‎planning/README.md‎

Lines changed: 67 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -12,25 +12,22 @@ the repo root; this directory records *how it got there*.
1212
**1. Choose a lane — first matching rule wins:**
1313

1414
1. Any of: needs design judgment · new file/module · public-API change ·
15-
cross-cutting or multi-file · non-trivial test design → **Full**
16-
(`design.md` + `plan.md`)
15+
cross-cutting or multi-file · non-trivial test design → **Full** (design template)
1716
2. Purely mechanical: typo · dep bump · linter/formatter/CI tweak ·
18-
mechanical rename · single-line config → **Tiny** (no bundle, conventional
17+
mechanical rename · single-line config → **Tiny** (no change file, conventional
1918
commit)
2019
3. Small-but-real, none of the above: ≲30 LOC net · ≤2 files · no new file ·
21-
no public-API change · one straightforward test → **Lightweight**
22-
(`change.md`)
20+
no public-API change · one straightforward test → **Lightweight** (change template)
2321

24-
Ambiguous between two? Take the heavier. A `change.md` that outgrows its lane
25-
splits into `design.md` + `plan.md`.
22+
Ambiguous between two? Take the heavier. A lightweight change file that outgrows its lane is rewritten from the design template.
2623

27-
**2. Create the bundle** (Full / Lightweight only):
28-
`planning/changes/YYYY-MM-DD.NN-<slug>/`, where `.NN` is a zero-padded
29-
intra-day counter. Copy the matching template from
24+
**2. Create the change file** (Full / Lightweight only):
25+
`planning/changes/YYYY-MM-DD.NN-<slug>.md`, where `.NN` is a zero-padded
26+
intra-day counter — copied from the matching template (design or change) in
3027
[`_templates/`](_templates/).
3128

3229
**3. Ship in the implementing PR:** hand-edit the affected
33-
`architecture/<capability>.md`, finalize the bundle's `summary:` to the
30+
`architecture/<capability>.md`, finalize the change file's `summary:` to the
3431
realized result, and run `just check-planning` before pushing.
3532

3633
## Conventions
@@ -43,20 +40,41 @@ realized result, and run `just check-planning` before pushing.
4340
4441
### Two axes, never mixed
4542

46-
- **`architecture/` (repo root) — the present.** One file per capability,
47-
living prose, updated in the same PR that ships the change. The truth home.
48-
- **`planning/changes/` — the past-and-pending.** One folder per change,
43+
- **`architecture/` (repo root) — the present.** One file per capability, plus
44+
a single `glossary.md` (the ubiquitous language); living prose, updated in the
45+
same PR that ships the change. The truth home.
46+
- **`planning/changes/` — the past-and-pending.** One file per change,
4947
kept in place after ship.
5048

5149
A change **promotes** its conclusions into the affected
5250
`architecture/<capability>.md` by hand **in the implementing PR, alongside the
5351
code** — the edit rides in the same diff and is reviewed with it, never applied
5452
as a separate post-merge step. That hand-edit is what keeps `architecture/`
55-
true; the bundle stays in `changes/` as the *why*.
53+
true; the change file stays in `changes/` as the *why*.
5654

57-
### Change bundles
55+
### Glossary
5856

59-
A change is a folder `changes/YYYY-MM-DD.NN-<slug>/`:
57+
`architecture/glossary.md` is the project's **ubiquitous language** — one page
58+
defining the domain terms that code, specs, and capability pages all share. Like
59+
the capability files beside it, it is living prose with **no frontmatter**, dated
60+
by git, and authored lazily: it appears when the first term is worth pinning down.
61+
62+
Each entry is a term, a one-or-two-sentence definition of what it *is* (not what
63+
it does), and an optional `_Avoid_:` line naming the synonyms to reject:
64+
65+
```md
66+
**Timer**:
67+
A scheduled future delivery, identified by a timer id.
68+
_Avoid_: job, task, alarm
69+
```
70+
71+
Keep it a glossary, not a spec — no implementation detail. A change that
72+
introduces or sharpens a term updates `glossary.md` in the same PR, the same way
73+
a behavior change promotes into a capability file.
74+
75+
### Change files
76+
77+
A change is a file `changes/YYYY-MM-DD.NN-<slug>.md`:
6078

6179
- `YYYY-MM-DD` — proposal date; `.NN` — zero-padded intra-day counter
6280
(`.01`, `.02`, …) that breaks same-date ties so the timeline sorts stably.
@@ -65,25 +83,44 @@ A change is a folder `changes/YYYY-MM-DD.NN-<slug>/`:
6583
`summary` is written when the change is created (the intent one-liner) and
6684
**finalized at ship** to state the realized result — set in the implementing
6785
PR, alongside the code and the `architecture/` promotion. No post-merge
68-
bookkeeping, no folder move. `date` and `slug` are never written — they are
69-
read from the bundle's directory name.
86+
bookkeeping, no file move. `date` and `slug` are never written — they are
87+
read from the file name.
7088

7189
### Three lanes
7290

7391
| Lane | Artifacts | Use when |
7492
|------|-----------|----------|
75-
| **Full** | `design.md` + `plan.md` | design judgment; new file/module; public-API change; cross-cutting/multi-file; non-trivial test design |
76-
| **Lightweight** | `change.md` | small-but-real: ≲30 LOC net, ≤2 files, no new file, no public-API change, single straightforward test |
93+
| **Full** | one change file from the design template | design judgment; new file/module; public-API change; cross-cutting/multi-file; non-trivial test design |
94+
| **Lightweight** | one change file from the change template | small-but-real: ≲30 LOC net, ≤2 files, no new file, no public-API change, single straightforward test |
7795
| **Tiny** | none — conventional commit | typo, dep bump, linter/formatter/CI tweak, mechanical rename, single-line config |
7896

79-
Heavier lane wins on ambiguity. A `change.md` that outgrows its lane splits
80-
into `design.md` + `plan.md`.
97+
Heavier lane wins on ambiguity. A lightweight change file that outgrows its lane is rewritten from the design template.
98+
99+
### Plans are ephemeral
100+
101+
The executable plan — task checklists, embedded code, commit sequences,
102+
whatever the executor needs — is a working artifact, not history. Keep it out
103+
of `changes/` and out of version control (git-ignored scratch, e.g.
104+
`.superpowers/`). Once the change ships, the diff and the PR are the record
105+
of execution; a committed plan duplicates them. `check-planning` rejects
106+
anything in `changes/` that is not a flat change file.
107+
108+
### Lean specs
109+
110+
The change file is the single home of a change's rationale:
111+
112+
- The PR body summarizes and links to the change file — it never restates it.
113+
- Rejected alternatives live in `decisions/` and are referenced, not retold.
114+
- Show a sketch when the design needs code; never the full diff-to-be.
115+
- Delete template sections that don't apply — an empty section is ceremony.
116+
- Most designs fit well under ~700 words; length must buy information.
81117

82118
### Artifacts at a glance
83119

84-
- **`design.md`** — the spec: the *thinking* (why, design, trade-offs, scope).
85-
- **`plan.md`** — the plan: the *sequencing* (the executor's task checklist).
86-
- **`change.md`** — both, condensed, for the lightweight lane.
120+
- **design template** — the spec: the *thinking* (why, design, trade-offs,
121+
scope); the change file it produces is the single home of rationale (see
122+
[Lean specs](#lean-specs)).
123+
- **change template** — the condensed spec for the lightweight lane.
87124
- **`releases/<semver>.md`** — per-release user-facing notes.
88125
- **`audits/<date>-<slug>.md`** — findings from a code/docs/bug-hunt sweep;
89126
spawns fix changes.
@@ -97,11 +134,10 @@ Templates live in [`_templates/`](_templates/).
97134

98135
### Frontmatter
99136

100-
`date` and `slug` are **derived from the directory / file name** — never
137+
`date` and `slug` are **derived from the file name** — never
101138
repeated in frontmatter. So:
102139

103-
- `design.md` / `change.md`: `summary` (single line) only.
104-
- `plan.md`: **no frontmatter** — its identity is the bundle directory.
140+
- `changes/*.md`: `summary` (single line) only.
105141
- `decisions/*.md`: `status` (accepted|superseded), `summary`, and optional
106142
`supersedes` / `superseded_by`.
107143
- Files in `architecture/` carry **no** frontmatter — living prose, dated by git.
@@ -113,8 +149,8 @@ only field the index renders.
113149
## Index
114150

115151
The listing is **generated**, not maintained — run `just index` to print it:
116-
changes as a flat newest-first list, then decisions newest-first. Each bundle's
117-
`summary` frontmatter (and the directory name, which supplies `date`/`slug`) is
152+
changes as a flat newest-first list, then decisions newest-first. Each change's
153+
`summary` frontmatter (and the file name, which supplies `date`/`slug`) is
118154
the single source of truth; there is no committed copy to drift.
119155

120156
## Other

‎planning/_templates/change.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ summary: One line — shown in the generated index. Written at creation; finaliz
55
# Change: One-line capitalized title
66

77
**Lane:** lightweight — ≲30 LOC net, ≤2 files, no new file, no public-API
8-
change, a single straightforward test. If it outgrows this, split into
9-
`design.md` + `plan.md`.
8+
change, a single straightforward test. If it outgrows this, rewrite it from
9+
the design template.
1010

1111
## Goal
1212

‎planning/_templates/design.md‎

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ summary: One line — shown in the generated index. Written at creation; finaliz
44

55
# Design: One-line capitalized title
66

7+
<!-- The single home of this change's rationale: the PR body summarizes and
8+
links here, never restates. Delete any section that doesn't apply — an empty
9+
section is ceremony. Most designs fit well under ~700 words. -->
10+
711
## Summary
812

913
One paragraph. What changes, at the level a reader needs to decide if this
@@ -12,37 +16,23 @@ spec is worth reading in full.
1216
## Motivation
1317

1418
Why now. What is broken or missing. Concrete observations / numbers, not
15-
abstract complaints. Link to memory entries or earlier specs when relevant.
16-
17-
## Non-goals
18-
19-
What is deliberately out of scope and (when nontrivial) why. Each item is
20-
a sentence; one line each.
19+
abstract complaints.
2120

2221
## Design
2322

24-
### 1. <First piece>
25-
2623
What changes, in enough detail that a reader who has not seen the codebase
27-
can follow. Code samples / diagrams welcome.
24+
can follow. Sketches and interface fragments welcome; never the full
25+
diff-to-be. Reference rejected alternatives in `decisions/` instead of
26+
retelling them.
2827

29-
### 2. <Second piece>
30-
31-
...
32-
33-
## Operations
34-
35-
Out-of-repo steps (DNS, infra, external account changes). Omit if none.
36-
37-
## Out of scope
28+
## Non-goals
3829

39-
Already covered above under Non-goals if appropriate. Repeat-list of
40-
explicitly-excluded follow-ups belongs here when the list is long.
30+
What is deliberately out of scope and (when nontrivial) why. One line each.
4131

4232
## Testing
4333

44-
How we know it landed correctly. New pytest? Smoke check on live URL?
45-
Lint pass? Be specific.
34+
How we know it landed correctly. Be specific: the command and the expected
35+
signal.
4636

4737
## Risk
4838

‎planning/_templates/glossary.md‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# Glossary
2+
3+
The project's ubiquitous language — the domain terms that code, specs, and
4+
capability pages share. Living prose, no frontmatter, dated by git. Each entry is
5+
a term, what it *is* (not what it does), and the synonyms to avoid. No
6+
implementation detail; this is a glossary, not a spec.
7+
8+
**Term**:
9+
A one-or-two-sentence definition of what it is.
10+
_Avoid_: rejected-synonym, another-one
11+
12+
**Another term**:
13+
Define what it is, tightly. Group related terms under `##` subheadings when
14+
natural clusters emerge; a flat list is fine when they don't.
15+
_Avoid_: …

‎planning/_templates/plan.md‎

Lines changed: 0 additions & 46 deletions
This file was deleted.

planning/changes/2026-05-31.01-bmad-to-superpowers-transition/design.md renamed to planning/changes/2026-05-31.01-bmad-to-superpowers-transition.md

File renamed without changes.

0 commit comments

Comments
 (0)