wdi-method 0.6.0 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,409 +1,412 @@
1
- ---
2
- status: Accepted
3
- ---
4
-
5
- # Delivery Flow Guide
6
-
7
- **Loaded when:** opening or closing a gate, opening or closing a spec, setting `mode` or
8
- `risk_accepted`, and any time something already agreed has to change
9
-
10
- This is the flow itself: five gates, the one knob that sets document depth, the one field that sets
11
- review intensity, spec sizing, and what happens when a settled thing has to move. Every other guide
12
- describes one document; this one describes the order they arrive in.
13
-
14
- ## Two fields, and the separation between them is the point
15
-
16
- | Field | Where | Controls | Values | Default |
17
- |---|---|---|---|---|
18
- | `mode` | `index.yaml` (global) **and** `components.yaml` (per component) | **Document depth** — only this | `catalog` · `outline` · `guarded` · `deep` | `catalog` |
19
- | `risk_accepted` | `components.yaml`, per component | **Review intensity**, and the risk-acceptance record | `low` · `medium` · `high` | proposed by the agent, confirmed by the owner |
20
-
21
- Both belong to the owner. They MUST NOT be merged, and neither MUST be derived from the other.
22
-
23
- Merging them makes one legitimate position unsayable: *"this part is risky, I know, and I manage it with
24
- tests and review — not with prose."* If depth were controlled by `risk_accepted`, the only route to a
25
- thin document would be raising `risk_accepted` — which means **lying in the risk record** to buy the
26
- depth you wanted. Recording what is accepted is the entire reason that field exists.
27
-
28
- Project size MUST NOT appear as an input anywhere. Size decides how many components there are, not how
29
- deep each one goes.
30
-
31
- All twelve combinations of the two are legal, and what each one costs is laid out side by side in
32
- `.constitution/method/why/mode-risk-map.md`. It explains and MUST NOT be cited as a rule — this guide is
33
- where both fields are defined.
34
-
35
- ### `mode` — two scopes, and the per-component one wins
36
-
37
- | Scope | Where | Means |
38
- |---|---|---|
39
- | Global | `mode:` in `.control/registry/index.yaml` | The default for every component that does not state its own |
40
- | Per component | `mode:` on the component's row in `components.yaml` | Wins over global. Written only where a component genuinely needs to differ |
41
-
42
- Raising and lowering are both **free and need no justification** — it is a preference, and a preference
43
- does not have to be defended.
44
-
45
- **There is no third scope.** `mode` MUST NOT be overridden per spec or per `SPEC.md`. A spec MAY cross
46
- several components, so a per-spec override would give one component two different depths depending on
47
- which spec touched it — while the document is one, and living.
48
-
49
- > Depth belongs to the component, not to the work.
50
-
51
- ### The four modes
52
-
53
- Each contains everything in the one to its left. Value names are English in YAML **and in prose** — one
54
- thing, one name.
55
-
56
- | `mode` | What is written for that component, beyond the blueprint | G4 |
57
- |---|---|---|
58
- | `catalog` | Nothing. Code is written from the use case catalogue, the three inventories, and C4 | **skipped** |
59
- | `outline` | Full flow for the use cases the component exists for — at most 3 · local business rules · `Decision Summary` + the `LC` list in the SDD | 20 min |
60
- | `guarded` | + **`Failure Behaviour` for every boundary** · `Inherited Constraints` · third-party integration documents | 20 min |
61
- | `deep` | + ABCE robustness analysis · a contract spec per endpoint · data dictionary · flow diagrams · state machines · branch scenarios | 30 min |
62
-
63
- **A component at `mode: catalog` skips G4 entirely**, and that is what makes a global `catalog` genuinely
64
- fast. Control does not disappear; it moves to G3, where the use cases, tables, endpoints, screens, domain
65
- model, and C4 were all approved.
66
-
67
- **`guarded` is the mode most often needed and most often absent.** It buys the single most expensive thing
68
- to lose — the answer to *"what happens if this fails halfway"* for each boundary — without buying the
69
- machinery around it. It stands without ABCE because the boundary list already exists: the API inventory
70
- names the endpoints, the screen inventory names the screens.
71
-
72
- Nine things `mode` never touches: the use case list, the API list, the table list, the screen list, the
73
- domain model, the actor list, the spine, C4 L1/L2/L3, and cross-component business rules. All nine belong
74
- to the blueprint at G3, so they exist even at `catalog`. The complete per-file manifest is in
75
- `.constitution/method/why/artifact-map.md`.
76
-
77
- **Lowering `mode` deletes nothing.** A file already written stops being required, and that is all.
78
-
79
- **Raising `mode` on a component whose code already runs** produces an **as-built record**, not a design.
80
- The evidence labels in `sdd-guide.md` are mandatory there.
81
-
82
- ### `risk_accepted` — review intensity, never depth
83
-
84
- The direction is readable from the field name: `high` means *"I accept a lot of risk here"*, so its review
85
- is the lightest.
86
-
87
- `structure` and `prose` are the baseline everywhere. What `risk_accepted` decides is what is **added**:
88
-
89
- | Value | First review, and the review before a gate | Every re-review after | On the code |
90
- |---|---|---|---|
91
- | `low` | `structure` · `prose` · **`edge-case-hunter`** | `structure` · `prose` | a two-reviewer panel is **required** |
92
- | `medium` | `structure` · `prose` · **`edge-case-hunter`** | `structure` · `prose` | — |
93
- | `high` | `structure` · `prose` | `structure` · `prose` | — |
94
-
95
- The heavy lens is bought **once per artifact and once per gate**, not once per edit. A re-review MUST put
96
- it back when the delta touches money, personal data, an irreversible action, or a third party. And a
97
- review trace has to be fresh **at a gate and at spec close** — between those points a stale trace is
98
- advisory, not a failure. `wdi-review` owns the mechanics of both, including the one case where re-stamping
99
- without re-running is allowed: a change to wording only.
100
-
101
- Review lenses are decided here and **nowhere else**. They MUST NOT be read off `mode`: one component MAY
102
- sit at `mode: catalog` and still be reviewed the hardest.
103
-
104
- Two things are not free, and `wdi-init` owns the conversation around both: `risk_accepted: high` on a
105
- component touching money, personal data, an irreversible action, a contractual promise, or an
106
- un-rollbackable integration requires a named acceptance in `risk_accepted_by` — a person and a date,
107
- written beside the risk (`high-risk-named`) — and an outside party who will demand the artifacts as a deliverable puts
108
- the touched component at `mode: deep` and `risk_accepted: low` whatever the global setting says.
109
-
110
- ## Five gates
111
-
112
- A gate is named for **what is decided there**, never for the work that precedes it. Owner time is spent at
113
- these five points only; between them the agents work alone.
114
-
115
- | Gate | Decides | How often | Budget | The session itself | Its checklist |
116
- |---|---|---|---|---|---|
117
- | **G1 Problem** | What the problem is, whose it is, why it earns work | once | 20' | unchanged | 2 of 7 at `catalog` |
118
- | **G2 Product** | What is built, and how it feels to use | once per PRD | 45' | unchanged | 3 of 7 at `catalog` |
119
- | **G3 Blueprint** | The whole portrait: which use cases, their entities, tables, endpoints, screens, and the invariants binding them | **once per product** | 45' | unchanged | 3 of 7 at `catalog` |
120
- | **G4 Component** | How one Product Component is built, and what the choice costs | **once per Product Component** | 20–30' | **skipped entirely at `catalog`** | 4 of 7, and 30' at `deep` |
121
- | **G5 Release** | Whether it is done and proven | once per spec | 10' | unchanged | 2 of 7 at `catalog` |
122
-
123
- Two different things move, and reading them as one is what makes this table easy to get wrong:
124
-
125
- - **What a gate decides, how often it runs, and its budget never change.** All five, at every setting.
126
- - **G4 is the only gate that can disappear.** At `catalog` its session does not happen at all; the other four
127
- always run.
128
- - **Checklist length is the one thing `mode` shortens everywhere.** At `catalog` only the questions are
129
- required, at G1 and G5 as much as at G4 — see the checklists below.
130
-
131
- That is what makes this holdable in one head: four of the five sessions are always there, and the only
132
- question is how long their checklist is.
133
-
134
- The word "area" is not used anywhere. There is only Product Component.
135
-
136
- ### What is in the blueprint, and what is not
137
-
138
- The most decisive boundary in the method. The previous run broke because "complete" was read as "fully
139
- specified".
140
-
141
- | In the blueprint — G3, once | Not in it — G4, per component |
142
- |---|---|
143
- | Actor list | Full UC flows |
144
- | **Use case list**: one line per UC — id, title, actor, the `FR` it satisfies, `critical` | ABCE robustness analysis |
145
- | Domain entities + relations + columns | Failure behaviour per boundary |
146
- | **Table list**: one line per table plus its key columns | Data dictionary per column |
147
- | **Endpoint list**: one line per endpoint | Five-lane contract spec per endpoint |
148
- | **Screen list**: one line per screen | Field detail per form |
149
- | **C4 L1 + L2 + L3** | Sequence and flow diagrams |
150
- | Spine: `AD-N` only | State machines per entity |
151
- | The error envelope and anything else cross-component | A component's local business rules |
152
- | Business rules binding more than one component | Branch scenarios |
153
-
154
- **Blueprint content is untouched by `mode` and by `risk_accepted`.** That is what keeps the order
155
- non-circular: `mode` is first needed at G4, and it has been available since the tail of G2.
156
-
157
- **G3 is written per component and gated once.** Both are true and it is not a compromise. The UC catalogue,
158
- actors, and entities fall into each `<pc>`, so they parallelise with the component as the key. The gate is
159
- one for the whole product, because its value is seeing the whole picture before choosing which component to
160
- build. Gating per component means approving seven times, each time seeing a seventh of the picture.
161
-
162
- Two blueprint contents cannot be per component: a per-component DB inventory is a lie because tables are
163
- shared, and a per-component spine contradicts what a spine is.
164
-
165
- **What is reviewed at G3 is the generated roll-up**, `.how-rendered/blueprint.md`, not seven files. The
166
- catalogue, actor list, and domain model stay in their component kernels as their permanent home; the roll-up
167
- assembles them into one page to read. One fact, one home, one view.
168
-
169
- ### `critical` narrowed, and it decides something only at `deep`
170
-
171
- A use case is `critical` when it touches **money, personal data, or an irreversible action.** That is the
172
- whole definition. The two elastic criteria — "the reason this component exists" and "expensive to discover
173
- late" are **repealed**, because with them every use case passed.
174
-
175
- If the count exceeds a third of a component's use cases, the definition was misapplied: derive it again. It
176
- MUST NOT be negotiated.
177
-
178
- ## Gate checklists
179
-
180
- Each question is answered **yes / no / change**. One "no" on a ★ question holds the gate.
181
-
182
- **On `mode: catalog`, only the questions are required.** There are fourteenacross the five gates, but
183
- four of them belong to G4 — which `catalog` skips — so what actually gets asked there is **ten**. The rest
184
- stay here as material, and asking them is never wrong; requiring them is.
185
-
186
- Which `mode` the rule reads depends on the gate. **G1 and G2 can only read the global `mode`**, because no
187
- component exists yet and `risk_accepted` has no value at all until `wdi-init` intent `component` runs at the
188
- tail of G2. G4 reads the `mode` of the component in front of it.
189
-
190
- ### G1 Problem · 20'
191
-
192
- 1. Who experiences this problem, by name?
193
- 2. ★ What single number proves this worked, three months from now?
194
- 3. If we do not build it, what breaks or is lost?
195
- 4. Who wins and who loses if this ships?
196
- 5. What is the most fragile assumption here, and what does being wrong cost?
197
- 6. What are we deliberately **not** doing?
198
- 7. Is there a cheaper way to the same outcome?
199
-
200
- ### G2 Product · 45'
201
-
202
- 1. For each `FR`: without it, can the user still finish their job? (yes → defer or drop)
203
- 2. ★ Does every `FR` have a proof of done, in a sentence I understand?
204
- 3. ★ Does this still make sense released on its own?
205
- 4. Do the `NFR` numbers come from reality or from feeling?
206
- 5. Can I retell the main UX flow in five sentences without opening the document?
207
- 6. Which `FR` touch money, personal data, or the client's reputation?
208
- 7. What changed from what I approved at G1, and why?
209
-
210
- ### G3 Blueprint · 45'
211
-
212
- Read against `.how-rendered/blueprint.md`, not against seven files — every one of the seven questions below is answerable from that page.
213
-
214
- 1. Is every use case title a sentence a user would say, not a system term?
215
- 2. ★ Any `FR` with no use case? (the validator answers this, not an opinion)
216
- 3. ★ Do the three inventories and the use case catalogue describe one system nothing promised with
217
- nowhere to live, nothing listed that nothing promised?
218
- 4. Actor list: is one missing, or are two actually the same person?
219
- 5. Does every `AD-N` name the concrete failure it prevents, and would breaking it in one component break
220
- another?
221
- 6. Which business rule am I not sure is right, and who at the client can confirm it?
222
- 7. Is there still a term I have to guess the meaning of?
223
-
224
- ### G4 Component · 20–30'
225
-
226
- Skipped entirely at `mode: catalog`.
227
-
228
- 1. What is being staked in this component — and does `risk_accepted` say so out loud?
229
- 2. ★ From `guarded` up: which boundary still has no answer for "the other side is slow, absent, or lying"?
230
- 3. ★ What stops us starting tomorrow? (MUST be empty)
231
- 4. ★ Validators green **and** the review leaving no open finding? (both one is fact, one is judgement)
232
- 5. Does any choice here lock us to one vendor or technology for more than a year?
233
- 6. From the DAG: which ticket blocks the most other tickets?
234
- 7. Top risk: who owns it, and what is the pivot trigger to turn or give up?
235
-
236
- ### G5 Release · 10'
237
-
238
- 1. Is every RTM row for this spec green?
239
- 2. ★ Is every ticket's acceptance criteria proven by a test, not by an agent's statement?
240
- 3. What was dropped from the plan, and where is it recorded?
241
- 4. Are new risks found while building in the Risk Register?
242
- 5. What one thing made this spec take longer than expected?
243
- 6. What does the client need to know before this goes live?
244
- 7. What is watched in the first week?
245
-
246
- ## Units of work `FR`, spec, `SPEC`, ticket
247
-
248
- | Unit | Is | Lifetime |
249
- |---|---|---|
250
- | `FR-N` | One **feature** — one promise to a user. Born at G2 | permanent, lives across releases |
251
- | spec | One **unit of work**: the tickets that reach one outcome. Opens at G4 or G5, closes at G5 | one slice of work |
252
- | `SPEC.md` | The **document** of one spec: a projection of `.what/` + `.how/` that MUST NOT contain anything new. **Not written at size `S`** | one spec |
253
- | ticket | One **tracer-bullet vertical slice**: complete through every layer, verifiable on its own, sized to one fresh context window, carrying the tickets that block it | one spec |
254
-
255
- **One spec = one set of tickets = one parent issue.** One to one to one, with no compound joins. `SPEC.md`
256
- joins that identity from size `M` up; at `S` there is no document and **the tickets are the contract.**
257
-
258
- A spec's scope is flexible and **ideally one `FR`**, because an `FR` is human-testable from birth it has a
259
- proof of done. One `FR` MAY span several specs, one spec MAY carry several small neighbouring `FR`, and a
260
- spec MAY be a standalone slice of one large `FR`.
261
-
262
- A spec MAY cross several Product Components. One condition: **G4 has passed for every component the spec
263
- touches**, or that component is at `mode: catalog`, whose G4 is skipped by design (`spec-after-g4`). That is why G4 and
264
- the spec are deliberately different units G4 decides *how one component is built*, a spec decides *which
265
- work happens now*.
266
-
267
- A ticket is **vertical, never horizontal**: it cuts a narrow but complete path through schema, API, UI, and
268
- tests, and a finished one is demoable on its own. A slice of one layer is not a ticket. **The one exception
269
- is a wide refactor** a mechanical change whose blast radius breaks call sites everywhere at once, where no
270
- vertical slice can land green. That is sequenced **expand migrate in batches contract**, each batch its
271
- own ticket blocked by the expand, and the contract blocked by every batch.
272
-
273
- `SPEC.md` and ticket files **are not read by humans.** Both are machine contracts, and no review burden MAY
274
- be moved onto them. The human review surface stops at the PRD, `.what/`, and `.how/`.
275
-
276
- ### Mapping to a tracker
277
-
278
- | Tracker | WDI | Lifetime |
279
- |---|---|---|
280
- | **Parent issue** | **spec** | one spec |
281
- | **Issue, carrying native blocking edges** | **ticket** | one spec |
282
- | Fix Version | release | one release |
283
- | Label / custom field | the `CAP-N` and `FR-N` the spec satisfies | — |
284
- | a document, not an issue | `.what/` · `.how/` · `SPEC.md` | — |
285
-
286
- A ticket is an **issue**, not a sub-task, because its blocking edges are what make the frontier visible in
287
- the tracker's own UI — the set of tickets whose blockers are all closed, and therefore takeable now. A
288
- sub-task cannot carry that relation.
289
-
290
- **`FR` is not an issue.** It sits at the level of *promise*, not of *work*: one `FR` MAY be delivered by
291
- tickets in two specs, and one ticket MAY satisfy part of two `FR`. Mapping promise onto work-issue forces a
292
- 1:1 that does not exist, and produces issues opened at G2 that hang across releases. `FR` travels as a label.
293
-
294
- **The corpus stays the source of truth; the tracker is a view.** Ticket status is read from **the ticket
295
- itself**, never copied into two places — and `specs.yaml` holds the **index**, not the bodies: one row per
296
- ticket with `satisfies`, `blocked_by`, `touches`, and its test names. That is what RTM and the validators
297
- read; the ticket's prose stays where the tracker put it.
298
-
299
- **Two edge fields, and the difference is not cosmetic.** A spec `depends_on` another spec — an ordering
300
- between units of delivery. A ticket is `blocked_by` other tickets, which is the word the tracker uses for
301
- the same relation and the field the frontier is read from. `no-cycles` walks both graphs; `parallel-tickets-blocked` reads the ticket one.
302
-
303
- **Where a ticket lives, and what it is called.** `{spec_folder}/issues/<NN>-<slug>.md`. Only the root is
304
- ours: the folder, the numbering from `01` in dependency order, and the file's shape belong to the engine
305
- that writes them. A ticket's `id` in `specs.yaml` is `<spec-id>-<NN>` `SPEC-3-01` because the engine's
306
- number is unique only inside one spec and the RTM needs a key that is unique across the corpus. `ticket-status-one-home` finds
307
- the file from the number at the tail of the id.
308
-
309
- **Parallelism.** Between tickets through their blocking edges plus the `touches` check; between specs
310
- through `depends_on` at spec level. A spec that declares no dependency runs in parallel.
311
-
312
- ## Spec size, and what it does not decide
313
-
314
- | Size | Shape | Effect |
315
- |---|---|---|
316
- | **S** | ≤3 tickets, no new `FR` | G4 and G5 merge into one 20-minute session · **`SPEC.md` is not written** — the tickets are the contract |
317
- | **M** | 4–12 tickets | `SPEC.md` written first, because the seams and the testing decisions have to be settled before tickets are cut |
318
- | **L** | >12 tickets, or a new container | as `M`. Its one distinct effect was the retrospective, which is retired, and `V19` with it |
319
-
320
- Size is recorded in `specs.yaml`. It MAY be raised mid-flight; it MUST NOT be lowered.
321
-
322
- **Size does not choose which gates are active** that is `mode`'s job. It decides two things: whether G4
323
- and G5 merge into one session (`S`), and whether `SPEC.md` is written at all (`M` and up).
324
-
325
- **Fast Path** skips every gate. It is available for a fix that changes no `FR`, `UC`, `AD-N`, or domain
326
- model, is at most one ticket, and touches no money, personal data, or third-party integration. If an `FR`
327
- turns out to be touched, work MUST stop and become a spec `S`.
328
-
329
- ## Ticket-closing checklist three items
330
-
331
- Answered as each ticket finishes, before the next is picked up.
332
-
333
- 1. Something the next person needs to know? → **into the document that carries it**, and that is almost
334
- always where it ends. It reaches `wdi-decision` only when no design document has a home for it —
335
- `decision-guide.md` § A decision's first home. A ticket contradicting an `AD-N` **stops** rather than
336
- closing; that is the one case where recording is mandatory.
337
- 2. A trap for the next agent? recorded where the next agent will read it.
338
- 3. Test names matching what `specs.yaml` records?
339
-
340
- Five items left this list and did not disappear — they moved to **spec close**, where the information is
341
- actually available: `LC` registration (`lc-registered`), the `touches` check, SPEC companion distillation, and the
342
- structure-map refresh. Registering an `LC` before a ticket was `ready-for-agent` demanded the answer at the
343
- moment it was thinnest.
344
-
345
- ## When something settled has to change
346
-
347
- One trigger: **an artifact other people agreed to needs to change.** Run this matrix and reopen the gates it
348
- names.
349
-
350
- **Reopening a gate means re-deciding, not re-recording.** The column below names the gate whose *decision*
351
- the change invalidates — the session runs again because the answer might now be different. Where the chain
352
- changes but the decision does not, the documents are **edited in place** and no gate opens or closes. There
353
- is no ceremony to perform, and nothing anywhere records that the change arrived late: the commit does that,
354
- and it does it better than a paragraph.
355
-
356
- **A change that arrives during G5 is written as if it had been there from the start.** Present tense, folded
357
- in, not appended and not annotated — `corpus-guide.md` § The corpus is written in the present tense owns
358
- that rule and it is not softened here.
359
-
360
- | What changes | MUST be re-reviewed | Gate reopened |
361
- |---|---|---|
362
- | Business Goal | The whole chain beneath it | G1 |
363
- | `FR` — its **promise** | Related `UC`, decisions naming it, tickets not yet started, RTM rows | G2 then G3 |
364
- | `FR` its **wording** only | Nothing. The skill at work fixes it, one Revision History row per pass | none |
365
- | `NFR` | Its enforcing decisions and tests | G4 |
366
- | UX flow | Related use case specifications, tickets not yet started | G3 |
367
- | Business rule | `UC` using it, related tests | G3 for a cross-component rule, G4 for a local one |
368
- | An `AD-N` | Affected C4 components, tickets not yet started | G4 |
369
- | Ticket acceptance criteria | That ticket's tests, its RTM row | none the row going green again is enough |
370
-
371
- The promise-versus-wording split is owned by `prd-guide.md` and MUST NOT be re-decided here.
372
-
373
- **Once the owner has decided, the survey is spent.** The agent reads the chain `BG`, `CAP`, `FR`, `UC`,
374
- the rules, the `AD-N` — and says **once**, in one place, what the change breaks and what it costs. That is
375
- the warning, and the owner is entitled to it. When they choose anyway, what the survey found becomes
376
- **edits**: not findings, not `OQ-` rows, not a review, and not a second pass raising the same conflicts in
377
- different words. Re-arguing a decision the owner already took is the most expensive thing an agent does in
378
- this method, and it buys nothing that the first warning did not already buy.
379
-
380
- The one thing that still stops rather than warns: a change contradicting an `AD-N`. That is an invariant the
381
- architecture rests on, `decision-guide.md` owns it, and the stop is a `DEC-` — one page, then proceed.
382
-
383
- - A ticket already **started** MUST NOT have its contract changed. Stop it, return it to
384
- `ready-for-agent`, then change it.
385
- - Superseded artifacts are never deleted. Their status becomes `superseded` and points at the replacement.
386
- - A change that cancels more than 30% of a spec's tickets MUST go through `wdi-decision`, which wraps
387
- `bmad-correct-course`, rather than being patched.
388
-
389
- **A reopened gate reopens over the DELTA, always.** Never the whole session, and never the whole
390
- checklist — only the questions the change actually put back in play. The budgets in the gate table are
391
- for a gate's **first** run; a reopening costs what the delta costs and usually far less.
392
-
393
- This was already true for one case and was never generalised: a new PRD arriving after G3 amends the
394
- blueprint rather than repeating it — the new components are born, their rows join the catalogue and the
395
- three inventories, and G3 reopens over the delta only. One feature added during G5 is the same shape. It
396
- puts its own `FR` and `UC` back in play and nothing else, so it costs a few minutes, not ninety.
397
-
398
- ## Roles
399
-
400
- | Role | Does | Does not |
401
- |---|---|---|
402
- | Product Owner | Answers the checklists, decides at the five gates, sets `mode` and `risk_accepted`, owns risk | Write artifacts, read machine contracts |
403
- | Agent at G1–G3 | Writes the brief, the PRD, and the blueprint | Decide depth or accept risk |
404
- | Agent at G4 | Writes one component's behaviour and mechanism | Write code |
405
- | Builder | One ticket through to a green PR | Change `.what/`, `.how/`, or an `applied` decision |
406
- | Review panel | Reviews the diff independently of the builder | Give a final verdict — findings are adjudicated by the coordinator |
407
-
408
- Panel composition and CLI/model selection are governed by the global Agent Rules and MUST NOT be restated
409
- here.
1
+ ---
2
+ status: Accepted
3
+ ---
4
+
5
+ # Delivery Flow Guide
6
+
7
+ **Loaded when:** opening or closing a gate, opening or closing a spec, setting `mode` or
8
+ `risk_accepted`, and any time something already agreed has to change
9
+
10
+ This is the flow itself: five gates, the one knob that sets document depth, the one field that sets
11
+ review intensity, spec sizing, and what happens when a settled thing has to move. Every other guide
12
+ describes one document; this one describes the order they arrive in.
13
+
14
+ ## Two fields, and the separation between them is the point
15
+
16
+ | Field | Where | Controls | Values | Default |
17
+ |---|---|---|---|---|
18
+ | `mode` | `index.yaml` (global) **and** `components.yaml` (per component) | **Document depth** — only this | `catalog` · `outline` · `guarded` · `deep` | `catalog` |
19
+ | `risk_accepted` | `components.yaml`, per component | **Review intensity**, and the risk-acceptance record | `low` · `medium` · `high` | proposed by the agent, confirmed by the owner |
20
+
21
+ Both belong to the owner. They MUST NOT be merged, and neither MUST be derived from the other.
22
+
23
+ Merging them makes one legitimate position unsayable: *"this part is risky, I know, and I manage it with
24
+ tests and review — not with prose."* If depth were controlled by `risk_accepted`, the only route to a
25
+ thin document would be raising `risk_accepted` — which means **lying in the risk record** to buy the
26
+ depth you wanted. Recording what is accepted is the entire reason that field exists.
27
+
28
+ Project size MUST NOT appear as an input anywhere. Size decides how many components there are, not how
29
+ deep each one goes.
30
+
31
+ All twelve combinations of the two are legal, and what each one costs is laid out side by side in
32
+ `.constitution/method/why/mode-risk-map.md`. It explains and MUST NOT be cited as a rule — this guide is
33
+ where both fields are defined.
34
+
35
+ ### `mode` — two scopes, and the per-component one wins
36
+
37
+ | Scope | Where | Means |
38
+ |---|---|---|
39
+ | Global | `mode:` in `.control/registry/index.yaml` | The default for every component that does not state its own |
40
+ | Per component | `mode:` on the component's row in `components.yaml` | Wins over global. Written only where a component genuinely needs to differ |
41
+
42
+ Raising and lowering are both **free and need no justification** — it is a preference, and a preference
43
+ does not have to be defended.
44
+
45
+ **There is no third scope.** `mode` MUST NOT be overridden per spec or per `SPEC.md`. A spec MAY cross
46
+ several components, so a per-spec override would give one component two different depths depending on
47
+ which spec touched it — while the document is one, and living.
48
+
49
+ > Depth belongs to the component, not to the work.
50
+
51
+ ### The four modes
52
+
53
+ Each contains everything in the one to its left. Value names are English in YAML **and in prose** — one
54
+ thing, one name.
55
+
56
+ | `mode` | What is written for that component, beyond the blueprint | G4 |
57
+ |---|---|---|
58
+ | `catalog` | Nothing. Code is written from the use case catalogue, the three inventories, and C4 | **skipped** |
59
+ | `outline` | Full flow for the use cases the component exists for — at most 3 · local business rules · `Decision Summary` + the `LC` list in the SDD | 20 min |
60
+ | `guarded` | + **`Failure Behaviour` for every boundary** · `Inherited Constraints` · third-party integration documents | 20 min |
61
+ | `deep` | + ABCE robustness analysis · a contract spec per endpoint · data dictionary · flow diagrams · state machines · branch scenarios | 30 min |
62
+
63
+ **A component at `mode: catalog` skips G4 entirely**, and that is what makes a global `catalog` genuinely
64
+ fast. Control does not disappear; it moves to G3, where the use cases, tables, endpoints, screens, domain
65
+ model, and C4 were all approved.
66
+
67
+ **`guarded` is the mode most often needed and most often absent.** It buys the single most expensive thing
68
+ to lose — the answer to *"what happens if this fails halfway"* for each boundary — without buying the
69
+ machinery around it. It stands without ABCE because the boundary list already exists: the API inventory
70
+ names the endpoints, the screen inventory names the screens.
71
+
72
+ Nine things `mode` never touches: the use case list, the API list, the table list, the screen list, the
73
+ domain model, the actor list, the spine, C4 L1/L2/L3, and cross-component business rules. All nine belong
74
+ to the blueprint at G3, so they exist even at `catalog`. The complete per-file manifest is in
75
+ `.constitution/method/why/artifact-map.md`.
76
+
77
+ **Lowering `mode` deletes nothing.** A file already written stops being required, and that is all.
78
+
79
+ **Raising `mode` on a component whose code already runs** produces an **as-built record**, not a design.
80
+ The evidence labels in `sdd-guide.md` are mandatory there.
81
+
82
+ ### `risk_accepted` — review intensity, never depth
83
+
84
+ The direction is readable from the field name: `high` means *"I accept a lot of risk here"*, so its review
85
+ is the lightest.
86
+
87
+ `structure` and `prose` are the baseline everywhere. What `risk_accepted` decides is what is **added**:
88
+
89
+ | Value | First review, and the review before a gate | Every re-review after | On the code |
90
+ |---|---|---|---|
91
+ | `low` | `structure` · `prose` · **`edge-case-hunter`** | `structure` · `prose` | a two-reviewer panel is **required** |
92
+ | `medium` | `structure` · `prose` · **`edge-case-hunter`** | `structure` · `prose` | — |
93
+ | `high` | `structure` · `prose` | `structure` · `prose` | — |
94
+
95
+ The heavy lens is bought **once per artifact and once per gate**, not once per edit. A re-review MUST put
96
+ it back when the delta touches money, personal data, an irreversible action, or a third party. And a
97
+ review trace has to be fresh **at a gate and at spec close** — between those points a stale trace is
98
+ advisory, not a failure. `wdi-review` owns the mechanics of both, including the one case where re-stamping
99
+ without re-running is allowed: a change to wording only.
100
+
101
+ Review lenses are decided here and **nowhere else**. They MUST NOT be read off `mode`: one component MAY
102
+ sit at `mode: catalog` and still be reviewed the hardest.
103
+
104
+ Two things are not free, and `wdi-init` owns the conversation around both: `risk_accepted: high` on a
105
+ component touching money, personal data, an irreversible action, a contractual promise, or an
106
+ un-rollbackable integration requires a named acceptance in `risk_accepted_by` — a person and a date,
107
+ written beside the risk (`high-risk-named`) — and an outside party who will demand the artifacts as a deliverable puts
108
+ the touched component at `mode: deep` and `risk_accepted: low` whatever the global setting says.
109
+
110
+ ## Five gates
111
+
112
+ A gate is named for **what is decided there**, never for the work that precedes it. Owner time is spent at
113
+ these five points only; between them the agents work alone. Under a mandate — `wdi-autopilot` — it is spent at
114
+ two points instead, before and after, and the gates are held by the agent against the same checklists, with
115
+ every answer written to a ledger.
116
+
117
+ | Gate | Decides | How often | Budget | The session itself | Its checklist |
118
+ |---|---|---|---|---|---|
119
+ | **G1 Problem** | What the problem is, whose it is, why it earns work | once | 20' | unchanged | 2 of 7 at `catalog` |
120
+ | **G2 Product** | What is built, and how it feels to use | once per PRD | 45' | unchanged | 3 of 7 at `catalog` |
121
+ | **G3 Blueprint** | The whole portrait: which use cases, their entities, tables, endpoints, screens, and the invariants binding them | **once per product** | 45' | unchanged | 3 of 7 at `catalog` |
122
+ | **G4 Component** | How one Product Component is built, and what the choice costs | **once per Product Component** | 20–30' | **skipped entirely at `catalog`** | 4 of 7, and 30' at `deep` |
123
+ | **G5 Release** | Whether it is done and proven | once per spec | 10' | unchanged | 2 of 7 at `catalog` |
124
+
125
+ Two different things move, and reading them as one is what makes this table easy to get wrong:
126
+
127
+ - **What a gate decides, how often it runs, and its budget never change.** All five, at every setting.
128
+ - **G4 is the only gate that can disappear.** At `catalog` its session does not happen at all; the other four
129
+ always run.
130
+ - **Checklist length is the one thing `mode` shortens everywhere.** At `catalog` only the ★ questions are
131
+ required, at G1 and G5 as much as at G4 see the checklists below.
132
+
133
+ That is what makes this holdable in one head: four of the five sessions are always there, and the only
134
+ question is how long their checklist is.
135
+
136
+ The word "area" is not used anywhere. There is only Product Component.
137
+
138
+ ### What is in the blueprint, and what is not
139
+
140
+ The most decisive boundary in the method. The previous run broke because "complete" was read as "fully
141
+ specified".
142
+
143
+ | In the blueprint — G3, once | Not in it — G4, per component |
144
+ |---|---|
145
+ | Actor list | Full UC flows |
146
+ | **Use case list**: one line per UC id, title, actor, the `FR` it satisfies, `critical` | ABCE robustness analysis |
147
+ | Domain entities + relations + columns | Failure behaviour per boundary |
148
+ | **Table list**: one line per table plus its key columns | Data dictionary per column |
149
+ | **Endpoint list**: one line per endpoint | Five-lane contract spec per endpoint |
150
+ | **Screen list**: one line per screen | Field detail per form |
151
+ | **C4 L1 + L2 + L3** | Sequence and flow diagrams |
152
+ | Spine: `AD-N` only | State machines per entity |
153
+ | The error envelope and anything else cross-component | A component's local business rules |
154
+ | Business rules binding more than one component | Branch scenarios |
155
+
156
+ **Blueprint content is untouched by `mode` and by `risk_accepted`.** That is what keeps the order
157
+ non-circular: `mode` is first needed at G4, and it has been available since the tail of G2.
158
+
159
+ **G3 is written per component and gated once.** Both are true and it is not a compromise. The UC catalogue,
160
+ actors, and entities fall into each `<pc>`, so they parallelise with the component as the key. The gate is
161
+ one for the whole product, because its value is seeing the whole picture before choosing which component to
162
+ build. Gating per component means approving seven times, each time seeing a seventh of the picture.
163
+
164
+ Two blueprint contents cannot be per component: a per-component DB inventory is a lie because tables are
165
+ shared, and a per-component spine contradicts what a spine is.
166
+
167
+ **What is reviewed at G3 is the generated roll-up**, `.how-rendered/blueprint.md`, not seven files. The
168
+ catalogue, actor list, and domain model stay in their component kernels as their permanent home; the roll-up
169
+ assembles them into one page to read. One fact, one home, one view.
170
+
171
+ ### `critical` narrowed, and it decides something only at `deep`
172
+
173
+ A use case is `critical` when it touches **money, personal data, or an irreversible action.** That is the
174
+ whole definition. The two elastic criteria — "the reason this component exists" and "expensive to discover
175
+ late" are **repealed**, because with them every use case passed.
176
+
177
+ If the count exceeds a third of a component's use cases, the definition was misapplied: derive it again. It
178
+ MUST NOT be negotiated.
179
+
180
+ ## Gate checklists
181
+
182
+ Each question is answered **yes / no / change**. One "no" on a question holds the gate.
183
+
184
+ **On `mode: catalog`, only the questions are required.** There are fourteen ★ across the five gates, but
185
+ four of them belong to G4 — which `catalog` skips — so what actually gets asked there is **ten**. The rest
186
+ stay here as material, and asking them is never wrong; requiring them is.
187
+
188
+ Which `mode` the rule reads depends on the gate. **G1 and G2 can only read the global `mode`**, because no
189
+ component exists yet and `risk_accepted` has no value at all until `wdi-init` intent `component` runs at the
190
+ tail of G2. G4 reads the `mode` of the component in front of it.
191
+
192
+ ### G1 Problem · 20'
193
+
194
+ 1. Who experiences this problem, by name?
195
+ 2. What single number proves this worked, three months from now?
196
+ 3. If we do not build it, what breaks or is lost?
197
+ 4. Who wins and who loses if this ships?
198
+ 5. What is the most fragile assumption here, and what does being wrong cost?
199
+ 6. What are we deliberately **not** doing?
200
+ 7. Is there a cheaper way to the same outcome?
201
+
202
+ ### G2 Product · 45'
203
+
204
+ 1. ★ For each `FR`: without it, can the user still finish their job? (yes defer or drop)
205
+ 2. Does every `FR` have a proof of done, in a sentence I understand?
206
+ 3. Does this still make sense released on its own?
207
+ 4. Do the `NFR` numbers come from reality or from feeling?
208
+ 5. Can I retell the main UX flow in five sentences without opening the document?
209
+ 6. Which `FR` touch money, personal data, or the client's reputation?
210
+ 7. What changed from what I approved at G1, and why?
211
+
212
+ ### G3 Blueprint · 45'
213
+
214
+ Read against `.how-rendered/blueprint.md`, not against seven files every one of the seven questions below is answerable from that page.
215
+
216
+ 1. ★ Is every use case title a sentence a user would say, not a system term?
217
+ 2. Any `FR` with no use case? (the validator answers this, not an opinion)
218
+ 3. Do the three inventories and the use case catalogue describe one system — nothing promised with
219
+ nowhere to live, nothing listed that nothing promised?
220
+ 4. Actor list: is one missing, or are two actually the same person?
221
+ 5. Does every `AD-N` name the concrete failure it prevents, and would breaking it in one component break
222
+ another?
223
+ 6. Which business rule am I not sure is right, and who at the client can confirm it?
224
+ 7. Is there still a term I have to guess the meaning of?
225
+
226
+ ### G4 Component · 20–30'
227
+
228
+ Skipped entirely at `mode: catalog`.
229
+
230
+ 1. ★ What is being staked in this component — and does `risk_accepted` say so out loud?
231
+ 2. ★ From `guarded` up: which boundary still has no answer for "the other side is slow, absent, or lying"?
232
+ 3. What stops us starting tomorrow? (MUST be empty)
233
+ 4. Validators green **and** the review leaving no open finding? (both one is fact, one is judgement)
234
+ 5. Does any choice here lock us to one vendor or technology for more than a year?
235
+ 6. From the DAG: which ticket blocks the most other tickets?
236
+ 7. Top risk: who owns it, and what is the pivot trigger to turn or give up?
237
+
238
+ ### G5 Release · 10'
239
+
240
+ 1. Is every RTM row for this spec green?
241
+ 2. Is every ticket's acceptance criteria proven by a test, not by an agent's statement?
242
+ 3. What was dropped from the plan, and where is it recorded?
243
+ 4. Are new risks found while building in the Risk Register?
244
+ 5. What one thing made this spec take longer than expected?
245
+ 6. What does the client need to know before this goes live?
246
+ 7. What is watched in the first week?
247
+
248
+ ## Units of work `FR`, spec, `SPEC`, ticket
249
+
250
+ | Unit | Is | Lifetime |
251
+ |---|---|---|
252
+ | `FR-N` | One **feature** one promise to a user. Born at G2 | permanent, lives across releases |
253
+ | spec | One **unit of work**: the tickets that reach one outcome. Opens at G4 or G5, closes at G5 | one slice of work |
254
+ | `SPEC.md` | The **document** of one spec: a projection of `.what/` + `.how/` that MUST NOT contain anything new. **Not written at size `S`** | one spec |
255
+ | ticket | One **tracer-bullet vertical slice**: complete through every layer, verifiable on its own, sized to one fresh context window, carrying the tickets that block it | one spec |
256
+
257
+ **One spec = one set of tickets = one parent issue.** One to one to one, with no compound joins. `SPEC.md`
258
+ joins that identity from size `M` up; at `S` there is no document and **the tickets are the contract.**
259
+
260
+ A spec's scope is flexible and **ideally one `FR`**, because an `FR` is human-testable from birth — it has a
261
+ proof of done. One `FR` MAY span several specs, one spec MAY carry several small neighbouring `FR`, and a
262
+ spec MAY be a standalone slice of one large `FR`.
263
+
264
+ A spec MAY cross several Product Components. One condition: **G4 has passed for every component the spec
265
+ touches**, or that component is at `mode: catalog`, whose G4 is skipped by design (`spec-after-g4`). That is why G4 and
266
+ the spec are deliberately different units — G4 decides *how one component is built*, a spec decides *which
267
+ work happens now*.
268
+
269
+ A ticket is **vertical, never horizontal**: it cuts a narrow but complete path through schema, API, UI, and
270
+ tests, and a finished one is demoable on its own. A slice of one layer is not a ticket. **The one exception
271
+ is a wide refactor** a mechanical change whose blast radius breaks call sites everywhere at once, where no
272
+ vertical slice can land green. That is sequenced **expand → migrate in batches → contract**, each batch its
273
+ own ticket blocked by the expand, and the contract blocked by every batch.
274
+
275
+ `SPEC.md` and ticket files **are not read by humans.** Both are machine contracts, and no review burden MAY
276
+ be moved onto them. The human review surface stops at the PRD, `.what/`, and `.how/`.
277
+
278
+ ### Mapping to a tracker
279
+
280
+ | Tracker | WDI | Lifetime |
281
+ |---|---|---|
282
+ | **Parent issue** | **spec** | one spec |
283
+ | **Issue, carrying native blocking edges** | **ticket** | one spec |
284
+ | Fix Version | release | one release |
285
+ | Label / custom field | the `CAP-N` and `FR-N` the spec satisfies | — |
286
+ | a document, not an issue | `.what/` · `.how/` · `SPEC.md` | |
287
+
288
+ A ticket is an **issue**, not a sub-task, because its blocking edges are what make the frontier visible in
289
+ the tracker's own UI — the set of tickets whose blockers are all closed, and therefore takeable now. A
290
+ sub-task cannot carry that relation.
291
+
292
+ **`FR` is not an issue.** It sits at the level of *promise*, not of *work*: one `FR` MAY be delivered by
293
+ tickets in two specs, and one ticket MAY satisfy part of two `FR`. Mapping promise onto work-issue forces a
294
+ 1:1 that does not exist, and produces issues opened at G2 that hang across releases. `FR` travels as a label.
295
+
296
+ **The corpus stays the source of truth; the tracker is a view.** Ticket status is read from **the ticket
297
+ itself**, never copied into two places — and `specs.yaml` holds the **index**, not the bodies: one row per
298
+ ticket with `satisfies`, `blocked_by`, `touches`, and its test names. That is what RTM and the validators
299
+ read; the ticket's prose stays where the tracker put it.
300
+
301
+ **Two edge fields, and the difference is not cosmetic.** A spec `depends_on` another spec an ordering
302
+ between units of delivery. A ticket is `blocked_by` other tickets, which is the word the tracker uses for
303
+ the same relation and the field the frontier is read from. `no-cycles` walks both graphs; `parallel-tickets-blocked` reads the ticket one.
304
+
305
+ **Where a ticket lives, and what it is called.** `{spec_folder}/issues/<NN>-<slug>.md`. Only the root is
306
+ ours: the folder, the numbering from `01` in dependency order, and the file's shape belong to the engine
307
+ that writes them. A ticket's `id` in `specs.yaml` is `<spec-id>-<NN>` — `SPEC-3-01` — because the engine's
308
+ number is unique only inside one spec and the RTM needs a key that is unique across the corpus. `ticket-status-one-home` finds
309
+ the file from the number at the tail of the id.
310
+
311
+ **Parallelism.** Between tickets through their blocking edges plus the `touches` check; between specs
312
+ through `depends_on` at spec level. A spec that declares no dependency runs in parallel.
313
+
314
+ ## Spec size, and what it does not decide
315
+
316
+ | Size | Shape | Effect |
317
+ |---|---|---|
318
+ | **S** | ≤3 tickets, no new `FR` | G4 and G5 merge into one 20-minute session · **`SPEC.md` is not written** the tickets are the contract |
319
+ | **M** | 4–12 tickets | `SPEC.md` written first, because the seams and the testing decisions have to be settled before tickets are cut |
320
+ | **L** | >12 tickets, or a new container | as `M`. Its one distinct effect was the retrospective, which is retired, and `V19` with it |
321
+
322
+ Size is recorded in `specs.yaml`. It MAY be raised mid-flight; it MUST NOT be lowered.
323
+
324
+ **Size does not choose which gates are active** — that is `mode`'s job. It decides two things: whether G4
325
+ and G5 merge into one session (`S`), and whether `SPEC.md` is written at all (`M` and up).
326
+
327
+ **Fast Path** skips every gate. It is available for a fix that changes no `FR`, `UC`, `AD-N`, or domain
328
+ model, is at most one ticket, and touches no money, personal data, or third-party integration. If an `FR`
329
+ turns out to be touched, work MUST stop and become a spec `S`.
330
+
331
+ ## Ticket-closing checklist three items
332
+
333
+ Answered as each ticket finishes, before the next is picked up.
334
+
335
+ 1. Something the next person needs to know? **into the document that carries it**, and that is almost
336
+ always where it ends. It reaches `wdi-decision` only when no design document has a home for it —
337
+ `decision-guide.md` § A decision's first home. A ticket contradicting an `AD-N` **stops** rather than
338
+ closing; that is the one case where recording is mandatory.
339
+ 2. A trap for the next agent? → recorded where the next agent will read it.
340
+ 3. Test names matching what `specs.yaml` records?
341
+
342
+ Five items left this list and did not disappear they moved to **spec close**, where the information is
343
+ actually available: `LC` registration (`lc-registered`), the `touches` check, SPEC companion distillation, and the
344
+ structure-map refresh. Registering an `LC` before a ticket was `ready-for-agent` demanded the answer at the
345
+ moment it was thinnest.
346
+
347
+ ## When something settled has to change
348
+
349
+ One trigger: **an artifact other people agreed to needs to change.** Run this matrix and reopen the gates it
350
+ names.
351
+
352
+ **Reopening a gate means re-deciding, not re-recording.** The column below names the gate whose *decision*
353
+ the change invalidates the session runs again because the answer might now be different. Where the chain
354
+ changes but the decision does not, the documents are **edited in place** and no gate opens or closes. There
355
+ is no ceremony to perform, and nothing anywhere records that the change arrived late: the commit does that,
356
+ and it does it better than a paragraph.
357
+
358
+ **A change that arrives during G5 is written as if it had been there from the start.** Present tense, folded
359
+ in, not appended and not annotated — `corpus-guide.md` § The corpus is written in the present tense owns
360
+ that rule and it is not softened here.
361
+
362
+ | What changes | MUST be re-reviewed | Gate reopened |
363
+ |---|---|---|
364
+ | Business Goal | The whole chain beneath it | G1 |
365
+ | `FR` — its **promise** | Related `UC`, decisions naming it, tickets not yet started, RTM rows | G2 then G3 |
366
+ | `FR` its **wording** only | Nothing. The skill at work fixes it, one Revision History row per pass | none |
367
+ | `NFR` | Its enforcing decisions and tests | G4 |
368
+ | UX flow | Related use case specifications, tickets not yet started | G3 |
369
+ | Business rule | `UC` using it, related tests | G3 for a cross-component rule, G4 for a local one |
370
+ | An `AD-N` | Affected C4 components, tickets not yet started | G4 |
371
+ | Ticket acceptance criteria | That ticket's tests, its RTM row | none — the row going green again is enough |
372
+
373
+ The promise-versus-wording split is owned by `prd-guide.md` and MUST NOT be re-decided here.
374
+
375
+ **Once the owner has decided, the survey is spent.** The agent reads the chain `BG`, `CAP`, `FR`, `UC`,
376
+ the rules, the `AD-N` and says **once**, in one place, what the change breaks and what it costs. That is
377
+ the warning, and the owner is entitled to it. When they choose anyway, what the survey found becomes
378
+ **edits**: not findings, not `OQ-` rows, not a review, and not a second pass raising the same conflicts in
379
+ different words. Re-arguing a decision the owner already took is the most expensive thing an agent does in
380
+ this method, and it buys nothing that the first warning did not already buy.
381
+
382
+ The one thing that still stops rather than warns: a change contradicting an `AD-N`. That is an invariant the
383
+ architecture rests on, `decision-guide.md` owns it, and the stop is a `DEC-` one page, then proceed.
384
+
385
+ - A ticket already **started** MUST NOT have its contract changed. Stop it, return it to
386
+ `ready-for-agent`, then change it.
387
+ - Superseded artifacts are never deleted. Their status becomes `superseded` and points at the replacement.
388
+ - A change that cancels more than 30% of a spec's tickets MUST go through `wdi-decision`, which wraps
389
+ `bmad-correct-course`, rather than being patched.
390
+
391
+ **A reopened gate reopens over the DELTA, always.** Never the whole session, and never the whole
392
+ checklist — only the questions the change actually put back in play. The budgets in the gate table are
393
+ for a gate's **first** run; a reopening costs what the delta costs and usually far less.
394
+
395
+ This was already true for one case and was never generalised: a new PRD arriving after G3 amends the
396
+ blueprint rather than repeating it the new components are born, their rows join the catalogue and the
397
+ three inventories, and G3 reopens over the delta only. One feature added during G5 is the same shape. It
398
+ puts its own `FR` and `UC` back in play and nothing else, so it costs a few minutes, not ninety.
399
+
400
+ ## Roles
401
+
402
+ | Role | Does | Does not |
403
+ |---|---|---|
404
+ | Product Owner | Answers the checklists, decides at the five gates, sets `mode` and `risk_accepted`, owns risk | Write artifacts, read machine contracts |
405
+ | Agent at G1–G3 | Writes the brief, the PRD, and the blueprint | Decide depth or accept risk |
406
+ | Agent at G4 | Writes one component's behaviour and mechanism | Write code |
407
+ | Builder | One ticket through to a green PR | Change `.what/`, `.how/`, or an `applied` decision |
408
+ | Review panel | Reviews the diff independently of the builder | Give a final verdict findings are adjudicated by the coordinator |
409
+ | Autopilot, under a mandate | Everything the Product Owner does between the mandate and the final review, and records each decision in the ledger | Accept the mandate itself, decide what it parks, or touch a guard, a test, or a ticket's `satisfies` |
410
+
411
+ Panel composition and CLI/model selection are governed by the global Agent Rules and MUST NOT be restated
412
+ here.