Skip to content

Commit 45132c3

Browse files
lesnik512claude
andauthored
chore(planning): flatten changes/ + generated index (#74)
* chore(planning): flatten changes/ + backfill summary + rewrite cross-links Move all bundles from changes/archive/ to changes/ (flat), remove active/.gitkeep and archive/.gitkeep, backfill summary: in all 55 bundle frontmatters, and rewrite bundle-path archive/ links in 6 plan/design files to the flat path. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(planning): add index.py generator and just index recipe Copy planning/index.py verbatim from faststream-outbox (stdlib only, no PyYAML). Extend the top noqa line to add D212 for this repo's ruff config. Add the `just index` recipe to Justfile after lint-ci. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(planning): update README Conventions/Index + templates with summary field Replace ## Conventions through end of ## Index with the portable shipped convention from faststream-outbox (generated Index, no committed copy). Keep repo intro (lines 1-6) and ## Other section intact. Add summary: field to both design.md and change.md templates. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(docs): update CLAUDE.md workflow for flat changes/ (no folder move) Replace active/<id>/ with <id>/ in the workflow line. Replace the archive-move instruction with set status/pr/outcome in-branch + run just index. Also update the "Where to find what" pointer that still referenced {active,archive}. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(planning): repair release/audit links to flattened bundles The flatten rewrote bundle-path links inside planning/changes/ but missed links in planning/releases/ and planning/audits/ pointing at the old changes/archive/<bundle>/ paths. Repoint them to the flat changes/<bundle>/. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(planning): drop obsolete convention-migration plan.md The migration plan held one-time setup commands referencing the old changes/archive/ layout (now flat). Its design.md remains as the convention rationale and the indexed entry; the obsolete plan is removed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 5841316 commit 45132c3

115 files changed

Lines changed: 281 additions & 734 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,14 +10,14 @@ Guidance for AI agents (Claude Code, etc.) working in this repository.
1010

1111
- [`architecture/`](architecture/) (repo root) — the per-capability living truth (overview, client, middleware, decoders, errors, resilience, optional extras, testing); the promotion target on every ship. **Read the relevant file before changing that capability.**
1212
- [`planning/README.md`](planning/README.md) — the planning conventions (two axes, change bundles, three lanes, frontmatter) + the change Index.
13-
- [`planning/changes/{active,archive}/<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>/`](planning/changes/) — per-change bundles (`design.md` + `plan.md`, or `change.md` for the lightweight lane).
1414
- [`planning/audits/`](planning/audits/) — findings reports + `scripts/` tooling.
1515
- [`planning/retros/`](planning/retros/) — retrospectives.
1616
- [`planning/releases/`](planning/releases/) — per-version release notes (also published on GitHub Releases).
1717
- [`planning/deferred.md`](planning/deferred.md) — review-surfaced, not-yet-actionable items.
1818
- [`planning/_templates/`](planning/_templates/) — design/plan/change templates.
1919

20-
**Per-feature workflow:** brainstorming → `design.md` in `planning/changes/active/<id>/` → writing-plans → `plan.md` in the same bundle → executing-plans (or subagent-driven-development) → requesting-code-review → finishing-a-development-branch. On ship, promote the conclusions into the affected `architecture/<capability>.md` by hand and move the bundle to `planning/changes/archive/`. Topic slugs are kebab-case descriptions (`msgspec-decoder-adapter`), not story IDs.
20+
**Per-feature workflow:** brainstorming → `design.md` in `planning/changes/<id>/` → writing-plans → `plan.md` in the same bundle → executing-plans (or subagent-driven-development) → requesting-code-review → finishing-a-development-branch. On ship, promote the conclusions into the affected `architecture/<capability>.md` by hand and set `status: shipped` + `pr` + `outcome` in the implementing PR — there is no folder move. The change listing is generated: run `just index`. Topic slugs are kebab-case descriptions (`msgspec-decoder-adapter`), not story IDs.
2121

2222
## Commands
2323

Justfile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ lint-ci:
1616
uv run ruff check --no-fix
1717
uv run ty check
1818

19+
# Print the planning change index (grouped by status) to stdout.
20+
index:
21+
uv run python planning/index.py
22+
1923
test *args:
2024
uv run --no-sync pytest {{ args }}
2125

planning/README.md

Lines changed: 20 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -7,33 +7,35 @@ the repo root; this directory records *how it got there*.
77
## Conventions
88

99
> This section is the portable convention — identical across the
10-
> modern-python repos. The Index below is repo-specific. To adopt elsewhere,
10+
> modern-python repos. The generated change listing (`just index`) and the `## Other` pointers below are repo-local. To adopt elsewhere,
1111
> copy this section plus [`_templates/`](_templates/) and point that repo's
1212
> `CLAUDE.md` Workflow + truth home at it.
1313
1414
### Two axes, never mixed
1515

1616
- **`architecture/` (repo root) — the present.** One file per capability,
17-
living prose, updated whenever a change ships. The truth home.
17+
living prose, updated in the same PR that ships the change. The truth home.
1818
- **`planning/changes/` — the past-and-pending.** One folder per change,
19-
frozen once shipped.
19+
kept in place after ship.
2020

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

2627
### Change bundles
2728

28-
A change is a folder `changes/active/YYYY-MM-DD.NN-<slug>/`:
29+
A change is a folder `changes/YYYY-MM-DD.NN-<slug>/`:
2930

3031
- `YYYY-MM-DD` — proposal date; `.NN` — zero-padded intra-day counter
3132
(`.01`, `.02`, …) that breaks same-date ties so the timeline sorts stably.
3233
- `<slug>` — kebab-case description, not a story ID.
3334

34-
On merge the folder moves to `changes/archive/` with `status: shipped`, `pr:`,
35-
and `outcome:` filled, and its line moves from **Active** to **Archived** in
36-
the Index below.
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.
3739

3840
### Three lanes
3941

@@ -62,75 +64,16 @@ Templates live in [`_templates/`](_templates/).
6264
### Frontmatter
6365

6466
`design.md` / `change.md`: `status` (draft|approved|shipped|superseded),
65-
`date`, `slug`, `supersedes`, `superseded_by`, `pr`, `outcome`.
66-
`plan.md`: `status`, `date`, `slug`, `spec`, `pr`. Files in `architecture/`
67-
carry **no** frontmatter — living prose, dated by git.
67+
`date`, `slug`, `summary` (single line), `supersedes`, `superseded_by`, `pr`,
68+
`outcome`. `plan.md`: `status`, `date`, `slug`, `spec`, `pr`. Files in
69+
`architecture/` carry **no** frontmatter — living prose, dated by git.
6870

6971
## Index
7072

71-
### Active
72-
73-
_None._
74-
75-
### Archived (shipped)
76-
77-
- **[delta-audit-followups](changes/archive/2026-06-16.04-delta-audit-followups/change.md)** (#71, 2026-06-16) — Closed the [2026-06-16 delta audit](audits/2026-06-16-delta-audit.md) Low findings: rate-mode HALF_OPEN probe-failure re-open test + document-as-intended note. Tests + doc only, no release.
78-
79-
- **[circuit-breaker-state](changes/archive/2026-06-16.03-circuit-breaker-state/design.md)** (#70, 2026-06-16) — Read-only `state` property + public `CircuitState` enum on the circuit breaker. Shipped 0.14.0; closed the read-only-state half of the deferred CircuitBreaker introspection item.
80-
81-
- **[circuit-breaker-rate-mode](changes/archive/2026-06-16.02-circuit-breaker-rate-mode/design.md)** (#69, 2026-06-16) — Added an opt-in time-based failure-rate trip mode to the circuit breaker (classic stays default). Shipped 0.13.0; closed deferred item "CircuitBreaker v2 (a)".
82-
- **[per-verb-with-response](changes/archive/2026-06-16.01-per-verb-with-response/design.md)** (#68, 2026-06-16) — Added `get_with_response``request_with_response` siblings (required `response_model`, returns `(Response, T)`) to both clients. Shipped 0.12.0; closed the deferred "Per-verb-with-response siblings" item.
83-
- **[custom-decoder-guide](changes/archive/2026-06-15.01-custom-decoder-guide/change.md)** (#67, 2026-06-15) — Docs: a "write your own `ResponseDecoder`" guide for Seam B, mirroring `docs/middleware.md`. Closed deferred item G6.
84-
- **[audit-doc-fixes](changes/archive/2026-06-14.06-audit-doc-fixes/change.md)** (#66, 2026-06-14) — Closed the [deep-audit](audits/2026-06-14-deep-audit.md) doc-accuracy findings: `Client.stream()` docs, terminal-call attribution, the four auto-raise sites, the pydantic upper bound, and root import paths.
85-
- **[audit-test-quality](changes/archive/2026-06-14.05-audit-test-quality/change.md)** (#65, 2026-06-14) — Closed 11 [deep-audit](audits/2026-06-14-deep-audit.md) test-quality findings: sync-terminal + CookieConflict coverage, the `StatusError.__init__` invariant, missing status constructions, sync mirrors, typing overloads, a deterministic bulkhead barrier, a pinned budget clock, an observability assertion, and the `TimeoutError` circuit trigger.
86-
- **[audit-correctness](changes/archive/2026-06-14.04-audit-correctness/change.md)** (#64, 2026-06-14) — Closed 8 [deep-audit](audits/2026-06-14-deep-audit.md) correctness + public-API findings: RetryBudget token ordering, two `OverflowError` crashes, the redaction triple-slash, the msgspec guard, streaming-body symmetry, the RetryBudget docstring caveat, and `middleware/__all__`.
87-
- **[security-hardening](changes/archive/2026-06-14.03-security-hardening/design.md)** (#63, 2026-06-14) — Closed the [deep-audit](audits/2026-06-14-deep-audit.md) security cluster: URL secret redaction centralized at the `_emit_event` chokepoint (userinfo + sensitive query/fragment keys), opt-in `max_error_body_bytes` + `ResponseTooLargeError` bounding the `stream()` error pre-read, and `trust_env` + header-reachability docs. Non-streaming hard body cap deferred.
88-
- **[pydantic-import-isolation](changes/archive/2026-06-14.02-pydantic-import-isolation/change.md)** (#62, 2026-06-14) — Guarded the pydantic import so the decoder module loads without the extra and the `architecture/extras.md` Seam-C invariant holds for pydantic. Closed the [deep-audit](audits/2026-06-14-deep-audit.md) High + 2 folded Mediums.
89-
- **[deep-audit](changes/archive/2026-06-14.01-deep-audit/design.md)** (2026-06-14) — Full-codebase deep audit (perf/security/supply-chain gaps + correctness/concurrency/refactoring/test quality). [Report](audits/2026-06-14-deep-audit.md): 35 confirmed; all remediated across #62#66 (non-streaming hard body cap deferred).
90-
- **[docs-ux-restructure](changes/archive/2026-06-14.01-docs-ux-restructure/design.md)** (#60, 2026-06-14) — Thin README front-door + canonical `docs/index.md` (G3), why-httpware hook (G1), runnable jsonplaceholder example (G4), nav reorder + architecture links, base-client scrub. G2 dropped; G6 (decoder guide) still open.
91-
- **[docs-audit-followups](changes/archive/2026-06-13.05-docs-audit-followups/change.md)** (#58, 2026-06-13) — Second docs-audit batch: corrected the overstated invariant-enforcement claims in `CLAUDE.md` + `architecture/overview.md` (only `print()`/blanket-`type: ignore` are machine-checked), readability findings R1–R3, and documented the public `STATUS_TO_EXCEPTION` (G5).
92-
- **[docs-accuracy-fixes](changes/archive/2026-06-13.04-docs-accuracy-fixes/change.md)** (f203821, 2026-06-13) — Fixed 5 verified factual errors from the [docs audit](audits/2026-06-13-docs-audit.md): RetryBudget formula, modern-di 2.x recipe, contributing-doc CI/grep claim, `just lint` comment, middleware stable-contracts list (+ AsyncTimeout non-finite wording).
93-
- **[portable-planning-convention](changes/archive/2026-06-13.03-portable-planning-convention/design.md)** (#55, 2026-06-13) — Adopt the portable two-axis convention: per-capability `architecture/` truth files + `changes/` bundles, full history backfill, byte-identical Conventions.
94-
- **[circuit-breaker-and-timeout](changes/archive/2026-06-13.02-circuit-breaker-and-timeout/design.md)** (#51, 2026-06-13) — Shipped 0.10.0 — CircuitBreaker + AsyncTimeout
95-
- **[msgspec-nested-customtype-fix](changes/archive/2026-06-13.01-msgspec-nested-customtype-fix/design.md)** (#43, 2026-06-13) — Shipped 0.9.1 — nested-CustomType guard
96-
- **[delta-audit](changes/archive/2026-06-12.01-delta-audit/design.md)** (#43, 2026-06-12) — 0.9.0 delta audit; closed via 0.9.1
97-
- **[decoder-instance-cache](changes/archive/2026-06-10.02-decoder-instance-cache/design.md)** (#42, 2026-06-10) — Shipped 0.9.0 — per-instance decoder cache
98-
- **[multi-decoder](changes/archive/2026-06-10.01-multi-decoder/design.md)** (#41, 2026-06-10) — Shipped 0.9.0 — multi-decoder routing
99-
- **[readme-link-cleanup](changes/archive/2026-06-08.08-readme-link-cleanup/design.md)** (#39, 2026-06-08) — README link cleanup
100-
- **[mkdocs-gh-pages-migration](changes/archive/2026-06-08.07-mkdocs-gh-pages-migration/design.md)** (#38, 2026-06-08) — Docs host -> GitHub Pages
101-
- **[test-mop-up](changes/archive/2026-06-08.06-test-mop-up/design.md)** (#37, 2026-06-08) — Shipped 0.8.6 — test-only audit findings
102-
- **[small-fixes-mop-up](changes/archive/2026-06-08.05-small-fixes-mop-up/design.md)** (#36, 2026-06-08) — Shipped 0.8.5 — 4 small audit findings
103-
- **[otel-partial-install](changes/archive/2026-06-08.04-otel-partial-install/design.md)** (#35, 2026-06-08) — Shipped 0.8.4 — OTel partial-install guards
104-
- **[post-080-doc-sweep](changes/archive/2026-06-08.03-post-080-doc-sweep/design.md)** (#34, 2026-06-08) — Post-0.8.0 doc sweep
105-
- **[retry-budget-cluster](changes/archive/2026-06-08.02-retry-budget-cluster/design.md)** (#34, 2026-06-08) — Shipped 0.8.3 — 7 RetryBudget findings
106-
- **[send-with-response](changes/archive/2026-06-08.01-send-with-response/design.md)** (#33, 2026-06-08) — Shipped 0.8.2 — send_with_response
107-
- **[deep-audit](changes/archive/2026-06-07.03-deep-audit/design.md)** (#32, 2026-06-07) — Deep audit; findings closed across 0.8.1-0.8.6
108-
- **[decoder-error](changes/archive/2026-06-07.02-decoder-error/design.md)** (#32, 2026-06-07) — Shipped 0.8.1 — DecodeError at seam B
109-
- **[sync-client](changes/archive/2026-06-07.01-sync-client/design.md)** (#31, 2026-06-07) — Shipped 0.8.0 — sync Client + Async* rename
110-
- **[modern-di-recipe](changes/archive/2026-06-06.01-modern-di-recipe/design.md)** (#29, 2026-06-06) — modern-di DI recipe doc
111-
- **[v0.7-docs-expansion](changes/archive/2026-06-05.07-v0.7-docs-expansion/design.md)** (#28, 2026-06-05) — Shipped 0.7.0 — first-cut user docs
112-
- **[extension-slot-docs](changes/archive/2026-06-05.06-extension-slot-docs/design.md)** (#28, 2026-06-05) — Shipped 0.7.0 — middleware docs
113-
- **[observability](changes/archive/2026-06-05.05-observability/design.md)** (#27, 2026-06-05) — Shipped 0.6.0 — logging + OTel events
114-
- **[streaming](changes/archive/2026-06-05.04-streaming/design.md)** (#26, 2026-06-05) — Shipped 0.5.0 — stream()
115-
- **[docs-sync-0.4](changes/archive/2026-06-05.03-docs-sync-0.4/design.md)** (#25, 2026-06-05) — 0.4 docs sync
116-
- **[bulkhead](changes/archive/2026-06-05.02-bulkhead/design.md)** (#23, 2026-06-05) — Shipped 0.4.0 — Bulkhead
117-
- **[retry-and-retry-budget](changes/archive/2026-06-05.01-retry-and-retry-budget/design.md)** (#22, 2026-06-05) — Shipped 0.4.0 — Retry + RetryBudget
118-
- **[v0.2-retro-and-housekeeping](changes/archive/2026-06-04.02-v0.2-retro-and-housekeeping/design.md)** (#21, 2026-06-04) — Post-0.2 retro + housekeeping
119-
- **[pydantic-optional-extra](changes/archive/2026-06-04.01-pydantic-optional-extra/design.md)** (#21, 2026-06-04) — Shipped 0.3.0 — pydantic moves to an extra
120-
- **[thin-httpx2-wrapper](changes/archive/2026-06-03.02-thin-httpx2-wrapper/design.md)** (#20, 2026-06-03) — Shipped 0.2.0 — the thin-wrapper pivot
121-
- **[input-validation-pass](changes/archive/2026-06-03.01-input-validation-pass/design.md)** (#19, 2026-06-03) — Input-validation hardening
122-
- **[project-hygiene-tidy](changes/archive/2026-06-02.02-project-hygiene-tidy/design.md)** (#18, 2026-06-02) — Repo hygiene pass
123-
- **[docs-reorg-and-mkdocs](changes/archive/2026-06-02.01-docs-reorg-and-mkdocs/design.md)** (#17, 2026-06-02) — Docs reorg + mkdocs scaffolding
124-
- **[auth-coercion](changes/archive/2026-06-01.01-auth-coercion/design.md)** (#16, 2026-06-01) — Shipped (Epic 2); removed by the v0.2 pivot *(superseded by thin-httpx2-wrapper)*
125-
- **[release-0.1.0-prep](changes/archive/2026-05-31.09-release-0.1.0-prep/design.md)** (#14, 2026-05-31) — 0.1.0 released
126-
- **[recordedtransport](changes/archive/2026-05-31.08-recordedtransport/design.md)** (#13, 2026-05-31) — Shipped in 0.1.0; removed by the v0.2 pivot *(superseded by thin-httpx2-wrapper)*
127-
- **[asyncclient](changes/archive/2026-05-31.07-asyncclient/design.md)** (#12, 2026-05-31) — Shipped in 0.1.0; rewritten by the v0.2 pivot *(superseded by thin-httpx2-wrapper)*
128-
- **[msgspec-decoder-via-extras](changes/archive/2026-05-31.06-msgspec-decoder-via-extras/design.md)** (#11, 2026-05-31) — Shipped in 0.1.0; carry-forward decoder
129-
- **[request-immutability-helpers](changes/archive/2026-05-31.05-request-immutability-helpers/design.md)** (#10, 2026-05-31) — Shipped in 0.1.0; removed by the v0.2 pivot *(superseded by thin-httpx2-wrapper)*
130-
- **[phase-shortcut-decorators](changes/archive/2026-05-31.04-phase-shortcut-decorators/design.md)** (#9, 2026-05-31) — Shipped in 0.1.0; survived the v0.2 pivot
131-
- **[middleware-protocol-and-chain](changes/archive/2026-05-31.03-middleware-protocol-and-chain/design.md)** (#8, 2026-05-31) — Shipped in 0.1.0; survived the v0.2 pivot
132-
- **[shipped-work-review](changes/archive/2026-05-31.02-shipped-work-review/design.md)** (#7, 2026-05-31) — 0.1.0-era review of shipped stories
133-
- **[bmad-to-superpowers-transition](changes/archive/2026-05-31.01-bmad-to-superpowers-transition/design.md)** (#6, 2026-05-31) — Bootstrapped the planning workflow
73+
The change listing is **generated**, not maintained — run `just index` to
74+
print it (grouped by `status`: In progress / Shipped / Superseded). The
75+
frontmatter in each bundle is the single source of truth; there is no
76+
committed copy to drift.
13477

13578
## Other
13679

planning/_templates/change.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
status: draft
33
date: YYYY-MM-DD
44
slug: my-change
5+
summary: One line — shown in the generated index. Fill at ship time.
56
supersedes: null
67
superseded_by: null
78
pr: null

planning/_templates/design.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
status: draft
33
date: YYYY-MM-DD
44
slug: my-change
5+
summary: One line — shown in the generated index. Fill at ship time.
56
supersedes: null
67
superseded_by: null
78
pr: null

0 commit comments

Comments
 (0)