Skip to content

Commit 9302850

Browse files
lesnik512claude
andcommitted
chore: adopt canonical planning convention
Vendor index.py + _templates/ verbatim from lesnik512/planning-convention (v1.0.0), slim every bundle's frontmatter to the lean form (summary-only specs; plans carry none; date/slug derived from the dir/file name), rewrite planning/README.md to the canonical Quick-path + Conventions prose, wire the planning validator into just lint-ci, add a check-planning recipe, record the applied version in planning/.convention-version. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 8e56248 commit 9302850

114 files changed

Lines changed: 209 additions & 862 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.

Justfile

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,16 @@ lint-ci:
1515
uv run ruff format --check
1616
uv run ruff check --no-fix
1717
uv run ty check
18+
uv run python planning/index.py --check
1819

19-
# Print the planning change index (grouped by status) to stdout.
20+
# Print the planning change index (flat, newest-first) to stdout.
2021
index:
2122
uv run python planning/index.py
2223

24+
# Validate planning bundles + decisions; CI runs this via lint-ci.
25+
check-planning:
26+
uv run python planning/index.py --check
27+
2328
test *args:
2429
uv run --no-sync pytest {{ args }}
2530

planning/.convention-version

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
1.0.0

planning/README.md

Lines changed: 57 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,42 @@ Specs, plans, and change history for `httpware`. The living truth about
44
*what the system does now* lives in [`architecture/`](../architecture/) at
55
the repo root; this directory records *how it got there*.
66

7+
## Quick path (start here)
8+
9+
> The fast lane for making a change. The full reference is in
10+
> [Conventions](#conventions) below — read it only when this isn't enough.
11+
12+
**1. Choose a lane — first matching rule wins:**
13+
14+
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`)
17+
2. Purely mechanical: typo · dep bump · linter/formatter/CI tweak ·
18+
mechanical rename · single-line config → **Tiny** (no bundle, conventional
19+
commit)
20+
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`)
23+
24+
Ambiguous between two? Take the heavier. A `change.md` that outgrows its lane
25+
splits into `design.md` + `plan.md`.
26+
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
30+
[`_templates/`](_templates/).
31+
32+
**3. Ship in the implementing PR:** hand-edit the affected
33+
`architecture/<capability>.md`, finalize the bundle's `summary:` to the
34+
realized result, and run `just check-planning` before pushing.
35+
736
## Conventions
837

9-
> This section is the portable convention — identical across the
10-
> modern-python repos. The generated change listing (`just index`) and the `## Other` pointers below are repo-local. To adopt elsewhere,
11-
> copy this section plus [`_templates/`](_templates/) and point that repo's
12-
> `CLAUDE.md` Workflow + truth home at it.
38+
> This is the portable convention, sourced from the canonical repo
39+
> [`lesnik512/planning-convention`](https://github.com/lesnik512/planning-convention)
40+
> (applied version in [`.convention-version`](.convention-version)). To update
41+
> it, run that repo's `APPLY.md` flow. The generated change index (`just index`)
42+
> and the `## Other` pointers below are repo-local.
1343
1444
### Two axes, never mixed
1545

@@ -32,10 +62,11 @@ A change is a folder `changes/YYYY-MM-DD.NN-<slug>/`:
3262
(`.01`, `.02`, …) that breaks same-date ties so the timeline sorts stably.
3363
- `<slug>` — kebab-case description, not a story ID.
3464

35-
`summary` is written when the change is created (it is the change's
36-
one-liner). The implementing PR then sets `status: shipped` and fills `pr`
37-
and `outcome` **in the branch**, alongside the code and the `architecture/`
38-
promotion — no post-merge bookkeeping, no folder move.
65+
`summary` is written when the change is created (the intent one-liner) and
66+
**finalized at ship** to state the realized result — set in the implementing
67+
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.
3970

4071
### Three lanes
4172

@@ -53,32 +84,38 @@ into `design.md` + `plan.md`.
5384
- **`design.md`** — the spec: the *thinking* (why, design, trade-offs, scope).
5485
- **`plan.md`** — the plan: the *sequencing* (the executor's task checklist).
5586
- **`change.md`** — both, condensed, for the lightweight lane.
56-
- **`decisions/<YYYY-MM-DD>-<slug>.md`** — one file per design decision taken
57-
(especially options *rejected*), each with a revisit trigger, so reviews don't
58-
re-litigate them; listed by `just index`.
5987
- **`releases/<semver>.md`** — per-release user-facing notes.
6088
- **`audits/<date>-<slug>.md`** — findings from a code/docs/bug-hunt sweep;
6189
spawns fix changes.
6290
- **`retros/<date>-<slug>.md`** — what we learned after a body of work.
6391
- **`deferred.md`** — real-but-unscheduled items, each with a revisit trigger.
92+
- **`decisions/<YYYY-MM-DD>-<slug>.md`** — one file per design decision taken
93+
(especially options *rejected*), each with a revisit trigger; listed by
94+
`just index`.
6495

6596
Templates live in [`_templates/`](_templates/).
6697

6798
### Frontmatter
6899

69-
`design.md` / `change.md`: `status` (draft|approved|shipped|superseded),
70-
`date`, `slug`, `summary` (single line), `supersedes`, `superseded_by`, `pr`,
71-
`outcome`. `plan.md`: `status`, `date`, `slug`, `spec`, `pr`.
72-
`decisions/*.md`: `status` (accepted|superseded), `date`, `slug`, `summary`,
73-
`supersedes`, `superseded_by`, `pr`.
74-
Files in `architecture/` carry **no** frontmatter — living prose, dated by git.
100+
`date` and `slug` are **derived from the directory / file name** — never
101+
repeated in frontmatter. So:
102+
103+
- `design.md` / `change.md`: `summary` (single line) only.
104+
- `plan.md`: **no frontmatter** — its identity is the bundle directory.
105+
- `decisions/*.md`: `status` (accepted|superseded), `summary`, and optional
106+
`supersedes` / `superseded_by`.
107+
- Files in `architecture/` carry **no** frontmatter — living prose, dated by git.
108+
109+
**`summary`** is one line: written at creation as the intent, then **finalized
110+
at ship** to state the realized result — what shipped and its effect. It is the
111+
only field the index renders.
75112

76113
## Index
77114

78115
The listing is **generated**, not maintained — run `just index` to print it:
79-
changes grouped by `status` (In progress / Shipped / Superseded), then
80-
decisions newest-first. The frontmatter in each bundle / decision file is the
81-
single source of truth; there is no committed copy to drift.
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
118+
the single source of truth; there is no committed copy to drift.
82119

83120
## Other
84121

planning/_templates/change.md

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,5 @@
11
---
2-
status: draft
3-
date: YYYY-MM-DD
4-
slug: my-change
5-
summary: One line — shown in the generated index. Fill at ship time.
6-
supersedes: null
7-
superseded_by: null
8-
pr: null
9-
outcome: null
2+
summary: One line — shown in the generated index. Written at creation; finalize at ship to state the realized result.
103
---
114

125
# Change: One-line capitalized title

planning/_templates/decision.md

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
---
22
status: accepted # accepted | superseded
3-
date: YYYY-MM-DD
4-
slug: my-decision
53
summary: One line — shown in `just index`.
64
supersedes: null
75
superseded_by: null
8-
pr: null # PR/commit where the decision was made or recorded
96
---
107

118
# One-line capitalized title

planning/_templates/design.md

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,5 @@
11
---
2-
status: draft
3-
date: YYYY-MM-DD
4-
slug: my-change
5-
summary: One line — shown in the generated index. Fill at ship time.
6-
supersedes: null
7-
superseded_by: null
8-
pr: null
9-
outcome: null
2+
summary: One line — shown in the generated index. Written at creation; finalize at ship to state the realized result.
103
---
114

125
# Design: One-line capitalized title

planning/_templates/plan.md

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,3 @@
1-
---
2-
status: draft
3-
date: YYYY-MM-DD
4-
slug: my-change
5-
spec: my-change
6-
pr: null
7-
---
8-
91
# <slug> — implementation plan
102

113
> **For agentic workers:** REQUIRED SUB-SKILL: Use
@@ -46,9 +38,7 @@ in the spec.
4638

4739
```bash
4840
git add path/to/file.py
49-
git commit -m "<type>: <subject>
50-
51-
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"
41+
git commit -m "<type>: <subject>"
5242
```
5343

5444
---

planning/_templates/release.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# modern-di <version> — <one-line headline>
2+
3+
<One or two sentences: what this release is and its headline change. Say up
4+
front if there are no behavior/API changes.>
5+
6+
<!-- Keep only the sections that apply; reorder/rename freely. A tiny release
7+
may be just the title + one section. Versioning is tag-driven — the
8+
release tag sets the version (`just publish` runs `uv version`), so there
9+
is no pyproject bump. -->
10+
11+
## Feature
12+
13+
- **<name>.** What it adds and how to use it.
14+
15+
## Fix
16+
17+
- **<name>.** What was broken, now fixed (reference the issue/regression).
18+
19+
## Internal refactors
20+
21+
- **<name>.** What changed under the hood, stated as no behavior change.
22+
23+
## Packaging
24+
25+
- Metadata / build / dependency changes visible to installers.
26+
27+
## Why
28+
29+
Context a reader needs for the headline change. Omit for small releases.
30+
31+
## Downstream
32+
33+
What integrations (FastAPI, Litestar, FastStream, Typer, `modern-di-pytest`)
34+
must do — e.g. bump their `modern-di` floor — or "No action needed" when there
35+
is no API change.
36+
37+
## Internals
38+
39+
- Coverage / tooling notes (e.g. 100% line coverage across Python 3.10–3.14).

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

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,5 @@
11
---
2-
status: shipped
3-
date: 2026-05-31
4-
slug: bmad-to-superpowers-transition
52
summary: Bootstrapped the planning workflow
6-
supersedes: null
7-
superseded_by: null
8-
pr: 6
9-
outcome: 'Bootstrapped the planning workflow'
103
---
114

125
# bmad → superpowers transition (design)

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

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,3 @@
1-
---
2-
status: shipped
3-
date: 2026-05-31
4-
slug: bmad-to-superpowers-transition
5-
spec: bmad-to-superpowers-transition
6-
pr: 6
7-
---
8-
91
# bmad → superpowers transition Implementation Plan
102

113
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.

0 commit comments

Comments
 (0)