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.
- package/README.md +14 -4
- package/bin/wdi-method.js +2 -0
- package/kit/.constitution/method/README.md +1 -1
- package/kit/.constitution/method/document/decision-guide.md +208 -199
- package/kit/.constitution/method/document/delivery-flow-guide.md +412 -409
- package/kit/.constitution/method/document/templates/decision.md +6 -1
- package/kit/.constitution/method/method-glossary.md +183 -182
- package/kit/.constitution/method/scripts/validate.py +102 -2
- package/kit/.constitution/method/why/README.md +3 -1
- package/kit/.constitution/method/why/artifact-map.md +1 -1
- package/kit/.constitution/method/why/portability.md +98 -98
- package/kit/skills/wdi-autopilot/SKILL.md +366 -0
- package/kit/skills/wdi-build/SKILL.md +371 -357
- package/kit/skills/wdi-decision/SKILL.md +197 -187
- package/kit/skills/wdi-explain-to-me/SKILL.md +84 -0
- package/kit/skills/wdi-help/SKILL.md +102 -99
- package/kit/skills/wdi-question/SKILL.md +176 -170
- package/kit-overlay/AGENTS.md +223 -216
- package/kit-overlay/README.md +1 -1
- package/kit-overlay/portability.md +98 -98
- package/package.json +1 -1
|
@@ -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
|
-
|
|
116
|
-
|
|
117
|
-
|
|
|
118
|
-
|
|
119
|
-
| **
|
|
120
|
-
| **
|
|
121
|
-
| **
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
- **
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
|
144
|
-
|
|
145
|
-
|
|
|
146
|
-
| **
|
|
147
|
-
|
|
|
148
|
-
| **
|
|
149
|
-
| **
|
|
150
|
-
|
|
|
151
|
-
|
|
|
152
|
-
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
|
251
|
-
|
|
252
|
-
| `
|
|
253
|
-
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
spec
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
|
281
|
-
|
|
282
|
-
|
|
|
283
|
-
|
|
|
284
|
-
|
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
sub-task
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
|
317
|
-
|
|
318
|
-
| **
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
that
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
|
363
|
-
|
|
364
|
-
|
|
|
365
|
-
| `
|
|
366
|
-
|
|
|
367
|
-
|
|
|
368
|
-
|
|
|
369
|
-
|
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
the
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
-
|
|
384
|
-
|
|
385
|
-
-
|
|
386
|
-
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
|
403
|
-
|
|
404
|
-
|
|
|
405
|
-
|
|
|
406
|
-
|
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
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.
|