From c3af20ce5269bb71fa2d133c8194ea5238a0060b Mon Sep 17 00:00:00 2001 From: Artur Shiriev Date: Sat, 20 Jun 2026 16:15:03 +0300 Subject: [PATCH 1/6] 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) --- .../design.md | 1 + .../plan.md | 0 .../design.md | 1 + .../design.md | 1 + .../plan.md | 0 .../design.md | 1 + .../plan.md | 0 .../design.md | 1 + .../plan.md | 0 .../design.md | 1 + .../plan.md | 0 .../2026-05-31.07-asyncclient/design.md | 1 + .../2026-05-31.07-asyncclient/plan.md | 0 .../2026-05-31.08-recordedtransport/design.md | 1 + .../2026-05-31.08-recordedtransport/plan.md | 0 .../design.md | 1 + .../2026-05-31.09-release-0.1.0-prep/plan.md | 0 .../2026-06-01.01-auth-coercion/design.md | 1 + .../2026-06-01.01-auth-coercion/plan.md | 0 .../design.md | 1 + .../plan.md | 0 .../design.md | 1 + .../plan.md | 0 .../design.md | 1 + .../plan.md | 0 .../design.md | 1 + .../2026-06-03.02-thin-httpx2-wrapper/plan.md | 0 .../design.md | 1 + .../plan.md | 0 .../design.md | 1 + .../design.md | 1 + .../plan.md | 0 .../2026-06-05.02-bulkhead/design.md | 1 + .../2026-06-05.02-bulkhead/plan.md | 0 .../2026-06-05.03-docs-sync-0.4/design.md | 1 + .../2026-06-05.03-docs-sync-0.4/plan.md | 0 .../2026-06-05.04-streaming/design.md | 1 + .../2026-06-05.04-streaming/plan.md | 0 .../2026-06-05.05-observability/design.md | 1 + .../2026-06-05.05-observability/plan.md | 0 .../design.md | 1 + .../2026-06-05.06-extension-slot-docs/plan.md | 0 .../design.md | 1 + .../2026-06-05.07-v0.7-docs-expansion/plan.md | 0 .../2026-06-06.01-modern-di-recipe/design.md | 1 + .../2026-06-06.01-modern-di-recipe/plan.md | 0 .../2026-06-07.01-sync-client/design.md | 1 + .../2026-06-07.01-sync-client/plan.md | 0 .../2026-06-07.02-decoder-error/design.md | 1 + .../2026-06-07.02-decoder-error/plan.md | 0 .../2026-06-07.03-deep-audit/design.md | 1 + .../2026-06-07.03-deep-audit/plan.md | 0 .../design.md | 1 + .../2026-06-08.01-send-with-response/plan.md | 0 .../design.md | 1 + .../plan.md | 0 .../design.md | 1 + .../2026-06-08.03-post-080-doc-sweep/plan.md | 0 .../design.md | 1 + .../plan.md | 0 .../design.md | 1 + .../2026-06-08.05-small-fixes-mop-up/plan.md | 0 .../2026-06-08.06-test-mop-up/design.md | 1 + .../2026-06-08.06-test-mop-up/plan.md | 0 .../design.md | 1 + .../plan.md | 0 .../design.md | 1 + .../2026-06-08.08-readme-link-cleanup/plan.md | 0 .../2026-06-10.01-multi-decoder/design.md | 1 + .../2026-06-10.01-multi-decoder/plan.md | 0 .../design.md | 1 + .../plan.md | 0 .../2026-06-12.01-delta-audit/design.md | 1 + .../2026-06-12.01-delta-audit/plan.md | 0 .../design.md | 1 + .../plan.md | 0 .../design.md | 1 + .../plan.md | 0 .../design.md | 7 ++-- .../plan.md | 38 +++++++++---------- .../change.md | 1 + .../change.md | 1 + .../2026-06-14.01-deep-audit/design.md | 1 + .../2026-06-14.01-deep-audit/plan.md | 0 .../design.md | 3 +- .../2026-06-14.01-docs-ux-restructure/plan.md | 0 .../change.md | 1 + .../design.md | 1 + .../2026-06-14.03-security-hardening/plan.md | 0 .../2026-06-14.04-audit-correctness/change.md | 1 + .../change.md | 1 + .../2026-06-14.06-audit-doc-fixes/change.md | 1 + .../change.md | 1 + .../design.md | 1 + .../plan.md | 2 +- .../design.md | 1 + .../plan.md | 2 +- .../design.md | 1 + .../plan.md | 2 +- .../change.md | 1 + planning/changes/active/.gitkeep | 0 101 files changed, 81 insertions(+), 26 deletions(-) rename planning/changes/{archive => }/2026-05-31.01-bmad-to-superpowers-transition/design.md (99%) rename planning/changes/{archive => }/2026-05-31.01-bmad-to-superpowers-transition/plan.md (100%) rename planning/changes/{archive => }/2026-05-31.02-shipped-work-review/design.md (99%) rename planning/changes/{archive => }/2026-05-31.03-middleware-protocol-and-chain/design.md (99%) rename planning/changes/{archive => }/2026-05-31.03-middleware-protocol-and-chain/plan.md (100%) rename planning/changes/{archive => }/2026-05-31.04-phase-shortcut-decorators/design.md (99%) rename planning/changes/{archive => }/2026-05-31.04-phase-shortcut-decorators/plan.md (100%) rename planning/changes/{archive => }/2026-05-31.05-request-immutability-helpers/design.md (99%) rename planning/changes/{archive => }/2026-05-31.05-request-immutability-helpers/plan.md (100%) rename planning/changes/{archive => }/2026-05-31.06-msgspec-decoder-via-extras/design.md (99%) rename planning/changes/{archive => }/2026-05-31.06-msgspec-decoder-via-extras/plan.md (100%) rename planning/changes/{archive => }/2026-05-31.07-asyncclient/design.md (99%) rename planning/changes/{archive => }/2026-05-31.07-asyncclient/plan.md (100%) rename planning/changes/{archive => }/2026-05-31.08-recordedtransport/design.md (99%) rename planning/changes/{archive => }/2026-05-31.08-recordedtransport/plan.md (100%) rename planning/changes/{archive => }/2026-05-31.09-release-0.1.0-prep/design.md (99%) rename planning/changes/{archive => }/2026-05-31.09-release-0.1.0-prep/plan.md (100%) rename planning/changes/{archive => }/2026-06-01.01-auth-coercion/design.md (99%) rename planning/changes/{archive => }/2026-06-01.01-auth-coercion/plan.md (100%) rename planning/changes/{archive => }/2026-06-02.01-docs-reorg-and-mkdocs/design.md (99%) rename planning/changes/{archive => }/2026-06-02.01-docs-reorg-and-mkdocs/plan.md (100%) rename planning/changes/{archive => }/2026-06-02.02-project-hygiene-tidy/design.md (99%) rename planning/changes/{archive => }/2026-06-02.02-project-hygiene-tidy/plan.md (100%) rename planning/changes/{archive => }/2026-06-03.01-input-validation-pass/design.md (99%) rename planning/changes/{archive => }/2026-06-03.01-input-validation-pass/plan.md (100%) rename planning/changes/{archive => }/2026-06-03.02-thin-httpx2-wrapper/design.md (99%) rename planning/changes/{archive => }/2026-06-03.02-thin-httpx2-wrapper/plan.md (100%) rename planning/changes/{archive => }/2026-06-04.01-pydantic-optional-extra/design.md (99%) rename planning/changes/{archive => }/2026-06-04.01-pydantic-optional-extra/plan.md (100%) rename planning/changes/{archive => }/2026-06-04.02-v0.2-retro-and-housekeeping/design.md (99%) rename planning/changes/{archive => }/2026-06-05.01-retry-and-retry-budget/design.md (99%) rename planning/changes/{archive => }/2026-06-05.01-retry-and-retry-budget/plan.md (100%) rename planning/changes/{archive => }/2026-06-05.02-bulkhead/design.md (99%) rename planning/changes/{archive => }/2026-06-05.02-bulkhead/plan.md (100%) rename planning/changes/{archive => }/2026-06-05.03-docs-sync-0.4/design.md (99%) rename planning/changes/{archive => }/2026-06-05.03-docs-sync-0.4/plan.md (100%) rename planning/changes/{archive => }/2026-06-05.04-streaming/design.md (99%) rename planning/changes/{archive => }/2026-06-05.04-streaming/plan.md (100%) rename planning/changes/{archive => }/2026-06-05.05-observability/design.md (99%) rename planning/changes/{archive => }/2026-06-05.05-observability/plan.md (100%) rename planning/changes/{archive => }/2026-06-05.06-extension-slot-docs/design.md (99%) rename planning/changes/{archive => }/2026-06-05.06-extension-slot-docs/plan.md (100%) rename planning/changes/{archive => }/2026-06-05.07-v0.7-docs-expansion/design.md (99%) rename planning/changes/{archive => }/2026-06-05.07-v0.7-docs-expansion/plan.md (100%) rename planning/changes/{archive => }/2026-06-06.01-modern-di-recipe/design.md (99%) rename planning/changes/{archive => }/2026-06-06.01-modern-di-recipe/plan.md (100%) rename planning/changes/{archive => }/2026-06-07.01-sync-client/design.md (99%) rename planning/changes/{archive => }/2026-06-07.01-sync-client/plan.md (100%) rename planning/changes/{archive => }/2026-06-07.02-decoder-error/design.md (99%) rename planning/changes/{archive => }/2026-06-07.02-decoder-error/plan.md (100%) rename planning/changes/{archive => }/2026-06-07.03-deep-audit/design.md (99%) rename planning/changes/{archive => }/2026-06-07.03-deep-audit/plan.md (100%) rename planning/changes/{archive => }/2026-06-08.01-send-with-response/design.md (99%) rename planning/changes/{archive => }/2026-06-08.01-send-with-response/plan.md (100%) rename planning/changes/{archive => }/2026-06-08.02-retry-budget-cluster/design.md (99%) rename planning/changes/{archive => }/2026-06-08.02-retry-budget-cluster/plan.md (100%) rename planning/changes/{archive => }/2026-06-08.03-post-080-doc-sweep/design.md (99%) rename planning/changes/{archive => }/2026-06-08.03-post-080-doc-sweep/plan.md (100%) rename planning/changes/{archive => }/2026-06-08.04-otel-partial-install/design.md (99%) rename planning/changes/{archive => }/2026-06-08.04-otel-partial-install/plan.md (100%) rename planning/changes/{archive => }/2026-06-08.05-small-fixes-mop-up/design.md (99%) rename planning/changes/{archive => }/2026-06-08.05-small-fixes-mop-up/plan.md (100%) rename planning/changes/{archive => }/2026-06-08.06-test-mop-up/design.md (99%) rename planning/changes/{archive => }/2026-06-08.06-test-mop-up/plan.md (100%) rename planning/changes/{archive => }/2026-06-08.07-mkdocs-gh-pages-migration/design.md (99%) rename planning/changes/{archive => }/2026-06-08.07-mkdocs-gh-pages-migration/plan.md (100%) rename planning/changes/{archive => }/2026-06-08.08-readme-link-cleanup/design.md (99%) rename planning/changes/{archive => }/2026-06-08.08-readme-link-cleanup/plan.md (100%) rename planning/changes/{archive => }/2026-06-10.01-multi-decoder/design.md (99%) rename planning/changes/{archive => }/2026-06-10.01-multi-decoder/plan.md (100%) rename planning/changes/{archive => }/2026-06-10.02-decoder-instance-cache/design.md (99%) rename planning/changes/{archive => }/2026-06-10.02-decoder-instance-cache/plan.md (100%) rename planning/changes/{archive => }/2026-06-12.01-delta-audit/design.md (99%) rename planning/changes/{archive => }/2026-06-12.01-delta-audit/plan.md (100%) rename planning/changes/{archive => }/2026-06-13.01-msgspec-nested-customtype-fix/design.md (99%) rename planning/changes/{archive => }/2026-06-13.01-msgspec-nested-customtype-fix/plan.md (100%) rename planning/changes/{archive => }/2026-06-13.02-circuit-breaker-and-timeout/design.md (99%) rename planning/changes/{archive => }/2026-06-13.02-circuit-breaker-and-timeout/plan.md (100%) rename planning/changes/{archive => }/2026-06-13.03-portable-planning-convention/design.md (96%) rename planning/changes/{archive => }/2026-06-13.03-portable-planning-convention/plan.md (94%) rename planning/changes/{archive => }/2026-06-13.04-docs-accuracy-fixes/change.md (92%) rename planning/changes/{archive => }/2026-06-13.05-docs-audit-followups/change.md (93%) rename planning/changes/{archive => }/2026-06-14.01-deep-audit/design.md (97%) rename planning/changes/{archive => }/2026-06-14.01-deep-audit/plan.md (100%) rename planning/changes/{archive => }/2026-06-14.01-docs-ux-restructure/design.md (96%) rename planning/changes/{archive => }/2026-06-14.01-docs-ux-restructure/plan.md (100%) rename planning/changes/{archive => }/2026-06-14.02-pydantic-import-isolation/change.md (92%) rename planning/changes/{archive => }/2026-06-14.03-security-hardening/design.md (96%) rename planning/changes/{archive => }/2026-06-14.03-security-hardening/plan.md (100%) rename planning/changes/{archive => }/2026-06-14.04-audit-correctness/change.md (91%) rename planning/changes/{archive => }/2026-06-14.05-audit-test-quality/change.md (86%) rename planning/changes/{archive => }/2026-06-14.06-audit-doc-fixes/change.md (88%) rename planning/changes/{archive => }/2026-06-15.01-custom-decoder-guide/change.md (97%) rename planning/changes/{archive => }/2026-06-16.01-per-verb-with-response/design.md (97%) rename planning/changes/{archive => }/2026-06-16.01-per-verb-with-response/plan.md (99%) rename planning/changes/{archive => }/2026-06-16.02-circuit-breaker-rate-mode/design.md (98%) rename planning/changes/{archive => }/2026-06-16.02-circuit-breaker-rate-mode/plan.md (99%) rename planning/changes/{archive => }/2026-06-16.03-circuit-breaker-state/design.md (96%) rename planning/changes/{archive => }/2026-06-16.03-circuit-breaker-state/plan.md (99%) rename planning/changes/{archive => }/2026-06-16.04-delta-audit-followups/change.md (93%) delete mode 100644 planning/changes/active/.gitkeep diff --git a/planning/changes/archive/2026-05-31.01-bmad-to-superpowers-transition/design.md b/planning/changes/2026-05-31.01-bmad-to-superpowers-transition/design.md similarity index 99% rename from planning/changes/archive/2026-05-31.01-bmad-to-superpowers-transition/design.md rename to planning/changes/2026-05-31.01-bmad-to-superpowers-transition/design.md index 8130967..93be299 100644 --- a/planning/changes/archive/2026-05-31.01-bmad-to-superpowers-transition/design.md +++ b/planning/changes/2026-05-31.01-bmad-to-superpowers-transition/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-05-31 slug: bmad-to-superpowers-transition +summary: Bootstrapped the planning workflow supersedes: null superseded_by: null pr: 6 diff --git a/planning/changes/archive/2026-05-31.01-bmad-to-superpowers-transition/plan.md b/planning/changes/2026-05-31.01-bmad-to-superpowers-transition/plan.md similarity index 100% rename from planning/changes/archive/2026-05-31.01-bmad-to-superpowers-transition/plan.md rename to planning/changes/2026-05-31.01-bmad-to-superpowers-transition/plan.md diff --git a/planning/changes/archive/2026-05-31.02-shipped-work-review/design.md b/planning/changes/2026-05-31.02-shipped-work-review/design.md similarity index 99% rename from planning/changes/archive/2026-05-31.02-shipped-work-review/design.md rename to planning/changes/2026-05-31.02-shipped-work-review/design.md index 64bf2db..198dd43 100644 --- a/planning/changes/archive/2026-05-31.02-shipped-work-review/design.md +++ b/planning/changes/2026-05-31.02-shipped-work-review/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-05-31 slug: shipped-work-review +summary: 0.1.0-era review of shipped stories supersedes: null superseded_by: null pr: 7 diff --git a/planning/changes/archive/2026-05-31.03-middleware-protocol-and-chain/design.md b/planning/changes/2026-05-31.03-middleware-protocol-and-chain/design.md similarity index 99% rename from planning/changes/archive/2026-05-31.03-middleware-protocol-and-chain/design.md rename to planning/changes/2026-05-31.03-middleware-protocol-and-chain/design.md index 0a100e6..442aec3 100644 --- a/planning/changes/archive/2026-05-31.03-middleware-protocol-and-chain/design.md +++ b/planning/changes/2026-05-31.03-middleware-protocol-and-chain/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-05-31 slug: middleware-protocol-and-chain +summary: Shipped in 0.1.0; survived the v0.2 pivot supersedes: null superseded_by: null pr: 8 diff --git a/planning/changes/archive/2026-05-31.03-middleware-protocol-and-chain/plan.md b/planning/changes/2026-05-31.03-middleware-protocol-and-chain/plan.md similarity index 100% rename from planning/changes/archive/2026-05-31.03-middleware-protocol-and-chain/plan.md rename to planning/changes/2026-05-31.03-middleware-protocol-and-chain/plan.md diff --git a/planning/changes/archive/2026-05-31.04-phase-shortcut-decorators/design.md b/planning/changes/2026-05-31.04-phase-shortcut-decorators/design.md similarity index 99% rename from planning/changes/archive/2026-05-31.04-phase-shortcut-decorators/design.md rename to planning/changes/2026-05-31.04-phase-shortcut-decorators/design.md index 4d85348..01051b7 100644 --- a/planning/changes/archive/2026-05-31.04-phase-shortcut-decorators/design.md +++ b/planning/changes/2026-05-31.04-phase-shortcut-decorators/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-05-31 slug: phase-shortcut-decorators +summary: Shipped in 0.1.0; survived the v0.2 pivot supersedes: null superseded_by: null pr: 9 diff --git a/planning/changes/archive/2026-05-31.04-phase-shortcut-decorators/plan.md b/planning/changes/2026-05-31.04-phase-shortcut-decorators/plan.md similarity index 100% rename from planning/changes/archive/2026-05-31.04-phase-shortcut-decorators/plan.md rename to planning/changes/2026-05-31.04-phase-shortcut-decorators/plan.md diff --git a/planning/changes/archive/2026-05-31.05-request-immutability-helpers/design.md b/planning/changes/2026-05-31.05-request-immutability-helpers/design.md similarity index 99% rename from planning/changes/archive/2026-05-31.05-request-immutability-helpers/design.md rename to planning/changes/2026-05-31.05-request-immutability-helpers/design.md index 05d735c..8e1f33e 100644 --- a/planning/changes/archive/2026-05-31.05-request-immutability-helpers/design.md +++ b/planning/changes/2026-05-31.05-request-immutability-helpers/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-05-31 slug: request-immutability-helpers +summary: Shipped in 0.1.0; removed by the v0.2 pivot *(superseded by thin-httpx2-wrapper)* supersedes: null superseded_by: 2026-06-03.02-thin-httpx2-wrapper pr: 10 diff --git a/planning/changes/archive/2026-05-31.05-request-immutability-helpers/plan.md b/planning/changes/2026-05-31.05-request-immutability-helpers/plan.md similarity index 100% rename from planning/changes/archive/2026-05-31.05-request-immutability-helpers/plan.md rename to planning/changes/2026-05-31.05-request-immutability-helpers/plan.md diff --git a/planning/changes/archive/2026-05-31.06-msgspec-decoder-via-extras/design.md b/planning/changes/2026-05-31.06-msgspec-decoder-via-extras/design.md similarity index 99% rename from planning/changes/archive/2026-05-31.06-msgspec-decoder-via-extras/design.md rename to planning/changes/2026-05-31.06-msgspec-decoder-via-extras/design.md index 27a42d7..abaa034 100644 --- a/planning/changes/archive/2026-05-31.06-msgspec-decoder-via-extras/design.md +++ b/planning/changes/2026-05-31.06-msgspec-decoder-via-extras/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-05-31 slug: msgspec-decoder-via-extras +summary: Shipped in 0.1.0; carry-forward decoder supersedes: null superseded_by: null pr: 11 diff --git a/planning/changes/archive/2026-05-31.06-msgspec-decoder-via-extras/plan.md b/planning/changes/2026-05-31.06-msgspec-decoder-via-extras/plan.md similarity index 100% rename from planning/changes/archive/2026-05-31.06-msgspec-decoder-via-extras/plan.md rename to planning/changes/2026-05-31.06-msgspec-decoder-via-extras/plan.md diff --git a/planning/changes/archive/2026-05-31.07-asyncclient/design.md b/planning/changes/2026-05-31.07-asyncclient/design.md similarity index 99% rename from planning/changes/archive/2026-05-31.07-asyncclient/design.md rename to planning/changes/2026-05-31.07-asyncclient/design.md index f1d599a..305e3e3 100644 --- a/planning/changes/archive/2026-05-31.07-asyncclient/design.md +++ b/planning/changes/2026-05-31.07-asyncclient/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-05-31 slug: asyncclient +summary: Shipped in 0.1.0; rewritten by the v0.2 pivot *(superseded by thin-httpx2-wrapper)* supersedes: null superseded_by: 2026-06-03.02-thin-httpx2-wrapper pr: 12 diff --git a/planning/changes/archive/2026-05-31.07-asyncclient/plan.md b/planning/changes/2026-05-31.07-asyncclient/plan.md similarity index 100% rename from planning/changes/archive/2026-05-31.07-asyncclient/plan.md rename to planning/changes/2026-05-31.07-asyncclient/plan.md diff --git a/planning/changes/archive/2026-05-31.08-recordedtransport/design.md b/planning/changes/2026-05-31.08-recordedtransport/design.md similarity index 99% rename from planning/changes/archive/2026-05-31.08-recordedtransport/design.md rename to planning/changes/2026-05-31.08-recordedtransport/design.md index 9c3e3f3..7312383 100644 --- a/planning/changes/archive/2026-05-31.08-recordedtransport/design.md +++ b/planning/changes/2026-05-31.08-recordedtransport/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-05-31 slug: recordedtransport +summary: Shipped in 0.1.0; removed by the v0.2 pivot *(superseded by thin-httpx2-wrapper)* supersedes: null superseded_by: 2026-06-03.02-thin-httpx2-wrapper pr: 13 diff --git a/planning/changes/archive/2026-05-31.08-recordedtransport/plan.md b/planning/changes/2026-05-31.08-recordedtransport/plan.md similarity index 100% rename from planning/changes/archive/2026-05-31.08-recordedtransport/plan.md rename to planning/changes/2026-05-31.08-recordedtransport/plan.md diff --git a/planning/changes/archive/2026-05-31.09-release-0.1.0-prep/design.md b/planning/changes/2026-05-31.09-release-0.1.0-prep/design.md similarity index 99% rename from planning/changes/archive/2026-05-31.09-release-0.1.0-prep/design.md rename to planning/changes/2026-05-31.09-release-0.1.0-prep/design.md index 6a29cb1..655aa14 100644 --- a/planning/changes/archive/2026-05-31.09-release-0.1.0-prep/design.md +++ b/planning/changes/2026-05-31.09-release-0.1.0-prep/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-05-31 slug: release-0.1.0-prep +summary: 0.1.0 released supersedes: null superseded_by: null pr: 14 diff --git a/planning/changes/archive/2026-05-31.09-release-0.1.0-prep/plan.md b/planning/changes/2026-05-31.09-release-0.1.0-prep/plan.md similarity index 100% rename from planning/changes/archive/2026-05-31.09-release-0.1.0-prep/plan.md rename to planning/changes/2026-05-31.09-release-0.1.0-prep/plan.md diff --git a/planning/changes/archive/2026-06-01.01-auth-coercion/design.md b/planning/changes/2026-06-01.01-auth-coercion/design.md similarity index 99% rename from planning/changes/archive/2026-06-01.01-auth-coercion/design.md rename to planning/changes/2026-06-01.01-auth-coercion/design.md index a05d636..786f4f8 100644 --- a/planning/changes/archive/2026-06-01.01-auth-coercion/design.md +++ b/planning/changes/2026-06-01.01-auth-coercion/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-01 slug: auth-coercion +summary: Shipped (Epic 2); removed by the v0.2 pivot *(superseded by thin-httpx2-wrapper)* supersedes: null superseded_by: 2026-06-03.02-thin-httpx2-wrapper pr: 16 diff --git a/planning/changes/archive/2026-06-01.01-auth-coercion/plan.md b/planning/changes/2026-06-01.01-auth-coercion/plan.md similarity index 100% rename from planning/changes/archive/2026-06-01.01-auth-coercion/plan.md rename to planning/changes/2026-06-01.01-auth-coercion/plan.md diff --git a/planning/changes/archive/2026-06-02.01-docs-reorg-and-mkdocs/design.md b/planning/changes/2026-06-02.01-docs-reorg-and-mkdocs/design.md similarity index 99% rename from planning/changes/archive/2026-06-02.01-docs-reorg-and-mkdocs/design.md rename to planning/changes/2026-06-02.01-docs-reorg-and-mkdocs/design.md index 5a9925c..9662a69 100644 --- a/planning/changes/archive/2026-06-02.01-docs-reorg-and-mkdocs/design.md +++ b/planning/changes/2026-06-02.01-docs-reorg-and-mkdocs/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-02 slug: docs-reorg-and-mkdocs +summary: Docs reorg + mkdocs scaffolding supersedes: null superseded_by: null pr: 17 diff --git a/planning/changes/archive/2026-06-02.01-docs-reorg-and-mkdocs/plan.md b/planning/changes/2026-06-02.01-docs-reorg-and-mkdocs/plan.md similarity index 100% rename from planning/changes/archive/2026-06-02.01-docs-reorg-and-mkdocs/plan.md rename to planning/changes/2026-06-02.01-docs-reorg-and-mkdocs/plan.md diff --git a/planning/changes/archive/2026-06-02.02-project-hygiene-tidy/design.md b/planning/changes/2026-06-02.02-project-hygiene-tidy/design.md similarity index 99% rename from planning/changes/archive/2026-06-02.02-project-hygiene-tidy/design.md rename to planning/changes/2026-06-02.02-project-hygiene-tidy/design.md index 7387bc7..843a1ff 100644 --- a/planning/changes/archive/2026-06-02.02-project-hygiene-tidy/design.md +++ b/planning/changes/2026-06-02.02-project-hygiene-tidy/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-02 slug: project-hygiene-tidy +summary: Repo hygiene pass supersedes: null superseded_by: null pr: 18 diff --git a/planning/changes/archive/2026-06-02.02-project-hygiene-tidy/plan.md b/planning/changes/2026-06-02.02-project-hygiene-tidy/plan.md similarity index 100% rename from planning/changes/archive/2026-06-02.02-project-hygiene-tidy/plan.md rename to planning/changes/2026-06-02.02-project-hygiene-tidy/plan.md diff --git a/planning/changes/archive/2026-06-03.01-input-validation-pass/design.md b/planning/changes/2026-06-03.01-input-validation-pass/design.md similarity index 99% rename from planning/changes/archive/2026-06-03.01-input-validation-pass/design.md rename to planning/changes/2026-06-03.01-input-validation-pass/design.md index 0d7047c..dea3b24 100644 --- a/planning/changes/archive/2026-06-03.01-input-validation-pass/design.md +++ b/planning/changes/2026-06-03.01-input-validation-pass/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-03 slug: input-validation-pass +summary: Input-validation hardening supersedes: null superseded_by: null pr: 19 diff --git a/planning/changes/archive/2026-06-03.01-input-validation-pass/plan.md b/planning/changes/2026-06-03.01-input-validation-pass/plan.md similarity index 100% rename from planning/changes/archive/2026-06-03.01-input-validation-pass/plan.md rename to planning/changes/2026-06-03.01-input-validation-pass/plan.md diff --git a/planning/changes/archive/2026-06-03.02-thin-httpx2-wrapper/design.md b/planning/changes/2026-06-03.02-thin-httpx2-wrapper/design.md similarity index 99% rename from planning/changes/archive/2026-06-03.02-thin-httpx2-wrapper/design.md rename to planning/changes/2026-06-03.02-thin-httpx2-wrapper/design.md index 1b378a8..e85efd1 100644 --- a/planning/changes/archive/2026-06-03.02-thin-httpx2-wrapper/design.md +++ b/planning/changes/2026-06-03.02-thin-httpx2-wrapper/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-03 slug: thin-httpx2-wrapper +summary: Shipped 0.2.0 — the thin-wrapper pivot supersedes: [2026-05-31.05-request-immutability-helpers, 2026-05-31.07-asyncclient, 2026-05-31.08-recordedtransport, 2026-06-01.01-auth-coercion] superseded_by: null pr: 20 diff --git a/planning/changes/archive/2026-06-03.02-thin-httpx2-wrapper/plan.md b/planning/changes/2026-06-03.02-thin-httpx2-wrapper/plan.md similarity index 100% rename from planning/changes/archive/2026-06-03.02-thin-httpx2-wrapper/plan.md rename to planning/changes/2026-06-03.02-thin-httpx2-wrapper/plan.md diff --git a/planning/changes/archive/2026-06-04.01-pydantic-optional-extra/design.md b/planning/changes/2026-06-04.01-pydantic-optional-extra/design.md similarity index 99% rename from planning/changes/archive/2026-06-04.01-pydantic-optional-extra/design.md rename to planning/changes/2026-06-04.01-pydantic-optional-extra/design.md index 13c4754..355908c 100644 --- a/planning/changes/archive/2026-06-04.01-pydantic-optional-extra/design.md +++ b/planning/changes/2026-06-04.01-pydantic-optional-extra/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-04 slug: pydantic-optional-extra +summary: Shipped 0.3.0 — pydantic moves to an extra supersedes: null superseded_by: null pr: 21 diff --git a/planning/changes/archive/2026-06-04.01-pydantic-optional-extra/plan.md b/planning/changes/2026-06-04.01-pydantic-optional-extra/plan.md similarity index 100% rename from planning/changes/archive/2026-06-04.01-pydantic-optional-extra/plan.md rename to planning/changes/2026-06-04.01-pydantic-optional-extra/plan.md diff --git a/planning/changes/archive/2026-06-04.02-v0.2-retro-and-housekeeping/design.md b/planning/changes/2026-06-04.02-v0.2-retro-and-housekeeping/design.md similarity index 99% rename from planning/changes/archive/2026-06-04.02-v0.2-retro-and-housekeeping/design.md rename to planning/changes/2026-06-04.02-v0.2-retro-and-housekeeping/design.md index 2fcd5ae..f6c9540 100644 --- a/planning/changes/archive/2026-06-04.02-v0.2-retro-and-housekeeping/design.md +++ b/planning/changes/2026-06-04.02-v0.2-retro-and-housekeeping/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-04 slug: v0.2-retro-and-housekeeping +summary: Post-0.2 retro + housekeeping supersedes: null superseded_by: null pr: 21 diff --git a/planning/changes/archive/2026-06-05.01-retry-and-retry-budget/design.md b/planning/changes/2026-06-05.01-retry-and-retry-budget/design.md similarity index 99% rename from planning/changes/archive/2026-06-05.01-retry-and-retry-budget/design.md rename to planning/changes/2026-06-05.01-retry-and-retry-budget/design.md index 9f1ed8e..00f5c00 100644 --- a/planning/changes/archive/2026-06-05.01-retry-and-retry-budget/design.md +++ b/planning/changes/2026-06-05.01-retry-and-retry-budget/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-05 slug: retry-and-retry-budget +summary: Shipped 0.4.0 — Retry + RetryBudget supersedes: null superseded_by: null pr: 22 diff --git a/planning/changes/archive/2026-06-05.01-retry-and-retry-budget/plan.md b/planning/changes/2026-06-05.01-retry-and-retry-budget/plan.md similarity index 100% rename from planning/changes/archive/2026-06-05.01-retry-and-retry-budget/plan.md rename to planning/changes/2026-06-05.01-retry-and-retry-budget/plan.md diff --git a/planning/changes/archive/2026-06-05.02-bulkhead/design.md b/planning/changes/2026-06-05.02-bulkhead/design.md similarity index 99% rename from planning/changes/archive/2026-06-05.02-bulkhead/design.md rename to planning/changes/2026-06-05.02-bulkhead/design.md index d5f360e..296c94e 100644 --- a/planning/changes/archive/2026-06-05.02-bulkhead/design.md +++ b/planning/changes/2026-06-05.02-bulkhead/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-05 slug: bulkhead +summary: Shipped 0.4.0 — Bulkhead supersedes: null superseded_by: null pr: 23 diff --git a/planning/changes/archive/2026-06-05.02-bulkhead/plan.md b/planning/changes/2026-06-05.02-bulkhead/plan.md similarity index 100% rename from planning/changes/archive/2026-06-05.02-bulkhead/plan.md rename to planning/changes/2026-06-05.02-bulkhead/plan.md diff --git a/planning/changes/archive/2026-06-05.03-docs-sync-0.4/design.md b/planning/changes/2026-06-05.03-docs-sync-0.4/design.md similarity index 99% rename from planning/changes/archive/2026-06-05.03-docs-sync-0.4/design.md rename to planning/changes/2026-06-05.03-docs-sync-0.4/design.md index 584e3e5..4ddc56a 100644 --- a/planning/changes/archive/2026-06-05.03-docs-sync-0.4/design.md +++ b/planning/changes/2026-06-05.03-docs-sync-0.4/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-05 slug: docs-sync-0.4 +summary: 0.4 docs sync supersedes: null superseded_by: null pr: 25 diff --git a/planning/changes/archive/2026-06-05.03-docs-sync-0.4/plan.md b/planning/changes/2026-06-05.03-docs-sync-0.4/plan.md similarity index 100% rename from planning/changes/archive/2026-06-05.03-docs-sync-0.4/plan.md rename to planning/changes/2026-06-05.03-docs-sync-0.4/plan.md diff --git a/planning/changes/archive/2026-06-05.04-streaming/design.md b/planning/changes/2026-06-05.04-streaming/design.md similarity index 99% rename from planning/changes/archive/2026-06-05.04-streaming/design.md rename to planning/changes/2026-06-05.04-streaming/design.md index 2ee6621..f1d2149 100644 --- a/planning/changes/archive/2026-06-05.04-streaming/design.md +++ b/planning/changes/2026-06-05.04-streaming/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-05 slug: streaming +summary: Shipped 0.5.0 — stream() supersedes: null superseded_by: null pr: 26 diff --git a/planning/changes/archive/2026-06-05.04-streaming/plan.md b/planning/changes/2026-06-05.04-streaming/plan.md similarity index 100% rename from planning/changes/archive/2026-06-05.04-streaming/plan.md rename to planning/changes/2026-06-05.04-streaming/plan.md diff --git a/planning/changes/archive/2026-06-05.05-observability/design.md b/planning/changes/2026-06-05.05-observability/design.md similarity index 99% rename from planning/changes/archive/2026-06-05.05-observability/design.md rename to planning/changes/2026-06-05.05-observability/design.md index 7182a23..c082d92 100644 --- a/planning/changes/archive/2026-06-05.05-observability/design.md +++ b/planning/changes/2026-06-05.05-observability/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-05 slug: observability +summary: Shipped 0.6.0 — logging + OTel events supersedes: null superseded_by: null pr: 27 diff --git a/planning/changes/archive/2026-06-05.05-observability/plan.md b/planning/changes/2026-06-05.05-observability/plan.md similarity index 100% rename from planning/changes/archive/2026-06-05.05-observability/plan.md rename to planning/changes/2026-06-05.05-observability/plan.md diff --git a/planning/changes/archive/2026-06-05.06-extension-slot-docs/design.md b/planning/changes/2026-06-05.06-extension-slot-docs/design.md similarity index 99% rename from planning/changes/archive/2026-06-05.06-extension-slot-docs/design.md rename to planning/changes/2026-06-05.06-extension-slot-docs/design.md index 9257d4b..dce43ba 100644 --- a/planning/changes/archive/2026-06-05.06-extension-slot-docs/design.md +++ b/planning/changes/2026-06-05.06-extension-slot-docs/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-05 slug: extension-slot-docs +summary: Shipped 0.7.0 — middleware docs supersedes: null superseded_by: null pr: 28 diff --git a/planning/changes/archive/2026-06-05.06-extension-slot-docs/plan.md b/planning/changes/2026-06-05.06-extension-slot-docs/plan.md similarity index 100% rename from planning/changes/archive/2026-06-05.06-extension-slot-docs/plan.md rename to planning/changes/2026-06-05.06-extension-slot-docs/plan.md diff --git a/planning/changes/archive/2026-06-05.07-v0.7-docs-expansion/design.md b/planning/changes/2026-06-05.07-v0.7-docs-expansion/design.md similarity index 99% rename from planning/changes/archive/2026-06-05.07-v0.7-docs-expansion/design.md rename to planning/changes/2026-06-05.07-v0.7-docs-expansion/design.md index f97c974..cbb73d9 100644 --- a/planning/changes/archive/2026-06-05.07-v0.7-docs-expansion/design.md +++ b/planning/changes/2026-06-05.07-v0.7-docs-expansion/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-05 slug: v0.7-docs-expansion +summary: Shipped 0.7.0 — first-cut user docs supersedes: null superseded_by: null pr: 28 diff --git a/planning/changes/archive/2026-06-05.07-v0.7-docs-expansion/plan.md b/planning/changes/2026-06-05.07-v0.7-docs-expansion/plan.md similarity index 100% rename from planning/changes/archive/2026-06-05.07-v0.7-docs-expansion/plan.md rename to planning/changes/2026-06-05.07-v0.7-docs-expansion/plan.md diff --git a/planning/changes/archive/2026-06-06.01-modern-di-recipe/design.md b/planning/changes/2026-06-06.01-modern-di-recipe/design.md similarity index 99% rename from planning/changes/archive/2026-06-06.01-modern-di-recipe/design.md rename to planning/changes/2026-06-06.01-modern-di-recipe/design.md index 1fa2414..5db111d 100644 --- a/planning/changes/archive/2026-06-06.01-modern-di-recipe/design.md +++ b/planning/changes/2026-06-06.01-modern-di-recipe/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-06 slug: modern-di-recipe +summary: modern-di DI recipe doc supersedes: null superseded_by: null pr: 29 diff --git a/planning/changes/archive/2026-06-06.01-modern-di-recipe/plan.md b/planning/changes/2026-06-06.01-modern-di-recipe/plan.md similarity index 100% rename from planning/changes/archive/2026-06-06.01-modern-di-recipe/plan.md rename to planning/changes/2026-06-06.01-modern-di-recipe/plan.md diff --git a/planning/changes/archive/2026-06-07.01-sync-client/design.md b/planning/changes/2026-06-07.01-sync-client/design.md similarity index 99% rename from planning/changes/archive/2026-06-07.01-sync-client/design.md rename to planning/changes/2026-06-07.01-sync-client/design.md index 1375941..9f29d2d 100644 --- a/planning/changes/archive/2026-06-07.01-sync-client/design.md +++ b/planning/changes/2026-06-07.01-sync-client/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-07 slug: sync-client +summary: Shipped 0.8.0 — sync Client + Async* rename supersedes: null superseded_by: null pr: 31 diff --git a/planning/changes/archive/2026-06-07.01-sync-client/plan.md b/planning/changes/2026-06-07.01-sync-client/plan.md similarity index 100% rename from planning/changes/archive/2026-06-07.01-sync-client/plan.md rename to planning/changes/2026-06-07.01-sync-client/plan.md diff --git a/planning/changes/archive/2026-06-07.02-decoder-error/design.md b/planning/changes/2026-06-07.02-decoder-error/design.md similarity index 99% rename from planning/changes/archive/2026-06-07.02-decoder-error/design.md rename to planning/changes/2026-06-07.02-decoder-error/design.md index 9366869..8e5227d 100644 --- a/planning/changes/archive/2026-06-07.02-decoder-error/design.md +++ b/planning/changes/2026-06-07.02-decoder-error/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-07 slug: decoder-error +summary: Shipped 0.8.1 — DecodeError at seam B supersedes: null superseded_by: null pr: 32 diff --git a/planning/changes/archive/2026-06-07.02-decoder-error/plan.md b/planning/changes/2026-06-07.02-decoder-error/plan.md similarity index 100% rename from planning/changes/archive/2026-06-07.02-decoder-error/plan.md rename to planning/changes/2026-06-07.02-decoder-error/plan.md diff --git a/planning/changes/archive/2026-06-07.03-deep-audit/design.md b/planning/changes/2026-06-07.03-deep-audit/design.md similarity index 99% rename from planning/changes/archive/2026-06-07.03-deep-audit/design.md rename to planning/changes/2026-06-07.03-deep-audit/design.md index bc4055e..e08d8d9 100644 --- a/planning/changes/archive/2026-06-07.03-deep-audit/design.md +++ b/planning/changes/2026-06-07.03-deep-audit/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-07 slug: deep-audit +summary: Deep audit; findings closed across 0.8.1-0.8.6 supersedes: null superseded_by: null pr: 32 diff --git a/planning/changes/archive/2026-06-07.03-deep-audit/plan.md b/planning/changes/2026-06-07.03-deep-audit/plan.md similarity index 100% rename from planning/changes/archive/2026-06-07.03-deep-audit/plan.md rename to planning/changes/2026-06-07.03-deep-audit/plan.md diff --git a/planning/changes/archive/2026-06-08.01-send-with-response/design.md b/planning/changes/2026-06-08.01-send-with-response/design.md similarity index 99% rename from planning/changes/archive/2026-06-08.01-send-with-response/design.md rename to planning/changes/2026-06-08.01-send-with-response/design.md index 59dc578..59ef80d 100644 --- a/planning/changes/archive/2026-06-08.01-send-with-response/design.md +++ b/planning/changes/2026-06-08.01-send-with-response/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-08 slug: send-with-response +summary: Shipped 0.8.2 — send_with_response supersedes: null superseded_by: null pr: 33 diff --git a/planning/changes/archive/2026-06-08.01-send-with-response/plan.md b/planning/changes/2026-06-08.01-send-with-response/plan.md similarity index 100% rename from planning/changes/archive/2026-06-08.01-send-with-response/plan.md rename to planning/changes/2026-06-08.01-send-with-response/plan.md diff --git a/planning/changes/archive/2026-06-08.02-retry-budget-cluster/design.md b/planning/changes/2026-06-08.02-retry-budget-cluster/design.md similarity index 99% rename from planning/changes/archive/2026-06-08.02-retry-budget-cluster/design.md rename to planning/changes/2026-06-08.02-retry-budget-cluster/design.md index 773d501..b3bf461 100644 --- a/planning/changes/archive/2026-06-08.02-retry-budget-cluster/design.md +++ b/planning/changes/2026-06-08.02-retry-budget-cluster/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-08 slug: retry-budget-cluster +summary: Shipped 0.8.3 — 7 RetryBudget findings supersedes: null superseded_by: null pr: 34 diff --git a/planning/changes/archive/2026-06-08.02-retry-budget-cluster/plan.md b/planning/changes/2026-06-08.02-retry-budget-cluster/plan.md similarity index 100% rename from planning/changes/archive/2026-06-08.02-retry-budget-cluster/plan.md rename to planning/changes/2026-06-08.02-retry-budget-cluster/plan.md diff --git a/planning/changes/archive/2026-06-08.03-post-080-doc-sweep/design.md b/planning/changes/2026-06-08.03-post-080-doc-sweep/design.md similarity index 99% rename from planning/changes/archive/2026-06-08.03-post-080-doc-sweep/design.md rename to planning/changes/2026-06-08.03-post-080-doc-sweep/design.md index 7b2f850..0fe6b5d 100644 --- a/planning/changes/archive/2026-06-08.03-post-080-doc-sweep/design.md +++ b/planning/changes/2026-06-08.03-post-080-doc-sweep/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-08 slug: post-080-doc-sweep +summary: Post-0.8.0 doc sweep supersedes: null superseded_by: null pr: 34 diff --git a/planning/changes/archive/2026-06-08.03-post-080-doc-sweep/plan.md b/planning/changes/2026-06-08.03-post-080-doc-sweep/plan.md similarity index 100% rename from planning/changes/archive/2026-06-08.03-post-080-doc-sweep/plan.md rename to planning/changes/2026-06-08.03-post-080-doc-sweep/plan.md diff --git a/planning/changes/archive/2026-06-08.04-otel-partial-install/design.md b/planning/changes/2026-06-08.04-otel-partial-install/design.md similarity index 99% rename from planning/changes/archive/2026-06-08.04-otel-partial-install/design.md rename to planning/changes/2026-06-08.04-otel-partial-install/design.md index 9202233..f693161 100644 --- a/planning/changes/archive/2026-06-08.04-otel-partial-install/design.md +++ b/planning/changes/2026-06-08.04-otel-partial-install/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-08 slug: otel-partial-install +summary: Shipped 0.8.4 — OTel partial-install guards supersedes: null superseded_by: null pr: 35 diff --git a/planning/changes/archive/2026-06-08.04-otel-partial-install/plan.md b/planning/changes/2026-06-08.04-otel-partial-install/plan.md similarity index 100% rename from planning/changes/archive/2026-06-08.04-otel-partial-install/plan.md rename to planning/changes/2026-06-08.04-otel-partial-install/plan.md diff --git a/planning/changes/archive/2026-06-08.05-small-fixes-mop-up/design.md b/planning/changes/2026-06-08.05-small-fixes-mop-up/design.md similarity index 99% rename from planning/changes/archive/2026-06-08.05-small-fixes-mop-up/design.md rename to planning/changes/2026-06-08.05-small-fixes-mop-up/design.md index c54e8bf..6660577 100644 --- a/planning/changes/archive/2026-06-08.05-small-fixes-mop-up/design.md +++ b/planning/changes/2026-06-08.05-small-fixes-mop-up/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-08 slug: small-fixes-mop-up +summary: Shipped 0.8.5 — 4 small audit findings supersedes: null superseded_by: null pr: 36 diff --git a/planning/changes/archive/2026-06-08.05-small-fixes-mop-up/plan.md b/planning/changes/2026-06-08.05-small-fixes-mop-up/plan.md similarity index 100% rename from planning/changes/archive/2026-06-08.05-small-fixes-mop-up/plan.md rename to planning/changes/2026-06-08.05-small-fixes-mop-up/plan.md diff --git a/planning/changes/archive/2026-06-08.06-test-mop-up/design.md b/planning/changes/2026-06-08.06-test-mop-up/design.md similarity index 99% rename from planning/changes/archive/2026-06-08.06-test-mop-up/design.md rename to planning/changes/2026-06-08.06-test-mop-up/design.md index 2bdc648..c8cff75 100644 --- a/planning/changes/archive/2026-06-08.06-test-mop-up/design.md +++ b/planning/changes/2026-06-08.06-test-mop-up/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-08 slug: test-mop-up +summary: Shipped 0.8.6 — test-only audit findings supersedes: null superseded_by: null pr: 37 diff --git a/planning/changes/archive/2026-06-08.06-test-mop-up/plan.md b/planning/changes/2026-06-08.06-test-mop-up/plan.md similarity index 100% rename from planning/changes/archive/2026-06-08.06-test-mop-up/plan.md rename to planning/changes/2026-06-08.06-test-mop-up/plan.md diff --git a/planning/changes/archive/2026-06-08.07-mkdocs-gh-pages-migration/design.md b/planning/changes/2026-06-08.07-mkdocs-gh-pages-migration/design.md similarity index 99% rename from planning/changes/archive/2026-06-08.07-mkdocs-gh-pages-migration/design.md rename to planning/changes/2026-06-08.07-mkdocs-gh-pages-migration/design.md index 3f8b51a..d7131d0 100644 --- a/planning/changes/archive/2026-06-08.07-mkdocs-gh-pages-migration/design.md +++ b/planning/changes/2026-06-08.07-mkdocs-gh-pages-migration/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-08 slug: mkdocs-gh-pages-migration +summary: Docs host -> GitHub Pages supersedes: null superseded_by: null pr: 38 diff --git a/planning/changes/archive/2026-06-08.07-mkdocs-gh-pages-migration/plan.md b/planning/changes/2026-06-08.07-mkdocs-gh-pages-migration/plan.md similarity index 100% rename from planning/changes/archive/2026-06-08.07-mkdocs-gh-pages-migration/plan.md rename to planning/changes/2026-06-08.07-mkdocs-gh-pages-migration/plan.md diff --git a/planning/changes/archive/2026-06-08.08-readme-link-cleanup/design.md b/planning/changes/2026-06-08.08-readme-link-cleanup/design.md similarity index 99% rename from planning/changes/archive/2026-06-08.08-readme-link-cleanup/design.md rename to planning/changes/2026-06-08.08-readme-link-cleanup/design.md index b1a06d3..540c71d 100644 --- a/planning/changes/archive/2026-06-08.08-readme-link-cleanup/design.md +++ b/planning/changes/2026-06-08.08-readme-link-cleanup/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-08 slug: readme-link-cleanup +summary: README link cleanup supersedes: null superseded_by: null pr: 39 diff --git a/planning/changes/archive/2026-06-08.08-readme-link-cleanup/plan.md b/planning/changes/2026-06-08.08-readme-link-cleanup/plan.md similarity index 100% rename from planning/changes/archive/2026-06-08.08-readme-link-cleanup/plan.md rename to planning/changes/2026-06-08.08-readme-link-cleanup/plan.md diff --git a/planning/changes/archive/2026-06-10.01-multi-decoder/design.md b/planning/changes/2026-06-10.01-multi-decoder/design.md similarity index 99% rename from planning/changes/archive/2026-06-10.01-multi-decoder/design.md rename to planning/changes/2026-06-10.01-multi-decoder/design.md index 8c1967f..57b5e1d 100644 --- a/planning/changes/archive/2026-06-10.01-multi-decoder/design.md +++ b/planning/changes/2026-06-10.01-multi-decoder/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-10 slug: multi-decoder +summary: Shipped 0.9.0 — multi-decoder routing supersedes: null superseded_by: null pr: 41 diff --git a/planning/changes/archive/2026-06-10.01-multi-decoder/plan.md b/planning/changes/2026-06-10.01-multi-decoder/plan.md similarity index 100% rename from planning/changes/archive/2026-06-10.01-multi-decoder/plan.md rename to planning/changes/2026-06-10.01-multi-decoder/plan.md diff --git a/planning/changes/archive/2026-06-10.02-decoder-instance-cache/design.md b/planning/changes/2026-06-10.02-decoder-instance-cache/design.md similarity index 99% rename from planning/changes/archive/2026-06-10.02-decoder-instance-cache/design.md rename to planning/changes/2026-06-10.02-decoder-instance-cache/design.md index c2ee541..1d26e25 100644 --- a/planning/changes/archive/2026-06-10.02-decoder-instance-cache/design.md +++ b/planning/changes/2026-06-10.02-decoder-instance-cache/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-10 slug: decoder-instance-cache +summary: Shipped 0.9.0 — per-instance decoder cache supersedes: null superseded_by: null pr: 42 diff --git a/planning/changes/archive/2026-06-10.02-decoder-instance-cache/plan.md b/planning/changes/2026-06-10.02-decoder-instance-cache/plan.md similarity index 100% rename from planning/changes/archive/2026-06-10.02-decoder-instance-cache/plan.md rename to planning/changes/2026-06-10.02-decoder-instance-cache/plan.md diff --git a/planning/changes/archive/2026-06-12.01-delta-audit/design.md b/planning/changes/2026-06-12.01-delta-audit/design.md similarity index 99% rename from planning/changes/archive/2026-06-12.01-delta-audit/design.md rename to planning/changes/2026-06-12.01-delta-audit/design.md index dc62c0c..3843fe8 100644 --- a/planning/changes/archive/2026-06-12.01-delta-audit/design.md +++ b/planning/changes/2026-06-12.01-delta-audit/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-12 slug: delta-audit +summary: 0.9.0 delta audit; closed via 0.9.1 supersedes: null superseded_by: null pr: 43 diff --git a/planning/changes/archive/2026-06-12.01-delta-audit/plan.md b/planning/changes/2026-06-12.01-delta-audit/plan.md similarity index 100% rename from planning/changes/archive/2026-06-12.01-delta-audit/plan.md rename to planning/changes/2026-06-12.01-delta-audit/plan.md diff --git a/planning/changes/archive/2026-06-13.01-msgspec-nested-customtype-fix/design.md b/planning/changes/2026-06-13.01-msgspec-nested-customtype-fix/design.md similarity index 99% rename from planning/changes/archive/2026-06-13.01-msgspec-nested-customtype-fix/design.md rename to planning/changes/2026-06-13.01-msgspec-nested-customtype-fix/design.md index 5e02c17..2041d3a 100644 --- a/planning/changes/archive/2026-06-13.01-msgspec-nested-customtype-fix/design.md +++ b/planning/changes/2026-06-13.01-msgspec-nested-customtype-fix/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-13 slug: msgspec-nested-customtype-fix +summary: Shipped 0.9.1 — nested-CustomType guard supersedes: null superseded_by: null pr: 43 diff --git a/planning/changes/archive/2026-06-13.01-msgspec-nested-customtype-fix/plan.md b/planning/changes/2026-06-13.01-msgspec-nested-customtype-fix/plan.md similarity index 100% rename from planning/changes/archive/2026-06-13.01-msgspec-nested-customtype-fix/plan.md rename to planning/changes/2026-06-13.01-msgspec-nested-customtype-fix/plan.md diff --git a/planning/changes/archive/2026-06-13.02-circuit-breaker-and-timeout/design.md b/planning/changes/2026-06-13.02-circuit-breaker-and-timeout/design.md similarity index 99% rename from planning/changes/archive/2026-06-13.02-circuit-breaker-and-timeout/design.md rename to planning/changes/2026-06-13.02-circuit-breaker-and-timeout/design.md index 6b80516..3169ffc 100644 --- a/planning/changes/archive/2026-06-13.02-circuit-breaker-and-timeout/design.md +++ b/planning/changes/2026-06-13.02-circuit-breaker-and-timeout/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-13 slug: circuit-breaker-and-timeout +summary: Shipped 0.10.0 — CircuitBreaker + AsyncTimeout supersedes: null superseded_by: null pr: 51 diff --git a/planning/changes/archive/2026-06-13.02-circuit-breaker-and-timeout/plan.md b/planning/changes/2026-06-13.02-circuit-breaker-and-timeout/plan.md similarity index 100% rename from planning/changes/archive/2026-06-13.02-circuit-breaker-and-timeout/plan.md rename to planning/changes/2026-06-13.02-circuit-breaker-and-timeout/plan.md diff --git a/planning/changes/archive/2026-06-13.03-portable-planning-convention/design.md b/planning/changes/2026-06-13.03-portable-planning-convention/design.md similarity index 96% rename from planning/changes/archive/2026-06-13.03-portable-planning-convention/design.md rename to planning/changes/2026-06-13.03-portable-planning-convention/design.md index 0bb4535..b344723 100644 --- a/planning/changes/archive/2026-06-13.03-portable-planning-convention/design.md +++ b/planning/changes/2026-06-13.03-portable-planning-convention/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-13 slug: portable-planning-convention +summary: Adopt the portable two-axis convention: per-capability `architecture/` truth files + `changes/` bundles, full history backfill, byte-identical Conventions. supersedes: null superseded_by: null pr: 55 @@ -110,7 +111,7 @@ its place. `AsyncTimeout`. A `resilience.md` that omitted them would publish a knowingly stale truth file, so `resilience.md` folds in a present-tense paragraph for both, sourced from the shipped -`changes/archive/2026-06-13.02-circuit-breaker-and-timeout/design.md`. This is +`changes/2026-06-13.02-circuit-breaker-and-timeout/design.md`. This is the smallest honest content addition; no broader rewrite. ### 4. `planning/README.md` @@ -135,7 +136,7 @@ Copy `design.md`, `plan.md`, `change.md` from - **`changes/active/`** holds exactly one bundle after migration: this change, `2026-06-13.NN-portable-planning-convention/`. Every other existing spec/plan is shipped. -- **`changes/archive/`** — all 17 flat `specs/`+`plans/` pairs and the ~21 +- **`changes/`** — all 17 flat `specs/`+`plans/` pairs and the ~21 `archive/specs/`+`archive/plans/` pairs regroup into `/{design,plan}.md`. `.NN` ordering is derived from **git merge order / PR number** (several dates collide — 2026-05-31 ×8, @@ -197,7 +198,7 @@ from `main` on the existing workflow; no config change.) - `mkdocs build --strict` — proves every repointed docs link resolves. - Grep gates: - `planning/engineering.md` no longer exists. - - No tracked file outside `planning/changes/archive/` references + - No tracked file outside `planning/changes/` references `planning/(specs|plans|archive|audit|deferred-work)` or `planning/engineering.md`. - `architecture/` contains exactly the eight files; none carries diff --git a/planning/changes/archive/2026-06-13.03-portable-planning-convention/plan.md b/planning/changes/2026-06-13.03-portable-planning-convention/plan.md similarity index 94% rename from planning/changes/archive/2026-06-13.03-portable-planning-convention/plan.md rename to planning/changes/2026-06-13.03-portable-planning-convention/plan.md index 8e4d69f..4ce5b6b 100644 --- a/planning/changes/archive/2026-06-13.03-portable-planning-convention/plan.md +++ b/planning/changes/2026-06-13.03-portable-planning-convention/plan.md @@ -19,7 +19,7 @@ bundles, with all history backfilled and every inbound link repointed. **Architecture:** Split `planning/engineering.md` into eight present-tense `architecture/` capability files; regroup the ~38 existing spec/plan pairs -into `planning/changes/archive//` bundles with full +into `planning/changes//` bundles with full frontmatter (PR + outcome from the embedded map below); author a byte-identical `## Conventions` README; repoint the six `docs/` references and `CLAUDE.md`. Docs-only change — no `src/` or `tests/` edits. @@ -100,7 +100,7 @@ suffix); everything else uses `-design.md` / `-plan.md`. **Files:** - Modify: `.gitignore` (remove the bare `plan.md` rule) - Create: `planning/_templates/{design,plan,change}.md` -- Create dirs: `planning/changes/archive/`, `planning/audits/scripts/` +- Create dirs: `planning/changes/`, `planning/audits/scripts/` - Rename: `planning/deferred-work.md` → `planning/deferred.md` - [ ] **Step 0: Remove the bare `plan.md` gitignore rule** @@ -232,9 +232,9 @@ Per-file source map: Source dirs: `planning/archive/specs/`, `planning/archive/plans/`. For each bundle: -- `mkdir -p planning/changes/archive/` -- `git mv` the design source → `planning/changes/archive//design.md` -- `git mv` the plan source → `planning/changes/archive//plan.md` (skip for +- `mkdir -p planning/changes/` +- `git mv` the design source → `planning/changes//design.md` +- `git mv` the plan source → `planning/changes//plan.md` (skip for **design-only** rows) - Prepend frontmatter to `design.md`: `status: shipped`, `date: `, `slug: `, `supersedes`/`superseded_by` per the map (else `null`), @@ -247,11 +247,11 @@ For each bundle: Process each `2026-05-31.NN` row. Example for `.03`: ```bash - mkdir -p planning/changes/archive/2026-05-31.03-middleware-protocol-and-chain + mkdir -p planning/changes/2026-05-31.03-middleware-protocol-and-chain git mv planning/archive/specs/2026-05-31-middleware-protocol-and-chain-design.md \ - planning/changes/archive/2026-05-31.03-middleware-protocol-and-chain/design.md + planning/changes/2026-05-31.03-middleware-protocol-and-chain/design.md git mv planning/archive/plans/2026-05-31-middleware-protocol-and-chain-plan.md \ - planning/changes/archive/2026-05-31.03-middleware-protocol-and-chain/plan.md + planning/changes/2026-05-31.03-middleware-protocol-and-chain/plan.md ``` Then add frontmatter per the rule above. `.02-shipped-work-review` is **design-only** (source `planning/archive/specs/2026-05-31-shipped-work-review.md`, @@ -299,11 +299,11 @@ Same move+frontmatter procedure as Task 3. `deep-audit` are `pr: 32`; both `retry-budget-cluster` and `post-080-doc-sweep` are `pr: 34`. Example for `deep-audit`: ```bash - mkdir -p planning/changes/archive/2026-06-07.03-deep-audit + mkdir -p planning/changes/2026-06-07.03-deep-audit git mv planning/specs/2026-06-07-deep-audit-design.md \ - planning/changes/archive/2026-06-07.03-deep-audit/design.md + planning/changes/2026-06-07.03-deep-audit/design.md git mv planning/plans/2026-06-07-deep-audit-plan.md \ - planning/changes/archive/2026-06-07.03-deep-audit/plan.md + planning/changes/2026-06-07.03-deep-audit/plan.md ``` - [ ] **Step 2: Move + frontmatter rows 2026-06-10 → 2026-06-13** @@ -311,11 +311,11 @@ Same move+frontmatter procedure as Task 3. Process `2026-06-10.01` through `2026-06-13.02`. For circuit-breaker the plan source has no `-plan` suffix: ```bash - mkdir -p planning/changes/archive/2026-06-13.02-circuit-breaker-and-timeout + mkdir -p planning/changes/2026-06-13.02-circuit-breaker-and-timeout git mv planning/specs/2026-06-13-circuit-breaker-and-timeout-design.md \ - planning/changes/archive/2026-06-13.02-circuit-breaker-and-timeout/design.md + planning/changes/2026-06-13.02-circuit-breaker-and-timeout/design.md git mv planning/plans/2026-06-13-circuit-breaker-and-timeout.md \ - planning/changes/archive/2026-06-13.02-circuit-breaker-and-timeout/plan.md + planning/changes/2026-06-13.02-circuit-breaker-and-timeout/plan.md ``` - [ ] **Step 3: Verify flat source dirs are empty** @@ -410,7 +410,7 @@ Same move+frontmatter procedure as Task 3. - `### Active` → one entry: **portable-planning-convention** (`changes/active/2026-06-13.03-portable-planning-convention/design.md`). - `### Archived (shipped)` → one bullet per archived bundle from the map, - newest first, each linking `changes/archive//design.md` with `(#PR, + newest first, each linking `changes//design.md` with `(#PR, date)` and a one-line gloss. - `## Other` → `architecture/` (the promotion target), `audits/`, `deferred.md`. @@ -463,7 +463,7 @@ Repoint map (prose `engineering.md §N` → `architecture/`): changes/active// → writing-plans → plan.md in the same bundle → executing-plans / subagent-driven-development → requesting-code-review → finishing-a-development-branch; on ship, promote into - architecture/.md and move the bundle to changes/archive/`. + architecture/.md and move the bundle to changes/`. - Seam B link (`[engineering.md](planning/engineering.md) §Seam B`) → `[architecture/decoders.md](architecture/decoders.md)`. - "When in doubt" links → `architecture/` (e.g. @@ -474,7 +474,7 @@ Repoint map (prose `engineering.md §N` → `architecture/`): ```bash grep -rn -E 'planning/(specs|plans|archive|audit|deferred-work|engineering)' planning/releases/ || echo "none" ``` - Repoint any hit to the matching `changes/archive//` bundle (or + Repoint any hit to the matching `changes//` bundle (or `architecture/`/`audits/`/`deferred.md`). If `none`, no edit. - [ ] **Step 4: Commit** @@ -499,7 +499,7 @@ Repoint map (prose `engineering.md §N` → `architecture/`): # No tracked file outside changes/archive references the old paths: grep -rIn -E 'planning/(specs|plans|archive|audit|deferred-work)|planning/engineering\.md' \ --include='*.md' --include='*.yml' --include='*.yaml' --include='*.toml' . \ - | grep -vE '^\./planning/changes/archive/' || echo "no stale refs" + | grep -vE '^\./planning/changes/' || echo "no stale refs" ``` Expected: `engineering.md gone` and `no stale refs`. @@ -538,7 +538,7 @@ Repoint map (prose `engineering.md §N` → `architecture/`): When this PR merges, set the active bundle's `design.md`/`plan.md` frontmatter to `status: shipped`, `pr: `, fill `outcome:`, move - the bundle to `changes/archive/2026-06-13.03-portable-planning-convention/`, + the bundle to `changes/2026-06-13.03-portable-planning-convention/`, and move its Index line from **Active** to **Archived**. (This is the first exercise of the promotion step the convention defines.) diff --git a/planning/changes/archive/2026-06-13.04-docs-accuracy-fixes/change.md b/planning/changes/2026-06-13.04-docs-accuracy-fixes/change.md similarity index 92% rename from planning/changes/archive/2026-06-13.04-docs-accuracy-fixes/change.md rename to planning/changes/2026-06-13.04-docs-accuracy-fixes/change.md index 4d1e3a9..053261c 100644 --- a/planning/changes/archive/2026-06-13.04-docs-accuracy-fixes/change.md +++ b/planning/changes/2026-06-13.04-docs-accuracy-fixes/change.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-13 slug: docs-accuracy-fixes +summary: 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). supersedes: null superseded_by: null pr: f203821 diff --git a/planning/changes/archive/2026-06-13.05-docs-audit-followups/change.md b/planning/changes/2026-06-13.05-docs-audit-followups/change.md similarity index 93% rename from planning/changes/archive/2026-06-13.05-docs-audit-followups/change.md rename to planning/changes/2026-06-13.05-docs-audit-followups/change.md index a1e98a8..8cbbe56 100644 --- a/planning/changes/archive/2026-06-13.05-docs-audit-followups/change.md +++ b/planning/changes/2026-06-13.05-docs-audit-followups/change.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-13 slug: docs-audit-followups +summary: 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). supersedes: null superseded_by: null pr: 58 diff --git a/planning/changes/archive/2026-06-14.01-deep-audit/design.md b/planning/changes/2026-06-14.01-deep-audit/design.md similarity index 97% rename from planning/changes/archive/2026-06-14.01-deep-audit/design.md rename to planning/changes/2026-06-14.01-deep-audit/design.md index 2629a13..7790cfa 100644 --- a/planning/changes/archive/2026-06-14.01-deep-audit/design.md +++ b/planning/changes/2026-06-14.01-deep-audit/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-14 slug: deep-audit +summary: 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). supersedes: null superseded_by: null pr: null diff --git a/planning/changes/archive/2026-06-14.01-deep-audit/plan.md b/planning/changes/2026-06-14.01-deep-audit/plan.md similarity index 100% rename from planning/changes/archive/2026-06-14.01-deep-audit/plan.md rename to planning/changes/2026-06-14.01-deep-audit/plan.md diff --git a/planning/changes/archive/2026-06-14.01-docs-ux-restructure/design.md b/planning/changes/2026-06-14.01-docs-ux-restructure/design.md similarity index 96% rename from planning/changes/archive/2026-06-14.01-docs-ux-restructure/design.md rename to planning/changes/2026-06-14.01-docs-ux-restructure/design.md index ab42d58..2ccf2c3 100644 --- a/planning/changes/archive/2026-06-14.01-docs-ux-restructure/design.md +++ b/planning/changes/2026-06-14.01-docs-ux-restructure/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-14 slug: docs-ux-restructure +summary: 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. supersedes: null superseded_by: null pr: 60 @@ -138,7 +139,7 @@ host changes; the model and call are untouched. Other, illustrative `CLAUDE.md:7` — remove the "It supersedes `community-of-python/base-client` and ships under the `modern-python` org" clause (drop the base-client reference; keep/fold the rest of the sentence). Only this one live file mentions it; frozen -planning history (`retros/`, `changes/archive/`, `audits/`) is intentionally left +planning history (`retros/`, `changes/`, `audits/`) is intentionally left untouched — history is not rewritten. The audit's **G2** is marked "won't do — base-client scrubbed." diff --git a/planning/changes/archive/2026-06-14.01-docs-ux-restructure/plan.md b/planning/changes/2026-06-14.01-docs-ux-restructure/plan.md similarity index 100% rename from planning/changes/archive/2026-06-14.01-docs-ux-restructure/plan.md rename to planning/changes/2026-06-14.01-docs-ux-restructure/plan.md diff --git a/planning/changes/archive/2026-06-14.02-pydantic-import-isolation/change.md b/planning/changes/2026-06-14.02-pydantic-import-isolation/change.md similarity index 92% rename from planning/changes/archive/2026-06-14.02-pydantic-import-isolation/change.md rename to planning/changes/2026-06-14.02-pydantic-import-isolation/change.md index 7ce6211..ceaaf0e 100644 --- a/planning/changes/archive/2026-06-14.02-pydantic-import-isolation/change.md +++ b/planning/changes/2026-06-14.02-pydantic-import-isolation/change.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-14 slug: pydantic-import-isolation +summary: 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. supersedes: null superseded_by: null pr: 62 diff --git a/planning/changes/archive/2026-06-14.03-security-hardening/design.md b/planning/changes/2026-06-14.03-security-hardening/design.md similarity index 96% rename from planning/changes/archive/2026-06-14.03-security-hardening/design.md rename to planning/changes/2026-06-14.03-security-hardening/design.md index 6b1c2d8..28a6a2c 100644 --- a/planning/changes/archive/2026-06-14.03-security-hardening/design.md +++ b/planning/changes/2026-06-14.03-security-hardening/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-14 slug: security-hardening +summary: 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. supersedes: null superseded_by: null pr: 63 diff --git a/planning/changes/archive/2026-06-14.03-security-hardening/plan.md b/planning/changes/2026-06-14.03-security-hardening/plan.md similarity index 100% rename from planning/changes/archive/2026-06-14.03-security-hardening/plan.md rename to planning/changes/2026-06-14.03-security-hardening/plan.md diff --git a/planning/changes/archive/2026-06-14.04-audit-correctness/change.md b/planning/changes/2026-06-14.04-audit-correctness/change.md similarity index 91% rename from planning/changes/archive/2026-06-14.04-audit-correctness/change.md rename to planning/changes/2026-06-14.04-audit-correctness/change.md index 1db99fd..40c0180 100644 --- a/planning/changes/archive/2026-06-14.04-audit-correctness/change.md +++ b/planning/changes/2026-06-14.04-audit-correctness/change.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-14 slug: audit-correctness +summary: 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__`. supersedes: null superseded_by: null pr: 64 diff --git a/planning/changes/archive/2026-06-14.05-audit-test-quality/change.md b/planning/changes/2026-06-14.05-audit-test-quality/change.md similarity index 86% rename from planning/changes/archive/2026-06-14.05-audit-test-quality/change.md rename to planning/changes/2026-06-14.05-audit-test-quality/change.md index b4b5ec2..24d0a8f 100644 --- a/planning/changes/archive/2026-06-14.05-audit-test-quality/change.md +++ b/planning/changes/2026-06-14.05-audit-test-quality/change.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-14 slug: audit-test-quality +summary: 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. supersedes: null superseded_by: null pr: 65 diff --git a/planning/changes/archive/2026-06-14.06-audit-doc-fixes/change.md b/planning/changes/2026-06-14.06-audit-doc-fixes/change.md similarity index 88% rename from planning/changes/archive/2026-06-14.06-audit-doc-fixes/change.md rename to planning/changes/2026-06-14.06-audit-doc-fixes/change.md index 28b6bed..5de7a9f 100644 --- a/planning/changes/archive/2026-06-14.06-audit-doc-fixes/change.md +++ b/planning/changes/2026-06-14.06-audit-doc-fixes/change.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-14 slug: audit-doc-fixes +summary: 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. supersedes: null superseded_by: null pr: 66 diff --git a/planning/changes/archive/2026-06-15.01-custom-decoder-guide/change.md b/planning/changes/2026-06-15.01-custom-decoder-guide/change.md similarity index 97% rename from planning/changes/archive/2026-06-15.01-custom-decoder-guide/change.md rename to planning/changes/2026-06-15.01-custom-decoder-guide/change.md index 6e741ba..eb4206d 100644 --- a/planning/changes/archive/2026-06-15.01-custom-decoder-guide/change.md +++ b/planning/changes/2026-06-15.01-custom-decoder-guide/change.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-15 slug: custom-decoder-guide +summary: Docs: a "write your own `ResponseDecoder`" guide for Seam B, mirroring `docs/middleware.md`. Closed deferred item G6. supersedes: null superseded_by: null pr: 67 diff --git a/planning/changes/archive/2026-06-16.01-per-verb-with-response/design.md b/planning/changes/2026-06-16.01-per-verb-with-response/design.md similarity index 97% rename from planning/changes/archive/2026-06-16.01-per-verb-with-response/design.md rename to planning/changes/2026-06-16.01-per-verb-with-response/design.md index 951f921..236e2eb 100644 --- a/planning/changes/archive/2026-06-16.01-per-verb-with-response/design.md +++ b/planning/changes/2026-06-16.01-per-verb-with-response/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-16 slug: per-verb-with-response +summary: 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. supersedes: null superseded_by: null pr: 68 diff --git a/planning/changes/archive/2026-06-16.01-per-verb-with-response/plan.md b/planning/changes/2026-06-16.01-per-verb-with-response/plan.md similarity index 99% rename from planning/changes/archive/2026-06-16.01-per-verb-with-response/plan.md rename to planning/changes/2026-06-16.01-per-verb-with-response/plan.md index 47ca9c9..6db24b9 100644 --- a/planning/changes/archive/2026-06-16.01-per-verb-with-response/plan.md +++ b/planning/changes/2026-06-16.01-per-verb-with-response/plan.md @@ -550,4 +550,4 @@ Cut 0.12.0 and retire the deferred entry this change closes. Not a task — done when the PR merges, per the planning convention: set this bundle's `design.md` + `plan.md` frontmatter to `status: shipped` with the PR number, move `changes/active/2026-06-16.01-per-verb-with-response/` to -`changes/archive/`, and flip its Index line from Active to Archived. +`changes/`, and flip its Index line from Active to Archived. diff --git a/planning/changes/archive/2026-06-16.02-circuit-breaker-rate-mode/design.md b/planning/changes/2026-06-16.02-circuit-breaker-rate-mode/design.md similarity index 98% rename from planning/changes/archive/2026-06-16.02-circuit-breaker-rate-mode/design.md rename to planning/changes/2026-06-16.02-circuit-breaker-rate-mode/design.md index ea96e62..f1b41ce 100644 --- a/planning/changes/archive/2026-06-16.02-circuit-breaker-rate-mode/design.md +++ b/planning/changes/2026-06-16.02-circuit-breaker-rate-mode/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-16 slug: circuit-breaker-rate-mode +summary: 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)". supersedes: null superseded_by: null pr: 69 diff --git a/planning/changes/archive/2026-06-16.02-circuit-breaker-rate-mode/plan.md b/planning/changes/2026-06-16.02-circuit-breaker-rate-mode/plan.md similarity index 99% rename from planning/changes/archive/2026-06-16.02-circuit-breaker-rate-mode/plan.md rename to planning/changes/2026-06-16.02-circuit-breaker-rate-mode/plan.md index c0b10f5..96659b0 100644 --- a/planning/changes/archive/2026-06-16.02-circuit-breaker-rate-mode/plan.md +++ b/planning/changes/2026-06-16.02-circuit-breaker-rate-mode/plan.md @@ -689,7 +689,7 @@ edit `pyproject.toml` (the static `version` field stays at the placeholder `"0"` Per the planning convention: set this bundle's `design.md` + `plan.md` frontmatter to `status: shipped` with the PR number, move -`changes/active/2026-06-16.02-circuit-breaker-rate-mode/` to `changes/archive/`, +`changes/active/2026-06-16.02-circuit-breaker-rate-mode/` to `changes/`, flip its Index line from Active to Archived, and remove the now-closed "CircuitBreaker v2" item from `planning/deferred.md` (or trim it to just the still-deferred parts: count-based windows, manual control + state, slow-call diff --git a/planning/changes/archive/2026-06-16.03-circuit-breaker-state/design.md b/planning/changes/2026-06-16.03-circuit-breaker-state/design.md similarity index 96% rename from planning/changes/archive/2026-06-16.03-circuit-breaker-state/design.md rename to planning/changes/2026-06-16.03-circuit-breaker-state/design.md index 7edaccf..f6dcbde 100644 --- a/planning/changes/archive/2026-06-16.03-circuit-breaker-state/design.md +++ b/planning/changes/2026-06-16.03-circuit-breaker-state/design.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-16 slug: circuit-breaker-state +summary: 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. supersedes: null superseded_by: null pr: 70 diff --git a/planning/changes/archive/2026-06-16.03-circuit-breaker-state/plan.md b/planning/changes/2026-06-16.03-circuit-breaker-state/plan.md similarity index 99% rename from planning/changes/archive/2026-06-16.03-circuit-breaker-state/plan.md rename to planning/changes/2026-06-16.03-circuit-breaker-state/plan.md index 152874b..2a33db1 100644 --- a/planning/changes/archive/2026-06-16.03-circuit-breaker-state/plan.md +++ b/planning/changes/2026-06-16.03-circuit-breaker-state/plan.md @@ -220,7 +220,7 @@ Version is **tag-driven** — do NOT edit `pyproject.toml` (the field stays `"0" Per the planning convention: set this bundle's `design.md` + `plan.md` to `status: shipped` with the PR number, fill the `## Shipped via` PR number in the release notes, move `changes/active/2026-06-16.03-circuit-breaker-state/` to -`changes/archive/`, flip its Index line from Active to Archived, and update the +`changes/`, flip its Index line from Active to Archived, and update the deferred CircuitBreaker entry — drop the read-only `state` half (now shipped), leaving only manual control (`force_open`/`force_closed`). Release 0.14.0 by creating the `0.14.0` GitHub release (tag-driven publish). diff --git a/planning/changes/archive/2026-06-16.04-delta-audit-followups/change.md b/planning/changes/2026-06-16.04-delta-audit-followups/change.md similarity index 93% rename from planning/changes/archive/2026-06-16.04-delta-audit-followups/change.md rename to planning/changes/2026-06-16.04-delta-audit-followups/change.md index 05b10a6..637e6d7 100644 --- a/planning/changes/archive/2026-06-16.04-delta-audit-followups/change.md +++ b/planning/changes/2026-06-16.04-delta-audit-followups/change.md @@ -2,6 +2,7 @@ status: shipped date: 2026-06-16 slug: delta-audit-followups +summary: 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. supersedes: null superseded_by: null pr: 71 diff --git a/planning/changes/active/.gitkeep b/planning/changes/active/.gitkeep deleted file mode 100644 index e69de29..0000000 From 77ec49871283dffce72c95a7276afd0032217d78 Mon Sep 17 00:00:00 2001 From: Artur Shiriev Date: Sat, 20 Jun 2026 16:15:23 +0300 Subject: [PATCH 2/6] 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) --- Justfile | 4 ++ planning/index.py | 95 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 planning/index.py diff --git a/Justfile b/Justfile index 27cbb18..6d392ee 100644 --- a/Justfile +++ b/Justfile @@ -16,6 +16,10 @@ lint-ci: uv run ruff check --no-fix uv run ty check +# Print the planning change index (grouped by status) to stdout. +index: + uv run python planning/index.py + test *args: uv run --no-sync pytest {{ args }} diff --git a/planning/index.py b/planning/index.py new file mode 100644 index 0000000..6621d3f --- /dev/null +++ b/planning/index.py @@ -0,0 +1,95 @@ +# ruff: noqa: INP001, D212 # planning/ is not a Python package; D212/D213 conflict differs from faststream-outbox +""" +Generate the planning change index from bundle frontmatter. + +Run via ``just index``. Globs ``planning/changes/*/``, reads each bundle's +``design.md`` (falling back to ``change.md``) frontmatter, and prints a +Markdown listing grouped by lifecycle status to stdout. Never writes a file: +the listing is a query over the bundles, not a committed artifact. +""" + +import pathlib +import sys + + +CHANGES_DIR = pathlib.Path(__file__).parent / "changes" +GROUPS: tuple[tuple[str, tuple[str, ...]], ...] = ( + ("In progress", ("draft", "approved")), + ("Shipped", ("shipped",)), + ("Superseded", ("superseded",)), +) + + +def parse_frontmatter(text: str) -> dict[str, str]: + """Parse a single-line-scalar YAML frontmatter block into a dict.""" + lines = text.splitlines() + if not lines or lines[0].strip() != "---": + return {} + fields: dict[str, str] = {} + for line in lines[1:]: + if line.strip() == "---": + break + key, sep, value = line.partition(": ") + if not sep: + continue + cleaned = value.strip().strip('"').strip("'") + fields[key.strip()] = "" if cleaned == "null" else cleaned + return fields + + +def load_bundles() -> list[dict[str, str]]: + """Read every bundle's spec frontmatter under ``CHANGES_DIR``.""" + bundles: list[dict[str, str]] = [] + for bundle in sorted(CHANGES_DIR.iterdir()): + if not bundle.is_dir(): + continue + spec = bundle / "design.md" + if not spec.exists(): + spec = bundle / "change.md" + if not spec.exists(): + continue + fields = parse_frontmatter(spec.read_text(encoding="utf-8")) + fields["path"] = f"changes/{bundle.name}/{spec.name}" + fields["name"] = bundle.name + bundles.append(fields) + return bundles + + +def format_row(bundle: dict[str, str]) -> str: + """Render one bundle as a Markdown list item.""" + slug = bundle.get("slug", "?") + path = bundle.get("path", "") + pr = bundle.get("pr") or "—" + date = bundle.get("date", "") + summary = bundle.get("summary") or "(no summary)" + line = f"- **[{slug}]({path})** (#{pr}, {date}) — {summary}" + if bundle.get("supersedes"): + line += f" _(supersedes {bundle['supersedes']})_" + if bundle.get("superseded_by"): + line += f" _(superseded by {bundle['superseded_by']})_" + return line + + +def render(bundles: list[dict[str, str]]) -> str: + """Render the full grouped Markdown listing.""" + out = ["# Change index", "", "_Generated by `just index` — do not edit._", ""] + for title, statuses in GROUPS: + out += [f"## {title}", ""] + rows = sorted( + (b for b in bundles if b.get("status") in statuses), + key=lambda b: b.get("name", ""), + reverse=True, + ) + out += [format_row(b) for b in rows] if rows else ["_None._"] + out.append("") + return "\n".join(out).rstrip() + "\n" + + +def main() -> int: + """Print the listing to stdout.""" + sys.stdout.write(render(load_bundles())) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From ba33d7b4561d6973b956f9f0e337566fe8b23dbd Mon Sep 17 00:00:00 2001 From: Artur Shiriev Date: Sat, 20 Jun 2026 16:15:31 +0300 Subject: [PATCH 3/6] 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) --- planning/README.md | 97 ++++++++--------------------------- planning/_templates/change.md | 1 + planning/_templates/design.md | 1 + 3 files changed, 22 insertions(+), 77 deletions(-) diff --git a/planning/README.md b/planning/README.md index 9067087..32c8953 100644 --- a/planning/README.md +++ b/planning/README.md @@ -7,33 +7,35 @@ the repo root; this directory records *how it got there*. ## Conventions > This section is the portable convention — identical across the -> modern-python repos. The Index below is repo-specific. To adopt elsewhere, +> modern-python repos. The generated change listing (`just index`) and the `## Other` pointers below are repo-local. To adopt elsewhere, > copy this section plus [`_templates/`](_templates/) and point that repo's > `CLAUDE.md` Workflow + truth home at it. ### Two axes, never mixed - **`architecture/` (repo root) — the present.** One file per capability, - living prose, updated whenever a change ships. The truth home. + living prose, updated in the same PR that ships the change. The truth home. - **`planning/changes/` — the past-and-pending.** One folder per change, - frozen once shipped. + kept in place after ship. -Shipping a change **promotes** its conclusions into the affected -`architecture/.md` by hand, then archives the bundle. That -hand-edit is what keeps `architecture/` true; the archived bundle carries the -*why*. +A change **promotes** its conclusions into the affected +`architecture/.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*. ### Change bundles -A change is a folder `changes/active/YYYY-MM-DD.NN-/`: +A change is a folder `changes/YYYY-MM-DD.NN-/`: - `YYYY-MM-DD` — proposal date; `.NN` — zero-padded intra-day counter (`.01`, `.02`, …) that breaks same-date ties so the timeline sorts stably. - `` — kebab-case description, not a story ID. -On merge the folder moves to `changes/archive/` with `status: shipped`, `pr:`, -and `outcome:` filled, and its line moves from **Active** to **Archived** in -the Index below. +`summary` is written when the change is created (it is the change's +one-liner). The implementing PR then sets `status: shipped` and fills `pr` +and `outcome` **in the branch**, alongside the code and the `architecture/` +promotion — no post-merge bookkeeping, no folder move. ### Three lanes @@ -62,75 +64,16 @@ Templates live in [`_templates/`](_templates/). ### Frontmatter `design.md` / `change.md`: `status` (draft|approved|shipped|superseded), -`date`, `slug`, `supersedes`, `superseded_by`, `pr`, `outcome`. -`plan.md`: `status`, `date`, `slug`, `spec`, `pr`. Files in `architecture/` -carry **no** frontmatter — living prose, dated by git. +`date`, `slug`, `summary` (single line), `supersedes`, `superseded_by`, `pr`, +`outcome`. `plan.md`: `status`, `date`, `slug`, `spec`, `pr`. Files in +`architecture/` carry **no** frontmatter — living prose, dated by git. ## Index -### Active - -_None._ - -### Archived (shipped) - -- **[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. - -- **[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. - -- **[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)". -- **[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. -- **[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. -- **[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. -- **[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. -- **[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__`. -- **[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. -- **[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. -- **[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). -- **[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. -- **[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). -- **[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). -- **[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. -- **[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 -- **[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 -- **[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 -- **[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 -- **[multi-decoder](changes/archive/2026-06-10.01-multi-decoder/design.md)** (#41, 2026-06-10) — Shipped 0.9.0 — multi-decoder routing -- **[readme-link-cleanup](changes/archive/2026-06-08.08-readme-link-cleanup/design.md)** (#39, 2026-06-08) — README link cleanup -- **[mkdocs-gh-pages-migration](changes/archive/2026-06-08.07-mkdocs-gh-pages-migration/design.md)** (#38, 2026-06-08) — Docs host -> GitHub Pages -- **[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 -- **[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 -- **[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 -- **[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 -- **[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 -- **[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 -- **[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 -- **[decoder-error](changes/archive/2026-06-07.02-decoder-error/design.md)** (#32, 2026-06-07) — Shipped 0.8.1 — DecodeError at seam B -- **[sync-client](changes/archive/2026-06-07.01-sync-client/design.md)** (#31, 2026-06-07) — Shipped 0.8.0 — sync Client + Async* rename -- **[modern-di-recipe](changes/archive/2026-06-06.01-modern-di-recipe/design.md)** (#29, 2026-06-06) — modern-di DI recipe doc -- **[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 -- **[extension-slot-docs](changes/archive/2026-06-05.06-extension-slot-docs/design.md)** (#28, 2026-06-05) — Shipped 0.7.0 — middleware docs -- **[observability](changes/archive/2026-06-05.05-observability/design.md)** (#27, 2026-06-05) — Shipped 0.6.0 — logging + OTel events -- **[streaming](changes/archive/2026-06-05.04-streaming/design.md)** (#26, 2026-06-05) — Shipped 0.5.0 — stream() -- **[docs-sync-0.4](changes/archive/2026-06-05.03-docs-sync-0.4/design.md)** (#25, 2026-06-05) — 0.4 docs sync -- **[bulkhead](changes/archive/2026-06-05.02-bulkhead/design.md)** (#23, 2026-06-05) — Shipped 0.4.0 — Bulkhead -- **[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 -- **[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 -- **[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 -- **[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 -- **[input-validation-pass](changes/archive/2026-06-03.01-input-validation-pass/design.md)** (#19, 2026-06-03) — Input-validation hardening -- **[project-hygiene-tidy](changes/archive/2026-06-02.02-project-hygiene-tidy/design.md)** (#18, 2026-06-02) — Repo hygiene pass -- **[docs-reorg-and-mkdocs](changes/archive/2026-06-02.01-docs-reorg-and-mkdocs/design.md)** (#17, 2026-06-02) — Docs reorg + mkdocs scaffolding -- **[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)* -- **[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 -- **[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)* -- **[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)* -- **[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 -- **[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)* -- **[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 -- **[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 -- **[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 -- **[bmad-to-superpowers-transition](changes/archive/2026-05-31.01-bmad-to-superpowers-transition/design.md)** (#6, 2026-05-31) — Bootstrapped the planning workflow +The change listing is **generated**, not maintained — run `just index` to +print it (grouped by `status`: In progress / Shipped / Superseded). The +frontmatter in each bundle is the single source of truth; there is no +committed copy to drift. ## Other diff --git a/planning/_templates/change.md b/planning/_templates/change.md index 0fe24c0..7ffec26 100644 --- a/planning/_templates/change.md +++ b/planning/_templates/change.md @@ -2,6 +2,7 @@ status: draft date: YYYY-MM-DD slug: my-change +summary: One line — shown in the generated index. Fill at ship time. supersedes: null superseded_by: null pr: null diff --git a/planning/_templates/design.md b/planning/_templates/design.md index fb0fe5b..b9e11c9 100644 --- a/planning/_templates/design.md +++ b/planning/_templates/design.md @@ -2,6 +2,7 @@ status: draft date: YYYY-MM-DD slug: my-change +summary: One line — shown in the generated index. Fill at ship time. supersedes: null superseded_by: null pr: null From 5927b4cfb53a672a13175a17cd01c0d08b16832b Mon Sep 17 00:00:00 2001 From: Artur Shiriev Date: Sat, 20 Jun 2026 16:15:44 +0300 Subject: [PATCH 4/6] chore(docs): update CLAUDE.md workflow for flat changes/ (no folder move) Replace active// with / 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) --- CLAUDE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 4b3b770..0509fbb 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -10,14 +10,14 @@ Guidance for AI agents (Claude Code, etc.) working in this repository. - [`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.** - [`planning/README.md`](planning/README.md) — the planning conventions (two axes, change bundles, three lanes, frontmatter) + the change Index. -- [`planning/changes/{active,archive}//`](planning/changes/) — per-change bundles (`design.md` + `plan.md`, or `change.md` for the lightweight lane). +- [`planning/changes//`](planning/changes/) — per-change bundles (`design.md` + `plan.md`, or `change.md` for the lightweight lane). - [`planning/audits/`](planning/audits/) — findings reports + `scripts/` tooling. - [`planning/retros/`](planning/retros/) — retrospectives. - [`planning/releases/`](planning/releases/) — per-version release notes (also published on GitHub Releases). - [`planning/deferred.md`](planning/deferred.md) — review-surfaced, not-yet-actionable items. - [`planning/_templates/`](planning/_templates/) — design/plan/change templates. -**Per-feature workflow:** brainstorming → `design.md` in `planning/changes/active//` → 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/.md` by hand and move the bundle to `planning/changes/archive/`. Topic slugs are kebab-case descriptions (`msgspec-decoder-adapter`), not story IDs. +**Per-feature workflow:** brainstorming → `design.md` in `planning/changes//` → 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/.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. ## Commands From dfc99e652dc2ff64239fe3802e3b2d918873577e Mon Sep 17 00:00:00 2001 From: Artur Shiriev Date: Sat, 20 Jun 2026 16:58:38 +0300 Subject: [PATCH 5/6] 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// paths. Repoint them to the flat changes//. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../audits/scripts/_discover-2026-06-14.json | 168 +++++++++--------- planning/releases/0.4.0.md | 4 +- planning/releases/0.5.0.md | 2 +- planning/releases/0.6.0.md | 2 +- planning/releases/0.7.0.md | 4 +- planning/releases/0.8.0.md | 4 +- planning/releases/0.8.1.md | 2 +- planning/releases/0.9.0.md | 4 +- 8 files changed, 95 insertions(+), 95 deletions(-) diff --git a/planning/audits/scripts/_discover-2026-06-14.json b/planning/audits/scripts/_discover-2026-06-14.json index f510ed7..7070b01 100644 --- a/planning/audits/scripts/_discover-2026-06-14.json +++ b/planning/audits/scripts/_discover-2026-06-14.json @@ -201,90 +201,90 @@ "planning/changes/archive": { "note": "Archived (shipped) per-change bundles; each bundle is a design.md+plan.md pair (or a single change.md for the lightweight lane). 60 bundles, 121 files total, listed individually below.", "files": { - "planning/changes/archive/2026-05-31.01-bmad-to-superpowers-transition/design.md": {"lines": 178, "purpose": "Design for migrating planning from BMAD to the superpowers convention."}, - "planning/changes/archive/2026-05-31.01-bmad-to-superpowers-transition/plan.md": {"lines": 669, "purpose": "Plan for migrating planning from BMAD to the superpowers convention."}, - "planning/changes/archive/2026-05-31.02-shipped-work-review/design.md": {"lines": 94, "purpose": "Design for a review of already-shipped work."}, - "planning/changes/archive/2026-05-31.03-middleware-protocol-and-chain/design.md": {"lines": 228, "purpose": "Design for the middleware protocol and chain composition."}, - "planning/changes/archive/2026-05-31.03-middleware-protocol-and-chain/plan.md": {"lines": 838, "purpose": "Plan for the middleware protocol and chain composition."}, - "planning/changes/archive/2026-05-31.04-phase-shortcut-decorators/design.md": {"lines": 245, "purpose": "Design for the phase-shortcut middleware decorators."}, - "planning/changes/archive/2026-05-31.04-phase-shortcut-decorators/plan.md": {"lines": 747, "purpose": "Plan for the phase-shortcut middleware decorators."}, - "planning/changes/archive/2026-05-31.05-request-immutability-helpers/design.md": {"lines": 169, "purpose": "Design for request immutability helpers."}, - "planning/changes/archive/2026-05-31.05-request-immutability-helpers/plan.md": {"lines": 551, "purpose": "Plan for request immutability helpers."}, - "planning/changes/archive/2026-05-31.06-msgspec-decoder-via-extras/design.md": {"lines": 206, "purpose": "Design for the msgspec decoder via an optional extra."}, - "planning/changes/archive/2026-05-31.06-msgspec-decoder-via-extras/plan.md": {"lines": 479, "purpose": "Plan for the msgspec decoder via an optional extra."}, - "planning/changes/archive/2026-05-31.07-asyncclient/design.md": {"lines": 478, "purpose": "Design for the AsyncClient."}, - "planning/changes/archive/2026-05-31.07-asyncclient/plan.md": {"lines": 1902, "purpose": "Plan for the AsyncClient."}, - "planning/changes/archive/2026-05-31.08-recordedtransport/design.md": {"lines": 291, "purpose": "Design for the (later removed) RecordedTransport test helper."}, - "planning/changes/archive/2026-05-31.08-recordedtransport/plan.md": {"lines": 1051, "purpose": "Plan for the (later removed) RecordedTransport test helper."}, - "planning/changes/archive/2026-05-31.09-release-0.1.0-prep/design.md": {"lines": 271, "purpose": "Design for the v0.1.0 release preparation."}, - "planning/changes/archive/2026-05-31.09-release-0.1.0-prep/plan.md": {"lines": 505, "purpose": "Plan for the v0.1.0 release preparation."}, - "planning/changes/archive/2026-06-01.01-auth-coercion/design.md": {"lines": 382, "purpose": "Design for auth coercion handling."}, - "planning/changes/archive/2026-06-01.01-auth-coercion/plan.md": {"lines": 1014, "purpose": "Plan for auth coercion handling."}, - "planning/changes/archive/2026-06-02.01-docs-reorg-and-mkdocs/design.md": {"lines": 128, "purpose": "Design for docs reorganization and MkDocs adoption."}, - "planning/changes/archive/2026-06-02.01-docs-reorg-and-mkdocs/plan.md": {"lines": 787, "purpose": "Plan for docs reorganization and MkDocs adoption."}, - "planning/changes/archive/2026-06-02.02-project-hygiene-tidy/design.md": {"lines": 198, "purpose": "Design for a project-hygiene tidy-up."}, - "planning/changes/archive/2026-06-02.02-project-hygiene-tidy/plan.md": {"lines": 735, "purpose": "Plan for a project-hygiene tidy-up."}, - "planning/changes/archive/2026-06-03.01-input-validation-pass/design.md": {"lines": 236, "purpose": "Design for an input-validation pass over the client surface."}, - "planning/changes/archive/2026-06-03.01-input-validation-pass/plan.md": {"lines": 794, "purpose": "Plan for an input-validation pass over the client surface."}, - "planning/changes/archive/2026-06-03.02-thin-httpx2-wrapper/design.md": {"lines": 340, "purpose": "Design for the thin httpx2-wrapper pivot."}, - "planning/changes/archive/2026-06-03.02-thin-httpx2-wrapper/plan.md": {"lines": 2531, "purpose": "Plan for the thin httpx2-wrapper pivot."}, - "planning/changes/archive/2026-06-04.01-pydantic-optional-extra/design.md": {"lines": 460, "purpose": "Design for making pydantic an optional extra."}, - "planning/changes/archive/2026-06-04.01-pydantic-optional-extra/plan.md": {"lines": 1066, "purpose": "Plan for making pydantic an optional extra."}, - "planning/changes/archive/2026-06-04.02-v0.2-retro-and-housekeeping/design.md": {"lines": 208, "purpose": "Design for the v0.2 retro and housekeeping."}, - "planning/changes/archive/2026-06-05.01-retry-and-retry-budget/design.md": {"lines": 252, "purpose": "Design for retry and retry-budget middleware."}, - "planning/changes/archive/2026-06-05.01-retry-and-retry-budget/plan.md": {"lines": 1905, "purpose": "Plan for retry and retry-budget middleware."}, - "planning/changes/archive/2026-06-05.02-bulkhead/design.md": {"lines": 216, "purpose": "Design for the bulkhead concurrency limiter."}, - "planning/changes/archive/2026-06-05.02-bulkhead/plan.md": {"lines": 963, "purpose": "Plan for the bulkhead concurrency limiter."}, - "planning/changes/archive/2026-06-05.03-docs-sync-0.4/design.md": {"lines": 185, "purpose": "Design for syncing docs to the 0.4 surface."}, - "planning/changes/archive/2026-06-05.03-docs-sync-0.4/plan.md": {"lines": 645, "purpose": "Plan for syncing docs to the 0.4 surface."}, - "planning/changes/archive/2026-06-05.04-streaming/design.md": {"lines": 335, "purpose": "Design for streaming-response support."}, - "planning/changes/archive/2026-06-05.04-streaming/plan.md": {"lines": 1097, "purpose": "Plan for streaming-response support."}, - "planning/changes/archive/2026-06-05.05-observability/design.md": {"lines": 265, "purpose": "Design for observability (logging + OTel) support."}, - "planning/changes/archive/2026-06-05.05-observability/plan.md": {"lines": 1056, "purpose": "Plan for observability (logging + OTel) support."}, - "planning/changes/archive/2026-06-05.06-extension-slot-docs/design.md": {"lines": 148, "purpose": "Design for documenting the extension slots/seams."}, - "planning/changes/archive/2026-06-05.06-extension-slot-docs/plan.md": {"lines": 540, "purpose": "Plan for documenting the extension slots/seams."}, - "planning/changes/archive/2026-06-05.07-v0.7-docs-expansion/design.md": {"lines": 322, "purpose": "Design for the v0.7 docs expansion."}, - "planning/changes/archive/2026-06-05.07-v0.7-docs-expansion/plan.md": {"lines": 956, "purpose": "Plan for the v0.7 docs expansion."}, - "planning/changes/archive/2026-06-06.01-modern-di-recipe/design.md": {"lines": 285, "purpose": "Design for the modern-DI recipe doc."}, - "planning/changes/archive/2026-06-06.01-modern-di-recipe/plan.md": {"lines": 620, "purpose": "Plan for the modern-DI recipe doc."}, - "planning/changes/archive/2026-06-07.01-sync-client/design.md": {"lines": 595, "purpose": "Design for the synchronous Client."}, - "planning/changes/archive/2026-06-07.01-sync-client/plan.md": {"lines": 3533, "purpose": "Plan for the synchronous Client."}, - "planning/changes/archive/2026-06-07.02-decoder-error/design.md": {"lines": 270, "purpose": "Design for DecodeError/MissingDecoderError handling."}, - "planning/changes/archive/2026-06-07.02-decoder-error/plan.md": {"lines": 931, "purpose": "Plan for DecodeError/MissingDecoderError handling."}, - "planning/changes/archive/2026-06-07.03-deep-audit/design.md": {"lines": 294, "purpose": "Design for the 2026-06-07 deep-audit change bundle."}, - "planning/changes/archive/2026-06-07.03-deep-audit/plan.md": {"lines": 757, "purpose": "Plan for the 2026-06-07 deep-audit change bundle."}, - "planning/changes/archive/2026-06-08.01-send-with-response/design.md": {"lines": 225, "purpose": "Design for the send_with_response API."}, - "planning/changes/archive/2026-06-08.01-send-with-response/plan.md": {"lines": 669, "purpose": "Plan for the send_with_response API."}, - "planning/changes/archive/2026-06-08.02-retry-budget-cluster/design.md": {"lines": 298, "purpose": "Design for the retry-budget cluster fixes."}, - "planning/changes/archive/2026-06-08.02-retry-budget-cluster/plan.md": {"lines": 1335, "purpose": "Plan for the retry-budget cluster fixes."}, - "planning/changes/archive/2026-06-08.03-post-080-doc-sweep/design.md": {"lines": 254, "purpose": "Design for the post-0.8.0 documentation sweep."}, - "planning/changes/archive/2026-06-08.03-post-080-doc-sweep/plan.md": {"lines": 665, "purpose": "Plan for the post-0.8.0 documentation sweep."}, - "planning/changes/archive/2026-06-08.04-otel-partial-install/design.md": {"lines": 221, "purpose": "Design for handling partial OpenTelemetry installs."}, - "planning/changes/archive/2026-06-08.04-otel-partial-install/plan.md": {"lines": 508, "purpose": "Plan for handling partial OpenTelemetry installs."}, - "planning/changes/archive/2026-06-08.05-small-fixes-mop-up/design.md": {"lines": 297, "purpose": "Design for a small-fixes mop-up bundle."}, - "planning/changes/archive/2026-06-08.05-small-fixes-mop-up/plan.md": {"lines": 715, "purpose": "Plan for a small-fixes mop-up bundle."}, - "planning/changes/archive/2026-06-08.06-test-mop-up/design.md": {"lines": 406, "purpose": "Design for a test-suite mop-up bundle."}, - "planning/changes/archive/2026-06-08.06-test-mop-up/plan.md": {"lines": 818, "purpose": "Plan for a test-suite mop-up bundle."}, - "planning/changes/archive/2026-06-08.07-mkdocs-gh-pages-migration/design.md": {"lines": 126, "purpose": "Design for migrating docs to MkDocs on GitHub Pages."}, - "planning/changes/archive/2026-06-08.07-mkdocs-gh-pages-migration/plan.md": {"lines": 628, "purpose": "Plan for migrating docs to MkDocs on GitHub Pages."}, - "planning/changes/archive/2026-06-08.08-readme-link-cleanup/design.md": {"lines": 98, "purpose": "Design for cleaning up README links."}, - "planning/changes/archive/2026-06-08.08-readme-link-cleanup/plan.md": {"lines": 431, "purpose": "Plan for cleaning up README links."}, - "planning/changes/archive/2026-06-10.01-multi-decoder/design.md": {"lines": 405, "purpose": "Design for multi-decoder list routing (Seam B)."}, - "planning/changes/archive/2026-06-10.01-multi-decoder/plan.md": {"lines": 1943, "purpose": "Plan for multi-decoder list routing (Seam B)."}, - "planning/changes/archive/2026-06-10.02-decoder-instance-cache/design.md": {"lines": 304, "purpose": "Design for the per-instance decoder cache."}, - "planning/changes/archive/2026-06-10.02-decoder-instance-cache/plan.md": {"lines": 522, "purpose": "Plan for the per-instance decoder cache."}, - "planning/changes/archive/2026-06-12.01-delta-audit/design.md": {"lines": 145, "purpose": "Design for the 2026-06-12 delta-audit change bundle."}, - "planning/changes/archive/2026-06-12.01-delta-audit/plan.md": {"lines": 541, "purpose": "Plan for the 2026-06-12 delta-audit change bundle."}, - "planning/changes/archive/2026-06-13.01-msgspec-nested-customtype-fix/design.md": {"lines": 139, "purpose": "Design for the msgspec nested-custom-type decode fix."}, - "planning/changes/archive/2026-06-13.01-msgspec-nested-customtype-fix/plan.md": {"lines": 323, "purpose": "Plan for the msgspec nested-custom-type decode fix."}, - "planning/changes/archive/2026-06-13.02-circuit-breaker-and-timeout/design.md": {"lines": 319, "purpose": "Design for the circuit-breaker and timeout middleware."}, - "planning/changes/archive/2026-06-13.02-circuit-breaker-and-timeout/plan.md": {"lines": 1558, "purpose": "Plan for the circuit-breaker and timeout middleware."}, - "planning/changes/archive/2026-06-13.03-portable-planning-convention/design.md": {"lines": 225, "purpose": "Design for a portable planning convention."}, - "planning/changes/archive/2026-06-13.03-portable-planning-convention/plan.md": {"lines": 552, "purpose": "Plan for a portable planning convention."}, - "planning/changes/archive/2026-06-13.04-docs-accuracy-fixes/change.md": {"lines": 64, "purpose": "Lightweight-lane change for docs-accuracy fixes."}, - "planning/changes/archive/2026-06-13.05-docs-audit-followups/change.md": {"lines": 71, "purpose": "Lightweight-lane change for docs-audit follow-ups."}, - "planning/changes/archive/2026-06-14.01-docs-ux-restructure/design.md": {"lines": 172, "purpose": "Design for the docs UX restructure (thin README, canonical site)."}, - "planning/changes/archive/2026-06-14.01-docs-ux-restructure/plan.md": {"lines": 459, "purpose": "Plan for the docs UX restructure (thin README, canonical site)."} + "planning/changes/2026-05-31.01-bmad-to-superpowers-transition/design.md": {"lines": 178, "purpose": "Design for migrating planning from BMAD to the superpowers convention."}, + "planning/changes/2026-05-31.01-bmad-to-superpowers-transition/plan.md": {"lines": 669, "purpose": "Plan for migrating planning from BMAD to the superpowers convention."}, + "planning/changes/2026-05-31.02-shipped-work-review/design.md": {"lines": 94, "purpose": "Design for a review of already-shipped work."}, + "planning/changes/2026-05-31.03-middleware-protocol-and-chain/design.md": {"lines": 228, "purpose": "Design for the middleware protocol and chain composition."}, + "planning/changes/2026-05-31.03-middleware-protocol-and-chain/plan.md": {"lines": 838, "purpose": "Plan for the middleware protocol and chain composition."}, + "planning/changes/2026-05-31.04-phase-shortcut-decorators/design.md": {"lines": 245, "purpose": "Design for the phase-shortcut middleware decorators."}, + "planning/changes/2026-05-31.04-phase-shortcut-decorators/plan.md": {"lines": 747, "purpose": "Plan for the phase-shortcut middleware decorators."}, + "planning/changes/2026-05-31.05-request-immutability-helpers/design.md": {"lines": 169, "purpose": "Design for request immutability helpers."}, + "planning/changes/2026-05-31.05-request-immutability-helpers/plan.md": {"lines": 551, "purpose": "Plan for request immutability helpers."}, + "planning/changes/2026-05-31.06-msgspec-decoder-via-extras/design.md": {"lines": 206, "purpose": "Design for the msgspec decoder via an optional extra."}, + "planning/changes/2026-05-31.06-msgspec-decoder-via-extras/plan.md": {"lines": 479, "purpose": "Plan for the msgspec decoder via an optional extra."}, + "planning/changes/2026-05-31.07-asyncclient/design.md": {"lines": 478, "purpose": "Design for the AsyncClient."}, + "planning/changes/2026-05-31.07-asyncclient/plan.md": {"lines": 1902, "purpose": "Plan for the AsyncClient."}, + "planning/changes/2026-05-31.08-recordedtransport/design.md": {"lines": 291, "purpose": "Design for the (later removed) RecordedTransport test helper."}, + "planning/changes/2026-05-31.08-recordedtransport/plan.md": {"lines": 1051, "purpose": "Plan for the (later removed) RecordedTransport test helper."}, + "planning/changes/2026-05-31.09-release-0.1.0-prep/design.md": {"lines": 271, "purpose": "Design for the v0.1.0 release preparation."}, + "planning/changes/2026-05-31.09-release-0.1.0-prep/plan.md": {"lines": 505, "purpose": "Plan for the v0.1.0 release preparation."}, + "planning/changes/2026-06-01.01-auth-coercion/design.md": {"lines": 382, "purpose": "Design for auth coercion handling."}, + "planning/changes/2026-06-01.01-auth-coercion/plan.md": {"lines": 1014, "purpose": "Plan for auth coercion handling."}, + "planning/changes/2026-06-02.01-docs-reorg-and-mkdocs/design.md": {"lines": 128, "purpose": "Design for docs reorganization and MkDocs adoption."}, + "planning/changes/2026-06-02.01-docs-reorg-and-mkdocs/plan.md": {"lines": 787, "purpose": "Plan for docs reorganization and MkDocs adoption."}, + "planning/changes/2026-06-02.02-project-hygiene-tidy/design.md": {"lines": 198, "purpose": "Design for a project-hygiene tidy-up."}, + "planning/changes/2026-06-02.02-project-hygiene-tidy/plan.md": {"lines": 735, "purpose": "Plan for a project-hygiene tidy-up."}, + "planning/changes/2026-06-03.01-input-validation-pass/design.md": {"lines": 236, "purpose": "Design for an input-validation pass over the client surface."}, + "planning/changes/2026-06-03.01-input-validation-pass/plan.md": {"lines": 794, "purpose": "Plan for an input-validation pass over the client surface."}, + "planning/changes/2026-06-03.02-thin-httpx2-wrapper/design.md": {"lines": 340, "purpose": "Design for the thin httpx2-wrapper pivot."}, + "planning/changes/2026-06-03.02-thin-httpx2-wrapper/plan.md": {"lines": 2531, "purpose": "Plan for the thin httpx2-wrapper pivot."}, + "planning/changes/2026-06-04.01-pydantic-optional-extra/design.md": {"lines": 460, "purpose": "Design for making pydantic an optional extra."}, + "planning/changes/2026-06-04.01-pydantic-optional-extra/plan.md": {"lines": 1066, "purpose": "Plan for making pydantic an optional extra."}, + "planning/changes/2026-06-04.02-v0.2-retro-and-housekeeping/design.md": {"lines": 208, "purpose": "Design for the v0.2 retro and housekeeping."}, + "planning/changes/2026-06-05.01-retry-and-retry-budget/design.md": {"lines": 252, "purpose": "Design for retry and retry-budget middleware."}, + "planning/changes/2026-06-05.01-retry-and-retry-budget/plan.md": {"lines": 1905, "purpose": "Plan for retry and retry-budget middleware."}, + "planning/changes/2026-06-05.02-bulkhead/design.md": {"lines": 216, "purpose": "Design for the bulkhead concurrency limiter."}, + "planning/changes/2026-06-05.02-bulkhead/plan.md": {"lines": 963, "purpose": "Plan for the bulkhead concurrency limiter."}, + "planning/changes/2026-06-05.03-docs-sync-0.4/design.md": {"lines": 185, "purpose": "Design for syncing docs to the 0.4 surface."}, + "planning/changes/2026-06-05.03-docs-sync-0.4/plan.md": {"lines": 645, "purpose": "Plan for syncing docs to the 0.4 surface."}, + "planning/changes/2026-06-05.04-streaming/design.md": {"lines": 335, "purpose": "Design for streaming-response support."}, + "planning/changes/2026-06-05.04-streaming/plan.md": {"lines": 1097, "purpose": "Plan for streaming-response support."}, + "planning/changes/2026-06-05.05-observability/design.md": {"lines": 265, "purpose": "Design for observability (logging + OTel) support."}, + "planning/changes/2026-06-05.05-observability/plan.md": {"lines": 1056, "purpose": "Plan for observability (logging + OTel) support."}, + "planning/changes/2026-06-05.06-extension-slot-docs/design.md": {"lines": 148, "purpose": "Design for documenting the extension slots/seams."}, + "planning/changes/2026-06-05.06-extension-slot-docs/plan.md": {"lines": 540, "purpose": "Plan for documenting the extension slots/seams."}, + "planning/changes/2026-06-05.07-v0.7-docs-expansion/design.md": {"lines": 322, "purpose": "Design for the v0.7 docs expansion."}, + "planning/changes/2026-06-05.07-v0.7-docs-expansion/plan.md": {"lines": 956, "purpose": "Plan for the v0.7 docs expansion."}, + "planning/changes/2026-06-06.01-modern-di-recipe/design.md": {"lines": 285, "purpose": "Design for the modern-DI recipe doc."}, + "planning/changes/2026-06-06.01-modern-di-recipe/plan.md": {"lines": 620, "purpose": "Plan for the modern-DI recipe doc."}, + "planning/changes/2026-06-07.01-sync-client/design.md": {"lines": 595, "purpose": "Design for the synchronous Client."}, + "planning/changes/2026-06-07.01-sync-client/plan.md": {"lines": 3533, "purpose": "Plan for the synchronous Client."}, + "planning/changes/2026-06-07.02-decoder-error/design.md": {"lines": 270, "purpose": "Design for DecodeError/MissingDecoderError handling."}, + "planning/changes/2026-06-07.02-decoder-error/plan.md": {"lines": 931, "purpose": "Plan for DecodeError/MissingDecoderError handling."}, + "planning/changes/2026-06-07.03-deep-audit/design.md": {"lines": 294, "purpose": "Design for the 2026-06-07 deep-audit change bundle."}, + "planning/changes/2026-06-07.03-deep-audit/plan.md": {"lines": 757, "purpose": "Plan for the 2026-06-07 deep-audit change bundle."}, + "planning/changes/2026-06-08.01-send-with-response/design.md": {"lines": 225, "purpose": "Design for the send_with_response API."}, + "planning/changes/2026-06-08.01-send-with-response/plan.md": {"lines": 669, "purpose": "Plan for the send_with_response API."}, + "planning/changes/2026-06-08.02-retry-budget-cluster/design.md": {"lines": 298, "purpose": "Design for the retry-budget cluster fixes."}, + "planning/changes/2026-06-08.02-retry-budget-cluster/plan.md": {"lines": 1335, "purpose": "Plan for the retry-budget cluster fixes."}, + "planning/changes/2026-06-08.03-post-080-doc-sweep/design.md": {"lines": 254, "purpose": "Design for the post-0.8.0 documentation sweep."}, + "planning/changes/2026-06-08.03-post-080-doc-sweep/plan.md": {"lines": 665, "purpose": "Plan for the post-0.8.0 documentation sweep."}, + "planning/changes/2026-06-08.04-otel-partial-install/design.md": {"lines": 221, "purpose": "Design for handling partial OpenTelemetry installs."}, + "planning/changes/2026-06-08.04-otel-partial-install/plan.md": {"lines": 508, "purpose": "Plan for handling partial OpenTelemetry installs."}, + "planning/changes/2026-06-08.05-small-fixes-mop-up/design.md": {"lines": 297, "purpose": "Design for a small-fixes mop-up bundle."}, + "planning/changes/2026-06-08.05-small-fixes-mop-up/plan.md": {"lines": 715, "purpose": "Plan for a small-fixes mop-up bundle."}, + "planning/changes/2026-06-08.06-test-mop-up/design.md": {"lines": 406, "purpose": "Design for a test-suite mop-up bundle."}, + "planning/changes/2026-06-08.06-test-mop-up/plan.md": {"lines": 818, "purpose": "Plan for a test-suite mop-up bundle."}, + "planning/changes/2026-06-08.07-mkdocs-gh-pages-migration/design.md": {"lines": 126, "purpose": "Design for migrating docs to MkDocs on GitHub Pages."}, + "planning/changes/2026-06-08.07-mkdocs-gh-pages-migration/plan.md": {"lines": 628, "purpose": "Plan for migrating docs to MkDocs on GitHub Pages."}, + "planning/changes/2026-06-08.08-readme-link-cleanup/design.md": {"lines": 98, "purpose": "Design for cleaning up README links."}, + "planning/changes/2026-06-08.08-readme-link-cleanup/plan.md": {"lines": 431, "purpose": "Plan for cleaning up README links."}, + "planning/changes/2026-06-10.01-multi-decoder/design.md": {"lines": 405, "purpose": "Design for multi-decoder list routing (Seam B)."}, + "planning/changes/2026-06-10.01-multi-decoder/plan.md": {"lines": 1943, "purpose": "Plan for multi-decoder list routing (Seam B)."}, + "planning/changes/2026-06-10.02-decoder-instance-cache/design.md": {"lines": 304, "purpose": "Design for the per-instance decoder cache."}, + "planning/changes/2026-06-10.02-decoder-instance-cache/plan.md": {"lines": 522, "purpose": "Plan for the per-instance decoder cache."}, + "planning/changes/2026-06-12.01-delta-audit/design.md": {"lines": 145, "purpose": "Design for the 2026-06-12 delta-audit change bundle."}, + "planning/changes/2026-06-12.01-delta-audit/plan.md": {"lines": 541, "purpose": "Plan for the 2026-06-12 delta-audit change bundle."}, + "planning/changes/2026-06-13.01-msgspec-nested-customtype-fix/design.md": {"lines": 139, "purpose": "Design for the msgspec nested-custom-type decode fix."}, + "planning/changes/2026-06-13.01-msgspec-nested-customtype-fix/plan.md": {"lines": 323, "purpose": "Plan for the msgspec nested-custom-type decode fix."}, + "planning/changes/2026-06-13.02-circuit-breaker-and-timeout/design.md": {"lines": 319, "purpose": "Design for the circuit-breaker and timeout middleware."}, + "planning/changes/2026-06-13.02-circuit-breaker-and-timeout/plan.md": {"lines": 1558, "purpose": "Plan for the circuit-breaker and timeout middleware."}, + "planning/changes/2026-06-13.03-portable-planning-convention/design.md": {"lines": 225, "purpose": "Design for a portable planning convention."}, + "planning/changes/2026-06-13.03-portable-planning-convention/plan.md": {"lines": 552, "purpose": "Plan for a portable planning convention."}, + "planning/changes/2026-06-13.04-docs-accuracy-fixes/change.md": {"lines": 64, "purpose": "Lightweight-lane change for docs-accuracy fixes."}, + "planning/changes/2026-06-13.05-docs-audit-followups/change.md": {"lines": 71, "purpose": "Lightweight-lane change for docs-audit follow-ups."}, + "planning/changes/2026-06-14.01-docs-ux-restructure/design.md": {"lines": 172, "purpose": "Design for the docs UX restructure (thin README, canonical site)."}, + "planning/changes/2026-06-14.01-docs-ux-restructure/plan.md": {"lines": 459, "purpose": "Plan for the docs UX restructure (thin README, canonical site)."} } } } diff --git a/planning/releases/0.4.0.md b/planning/releases/0.4.0.md index 23d2658..e74cb79 100644 --- a/planning/releases/0.4.0.md +++ b/planning/releases/0.4.0.md @@ -144,6 +144,6 @@ Out of scope for this release (per the specs, may revisit on real-user pain): pe ## References -- Retry bundle: [`planning/changes/archive/2026-06-05.01-retry-and-retry-budget/`](../changes/archive/2026-06-05.01-retry-and-retry-budget/) — design + implementation plan. -- Bulkhead bundle: [`planning/changes/archive/2026-06-05.02-bulkhead/`](../changes/archive/2026-06-05.02-bulkhead/) — design + implementation plan. +- Retry bundle: [`planning/changes/2026-06-05.01-retry-and-retry-budget/`](../changes/2026-06-05.01-retry-and-retry-budget/) — design + implementation plan. +- Bulkhead bundle: [`planning/changes/2026-06-05.02-bulkhead/`](../changes/2026-06-05.02-bulkhead/) — design + implementation plan. - Architecture notes: [`architecture/resilience.md`](../../architecture/resilience.md) diff --git a/planning/releases/0.5.0.md b/planning/releases/0.5.0.md index 654a79b..1b24296 100644 --- a/planning/releases/0.5.0.md +++ b/planning/releases/0.5.0.md @@ -49,5 +49,5 @@ except NotFoundError as exc: ## References -- Bundle: [`planning/changes/archive/2026-06-05.04-streaming/`](../changes/archive/2026-06-05.04-streaming/) — design + implementation plan. +- Bundle: [`planning/changes/2026-06-05.04-streaming/`](../changes/2026-06-05.04-streaming/) — design + implementation plan. - Architecture notes: [`architecture/overview.md`](../../architecture/overview.md) diff --git a/planning/releases/0.6.0.md b/planning/releases/0.6.0.md index e99404c..0573cf6 100644 --- a/planning/releases/0.6.0.md +++ b/planning/releases/0.6.0.md @@ -58,5 +58,5 @@ This effectively closes Epic 5. Remaining roadmap is Epic 6 (ship v1.0): docs si ## References -- Bundle: [`planning/changes/archive/2026-06-05.05-observability/`](../changes/archive/2026-06-05.05-observability/) — design + implementation plan. +- Bundle: [`planning/changes/2026-06-05.05-observability/`](../changes/2026-06-05.05-observability/) — design + implementation plan. - Architecture notes: [`architecture/overview.md`](../../architecture/overview.md) diff --git a/planning/releases/0.7.0.md b/planning/releases/0.7.0.md index 1fed137..5f2c492 100644 --- a/planning/releases/0.7.0.md +++ b/planning/releases/0.7.0.md @@ -34,6 +34,6 @@ Remaining roadmap is Epic 6 (ship v1.0): `6-2` docs site infrastructure (mkdocs ## References -- Middleware docs bundle: [`planning/changes/archive/2026-06-05.06-extension-slot-docs/`](../changes/archive/2026-06-05.06-extension-slot-docs/) — design + implementation plan. -- Docs-expansion bundle: [`planning/changes/archive/2026-06-05.07-v0.7-docs-expansion/`](../changes/archive/2026-06-05.07-v0.7-docs-expansion/) — design + implementation plan. +- Middleware docs bundle: [`planning/changes/2026-06-05.06-extension-slot-docs/`](../changes/2026-06-05.06-extension-slot-docs/) — design + implementation plan. +- Docs-expansion bundle: [`planning/changes/2026-06-05.07-v0.7-docs-expansion/`](../changes/2026-06-05.07-v0.7-docs-expansion/) — design + implementation plan. - Architecture notes: [`architecture/overview.md`](../../architecture/overview.md) diff --git a/planning/releases/0.8.0.md b/planning/releases/0.8.0.md index 556a3dd..c73a66b 100644 --- a/planning/releases/0.8.0.md +++ b/planning/releases/0.8.0.md @@ -55,6 +55,6 @@ Then update the symbol references in the file bodies (your type checker will gui ## References -- Sync-client bundle: [`planning/changes/archive/2026-06-07.01-sync-client/`](../changes/archive/2026-06-07.01-sync-client/) — design + implementation plan. +- Sync-client bundle: [`planning/changes/2026-06-07.01-sync-client/`](../changes/2026-06-07.01-sync-client/) — design + implementation plan. - Architecture notes: [`architecture/middleware.md`](../../architecture/middleware.md) (Seam A), [`architecture/overview.md`](../../architecture/overview.md) (module layout). -- Source spec parent (httpx convention): [`planning/changes/archive/2026-06-03.02-thin-httpx2-wrapper/`](../changes/archive/2026-06-03.02-thin-httpx2-wrapper/) +- Source spec parent (httpx convention): [`planning/changes/2026-06-03.02-thin-httpx2-wrapper/`](../changes/2026-06-03.02-thin-httpx2-wrapper/) diff --git a/planning/releases/0.8.1.md b/planning/releases/0.8.1.md index c768334..ec1aad2 100644 --- a/planning/releases/0.8.1.md +++ b/planning/releases/0.8.1.md @@ -59,5 +59,5 @@ If you already catch `httpware.ClientError`, nothing changes — your handler no ## See also -- [`planning/changes/archive/2026-06-07.02-decoder-error/`](../changes/archive/2026-06-07.02-decoder-error/) — design rationale + implementation plan. +- [`planning/changes/2026-06-07.02-decoder-error/`](../changes/2026-06-07.02-decoder-error/) — design rationale + implementation plan. - PR [#32](https://github.com/modern-python/httpware/pull/32). diff --git a/planning/releases/0.9.0.md b/planning/releases/0.9.0.md index 48108d2..612e398 100644 --- a/planning/releases/0.9.0.md +++ b/planning/releases/0.9.0.md @@ -87,7 +87,7 @@ with patch.object(PydanticDecoder, "_get_adapter", side_effect=TypeError): ## References -- Multi-decoder bundle: [`planning/changes/archive/2026-06-10.01-multi-decoder/`](../changes/archive/2026-06-10.01-multi-decoder/) — design + implementation plan. -- Cache-refactor bundle: [`planning/changes/archive/2026-06-10.02-decoder-instance-cache/`](../changes/archive/2026-06-10.02-decoder-instance-cache/) — design + implementation plan. +- Multi-decoder bundle: [`planning/changes/2026-06-10.01-multi-decoder/`](../changes/2026-06-10.01-multi-decoder/) — design + implementation plan. +- Cache-refactor bundle: [`planning/changes/2026-06-10.02-decoder-instance-cache/`](../changes/2026-06-10.02-decoder-instance-cache/) — design + implementation plan. - Architecture notes: [`architecture/decoders.md`](../../architecture/decoders.md) — Seam B contract. - PRs: [#41](https://github.com/modern-python/httpware/pull/41), [#42](https://github.com/modern-python/httpware/pull/42) From 9d39440f612a3b53e5b474edfdf92951f009c8a5 Mon Sep 17 00:00:00 2001 From: Artur Shiriev Date: Sat, 20 Jun 2026 17:12:40 +0300 Subject: [PATCH 6/6] 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) --- .../audits/scripts/_discover-2026-06-14.json | 2 +- .../plan.md | 552 ------------------ 2 files changed, 1 insertion(+), 553 deletions(-) delete mode 100644 planning/changes/2026-06-13.03-portable-planning-convention/plan.md diff --git a/planning/audits/scripts/_discover-2026-06-14.json b/planning/audits/scripts/_discover-2026-06-14.json index 7070b01..ada019e 100644 --- a/planning/audits/scripts/_discover-2026-06-14.json +++ b/planning/audits/scripts/_discover-2026-06-14.json @@ -198,7 +198,7 @@ "planning/changes/active/2026-06-14.01-deep-audit/plan.md": {"lines": 577, "purpose": "Implementation plan for the active 2026-06-14 deep-audit change bundle."} } }, - "planning/changes/archive": { + "planning/changes": { "note": "Archived (shipped) per-change bundles; each bundle is a design.md+plan.md pair (or a single change.md for the lightweight lane). 60 bundles, 121 files total, listed individually below.", "files": { "planning/changes/2026-05-31.01-bmad-to-superpowers-transition/design.md": {"lines": 178, "purpose": "Design for migrating planning from BMAD to the superpowers convention."}, diff --git a/planning/changes/2026-06-13.03-portable-planning-convention/plan.md b/planning/changes/2026-06-13.03-portable-planning-convention/plan.md deleted file mode 100644 index 4ce5b6b..0000000 --- a/planning/changes/2026-06-13.03-portable-planning-convention/plan.md +++ /dev/null @@ -1,552 +0,0 @@ ---- -status: shipped -date: 2026-06-13 -slug: portable-planning-convention -spec: portable-planning-convention -pr: 55 ---- - -# portable-planning-convention — implementation plan - -> **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. - -**Goal:** Migrate `httpware`'s planning layout to the portable two-axis -convention: per-capability `architecture/` truth files + `planning/changes/` -bundles, with all history backfilled and every inbound link repointed. - -**Architecture:** Split `planning/engineering.md` into eight present-tense -`architecture/` capability files; regroup the ~38 existing spec/plan pairs -into `planning/changes//` bundles with full -frontmatter (PR + outcome from the embedded map below); author a -byte-identical `## Conventions` README; repoint the six `docs/` references and -`CLAUDE.md`. Docs-only change — no `src/` or `tests/` edits. - -**Tech stack:** Markdown, `git mv`, `just lint-ci`, `mkdocs build --strict`. - -**Spec:** [`design.md`](./design.md) - -**Branch:** `chore/portable-planning-convention` (already created; the active -bundle's `design.md` + this `plan.md` are already committed there). - -**Commit strategy:** One commit per task. - ---- - -## Reference: the complete bundle map - -Every archived bundle below. `id` = `.NN-` (date = the proposal -date on the existing filename; `.NN` = PR-merge order within that date). Each -bundle gets `design.md` (+ `plan.md` unless marked **design-only**). Source -files are the current `planning/{specs,plans,archive/specs,archive/plans}/` -paths sharing the `-` stem. - -| Bundle id | PR | outcome (frontmatter `outcome:`) | supersedes / superseded_by | -|-----------|----|----------------------------------|----------------------------| -| `2026-05-31.01-bmad-to-superpowers-transition` | #6 | Bootstrapped the planning workflow | — | -| `2026-05-31.02-shipped-work-review` **design-only** | #7 | 0.1.0-era review of shipped stories | — | -| `2026-05-31.03-middleware-protocol-and-chain` | #8 | Shipped in 0.1.0; survived the v0.2 pivot | — | -| `2026-05-31.04-phase-shortcut-decorators` | #9 | Shipped in 0.1.0; survived the v0.2 pivot | — | -| `2026-05-31.05-request-immutability-helpers` | #10 | Shipped in 0.1.0; removed by the v0.2 pivot | superseded_by: `2026-06-03.02-thin-httpx2-wrapper` | -| `2026-05-31.06-msgspec-decoder-via-extras` | #11 | Shipped in 0.1.0; carry-forward decoder | — | -| `2026-05-31.07-asyncclient` | #12 | Shipped in 0.1.0; rewritten by the v0.2 pivot | superseded_by: `2026-06-03.02-thin-httpx2-wrapper` | -| `2026-05-31.08-recordedtransport` | #13 | Shipped in 0.1.0; removed by the v0.2 pivot | superseded_by: `2026-06-03.02-thin-httpx2-wrapper` | -| `2026-05-31.09-release-0.1.0-prep` | #14 | 0.1.0 released | — | -| `2026-06-01.01-auth-coercion` | #16 | Shipped (Epic 2); removed by the v0.2 pivot | superseded_by: `2026-06-03.02-thin-httpx2-wrapper` | -| `2026-06-02.01-docs-reorg-and-mkdocs` | #17 | Docs reorg + mkdocs scaffolding | — | -| `2026-06-02.02-project-hygiene-tidy` | #18 | Repo hygiene pass | — | -| `2026-06-03.01-input-validation-pass` | #19 | Input-validation hardening | — | -| `2026-06-03.02-thin-httpx2-wrapper` | #20 | Shipped 0.2.0 — the thin-wrapper pivot | supersedes: `2026-05-31.05`, `.07`, `.08`, `2026-06-01.01` | -| `2026-06-04.01-pydantic-optional-extra` | #21 | Shipped 0.3.0 — pydantic moves to an extra | — | -| `2026-06-04.02-v0.2-retro-and-housekeeping` **design-only** | #21 | Post-0.2 retro + housekeeping | — | -| `2026-06-05.01-retry-and-retry-budget` | #22 | Shipped 0.4.0 — Retry + RetryBudget | — | -| `2026-06-05.02-bulkhead` | #23 | Shipped 0.4.0 — Bulkhead | — | -| `2026-06-05.03-docs-sync-0.4` | #25 | 0.4 docs sync | — | -| `2026-06-05.04-streaming` | #26 | Shipped 0.5.0 — `stream()` | — | -| `2026-06-05.05-observability` | #27 | Shipped 0.6.0 — logging + OTel events | — | -| `2026-06-05.06-extension-slot-docs` | #28 | Shipped 0.7.0 — middleware docs | — | -| `2026-06-05.07-v0.7-docs-expansion` | #28 | Shipped 0.7.0 — first-cut user docs | — | -| `2026-06-06.01-modern-di-recipe` | #29 | modern-di DI recipe doc | — | -| `2026-06-07.01-sync-client` | #31 | Shipped 0.8.0 — sync `Client` + `Async*` rename | — | -| `2026-06-07.02-decoder-error` | #32 | Shipped 0.8.1 — `DecodeError` at seam B | — | -| `2026-06-07.03-deep-audit` | #32 | Deep audit; findings closed across 0.8.1–0.8.6 | — | -| `2026-06-08.01-send-with-response` | #33 | Shipped 0.8.2 — `send_with_response` | — | -| `2026-06-08.02-retry-budget-cluster` | #34 | Shipped 0.8.3 — 7 RetryBudget findings | — | -| `2026-06-08.03-post-080-doc-sweep` | #34 | Post-0.8.0 doc sweep | — | -| `2026-06-08.04-otel-partial-install` | #35 | Shipped 0.8.4 — OTel partial-install guards | — | -| `2026-06-08.05-small-fixes-mop-up` | #36 | Shipped 0.8.5 — 4 small audit findings | — | -| `2026-06-08.06-test-mop-up` | #37 | Shipped 0.8.6 — test-only audit findings | — | -| `2026-06-08.07-mkdocs-gh-pages-migration` | #38 | Docs host → GitHub Pages | — | -| `2026-06-08.08-readme-link-cleanup` | #39 | README link cleanup | — | -| `2026-06-10.01-multi-decoder` | #41 | Shipped 0.9.0 — multi-decoder routing | — | -| `2026-06-10.02-decoder-instance-cache` | #42 | Shipped 0.9.0 — per-instance decoder cache | — | -| `2026-06-12.01-delta-audit` | #43 | 0.9.0 delta audit; closed via 0.9.1 | — | -| `2026-06-13.01-msgspec-nested-customtype-fix` | #43 | Shipped 0.9.1 — nested-CustomType guard | — | -| `2026-06-13.02-circuit-breaker-and-timeout` | #51 | Shipped 0.10.0 — CircuitBreaker + AsyncTimeout | — | - -`2026-06-13.03-portable-planning-convention` is **this** change — already in -`changes/active/`, frontmatter finalized at merge (Task 8). - -Filename→stem note: the source plan for circuit-breaker is -`planning/plans/2026-06-13-circuit-breaker-and-timeout.md` (no `-plan` -suffix); everything else uses `-design.md` / `-plan.md`. - ---- - -### Task 1: Bootstrap the convention skeleton - -**Files:** -- Modify: `.gitignore` (remove the bare `plan.md` rule) -- Create: `planning/_templates/{design,plan,change}.md` -- Create dirs: `planning/changes/`, `planning/audits/scripts/` -- Rename: `planning/deferred-work.md` → `planning/deferred.md` - -- [ ] **Step 0: Remove the bare `plan.md` gitignore rule** - - Line 26 of `.gitignore` is a bare `plan.md` (intended for a root scratch - file) that would make every bundle's `plan.md` untracked — incompatible - with the convention. Delete that line. Verify: - ```bash - ! git check-ignore planning/changes/active/2026-06-13.03-portable-planning-convention/plan.md && echo "plan.md tracked" - ``` - Expected: `plan.md tracked`. (Already applied during planning if committed - with this bundle; confirm it stuck.) - -- [ ] **Step 1: Copy the templates as-is** - - ```bash - mkdir -p planning/_templates planning/changes/archive planning/audits/scripts - cp /Users/kevinsmith/src/pypi/faststream-outbox/planning/_templates/design.md planning/_templates/design.md - cp /Users/kevinsmith/src/pypi/faststream-outbox/planning/_templates/plan.md planning/_templates/plan.md - cp /Users/kevinsmith/src/pypi/faststream-outbox/planning/_templates/change.md planning/_templates/change.md - ``` - -- [ ] **Step 2: Rename deferred-work.md and keep a `.gitkeep`-free clean tree** - - ```bash - git mv planning/deferred-work.md planning/deferred.md - ``` - -- [ ] **Step 3: Verify the templates are byte-identical to source** - - ```bash - for f in design plan change; do - diff -q /Users/kevinsmith/src/pypi/faststream-outbox/planning/_templates/$f.md planning/_templates/$f.md - done - ``` - Expected: no output (identical). - -- [ ] **Step 4: Commit** - - The `git mv` in Step 2 already staged the rename; just add the templates. - ```bash - git add planning/_templates planning/deferred.md - git commit -m "chore(planning): bootstrap convention skeleton (templates, deferred.md rename) - - Co-Authored-By: Claude Opus 4.8 (1M context) " - ``` - ---- - -### Task 2: Split `engineering.md` into `architecture/` (and delete it) - -**Files:** -- Create: `architecture/{overview,client,middleware,decoders,errors,resilience,extras,testing}.md` -- Delete: `planning/engineering.md` -- Source: `planning/engineering.md` (read in full first) - -Re-projection rules for every file: -1. Relocate the mapped `engineering.md` content; **flatten "as of 0.x …" - narration to present tense** (the truth axis is the present). -2. **Drop history pointers** (`see planning/archive/specs/…`, "Shipped in - v0.X", roadmap "see …" links) — that record now lives in the bundles. -3. **No frontmatter** in any `architecture/` file (living prose, dated by git). -4. Do **not** carry §8 (roadmap), the v0.1→v0.2 "deleted/rewritten" - archaeology, or the §9 deferred stub into any file — they dissolve. - -Per-file source map: - -| File | From `engineering.md` | -|------|-----------------------| -| `overview.md` | §1 (present-tense intent + the "three things" framing + "httpx2 is part of the public surface"), §2 invariants (keep the *why*), §5 module-layout tree | -| `client.md` | the `Client`/`AsyncClient` surface, the internal terminal + error-mapping location (from §3 intro + §4 paras 4–5), sync/async parity, `stream()` (from §1 0.5.0 line) | -| `middleware.md` | §3 Seam A in full + the "why no standalone OTel middleware" rationale (from §8's 5-4 retirement note) | -| `decoders.md` | §3 Seam B in full (dispatch, default-list, single-pass rule, per-instance cache, `MissingDecoderError`) | -| `errors.md` | §4 in full | -| `resilience.md` | Retry/`RetryBudget`/Bulkhead/backoff + the logging/OTel events they emit + **new** CircuitBreaker/AsyncTimeout paragraph | -| `extras.md` | §3 Seam C + §7 optional-extras pattern + the isolation test | -| `testing.md` | §6 in full | - -- [ ] **Step 1: Read the source** - - Read `planning/engineering.md` end to end before writing any file. - -- [ ] **Step 2: Author the eight files** - - Write each `architecture/*.md` per the map and the re-projection rules. - Each file opens with an `#` H1 title (e.g. `# Errors`) and present-tense - prose. Keep code samples (the `raise NotFoundError(response)` block, the - `pyproject` extras block, the module tree) verbatim. - -- [ ] **Step 3: Add the CircuitBreaker/AsyncTimeout paragraph to `resilience.md`** - - Source the present-tense facts from - `planning/plans/2026-06-13-circuit-breaker-and-timeout.md` and - `planning/specs/2026-06-13-circuit-breaker-and-timeout-design.md` (still at - their pre-migration paths during this task). Cover: `AsyncCircuitBreaker` - (classic consecutive-failure) + sync `CircuitBreaker`; `CircuitOpenError`; - `AsyncTimeout` overall-deadline middleware (rejects non-finite timeouts); - and the documented composition order (`AsyncBulkhead` → … per the shipped - docs). Do not invent behavior not in those sources. - -- [ ] **Step 4: Delete the old truth file** - - ```bash - git rm planning/engineering.md - ``` - -- [ ] **Step 5: Sanity-check no `architecture/` file carries frontmatter or history pointers** - - ```bash - ! grep -rlE '^---$|planning/(specs|plans|archive)|^status:' architecture/ && echo OK - ``` - Expected: `OK`. - -- [ ] **Step 6: Commit** - - Step 4 already staged the deletion; just add the new files. - ```bash - git add architecture/ - git commit -m "docs(architecture): split engineering.md into per-capability truth files - - Co-Authored-By: Claude Opus 4.8 (1M context) " - ``` - ---- - -### Task 3: Migrate the archive cohort (2026-05-31 → 2026-06-05) - -**Files:** rows `2026-05-31.*` through `2026-06-05.*` of the bundle map. -Source dirs: `planning/archive/specs/`, `planning/archive/plans/`. - -For each bundle: -- `mkdir -p planning/changes/` -- `git mv` the design source → `planning/changes//design.md` -- `git mv` the plan source → `planning/changes//plan.md` (skip for - **design-only** rows) -- Prepend frontmatter to `design.md`: `status: shipped`, `date: `, - `slug: `, `supersedes`/`superseded_by` per the map (else `null`), - `pr: `, `outcome: ''`. To `plan.md`: `status: shipped`, - `date`, `slug`, `spec: `, `pr: `. -- If the file already has a leading `# …` H1, leave the body; insert - frontmatter above it. - -- [ ] **Step 1: Move + frontmatter the 2026-05-31 cohort (rows .01–.09)** - - Process each `2026-05-31.NN` row. Example for `.03`: - ```bash - mkdir -p planning/changes/2026-05-31.03-middleware-protocol-and-chain - git mv planning/archive/specs/2026-05-31-middleware-protocol-and-chain-design.md \ - planning/changes/2026-05-31.03-middleware-protocol-and-chain/design.md - git mv planning/archive/plans/2026-05-31-middleware-protocol-and-chain-plan.md \ - planning/changes/2026-05-31.03-middleware-protocol-and-chain/plan.md - ``` - Then add frontmatter per the rule above. `.02-shipped-work-review` is - **design-only** (source `planning/archive/specs/2026-05-31-shipped-work-review.md`, - no plan). - -- [ ] **Step 2: Move + frontmatter the 2026-06-01 → 2026-06-05 cohort** - - Rows `2026-06-01.01` through `2026-06-05.07`. `.02-v0.2-retro-and-housekeeping` - (2026-06-04) is **design-only**. Apply `supersedes:` to - `2026-06-03.02-thin-httpx2-wrapper` and `superseded_by:` to its three - superseded bundles per the map. - -- [ ] **Step 3: Verify the source dirs are empty and removable** - - ```bash - ls planning/archive/specs planning/archive/plans 2>/dev/null - ``` - Expected: empty. Then `git rm -r --ignore-unmatch` is unnecessary (git mv - already staged the moves); remove the now-empty `planning/archive/` tree: - ```bash - rmdir planning/archive/specs planning/archive/plans planning/archive 2>/dev/null || true - ``` - -- [ ] **Step 4: Commit** - - ```bash - git add planning/changes/archive - git commit -m "docs(planning): migrate 0.1.0–0.7.0 specs/plans into change bundles - - Co-Authored-By: Claude Opus 4.8 (1M context) " - ``` - ---- - -### Task 4: Migrate the flat cohort (2026-06-06 → 2026-06-13) - -**Files:** rows `2026-06-06.*` through `2026-06-13.02` of the bundle map. -Source dirs: `planning/specs/`, `planning/plans/`. - -Same move+frontmatter procedure as Task 3. - -- [ ] **Step 1: Move + frontmatter rows 2026-06-06 → 2026-06-08** - - Process `2026-06-06.01` through `2026-06-08.08`. Both `decoder-error` and - `deep-audit` are `pr: 32`; both `retry-budget-cluster` and - `post-080-doc-sweep` are `pr: 34`. Example for `deep-audit`: - ```bash - mkdir -p planning/changes/2026-06-07.03-deep-audit - git mv planning/specs/2026-06-07-deep-audit-design.md \ - planning/changes/2026-06-07.03-deep-audit/design.md - git mv planning/plans/2026-06-07-deep-audit-plan.md \ - planning/changes/2026-06-07.03-deep-audit/plan.md - ``` - -- [ ] **Step 2: Move + frontmatter rows 2026-06-10 → 2026-06-13** - - Process `2026-06-10.01` through `2026-06-13.02`. For circuit-breaker the - plan source has no `-plan` suffix: - ```bash - mkdir -p planning/changes/2026-06-13.02-circuit-breaker-and-timeout - git mv planning/specs/2026-06-13-circuit-breaker-and-timeout-design.md \ - planning/changes/2026-06-13.02-circuit-breaker-and-timeout/design.md - git mv planning/plans/2026-06-13-circuit-breaker-and-timeout.md \ - planning/changes/2026-06-13.02-circuit-breaker-and-timeout/plan.md - ``` - -- [ ] **Step 3: Verify flat source dirs are empty** - - ```bash - ls planning/specs planning/plans 2>/dev/null - ``` - Expected: empty. Then: - ```bash - rmdir planning/specs planning/plans 2>/dev/null || true - ``` - -- [ ] **Step 4: Commit** - - ```bash - git add planning/changes/archive - git commit -m "docs(planning): migrate 0.8.0–0.10.0 specs/plans into change bundles - - Co-Authored-By: Claude Opus 4.8 (1M context) " - ``` - ---- - -### Task 5: Move audit reports and tooling - -**Files:** -- `planning/audit/2026-06-07-deep-audit.md` → `planning/audits/2026-06-07-deep-audit.md` -- `planning/audit/2026-06-12-delta-audit.md` → `planning/audits/2026-06-12-delta-audit.md` -- `planning/audit/2026-06-13-delta-audit.md` → `planning/audits/2026-06-13-delta-audit.md` -- `planning/audit/{workflow,workflow-delta}.mjs`, `_discover.json` → `planning/audits/scripts/` - -- [ ] **Step 1: Move reports and tooling** - - ```bash - git mv planning/audit/2026-06-07-deep-audit.md planning/audits/2026-06-07-deep-audit.md - git mv planning/audit/2026-06-12-delta-audit.md planning/audits/2026-06-12-delta-audit.md - git mv planning/audit/2026-06-13-delta-audit.md planning/audits/2026-06-13-delta-audit.md - git mv planning/audit/workflow.mjs planning/audits/scripts/workflow.mjs - git mv planning/audit/workflow-delta.mjs planning/audits/scripts/workflow-delta.mjs - git mv planning/audit/_discover.json planning/audits/scripts/_discover.json - rmdir planning/audit 2>/dev/null || true - ``` - -- [ ] **Step 2: Verify old audit dir is gone** - - ```bash - test ! -d planning/audit && echo OK - ``` - Expected: `OK`. - -- [ ] **Step 3: Commit** - - ```bash - git add planning/audits - git commit -m "docs(planning): move audit reports to audits/, tooling to audits/scripts/ - - Co-Authored-By: Claude Opus 4.8 (1M context) " - ``` - ---- - -### Task 6: Author `planning/README.md` - -**Files:** -- Create: `planning/README.md` -- Source for the `## Conventions` block: `faststream-outbox/planning/README.md` - lines 7–67 (the `## Conventions` heading through the end of `### Frontmatter`). - -- [ ] **Step 1: Write the repo-specific intro** - - ```markdown - # Planning - - Specs, plans, and change history for `httpware`. The living truth about - *what the system does now* lives in [`architecture/`](../architecture/) at - the repo root; this directory records *how it got there*. - ``` - -- [ ] **Step 2: Append the byte-identical `## Conventions` block** - - Copy `faststream-outbox/planning/README.md` lines 7–67 verbatim. Verify: - ```bash - sed -n '7,67p' /Users/kevinsmith/src/pypi/faststream-outbox/planning/README.md > /tmp/conv-src.md - # after writing planning/README.md, extract the same block and diff: - awk '/^## Conventions$/{f=1} f; /^### Frontmatter$/{c=1} c&&/^## Index$/{exit}' planning/README.md - ``` - The `## Conventions` … through end-of-`### Frontmatter` text must match - `/tmp/conv-src.md` exactly (modern-python repos share this block byte-for-byte). - -- [ ] **Step 3: Write the repo-specific `## Index`** - - - `### Active` → one entry: **portable-planning-convention** - (`changes/active/2026-06-13.03-portable-planning-convention/design.md`). - - `### Archived (shipped)` → one bullet per archived bundle from the map, - newest first, each linking `changes//design.md` with `(#PR, - date)` and a one-line gloss. - - `## Other` → `architecture/` (the promotion target), `audits/`, - `deferred.md`. - -- [ ] **Step 4: Commit** - - ```bash - git add planning/README.md - git commit -m "docs(planning): add README with portable Conventions + repo Index - - Co-Authored-By: Claude Opus 4.8 (1M context) " - ``` - ---- - -### Task 7: Repoint inbound links - -**Files:** -- Modify: `docs/resilience.md:357`, `docs/middleware.md:113`, `docs/middleware.md:201`, `docs/errors.md:186`, `docs/testing.md:114`, `docs/index.md:186` -- Modify: `CLAUDE.md` (the "Where to find what" list, the Per-feature Workflow line, the Seam B link at ~:84, the "When in doubt" links at ~:90–95) -- Scan: `planning/releases/*.md` - -Repoint map (prose `engineering.md §N` → `architecture/`): - -| Location | Old | New | -|----------|-----|-----| -| `docs/resilience.md:357` | `` `planning/engineering.md` §3 `` | `` `architecture/middleware.md` `` | -| `docs/middleware.md:113` | `` `planning/engineering.md` §8 `` | `` `architecture/middleware.md` `` | -| `docs/middleware.md:201` | `` `planning/engineering.md` §3 (Seam A) `` | `` `architecture/middleware.md` (Seam A) `` | -| `docs/errors.md:186` | `` `planning/engineering.md` §4 `` | `` `architecture/errors.md` `` | -| `docs/testing.md:114` | `` `planning/engineering.md` §6 `` | `` `architecture/testing.md` `` | -| `docs/index.md:186` | `[…](https://github.com/modern-python/httpware/blob/main/planning/engineering.md)` | `[…](https://github.com/modern-python/httpware/blob/main/architecture/overview.md)` and reword the gloss to point at the `architecture/` set | - -- [ ] **Step 1: Edit the six `docs/` references** - - Apply the repoint map. These are inline-code prose refs (not mkdocs links), - except `docs/index.md:186` which is an absolute GitHub URL — update the URL - and adjust its description to "per-capability design notes under - `architecture/`". - -- [ ] **Step 2: Rewrite the `CLAUDE.md` planning section** - - - "Where to find what" list: replace the `planning/engineering.md`, - `planning/specs/`/`planning/plans/`, `planning/archive/...`, - `planning/deferred-work.md` bullets with: `architecture/` (the truth home - / promotion target), `planning/changes/{active,archive}/` (change - bundles), `planning/audits/`, `planning/retros/`, `planning/releases/`, - `planning/deferred.md`, `planning/_templates/`. - - Per-feature Workflow line: `brainstorming → design.md in - changes/active// → writing-plans → plan.md in the same bundle → - executing-plans / subagent-driven-development → requesting-code-review → - finishing-a-development-branch; on ship, promote into - architecture/.md and move the bundle to changes/`. - - Seam B link (`[engineering.md](planning/engineering.md) §Seam B`) → - `[architecture/decoders.md](architecture/decoders.md)`. - - "When in doubt" links → `architecture/` (e.g. - `[architecture/overview.md](architecture/overview.md)`). - -- [ ] **Step 3: Scan and repoint `planning/releases/`** - - ```bash - grep -rn -E 'planning/(specs|plans|archive|audit|deferred-work|engineering)' planning/releases/ || echo "none" - ``` - Repoint any hit to the matching `changes//` bundle (or - `architecture/`/`audits/`/`deferred.md`). If `none`, no edit. - -- [ ] **Step 4: Commit** - - ```bash - git add docs CLAUDE.md planning/releases - git commit -m "docs: repoint inbound links to architecture/ + changes/ - - Co-Authored-By: Claude Opus 4.8 (1M context) " - ``` - ---- - -### Task 8: Verify and finalize - -**Files:** none created; verification + active-bundle frontmatter note. - -- [ ] **Step 1: Grep gates — no stale paths remain** - - ```bash - test ! -f planning/engineering.md && echo "engineering.md gone" - # No tracked file outside changes/archive references the old paths: - grep -rIn -E 'planning/(specs|plans|archive|audit|deferred-work)|planning/engineering\.md' \ - --include='*.md' --include='*.yml' --include='*.yaml' --include='*.toml' . \ - | grep -vE '^\./planning/changes/' || echo "no stale refs" - ``` - Expected: `engineering.md gone` and `no stale refs`. - -- [ ] **Step 2: `architecture/` has exactly eight files, none with frontmatter** - - ```bash - ls architecture/ | sort | tr '\n' ' '; echo - ! grep -rl '^---$' architecture/ && echo "no frontmatter" - ``` - Expected: the eight files; `no frontmatter`. - -- [ ] **Step 3: `changes/active/` holds only this bundle** - - ```bash - ls planning/changes/active/ - ``` - Expected: `2026-06-13.03-portable-planning-convention`. - -- [ ] **Step 4: Lint** - - ```bash - just lint-ci - ``` - Expected: clean (no auto-fix needed; CI-equivalent check). - -- [ ] **Step 5: Docs build strict** - - ```bash - uv run mkdocs build --strict - ``` - Expected: build succeeds, no warnings. (If `mkdocs` is not in the default - env, use the docs group: `uv run --group docs mkdocs build --strict`, or - the project's documented docs command.) - -- [ ] **Step 6: Note — active-bundle frontmatter is finalized at merge** - - When this PR merges, set the active bundle's `design.md`/`plan.md` - frontmatter to `status: shipped`, `pr: `, fill `outcome:`, move - the bundle to `changes/2026-06-13.03-portable-planning-convention/`, - and move its Index line from **Active** to **Archived**. (This is the first - exercise of the promotion step the convention defines.) - -- [ ] **Step 7: Commit any verification fixups** - - ```bash - git add -A - git commit -m "chore(planning): verification fixups for convention migration - - Co-Authored-By: Claude Opus 4.8 (1M context) " || echo "nothing to commit" - ```