Specs, plans, and change history for httpware. The living truth about
what the system does now lives in architecture/ at
the repo root; this directory records how it got there.
This section is the portable convention — identical across the modern-python repos. The Index below is repo-specific. To adopt elsewhere, copy this section plus
_templates/and point that repo'sCLAUDE.mdWorkflow + truth home at it.
architecture/(repo root) — the present. One file per capability, living prose, updated whenever a change ships. The truth home.planning/changes/— the past-and-pending. One folder per change, frozen once shipped.
Shipping a change promotes its conclusions into the affected
architecture/<capability>.md by hand, then archives the bundle. That
hand-edit is what keeps architecture/ true; the archived bundle carries the
why.
A change is a folder changes/active/YYYY-MM-DD.NN-<slug>/:
YYYY-MM-DD— proposal date;.NN— zero-padded intra-day counter (.01,.02, …) that breaks same-date ties so the timeline sorts stably.<slug>— 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.
| Lane | Artifacts | Use when |
|---|---|---|
| Full | design.md + plan.md |
design judgment; new file/module; public-API change; cross-cutting/multi-file; non-trivial test design |
| Lightweight | change.md |
small-but-real: ≲30 LOC net, ≤2 files, no new file, no public-API change, single straightforward test |
| Tiny | none — conventional commit | typo, dep bump, linter/formatter/CI tweak, mechanical rename, single-line config |
Heavier lane wins on ambiguity. A change.md that outgrows its lane splits
into design.md + plan.md.
design.md— the spec: the thinking (why, design, trade-offs, scope).plan.md— the plan: the sequencing (the executor's task checklist).change.md— both, condensed, for the lightweight lane.releases/<semver>.md— per-release user-facing notes.audits/<date>-<slug>.md— findings from a code/docs/bug-hunt sweep; spawns fix changes.retros/<date>-<slug>.md— what we learned after a body of work.deferred.md— real-but-unscheduled items, each with a revisit trigger.
Templates live in _templates/.
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.
None.
-
delta-audit-followups (#71, 2026-06-16) — Closed the 2026-06-16 delta audit Low findings: rate-mode HALF_OPEN probe-failure re-open test + document-as-intended note. Tests + doc only, no release.
-
circuit-breaker-state (#70, 2026-06-16) — Read-only
stateproperty + publicCircuitStateenum on the circuit breaker. Shipped 0.14.0; closed the read-only-state half of the deferred CircuitBreaker introspection item. -
circuit-breaker-rate-mode (#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 (#68, 2026-06-16) — Added
get_with_response…request_with_responsesiblings (requiredresponse_model, returns(Response, T)) to both clients. Shipped 0.12.0; closed the deferred "Per-verb-with-response siblings" item. -
custom-decoder-guide (#67, 2026-06-15) — Docs: a "write your own
ResponseDecoder" guide for Seam B, mirroringdocs/middleware.md. Closed deferred item G6. -
audit-doc-fixes (#66, 2026-06-14) — Closed the deep-audit 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 (#65, 2026-06-14) — Closed 11 deep-audit 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 theTimeoutErrorcircuit trigger. -
audit-correctness (#64, 2026-06-14) — Closed 8 deep-audit correctness + public-API findings: RetryBudget token ordering, two
OverflowErrorcrashes, the redaction triple-slash, the msgspec guard, streaming-body symmetry, the RetryBudget docstring caveat, andmiddleware/__all__. -
security-hardening (#63, 2026-06-14) — Closed the deep-audit security cluster: URL secret redaction centralized at the
_emit_eventchokepoint (userinfo + sensitive query/fragment keys), opt-inmax_error_body_bytes+ResponseTooLargeErrorbounding thestream()error pre-read, andtrust_env+ header-reachability docs. Non-streaming hard body cap deferred. -
pydantic-import-isolation (#62, 2026-06-14) — Guarded the pydantic import so the decoder module loads without the extra and the
architecture/extras.mdSeam-C invariant holds for pydantic. Closed the deep-audit High + 2 folded Mediums. -
deep-audit (2026-06-14) — Full-codebase deep audit (perf/security/supply-chain gaps + correctness/concurrency/refactoring/test quality). Report: 35 confirmed; all remediated across #62–#66 (non-streaming hard body cap deferred).
-
docs-ux-restructure (#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 (#58, 2026-06-13) — Second docs-audit batch: corrected the overstated invariant-enforcement claims in
CLAUDE.md+architecture/overview.md(onlyprint()/blanket-type: ignoreare machine-checked), readability findings R1–R3, and documented the publicSTATUS_TO_EXCEPTION(G5). -
docs-accuracy-fixes (f203821, 2026-06-13) — Fixed 5 verified factual errors from the docs audit: RetryBudget formula, modern-di 2.x recipe, contributing-doc CI/grep claim,
just lintcomment, middleware stable-contracts list (+ AsyncTimeout non-finite wording). -
portable-planning-convention (#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 (#51, 2026-06-13) — Shipped 0.10.0 — CircuitBreaker + AsyncTimeout
-
msgspec-nested-customtype-fix (#43, 2026-06-13) — Shipped 0.9.1 — nested-CustomType guard
-
delta-audit (#43, 2026-06-12) — 0.9.0 delta audit; closed via 0.9.1
-
decoder-instance-cache (#42, 2026-06-10) — Shipped 0.9.0 — per-instance decoder cache
-
multi-decoder (#41, 2026-06-10) — Shipped 0.9.0 — multi-decoder routing
-
readme-link-cleanup (#39, 2026-06-08) — README link cleanup
-
mkdocs-gh-pages-migration (#38, 2026-06-08) — Docs host -> GitHub Pages
-
test-mop-up (#37, 2026-06-08) — Shipped 0.8.6 — test-only audit findings
-
small-fixes-mop-up (#36, 2026-06-08) — Shipped 0.8.5 — 4 small audit findings
-
otel-partial-install (#35, 2026-06-08) — Shipped 0.8.4 — OTel partial-install guards
-
post-080-doc-sweep (#34, 2026-06-08) — Post-0.8.0 doc sweep
-
retry-budget-cluster (#34, 2026-06-08) — Shipped 0.8.3 — 7 RetryBudget findings
-
send-with-response (#33, 2026-06-08) — Shipped 0.8.2 — send_with_response
-
deep-audit (#32, 2026-06-07) — Deep audit; findings closed across 0.8.1-0.8.6
-
decoder-error (#32, 2026-06-07) — Shipped 0.8.1 — DecodeError at seam B
-
sync-client (#31, 2026-06-07) — Shipped 0.8.0 — sync Client + Async* rename
-
modern-di-recipe (#29, 2026-06-06) — modern-di DI recipe doc
-
v0.7-docs-expansion (#28, 2026-06-05) — Shipped 0.7.0 — first-cut user docs
-
extension-slot-docs (#28, 2026-06-05) — Shipped 0.7.0 — middleware docs
-
observability (#27, 2026-06-05) — Shipped 0.6.0 — logging + OTel events
-
streaming (#26, 2026-06-05) — Shipped 0.5.0 — stream()
-
docs-sync-0.4 (#25, 2026-06-05) — 0.4 docs sync
-
bulkhead (#23, 2026-06-05) — Shipped 0.4.0 — Bulkhead
-
retry-and-retry-budget (#22, 2026-06-05) — Shipped 0.4.0 — Retry + RetryBudget
-
v0.2-retro-and-housekeeping (#21, 2026-06-04) — Post-0.2 retro + housekeeping
-
pydantic-optional-extra (#21, 2026-06-04) — Shipped 0.3.0 — pydantic moves to an extra
-
thin-httpx2-wrapper (#20, 2026-06-03) — Shipped 0.2.0 — the thin-wrapper pivot
-
input-validation-pass (#19, 2026-06-03) — Input-validation hardening
-
project-hygiene-tidy (#18, 2026-06-02) — Repo hygiene pass
-
docs-reorg-and-mkdocs (#17, 2026-06-02) — Docs reorg + mkdocs scaffolding
-
auth-coercion (#16, 2026-06-01) — Shipped (Epic 2); removed by the v0.2 pivot (superseded by thin-httpx2-wrapper)
-
release-0.1.0-prep (#14, 2026-05-31) — 0.1.0 released
-
recordedtransport (#13, 2026-05-31) — Shipped in 0.1.0; removed by the v0.2 pivot (superseded by thin-httpx2-wrapper)
-
asyncclient (#12, 2026-05-31) — Shipped in 0.1.0; rewritten by the v0.2 pivot (superseded by thin-httpx2-wrapper)
-
msgspec-decoder-via-extras (#11, 2026-05-31) — Shipped in 0.1.0; carry-forward decoder
-
request-immutability-helpers (#10, 2026-05-31) — Shipped in 0.1.0; removed by the v0.2 pivot (superseded by thin-httpx2-wrapper)
-
phase-shortcut-decorators (#9, 2026-05-31) — Shipped in 0.1.0; survived the v0.2 pivot
-
middleware-protocol-and-chain (#8, 2026-05-31) — Shipped in 0.1.0; survived the v0.2 pivot
-
shipped-work-review (#7, 2026-05-31) — 0.1.0-era review of shipped stories
-
bmad-to-superpowers-transition (#6, 2026-05-31) — Bootstrapped the planning workflow
architecture/at the repo root — the living per-capability truth (overview, client, middleware, decoders, errors, resilience, optional extras, testing). This is the promotion target on every ship.- audits/ — findings reports (deep audit + delta audits) and
their
scripts/tooling. - deferred.md — real-but-unscheduled items with revisit triggers.