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,26 +1,28 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wdi-report
|
|
3
|
-
description: Use when someone needs numbers about this project — progress for a client update, an estimate before the work is committed,
|
|
3
|
+
description: Use when someone needs numbers about this project — progress for a client update, an estimate before the work is committed, task rows ready to paste into a tracker, or a self-contained brief/PRD deliverable. Four intents, progress and estimate and dispatch and render. Never invents a number.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# WDI Report
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
Four intents. The first three are fenced off from each other **because their rules are opposite**; `render`
|
|
9
|
+
answers a different question from all three — not a number, a document.
|
|
9
10
|
|
|
10
11
|
| Intent | Answers | Rule |
|
|
11
12
|
|---|---|---|
|
|
12
13
|
| `progress` | What has moved, what is late, how much is proven | **Entirely derived.** MUST NOT write one number, date, or percentage that did not come from the registry or from git |
|
|
13
14
|
| `estimate` | How big this is, what the tasks are, how much load, what the timeline looks like | **Forward-facing.** MUST state which inputs exist and how precise that makes it, and MUST be labelled an estimate |
|
|
14
15
|
| `dispatch` | Task rows ready for an outside tracker | Reads the same table as `estimate`; recomputes nothing |
|
|
16
|
+
| `render` | The page a human reads at each gate — brief, PRD, blueprint, SDD — and a complete SRS per component | **A projection.** Assembles the working document verbatim plus what the registry and `.control/questions/` complete; adds no fact and no sentence of its own |
|
|
15
17
|
|
|
16
|
-
Confusing the first two is the failure
|
|
18
|
+
Confusing the first two is the failure that split exists to prevent: a forward-looking figure presented in the
|
|
17
19
|
voice of a derived one is the most expensive kind of wrong.
|
|
18
20
|
|
|
19
21
|
## What owns what
|
|
20
22
|
|
|
21
23
|
| Owner | Produces |
|
|
22
24
|
|---|---|
|
|
23
|
-
| `.constitution/method/scripts/validate.py` | `generated/rtm` · `dag` · `status` · `risks` · `components` · `decisions` · `
|
|
25
|
+
| `.constitution/method/scripts/validate.py` | `generated/rtm` · `dag` · `status` · `risks` · `components` · `decisions` · `estimate` — and every page under `.what-rendered/` and `.how-rendered/` |
|
|
24
26
|
| `.constitution/method/scripts/timeline.py` | `generated/timeline` · `generated/report` · `.control/reports/<period>.md` |
|
|
25
27
|
| `.constitution/method/scripts/inventory.py` | The three inventories, derived from code |
|
|
26
28
|
| `wdi-reconcile` | Drift between corpus and registry — read-only, no file |
|
|
@@ -47,16 +49,16 @@ it prints before reading anything else:
|
|
|
47
49
|
| `rtm/status not yet generated` (exit 3) | Stop. The tables cannot be built, so there is nothing honest to report |
|
|
48
50
|
| `git did not respond` (exit 3) | Stop. Every actual date comes from git; without it there is no time dimension |
|
|
49
51
|
| `the registry has uncommitted changes` | Say so in the report header. The numbers describe a working tree, not `main` |
|
|
50
|
-
| `
|
|
52
|
+
| `tickets with no git history` | Name those tickets. They count toward promise progress but cannot appear under Proven |
|
|
51
53
|
| `n findings` | Report the count and, if any are red, say which gate they block |
|
|
52
54
|
|
|
53
55
|
A report built on stale tables is worse than no report: it looks authoritative and is not.
|
|
54
56
|
|
|
55
57
|
## Step 2 — Read the derived time dimension
|
|
56
58
|
|
|
57
|
-
You MUST NOT derive dates yourself. `timeline.py` reads each
|
|
58
|
-
|
|
59
|
-
|
|
59
|
+
You MUST NOT derive dates yourself. `timeline.py` reads each ticket file's history and takes the first commit whose
|
|
60
|
+
status left the not-started set as the start, and the commit where it became `done` as the end. `FR` spans its
|
|
61
|
+
tickets; `CAP` spans its `FR`, and closes only when every ticket under it is closed.
|
|
60
62
|
|
|
61
63
|
None of this is written back into any registry. A stored copy would be a second home for one fact, and the stored
|
|
62
64
|
copy is the one that goes wrong.
|
|
@@ -64,7 +66,7 @@ copy is the one that goes wrong.
|
|
|
64
66
|
## Step 3 — Read `generated/timeline` and `generated/report`
|
|
65
67
|
|
|
66
68
|
`timeline` gives one row per `CAP`, plan beside actual, plus a gantt. `state` is `not-started`, `in-progress`,
|
|
67
|
-
`done`, or **`overdue`** — the last being
|
|
69
|
+
`done`, or **`overdue`** — the last being `plan-dates`.
|
|
68
70
|
|
|
69
71
|
You MUST list every overdue row **by name**, with what it is waiting on. The script prints them individually for
|
|
70
72
|
the same reason: aggregating them into a count is how a slipping plan stays comfortable.
|
|
@@ -98,11 +100,11 @@ overwrite one (exit 4) rather than trusting anyone to remember.
|
|
|
98
100
|
| Measure | Formula | Answers |
|
|
99
101
|
|---|---|---|
|
|
100
102
|
| **Progres janji** | green RTM rows ÷ total RTM rows | How much is **proven** |
|
|
101
|
-
| Progres kerja |
|
|
103
|
+
| Progres kerja | tickets `done` ÷ tickets in spec | How much was worked on |
|
|
102
104
|
| Kesiapan gate | green validators ÷ applicable validators | Whether the next gate can open |
|
|
103
105
|
|
|
104
106
|
You MUST present **progres janji** first and label it as the one that counts. Progres kerja MUST NOT lead a
|
|
105
|
-
client-facing report: a
|
|
107
|
+
client-facing report: a ticket can be `done` while its RTM row is still red because the test has no name or the `UC`
|
|
106
108
|
does not exist — and that gap is exactly what the client is entitled to know.
|
|
107
109
|
|
|
108
110
|
---
|
|
@@ -121,13 +123,13 @@ one thing this intent can get badly wrong.
|
|
|
121
123
|
|---|---|---|
|
|
122
124
|
| **G1** — the brief | T-shirt size · rough capability count · the first risk list | very rough |
|
|
123
125
|
| **+ G2** — the PRD | **The candidate task list = the `FR` list** · `estimate_mandays` per `CAP` · `must/should/could/wont` · order from `depends_on` between `CAP` | rough |
|
|
124
|
-
| **+ tail of G2** — components born | Tasks grouped per
|
|
126
|
+
| **+ tail of G2** — components born | Tasks grouped per Product Component · **`mode` per component, so document load is counted too** · `risk_accepted` marks exposure | medium |
|
|
125
127
|
| **+ G3** — the blueprint | Table, endpoint, and screen counts → real implementation load, not load guessed from an `FR` count | good |
|
|
126
|
-
| **+ G4** — component depth |
|
|
128
|
+
| **+ G4** — component depth | Tickets and test names → measured load | best |
|
|
127
129
|
|
|
128
130
|
## Step 2 — Inputs
|
|
129
131
|
|
|
130
|
-
`
|
|
132
|
+
`goals.yaml` (the `BG` list) · every `requirements-<slug>.yaml` (`CAP` with `estimate_mandays`, `priority`, `depends_on`, `target_release`, plus its `FR`) · `components.yaml` (`mode`,
|
|
131
133
|
`risk_accepted`, `risk_note`) · the three `inventory-*.md` when they exist.
|
|
132
134
|
|
|
133
135
|
`estimate_mandays` on `CAP` is the **source**, and it is used for real here rather than being decoration. When it is
|
|
@@ -136,13 +138,13 @@ absent, say so — an estimate with no mandays input is a T-shirt size, and it M
|
|
|
136
138
|
## Step 3 — The output: one task table
|
|
137
139
|
|
|
138
140
|
Written to `.control/generated/estimate.md` by `validate.py --generate`. **Default one row per `FR`**, because that
|
|
139
|
-
is the ideal shape of a
|
|
141
|
+
is the ideal shape of a spec and because an `FR` has had a proof of done since birth.
|
|
140
142
|
|
|
141
143
|
| Column | Content |
|
|
142
144
|
|---|---|
|
|
143
145
|
| Task | The title, from the `FR` |
|
|
144
146
|
| `FR` | Its id |
|
|
145
|
-
|
|
|
147
|
+
| Component | The Product Component |
|
|
146
148
|
| `mode` | That component's depth — this is what makes document load visible |
|
|
147
149
|
| Exposure | `risk_accepted` + `risk_note` |
|
|
148
150
|
| Effort | Mandays, derived from the parent `CAP`'s `estimate_mandays`, divided among its `FR` |
|
|
@@ -152,11 +154,11 @@ is the ideal shape of a wave and because an `FR` has had a proof of done since b
|
|
|
152
154
|
|
|
153
155
|
## Step 4 — Say what it is, and what it is not
|
|
154
156
|
|
|
155
|
-
> A row in the estimate table is a **candidate** task. A
|
|
157
|
+
> A row in the estimate table is a **candidate** task. A spec in `specs.yaml` is a **real** one. The first missing
|
|
156
158
|
> is normal; the second is not.
|
|
157
159
|
|
|
158
|
-
The table is planning, not commitment. One row MAY become one
|
|
159
|
-
one. **That merge is a human decision made when the
|
|
160
|
+
The table is planning, not commitment. One row MAY become one spec, and three neighbouring rows MAY be merged into
|
|
161
|
+
one. **That merge is a human decision made when the spec opens**, and this intent MUST NOT pretend to already know
|
|
160
162
|
the answer.
|
|
161
163
|
|
|
162
164
|
- Every output MUST carry the word estimate, visibly, at the top.
|
|
@@ -168,11 +170,12 @@ the answer.
|
|
|
168
170
|
|
|
169
171
|
# Intent `dispatch`
|
|
170
172
|
|
|
171
|
-
Reads `.control/generated/estimate.md` and `
|
|
173
|
+
Reads `.control/generated/estimate.md` and `specs.yaml`. **It recomputes nothing.**
|
|
172
174
|
|
|
173
|
-
It emits rows in a form that can be pasted into an outside tracker:
|
|
174
|
-
|
|
175
|
-
Fix Version from the release.
|
|
175
|
+
It emits rows in a form that can be pasted into an outside tracker: a **parent issue** for the spec — or the
|
|
176
|
+
candidate row where no spec exists yet — an **issue** per ticket where tickets exist, with its blocking edges,
|
|
177
|
+
labels for `FR` and `CAP`, and Fix Version from the release. A ticket is an issue and not a sub-task, because a
|
|
178
|
+
sub-task cannot carry the blocking relation the frontier is read from; `delivery-flow-guide.md` owns that mapping.
|
|
176
179
|
|
|
177
180
|
- Output goes **to the screen**. This intent MUST NOT write a file, and MUST NOT write to the tracker — entering it
|
|
178
181
|
is a human act.
|
|
@@ -182,12 +185,59 @@ Fix Version from the release.
|
|
|
182
185
|
|
|
183
186
|
---
|
|
184
187
|
|
|
188
|
+
# Intent `render`
|
|
189
|
+
|
|
190
|
+
Produces a self-contained reader's copy of the brief or a PRD — the shape that used to be written by hand,
|
|
191
|
+
now assembled instead of duplicated. `brief-guide.md` § The generated deliverable and `prd-guide.md` § The
|
|
192
|
+
generated deliverable own what each page assembles; this intent is the one place either is actually run.
|
|
193
|
+
|
|
194
|
+
Both working templates point here by name, so this is what an owner will type:
|
|
195
|
+
|
|
196
|
+
| They ask for | They run |
|
|
197
|
+
|---|---|
|
|
198
|
+
| The full, readable brief | `/wdi-report render brief` |
|
|
199
|
+
| The full, readable PRD | `/wdi-report render prd` |
|
|
200
|
+
|
|
201
|
+
Either form runs the same single command in Step 1 — the argument says which page they came for, and
|
|
202
|
+
which path to lead the report with. It does NOT narrow what gets regenerated, and you MUST NOT pretend
|
|
203
|
+
it did.
|
|
204
|
+
|
|
205
|
+
## Step 1 — Generate
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
uv run .constitution/method/scripts/validate.py --generate
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
This regenerates the machine tables in `.control/generated/` AND every human page in `.what-rendered/` and
|
|
212
|
+
`.how-rendered/` — the brief, every PRD, the blueprint, every SRS, and the SDD of every component above
|
|
213
|
+
`catalog`. One run, not a per-document command, because the pages cite each other's ids.
|
|
214
|
+
|
|
215
|
+
## Step 2 — Report what changed
|
|
216
|
+
|
|
217
|
+
`generate()` writes `brief.md` unconditionally and one `prd-<slug>.md` per folder found under
|
|
218
|
+
`.what/_prd/`. Name the paths written. If a working document does not exist yet, its page says so instead
|
|
219
|
+
of a crash — report that as "not started" rather than a failure.
|
|
220
|
+
|
|
221
|
+
## Step 3 — Say what the page is, and is not
|
|
222
|
+
|
|
223
|
+
> This is a **projection**, assembled from `brief.md` / `prd.md`, the requirement registry,
|
|
224
|
+
> `.control/product-glossary.md`, and `.control/questions/`. It carries no fact the working documents and
|
|
225
|
+
> the registry do not already hold, and it MUST NOT be edited by hand — the next `render` overwrites it.
|
|
226
|
+
|
|
227
|
+
- You MUST NOT hand-patch a generated page to "fix" something that reads wrong. The defect is in the
|
|
228
|
+
working document or the registry, and that is where it MUST be fixed.
|
|
229
|
+
- A reader asking for "the full brief" or "the complete PRD" wants this page, not `.what/_product-brief/brief.md`
|
|
230
|
+
or `.what/_prd/<slug>/prd.md` read directly — those are now pointer-heavy working documents, not the
|
|
231
|
+
deliverable.
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
185
235
|
## Rules
|
|
186
236
|
|
|
187
237
|
- You MUST NOT invent progress. When a table is missing or stale, name it and stop.
|
|
188
|
-
- You MUST NOT report `progress` in
|
|
238
|
+
- You MUST NOT report `progress` in tickets. The planning layer speaks in `CAP`, `FR`, and defects; tickets are the
|
|
189
239
|
execution layer and are born too late to plan against.
|
|
190
|
-
- You MUST NOT hand-write anything under `generated/`. There is no exception.
|
|
240
|
+
- You MUST NOT hand-write anything under `generated/`, `.what-rendered/`, or `.how-rendered/`. There is no exception.
|
|
191
241
|
- You MUST NOT re-run `--publish` to "fix" a report. The refusal is the rule working.
|
|
192
242
|
- When plan dates have moved since the last report, you MUST say so and point at the commit.
|
|
193
243
|
- When there is no previous report, say the period is unbounded on the left rather than picking a date.
|
|
@@ -203,3 +253,5 @@ individually, never counted away.
|
|
|
203
253
|
a commitment.
|
|
204
254
|
|
|
205
255
|
**`dispatch`:** the paste-ready rows, on screen, with candidates marked.
|
|
256
|
+
|
|
257
|
+
**`render`:** the paths written, which working documents were missing, and the projection notice above.
|
|
@@ -1,118 +1,201 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: wdi-review
|
|
3
|
-
description: Use to review any corpus document at any time, and always before a gate on the four artifacts no doc_standards covers — the architecture spine, SRS, SDD, and SPEC. Reads the lens set from the component's risk_accepted, dispatches bmad-review, and stamps the
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# WDI Review
|
|
7
|
-
|
|
8
|
-
Five BMad skills review their own output through `doc_standards`. Four artifacts have no such trigger,
|
|
9
|
-
and they are the most binding ones in the corpus. This skill covers exactly those four.
|
|
10
|
-
|
|
11
|
-
It exists for two reasons `bmad-review` cannot serve on its own: the lens set is not a property of the
|
|
12
|
-
artifact but of the component's `risk_accepted`, and defaulting to structure + prose silently drops the
|
|
13
|
-
one lens that matters for behaviour; and `bmad-review` is class D — it writes nothing, so nothing proves
|
|
14
|
-
it ran.
|
|
15
|
-
|
|
16
|
-
You MUST NOT use this for code or diffs. That is `
|
|
17
|
-
|
|
18
|
-
## What it covers
|
|
19
|
-
|
|
20
|
-
| Artifact | Trace lands in |
|
|
21
|
-
|---|---|
|
|
22
|
-
| `.how/_platform/ARCHITECTURE-SPINE.md` | `reviewed:` in its frontmatter |
|
|
23
|
-
| `SRS-<pc>.md` + slots `02`–`05` | `reviewed:` in the SRS frontmatter |
|
|
24
|
-
| `SDD-<pc>.md` + slots `01`–`06` | `reviewed:` in the SDD frontmatter |
|
|
25
|
-
| `SPEC.md` | `spec_reviewed:` on the
|
|
26
|
-
|
|
27
|
-
**The lens set comes from the component's `risk_accepted`, never from `mode` and never from the artifact
|
|
28
|
-
type.** `delivery-flow-guide.md`
|
|
29
|
-
this
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
they
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
1
|
+
---
|
|
2
|
+
name: wdi-review
|
|
3
|
+
description: Use to review any corpus document at any time, and always before a gate on the four artifacts no doc_standards covers — the architecture spine, SRS, SDD, and SPEC. Reads the lens set from the component's risk_accepted, dispatches bmad-review, and stamps the `review-trace` trace on those four only. Not for code review.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# WDI Review
|
|
7
|
+
|
|
8
|
+
Five BMad skills review their own output through `doc_standards`. Four artifacts have no such trigger,
|
|
9
|
+
and they are the most binding ones in the corpus. This skill covers exactly those four.
|
|
10
|
+
|
|
11
|
+
It exists for two reasons `bmad-review` cannot serve on its own: the lens set is not a property of the
|
|
12
|
+
artifact but of the component's `risk_accepted`, and defaulting to structure + prose silently drops the
|
|
13
|
+
one lens that matters for behaviour; and `bmad-review` is class D — it writes nothing, so nothing proves
|
|
14
|
+
it ran.
|
|
15
|
+
|
|
16
|
+
You MUST NOT use this for code or diffs. That is `code-review`, dispatched by `wdi-build` as Step 3 of its pipeline.
|
|
17
|
+
|
|
18
|
+
## What it covers
|
|
19
|
+
|
|
20
|
+
| Artifact | Trace lands in |
|
|
21
|
+
|---|---|
|
|
22
|
+
| `.how/_platform/ARCHITECTURE-SPINE.md` | `reviewed:` in its frontmatter |
|
|
23
|
+
| `SRS-<pc>.md` + slots `02`–`05` | `reviewed:` in the SRS frontmatter |
|
|
24
|
+
| `SDD-<pc>.md` + slots `01`–`06` | `reviewed:` in the SDD frontmatter |
|
|
25
|
+
| the contract — `SPEC.md`, or the ticket set as one artifact at size `S` | `spec_reviewed:` on the spec in `specs.yaml` |
|
|
26
|
+
|
|
27
|
+
**The lens set comes from the component's `risk_accepted`, never from `mode` and never from the artifact
|
|
28
|
+
type.** The mapping lives in `delivery-flow-guide.md` § Two fields, and it is **read from there, not copied
|
|
29
|
+
here** — this file carried a second copy of that table until it was noticed that the sentence forbidding
|
|
30
|
+
the copy sat directly above it.
|
|
31
|
+
|
|
32
|
+
What this skill owns is three things the mapping does not say:
|
|
33
|
+
|
|
34
|
+
- **Refusing a lighter set than it names.** The lens set is not negotiable down, whatever the artifact.
|
|
35
|
+
- **The contract is the exception:** it always carries `edge-case-hunter`, first run and re-run alike. It
|
|
36
|
+
is what a builder works from, and a branch missed there surfaces as a bug at G5 instead.
|
|
37
|
+
- **Reading `risk_accepted` off the component, not off the artifact** — Step 1 below.
|
|
38
|
+
|
|
39
|
+
## When a review has to run again — and when it does not
|
|
40
|
+
|
|
41
|
+
Four rules, and together they are what keeps this skill from becoming a treadmill. Every one of them has a
|
|
42
|
+
precedent elsewhere in the method; none of them lowers what a review looks for.
|
|
43
|
+
|
|
44
|
+
- **The trace has to be fresh at a gate and at spec close. Between those points a stale trace is
|
|
45
|
+
advisory.** `review-trace` reports it and does not fail; what catches a
|
|
46
|
+
gate opening on a stale review is G4's ★ question — *validators green **and** the review leaving no open
|
|
47
|
+
finding* — not a validator firing on every commit.
|
|
48
|
+
- **A wording-only change MUST NOT trigger a re-run.** The split is `prd-guide.md`'s: an `FR`'s
|
|
49
|
+
**promise** reopens gates, its **wording** costs one Revision History row. Re-stamping `date` and `sha`
|
|
50
|
+
without re-running is allowed **here and nowhere else**, and that row is what makes it checkable.
|
|
51
|
+
Behaviour, a rule, a boundary, a contract, or a use case flow is material, and material changes re-run.
|
|
52
|
+
- **A re-review covers the delta, not the artifact.** Read what changed since the reviewed `sha`, and
|
|
53
|
+
whatever it reaches. G3 already reopens over the delta when a new PRD arrives; same principle.
|
|
54
|
+
- **One apply, one review.** A `DEC-` or an answered `OQ-` applied across several artifacts is **one**
|
|
55
|
+
review of the delta across all of them, never one review per artifact. The trace lands on each artifact
|
|
56
|
+
touched, naming the same `sha`.
|
|
57
|
+
|
|
58
|
+
## Stale is not a finding. Load-bearing stale is.
|
|
59
|
+
|
|
60
|
+
**Triggers are a gate, a spec close, and an explicit ask — nothing else.** You MUST NOT offer a review
|
|
61
|
+
because a document was touched. An offer declined five times teaches the owner to decline the sixth,
|
|
62
|
+
which is the one that mattered.
|
|
63
|
+
|
|
64
|
+
Three things look like a review and are not: a document the owner has already **decided against** — an
|
|
65
|
+
edit, `delivery-flow-guide.md` owns it; a document **merely behind the code**, its expected state; and a
|
|
66
|
+
machine contract, which nobody reads.
|
|
67
|
+
|
|
68
|
+
**The test — one question, and it decides:**
|
|
69
|
+
|
|
70
|
+
> Would a reader who believes this sentence make the wrong repair?
|
|
71
|
+
|
|
72
|
+
| Load-bearing — repair NOW | Not load-bearing — leave it |
|
|
73
|
+
|---|---|
|
|
74
|
+
| A binding guide describing a stack the repo left — `npm` commands that all fail | A count, a date, a section that reads a little old |
|
|
75
|
+
| A guard that greps a language this repo no longer writes | Wording that is merely less good than it could be |
|
|
76
|
+
| A cite that resolves to nothing | A section whose file has moved but whose point still holds |
|
|
77
|
+
| A claim contradicting an `AD-N` or an `applied` `DEC-` | An artifact the next spec will rewrite anyway |
|
|
78
|
+
|
|
79
|
+
Everything in the right column is corrected **when someone next touches that section**, or it dies with
|
|
80
|
+
the document. It MUST NOT be raised as a finding, MUST NOT open an `OQ-`, and MUST NOT hold a stamp.
|
|
81
|
+
|
|
82
|
+
**A missing history line is never a finding.** Not a rationale, not a note saying why something changed,
|
|
83
|
+
not an account of a conflict already resolved. `corpus-guide.md` § The corpus is written in the present
|
|
84
|
+
tense says history is written when someone judges it worth writing, and that skipping it is not a gap —
|
|
85
|
+
a review that reports it as one turns a record into a ritual.
|
|
86
|
+
|
|
87
|
+
**Where substance actually is.** On the evidence of a real pass of twenty-one findings: a document checked
|
|
88
|
+
against **the code**, and against an **`AD-N`** or an `applied` `DEC-`. Those two found the only two that
|
|
89
|
+
changed what was true. Document-versus-document bookkeeping found thirteen and changed nothing. When the
|
|
90
|
+
budget is tight — it always is — spend it on the first two and skip the third.
|
|
91
|
+
|
|
92
|
+
## A restated derived fact is one finding, and its remedy is deletion
|
|
93
|
+
|
|
94
|
+
The cheapest class to produce is the one worth least: a document disagreeing with a registry it could
|
|
95
|
+
have read. It was **thirteen of the twenty-one** in the pass above — `mode` restated in prose, a slot
|
|
96
|
+
list denying files on disk, "no applied `DEC-` binds this component", a Gate Checklist counting four use
|
|
97
|
+
cases where the registry held six.
|
|
98
|
+
|
|
99
|
+
Handled as follows, and it is not a judgement call:
|
|
100
|
+
|
|
101
|
+
- **One finding, not one per site.** Report the class and list its locations. Thirteen rows for one
|
|
102
|
+
cause spends the budget above on a single problem and buries whatever else the pass found.
|
|
103
|
+
- **The remedy is DELETION.** You MUST NOT correct the restated value. A corrected copy is a *second*
|
|
104
|
+
stale fact on a slower clock — one real SRS carried three claims about its own `mode` on one page,
|
|
105
|
+
one of them a correction block fixing an older value, and none of the three was right.
|
|
106
|
+
- **It is a `structure` finding**, never `edge-case-hunter`. It costs no thinking to find and MUST NOT
|
|
107
|
+
consume the lens bought for reasoning about behaviour.
|
|
108
|
+
- If the document's **template** invited it, say so and route to the maintainer. `corpus-guide.md` §
|
|
109
|
+
A derived fact has exactly one home is the list; the templates were cleaned once already, and an
|
|
110
|
+
invitation still standing is a package defect, not a product one.
|
|
111
|
+
|
|
112
|
+
## Findings have a budget, and it is not a new one
|
|
113
|
+
|
|
114
|
+
A review with no upper bound produced two hundred findings from one pass. The budget is the one
|
|
115
|
+
`wdi-question` already carries, so nothing new is invented:
|
|
116
|
+
|
|
117
|
+
| Class | Where it goes | Target |
|
|
118
|
+
|---|---|---|
|
|
119
|
+
| Holds the gate | `.control/questions/blocking.md` | **≤3 per Product Component** |
|
|
120
|
+
| Does not hold anything | `.control/questions/assumptions.md`, one line each | **≤15** |
|
|
121
|
+
|
|
122
|
+
**A review that exceeds both MUST stop and say so.** What it reports is not a finding list but a verdict:
|
|
123
|
+
this artifact needs rewriting, not reviewing. Sixty findings is not thoroughness — it is a review that
|
|
124
|
+
failed to reach a conclusion, and the owner pays for it twice. You MUST NOT register a finding as
|
|
125
|
+
blocking to be safe.
|
|
126
|
+
|
|
127
|
+
**`review-trace` stamps only components at `risk_accepted` `low` or `medium`.** At `high` the owner has already
|
|
128
|
+
accepted the risk, and demanding the trace there is bookkeeping with no buyer. The contract keeps its
|
|
129
|
+
trace in the registry rather than in itself: `to-spec` and `to-tickets` overwrite hand edits.
|
|
130
|
+
|
|
131
|
+
**Anything in the corpus MAY be reviewed here when asked** — a `DEC-`, minutes, a guide, a brief, a PRD,
|
|
132
|
+
a `DESIGN.md`. What is restricted is the **stamp**, not the reading: only the four rows above carry a
|
|
133
|
+
trace `review-trace` reads. The five artifacts with `doc_standards` review themselves at finalize; a review here is
|
|
134
|
+
never required for them and MUST NOT leave a `reviewed:` block, because a second trace implies the first
|
|
135
|
+
was optional.
|
|
136
|
+
|
|
137
|
+
## Step 1 — Read the lens set off the component
|
|
138
|
+
|
|
139
|
+
Find the artifact's component, read its `risk_accepted` from `components.yaml`, and state the lens set in
|
|
140
|
+
one line before dispatching. Do not ask the user which lenses to run — the field decides, and it is the
|
|
141
|
+
owner's field.
|
|
142
|
+
|
|
143
|
+
For an artifact with no component — a guide, minutes, the spine — use structure · prose.
|
|
144
|
+
|
|
145
|
+
The adversarial lens is in no table. It MAY be added when the artifact touches money, personal data, or a
|
|
146
|
+
third-party integration. It demands at least ten concrete findings and treats an empty result as a signal
|
|
147
|
+
to re-check, so adding it to a routine review buys noise.
|
|
148
|
+
|
|
149
|
+
## Step 2 — Dispatch
|
|
150
|
+
|
|
151
|
+
Invoke `bmad-review` with the artifact path and the chosen lenses. Slots are part of the artifact:
|
|
152
|
+
reviewing `SRS-<pc>.md` without `04-usecases/` and `05-scenarios/` reviews the kernel and misses
|
|
153
|
+
where the branches live.
|
|
154
|
+
|
|
155
|
+
## Step 3 — Resolve before stamping
|
|
156
|
+
|
|
157
|
+
Findings MUST be resolved or explicitly deferred before the trace is written. A deferred finding
|
|
158
|
+
MUST be filed through `wdi-question`, or opened as a `DEC-` through `wdi-decision` — never a note in the
|
|
159
|
+
chat that dies with the session.
|
|
160
|
+
|
|
161
|
+
You MUST NOT stamp an artifact whose findings are still open. A trace on unresolved findings is
|
|
162
|
+
worse than no trace: `review-trace` goes green and the gate opens on a review nobody acted on.
|
|
163
|
+
|
|
164
|
+
## Step 4 — Stamp
|
|
165
|
+
|
|
166
|
+
Write the trace, and nothing else:
|
|
167
|
+
|
|
168
|
+
```yaml
|
|
169
|
+
reviewed:
|
|
170
|
+
date: '<YYYY-MM-DD>'
|
|
171
|
+
sha: '<commit sha at review time>'
|
|
172
|
+
lenses: [structure, prose, edge-case-hunter]
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
- `sha` MUST be the commit the artifact was reviewed at. Without it staleness cannot be measured, only
|
|
176
|
+
felt — the same reason a structure map requires one. `review-trace` no longer reads the stamping commit itself as
|
|
177
|
+
a change, so a fresh stamp does not make its own review look stale.
|
|
178
|
+
- You MUST NOT write the trace unless `bmad-review` actually ran in this session. Filling it as a
|
|
179
|
+
formality turns `review-trace` into a rubber stamp, which is worse than having no validator.
|
|
180
|
+
- You MUST NOT touch `status:` while stamping. `status: reviewed` states a **stage**; the `reviewed:`
|
|
181
|
+
block states an **event**. Raising the status is a separate act.
|
|
182
|
+
- You MUST NOT edit the artifact's content. Fixing a finding is the author's act, not the
|
|
183
|
+
reviewer's — say what is wrong and stop.
|
|
184
|
+
|
|
185
|
+
## Rules
|
|
186
|
+
|
|
187
|
+
- You MUST NOT stamp anything outside the four rows in the table. Brief, PRD, `DESIGN.md`,
|
|
188
|
+
`EXPERIENCE.md`, and research MAY be reviewed on request; the finding report is the whole output,
|
|
189
|
+
and no `reviewed:` block is written.
|
|
190
|
+
- You MUST NOT stamp on behalf of a review someone else ran earlier. Re-run it; the run is cheap and
|
|
191
|
+
the claim is not.
|
|
192
|
+
- When the artifact changed **materially** after the review, the trace is stale and you MUST re-run
|
|
193
|
+
rather than bump the date. A wording-only change is the one exception, and §*When a review has to run
|
|
194
|
+
again* owns it.
|
|
195
|
+
- When findings reveal the requirement itself is wrong rather than the writing, this stops being a
|
|
196
|
+
review. Route to `wdi-decision`, and let the `DEC-` change the artifact.
|
|
197
|
+
|
|
198
|
+
## Output
|
|
199
|
+
|
|
200
|
+
One short report: artifact, lenses run, findings by severity, what was resolved, what was deferred
|
|
201
|
+
and where it landed, and whether the trace was written — with the reason when it was not.
|
|
@@ -5,7 +5,7 @@ description: Use when encountering any bug, test failure, build failure, or unex
|
|
|
5
5
|
|
|
6
6
|
# Systematic Debugging
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
No engine below G5 has a debugging workflow — `/implement` assumes you already know what to build. This skill
|
|
9
9
|
covers the gap: something is broken and the cause is unknown.
|
|
10
10
|
|
|
11
11
|
## The Iron Law
|
|
@@ -21,9 +21,9 @@ Use for any technical issue: test failure, production bug, unexpected behavior,
|
|
|
21
21
|
build failure, integration failure.
|
|
22
22
|
|
|
23
23
|
**Its home is G5, but its trigger is not positional.** Most invocations happen while coding, and
|
|
24
|
-
that is why `AGENTS.md
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
that is why `AGENTS.md` and `wdi-build`'s builder brief both carry this rule.
|
|
25
|
+
What actually fires it is a pair of conditions — *something is broken* **and** *the cause is
|
|
26
|
+
unknown* — so it MAY be invoked in any stage, by anyone, to investigate: a red
|
|
27
27
|
`validate.py` while writing an SRS at G3, a `wdi-reconcile` report that makes no sense, a
|
|
28
28
|
generator producing an empty timeline. None of those wait for G5, and none of them are a
|
|
29
29
|
misuse of this skill.
|
|
@@ -109,8 +109,8 @@ defect; refusing to work until the paperwork is right is how the file becomes a
|
|
|
109
109
|
| Field | Where it comes from |
|
|
110
110
|
|---|---|
|
|
111
111
|
| `root_cause` | Your Phase 1–3 conclusion, in the four categories of the table above |
|
|
112
|
-
| `violates` | The `FR-` or `UC-` the defect breaks. MUST be filled for `requirement` and `architecture`: a defect that violates something without naming what cannot be traced back to the corpus, and
|
|
113
|
-
| `fix` | `fastpath` for a pure code defect, the
|
|
112
|
+
| `violates` | The `FR-` or `UC-` the defect breaks. MUST be filled for `requirement` and `architecture`: a defect that violates something without naming what cannot be traced back to the corpus, and `defect-root-cause` fails it |
|
|
113
|
+
| `fix` | `fastpath` for a pure code defect, the spec id otherwise. The table above already decides this — `requirement` and `architecture` MUST NOT be `fastpath` |
|
|
114
114
|
|
|
115
115
|
You MUST NOT write a closure date. It is derived from the history of `defects.yaml` itself by
|
|
116
116
|
`.constitution/method/scripts/timeline.py`, and a hand-written date would be a second home for one fact —
|
|
@@ -128,7 +128,7 @@ own `root_cause`:
|
|
|
128
128
|
|---|---|
|
|
129
129
|
| `code` | The failing test from Phase 4 passes and the fix is merged |
|
|
130
130
|
| `requirement` | The `FR-` or `UC-` in `violates` has actually changed — the code alone MUST NOT close it |
|
|
131
|
-
| `architecture` | The `DEC-` is `accepted` and named on the row.
|
|
131
|
+
| `architecture` | The `DEC-` is `accepted` and named on the row. `defect-root-cause` fails a `fixed` row without one |
|
|
132
132
|
| `environment` | The handling is in place and the monitoring exists |
|
|
133
133
|
|
|
134
134
|
Setting `fixed` before its row's condition is met is the failure this whole registry exists to
|