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
@@ -0,0 +1,179 @@
1
+ ---
2
+ name: wdi-upgrade
3
+ description: Use right after `wdi-method update` moved this repo to a newer method version. Finds every document and registry file still in the OLD shape, re-homes their content into the new one — registry rows out of prose, pointers where copies were, the rendered trees born — and verifies green. Runs once per version jump; safe to re-run.
4
+ ---
5
+
6
+ # WDI Upgrade
7
+
8
+ `wdi-method update` does the mechanical half of a version jump: it overwrites the kit, renames files whose
9
+ content needs no judgment, seeds what is new, prunes what is retired. It stops exactly where a decision
10
+ about **content** begins — which PRD an `FR` belongs to, whether a sentence in the old brief was an
11
+ assumption or a constraint. Those are this skill's half.
12
+
13
+ **This is the one skill allowed to edit `brief.md`, `prd.md`, an SRS, an SDD, or a C4 file directly.**
14
+ Every other skill is forbidden, because a hand edit makes the memlog lie about how the document was
15
+ produced. An upgrade produces nothing: it moves sentences that already exist into the home the new
16
+ version gives them, word for word. The memlog stays true, and this skill's report is the record.
17
+
18
+ ## Inputs
19
+
20
+ | Source | What it answers |
21
+ |---|---|
22
+ | `.control/wdi-method.yaml` | The version now installed — the shape everything below MUST end in |
23
+ | The `update` run's own output | The `upgrade` line lists what it detected as pending; start there |
24
+ | `.control/registry/` | What is already a row, so nothing is landed twice |
25
+ | `.what/_product-brief/brief.md` · `.what/_prd/*/prd.md` | The two documents whose shape changed most |
26
+ | `.what/<pc>/SRS-<pc>.md` · `.how/<pc>/SDD-<pc>.md` · `.how/_platform/c4-l2-containers.md` | The three that used to carry a copy of a registry table |
27
+ | `.constitution/method/document/templates/` | The target shape of every document above |
28
+
29
+ ## Step 1 — Detect, and show the list before touching anything
30
+
31
+ Probe each item below; a probe is a file or heading that exists only in the old shape. List every hit
32
+ to the owner as a checklist, in the order below — it is a dependency order, and doing a later item
33
+ before an earlier one lands content in a file that the earlier item is about to change.
34
+
35
+ | # | Probe | Old shape | New home |
36
+ |---|---|---|---|
37
+ | 1 | `.control/registry/requirements.yaml` exists | one file for `BG` · `CAP` · `FR` · `NFR` · `UJ` | `goals.yaml` (`BG`) · `requirements-<slug>.yaml` per PRD (`CAP` · `FR` · `NFR` · `UJ`) |
38
+ | 2 | `specs.yaml` has `W<n>` ids, or `epics:` / `stories:` keys | pre-rename plan | re-cut through `wdi-build` — **not this skill**; report it and move on |
39
+ | 3 | `brief.md` has `## Executive Summary`, `## Vision`, `## Assumptions`, or `## Prerequisites`; or `## Goals` lists `BG-` statements | 14-section brief | 8 sections: `Why` merges Summary + Vision; Goals is a pointer, its rows in `goals.yaml`; Assumptions → `questions/assumptions.md`; Prerequisites → `questions/external.md` |
40
+ | 4 | any `prd.md` has a section **named** Document Purpose, Glossary, Non-Goals, Open Questions, or Assumptions Index — under whatever number that kit gave it — or `**Proof of done:**` under a feature | 12-section PRD with `FR` blocks | 7 sections; `FR`/`NFR` text → `requirements-<slug>.yaml`, the PRD keeps `Realizes:` ids; Glossary → `product-glossary.md`; §8/§9 → `questions/`; §1 becomes a delta |
41
+ | 5 | any `SRS-<pc>.md` `## UC Catalogue` has `\| UC-` rows | catalogue copied from `usecases.yaml` | one pointer line; the rows live in `usecases.yaml` |
42
+ | 6 | any `SDD-<pc>.md` `## Inherited Constraints` has a `Quoted rule` column, or `> ` blockquote lines under an `**AD-N — …**` heading, or the sentence `Quoted verbatim from` | `AD-N` text copied from the spine, in either of the two shapes SDDs were written in | ids only; the rendered SDD shows the text |
43
+ | 7 | `c4-l2-containers.md` has a `\| Container \| Product Components living in it \|` table | matrix copied from `components.yaml` | one pointer line |
44
+ | 8 | `.control/generated/brief.md`, `blueprint.md`, or `prd-*.md` exist | human pages in the machine folder | `.what-rendered/` · `.how-rendered/` — `render` clears the old ones |
45
+ | 9 | `.what-rendered/` or `.how-rendered/` absent | no reader's tree yet | born by `render` |
46
+ | 10 | any `.md` outside `.constitution/` cites `.control/generated/brief.md`, `blueprint.md`, or `prd-<slug>.md` | a pointer at a page that moved | `.what-rendered/_product-brief/brief.md` · `.how-rendered/blueprint.md` · `.what-rendered/_prd/<slug>/prd.md` — `cites-resolve` fails until it is repointed |
47
+
48
+ Anything not in the list is not this skill's. A brief that already has `## Why` is done; skip it.
49
+
50
+ ## Step 2 — Registry first
51
+
52
+ **1 — the requirement split.** A row written under an older kit carries `text:` where a newer one
53
+ carries `title:`; both are the short label, the renderer and `timeline.py` read either, and one MUST
54
+ NOT be copied into the other — that is two homes for one fact. Which PRD a row belongs to is read from
55
+ the rows before it is read from the prose. A `CAP` or `UJ` with a `prd:` field goes to `requirements-<that slug>.yaml`; an `FR`
56
+ follows its `capability:` to that CAP's file; an `NFR` follows its `component:` to the PRD whose CAPs
57
+ own that component — a `BG` is product-level and never decides an NFR's home on its own, so `goal:` is
58
+ only a tie-breaker when that component's CAPs span two PRDs. On a product with exactly **one** PRD every row belongs to that
59
+ PRD by construction — write them all to its file and skip the citation scan. Otherwise, only a row with
60
+ none of those fields falls back to the PRD whose prose cites its id — and an id cited by **two** PRDs
61
+ is reported, not placed. The citation scan still runs on every row as a cross-check: a row whose
62
+ structural home and citing PRD disagree is reported with both names. Write the row, unchanged, into
63
+ its file; `goals:` rows go to `goals.yaml`. A sentence moved into a YAML value keeps its punctuation
64
+ and its markup: when it holds `: ` or `#` or starts with a quote, wrap the value in double quotes or a
65
+ `>-` block — never trade a colon for a dash or strip `**` and backticks to make it a plain scalar. A row with no home is reported by id, not guessed: the
66
+ owner names it. When every row has moved, delete `requirements.yaml`; `id-allocated-once` fails if a
67
+ row was copied instead of moved.
68
+
69
+ Run `validate.py --check`. Green here means the registry is whole before any document starts pointing
70
+ at it.
71
+
72
+ ## Step 3 — Documents, oldest gate first
73
+
74
+ **3 — brief.** Merge `## Executive Summary` and `## Vision` into one `## Why`, keeping every sentence
75
+ that says something the other did not. Each `BG-N` statement under `## Goals` MUST already be a row in
76
+ `goals.yaml` (Step 2); replace the list with the pointer line from the template. Each `## Assumptions`
77
+ item becomes a row in `.control/questions/assumptions.md` with `Whose: owner`; each `## Prerequisites`
78
+ item a row in `external.md` — **after** checking that no `OQ-` row already states it, because a brief
79
+ written under an earlier kit usually landed them already and a second row is a copy. A prerequisite
80
+ the brief itself marks satisfied is dropped, not landed as open. A `questions/` table written before
81
+ the `Whose` column existed (`| id | Assumption | Cost if wrong | Taken | By |`) gets the column added —
82
+ header and separator, and an empty cell on every existing row, which the validator counts as
83
+ `unstated`, which is what they are. The rows this skill lands say `owner`. `Cost if wrong` is `—` when
84
+ the source never stated one; it is not invented. An open question the source never marked blocking is
85
+ filed in `assumptions.md`, as the template's three tests say. Delete both sections, and say how many
86
+ items were already rows. Check `## Success Criteria` names one measurable
87
+ figure — if it does not, that is a finding for the owner, not a sentence for this skill to invent.
88
+
89
+ **4 — each PRD.** Sections are matched **by name, never by number**: the numbers moved between kits
90
+ (one kit numbers Non-Goals §5 and Open Questions §8; an older one numbers Non-Goals §7, MVP Scope §8,
91
+ Open Questions §10), so a step that says "delete §8" deletes MVP Scope on the wrong corpus. Delete
92
+ `Document Purpose`. Every `Glossary` term not yet in `.control/product-glossary.md` is added there,
93
+ verbatim; then delete `Glossary`. Every `Non-Goals` item MUST already be in the brief's Scope Out or
94
+ this PRD's `MVP Scope → Out of Scope` — if neither holds it, add it to the one it belongs to; then
95
+ delete `Non-Goals`. Every `Open Questions` and `Assumptions Index` item becomes a `questions/` row
96
+ (after the same already-a-row check as the brief's); delete both.
97
+ Under each feature, every `FR` block is folded into its row in `requirements-<slug>.yaml` (Step 2)
98
+ before the block goes: the block's description paragraph — the prose between the `#### FR-N` heading
99
+ and the first `**…:**` label — becomes the row's `statement:` when the row has none (the row's `title`
100
+ stays). **This is the one move with no validator behind it**, so count it: blocks with a paragraph
101
+ versus rows that now carry `statement:` MUST match, and Step 5 reports both numbers. A run that deletes
102
+ the blocks and lands zero statements has thrown the requirement's own sentence away; its `**Consequences (testable):**` bullets move verbatim to
103
+ `addendum.md` under `## Technical how — testable consequences per FR`, appended **after** the sections
104
+ already there, one `### FR-N — title` each,
105
+ because `prd-guide.md` repealed the double proof of done and that is where the technical restatement
106
+ lives now; its `**Proof of done:**` is compared with the row's `proof` — when they differ, the
107
+ **registry is kept** (it is the declared SSOT), the PRD's is dropped, and both texts are reported side
108
+ by side for the owner, never merged. Then the block becomes `**Realizes:** FR-a, FR-b, NFR-c`, and a
109
+ `**Functional Requirements:**` label left with nothing under it is deleted — the rendered page rebuilds
110
+ the blocks from the rows. When the deletions are done, **put the surviving `##` sections in the
111
+ template's order and renumber them** — moving a whole section is a move, not an edit, and a file whose
112
+ `## 6` sits above its `## 4` tells the AI reader the numbers lie. The order — 1 Why This Initiative · 2 Target User · 3 Features · 4 MVP Scope · 5 Success
113
+ Metrics · 6 Cross-Cutting NFRs · 7 Constraints and Guardrails — and the `###` beneath them to match
114
+ (`### 8.2` → `### 4.2`). Numbers are not sentences; leaving `## 4. Features` beside `## 8. MVP Scope`
115
+ tells the next reader two sections went missing. A `UJ-N` the prose names that has no row in any requirement file is
116
+ not given one — it is marked with an HTML comment where it stands and reported; `wdi-product`
117
+ allocates ids. A moved sentence that cites a section number (`§ 8`) of a section this step deletes
118
+ keeps the number — it is reported as wording for the owner, not repointed, because its new home is a
119
+ judgment. `## 1. Vision` becomes `## 1. Why This Initiative`: delete only the sentences
120
+ that also appear, word for word, in the brief's `Why`; what remains is left whole under an HTML comment
121
+ saying the new shape wants a delta, because deciding which paraphrases are copies is the owner's. On a
122
+ single-initiative product that is one line pointing at the brief — write it and say so.
123
+
124
+ **5 — each SRS.** Every `| UC-` row MUST already be in `usecases.yaml` with the same `critical`. A row
125
+ missing there is landed first. Then the table becomes the template's pointer line.
126
+
127
+ **6 — each SDD.** In `## Inherited Constraints`, drop the `Quoted rule` column; keep `AD` and `How it
128
+ lands here`. In the blockquote shape, drop the `> ` lines and the `Quoted verbatim from` sentence; keep
129
+ the `**AD-N — title**` heading and the landing prose under it, each heading on its own line. An `AD-N`
130
+ cited here that is not in the spine is a finding.
131
+
132
+ **7 — C4 L2.** Every PC listed in the table MUST have that container in its `containers:`. Then the
133
+ table becomes the pointer line.
134
+
135
+ **8 — pointers at the moved pages.** Every `.md` that cites `.control/generated/brief.md`,
136
+ `blueprint.md`, or `prd-<slug>.md` **and that `cites-resolve` reads** is repointed to the new path — a
137
+ path substitution, nothing else in the sentence changes. That includes a product's own scratch and
138
+ issue notes. It excludes what the validator excludes: `.control/memlog/`, `.control/decisions/`,
139
+ `.control/reports/`, `questions/answered.md`, and `_bmad-output/` — those describe the past, and a
140
+ path rewritten there falsifies a record; the installer's probe skips them for the same reason.
141
+
142
+ ## Step 4 — Render, then validate
143
+
144
+ ```bash
145
+ uv run .constitution/method/scripts/validate.py --generate
146
+ ```
147
+
148
+ This writes every reader's page into `.what-rendered/` and `.how-rendered/`, and clears the human pages
149
+ that used to sit in `.control/generated/`. Then `--check` MUST be green. Every finding at this point is
150
+ either a row that moved wrong in Step 2 or a pointer that points at nothing — both are this skill's to
151
+ fix before it reports done.
152
+
153
+ ## Step 5 — Report, and commit once
154
+
155
+ What moved, file by file · what was landed into the registry, by id · what could not be placed and
156
+ needs the owner · the rendered pages now waiting to be read, one per gate · validators green. Then
157
+ **one** commit: `chore(method): upgrade <from> → <to>`. Not one per document — the upgrade is one
158
+ event.
159
+
160
+ ## Rules
161
+
162
+ - You MUST NOT change a sentence while moving it. Wording that reads wrong in its new home is a
163
+ finding for the owning skill, later.
164
+ - You MUST NOT invent a home. An `FR` no PRD cites, a Non-Goal neither boundary holds, an `AD-N` not
165
+ in the spine — each is reported by id and left where it was.
166
+ - You MUST NOT write your findings into the corpus. A registry file carries rows and nothing about
167
+ the upgrade that produced them; a gap in this skill goes in the Step 5 report. The one exception is
168
+ the HTML comment the steps above name, placed where the owner will read the document.
169
+ - You MUST NOT re-cut `specs.yaml`. That is `wdi-build`'s, where a human can see it.
170
+ - You MUST NOT touch `.control/decisions/` or `.control/reports/`. A frozen `DEC-` that cites `V26` or
171
+ `W3` is history; the alias rule in `corpus-guide.md` covers it.
172
+ - Re-running on an upgraded repo MUST find nothing and say so. Every probe in Step 1 is idempotent.
173
+
174
+ ## Output
175
+
176
+ The Step 1 checklist with each item marked done · skipped (already new shape) · left for the owner, with
177
+ the id list for the last · the registry rows landed · **statements landed / FR blocks that had a
178
+ paragraph** · consequences moved · `questions/` rows added and rows found already present · proof-of-done
179
+ divergences, both texts · the path of every rendered page · the validator result · the commit.
@@ -9,9 +9,28 @@ description: Use when UX is produced or landed — dispatching bmad-ux for a PRD
9
9
  came back, and — because `bmad-ux` is **class B** — lands its output into the two layers it splits
10
10
  across. No other skill MAY land these files.
11
11
 
12
- Two acts, and a pass MAY do either or both: **run** the UX, and **land** it. They are separated because
13
- they become possible at different moments. A run belongs to G2, where the PRD is fresh. Landing needs a
14
- Product Component to land into, and that list is not born until the tail of G2.
12
+ **A run needs a PRD and nothing else.** It MUST NOT wait for Product Components, and a skill that made
13
+ it wait would deadlock the whole flow: G2 reads `EXPERIENCE.md` `ux-guide.md` § Passing G2 and
14
+ `wdi-init` intent `component` requires **G2 passed**. UX before components is not a preference; it is the
15
+ only order that closes.
16
+
17
+ PRD → UX runs → **G2** → components born → G3
18
+
19
+ Two acts: **run** the UX, and **land** it. A run is complete the moment the three documents are written.
20
+ Landing is split by what each half's path actually needs, and only one half waits:
21
+
22
+ | Lands | Needs | So it lands |
23
+ |---|---|---|
24
+ | `design-system.md` → `.how/_platform/` | nothing but the run being final — it crosses components by definition | **immediately**, at G2 |
25
+ | `EXPERIENCE.md` → `.what/<pc>/04-usecases/` | the `<pc>` in its path to exist | when components are born |
26
+ | `DESIGN.md` → `.how/<pc>/01-ux/` + screen `LC` rows | the same `<pc>`. **Not a container** — see below | when components are born |
27
+
28
+ **The wait is a path, not a rule**, and it is the only one left: those two paths literally contain
29
+ `<pc>`, so there is nowhere to write them until a `<pc>` exists. Nothing else defers.
30
+
31
+ **And the wait is not the owner's to remember.** `wdi-init` intent `component` lands whatever is waiting
32
+ in `_bmad-output/ux/` in the same act as birthing the components — one pass, no tracked to-do. Report
33
+ what is waiting and name that act; do not ask the owner to come back.
15
34
 
16
35
  You MUST NOT write or edit `DESIGN.md` or `EXPERIENCE.md` yourself. If a check fails, name what is
17
36
  missing and re-dispatch — a hand-patched UX document makes the memlog lie about how it got that way.
@@ -81,7 +100,7 @@ Check what came back against the guide. Report every failure; fix none of them b
81
100
  | 9 | `bmad-review` structure + prose ran at finalize | `doc_standards` did not fire |
82
101
 
83
102
  Check 8 is the one that MUST be fixed immediately rather than reported. A `.memlog.md` inside `.what/`
84
- or `.how/` is corpus pollution, and V16 rejects it.
103
+ or `.how/` is corpus pollution, and `memlog-home` rejects it.
85
104
 
86
105
  ## Step 5 — Land, at two speeds
87
106
 
@@ -92,17 +111,22 @@ here is **when each one becomes possible**.
92
111
  |---|---|---|
93
112
  | Tokens and base components | `.how/_platform/design-system.md` | The run is final — it crosses components by definition |
94
113
  | `EXPERIENCE.md` | `.what/<pc>/04-usecases/` | The `<pc>` is registered in `components.yaml` |
95
- | `DESIGN.md` | `.how/<pc>/01-ux/` | The `<pc>` is registered **and** its container exists |
96
- | Each screen | an `LC` of type `ui-screen` in `components.yaml` | Same as `DESIGN.md` — an `LC` MUST name its container. Registration is checked at wave close, V12 |
97
-
98
- - A half that is not yet landable MUST stay in `_bmad-output/ux/` and be reported as deferred. At G2
99
- that is the normal outcome, not a failure: the slicing is born at the tail of G2 and containers at G3.
114
+ | `DESIGN.md` | `.how/<pc>/01-ux/` | The `<pc>` is registered. **The path has no container in it, so none is needed** |
115
+ | Each screen | an `LC` of type `ui-screen` in `components.yaml` | The `<pc>` is registered. `container:` is left **empty** and filled at G3 |
116
+
117
+ - **Nothing is deferred any more.** A run lands whole, in the pass that produced it. `DESIGN.md`
118
+ landing was coupled to the container because its screen `LC` rows need one but the *file's* path,
119
+ `.how/<pc>/01-ux/`, has no container in it, and the two were never the same requirement.
120
+ - **A screen `LC` is registered now with `container:` empty**, and MUST NOT be given a guessed one. `container-built`
121
+ is silent on an empty container until the `LC`'s own Product Component lists containers; from that
122
+ moment it is owed. `wdi-blueprint` intent `platform` fills every one of them in the same act as
123
+ registering the containers, so the debt closes at G3 without anyone tracking it.
100
124
  - You MUST NOT create a Product Component or a container to make a landing possible. A PC comes from
101
125
  `wdi-init` intent `component` and a container from `wdi-blueprint` intent `platform`.
102
126
  - One run MAY land across several Product Components. Split by which `<pc>` the content serves; a
103
127
  screen whose `<pc>` is ambiguous MUST be raised through `wdi-question`, not assigned by guess.
104
128
  - Registering the screens is part of landing `DESIGN.md`, in the same act. A screen in `01-ux/`
105
- without its `components.yaml` entry has been half-landed, and V12 catches it at a worse moment.
129
+ without its `components.yaml` entry has been half-landed, and `lc-registered` catches it at a worse moment.
106
130
  - `.how/_platform/` otherwise belongs to `wdi-blueprint`. `design-system.md` is the one file in it you
107
131
  own, and it has its own template; you MUST NOT touch any other.
108
132
  - The run folder MUST NOT be deleted after landing. Intent *update* reads it again.
@@ -133,7 +157,7 @@ Everything in a UX pass — the run and the landing — logs to `.control/memlog
133
157
  - You MUST NOT open G2 on UX that has not been through check 9. Gate time is for deciding.
134
158
  - You MUST NOT raise `status:` as part of landing. Status is a stage; the `reviewed:` block is an
135
159
  event, and `wdi-review` writes it.
136
- - You MUST NOT land anything into a wave that is already closed. The wave is reopened through
160
+ - You MUST NOT land anything into a spec that is already closed. The spec is reopened through
137
161
  `wdi-build`, or the gap is filed through `wdi-question`.
138
162
  - When the UX concludes the PRD promised something that cannot be made usable, say so and stop. Route
139
163
  to `wdi-product`; do not quietly narrow the promise in `EXPERIENCE.md`.
@@ -112,7 +112,7 @@ derived from the other: one component MAY be thin on purpose and reviewed the ha
112
112
  `.constitution/method/document/delivery-flow-guide.md` owns both;
113
113
  `.constitution/method/why/rationale.md` says why they are separate.
114
114
 
115
- ## The five gates and the fifteen skills
115
+ ## The five gates and the sixteen skills
116
116
 
117
117
  | Gate | Decides | Skill |
118
118
  |---|---|---|
@@ -137,7 +137,7 @@ verifies the result, and lands the memlog.
137
137
  fixed in the WDI Method package, then brought here with `npx wdi-method update`.
138
138
  - A file in `_bmad-output/prior-knowledge/` MUST NOT be copied into `.what/` or `.how/`. It enters
139
139
  the corpus only through the skill that owns the slot.
140
- - `.control/generated/` MUST NOT be written by hand — it is the output of `validate.py` and
140
+ - `.control/generated/`, `.what-rendered/`, and `.how-rendered/` MUST NOT be written by hand — they are the output of `validate.py` and
141
141
  `timeline.py`.
142
142
  - The two structure maps in `.control/` MUST NOT be edited by hand — `wdi-init` intent `structure`
143
143
  re-derives them.
@@ -1,75 +1,76 @@
1
- ---
2
- status: Reference
3
- ---
4
-
5
- # `.constitution/method/` — index
6
-
7
- `.constitution/` holds **exactly two folders**, and the folder is what says who owns a file:
8
-
9
- | Folder | Owner | `update` | `promote` |
10
- |---|---|---|---|
11
- | `method/` — you are in it | the method | **overwritten** in full | carries it into the package |
12
- | [`../project/`](../project/) | this product | **never touched** — seeded once when absent | never carries it, so your rules cannot be published |
13
-
14
- Load [`constitution.md`](constitution.md) and [`../project/constitution.md`](../project/constitution.md)
15
- before acting: Articles 3, 4, 6, 7 are here, Articles 1, 2, 5 are yours. Guides are loaded **lazily** —
16
- only when the task matches, and every guide states when on its own **Loaded when:** line.
17
-
18
- Every file here carries a `status:` — Article 4 owns the five values. Only `Accepted` binds;
19
- `Reference` explains and MUST NOT be cited to reject a change. A template carries no status of its
20
- own, because its frontmatter belongs to the artifact it produces.
21
-
22
- **A file this product adds MUST go in [`../project/`](../project/), not here** — anything in `method/`
23
- is replaced on the next update, without warning, because that is what `method/` means. This index is
24
- overwritten too.
25
-
26
- ## `why/` — the explanation, `status: Reference`
27
-
28
- Never a rule. When it disagrees with a guide, the guide wins and the disagreement is a defect.
29
-
30
- | File | Opened when |
31
- |---|---|
32
- | [`why/README.md`](why/README.md) | You want the whole shape in five minutes — five gates, two settings, fifteen skills, WDI ↔ BMad |
33
- | [`why/artifact-map.md`](why/artifact-map.md) | "Where does this file go", or "does this document exist at my `mode`" |
34
- | [`why/rationale.md`](why/rationale.md) | Before changing a rule, to know what you would break |
35
- | [`why/portability.md`](why/portability.md) | Which files are the method and which are the product; how promote and install move them |
36
-
37
- ## Cross-domain
38
-
39
- | File | Loaded when |
40
- |---|---|
41
- | [`repo-guide.md`](repo-guide.md) | Adding a file that is neither code nor corpus; the content boundary, `.work/`, cross-repo references |
42
- | [`language-guide.md`](language-guide.md) | Naming anything a code identifier, a code file, a document file |
43
- | [`method-glossary.md`](method-glossary.md) | Unsure what a method term means layer, wave, Product Component, ID code |
44
- | [`structure-guide.md`](structure-guide.md) | Writing or checking the two structure maps in `.control/` |
45
-
46
- ## `document/` — document rules
47
-
48
- | File | Governs |
49
- |---|---|
50
- | [`corpus-guide.md`](document/corpus-guide.md) | Where a file lives. Read before the other guides |
51
- | [`delivery-flow-guide.md`](document/delivery-flow-guide.md) | Five gates, `mode`, `risk_accepted`, the gate checklists, units of work, wave size, Fast Path, the story-closing checklist, change control |
52
- | [`bmad-guide.md`](document/bmad-guide.md) | How BMad skills are used here; classes A–D, the read-write map, memlog |
53
- | [`bmad-skill-register.md`](document/bmad-skill-register.md) | The installed BMad skills with the documents each reads and writes |
54
- | [`brief-guide.md`](document/brief-guide.md) · [`prd-guide.md`](document/prd-guide.md) · [`ux-guide.md`](document/ux-guide.md) | The G1 and G2 artifacts |
55
- | [`srs-guide.md`](document/srs-guide.md) · [`sdd-guide.md`](document/sdd-guide.md) | The G3 and G4 artifacts, per Product Component |
56
- | [`architecture-guide.md`](document/architecture-guide.md) | The architecture spine, `AD-N`, C4, and the three inventories |
57
- | [`decision-guide.md`](document/decision-guide.md) | `DEC-`: the one test for recording at all, shape, global numbering, the `draft accepted → applied` ladder, supersession |
58
- | [`templates/`](document/templates/) | Templates, one per kind of document; they MUST be copied, and MUST NOT be reproduced from memory |
59
-
60
- ## Code rules — in the room, not here
61
-
62
- All three are written by the **product**, so they live in [`../project/`](../project/) and no update
63
- touches them at any `status:`. While `Draft`, their contents MAY be read as guidance but MUST NOT be
64
- used to reject a change.
65
-
66
- [`stack-guide.md`](../project/codebase-stack-guide.md) · [`conventions-guide.md`](../project/codebase-conventions-guide.md) · [`brownfield-guide.md`](../project/codebase-brownfield-guide.md)
67
-
68
- ## `scripts/`
69
-
70
- `validate.py` — registry gates and the `.control/generated/` generator. `timeline.py` — the time
71
- dimension from git history. `inventory.py` — compares the three inventories against the code
72
- and reports the difference; it MUST NOT patch either side into agreement. It reads no code itself:
73
- the patterns live in `../project/inventory-readers.py`, because comparing is generic and reading a
74
- stack is not. That file ships as a skeleton and `wdi-init` intent `readers` writes it for the repo
75
- in front of it. All three run through `uv run`.
1
+ ---
2
+ status: Reference
3
+ ---
4
+
5
+ # `.constitution/method/` — index
6
+
7
+ `.constitution/` holds **exactly two folders**, and the folder is what says who owns a file:
8
+
9
+ | Folder | Owner | `update` | `promote` |
10
+ |---|---|---|---|
11
+ | `method/` — you are in it | the method | **overwritten** in full | carries it into the package |
12
+ | [`../project/`](../project/) | this product | **never touched** — seeded once when absent | never carries it, so your rules cannot be published |
13
+
14
+ Load [`constitution.md`](constitution.md) and [`../project/constitution.md`](../project/constitution.md)
15
+ before acting: Articles 3, 4, 6, 7 are here, Articles 1, 2, 5 are yours. Guides are loaded **lazily** —
16
+ only when the task matches, and every guide states when on its own **Loaded when:** line.
17
+
18
+ Every file here carries a `status:` — Article 4 owns the five values. Only `Accepted` binds;
19
+ `Reference` explains and MUST NOT be cited to reject a change. A template carries no status of its
20
+ own, because its frontmatter belongs to the artifact it produces.
21
+
22
+ **A file this product adds MUST go in [`../project/`](../project/), not here** — anything in `method/`
23
+ is replaced on the next update, without warning, because that is what `method/` means. This index is
24
+ overwritten too.
25
+
26
+ ## `why/` — the explanation, `status: Reference`
27
+
28
+ Never a rule. When it disagrees with a guide, the guide wins and the disagreement is a defect.
29
+
30
+ | File | Opened when |
31
+ |---|---|
32
+ | [`why/README.md`](why/README.md) | You want the whole shape in five minutes — five gates, two settings, sixteen skills, WDI ↔ BMad |
33
+ | [`why/artifact-map.md`](why/artifact-map.md) | "Where does this file go", or "does this document exist at my `mode`" |
34
+ | [`why/mode-risk-map.md`](why/mode-risk-map.md) | A `mode` and a `risk_accepted` are set and you want the two side by side — all twelve cells |
35
+ | [`why/rationale.md`](why/rationale.md) | Before changing a rule, to know what you would break |
36
+ | [`why/portability.md`](why/portability.md) | Which files are the method and which are the product; how promote and install move them |
37
+
38
+ ## Cross-domain
39
+
40
+ | File | Loaded when |
41
+ |---|---|
42
+ | [`repo-guide.md`](repo-guide.md) | Adding a file that is neither code nor corpus; the content boundary, `.work/`, cross-repo references |
43
+ | [`language-guide.md`](language-guide.md) | Naming anything a code identifier, a code file, a document file |
44
+ | [`method-glossary.md`](method-glossary.md) | Unsure what a method term means layer, wave, Product Component, ID code |
45
+ | [`structure-guide.md`](structure-guide.md) | Writing or checking the two structure maps in `.control/` |
46
+
47
+ ## `document/` — document rules
48
+
49
+ | File | Governs |
50
+ |---|---|
51
+ | [`corpus-guide.md`](document/corpus-guide.md) | Where a file lives. Read before the other guides |
52
+ | [`delivery-flow-guide.md`](document/delivery-flow-guide.md) | Five gates, `mode`, `risk_accepted`, the gate checklists, units of work, wave size, Fast Path, the story-closing checklist, change control |
53
+ | [`bmad-guide.md`](document/bmad-guide.md) | How BMad skills are used here; classes A–D, the read-write map, memlog |
54
+ | [`bmad-skill-register.md`](document/bmad-skill-register.md) | The installed BMad skills with the documents each reads and writes |
55
+ | [`brief-guide.md`](document/brief-guide.md) · [`prd-guide.md`](document/prd-guide.md) · [`ux-guide.md`](document/ux-guide.md) | The G1 and G2 artifacts |
56
+ | [`srs-guide.md`](document/srs-guide.md) · [`sdd-guide.md`](document/sdd-guide.md) | The G3 and G4 artifacts, per Product Component |
57
+ | [`architecture-guide.md`](document/architecture-guide.md) | The architecture spine, `AD-N`, C4, and the three inventories |
58
+ | [`decision-guide.md`](document/decision-guide.md) | `DEC-`: the one test for recording at all, shape, global numbering, the `draft accepted applied` ladder, supersession |
59
+ | [`templates/`](document/templates/) | Templates, one per kind of document; they MUST be copied, and MUST NOT be reproduced from memory |
60
+
61
+ ## Code rules — in the room, not here
62
+
63
+ All three are written by the **product**, so they live in [`../project/`](../project/) and no update
64
+ touches them at any `status:`. While `Draft`, their contents MAY be read as guidance but MUST NOT be
65
+ used to reject a change.
66
+
67
+ [`stack-guide.md`](../project/codebase-stack-guide.md) · [`conventions-guide.md`](../project/codebase-conventions-guide.md) · [`brownfield-guide.md`](../project/codebase-brownfield-guide.md)
68
+
69
+ ## `scripts/`
70
+
71
+ `validate.py` — registry gates and the `.control/generated/` generator. `timeline.py` the time
72
+ dimension from git history. `inventory.py` compares the three inventories against the code
73
+ and reports the difference; it MUST NOT patch either side into agreement. It reads no code itself:
74
+ the patterns live in `../project/inventory-readers.py`, because comparing is generic and reading a
75
+ stack is not. That file ships as a skeleton and `wdi-init` intent `readers` writes it for the repo
76
+ in front of it. All three run through `uv run`.
@@ -23,6 +23,7 @@ The repo layout is governed by `corpus-guide.md` and mapped by
23
23
  | `.control/` | Control — what currently holds and what has been decided |
24
24
  | `.what/` | What is promised |
25
25
  | `.how/` | How it is built |
26
+ | `.what-rendered/` · `.how-rendered/` | The two above, assembled for a human to read — one page per gate, at the mirror path. Regenerated by `validate.py`, never edited, never read by a skill |
26
27
  | `_bmad-output/` | Run workspace; committed, not curated |
27
28
  | `.work/` | Scratch; committed, emptied when a task closes |
28
29
  | *(application roots)* | Application code — named and mapped in `.control/structure-codebase.md` |
@@ -49,7 +50,7 @@ so a status there would land in the artifact and mean something else entirely.
49
50
  A missing header anywhere else is a **finding**, not an implicit anything.
50
51
 
51
52
  `Reference` exists so that the *explanation* of a rule can live beside the rule without competing with it —
52
- `method/why/` holds four such files. Where a `Reference` file and an `Accepted` one disagree, the `Accepted`
53
+ `method/why/` holds five such files. Where a `Reference` file and an `Accepted` one disagree, the `Accepted`
53
54
  one wins, and the disagreement MUST be reported as a defect rather than resolved by preferring whichever was
54
55
  opened first. A rule MUST NOT be born in a `Reference` file; when one is noticed there, it is stated as a
55
56
  finding and written in the guide that owns it.
@@ -28,7 +28,7 @@ them only an *example* does — not a rule.
28
28
  | `templates/design-system.md` | The pointer to wherever this project keeps its tokens | Re-point at that project's token file |
29
29
  | `templates/oq.md` | One example of a bad question title | Cosmetic |
30
30
 
31
- Everything else — the five gates, the two fields, the fifteen skills, the templates, `validate.py`,
31
+ Everything else — the five gates, the two fields, the sixteen skills, the templates, `validate.py`,
32
32
  `inventory.py`, `../method-glossary.md`, and the three files beside this one — carries without edit.
33
33
 
34
34
  One half-exception, and it is by design: `inventory.py` is the generic engine and carries whole, but
package/package.json CHANGED
@@ -1,43 +1,43 @@
1
- {
2
- "name": "wdi-method",
3
- "version": "0.5.13",
4
- "description": "WDI Method — software delivery method that wraps BMad",
5
- "type": "module",
6
- "bin": {
7
- "wdi-method": "bin/wdi-method.js"
8
- },
9
- "files": [
10
- "bin/",
11
- "lib/",
12
- "kit/",
13
- "kit-overlay/",
14
- "scaffold/",
15
- "README.md",
16
- "LICENSE",
17
- "!**/__pycache__",
18
- "!**/*.pyc"
19
- ],
20
- "engines": {
21
- "node": ">=20"
22
- },
23
- "scripts": {
24
- "test": "node --test tests/*.test.mjs",
25
- "prepublishOnly": "node --test tests/*.test.mjs",
26
- "overlay": "node scripts/apply-overlay.mjs",
27
- "pretest": "node scripts/apply-overlay.mjs && node scripts/clean-kit.mjs",
28
- "prepack": "node scripts/clean-kit.mjs",
29
- "clean": "node scripts/clean-kit.mjs"
30
- },
31
- "dependencies": {
32
- "@clack/prompts": "^1.7.0"
33
- },
34
- "license": "MIT",
35
- "repository": {
36
- "type": "git",
37
- "url": "git+https://github.com/wiradigitalid/wdi-method.git"
38
- },
39
- "bugs": {
40
- "url": "https://github.com/wiradigitalid/wdi-method/issues"
41
- },
42
- "homepage": "https://github.com/wiradigitalid/wdi-method#readme"
43
- }
1
+ {
2
+ "name": "wdi-method",
3
+ "version": "0.6.0",
4
+ "description": "WDI Method — software delivery method that wraps BMad",
5
+ "type": "module",
6
+ "bin": {
7
+ "wdi-method": "bin/wdi-method.js"
8
+ },
9
+ "files": [
10
+ "bin/",
11
+ "lib/",
12
+ "kit/",
13
+ "kit-overlay/",
14
+ "scaffold/",
15
+ "README.md",
16
+ "LICENSE",
17
+ "!**/__pycache__",
18
+ "!**/*.pyc"
19
+ ],
20
+ "engines": {
21
+ "node": ">=20"
22
+ },
23
+ "scripts": {
24
+ "test": "node --test tests/*.test.mjs",
25
+ "prepublishOnly": "node --test tests/*.test.mjs",
26
+ "overlay": "node scripts/apply-overlay.mjs",
27
+ "pretest": "node scripts/apply-overlay.mjs && node scripts/clean-kit.mjs",
28
+ "prepack": "node scripts/clean-kit.mjs",
29
+ "clean": "node scripts/clean-kit.mjs"
30
+ },
31
+ "dependencies": {
32
+ "@clack/prompts": "^1.7.0"
33
+ },
34
+ "license": "MIT",
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "git+https://github.com/wiradigitalid/wdi-method.git"
38
+ },
39
+ "bugs": {
40
+ "url": "https://github.com/wiradigitalid/wdi-method/issues"
41
+ },
42
+ "homepage": "https://github.com/wiradigitalid/wdi-method#readme"
43
+ }
@@ -5,7 +5,7 @@
5
5
  The SSOT for **product** vocabulary — what this product talks about. Every term is defined **once**
6
6
  here, then used as-is across the corpus.
7
7
 
8
- **Method** vocabulary lives in `.constitution/method-glossary.md` and MUST NOT be redefined here. The
8
+ **Method** vocabulary lives in `.constitution/method/method-glossary.md` and MUST NOT be redefined here. The
9
9
  split test: does this term still hold if used in another product? Yes → `method-glossary.md`, no →
10
10
  here.
11
11
 
@@ -0,0 +1,25 @@
1
+ # goals.yaml — SSOT for BG, the product's goals. Nothing else lives here.
2
+ #
3
+ # Keys are English; prose values follow the product's chosen `doc_language`.
4
+ #
5
+ # ONE FILE, ONE WRITER, ONE GATE. This file is `wdi-problem`'s, written at G1 when the brief lands.
6
+ # CAP, FR, NFR, and UJ all belong to an initiative instead, and live in
7
+ # `requirements-<slug>.yaml` — the slug being that PRD's own folder name under `.what/_prd/`.
8
+ # That file is `wdi-product`'s, written at G2.
9
+ #
10
+ # `CAP` is NOT here, and the reason is worth writing down because the opposite was tried first: a
11
+ # capability is declared by a feature, one feature is one capability, and a feature lives in exactly
12
+ # one PRD. The argument for keeping CAP at the product level was that `depends_on` between
13
+ # capabilities crosses initiatives — but that buys nothing, because every validator reads the MERGED
14
+ # view of all requirement files and never opens one by name. A cross-file `depends_on` resolves
15
+ # exactly as well as a same-file one.
16
+ #
17
+ # IDS ARE ALLOCATED ONCE AND THE SEQUENCE IS GLOBAL TO THE PRODUCT. `FR-12` means one thing in this
18
+ # repo no matter which file holds it — that is what lets a ticket say `satisfies: [FR-12]` without
19
+ # also naming the PRD. `id-allocated-once` fails when two files declare the same id.
20
+
21
+ goals: []
22
+ # - id: BG-1
23
+ # title: "one line, the outcome the product exists for"
24
+ # measure: "how you would know it held"
25
+ # why: "only when the reason is not already carried by the brief's The Problem"
@@ -16,7 +16,7 @@ product:
16
16
  # guarded + Failure Behaviour for every boundary, Inherited Constraints, integration documents
17
17
  # deep + ABCE, a contract spec per endpoint, data dictionary, flow, state machine, scenarios
18
18
  # Defaults to `catalog` when this line is absent. A component's own row in components.yaml WINS over this.
19
- # There is no third scope: `mode` MUST NOT be overridden per wave or per SPEC.md.
19
+ # There is no third scope: `mode` MUST NOT be overridden per spec or per `SPEC.md`.
20
20
  mode: catalog
21
21
 
22
22
  # GATES ALREADY PASSED. Written only by the repo owner's own decision at their own gate, and MUST NOT
@@ -38,9 +38,9 @@ question_budget:
38
38
  blocking_per_component: 3
39
39
  assumptions_per_gate: 15
40
40
 
41
- wave_sizes:
42
- S: { stories: "<=3", note: "no new FR; G4 and G5 merge into one 20-minute session" }
43
- M: { stories: "4-12", note: "as usual" }
44
- L: { stories: ">12", note: "or a new container; a retrospective runs" }
41
+ spec_sizes:
42
+ S: { tickets: "<=3", note: "no new FR; G4 and G5 merge into one session; no SPEC.md is written" }
43
+ M: { tickets: "4-12", note: "SPEC.md is written first — seams and testing decisions settled before tickets are cut" }
44
+ L: { tickets: ">12", note: "or a new container; otherwise as M" }
45
45
 
46
46
  touches_vocabulary: []