@@ -25,9 +25,6 @@ re-exported as-is. Three protocol seams — client ↔ middleware chain, client
2525httpware ↔ optional extras — are defined in ` CONTEXT.md ` and named ** A** , ** B** and ** C** in the
2626module docstrings that implement them. Never cross a seam except through its protocol.
2727
28- Behavior detail has no prose home — it lives in the code and its ` INVARIANT: ` -marked tests. Before
29- writing prose about a capability, run the admission check in ** Where a fact goes** below.
30-
3128### Key files
3229
3330Every module under ` src/httpware/ ` is named for what it does; read it. What a single-file read will
@@ -68,38 +65,12 @@ parallelism: they run under the GIL for coverage, but the proof comes from the f
6865
6966## Workflow
7067
71- Two things outlive the PR, and there are exactly two places to put them: an alternative
72- ** rejected** with reasoning becomes an ADR in [ ` docs/adr/ ` ] ( docs/adr/ ) (` NNNN-slug.md ` ,
73- sequential), and real work ** not scheduled** becomes a GitHub issue. There is no third state, and
74- no separate truth-home directory — a behaviour change is reviewed with the diff, not promoted to a
75- page.
76-
77- ### Where a fact goes
78-
79- Four homes, one owner each:
80-
81- | Home | Holds |
82- | ---| ---|
83- | ` src/httpware/ ` | anything readable from the module — the default |
84- | a named test | an ** invariant** : must stay true, and a change could silently break it |
85- | ` docs/adr/ ` | a rejected alternative, with the reasoning that would otherwise be re-litigated |
86- | ` docs/ ` | anything a user needs |
87-
88- Before writing a line anywhere:
89-
90- > Can an agent get this by reading ` src/httpware/ ` ? → ** don't write it.**
91- > Would a wrong change here fail a test? → it belongs ** in the test** , not in prose.
92- > Does a user need it? → ** ` docs/ ` ** .
93- > Otherwise it does not get written.
94-
95- ** Prose about mechanism has no home. There is no file to add a paragraph to.** This file included:
96- it is always loaded, so a line that restates a docstring, a justfile comment, or ` pyproject.toml `
97- costs every turn and rots in two places at once.
68+ Real work ** not scheduled** becomes a GitHub issue.
9869
9970An invariant is a test whose name is the claim, with a docstring opening ` INVARIANT: ` and a second
10071paragraph naming ** what breaks it** — design rationale, not a report of what this one test catches;
101- a sibling test may be the one that trips. Both ADRs and ` INVARIANT: ` docstrings ratchet: nothing
102- prunes a record once its call is settled. Keeping them lean is a standing habit .
72+ a sibling test may be the one that trips. Nothing enforces that docstring shape; it is read at
73+ review time .
10374
10475## Code Style
10576
@@ -111,7 +82,7 @@ prunes a record once its call is settled. Keeping them lean is a standing habit.
11182 ` ty ` , which silently accepts the latter without checking the rule
11283- Docstrings: public API documents the contract; internal helpers get a one-line contract, plus at
11384 most 1–2 lines for a genuinely non-obvious constraint. Never narrate implementation or justify
114- code to a reviewer — cross-file rationale lives in an ` INVARIANT: ` test docstring or an ADR
85+ code to a reviewer — cross-file rationale lives in an ` INVARIANT: ` test docstring
11586
11687## Agent skills
11788
0 commit comments