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
|
@@ -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
|
|
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
|
-
|
|
|
87
|
-
| `
|
|
88
|
-
|
|
|
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
|
|
94
|
-
the
|
|
95
|
-
|
|
96
|
-
A
|
|
97
|
-
`ready-for-
|
|
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
|
-
| `
|
|
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
|
-
-
|
|
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
|
-
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
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
|
|
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/
|
|
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
|
|
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 `.
|
|
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
|
|
64
|
-
| A small fix touching no `FR`, `UC`, `AD-N`, or domain model | Fast Path: `
|
|
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
|
|
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
|
|
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
|
|
71
|
-
|
|
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
|
|
91
|
-
`
|
|
92
|
-
|
|
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
|
|
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 —
|
|
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
|
|
63
|
-
| 5 |
|
|
64
|
-
| 6 |
|
|
65
|
-
| 7 | No
|
|
66
|
-
| 8 |
|
|
67
|
-
| 9 |
|
|
68
|
-
|
|
69
|
-
|
|
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
|
|
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,
|
|
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.
|