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
@@ -12,22 +12,55 @@ file somewhere this method cannot use.
12
12
 
13
13
  The per-skill read/write map lives in `bmad-skill-register.md` and MUST NOT be duplicated here.
14
14
 
15
- ## Stories mode only
15
+ ## Neither of BMad's two routes
16
16
 
17
- BMad offers two routes. We run one.
17
+ BMad offers a sprint route and a stories route. This method ran the stories route, and **now runs
18
+ neither.** The engine layer below G5 is `to-spec`, `to-tickets`, `implement`, `tdd`, and `code-review`;
19
+ `wdi-build` owns the transition and states which BMad engines are retired.
18
20
 
19
- | | Sprint route | **Stories route ours** |
21
+ What survived the change is the **reason** the sprint route was dropped, because it is the same reason
22
+ `ticket-status-one-home` still exists. That route keeps status in one hand-edited file: two builders running in parallel
23
+ contend for it, and status becomes something a builder declares about itself. Status is read from the
24
+ ticket instead, and it MUST NOT be copied into `specs.yaml`.
25
+
26
+ | Route | Status home | Why not |
20
27
  |---|---|---|
21
- | Planning artifact | `epics.md` | `.what/<pc>/SRS-<pc>.md` + `SPEC.md` + `stories.yaml` |
22
- | Status home | `sprint-status.yaml` | Story-file frontmatter |
23
- | Produced by | `bmad-create-epics-and-stories` · `bmad-sprint-planning` | `bmad-spec` |
28
+ | Sprint | `sprint-status.yaml` | One hand-edited file, contended, self-declared |
29
+ | Stories | story-file frontmatter | Its author, `bmad-spec`, is retired |
30
+ | **Ours** | **the ticket itself** | |
24
31
 
25
32
  `bmad-create-epics-and-stories` and `bmad-sprint-planning` are **NOT USED**. Neither MUST be invoked,
26
33
  and neither MUST be named as a gate condition.
27
34
 
28
- The sprint route was dropped because it keeps status in a hand-edited file. Two workers running in
29
- parallel then contend for one file, and status becomes something a worker declares about itself.
30
- Reading status from story-file frontmatter removes both problems V18 checks it.
35
+ ## When an engine earns being invoked at all
36
+
37
+ BMad is a **dependency of this package**: the installer checks for it, `--skip-bmad-check` exists to say so
38
+ out loud, and five artifacts here have no other author. Any *further* engine is a different question, and it
39
+ has one test:
40
+
41
+ > **Does it produce something this corpus keeps?**
42
+
43
+ Yes → it MAY be wrapped, and the wrapper rule applies: invoked through the WDI skill that owns the artifact,
44
+ which checks position, verifies against the guide, and lands the result in this method's template. A
45
+ non-BMad engine is named in **that skill**, never in `bmad-skill-register.md` — that register is BMad's
46
+ inventory, and putting somebody else's skill in it makes the register a lie.
47
+
48
+ No → **absorb the discipline and invoke nothing.** Prose we could have written is not an engine.
49
+
50
+ An engine whose output this corpus keeps is invoked even when it is a **plugin rather than part of this
51
+ package's install** — `mattpocock-skills:domain-modeling` is the case, and `wdi-blueprint` invokes it. Two
52
+ rules make that safe in a repo that does not have it:
53
+
54
+ - **A missing plugin is a state, not a defect.** Report it once, name the standard the work is still held
55
+ to, and do the work. You MUST NOT block a gate on it, and you MUST NOT report its absence as a finding.
56
+ - **The wrapper carries the standard, never the plugin.** What the engine is invoked *for* MUST be written
57
+ in the wrapping skill as behaviours to verify — so the same bar is met either way, and a run that
58
+ produced none of them is reported as a transcription rather than landed.
59
+
60
+ An engine's **own** artifacts and tests are a separate matter, and the wrapping skill MUST name every one
61
+ this corpus already has a home for. `wdi-blueprint` names four for `domain-modeling`, one of which —
62
+ `docs/adr/` — is a folder **Article 3 forbids outright**. That is why an engine's write location is pointed
63
+ somewhere safe **before** it runs rather than corrected after.
31
64
 
32
65
  ## Skill classes
33
66
 
@@ -35,7 +68,7 @@ The criterion is **lifetime**, not importance:
35
68
 
36
69
  | Class | Criterion | Output home |
37
70
  |---|---|---|
38
- | **A** | A living document, still correct after the wave | Straight into `.what/` or `.how/` |
71
+ | **A** | A living document, still correct after the spec has passed | Straight into `.what/` or `.how/` |
39
72
  | **B** | Living, but its granularity is not configurable | Neutral `_bmad-output/` → the owner in `corpus-guide.md` lands it |
40
73
  | **C** | Ends when its work does | `_bmad-output/`, committed, not curated |
41
74
  | **D** | No artifact at all | — |
@@ -88,7 +121,7 @@ BMad skills call `--workspace` by default; the class-A home is reached by instal
88
121
  instruction as a `persistent_fact`.
89
122
 
90
123
  - A class-A or class-B skill MUST use `--path`. `--workspace` MUST NOT be used — it would leave a
91
- `.memlog.md` inside `.what/` or `.how/`, which V16 rejects.
124
+ `.memlog.md` inside `.what/` or `.how/`, which `memlog-home` rejects.
92
125
  - Class-C memlogs stay beside their output in `_bmad-output/`.
93
126
  - Every memlog MUST carry `artifact:` in its frontmatter, pointing at a file that exists.
94
127
 
@@ -121,13 +154,13 @@ to whoever runs the repo and MUST NOT be copied between projects.
121
154
  `bmad-deep-recon`, and it runs two lenses: `structure` and `prose`.
122
155
 
123
156
  Everything else MUST be reviewed by invoking `wdi-review` explicitly — the spine, every SRS, every
124
- SDD, and every `SPEC.md`. Three lenses never fire on their own anywhere: `adversarial`,
157
+ SDD, and every spec's contract. Three lenses never fire on their own anywhere: `adversarial`,
125
158
  `edge-case-hunter`, and `verification-gap`.
126
159
 
127
- **Code review does not use `bmad-review`.** `bmad-code-review` reads its lenses from a bundled copy
128
- under `review-prompts/`, and each layer ends with an instruction not to invoke any skill. An override
129
- placed on `bmad-review` is therefore **invisible** to code review. Getting the current lenses onto a
130
- diff requires calling `bmad-review` by hand.
160
+ **Code review is not `bmad-review`, and it is not BMad's at all any more.** The panel over a diff is
161
+ `code-review`, dispatched by `wdi-build`; it reviews along two axes, Standards and Spec, and both MUST
162
+ run. An override placed on `bmad-review` reaches documents only. Getting a document lens onto a diff
163
+ still requires calling `wdi-review` by hand, and that is a deliberate act, not a default.
131
164
 
132
165
  ## Renamed and retired
133
166
 
@@ -136,6 +169,7 @@ diff requires calling `bmad-review` by hand.
136
169
  | `bmad-create-prd` · `bmad-edit-prd` · `bmad-validate-prd` | Shims over `bmad-prd` — use the intent, not the shim |
137
170
  | `bmad-create-architecture` | `bmad-architecture` |
138
171
  | `bmad-create-epics-and-stories` · `bmad-sprint-planning` | **Not used** — sprint route |
172
+ | `bmad-spec` · `bmad-build` · `bmad-build-auto` · `bmad-code-review` · `bmad-retrospective` | **Retired** — the engine layer below G5 is no longer BMad's. Their `_bmad/custom/*.toml` overrides are withdrawn, and `update` removes any still installed |
139
173
 
140
174
  Roughly a third of the installed skills are deprecated aliases. `bmad-skill-register.md` is the
141
175
  authority on which is which, and it MUST be consulted rather than guessed from a name that looks
@@ -1,71 +1,74 @@
1
- ---
2
- status: Accepted
3
- ---
4
-
5
- # BMad Skill Register
6
-
7
- **Loaded when:** deciding which BMad skill a piece of work needs, or checking what one writes
8
-
9
- This used to be the full catalogue of all 59 installed BMad skills. **That catalogue is retired.** It was a
10
- copy of somebody else's inventory, it went stale on every BMad update, and nothing in this method read more
11
- than a dozen of its rows. What binds is the division of labour below; for anything about a BMad skill this
12
- method does not invoke, ask `bmad-help`, which reads BMad's own documentation.
13
-
14
- ## Who writes what
15
-
16
- | Artifact | Written by | Wrapped in |
17
- |---|---|---|
18
- | Product brief | `bmad-product-brief` | `wdi-problem` |
19
- | PRD | `bmad-prd` | `wdi-product` |
20
- | UX — `EXPERIENCE.md` + `DESIGN.md` | `bmad-ux` | `wdi-ux` |
21
- | Architecture spine + the C4 set | `bmad-architecture` | `wdi-blueprint` intent `platform` |
22
- | **UC catalogue · actors · entities · business rules** | **nothing in BMad** | `wdi-blueprint` writes it itself |
23
- | **SRS and all of `.what/<pc>/`** | **nothing in BMad** | `wdi-component` writes it itself |
24
- | **SDD and all of `.how/<pc>/`** | **nothing in BMad** | `wdi-component` writes it itself |
25
- | `SPEC.md` + `stories.yaml` | `bmad-spec` | `wdi-build` |
26
- | Code | `bmad-build` · `bmad-build-auto` | `wdi-build` |
27
- | Retrospective | `bmad-retrospective` | `wdi-build` |
28
- | Document review | `bmad-review` | `wdi-review` |
29
- | Course correction | `bmad-correct-course` | `wdi-decision` |
30
-
31
- **The three bold rows are why this method exists.** BMad stops at the promise and starts again at the
32
- mechanism, and every behaviour in between had no author. Three consequences attach to those artifacts and
33
- MUST be handled deliberately rather than discovered: no `doc_standards` fires a review, no memlog is born on
34
- its own, and no template enforces itself.
35
-
36
- ## No BMad skill is invoked directly
37
-
38
- Every one above has a wrapper, and the wrapper is what checks position, verifies the result against the
39
- guide, and lands the memlog. Routing past it produces an artifact nothing verifies.
40
-
41
- **One exception, and it is narrow:** `bmad-build` MAY be invoked directly on the Fast Path. A Fast Path that
42
- turns out to touch an `FR` MUST stop and become a wave `S`, which puts it back inside `wdi-build`.
43
-
44
- ## What is available but writes nothing
45
-
46
- | Skill | Use |
47
- |---|---|
48
- | `bmad-advanced-elicitation` · `bmad-party-mode` | Thinking aids. They produce no artifact and MUST NOT be treated as authors |
49
- | `bmad-deep-recon` | Research, before a brief rests on outside data. Its output stays in `_bmad-output/` permanently and MUST NOT be folded into the brief |
50
- | `bmad-code-review` | The two-reviewer panel over code, dispatched by `wdi-build`. Not for documents |
51
- | `bmad-help` | Questions about BMad itself. It MUST NOT be used to answer "where am I" that is `wdi-help` |
52
-
53
- ## What is NOT USED, and MUST NOT be
54
-
55
- | Skill | Why |
56
- |---|---|
57
- | `bmad-create-epics-and-stories` · `bmad-sprint-planning` · `bmad-sprint-status` | They belong to the sprint route, which keeps status in a hand-edited file. This method reads status from story-file frontmatter — `bmad-guide.md` owns the reasoning |
58
- | `bmad-create-story` · `bmad-dev-story` · `bmad-quick-dev` · `bmad-dev-auto` | Deprecated in BMad itself; `bmad-build` and `bmad-build-auto` replace them |
59
- | `bmad-editorial-review*` · `bmad-review-*` | Shims onto `bmad-review` lenses. Ask for the lens, not the shim |
60
- | `bmad-document-project` · `bmad-generate-project-context` | Forward to `bmad-project-context`. This repo's agent instructions are maintained by hand |
61
- | Any skill named as a **gate condition** | A gate is passed by its checklist and its validators, never by a skill having run |
62
-
63
- ## The class that decides where output lands
64
-
65
- `bmad-guide.md` owns the class definitions; what matters here is that **class B** exists because some skills
66
- write several things at once that belong to different layers. `bmad-ux` is the case: `EXPERIENCE.md` is a
67
- promise and `DESIGN.md` is a build detail, and no configuration can send them to two places. Its output
68
- lands in a neutral folder first, and `wdi-ux` places it.
69
-
70
- Which skill lands which output is the ownership table in `corpus-guide.md`, and it MUST NOT be duplicated
71
- here.
1
+ ---
2
+ status: Accepted
3
+ ---
4
+
5
+ # BMad Skill Register
6
+
7
+ **Loaded when:** deciding which BMad skill a piece of work needs, or checking what one writes
8
+
9
+ This used to be the full catalogue of all 59 installed BMad skills. **That catalogue is retired.** It was a
10
+ copy of somebody else's inventory, it went stale on every BMad update, and nothing in this method read more
11
+ than a dozen of its rows. What binds is the division of labour below; for anything about a BMad skill this
12
+ method does not invoke, ask `bmad-help`, which reads BMad's own documentation.
13
+
14
+ ## Who writes what
15
+
16
+ | Artifact | Written by | Wrapped in |
17
+ |---|---|---|
18
+ | Product brief | `bmad-product-brief` | `wdi-problem` |
19
+ | PRD | `bmad-prd` | `wdi-product` |
20
+ | UX — `EXPERIENCE.md` + `DESIGN.md` | `bmad-ux` | `wdi-ux` |
21
+ | Architecture spine + the C4 set | `bmad-architecture` | `wdi-blueprint` intent `platform` |
22
+ | **UC catalogue · actors · entities · business rules** | **nothing in BMad** | `wdi-blueprint` writes it itself |
23
+ | **SRS and all of `.what/<pc>/`** | **nothing in BMad** | `wdi-component` writes it itself |
24
+ | **SDD and all of `.how/<pc>/`** | **nothing in BMad** | `wdi-component` writes it itself |
25
+ | Document review | `bmad-review` | `wdi-review` |
26
+ | Course correction | `bmad-correct-course` | `wdi-decision` |
27
+
28
+ **Everything below G5 left this table.** `SPEC.md`, the tickets, the code, and the code panel are produced
29
+ by `to-spec`, `to-tickets`, `implement`, `tdd`, and `code-review` — engines that are not BMad's, and that
30
+ three of the five carry `disable-model-invocation: true` for, so **the owner runs them and no skill can**.
31
+ `wdi-build` owns that pipeline; `bmad-guide.md` owns the reasoning.
32
+
33
+ **The three bold rows are why this method exists.** BMad stops at the promise and starts again at the
34
+ mechanism, and every behaviour in between had no author. Three consequences attach to those artifacts and
35
+ MUST be handled deliberately rather than discovered: no `doc_standards` fires a review, no memlog is born on
36
+ its own, and no template enforces itself.
37
+
38
+ ## No BMad skill is invoked directly
39
+
40
+ Every one above has a wrapper, and the wrapper is what checks position, verifies the result against the
41
+ guide, and lands the memlog. Routing past it produces an artifact nothing verifies.
42
+
43
+ **One exception, and it is narrow:** on the Fast Path the owner runs `/implement` directly, with no wrapper.
44
+ A Fast Path that turns out to touch an `FR` MUST stop and become a spec `S`, which puts it back inside
45
+ `wdi-build`.
46
+
47
+ ## What is available but writes nothing
48
+
49
+ | Skill | Use |
50
+ |---|---|
51
+ | `bmad-advanced-elicitation` · `bmad-party-mode` | Thinking aids. They produce no artifact and MUST NOT be treated as authors |
52
+ | `bmad-deep-recon` | Research, before a brief rests on outside data. Its output stays in `_bmad-output/` permanently and MUST NOT be folded into the brief |
53
+ | `bmad-help` | Questions about BMad itself. It MUST NOT be used to answer "where am I" — that is `wdi-help` |
54
+
55
+ ## What is NOT USED, and MUST NOT be
56
+
57
+ | Skill | Why |
58
+ |---|---|
59
+ | `bmad-spec` · `bmad-build` · `bmad-build-auto` · `bmad-code-review` · `bmad-retrospective` | **Retired.** The engine layer below G5 is no longer BMad's. Their `_bmad/custom/*.toml` overrides are withdrawn and `update` removes any still installed |
60
+ | `bmad-create-epics-and-stories` · `bmad-sprint-planning` · `bmad-sprint-status` | They belong to the sprint route, which keeps status in a hand-edited file. This method reads status from the ticket itself — `bmad-guide.md` owns the reasoning |
61
+ | `bmad-create-story` · `bmad-dev-story` · `bmad-quick-dev` · `bmad-dev-auto` | Deprecated in BMad itself, and their replacements are retired too |
62
+ | `bmad-editorial-review*` · `bmad-review-*` | Shims onto `bmad-review` lenses. Ask for the lens, not the shim |
63
+ | `bmad-document-project` · `bmad-generate-project-context` | Forward to `bmad-project-context`. This repo's agent instructions are maintained by hand |
64
+ | Any skill named as a **gate condition** | A gate is passed by its checklist and its validators, never by a skill having run |
65
+
66
+ ## The class that decides where output lands
67
+
68
+ `bmad-guide.md` owns the class definitions; what matters here is that **class B** exists because some skills
69
+ write several things at once that belong to different layers. `bmad-ux` is the case: `EXPERIENCE.md` is a
70
+ promise and `DESIGN.md` is a build detail, and no configuration can send them to two places. Its output
71
+ lands in a neutral folder first, and `wdi-ux` places it.
72
+
73
+ Which skill lands which output is the ownership table in `corpus-guide.md`, and it MUST NOT be duplicated
74
+ here.
@@ -30,14 +30,16 @@ MAY be dropped.
30
30
 
31
31
  | Section | Why it cannot be dropped |
32
32
  |---|---|
33
- | The Problem | The gate decides on this. Without it there is nothing to approve |
33
+ | Why | The narrative the gate is read against. Without it there is nothing to approve |
34
+ | The Problem | The gate decides on this |
34
35
  | Who This Serves | Names who the problem belongs to |
35
36
  | Goals | `BG-N` is the first link of the traceability chain; without it the chain has no root |
36
37
  | Success Criteria | The measure that makes "done" checkable |
37
38
  | Scope In / Scope Out | The boundary the PRD is later held against |
38
39
  | Constraints | What design MUST NOT trade away |
39
- | Assumptions | What the brief would be wrong without |
40
- | Prerequisites | What blocks work before it starts |
40
+
41
+ `The Solution` and `What Makes This Different` stay optional — G1's seven questions never ask what is
42
+ being built, only whether the problem is real and worth the cost.
41
43
 
42
44
  ## Decision rules
43
45
 
@@ -46,24 +48,45 @@ MAY be dropped.
46
48
  discovery is not finished and the gate MUST NOT open.
47
49
  - Every user and stakeholder who touches the product MUST appear in the table, including those who
48
50
  never open it — whoever pays for it, approves it, or is accountable for it.
51
+ - **Success Criteria MUST name exactly one measurable figure**, with a timeframe. This is a ★
52
+ question at G1 and the section most often left as a mission statement instead — check 5 in
53
+ `wdi-problem` exists because nothing else caught this.
49
54
  - Goals MUST be numbered `BG-1`, `BG-2`, … and MUST NOT be numbered `G1`, `G2` — `G1`–`G5` name the
50
55
  five gates. `BG` IDs are cited downstream and MUST stay stable once written.
56
+ - **Goals is a pointer, not a list.** The section states `Goals — see goals.yaml → goals:` and
57
+ nothing more. The statement for each `BG-N`, and an optional `why:` when a goal needs a reason
58
+ beyond its statement, are authored straight into `.control/registry/goals.yaml` — landing
59
+ that row is part of producing the brief, done by `wdi-problem` in the same pass, not a follow-up.
60
+ A goal's text written in this section as well as in the registry is the same fact with two homes,
61
+ and the copy people read is whichever they open first.
51
62
  - Scope Out MUST be written as items. Leaving it to be inferred from absence defeats its only
52
63
  purpose, which is naming what someone will otherwise assume is coming.
53
- - Per-release MVP scope belongs to the PRD, not here. This section states the product boundary.
64
+ - Per-release MVP scope belongs to the PRD, not here. This section states the product boundary — what
65
+ belongs to the product at all, ever, not what ships first.
54
66
 
55
- ## The three product-level sections
67
+ ## Constraints the one product-level section still authored here
56
68
 
57
- BMad has no home for these; they exist because of that gap, and each has a rule about where it goes
58
- when it stops being a statement.
69
+ BMad has no home for a product-wide constraint; this section exists because of that gap.
59
70
 
60
71
  | Section | Boundary | When it moves |
61
72
  |---|---|---|
62
73
  | Constraints | What is fixed before design starts. Technical constraints that only shape implementation belong in `addendum.md` | A constraint that emerges from a design decision becomes `AD-N` in the spine and MUST NOT be appended here later |
63
- | Assumptions | What is believed but unverified, stated so it could be proven false | An assumption that starts to wobble MUST become a row in `.control/registry/risks.yaml` with an owner |
64
- | Prerequisites | What MUST exist or be granted before work can start | Any prerequisite not yet satisfied MUST have a row in `.control/questions/external.md` naming who is being waited on and by when |
65
74
 
66
- An assumption nobody would act differently about is not worth listing.
75
+ ## No Assumptions or Prerequisites section
76
+
77
+ Both are dropped from the brief entirely — they were the two sections with no home anywhere else in
78
+ the corpus, and now they do:
79
+
80
+ - An assumption goes through `wdi-question` into `.control/questions/assumptions.md`. State it so it
81
+ could be proven false; one that starts to wobble MUST become a row in
82
+ `.control/registry/risks.yaml` with an owner. An assumption nobody would act differently about is
83
+ not worth listing.
84
+ - A prerequisite goes through `wdi-question` into `.control/questions/external.md`, naming who is
85
+ being waited on and by when.
86
+
87
+ Neither is restated in the brief itself — the brief citing a row it does not own is exactly the second
88
+ copy this section used to be. A reader who wants both assembled with everything else reads the
89
+ generated deliverable, `.what-rendered/_product-brief/brief.md`, which renders the open rows from both files.
67
90
 
68
91
  ## No Product Component list
69
92
 
@@ -89,6 +112,14 @@ from, and every later gate inherits the guess.
89
112
  - The brief MUST have been through `bmad-review` lenses structure + prose before it reaches the
90
113
  gate. Gate time is for deciding, not for catching mistakes. This one fires on its own — it is the
91
114
  *Polish* step of `bmad-product-brief`, driven by `doc_standards`, and nobody invokes it. Verifying
92
- that it actually ran is check 9 in `wdi-problem`.
115
+ that it actually ran is check 11 in `wdi-problem`.
93
116
  - Invoke through `wdi-problem`, not `bmad-product-brief` directly — the wrapper is what checks the
94
117
  rules on this page.
118
+
119
+ ## The generated deliverable
120
+
121
+ A complete, self-contained copy for a reader who should not need to open the registry lives at
122
+ `.what-rendered/_product-brief/brief.md` — written by `/wdi-report render brief`, which runs
123
+ `validate.py --generate`. It assembles this document's own sections verbatim, the goals rendered from
124
+ `goals.yaml`, and the open rows from `assumptions.md` and `external.md`. Nobody writes to it by
125
+ hand — it is regenerated, never hand-patched, the same as `blueprint.md` and `decisions.md`.
@@ -23,12 +23,37 @@ be copied into this file.
23
23
  | `.what/` | What is promised | Living, amended | BMad class A + us |
24
24
  | `.how/` | How it is built | Living, amended | BMad class A + us |
25
25
  | `_bmad-output/` | Work in progress | Ends when the work does | BMad class B and C |
26
+ | `.what-rendered/` · `.how-rendered/` | The same promise and shape, **assembled for a human to read** | Regenerated on every `render`; never edited | `validate.py --generate`, and nobody else |
26
27
 
27
28
  `.control/` is the value of `{project_knowledge}` in BMad's configuration. There is no `docs/`.
28
29
 
30
+ ### Two audiences, two trees
31
+
32
+ `.what/` and `.how/` are the **working** trees: prose that cannot be a row, pointers to the registry for
33
+ everything that can. They are what an agent reads and what a skill writes. They are deliberately thin
34
+ for a human — `Goals` is one line, an `FR` is an id — because completeness is not their job.
35
+
36
+ `.what-rendered/` and `.how-rendered/` are the **reader's** trees. Every file in them sits at the mirror
37
+ path of the working document it projects — `.what-rendered/<pc>/SRS-<pc>.md` is
38
+ `.what/<pc>/SRS-<pc>.md` with every pointer opened: the goal statements, the UC rows, the
39
+ `AD-N` text, the open questions, all pulled in from their own homes. That is what a gate reads, and
40
+ what a client receives.
41
+
42
+ Three rules keep the two trees honest:
43
+
44
+ - **A skill MUST NOT read a `-rendered` file as input.** It is output. The working document and the
45
+ registry are the source, and a skill that read the projection would be reading its own echo — a
46
+ `kit-integrity` test fails when any `SKILL.md` lists one in its `Inputs`.
47
+ - **Nobody edits a `-rendered` file.** A defect seen there is a defect in the working document or the
48
+ registry, and that is where it is fixed. The next `render` overwrites the page.
49
+ - **Every gate reads one rendered page, and that page MUST answer the gate's seven questions.** G1
50
+ reads `.what-rendered/_product-brief/brief.md`; G2 `.what-rendered/_prd/<slug>/prd.md`; G3
51
+ `.how-rendered/blueprint.md`; G4 `.how-rendered/<pc>/SDD-<pc>.md`. A question that cannot be
52
+ answered from the page is a gap in the page, not a reason to open a working file.
53
+
29
54
  ## The placement test
30
55
 
31
- One question decides everything: **is this file still correct after its wave has passed?**
56
+ One question decides everything: **is this file still correct after its spec has passed?**
32
57
 
33
58
  Yes → the corpus. No → `_bmad-output/`.
34
59
 
@@ -60,9 +85,8 @@ part of producing it — never a follow-up someone else performs.
60
85
  | `DESIGN.md` | `.how/<pc>/01-ux/` | `wdi-ux` |
61
86
  | tokens and base components | `.how/_platform/design-system.md` | `wdi-ux` |
62
87
  | each screen in `DESIGN.md` | an `LC` of type `ui-screen` in `components.yaml` | `wdi-ux` |
63
- | `RETROSPECTIVE.md` | `RTR-<wave>.md` in `.control/reports/` | `wdi-build`, at wave close |
64
- | `test-summary.md` | test names → `waves.yaml` | `wdi-build` |
65
- | `stack.md` · `conventions.md` · `brownfield.md` | merged into `.constitution/project/codebase-*-guide.md` | `wdi-build`, at wave close |
88
+ | The names of the tests a ticket went green on | the ticket's `tests` in `specs.yaml` | `wdi-build` |
89
+ | What the spec settled about the stack, the conventions, or the brownfield reality | merged into `.constitution/project/codebase-*-guide.md` | `wdi-build`, at spec close |
66
90
  | A sprint change proposal | a `DEC-` of `type: course-correction` | `wdi-decision` |
67
91
  | The registry rows and skeletons a new PC needs | `components.yaml` · `.what/<pc>/` · `.how/<pc>/` | `wdi-init` intent `component` |
68
92
  | `platform_owns` — an entity no component's promise explains | `components.yaml`, plus its description in `cross-cutting.md` | `wdi-blueprint` |
@@ -73,13 +97,13 @@ part of producing it — never a follow-up someone else performs.
73
97
 
74
98
  - A skill MUST NOT write into a layer it does not own.
75
99
  - Registry conversion is part of landing, not a follow-up. A screen that lands in `01-ux/` without its
76
- `components.yaml` entry has been half-landed, and V12 catches it **at wave close** — which is the
100
+ `components.yaml` entry has been half-landed, and `lc-registered` catches it **at spec close** — which is the
77
101
  right moment to be caught, and a bad moment to be surprised.
78
102
  - Content MUST NOT be edited while it is being landed. If it has to change to fit its new home, that is a
79
103
  separate act — say so and stop. Splitting one output across the homes its row names is not editing.
80
104
  - The C4 set's target files already exist and are **living**. Their owner MUST amend, MUST NOT overwrite; when
81
105
  the incoming set contradicts an annotation already there, it MUST stop and report the finding.
82
- - Nothing MAY be landed into a wave that is already closed. The wave is reopened through `wdi-build`, or the
106
+ - Nothing MAY be landed into a spec that is already closed. The spec is reopened through `wdi-build`, or the
83
107
  gap is recorded as an open question.
84
108
  - An output with **no row** in this table MUST NOT be given a guessed home. It stays in `_bmad-output/`, and
85
109
  `wdi-reconcile` reports it — an output with no home is a gap in the method, and MUST surface as one.
@@ -168,7 +192,7 @@ would have to be withdrawn for the entity to stop being needed. Two examples of
168
192
 
169
193
  **One guard, and it is what stops this becoming a drawer:** everything `_platform` owns — in any position —
170
194
  MUST be described under `## Platform-owned` in `cross-cutting.md`, with its kind and the shape every toucher
171
- obeys. A platform that owns something documents it. V21 checks it, and skips only while that section has not
195
+ obeys. A platform that owns something documents it. `entity-one-writer` checks it, and skips only while that section has not
172
196
  been born at G3.
173
197
 
174
198
  That guard is the whole reason `_platform` can be a general answer rather than an escape hatch: reaching for
@@ -187,6 +211,117 @@ judgements — so both are declared in that inventory's own frontmatter (`platfo
187
211
  survive every re-derivation. Putting either outside the file means the next derivation silently deletes the
188
212
  owner's decision.
189
213
 
214
+ ## A derived fact has exactly one home
215
+
216
+ `why/rationale.md` has always carried this as principle 5 — *what can be derived is not written by hand.*
217
+ It was never written as a rule anywhere, and that file binds nothing by its own terms. So it bound nothing,
218
+ and only one field was ever actually protected: ticket status, by `ticket-status-one-home`.
219
+
220
+ **A document MUST NOT state a fact that a registry, a generated file, or git already holds.** It cites the
221
+ id and lets the reader follow it. The list is short and it is closed:
222
+
223
+ | Never stated in prose | Where it lives |
224
+ |---|---|
225
+ | `mode` · `risk_accepted` · `g4_passed` | `components.yaml` |
226
+ | Which `DEC-` bind this document — **including "none yet"** | `.control/generated/decisions.md` |
227
+ | A count of `UC`, `FR`, `CAP`, or containers | the registry that holds them |
228
+ | Which slots or files exist, and which are still empty | `.control/structure-document.md`, derived |
229
+ | Whether an `OQ-` is open or answered | `.control/questions/` |
230
+ | When the document last changed | git |
231
+
232
+ **The remedy is DELETION, never correction.** This is the part that costs a corpus real time to learn: a
233
+ restated fact that is corrected becomes a *second* stale fact, on a slower clock than the first. One SRS in a
234
+ real repo carried three claims about its own `mode` on one page — the value, a correction block below it
235
+ fixing an older value, and the slot list — and not one of the three was right. Correcting any of them would
236
+ have added a fourth. Deleting all three ends it.
237
+
238
+ A negative claim is the worst case and the easiest to miss, because it looks like diligence: *"No applied
239
+ `DEC-` binds this component yet"* is true the day it is written and silently false forever after.
240
+
241
+ **What is NOT a derived fact**, and MUST still be written where it belongs: a judgement the pattern cannot
242
+ recompute (the paragraph above owns that), an `AD-N` citation — the spine's `binds:` is authored, not
243
+ derived — and the *reason* something is the way it is, which no registry holds.
244
+
245
+ ## A pass writes one artifact
246
+
247
+ When a skill is writing or updating an artifact, **that artifact is the pass.** Hunting the rest of the
248
+ corpus for things that disagree with it is not part of writing it, and MUST NOT be folded in: it is
249
+ `wdi-reconcile`'s job, it runs at a gate, and `wdi-review` § Stale is not a finding decides what is even
250
+ worth reporting when it does.
251
+
252
+ Where a contradiction surfaces anyway — and it will, because writing a document is how you notice — there
253
+ are exactly two outcomes:
254
+
255
+ | The other document is | Do |
256
+ |---|---|
257
+ | **Load-bearing wrong** — a reader would make the wrong repair | Say it in **one line** in the output, naming the file and the edit it needs |
258
+ | Anything else | Nothing. Not a line, not an `OQ-`, not a `DEC-` |
259
+
260
+ It MUST NOT become an open question, and it MUST NOT become a decision. A contradiction between two
261
+ documents is an **edit** waiting for whoever owns the file — never a thing to be adjudicated.
262
+
263
+ **This binds hardest at G1 and G2.** A brief is being formed; a PRD is being written. There is barely a
264
+ corpus to be consistent with yet, and a pass that spends its budget looking for one is spending it on
265
+ nothing.
266
+
267
+ ## One decided change is one edit pass
268
+
269
+ Once the owner has decided, the chain is **applied**, not surveyed. The agent already knows what the
270
+ change reaches — `touches:` names it, the ownership table in this file names who lands each part, and the
271
+ RTM names the rows that move. It edits all of them in **one pass** and reports once.
272
+
273
+ What MUST NOT happen: checking one document, reporting, waiting, checking the next; re-deriving the same
274
+ relations in a later pass; or asking the owner to confirm the same decision at each file it touches. The
275
+ documents are split for reading, not to be walked one at a time — and walking them is where the time and
276
+ the tokens actually go.
277
+
278
+ ## The corpus is written in the present tense
279
+
280
+ A design document states **what is true now**: the latest state of the design, and what still has to be
281
+ reached. It does not state how it got there. This governs `.what/<pc>/`, `.how/`, and
282
+ `.constitution/project/`.
283
+
284
+ ### Two kinds of history, and only one is worth writing
285
+
286
+ Most history is not useful. What is useful is the current state — and the rare piece of history that
287
+ **stops the same mistake happening twice**. One question separates them:
288
+
289
+ > **Would someone about to make a change be saved by this line?**
290
+
291
+ | Kind | Example | Where it goes |
292
+ |---|---|---|
293
+ | **Business or technical** — the mistake could recur | *"Files are removed before the record, and that left a document pointing at a deleted image"* | A `DEC-`, `why/`, or `answered.md`. Rarely, and only when it earns it |
294
+ | **Document history** — a document said something else last week | *"This section was rewritten"* · *"withdrawn because a later pass found it wrong"* · *"this used to read X"* | **Nowhere.** git holds it, and git holds it better |
295
+
296
+ The second kind is what fills a corpus and buys nothing. It arrives as a correction block, a
297
+ `## Provenance` note, a document's own change log, a note about a conflict that has already been
298
+ **resolved**, or a *"considered and rejected"* aside about the method itself. All of it MUST NOT be
299
+ written in the three layers above.
300
+
301
+ **And no step demands the first kind either.** History is never a checklist item, never a gate condition,
302
+ and never a blocking finding. It is written when someone judges it worth writing, and skipping it is
303
+ **not** a gap — nothing in this method MAY report a missing history line as a defect. That is the whole
304
+ difference between a record and a ritual.
305
+
306
+ **A mid-flight change lands as if it had been there from the start.** An idea arriving during G5 is
307
+ written in the present tense — not appended, not annotated, not marked as late. The commit is that
308
+ record, and it is a better one than a paragraph.
309
+
310
+ **What this rule does NOT cut:**
311
+
312
+ - **The PRD's Revision History.** Its reader is outside the room, and `prd-guide.md` already demands the
313
+ business form of it: *state what the promise now is, not which section was edited.*
314
+ - **`.control/questions/answered.md`.** This is the clearest case of history that pays: it is what stops
315
+ the same question being asked again in three months.
316
+ - **`ratified_by:`** on a room guide — evidence the rule is real, not a record that it changed.
317
+ - **`why/`** and `.control/decisions/`, whose job is exactly the first kind.
318
+ - **`superseded`** pointing at its replacement. A reader following an old id needs the pointer.
319
+
320
+ Real cost of getting this wrong, from one repo: a codebase conventions guide — the file a developer opens
321
+ to learn how to write code here — spent a quarter of its length explaining when it had been filled, why it
322
+ was not a `DEC-`, and which alternative had been rejected. Not one line of that would save the next reader
323
+ from anything.
324
+
190
325
  ## Two axes inside `.what/`
191
326
 
192
327
  | | `_prd/<initiative>/` | `<pc>/` |
@@ -198,7 +333,7 @@ owner's decision.
198
333
  Both are living. What separates them is **promise versus behaviour**, not lifetime. One functional area MAY
199
334
  span several components, and one component MAY serve several PRDs, so neither can absorb the other.
200
335
 
201
- **Time is not a folder axis.** Release lives in `CAP.target_release` and in `waves.yaml`.
336
+ **Time is not a folder axis.** Release lives in `CAP.target_release` and in `specs.yaml`.
202
337
 
203
338
  ## Slot numbering means two different things
204
339
 
@@ -225,11 +360,11 @@ cites them. `supplements/` beside either kernel is repealed with the `ANX-` conc
225
360
 
226
361
  | Code | Is |
227
362
  |---|---|
228
- | `BG-` `CAP-` `FR-` `NFR-` `UJ-` `UC-` | The traceability chain, allocated from `requirements.yaml` and `usecases.yaml` |
363
+ | `BG-` `CAP-` `FR-` `NFR-` `UJ-` `UC-` | The traceability chain. `BG` from `goals.yaml`; `CAP`/`FR`/`NFR`/`UJ` from that initiative's `requirements-<slug>.yaml`; `UC` from `usecases.yaml` |
229
364
  | `AD-` | An invariant in the architecture spine — a living rule, edited in place |
230
365
  | `DEC-` | A decision — an event, frozen when `applied`, only superseded |
231
366
  | `LC-` | A Logical Component |
232
- | `OQ-` `RTR-` | An open question · an archived retrospective |
367
+ | `OQ-` | An open question. `RTR-` was the archived retrospective and is **retired** — a frozen `RTR-` file stays where it is |
233
368
  | `BUG-` `HOT-` | A defect · a hotfix |
234
369
  | `NT-` | A non-technical fact |
235
370
 
@@ -278,7 +413,7 @@ it there, then `promote`. Using this room to bypass the package is how a method
278
413
  with nobody deciding it, and **an empty room is a valid state**: filling it so that it gets used is the
279
414
  very failure this rule prevents.
280
415
 
281
- Frontmatter is required and **V27** checks it: `scope: project` · a one-line `purpose:`. A file MAY
416
+ Frontmatter is required and **`custom-room-declared`** checks it: `scope: project` · a one-line `purpose:`. A file MAY
282
417
  narrow or add with nothing further; to **contradict** a generic rule it MUST name that rule in
283
418
  `overrides:` and carry `decision:` naming the `DEC-` that decided it. A method that can be contradicted
284
419
  without a decision stops being trustworthy in the next repo.