wdi-method 0.5.13 → 0.6.0

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.
Files changed (87) hide show
  1. package/README.md +436 -271
  2. package/bin/wdi-method.js +198 -5
  3. package/kit/.constitution/method/README.md +76 -75
  4. package/kit/.constitution/method/constitution.md +2 -1
  5. package/kit/.constitution/method/document/architecture-guide.md +10 -10
  6. package/kit/.constitution/method/document/bmad-guide.md +50 -16
  7. package/kit/.constitution/method/document/bmad-skill-register.md +74 -71
  8. package/kit/.constitution/method/document/brief-guide.md +42 -11
  9. package/kit/.constitution/method/document/corpus-guide.md +146 -11
  10. package/kit/.constitution/method/document/decision-guide.md +199 -134
  11. package/kit/.constitution/method/document/delivery-flow-guide.md +154 -83
  12. package/kit/.constitution/method/document/prd-guide.md +63 -20
  13. package/kit/.constitution/method/document/sdd-guide.md +5 -4
  14. package/kit/.constitution/method/document/srs-guide.md +150 -147
  15. package/kit/.constitution/method/document/templates/addendum.md +70 -71
  16. package/kit/.constitution/method/document/templates/architecture-spine.md +6 -4
  17. package/kit/.constitution/method/document/templates/brief.md +132 -110
  18. package/kit/.constitution/method/document/templates/c4.md +11 -11
  19. package/kit/.constitution/method/document/templates/contract.md +51 -52
  20. package/kit/.constitution/method/document/templates/cross-cutting.md +1 -2
  21. package/kit/.constitution/method/document/templates/design-system.md +0 -1
  22. package/kit/.constitution/method/document/templates/integration.md +68 -69
  23. package/kit/.constitution/method/document/templates/inventory.md +0 -1
  24. package/kit/.constitution/method/document/templates/lc.md +49 -47
  25. package/kit/.constitution/method/document/templates/lifecycle.md +51 -52
  26. package/kit/.constitution/method/document/templates/model.md +68 -55
  27. package/kit/.constitution/method/document/templates/oq.md +45 -45
  28. package/kit/.constitution/method/document/templates/prd.md +244 -226
  29. package/kit/.constitution/method/document/templates/questions.md +100 -76
  30. package/kit/.constitution/method/document/templates/rules.md +46 -47
  31. package/kit/.constitution/method/document/templates/sdd.md +26 -11
  32. package/kit/.constitution/method/document/templates/srs.md +46 -25
  33. package/kit/.constitution/method/document/templates/uc.md +1 -1
  34. package/kit/.constitution/method/document/templates/ux.md +76 -77
  35. package/kit/.constitution/method/document/ux-guide.md +115 -99
  36. package/kit/.constitution/method/language-guide.md +1 -1
  37. package/kit/.constitution/method/method-glossary.md +29 -16
  38. package/kit/.constitution/method/scripts/timeline.py +663 -665
  39. package/kit/.constitution/method/scripts/validate.py +1143 -362
  40. package/kit/.constitution/method/structure-guide.md +3 -3
  41. package/kit/.constitution/method/why/README.md +184 -169
  42. package/kit/.constitution/method/why/artifact-map.md +15 -13
  43. package/kit/.constitution/method/why/mode-risk-map.md +140 -0
  44. package/kit/.constitution/method/why/portability.md +1 -1
  45. package/kit/.constitution/method/why/rationale.md +12 -5
  46. package/kit/.constitution/project/README.md +2 -2
  47. package/kit/.constitution/project/codebase-brownfield-guide.md +18 -18
  48. package/kit/.constitution/project/codebase-conventions-guide.md +18 -18
  49. package/kit/.constitution/project/codebase-stack-guide.md +18 -18
  50. package/kit/assets/bmad-custom/bmad-architecture.toml +1 -1
  51. package/kit/assets/bmad-custom/bmad-correct-course.toml +5 -5
  52. package/kit/assets/bmad-custom/bmad-prd.toml +9 -3
  53. package/kit/assets/bmad-custom/bmad-product-brief.toml +6 -2
  54. package/kit/skills/wdi-blueprint/SKILL.md +71 -10
  55. package/kit/skills/wdi-build/SKILL.md +233 -122
  56. package/kit/skills/wdi-component/SKILL.md +8 -6
  57. package/kit/skills/wdi-decision/SKILL.md +187 -183
  58. package/kit/skills/wdi-help/SKILL.md +8 -7
  59. package/kit/skills/wdi-init/SKILL.md +20 -6
  60. package/kit/skills/wdi-problem/SKILL.md +31 -13
  61. package/kit/skills/wdi-product/SKILL.md +30 -17
  62. package/kit/skills/wdi-question/SKILL.md +170 -88
  63. package/kit/skills/wdi-reconcile/SKILL.md +33 -10
  64. package/kit/skills/wdi-report/SKILL.md +77 -25
  65. package/kit/skills/wdi-review/SKILL.md +201 -118
  66. package/kit/skills/wdi-systematic-debugging/SKILL.md +7 -7
  67. package/kit/skills/wdi-upgrade/SKILL.md +179 -0
  68. package/kit/skills/wdi-ux/SKILL.md +35 -11
  69. package/kit-overlay/AGENTS.md +2 -2
  70. package/kit-overlay/README.md +76 -75
  71. package/kit-overlay/constitution.md +2 -1
  72. package/kit-overlay/portability.md +1 -1
  73. package/package.json +43 -43
  74. package/scaffold/.control/product-glossary.md +1 -1
  75. package/scaffold/.control/registry/goals.yaml +25 -0
  76. package/scaffold/.control/registry/index.yaml +5 -5
  77. package/scaffold/.control/registry/specs.yaml +5 -0
  78. package/scaffold/.control/structure-codebase.md +19 -19
  79. package/scaffold/.control/structure-document.md +25 -25
  80. package/kit/.constitution/method/document/templates/rtr.md +0 -61
  81. package/kit/assets/bmad-custom/bmad-build-auto.toml +0 -10
  82. package/kit/assets/bmad-custom/bmad-build.toml +0 -52
  83. package/kit/assets/bmad-custom/bmad-code-review.toml +0 -13
  84. package/kit/assets/bmad-custom/bmad-retrospective.toml +0 -9
  85. package/kit/assets/bmad-custom/bmad-spec.toml +0 -16
  86. package/scaffold/.control/registry/requirements.yaml +0 -15
  87. package/scaffold/.control/registry/waves.yaml +0 -5
@@ -4,11 +4,11 @@ status: Accepted
4
4
 
5
5
  # Delivery Flow Guide
6
6
 
7
- **Loaded when:** opening or closing a gate, opening or closing a wave, setting `mode` or
7
+ **Loaded when:** opening or closing a gate, opening or closing a spec, setting `mode` or
8
8
  `risk_accepted`, and any time something already agreed has to change
9
9
 
10
10
  This is the flow itself: five gates, the one knob that sets document depth, the one field that sets
11
- review intensity, wave sizing, and what happens when a settled thing has to move. Every other guide
11
+ review intensity, spec sizing, and what happens when a settled thing has to move. Every other guide
12
12
  describes one document; this one describes the order they arrive in.
13
13
 
14
14
  ## Two fields, and the separation between them is the point
@@ -28,6 +28,10 @@ depth you wanted. Recording what is accepted is the entire reason that field exi
28
28
  Project size MUST NOT appear as an input anywhere. Size decides how many components there are, not how
29
29
  deep each one goes.
30
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
+
31
35
  ### `mode` — two scopes, and the per-component one wins
32
36
 
33
37
  | Scope | Where | Means |
@@ -38,9 +42,9 @@ deep each one goes.
38
42
  Raising and lowering are both **free and need no justification** — it is a preference, and a preference
39
43
  does not have to be defended.
40
44
 
41
- **There is no third scope.** `mode` MUST NOT be overridden per wave or per `SPEC.md`. A wave MAY cross
42
- several components, so a per-wave override would give one component two different depths depending on
43
- which wave touched it — while the document is one, and living.
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.
44
48
 
45
49
  > Depth belongs to the component, not to the work.
46
50
 
@@ -82,36 +86,50 @@ is the lightest.
82
86
 
83
87
  `structure` and `prose` are the baseline everywhere. What `risk_accepted` decides is what is **added**:
84
88
 
85
- | Value | Lenses on the documents | On the code |
86
- |---|---|---|
87
- | `low` | `structure` · `prose` · **`edge-case-hunter`** | a two-reviewer panel is **required** |
88
- | `medium` | `structure` · `prose` · **`edge-case-hunter`** | — |
89
- | `high` | `structure` · `prose` | — |
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.
90
100
 
91
101
  Review lenses are decided here and **nowhere else**. They MUST NOT be read off `mode`: one component MAY
92
102
  sit at `mode: catalog` and still be reviewed the hardest.
93
103
 
94
104
  Two things are not free, and `wdi-init` owns the conversation around both: `risk_accepted: high` on a
95
105
  component touching money, personal data, an irreversible action, a contractual promise, or an
96
- un-rollbackable integration requires a `DEC-` of `type: risk-acceptance` with `risk_accepted_by:` pointing
97
- at it (V23) — and an outside party who will demand the artifacts as a deliverable puts the touched
98
- component at `mode: deep` and `risk_accepted: low` whatever the global setting says.
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.
99
109
 
100
110
  ## Five gates
101
111
 
102
112
  A gate is named for **what is decided there**, never for the work that precedes it. Owner time is spent at
103
113
  these five points only; between them the agents work alone.
104
114
 
105
- | Gate | Decides | How often | Budget | Varies by `mode`? |
106
- |---|---|---|---|---|
107
- | **G1 Problem** | What the problem is, whose it is, why it earns work | once | 20' | no |
108
- | **G2 Product** | What is built, and how it feels to use | once per PRD | 45' | no |
109
- | **G3 Blueprint** | The whole portrait: which use cases, their entities, tables, endpoints, screens, and the invariants binding them | **once per product** | 45' | no |
110
- | **G4 Component** | How one Product Component is built, and what the choice costs | **once per Product Component** | 20–30' | **yes the only one** |
111
- | **G5 Release** | Whether it is done and proven | once per wave | 10' | flags only |
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` |
112
122
 
113
- **Only one gate changes shape with `mode`.** That is what makes this holdable in one head: four of the five
114
- are always the same, whatever the setting.
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.
115
133
 
116
134
  The word "area" is not used anywhere. There is only Product Component.
117
135
 
@@ -144,7 +162,7 @@ build. Gating per component means approving seven times, each time seeing a seve
144
162
  Two blueprint contents cannot be per component: a per-component DB inventory is a lie because tables are
145
163
  shared, and a per-component spine contradicts what a spine is.
146
164
 
147
- **What is reviewed at G3 is the generated roll-up**, `.control/generated/blueprint.md`, not seven files. The
165
+ **What is reviewed at G3 is the generated roll-up**, `.how-rendered/blueprint.md`, not seven files. The
148
166
  catalogue, actor list, and domain model stay in their component kernels as their permanent home; the roll-up
149
167
  assembles them into one page to read. One fact, one home, one view.
150
168
 
@@ -161,8 +179,13 @@ MUST NOT be negotiated.
161
179
 
162
180
  Each question is answered **yes / no / change**. One "no" on a ★ question holds the gate.
163
181
 
164
- **On `mode: catalog`, only the ★ questions are asked** fourteen across all five gates. The rest stay here
165
- as material, and asking them is never wrong; requiring them is.
182
+ **On `mode: catalog`, only the ★ questions are required.** There are fourteen across 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.
166
189
 
167
190
  ### G1 Problem · 20'
168
191
 
@@ -186,7 +209,7 @@ as material, and asking them is never wrong; requiring them is.
186
209
 
187
210
  ### G3 Blueprint · 45'
188
211
 
189
- Read against `.control/generated/blueprint.md`, not against seven files.
212
+ Read against `.how-rendered/blueprint.md`, not against seven files — every one of the seven questions below is answerable from that page.
190
213
 
191
214
  1. ★ Is every use case title a sentence a user would say, not a system term?
192
215
  2. ★ Any `FR` with no use case? (the validator answers this, not an opinion)
@@ -207,93 +230,116 @@ Skipped entirely at `mode: catalog`.
207
230
  3. ★ What stops us starting tomorrow? (MUST be empty)
208
231
  4. ★ Validators green **and** the review leaving no open finding? (both — one is fact, one is judgement)
209
232
  5. Does any choice here lock us to one vendor or technology for more than a year?
210
- 6. From the DAG: which story blocks the most other stories?
233
+ 6. From the DAG: which ticket blocks the most other tickets?
211
234
  7. Top risk: who owns it, and what is the pivot trigger to turn or give up?
212
235
 
213
236
  ### G5 Release · 10'
214
237
 
215
- 1. ★ Is every RTM row for this wave green?
216
- 2. ★ Is every story's acceptance criteria proven by a test, not by an agent's statement?
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?
217
240
  3. What was dropped from the plan, and where is it recorded?
218
241
  4. Are new risks found while building in the Risk Register?
219
- 5. What one thing made this wave take longer than expected?
242
+ 5. What one thing made this spec take longer than expected?
220
243
  6. What does the client need to know before this goes live?
221
244
  7. What is watched in the first week?
222
245
 
223
- ## Units of work — `FR`, wave, `SPEC`, story
246
+ ## Units of work — `FR`, spec, `SPEC`, ticket
224
247
 
225
248
  | Unit | Is | Lifetime |
226
249
  |---|---|---|
227
250
  | `FR-N` | One **feature** — one promise to a user. Born at G2 | permanent, lives across releases |
228
- | wave | One **unit of work**. Opens at G4 or G5, closes at G5 | one slice of work |
229
- | `SPEC.md` | The machine contract for **one wave**. A projection of `.what/` + `.how/`, and MUST NOT contain anything new | one wave |
230
- | story | One piece taken by one builder to a green PR | one wave |
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 |
231
254
 
232
- **One wave = one `SPEC` = one tracker Task.** One to one to one, with no compound joins.
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.**
233
257
 
234
- A wave's scope is flexible and **ideally one `FR`**, because an `FR` is human-testable from birth — it has a
235
- proof of done. One `FR` MAY span several waves, one wave MAY carry several small neighbouring `FR`, and a
236
- wave MAY be a standalone slice of one large `FR`.
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`.
237
261
 
238
- A wave MAY cross several Product Components. One condition: **G4 has passed for every component the wave
239
- touches**, or that component is at `mode: catalog`, whose G4 is skipped by design (V22). That is why G4 and
240
- the wave are deliberately different units — G4 decides *how one component is built*, a wave decides *which
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
241
265
  work happens now*.
242
266
 
243
- `SPEC.md` and story files **are not read by humans.** Both are machine contracts, and no review burden MAY
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
244
274
  be moved onto them. The human review surface stops at the PRD, `.what/`, and `.how/`.
245
275
 
246
276
  ### Mapping to a tracker
247
277
 
248
- | Jira | WDI | Lifetime |
278
+ | Tracker | WDI | Lifetime |
249
279
  |---|---|---|
250
- | Epic | Product Component | permanent an Epic never closes |
251
- | Task | **wave = `SPEC.md`** | one wave |
252
- | Sub-task | story | one wave |
280
+ | **Parent issue** | **spec** | one spec |
281
+ | **Issue, carrying native blocking edges** | **ticket** | one spec |
253
282
  | Fix Version | release | one release |
254
- | Label / custom field | the `CAP-N` and `FR-N` the wave satisfies | — |
283
+ | Label / custom field | the `CAP-N` and `FR-N` the spec satisfies | — |
255
284
  | — a document, not an issue | `.what/` · `.how/` · `SPEC.md` | — |
256
285
 
257
- **`FR` is not a Task.** It sits at the level of *promise*, not of *work*: one `FR` MAY be delivered by
258
- stories in two waves, and one story MAY satisfy part of two `FR`. Mapping promise onto work-issue forces a
259
- 1:1 that does not exist, and produces Tasks opened at G2 that hang across releases. `FR` travels as a label
260
- on the Task.
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.
261
289
 
262
- **The corpus stays the source of truth; the tracker is a view.** Story status is read from story-file
263
- frontmatter, never copied into two places.
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.
264
293
 
265
- **Parallelism.** Between stories through the `depends_on` and `touches` DAG; between waves through
266
- `depends_on` at wave level. A wave that declares no dependency runs in parallel.
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.
267
298
 
268
- ## Wave size, and what it does not decide
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
269
313
 
270
314
  | Size | Shape | Effect |
271
315
  |---|---|---|
272
- | **S** | ≤3 stories, no new `FR` | G4 and G5 merge into one 20-minute session |
273
- | **M** | 4–12 stories | as usual |
274
- | **L** | >12 stories, or a new container | the retrospective runs |
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 |
275
319
 
276
- Size is recorded in `waves.yaml`. It MAY be raised mid-flight; it MUST NOT be lowered.
320
+ Size is recorded in `specs.yaml`. It MAY be raised mid-flight; it MUST NOT be lowered.
277
321
 
278
- **Size does not choose which gates are active** — that is `mode`'s job. It only governs session merging and
279
- whether the retrospective is required.
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).
280
324
 
281
325
  **Fast Path** skips every gate. It is available for a fix that changes no `FR`, `UC`, `AD-N`, or domain
282
- model, is at most one story, and touches no money, personal data, or third-party integration. If an `FR`
283
- turns out to be touched, work MUST stop and become a wave `S`.
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`.
284
328
 
285
- ## Story-closing checklist — three items
329
+ ## Ticket-closing checklist — three items
286
330
 
287
- Answered as each story finishes, before the next is picked up.
331
+ Answered as each ticket finishes, before the next is picked up.
288
332
 
289
- 1. A decision worth remembering? → `wdi-decision`. A story that contradicts an `AD-N` **stops** rather than
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
290
336
  closing; that is the one case where recording is mandatory.
291
337
  2. A trap for the next agent? → recorded where the next agent will read it.
292
- 3. Test names matching what `waves.yaml` records?
338
+ 3. Test names matching what `specs.yaml` records?
293
339
 
294
- Five items left this list and did not disappear — they moved to **wave close**, where the information is
295
- actually available: `LC` registration (V12), the `touches` check, SPEC companion distillation, and the
296
- structure-map refresh. Registering an `LC` before a story was `ready-for-dev` demanded the answer at the
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
297
343
  moment it was thinnest.
298
344
 
299
345
  ## When something settled has to change
@@ -301,28 +347,53 @@ moment it was thinnest.
301
347
  One trigger: **an artifact other people agreed to needs to change.** Run this matrix and reopen the gates it
302
348
  names.
303
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
+
304
360
  | What changes | MUST be re-reviewed | Gate reopened |
305
361
  |---|---|---|
306
362
  | Business Goal | The whole chain beneath it | G1 |
307
- | `FR` — its **promise** | Related `UC`, decisions naming it, stories not yet `in-progress`, RTM rows | G2 then G3 |
363
+ | `FR` — its **promise** | Related `UC`, decisions naming it, tickets not yet started, RTM rows | G2 then G3 |
308
364
  | `FR` — its **wording** only | Nothing. The skill at work fixes it, one Revision History row per pass | none |
309
365
  | `NFR` | Its enforcing decisions and tests | G4 |
310
- | UX flow | Related use case specifications, stories not yet `in-progress` | G3 |
366
+ | UX flow | Related use case specifications, tickets not yet started | G3 |
311
367
  | Business rule | `UC` using it, related tests | G3 for a cross-component rule, G4 for a local one |
312
- | An `AD-N` | Affected C4 components, stories not yet `in-progress` | G4 |
313
- | Story acceptance criteria | That story's tests, its RTM row | none — the row going green again is enough |
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 |
314
370
 
315
371
  The promise-versus-wording split is owned by `prd-guide.md` and MUST NOT be re-decided here.
316
372
 
317
- - A story already `in-progress` MUST NOT have its contract changed. Stop it, return it to `ready-for-dev`,
318
- then change it.
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.
319
385
  - Superseded artifacts are never deleted. Their status becomes `superseded` and points at the replacement.
320
- - A change that cancels more than 30% of a wave's stories MUST go through `wdi-decision`, which wraps
386
+ - A change that cancels more than 30% of a spec's tickets MUST go through `wdi-decision`, which wraps
321
387
  `bmad-correct-course`, rather than being patched.
322
388
 
323
- **A new PRD arriving after G3 amends the blueprint; it does not repeat it.** The new components are born,
324
- their rows join the catalogue and the three inventories, and **G3 reopens over the delta only**. The
325
- 45-minute session does not run again for one additional initiative.
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.
326
397
 
327
398
  ## Roles
328
399
 
@@ -331,8 +402,8 @@ their rows join the catalogue and the three inventories, and **G3 reopens over t
331
402
  | Product Owner | Answers the checklists, decides at the five gates, sets `mode` and `risk_accepted`, owns risk | Write artifacts, read machine contracts |
332
403
  | Agent at G1–G3 | Writes the brief, the PRD, and the blueprint | Decide depth or accept risk |
333
404
  | Agent at G4 | Writes one component's behaviour and mechanism | Write code |
334
- | Builder | One story through to a green PR | Change `.what/`, `.how/`, or an `applied` decision |
335
- | Review panel | Two different CLI families, neither the builder's | Give a final verdict — findings are adjudicated by the coordinator |
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 |
336
407
 
337
408
  Panel composition and CLI/model selection are governed by the global Agent Rules and MUST NOT be restated
338
409
  here.
@@ -30,7 +30,7 @@ This is the decision the guide exists for, and the default is **Update**.
30
30
  | Situation | What to do |
31
31
  |---|---|
32
32
  | Behaviour of an existing promise changes | Update |
33
- | A promise turns out to be wrong and must be withdrawn | Update — and the withdrawal MUST be visible in Revision History, not silently deleted |
33
+ | A promise turns out to be wrong and must be withdrawn | Update — and the withdrawal MUST be visible in Revision History, not silently deleted. This is the one mandated history line in the method, and it survives because it is **business** history read by someone outside the room, not a record that a document changed |
34
34
  | A new feature that a reader would expect to find in this PRD | Update |
35
35
  | The next release extends what this PRD already promises | Update. A release is never a reason on its own |
36
36
  | A functional area a reader would not think to look for here | New PRD |
@@ -92,7 +92,7 @@ carried by:
92
92
  | Field | Answers |
93
93
  |---|---|
94
94
  | `CAP.target_release` | Which release this capability is planned for. **The only place a promise's release is written** |
95
- | `waves.yaml` `release` | Which release a wave of work belongs to — the execution side |
95
+ | `specs.yaml` `release` | Which release a spec of work belongs to — the execution side |
96
96
 
97
97
  An `FR` MUST NOT carry a release of its own. It inherits one from its `CAP`, the same way it reaches
98
98
  its `BG`: each child names only its parent. A capability whose requirements genuinely land in
@@ -102,30 +102,36 @@ Naming a release in prose as context MAY happen; the registry is what binds.
102
102
 
103
103
  ## Numbering
104
104
 
105
- `BG-N`, `CAP-N`, `FR-N`, `NFR-N`, and `UJ-N` MUST be allocated from `.control/registry/requirements.yaml`
106
- and MUST NOT restart at 1. The chain runs `BG → CAP → FR/NFR → UC → DEC → Story → Test`, and each
105
+ `BG-N` is allocated from `.control/registry/goals.yaml`; `CAP-N`, `FR-N`, `NFR-N`, and `UJ-N` from this initiative's own `.control/registry/requirements-<slug>.yaml` — one file, one writer, one gate
106
+ and MUST NOT restart at 1. The chain runs `BG → CAP → FR/NFR → UC → DEC → Ticket → Test`, and each
107
107
  child names only its parent:
108
108
 
109
- - Each feature in §4 MUST declare its `CAP-N` and the `BG-N` it serves.
109
+ - Each feature in §3 MUST declare its `CAP-N` and the `BG-N` it serves.
110
110
  - Each `FR` MUST declare its `capability`. Its goal is reached *through* the capability and MUST NOT
111
111
  be restated on the FR.
112
112
  - Each `NFR` attaches to `BG` directly — it does not pass through `CAP`.
113
113
 
114
- V15 checks both links. An FR with no capability is a promise nobody asked for.
114
+ `chain-links` checks both links. An FR with no capability is a promise nobody asked for.
115
115
 
116
- ## Proof of done one, in business language
116
+ ## `FR`/`NFR` text lives in the registry, not in this document
117
+
118
+ The PRD cites `FR-N`/`NFR-N` under each feature's **Realizes:** line. It MUST NOT also write the
119
+ statement, the proof of done, or the enforcer in prose — those fields live on the id's own row in
120
+ `requirements-<slug>.yaml`, and landing them there is part of `wdi-product` producing this PRD, not a
121
+ follow-up. A promise written in both places is one fact with two homes, and the copy a reader trusts
122
+ is whichever they open first.
117
123
 
118
124
  Every `FR` MUST carry **exactly one** proof of done: a sentence a Product Owner can check without opening
119
- the code. It is what lets one `FR` become one testable unit of work, and it is why a wave is ideally one
125
+ the code. It is what lets one `FR` become one testable unit of work, and it is why a spec is ideally one
120
126
  `FR`.
121
127
 
122
- **The double proof of done is repealed.** Requiring a business sentence *and* a technical restatement
123
- naming status codes, limits, and payloads meant writing the same acceptance twice, in two vocabularies that
124
- then drifted. The technical form is represented by the **test name** recorded in `waves.yaml`, where it is
125
- checked mechanically (V4) instead of read.
128
+ **The double proof of done stays repealed.** A business sentence *and* a technical restatement naming
129
+ status codes, limits, and payloads meant writing the same acceptance twice, in two vocabularies that
130
+ then drifted. The technical form is represented by the **test name** recorded in `specs.yaml`, where it
131
+ is checked mechanically (`ticket-has-test`) instead of read.
126
132
 
127
- A technical detail that genuinely has to be written down belongs in `addendum.md` or in the SDD, not in a
128
- second proof of done.
133
+ A technical detail that genuinely has to be written down belongs in `addendum.md` or in the SDD, not in
134
+ a second proof of done — and not in this document's prose either.
129
135
 
130
136
  ## Wording versus promise — two different journeys
131
137
 
@@ -148,7 +154,7 @@ gate and then get dropped.
148
154
 
149
155
  A domain entity MUST have exactly one owner authorised to write it. Usually that is a Product Component,
150
156
  declared as `owns:` on its row in `components.yaml`; an `FR` from another PRD that needs to change the entity
151
- MUST point at the owner's `FR` through `defers_to`, rather than promising to write it itself. V21 checks this.
157
+ MUST point at the owner's `FR` through `defers_to`, rather than promising to write it itself. `entity-one-writer` checks this.
152
158
 
153
159
  **A few entities belong to no Product Component at all** — a product-wide setting, the trace of one shared
154
160
  outbound channel. Those are owned by `_platform` through `platform_owns`, and the test for when that is
@@ -162,12 +168,13 @@ moment it is written — not at the moment the code disagrees.
162
168
 
163
169
  ## Sections that stop being optional
164
170
 
165
- BMad's Adapt-In Menu is conditional by design. Two clusters MUST always be present here:
171
+ BMad's Adapt-In Menu is conditional by design. Two clusters MUST always be present here, and are in
172
+ the Essential Spine rather than the Adapt-In menu for exactly that reason:
166
173
 
167
- | Cluster | Why it is required |
168
- |---|---|
169
- | **Cross-Cutting NFRs** | G2 passes on numbered FR **and NFR**. Each NFR MUST name `enforced_by` — an `AD-N`, a `DEC-`, or a test name. An NFR nothing enforces is decoration (V5) |
170
- | **Constraints and Guardrails** | A constraint found at G4 costs a decision that one sentence here would have prevented |
174
+ | Cluster | Section | Why it is required |
175
+ |---|---|---|
176
+ | **Cross-Cutting NFRs** | §6 | G2 passes on numbered FR **and NFR**. Each NFR MUST name `enforced_by` — an `AD-N`, a `DEC-`, or a test name. An NFR nothing enforces is decoration (`nfr-has-enforcer`) |
177
+ | **Constraints and Guardrails** | §7 | A constraint found at G4 costs a decision that one sentence here would have prevented |
171
178
 
172
179
  Constraints MUST state only the delta beyond `.what/_product-brief/brief.md`, and MUST say "none
173
180
  beyond the brief" when there is nothing. An absent section reads as "not checked".
@@ -175,6 +182,42 @@ beyond the brief" when there is nothing. An absent section reads as "not checked
175
182
  Prerequisites MUST NOT be written as prose. An initiative blocked on another is a `depends_on`
176
183
  between `CAP` entries.
177
184
 
185
+ ## §1 Why This Initiative is a delta
186
+
187
+ BMad's default §1 Vision writes the product's vision from scratch, in the same 2-3 paragraph shape as
188
+ the brief's own narrative. On the first PRD a product ever gets, that duplicates `Why` in
189
+ `.what/_product-brief/brief.md` almost sentence for sentence — the same defect Executive Summary and
190
+ Vision had against each other inside the brief before they were merged.
191
+
192
+ §1 states only what THIS initiative changes, adds, or unlocks beyond what the brief's `Why` already
193
+ says. A product with a single initiative MAY reduce this to one sentence pointing back to the brief.
194
+ The full narrative is never written twice.
195
+
196
+ ## Sections dropped from BMad's default, and where each fact actually lives
197
+
198
+ Four of BMad's default sections carry no content specific to this PRD, or duplicate a fact this method
199
+ already gives a home. Each is dropped rather than left conditional:
200
+
201
+ | Dropped section | Where the fact lives instead |
202
+ |---|---|
203
+ | Document Purpose | Nowhere — it explained what a PRD is in general, true of every PRD, so it held no information specific to this one |
204
+ | Glossary | `.control/product-glossary.md`. A term this PRD needs that is not there yet goes through `wdi-question` in the same pass — it is never added to a document-local glossary `wdi-blueprint` will not read at G3 |
205
+ | Non-Goals | The product's own Scope Out (`.what/_product-brief/brief.md`), for what the product never does, and §4.2 Out of Scope for MVP, for what this release defers. A third list restating both is the same fact twice |
206
+ | Open Questions | `.control/questions/`, the moment the question is found — not batched into a section read once at Finalize |
207
+ | Assumptions Index | `.control/questions/assumptions.md`, through `wdi-question`, before G2. The inline `[ASSUMPTION]` tag stays as a marker for the conversation that produced it; it is not also an index entry |
208
+
209
+ A reader who wants all of these assembled with the PRD's own content reads the generated deliverable —
210
+ see below — rather than a hand-maintained index inside this document.
211
+
212
+ ## The generated deliverable
213
+
214
+ A complete, self-contained copy for a reader who should not need to open the registry or
215
+ `.control/questions/` lives at `.what-rendered/_prd/<slug>/prd.md` — written by `/wdi-report render prd`,
216
+ which runs `validate.py --generate`. It assembles this PRD's own prose verbatim, the
217
+ Vision from the brief's `Why` plus §1's delta, the `FR`/`NFR` rows from `requirements-<slug>.yaml`, the
218
+ Glossary terms this PRD actually uses, Non-Goals from the brief's Scope Out and §4.2, and the open
219
+ rows from `.control/questions/` that cite one of this PRD's ids. Nobody writes to it by hand.
220
+
178
221
  ## What goes to `addendum.md`
179
222
 
180
223
  `addendum.md` is **not** a change log — Revision History is. It holds depth that belongs downstream
@@ -81,8 +81,8 @@ NOT be written at all.
81
81
  | Behaviour | How the three move together, per use case | `06-flows/` |
82
82
 
83
83
  From `guarded` up, every Boundary object MUST correspond to an `LC` in `.control/registry/components.yaml`;
84
- at `deep`, Control objects too. Registration is checked **when the wave closes** — V12 — not before a story
85
- is `ready-for-dev`.
84
+ at `deep`, Control objects too. Registration is checked **when the spec closes** — `lc-registered` — not before a ticket
85
+ is picked up.
86
86
 
87
87
  Flows **into and out of** each boundary MUST be stated, not just the boundary. A boundary listed without its
88
88
  direction of call is a name, not a design.
@@ -201,7 +201,8 @@ Only what this component's `mode` demands, and nothing beyond it:
201
201
  - At `deep`: Robustness Analysis done; every `critical` use case mirrored at the technical altitude under
202
202
  the same ids; contract specs answering all five lanes; the data dictionary present.
203
203
  - Always: unresolved `[NEEDS CONFIRMATION]` filed through `wdi-question`, no unresolved `[MISSING]`, and
204
- `wdi-review` run with the lens set `risk_accepted` names.
204
+ `wdi-review` run with the lens set `risk_accepted` names for a gate-opening review — a re-review after
205
+ the gate runs the lighter set, and `wdi-review` owns which.
205
206
 
206
- The spine comes first and `bmad-spec` comes last. An SDD written before the spine will be rewritten; a SPEC
207
+ The spine comes first and the spec's contract comes last. An SDD written before the spine will be rewritten; a SPEC
207
208
  written before the SDD has nothing to project.