Skip to content
Merged
10 changes: 6 additions & 4 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,11 @@ if it's clean, push a fresh commit to force GitHub to recompute the merge ref.
## Workflow

Planning follows the convention in [`planning/README.md`](planning/README.md) —
its **Quick path** is authoritative. Pick a lane (Full = `design.md` + `plan.md`,
Lightweight = `change.md`, Tiny = conventional commit), create a bundle under
`planning/changes/YYYY-MM-DD.NN-<slug>/` from `planning/_templates/`, and run
its **Quick path** is authoritative. Pick a lane (Full = a change file from the
design template, Lightweight = a change file from the change template, Tiny =
conventional commit), create the change file at
`planning/changes/YYYY-MM-DD.NN-<slug>.md` from `planning/_templates/`, keep the
executor's plan in git-ignored scratch (`.superpowers/`), and run
`just check-planning` before pushing. The applied convention version is in
`planning/.convention-version`; update it via the canonical repo's `APPLY.md`.

Expand All @@ -68,5 +70,5 @@ Lightweight = `change.md`, Tiny = conventional commit), create a bundle under
`architecture/` (repo root) is the living truth about what this repo does now —
one file per capability plus `glossary.md`, no frontmatter, authored lazily.
**When a change alters a capability's behavior, update the matching
`architecture/<capability>.md` in the same PR.** The change bundle in
`architecture/<capability>.md` in the same PR.** The change file in
`planning/changes/` stays as the *why*.
2 changes: 1 addition & 1 deletion architecture/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ language). These files carry **no frontmatter** and are dated by git.

**Promotion rule:** when a change alters a capability's behavior, hand-edit the
matching `architecture/<capability>.md` in the **same PR** as the code — the edit
rides in the same diff and is reviewed with it. The change bundle in
rides in the same diff and is reviewed with it. The change file in
`planning/changes/` stays as the *why*; this directory stays *true*.

Capability files and `glossary.md` are authored **lazily** — each appears when the
Expand Down
2 changes: 1 addition & 1 deletion planning/.convention-version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.1.1
2.0.0
71 changes: 43 additions & 28 deletions planning/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
This repo's planning home, following the portable two-axis convention from
[`lesnik512/planning-convention`](https://github.com/lesnik512/planning-convention)
(applied version in [`.convention-version`](.convention-version)). `architecture/`
(repo root) holds the living truth about what the system does now; the bundles in
(repo root) holds the living truth about what the system does now; the change files in
[`changes/`](changes/) record how it got there. To update the convention itself,
re-run that repo's `APPLY.md` flow.

Expand All @@ -15,25 +15,22 @@ re-run that repo's `APPLY.md` flow.
**1. Choose a lane — first matching rule wins:**

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

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

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

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

## Conventions
Expand All @@ -49,14 +46,14 @@ realized result, and run `just check-planning` before pushing.
- **`architecture/` (repo root) — the present.** One file per capability, plus
a single `glossary.md` (the ubiquitous language); living prose, updated in the
same PR that ships the change. The truth home.
- **`planning/changes/` — the past-and-pending.** One folder per change,
- **`planning/changes/` — the past-and-pending.** One file per change,
kept in place after ship.

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

### Glossary

Expand All @@ -78,9 +75,9 @@ Keep it a glossary, not a spec — no implementation detail. A change that
introduces or sharpens a term updates `glossary.md` in the same PR, the same way
a behavior change promotes into a capability file.

### Change bundles
### Change files

A change is a folder `changes/YYYY-MM-DD.NN-<slug>/`:
A change is a file `changes/YYYY-MM-DD.NN-<slug>.md`:

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

### Three lanes

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

Heavier lane wins on ambiguity. A `change.md` that outgrows its lane splits
into `design.md` + `plan.md`.
Heavier lane wins on ambiguity. A lightweight change file that outgrows its lane is rewritten from the design template.

### Plans are ephemeral

The executable plan — task checklists, embedded code, commit sequences,
whatever the executor needs — is a working artifact, not history. Keep it out
of `changes/` and out of version control (git-ignored scratch, e.g.
`.superpowers/`). Once the change ships, the diff and the PR are the record
of execution; a committed plan duplicates them. `check-planning` rejects
anything in `changes/` that is not a flat change file.

### Lean specs

The change file is the single home of a change's rationale:

- The PR body summarizes and links to the change file — it never restates it.
- Rejected alternatives live in `decisions/` and are referenced, not retold.
- Show a sketch when the design needs code; never the full diff-to-be.
- Delete template sections that don't apply — an empty section is ceremony.
- Most designs fit well under ~700 words; length must buy information.

### Artifacts at a glance

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

### Frontmatter

`date` and `slug` are **derived from the directory / file name** — never
`date` and `slug` are **derived from the file name** — never
repeated in frontmatter. So:

- `design.md` / `change.md`: `summary` (single line) only.
- `plan.md`: **no frontmatter** — its identity is the bundle directory.
- `changes/*.md`: `summary` (single line) only.
- `decisions/*.md`: `status` (accepted|superseded), `summary`, and optional
`supersedes` / `superseded_by`.
- Files in `architecture/` carry **no** frontmatter — living prose, dated by git.
Expand Down
4 changes: 2 additions & 2 deletions planning/_templates/change.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ summary: One line — shown in the generated index. Written at creation; finaliz
# Change: One-line capitalized title

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

## Goal

Expand Down
34 changes: 12 additions & 22 deletions planning/_templates/design.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ summary: One line — shown in the generated index. Written at creation; finaliz

# Design: One-line capitalized title

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

## Summary

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

Why now. What is broken or missing. Concrete observations / numbers, not
abstract complaints. Link to memory entries or earlier specs when relevant.

## Non-goals

What is deliberately out of scope and (when nontrivial) why. Each item is
a sentence; one line each.
abstract complaints.

## Design

### 1. <First piece>

What changes, in enough detail that a reader who has not seen the codebase
can follow. Code samples / diagrams welcome.
can follow. Sketches and interface fragments welcome; never the full
diff-to-be. Reference rejected alternatives in `decisions/` instead of
retelling them.

### 2. <Second piece>

...

## Operations

Out-of-repo steps (DNS, infra, external account changes). Omit if none.

## Out of scope
## Non-goals

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

## Testing

How we know it landed correctly. New pytest? Smoke check on live URL?
Lint pass? Be specific.
How we know it landed correctly. Be specific: the command and the expected
signal.

## Risk

Expand Down
46 changes: 0 additions & 46 deletions planning/_templates/plan.md

This file was deleted.

Loading