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
@@ -1,183 +1,187 @@
1
- ---
2
- name: wdi-decision
3
- description: Use when a decision worth remembering has been made, when one has to be carried into the documents it governs, or when a planning assumption turns out to be void. Three intents — open, accept, apply. Wraps bmad-correct-course. Produces a globally numbered DEC-.
4
- ---
5
-
6
- # WDI Decision
7
-
8
- Free of stage and free of role: a decision MAY be made at any point by anyone. What is fixed is where its
9
- output lives — `.control/decisions/DEC-NNN-<slug>.md`, numbered globally from `decisions.yaml`.
10
-
11
- Three intents, because deciding, ratifying, and rewriting the documents are three different acts and merging
12
- them means documents change before anyone approved the change.
13
-
14
- | Intent | Does | Who |
15
- |---|---|---|
16
- | `open` | Writes a `DEC-` at `status: draft`. Also the entry point for a void planning assumption, which is where `bmad-correct-course` is dispatched | anyone |
17
- | `accept` | Raises `draft` → `accepted` | **the Product Owner only** |
18
- | `apply` | Dispatches the owner of every document the decision reaches, checks what came back, fills `touches`, raises `applied` | anyone |
19
-
20
- Applying is what **freezes** a decision, not accepting. `decision-guide.md` owns the full ladder and this skill
21
- MUST NOT restate it.
22
-
23
- ## The one test, before anything is written
24
-
25
- > **If someone asks in three months why it is like this, is the answer readable from the code?**
26
-
27
- Yes → it MUST NOT be recorded. No → record it.
28
-
29
- **Recording is not mandatory**, and a decision nobody recorded is normal rather than negligence. You MUST NOT
30
- log it as debt or backfill it later from memory. One case stays mandatory: a decision that **contradicts or
31
- changes an `AD-N`**.
32
-
33
- The old name ADR forced the wrong question — *"is this architectural?"* — and that question threw away exactly
34
- the decisions most worth keeping, the ones that sound small.
35
-
36
- ## Intent `open`
37
-
38
- ### Inputs
39
-
40
- Any of these, alone or together: minutes in `.control/meetings/`, an answered question in
41
- `.control/questions/`, a review or debugging finding, a memlog in `.control/memlog/`, a `wdi-reconcile` conflict.
42
-
43
- The memlog is the richest source and the most often forgotten. It is the record of *why* — read it before
44
- writing the Why section rather than reconstructing the reasoning from the outcome.
45
-
46
- ### What it writes
47
-
48
- Three sections, always: **Decision** (one sentence, present tense, quotable) · **Why** · **Cost** (what becomes
49
- harder). Alternatives, a reversal trigger, and Trace are required only when the decision reaches a Product
50
- Component whose `risk_accepted` is `low`; elsewhere an empty one MUST be dropped rather than left as a heading.
51
-
52
- Frontmatter carries `touches: []` — empty until applied — and `type:` when it is useful. There is no `layer:`
53
- and no `component:`; both were classifications demanded before anything was known.
54
-
55
- A `DEC-` MUST NOT hold an open question. Those go to `wdi-question`.
56
-
57
- ### A void planning assumption
58
-
59
- This is the same intent, with one extra step in front. The trigger is one thing: **a planning assumption turned
60
- out to be void.** It usually surfaces while building, but its impact reaches back into G2, G3, and G4.
61
-
62
- Three things it is **not**:
63
-
64
- | Ask | Route |
65
- |---|---|
66
- | Something is broken and the cause is unknown | `wdi-systematic-debugging` **first**. A correction built on a guessed cause corrects the wrong thing |
67
- | A decision exists and documents must follow | intent `apply`. There is no plan to re-cut |
68
- | Scope grows without invalidating anything | `wdi-product` intent `update`, then the normal flow |
69
-
70
- State the void assumption in **one line** before dispatching. A correction whose trigger cannot be stated in one
71
- line is a re-plan, and it belongs upstream.
72
-
73
- Then dispatch `bmad-correct-course`. Do not restate the rules to it — they arrive through `persistent_facts` in
74
- `_bmad/custom/bmad-correct-course.toml`, including the ban on direct edits. Name the corpus files in scope
75
- explicitly; it globs its own defaults, which this project does not use.
76
-
77
- **Its impact analysis is incomplete by construction** — it knows a PRD, epics, and stories, and it cannot see
78
- `.what/<pc>/`, `.how/`, `.control/`, or `.constitution/`. Every one of these MUST be checked here:
79
-
80
- | Layer | What to look for |
81
- |---|---|
82
- | `.what/_prd/` | The `FR`/`NFR` that no longer holds, and every one depending on it |
83
- | `.what/<pc>/` | Use cases realising those `FR`, business rules, state lifecycles that lose a state |
84
- | `.how/_platform/` | An `AD-N` the correction breaks, a container the C4 set no longer describes, an inventory row with nothing behind it |
85
- | `.how/<pc>/` | Contracts, flows, and Failure Behaviour written against the old promise |
86
- | `SPEC.md` | What the wave projected — a SPEC MUST NOT be edited to match; it is re-derived |
87
- | `waves.yaml` | The wave's size, and whether the correction changes it |
88
- | Story files | Which stories are `in-progress`, and which are not yet started |
89
-
90
- The result is a `DEC-` of **`type: course-correction`**. The `SCP-` code is retired — a course correction is a
91
- decision, and no second code names the same thing.
92
-
93
- A correction cancelling more than **30%** of a wave's stories MUST NOT be handled as a patch. Say so, and let
94
- the wave be re-cut through `wdi-build`.
95
-
96
- A story already `in-progress` MUST NOT have its contract changed. Report it; stopping it and returning it to
97
- `ready-for-dev` is the coordinator's act.
98
-
99
- ## Intent `accept`
100
-
101
- Only the Product Owner MAY raise a `DEC-` to `accepted`. **An agent MUST NOT accept its own.** When work is
102
- blocked waiting on one, the block is reported, never resolved by self-approval.
103
-
104
- An `accepted` `DEC-` that is still unapplied MAY be corrected in place, with the correction recorded in the
105
- memlog. Nothing has been built on it, so there is no divergent record to preserve.
106
-
107
- ## Intent `apply`
108
-
109
- **You apply nothing yourself.** Every artifact has an owner, and the owner writes it. A hand-edit here produces
110
- a change with no author, no input trail, and nothing that verifies it.
111
-
112
- Exactly one `DEC-`, at `status: accepted`. You MUST NOT apply one in any other status.
113
-
114
- ### Step 1 — List the targets before touching one
115
-
116
- Name every document the decision reaches, and the skill that owns each, **before** anything is dispatched. A
117
- list assembled while editing is a list that grows to fit what was already done.
118
-
119
- | Target | Dispatch |
120
- |---|---|
121
- | `.what/_product-brief/` | `wdi-problem` |
122
- | `.what/_prd/<initiative>/` | `wdi-product` intent `update` |
123
- | `.what/<pc>/` § Actor Register · § UC Catalogue · `03-domain/domain-model.md` | `wdi-blueprint` intent `catalog` |
124
- | `.what/business-rules.md` · `.control/product-glossary.md` | `wdi-blueprint` intent `catalog` |
125
- | `.how/_platform/` — spine, C4, `cross-cutting.md`, the three inventories | `wdi-blueprint` intent `platform` |
126
- | `.what/<pc>/` slots `02`–`05` — full flows, local rules, lifecycles, scenarios | `wdi-component` intent `behaviour` |
127
- | `.how/<pc>/` minus `01-ux/` | `wdi-component` intent `design` |
128
- | `EXPERIENCE.md` · `.how/<pc>/01-ux/` · `design-system.md` | `wdi-ux` |
129
- | `components.yaml` — a PC born or changed · `mode` · `risk_accepted` · the two structure maps | `wdi-init`, by intent |
130
- | `waves.yaml`, or anything inside an open wave | `wdi-build` |
131
- | `.control/questions/` | `wdi-question` |
132
- | `.control/project-non-technical-log.md` · `.control/meetings/` | `wdi-log` |
133
-
134
- A target with **no row here** MUST be reported as a gap in the method, not given a plausible owner.
135
-
136
- Apply in layer order — **`.what/` before `.how/`** — so the lower layer is written against the promise it is
137
- supposed to serve, not against the one it is about to replace. The retired `layer:` field used to declare that
138
- order in advance; it is now simply the order.
139
-
140
- ### Step 2 — Dispatch, one owner at a time
141
-
142
- Hand each owner the `DEC-` id and the exact change its layer has to carry. You MUST NOT restate the decision in
143
- your own words; **quote it.** A paraphrase drifts, and the drift is invisible because both texts read reasonably.
144
-
145
- Each owner keeps its own rules — its review, its memlog, its registry entry. You MUST NOT ask an owner to skip
146
- any of them because the change is small.
147
-
148
- ### Step 3 — Name the gates
149
-
150
- Run the change-control matrix in `delivery-flow-guide.md` and **report** which gates it names. You MUST NOT
151
- reopen a gate yourself, and you MUST NOT treat a green application as a gate that has already passed.
152
-
153
- ### Step 4 — Close the trail
154
-
155
- - Fill `touches:` with the files that were **actually** changed, in the `DEC-` and in `decisions.yaml`. Raise
156
- `status: applied`. **From that point the file MUST NOT be edited** — not the Decision, not the Cost, not a
157
- typo in the Why. Documents cite it now.
158
- - V8 checks that an `applied` decision names a non-empty `touches`.
159
- - Regenerate `.control/generated/decisions.md` with `validate.py --generate`. That table is how a decision is
160
- found now; searching the memlog for decisions is retired, and the memlog is a run log again.
161
- - Report what changed, and what the decision implied but was **not** changed.
162
-
163
- ## Rules
164
-
165
- - You MUST NOT widen scope beyond the decision. A neighbouring paragraph that now looks wrong is a finding to
166
- report, not a change to make.
167
- - You MUST NOT introduce a new domain noun. If the decision requires one, it goes through `wdi-blueprint` first.
168
- - If applying would contradict another `applied` decision, you MUST stop and report the conflict. Two applied
169
- decisions that disagree is work for intent `open`, not something to resolve by preferring the newer one.
170
- - If the decision is unapplicable as written — the document it names no longer exists, or the change was already
171
- made differently — you MUST report that instead of improvising.
172
- - You MUST NOT apply into a wave that is already closed.
173
- - `AD-N` is a different thing: a living rule with Binds · Prevents · Rule, edited in place. You MUST NOT convert
174
- one into the other.
175
- - A decision that emerged from a failed third fix attempt MUST say so in Why. That is the signal
176
- `wdi-systematic-debugging` exists to raise, and burying it wastes the finding.
177
-
178
- ## Output
179
-
180
- Intent taken. For `open`: the decision in one sentence, its three required sections, and for a correction
181
- the void assumption in one line plus what the scan found that `bmad-correct-course` could not see. For `apply`:
182
- every target with its owner, what each owner changed, what was reported instead of changed and why, the gates the
183
- matrix names, and whether `touches` and `applied` were filled.
1
+ ---
2
+ name: wdi-decision
3
+ description: Use when a decision worth remembering has been made, when one has to be carried into the documents it governs, or when a planning assumption turns out to be void. Three intents — open, accept, apply. Wraps bmad-correct-course. Produces a globally numbered DEC-.
4
+ ---
5
+
6
+ # WDI Decision
7
+
8
+ Free of stage and free of role: a decision MAY be made at any point by anyone. What is fixed is where its
9
+ output lives — `.control/decisions/DEC-NNN-<slug>.md`, numbered globally from `decisions.yaml`.
10
+
11
+ Three intents, because deciding, ratifying, and rewriting the documents are three different acts and merging
12
+ them means documents change before anyone approved the change.
13
+
14
+ | Intent | Does | Who |
15
+ |---|---|---|
16
+ | `open` | Writes a `DEC-` at `status: draft`. Also the entry point for a void planning assumption, which is where `bmad-correct-course` is dispatched | anyone |
17
+ | `accept` | Raises `draft` → `accepted` | **the Product Owner only** |
18
+ | `apply` | Dispatches the owner of every document the decision reaches, checks what came back, fills `touches`, raises `applied` | anyone |
19
+
20
+ Applying is what **freezes** a decision, not accepting. `decision-guide.md` owns the full ladder and this skill
21
+ MUST NOT restate it.
22
+
23
+ ## The one test, before anything is written
24
+
25
+ > **If someone asks in three months why it is like this, is the answer readable from the code?**
26
+
27
+ Yes → it MUST NOT be recorded. No → record it.
28
+
29
+ **Recording is not mandatory**, and a decision nobody recorded is normal rather than negligence. You MUST NOT
30
+ log it as debt or backfill it later from memory. One case stays mandatory: a decision that **contradicts or
31
+ changes an `AD-N`**.
32
+
33
+ The old name ADR forced the wrong question — *"is this architectural?"* — and that question threw away exactly
34
+ the decisions most worth keeping, the ones that sound small.
35
+
36
+ ## Intent `open`
37
+
38
+ ### Inputs
39
+
40
+ Any of these, alone or together: minutes in `.control/meetings/`, an answered question in
41
+ `.control/questions/`, a review or debugging finding, a memlog in `.control/memlog/`, a `wdi-reconcile` conflict.
42
+
43
+ The memlog is the richest source and the most often forgotten. It is the record of *why* — read it before
44
+ writing the Why section rather than reconstructing the reasoning from the outcome.
45
+
46
+ ### What it writes
47
+
48
+ Three sections, always: **Decision** (one sentence, present tense, quotable) · **Why** · **Cost** (what becomes
49
+ harder). Alternatives, a reversal trigger, and Trace are required only when the decision reaches a Product
50
+ Component whose `risk_accepted` is `low`; elsewhere an empty one MUST be dropped rather than left as a heading.
51
+
52
+ Frontmatter carries `touches: []` — empty until applied — and `type:` when it is useful. There is no `layer:`
53
+ and no `component:`; both were classifications demanded before anything was known.
54
+
55
+ A `DEC-` MUST NOT hold an open question. Those go to `wdi-question`.
56
+
57
+ ### A void planning assumption
58
+
59
+ This is the same intent, with one extra step in front. The trigger is one thing: **a planning assumption turned
60
+ out to be void.** It usually surfaces while building, but its impact reaches back into G2, G3, and G4.
61
+
62
+ Three things it is **not**:
63
+
64
+ | Ask | Route |
65
+ |---|---|
66
+ | Something is broken and the cause is unknown | `wdi-systematic-debugging` **first**. A correction built on a guessed cause corrects the wrong thing |
67
+ | A decision exists and documents must follow | intent `apply`. There is no plan to re-cut |
68
+ | Scope grows without invalidating anything | `wdi-product` intent `update`, then the normal flow |
69
+
70
+ State the void assumption in **one line** before dispatching. A correction whose trigger cannot be stated in one
71
+ line is a re-plan, and it belongs upstream.
72
+
73
+ Then dispatch `bmad-correct-course`. Do not restate the rules to it — they arrive through `persistent_facts` in
74
+ `_bmad/custom/bmad-correct-course.toml`, including the ban on direct edits. Name the corpus files in scope
75
+ explicitly; it globs its own defaults, which this project does not use.
76
+
77
+ **Its impact analysis is incomplete by construction** — it knows a PRD and BMad's own planning shapes, and it cannot see
78
+ `.what/<pc>/`, `.how/`, `.control/`, or `.constitution/`. Every one of these MUST be checked here:
79
+
80
+ | Layer | What to look for |
81
+ |---|---|
82
+ | `.what/_prd/` | The `FR`/`NFR` that no longer holds, and every one depending on it |
83
+ | `.what/<pc>/` | Use cases realising those `FR`, business rules, state lifecycles that lose a state |
84
+ | `.how/_platform/` | An `AD-N` the correction breaks, a container the C4 set no longer describes, an inventory row with nothing behind it |
85
+ | `.how/<pc>/` | Contracts, flows, and Failure Behaviour written against the old promise |
86
+ | the contract | What the spec projected — it MUST NOT be edited to match; it is re-cut |
87
+ | `specs.yaml` | The spec's size, and whether the correction changes it |
88
+ | Ticket files | Which tickets are in progress, and which have not been picked up |
89
+
90
+ The result is a `DEC-` of **`type: course-correction`**. The `SCP-` code is retired — a course correction is a
91
+ decision, and no second code names the same thing.
92
+
93
+ A correction cancelling more than **30%** of a spec's tickets MUST NOT be handled as a patch. Say so, and let
94
+ the spec be re-cut through `wdi-build`.
95
+
96
+ A ticket already in progress MUST NOT have what it asks for changed underneath it. Report it; stopping it and
97
+ returning it to `ready-for-agent` is the coordinator's act.
98
+
99
+ ## Intent `accept`
100
+
101
+ Only the Product Owner MAY raise a `DEC-` to `accepted`. **An agent MUST NOT accept its own.** When work is
102
+ blocked waiting on one, the block is reported, never resolved by self-approval.
103
+
104
+ An `accepted` `DEC-` that is still unapplied MAY be corrected in place, with the correction recorded in the
105
+ memlog. Nothing has been built on it, so there is no divergent record to preserve.
106
+
107
+ ## Intent `apply`
108
+
109
+ **You apply nothing yourself.** Every artifact has an owner, and the owner writes it. A hand-edit here produces
110
+ a change with no author, no input trail, and nothing that verifies it.
111
+
112
+ Exactly one `DEC-`, at `status: accepted`. You MUST NOT apply one in any other status.
113
+
114
+ ### Step 1 — List the targets before touching one
115
+
116
+ Name every document the decision reaches, and the skill that owns each, **before** anything is dispatched. A
117
+ list assembled while editing is a list that grows to fit what was already done.
118
+
119
+ | Target | Dispatch |
120
+ |---|---|
121
+ | `.what/_product-brief/` | `wdi-problem` |
122
+ | `.what/_prd/<initiative>/` | `wdi-product` intent `update` |
123
+ | `.what/<pc>/` § Actor Register · § UC Catalogue · `03-domain/domain-model.md` | `wdi-blueprint` intent `catalog` |
124
+ | `.what/business-rules.md` · `.control/product-glossary.md` | `wdi-blueprint` intent `catalog` |
125
+ | `.how/_platform/` — spine, C4, `cross-cutting.md`, the three inventories | `wdi-blueprint` intent `platform` |
126
+ | `.what/<pc>/` slots `02`–`05` — full flows, local rules, lifecycles, scenarios | `wdi-component` intent `behaviour` |
127
+ | `.how/<pc>/` minus `01-ux/` | `wdi-component` intent `design` |
128
+ | `EXPERIENCE.md` · `.how/<pc>/01-ux/` · `design-system.md` | `wdi-ux` |
129
+ | `components.yaml` — a PC born or changed · `mode` · `risk_accepted` · the two structure maps | `wdi-init`, by intent |
130
+ | `specs.yaml`, or anything inside an open spec | `wdi-build` |
131
+ | `.control/questions/` | `wdi-question` |
132
+ | `.control/project-non-technical-log.md` · `.control/meetings/` | `wdi-log` |
133
+
134
+ A target with **no row here** MUST be reported as a gap in the method, not given a plausible owner.
135
+
136
+ Apply in layer order — **`.what/` before `.how/`** — so the lower layer is written against the promise it is
137
+ supposed to serve, not against the one it is about to replace. The retired `layer:` field used to declare that
138
+ order in advance; it is now simply the order.
139
+
140
+ ### Step 2 — Dispatch, one owner at a time
141
+
142
+ Hand each owner the `DEC-` id and the exact change its layer has to carry. You MUST NOT restate the decision in
143
+ your own words; **quote it.** A paraphrase drifts, and the drift is invisible because both texts read reasonably.
144
+
145
+ Each owner keeps its own rules — its review, its memlog, its registry entry. You MUST NOT ask an owner to skip
146
+ any of them because the change is small.
147
+
148
+ ### Step 3 — Name the gates
149
+
150
+ Run the change-control matrix in `delivery-flow-guide.md` and **report** which gates it names. You MUST NOT
151
+ reopen a gate yourself, and you MUST NOT treat a green application as a gate that has already passed.
152
+
153
+ ### Step 4 — Close the trail
154
+
155
+ - Fill `touches:` with the files that were **actually** changed, in the `DEC-` and in `decisions.yaml`. Raise
156
+ `status: applied`. **From that point the file MUST NOT be edited** — not the Decision, not the Cost, not a
157
+ typo in the Why. Documents cite it now.
158
+ - `applied-dec-touches` checks that an `applied` decision names a non-empty `touches`.
159
+ - Regenerate `.control/generated/decisions.md` with `validate.py --generate`. That table is how a decision is
160
+ found now; searching the memlog for decisions is retired, and the memlog is a run log again.
161
+ - Report what changed, and what the decision implied but was **not** changed.
162
+
163
+ ## Rules
164
+
165
+ - You MUST NOT widen scope beyond the decision. A neighbouring paragraph that now looks wrong is a finding to
166
+ report, not a change to make.
167
+ - You MUST NOT introduce a new domain noun. If the decision requires one, it goes through `wdi-blueprint` first.
168
+ - If applying would contradict another `applied` decision, you MUST stop and report the conflict. Two applied
169
+ decisions that disagree is work for intent `open`, not something to resolve by preferring the newer one.
170
+ - If the decision is unapplicable as written — the document it names no longer exists, or the change was already
171
+ made differently — you MUST report that instead of improvising.
172
+ - **Apply the whole chain in one pass.** `touches:` names what the decision reaches and the ownership
173
+ table names who lands each part. Edit all of them, then report once. Checking one file, reporting,
174
+ waiting, then checking the next is where the time goes — `corpus-guide.md` § One decided change is one
175
+ edit pass owns the rule.
176
+ - You MUST NOT apply into a spec that is already closed.
177
+ - `AD-N` is a different thing: a living rule with Binds · Prevents · Rule, edited in place. You MUST NOT convert
178
+ one into the other.
179
+ - A decision that emerged from a failed third fix attempt MUST say so in Why. That is the signal
180
+ `wdi-systematic-debugging` exists to raise, and burying it wastes the finding.
181
+
182
+ ## Output
183
+
184
+ Intent taken. For `open`: the decision in one sentence, its three required sections, and — for a correction —
185
+ the void assumption in one line plus what the scan found that `bmad-correct-course` could not see. For `apply`:
186
+ every target with its owner, what each owner changed, what was reported instead of changed and why, the gates the
187
+ matrix names, and whether `touches` and `applied` were filled.
@@ -18,10 +18,10 @@ about BMad itself.
18
18
 
19
19
  | Source | What it answers |
20
20
  |---|---|
21
- | `.control/generated/status` | Which wave is open, which stories sit at which status, which validators are red |
21
+ | `.control/generated/status` | Which spec is open, how many of its tickets are done, which validators are red |
22
22
  | `.control/registry/index.yaml` | The global `mode`, and the gate map |
23
23
  | `.control/registry/components.yaml` | Per-component `mode`, `risk_accepted`, and `g4_passed` |
24
- | `.control/registry/waves.yaml` | Wave → release, size, `depends_on` |
24
+ | `.control/registry/specs.yaml` | Spec → release, size, `depends_on`, and its ticket index |
25
25
  | `.constitution/method/document/delivery-flow-guide.md` | The five gates and their checklists |
26
26
  | `.constitution/method/why/README.md` | The whole shape, when the caller has never seen the method |
27
27
 
@@ -48,20 +48,21 @@ mis-route in this flow, because every other gate is the same for every component
48
48
 
49
49
  | State | Next |
50
50
  |---|---|
51
+ | `wdi-method update` just ran and its summary printed an `upgrade` line | `wdi-upgrade` — **before anything else**. Content is still in the old shape, and every skill below reads the new one |
51
52
  | No registry, or no global `mode` set | `wdi-init` intent `setup` — nothing has started |
52
53
  | No `.what/_product-brief/brief.md` | `wdi-problem` — G1 has not started |
53
54
  | A brief exists, and no PRD covers the area in play | `wdi-product` intent `prd` |
54
55
  | A PRD covers it but the promise has moved | `wdi-product` intent `update` — never a second PRD for the same area |
55
56
  | Only the **wording** of an `FR` is wrong | Nobody. Whichever skill is at work fixes it directly; putting it behind a gate is how three earlier corrections were dropped |
56
- | A PRD exists and the interface is a large part of what it promises | `wdi-ux` — optional, and it lands nothing until a `<pc>` exists |
57
+ | A PRD exists and the interface is a large part of what it promises | `wdi-ux` — optional, and it runs **before G2**, which reads its `EXPERIENCE.md`. It needs no Product Component: `design-system.md` lands at once, and the two `<pc>`-scoped halves land when `wdi-init` intent `component` runs |
57
58
  | A PRD exists, no `product_components` yet | `wdi-init` intent `component` — the slicing is born here, at the tail of G2 |
58
59
  | Components exist, `mode` or `risk_accepted` unset | `wdi-init` intents `mode` and `risk` — both are the owner's, and G4 cannot be read without them |
59
60
  | Components exist, no UC catalogue or no spine | `wdi-blueprint` — intent `catalog` first, then `platform` |
60
- | The blueprint is complete and G3 has not been held | The gate. Read `.control/generated/blueprint.md`, not seven files |
61
+ | The blueprint is complete and G3 has not been held | The gate. Read `.how-rendered/blueprint.md`, not seven files |
61
62
  | G3 passed, a component at `outline`/`guarded`/`deep` has no depth | `wdi-component` |
62
63
  | G3 passed, the component is at `mode: catalog` | `wdi-build` — G4 is skipped by design |
63
- | Depth done and G4 passed for every component the work touches | `wdi-build` — it opens the wave, runs `bmad-spec`, ships each story, closes the wave |
64
- | A small fix touching no `FR`, `UC`, `AD-N`, or domain model | Fast Path: `bmad-build` directly. It stops and becomes a wave `S` the moment an `FR` is touched |
64
+ | Depth done and G4 passed for every component the work touches | `wdi-build` — it opens the spec, has the owner run `to-spec` and `to-tickets`, ships each ticket, closes the spec |
65
+ | A small fix touching no `FR`, `UC`, `AD-N`, or domain model | Fast Path: the owner runs `/implement` directly. It stops and becomes a spec `S` the moment an `FR` is touched |
65
66
  | A planning assumption turned out void | `wdi-decision` intent `open` — it proposes, and changes nothing |
66
67
  | An accepted `DEC-` has not reached its documents | `wdi-decision` intent `apply` |
67
68
  | A bug, a failing test, unexpected behaviour | `wdi-systematic-debugging`, before any fix is proposed |
@@ -92,7 +93,7 @@ it claims, or when one of its eight required sections is missing outright.
92
93
  - When the caller has never seen this method, point at `.constitution/method/why/README.md` rather than
93
94
  paraphrasing it here.
94
95
 
95
- ## When there is no wave open
96
+ ## When there is no spec open
96
97
 
97
98
  Say so plainly, then route by the table above. An artifact a later gate produces MUST NOT be reported as
98
99
  missing — that is not a gap, it is the plan.
@@ -15,7 +15,7 @@ of where things are, a reader that can see this product's code.
15
15
  | `component` | Propose the slicing from the brief plus every PRD · birth what is accepted: registry row plus `SRS`/`SDD` skeletons · propose `mode`, `risk_accepted`, `risk_note`, `owns` | **G2 passed** | each time a component is born |
16
16
  | `mode` | Change `mode` — global in `index.yaml`, or one component in `components.yaml`. Guided | — | any time |
17
17
  | `risk` | Set or review one component's `risk_accepted`, with disclosure of what it touches | the component exists | any time, usually before G4 |
18
- | `structure` | Re-derive `.control/structure-codebase.md` and `structure-document.md` from the tree on disk | — | when folders change, and at wave close |
18
+ | `structure` | Re-derive `.control/structure-codebase.md` and `structure-document.md` from the tree on disk | — | when folders change, and at spec close |
19
19
  | `readers` | Write `.constitution/project/inventory-readers.py` for **this** repo's stack, then prove it by running the engine | code exists | once, and again when the code's shape moves |
20
20
 
21
21
  ## Two boundaries
@@ -67,8 +67,9 @@ to its component, however platform-shaped the table looks.
67
67
  ## Intents `mode` and `risk` — disclose, then propose
68
68
 
69
69
  `mode` controls **document depth** and nothing else. `risk_accepted` controls **review intensity** and
70
- nothing else. Their definitions live in `delivery-flow-guide.md`. What this skill owns is the
71
- conversation around changing them.
70
+ nothing else. Their definitions live in `delivery-flow-guide.md`, and what the two chosen together cost is
71
+ laid out cell by cell in `.constitution/method/why/mode-risk-map.md` — show it when the owner asks what a
72
+ combination buys. What this skill owns is the conversation around changing them.
72
73
 
73
74
  **You do not judge. You disclose, then propose.** Read the `FR` that fall to the component, then name
74
75
  what it touches:
@@ -81,15 +82,28 @@ what it touches:
81
82
 
82
83
  Only after that do you propose `mode` and `risk_accepted`.
83
84
 
85
+ **Land whatever UX is waiting, in this same act.** A UX run at G2 leaves `EXPERIENCE.md` and `DESIGN.md`
86
+ in `_bmad-output/ux/` because their paths contain `<pc>` and there was no `<pc>` yet. Birthing the
87
+ components is the moment that ends. Landing goes through `wdi-ux` — it owns those two paths and no other
88
+ skill MAY write them — but it is dispatched from here rather than left for the owner to remember. It is
89
+ the only deferral left in the flow, and this is where it closes.
90
+
91
+ **Containers MAY be registered here when they are genuinely already known** — an app, an API, a database
92
+ the product plainly has. Then a screen `LC` gets its container the moment it is born and there is no debt
93
+ at all. They MUST NOT be guessed to achieve that: `wdi-blueprint` intent `platform` owns the real answer
94
+ at G3, and a container invented here is data C4 then has to unpick. Where you are unsure, leave them and
95
+ let G3 fill both the containers and the empty `LC` rows in one act.
96
+
84
97
  Raising or lowering `mode` is **free and needs no justification** — it is a preference, and a preference
85
98
  does not have to be defended. Setting `mode: catalog` on a sensitive component requires nothing, as long
86
99
  as its review stays hard; that combination is the one the split exists to make sayable.
87
100
 
88
101
  Two things are not free:
89
102
 
90
- - **`risk_accepted: high` on a component that touches any of the five** requires a `DEC-` of
91
- `type: risk-acceptance`, and `risk_accepted_by:` pointing at it. V23 checks this. On a component that
92
- touches none of them, `high` is free.
103
+ - **`risk_accepted: high` on a component that touches any of the five** requires a named acceptance in
104
+ `risk_accepted_by` **a person and a date is enough**, written here in `components.yaml` beside the
105
+ risk itself rather than as a separate file. A `DEC-` id is still accepted and still has to resolve.
106
+ `high-risk-named` checks this. On a component that touches none of them, `high` is free.
93
107
  - **An outside party who will demand the artifacts as a deliverable** — a regulator, an auditor, a
94
108
  client through a contract — puts the touched component at `mode: deep` and `risk_accepted: low`,
95
109
  whatever the global setting says. That floor MUST NOT be traded against a preference: the risk there
@@ -27,7 +27,7 @@ hand-patched brief makes the memlog lie about how it got that way.
27
27
 
28
28
  - If `brief.md` exists, the intent is **update** or **validate**, never **create**. A second create would
29
29
  overwrite the singleton.
30
- - If a wave is open and the ask is a scope change rather than a problem change, this is the wrong skill.
30
+ - If a spec is open and the ask is a scope change rather than a problem change, this is the wrong skill.
31
31
  Route to `wdi-decision`, which wraps `bmad-correct-course`.
32
32
  - If the ask is about one initiative rather than the product, route to `wdi-product`.
33
33
 
@@ -50,7 +50,23 @@ create a second copy that drifts.
50
50
  Name the raw-material files explicitly in the handoff. The skill globs its own output locations, and this
51
51
  project redirects them.
52
52
 
53
- ## Step 4 — Verify
53
+ ## Step 4 — Land the Goals
54
+
55
+ The template's `Goals` section is a pointer: `Goals — see goals.yaml → goals:`. The engine drafts
56
+ `BG-N` statements in conversation, but nothing in `bmad-product-brief` writes them anywhere durable —
57
+ the returned `brief.md` has no place left to hold them.
58
+
59
+ Write each goal discussed as a row in `.control/registry/goals.yaml` → `goals:`, with the next
60
+ `id` in sequence and its `statement`. Add a `why:` field only when the goal's justification is not
61
+ already carried by `The Problem` or `Why` — most goals need no `why:` at all. This step is what
62
+ finishes the brief; a pointer to an empty list is not a finished G1 artifact, and you MUST NOT report
63
+ it as one.
64
+
65
+ This is landing, not editing `brief.md` — the rule in the header is about the prose document, not the
66
+ registry. Registry conversion is part of producing the artifact, the same way it is for a screen
67
+ becoming an `LC` row.
68
+
69
+ ## Step 5 — Verify
54
70
 
55
71
  Check the returned brief against the guide. Report every failure; fix none of them by hand.
56
72
 
@@ -59,14 +75,16 @@ Check the returned brief against the guide. Report every failure; fix none of th
59
75
  | 1 | Home | Anything landed outside `.what/_product-brief/` |
60
76
  | 2 | Eight required sections present | The template's "drop what does not earn its place" was applied to one of them |
61
77
  | 3 | Exactly one `primary` in Who This Serves | Zero, or more than one |
62
- | 4 | Goals numbered `BG-N` | Numbered `G1`–`G4`, which collides with the gates |
63
- | 5 | Scope Out written as items | Left implicit |
64
- | 6 | Memlog at `.control/memlog/brief.md` | A `.memlog.md` appeared inside `.what/` — `--workspace` was used |
65
- | 7 | No raw material folded in | Research or brainstorming prose copied into the brief instead of cited |
66
- | 8 | No Product Component list | A slicing was written at G1; it belongs to `wdi-init` intent `component`, after G2 |
67
- | 9 | `bmad-review` structure + prose ran | `doc_standards` did not fire |
68
-
69
- Check 6 MUST be fixed immediately rather than reported. A `.memlog.md` inside `.what/` is corpus pollution,
78
+ | 4 | Goals numbered `BG-N`, landed in the registry, and the brief's own section stays a pointer | A goal's statement was written into the brief instead of, or as well as, the registry row from Step 4 |
79
+ | 5 | Success Criteria names exactly one measurable figure, with a timeframe | A mission statement, a mix of signals, or a claim nobody could check without opening the code |
80
+ | 6 | Scope Out written as items | Left implicit |
81
+ | 7 | No Assumptions or Prerequisites section | Either appeared in the brief instead of being routed through `wdi-question` |
82
+ | 8 | Memlog at `.control/memlog/brief.md` | A `.memlog.md` appeared inside `.what/` `--workspace` was used |
83
+ | 9 | No raw material folded in | Research or brainstorming prose copied into the brief instead of cited |
84
+ | 10 | No Product Component list | A slicing was written at G1; it belongs to `wdi-init` intent `component`, after G2 |
85
+ | 11 | `bmad-review` structure + prose ran | `doc_standards` did not fire |
86
+
87
+ Check 8 MUST be fixed immediately rather than reported. A `.memlog.md` inside `.what/` is corpus pollution,
70
88
  and every later run compounds it.
71
89
 
72
90
  ## Rules
@@ -76,7 +94,7 @@ and every later run compounds it.
76
94
  stays put.
77
95
  - You MUST NOT delete an exploration run folder after feeding it in. The `update` intents re-read the
78
96
  original inputs.
79
- - You MUST NOT open G1 on a brief that has not been through check 9. Gate time is for deciding.
97
+ - You MUST NOT open G1 on a brief that has not been through check 11. Gate time is for deciding.
80
98
  - A brief concluding the idea is not worth building is a **pass**. You MUST report it as one rather than
81
99
  offering to rework it.
82
100
  - Every unresolved `[ASSUMPTION]` MUST be filed through `wdi-question` before the gate opens — into
@@ -86,5 +104,5 @@ and every later run compounds it.
86
104
 
87
105
  ## Output
88
106
 
89
- A short report: intent dispatched, what the brief now claims in one line, and the result of all nine checks
90
- — naming the failures, not summarising them away.
107
+ A short report: intent dispatched, what the brief now claims in one line, the goal rows landed in Step 4,
108
+ and the result of all eleven checks — naming the failures, not summarising them away.