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.
- package/README.md +436 -271
- package/bin/wdi-method.js +198 -5
- package/kit/.constitution/method/README.md +76 -75
- package/kit/.constitution/method/constitution.md +2 -1
- package/kit/.constitution/method/document/architecture-guide.md +10 -10
- package/kit/.constitution/method/document/bmad-guide.md +50 -16
- package/kit/.constitution/method/document/bmad-skill-register.md +74 -71
- package/kit/.constitution/method/document/brief-guide.md +42 -11
- package/kit/.constitution/method/document/corpus-guide.md +146 -11
- package/kit/.constitution/method/document/decision-guide.md +199 -134
- package/kit/.constitution/method/document/delivery-flow-guide.md +154 -83
- package/kit/.constitution/method/document/prd-guide.md +63 -20
- package/kit/.constitution/method/document/sdd-guide.md +5 -4
- package/kit/.constitution/method/document/srs-guide.md +150 -147
- package/kit/.constitution/method/document/templates/addendum.md +70 -71
- package/kit/.constitution/method/document/templates/architecture-spine.md +6 -4
- package/kit/.constitution/method/document/templates/brief.md +132 -110
- package/kit/.constitution/method/document/templates/c4.md +11 -11
- package/kit/.constitution/method/document/templates/contract.md +51 -52
- package/kit/.constitution/method/document/templates/cross-cutting.md +1 -2
- package/kit/.constitution/method/document/templates/design-system.md +0 -1
- package/kit/.constitution/method/document/templates/integration.md +68 -69
- package/kit/.constitution/method/document/templates/inventory.md +0 -1
- package/kit/.constitution/method/document/templates/lc.md +49 -47
- package/kit/.constitution/method/document/templates/lifecycle.md +51 -52
- package/kit/.constitution/method/document/templates/model.md +68 -55
- package/kit/.constitution/method/document/templates/oq.md +45 -45
- package/kit/.constitution/method/document/templates/prd.md +244 -226
- package/kit/.constitution/method/document/templates/questions.md +100 -76
- package/kit/.constitution/method/document/templates/rules.md +46 -47
- package/kit/.constitution/method/document/templates/sdd.md +26 -11
- package/kit/.constitution/method/document/templates/srs.md +46 -25
- package/kit/.constitution/method/document/templates/uc.md +1 -1
- package/kit/.constitution/method/document/templates/ux.md +76 -77
- package/kit/.constitution/method/document/ux-guide.md +115 -99
- package/kit/.constitution/method/language-guide.md +1 -1
- package/kit/.constitution/method/method-glossary.md +29 -16
- package/kit/.constitution/method/scripts/timeline.py +663 -665
- package/kit/.constitution/method/scripts/validate.py +1143 -362
- package/kit/.constitution/method/structure-guide.md +3 -3
- package/kit/.constitution/method/why/README.md +184 -169
- package/kit/.constitution/method/why/artifact-map.md +15 -13
- package/kit/.constitution/method/why/mode-risk-map.md +140 -0
- package/kit/.constitution/method/why/portability.md +1 -1
- package/kit/.constitution/method/why/rationale.md +12 -5
- package/kit/.constitution/project/README.md +2 -2
- package/kit/.constitution/project/codebase-brownfield-guide.md +18 -18
- package/kit/.constitution/project/codebase-conventions-guide.md +18 -18
- package/kit/.constitution/project/codebase-stack-guide.md +18 -18
- package/kit/assets/bmad-custom/bmad-architecture.toml +1 -1
- package/kit/assets/bmad-custom/bmad-correct-course.toml +5 -5
- package/kit/assets/bmad-custom/bmad-prd.toml +9 -3
- package/kit/assets/bmad-custom/bmad-product-brief.toml +6 -2
- package/kit/skills/wdi-blueprint/SKILL.md +71 -10
- package/kit/skills/wdi-build/SKILL.md +233 -122
- package/kit/skills/wdi-component/SKILL.md +8 -6
- package/kit/skills/wdi-decision/SKILL.md +187 -183
- package/kit/skills/wdi-help/SKILL.md +8 -7
- package/kit/skills/wdi-init/SKILL.md +20 -6
- package/kit/skills/wdi-problem/SKILL.md +31 -13
- package/kit/skills/wdi-product/SKILL.md +30 -17
- package/kit/skills/wdi-question/SKILL.md +170 -88
- package/kit/skills/wdi-reconcile/SKILL.md +33 -10
- package/kit/skills/wdi-report/SKILL.md +77 -25
- package/kit/skills/wdi-review/SKILL.md +201 -118
- package/kit/skills/wdi-systematic-debugging/SKILL.md +7 -7
- package/kit/skills/wdi-upgrade/SKILL.md +179 -0
- package/kit/skills/wdi-ux/SKILL.md +35 -11
- package/kit-overlay/AGENTS.md +2 -2
- package/kit-overlay/README.md +76 -75
- package/kit-overlay/constitution.md +2 -1
- package/kit-overlay/portability.md +1 -1
- package/package.json +43 -43
- package/scaffold/.control/product-glossary.md +1 -1
- package/scaffold/.control/registry/goals.yaml +25 -0
- package/scaffold/.control/registry/index.yaml +5 -5
- package/scaffold/.control/registry/specs.yaml +5 -0
- package/scaffold/.control/structure-codebase.md +19 -19
- package/scaffold/.control/structure-document.md +25 -25
- package/kit/.constitution/method/document/templates/rtr.md +0 -61
- package/kit/assets/bmad-custom/bmad-build-auto.toml +0 -10
- package/kit/assets/bmad-custom/bmad-build.toml +0 -52
- package/kit/assets/bmad-custom/bmad-code-review.toml +0 -13
- package/kit/assets/bmad-custom/bmad-retrospective.toml +0 -9
- package/kit/assets/bmad-custom/bmad-spec.toml +0 -16
- package/scaffold/.control/registry/requirements.yaml +0 -15
- 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
|
|
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,
|
|
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
|
|
42
|
-
several components, so a per-
|
|
43
|
-
which
|
|
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 |
|
|
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
|
|
97
|
-
|
|
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 |
|
|
106
|
-
|
|
107
|
-
| **G1 Problem** | What the problem is, whose it is, why it earns work | once | 20' |
|
|
108
|
-
| **G2 Product** | What is built, and how it feels to use | once per PRD | 45' |
|
|
109
|
-
| **G3 Blueprint** | The whole portrait: which use cases, their entities, tables, endpoints, screens, and the invariants binding them | **once per product** | 45' |
|
|
110
|
-
| **G4 Component** | How one Product Component is built, and what the choice costs | **once per Product Component** | 20–30' | **
|
|
111
|
-
| **G5 Release** | Whether it is done and proven | once per
|
|
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
|
-
|
|
114
|
-
|
|
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**, `.
|
|
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
|
|
165
|
-
|
|
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 `.
|
|
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
|
|
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
|
|
216
|
-
2. ★ Is every
|
|
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
|
|
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`,
|
|
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
|
-
|
|
|
229
|
-
| `SPEC.md` | The
|
|
230
|
-
|
|
|
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
|
|
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
|
|
235
|
-
proof of done. One `FR` MAY span several
|
|
236
|
-
|
|
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
|
|
239
|
-
touches**, or that component is at `mode: catalog`, whose G4 is skipped by design (
|
|
240
|
-
the
|
|
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
|
-
|
|
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
|
-
|
|
|
278
|
+
| Tracker | WDI | Lifetime |
|
|
249
279
|
|---|---|---|
|
|
250
|
-
|
|
|
251
|
-
|
|
|
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
|
|
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
|
-
|
|
258
|
-
|
|
259
|
-
|
|
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
|
-
|
|
263
|
-
|
|
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
|
-
**
|
|
266
|
-
|
|
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
|
-
|
|
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
|
|
273
|
-
| **M** | 4–12
|
|
274
|
-
| **L** | >12
|
|
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 `
|
|
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
|
|
279
|
-
whether
|
|
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
|
|
283
|
-
turns out to be touched, work MUST stop and become a
|
|
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
|
-
##
|
|
329
|
+
## Ticket-closing checklist — three items
|
|
286
330
|
|
|
287
|
-
Answered as each
|
|
331
|
+
Answered as each ticket finishes, before the next is picked up.
|
|
288
332
|
|
|
289
|
-
1.
|
|
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 `
|
|
338
|
+
3. Test names matching what `specs.yaml` records?
|
|
293
339
|
|
|
294
|
-
Five items left this list and did not disappear — they moved to **
|
|
295
|
-
actually available: `LC` registration (
|
|
296
|
-
structure-map refresh. Registering an `LC` before a
|
|
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,
|
|
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,
|
|
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,
|
|
313
|
-
|
|
|
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
|
-
|
|
318
|
-
|
|
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
|
|
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
|
|
324
|
-
|
|
325
|
-
|
|
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
|
|
335
|
-
| Review panel |
|
|
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
|
-
| `
|
|
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
|
|
106
|
-
and MUST NOT restart at 1. The chain runs `BG → CAP → FR/NFR → UC → DEC →
|
|
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 §
|
|
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
|
-
|
|
114
|
+
`chain-links` checks both links. An FR with no capability is a promise nobody asked for.
|
|
115
115
|
|
|
116
|
-
##
|
|
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
|
|
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
|
|
123
|
-
|
|
124
|
-
then drifted. The technical form is represented by the **test name** recorded in `
|
|
125
|
-
checked mechanically (
|
|
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
|
|
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.
|
|
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 (
|
|
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
|
|
85
|
-
is
|
|
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
|
|
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.
|