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,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, or task rows ready to paste into a tracker. Three intents, progress and estimate and dispatch. Never invents a number.
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
- Three intents, and the first is deliberately fenced off from the other two **because their rules are opposite**.
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 this split exists to prevent: a forward-looking figure presented in the
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` · `blueprint` · `estimate` |
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
- | `story with no git history` | Name those stories. They count toward promise progress but cannot appear under Proven |
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 story file's history and takes the first commit whose
58
- frontmatter status left `draft` as the start, and the commit where it became `done` as the end. `FR` spans its
59
- stories; `CAP` spans its `FR`, and closes only when every story under it is closed.
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 V14.
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 | stories `done` ÷ stories in wave | How much was worked on |
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 story can be `done` while its RTM row is still red because the test has no name or the `UC`
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 component = per Epic · **`mode` per component, so document load is counted too** · `risk_accepted` marks exposure | medium |
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 | Stories and test names → measured load | best |
128
+ | **+ G4** — component depth | Tickets and test names → measured load | best |
127
129
 
128
130
  ## Step 2 — Inputs
129
131
 
130
- `requirements.yaml` (`estimate_mandays`, `priority`, `depends_on`, `target_release`) · `components.yaml` (`mode`,
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 wave and because an `FR` has had a proof of done since birth.
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
- | Epic | The Product Component |
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 wave in `waves.yaml` is a **real** one. The first missing
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 wave, and three neighbouring rows MAY be merged into
159
- one. **That merge is a human decision made when the wave opens**, and this intent MUST NOT pretend to already know
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 `waves.yaml`. **It recomputes nothing.**
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: Epic (the Product Component), Task (the wave, or
174
- the candidate row where no wave exists yet), Sub-task (the story, where one exists), labels for `FR` and `CAP`, and
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 stories. The planning layer speaks in `CAP`, `FR`, and defects; stories are the
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 V13 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 `bmad-code-review` and the two-family Review Panel.
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 wave in `waves.yaml` |
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` owns the mapping and it MUST NOT be restated as a second copy here; what
29
- this skill owns is reading it and refusing to run a lighter set than it names.
30
-
31
- | `risk_accepted` | Lenses | And on the code |
32
- |---|---|---|
33
- | `low` | structure · prose · **edge-case-hunter** | a two-reviewer panel is required |
34
- | `medium` | structure · prose · **edge-case-hunter** | |
35
- | `high` | structure · prose | — |
36
-
37
- `SPEC.md` always carries `edge-case-hunter`: it is the contract a builder works from, and a branch missed
38
- there surfaces as a bug at G5 instead.
39
-
40
- **V13 stamps only components at `risk_accepted` `low` or `medium`.** At `high` the owner has already said
41
- they accept the risk, and demanding the trace there is bookkeeping with no buyer.
42
-
43
- SPEC keeps its trace in the registry because `bmad-spec` is its sole author and overwrites hand
44
- edits. A trace written into `SPEC.md` disappears on the next run.
45
-
46
- **Anything in the corpus MAY be reviewed here, at any time** a `DEC-`, minutes, an `OQ-`, a guide, a
47
- brief, a PRD, a `DESIGN.md`. What is restricted is the **stamp**, not the reading: only the four rows
48
- above have a trace V13 reads, and only they MAY be stamped.
49
-
50
- The five artifacts carrying `doc_standards` review themselves at finalize, so a review here is never
51
- required for them. Asking for one anyway is legitimate after hand edits, before a gate, when a
52
- finding is suspected and it MUST NOT leave a `reviewed:` block behind. A second trace on an
53
- artifact whose first review is automatic implies that first one was optional.
54
-
55
- ## Step 1 Read the lens set off the component
56
-
57
- Find the artifact's component, read its `risk_accepted` from `components.yaml`, and state the lens set in
58
- one line before dispatching. Do not ask the user which lenses to run — the field decides, and it is the
59
- owner's field.
60
-
61
- For an artifact with no component a guide, minutes, the spine use structure · prose.
62
-
63
- The adversarial lens is in no table. It MAY be added when the artifact touches money, personal data, or a
64
- third-party integration. It demands at least ten concrete findings and treats an empty result as a signal
65
- to re-check, so adding it to a routine review buys noise.
66
-
67
- ## Step 2 — Dispatch
68
-
69
- Invoke `bmad-review` with the artifact path and the chosen lenses. Slots are part of the artifact:
70
- reviewing `SRS-<pc>.md` without `04-usecases/` and `05-scenarios/` reviews the kernel and misses
71
- where the branches live.
72
-
73
- ## Step 3 — Resolve before stamping
74
-
75
- Findings MUST be resolved or explicitly deferred before the trace is written. A deferred finding
76
- MUST be filed through `wdi-question`, or opened as a `DEC-` through `wdi-decision` never a note in the
77
- chat that dies with the session.
78
-
79
- You MUST NOT stamp an artifact whose findings are still open. A trace on unresolved findings is
80
- worse than no trace: V13 goes green and the gate opens on a review nobody acted on.
81
-
82
- ## Step 4 Stamp
83
-
84
- Write the trace, and nothing else:
85
-
86
- ```yaml
87
- reviewed:
88
- date: '<YYYY-MM-DD>'
89
- sha: '<commit sha at review time>'
90
- lenses: [structure, prose, edge-case-hunter]
91
- ```
92
-
93
- - `sha` MUST be the commit the artifact was reviewed at. Without it staleness cannot be measured, only
94
- felt the same reason a structure map requires one. V13 no longer reads the stamping commit itself as
95
- a change, so a fresh stamp does not make its own review look stale.
96
- - You MUST NOT write the trace unless `bmad-review` actually ran in this session. Filling it as a
97
- formality turns V13 into a rubber stamp, which is worse than having no validator.
98
- - You MUST NOT touch `status:` while stamping. `status: reviewed` states a **stage**; the `reviewed:`
99
- block states an **event**. Raising the status is a separate act.
100
- - You MUST NOT edit the artifact's content. Fixing a finding is the author's act, not the
101
- reviewer's say what is wrong and stop.
102
-
103
- ## Rules
104
-
105
- - You MUST NOT stamp anything outside the four rows in the table. Brief, PRD, `DESIGN.md`,
106
- `EXPERIENCE.md`, and research MAY be reviewed on request; the finding report is the whole output,
107
- and no `reviewed:` block is written.
108
- - You MUST NOT stamp on behalf of a review someone else ran earlier. Re-run it; the run is cheap and
109
- the claim is not.
110
- - When the artifact changed after the review, the trace is stale by definition. You MUST re-run
111
- rather than bump the date.
112
- - When findings reveal the requirement itself is wrong rather than the writing, this stops being a
113
- review. Route to `wdi-decision`, and let the `DEC-` change the artifact.
114
-
115
- ## Output
116
-
117
- One short report: artifact, lenses run, findings by severity, what was resolved, what was deferred
118
- and where it landed, and whether the trace was written — with the reason when it was not.
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
- BMad has no debugging workflow — `bmad-build` assumes you already know what to build. This skill
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`, `bmad-build`, and the ship-story orchestration carry this rule in their
25
- worker context. What actually fires it is a pair of conditions — *something is broken* **and** *the
26
- cause is unknown* — so it MAY be invoked in any stage, by anyone, to investigate: a red
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 V20 fails it |
113
- | `fix` | `fastpath` for a pure code defect, the wave id otherwise. The table above already decides this — `requirement` and `architecture` MUST NOT be `fastpath` |
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. V20 fails a `fixed` row without one |
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