wdi-method 0.6.30 → 0.6.32

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 (43) hide show
  1. package/CHANGELOG.md +129 -0
  2. package/NOTICE +7 -2
  3. package/README.md +16 -11
  4. package/bin/wdi-method.js +396 -87
  5. package/kit/.constitution/method/document/architecture-guide.md +217 -209
  6. package/kit/.constitution/method/document/bmad-skill-register.md +107 -104
  7. package/kit/.constitution/method/document/corpus-guide.md +522 -517
  8. package/kit/.constitution/method/document/decision-guide.md +236 -216
  9. package/kit/.constitution/method/document/delivery-flow-guide.md +20 -0
  10. package/kit/.constitution/method/document/prd-guide.md +245 -245
  11. package/kit/.constitution/method/document/templates/design-system.md +96 -66
  12. package/kit/.constitution/method/document/templates/experience.md +62 -0
  13. package/kit/.constitution/method/document/templates/structure-codebase.md +131 -129
  14. package/kit/.constitution/method/document/templates/ux.md +78 -76
  15. package/kit/.constitution/method/document/ux-guide.md +161 -115
  16. package/kit/.constitution/method/method-glossary.md +3 -0
  17. package/kit/.constitution/method/scripts/validate.py +3375 -3200
  18. package/kit/.constitution/method/structure-guide.md +204 -202
  19. package/kit/.constitution/method/why/README.md +1 -1
  20. package/kit/.constitution/method/why/artifact-map.md +158 -157
  21. package/kit/.constitution/method/why/portability.md +19 -2
  22. package/kit/skills/wdi-autopilot/SKILL.md +32 -19
  23. package/kit/skills/wdi-blueprint/SKILL.md +271 -264
  24. package/kit/skills/wdi-build/SKILL.md +28 -19
  25. package/kit/skills/wdi-component/SKILL.md +179 -174
  26. package/kit/skills/wdi-daily-autopilot/SKILL.md +24 -13
  27. package/kit/skills/wdi-daily-what-to-build/SKILL.md +9 -6
  28. package/kit/skills/wdi-daily-what-to-test/SKILL.md +2 -0
  29. package/kit/skills/wdi-decision/SKILL.md +206 -203
  30. package/kit/skills/wdi-explain-to-me/SKILL.md +2 -0
  31. package/kit/skills/wdi-help/SKILL.md +130 -125
  32. package/kit/skills/wdi-init/SKILL.md +10 -5
  33. package/kit/skills/wdi-problem/SKILL.md +114 -108
  34. package/kit/skills/wdi-product/SKILL.md +167 -162
  35. package/kit/skills/wdi-prune-or-archive/SKILL.md +2 -0
  36. package/kit/skills/wdi-reconcile/SKILL.md +170 -169
  37. package/kit/skills/wdi-upgrade/SKILL.md +234 -215
  38. package/kit/skills/wdi-ux/SKILL.md +187 -169
  39. package/kit-overlay/AGENTS.md +15 -2
  40. package/kit-overlay/portability.md +19 -2
  41. package/lib/platforms.mjs +420 -248
  42. package/package.json +1 -1
  43. package/scaffold/.control/registry/index.yaml +2 -1
@@ -1,264 +1,271 @@
1
- ---
2
- name: wdi-blueprint
3
- description: Use at G3 Blueprint — the one whole-product portrait, written once. Two intents, catalog and platform. Owns the use case catalogue, actors, domain model, cross-component business rules, the glossary, the spine, C4, cross-cutting, and the three inventories. Never writes a single component's depth.
4
- ---
5
-
6
- # WDI Blueprint
7
-
8
- G3 decides **the whole portrait of the system**: which use cases exist, their entities, their tables, their
9
- endpoints, their screens, and the invariants that bind everything built from them. Once per product.
10
-
11
- Two intents, run in this order:
12
-
13
- | Intent | Writes | Wraps |
14
- |---|---|---|
15
- | `catalog` | Per `<pc>`: § Actor Register · § UC Catalogue · `03-domain/domain-model.md`. Product level: `.what/business-rules.md` · `.control/product-glossary.md` · `usecases.yaml` | `domain-modeling` |
16
- | `platform` | `.how/_platform/`: the spine · C4 L1/L2/L3 · `cross-cutting.md` · the three inventories. Registry: `containers` | `bmad-architecture` |
17
-
18
- **Blueprint content is untouched by `mode` and by `risk_accepted`.** Everything above exists at every mode,
19
- including `catalog`. That is what keeps the order non-circular: `mode` is first needed at G4.
20
-
21
- You MUST NOT write a single component's depth — full UC flows, local rules, failure behaviour, contracts. All
22
- of that is `wdi-component` at G4. You MUST NOT write a promise; when the blueprint proves a PRD wrong, that is
23
- `wdi-product`, not a quiet edit here.
24
-
25
- ## Inputs
26
-
27
- | Source | What it answers |
28
- |---|---|
29
- | `.what/_product-brief/brief.md` | The problem, the primary user, the boundary the portrait MUST respect |
30
- | `.what/_prd/*/prd.md` — **every one** | Every promise made: the `FR`/`NFR` the portrait has to cover |
31
- | `.control/registry/components.yaml` | Which components exist, and their `owns:` |
32
- | `.control/product-glossary.md` | Terms already fixed |
33
- | `.control/decisions/` | `accepted` and `applied` decisions an `AD-N` usually sits behind |
34
- | `src/` · `web/` | What actually runs, when this is not a new project |
35
- | `.constitution/method/document/srs-guide.md` · `architecture-guide.md` | The rules the result is checked against |
36
-
37
- ## Step 1 — Position
38
-
39
- - The components MUST already exist. If `components.yaml` holds no `product_components`, route to `wdi-init`
40
- intent `component` — the slicing is born at the tail of G2, from the brief plus every PRD.
41
- - `catalog` runs before `platform`. The spine is written against a portrait that exists.
42
- - If the spine and C4 set already exist, `platform` is an **amendment**, never a create. A second create
43
- overwrites what three specs of annotation put there.
44
- - If the ask is one component's mechanism or its full flows, route to `wdi-component`.
45
- - If the ask is what the product promises, route to `wdi-product` — an invariant is not a promise.
46
-
47
- ## Step 2 — Intent `catalog`, in order
48
-
49
- The order is binding, and each step is the input to the next. Writing them out of order produces use cases
50
- whose nouns nobody defined.
51
-
52
- 1. **Glossary.** Every domain noun, into `.control/product-glossary.md`, alphabetically, each citing the
53
- document and section its definition came from. You MUST NOT invent a definition — cite a source, or route
54
- the term to `wdi-question`. Two words meaning one thing is **drift**, and it MUST be resolved to one word
55
- in the same pass, with the losing synonym corrected in the documents that use it.
56
- 2. **UC Catalogue**, per component. One line per use case: `UC-N` · title · actor · the `FR` it satisfies ·
57
- `critical` yes/no. A title MUST be a sentence a user would say, not a system term.
58
- 3. **Actor Register**, per component. It stays in the SRS kernel; it is the SSOT the SDD mirrors.
59
- 4. **Domain model** — entities, relations, columns — into `.what/<pc>/03-domain/domain-model.md`. Conceptual;
60
- database column types belong to `.how/`.
61
- 5. **Cross-component business rules** into `.what/business-rules.md`. A rule binding only one component is
62
- G4 work and MUST NOT be written here.
63
-
64
- `critical` means the use case touches **money, personal data, or an irreversible action**. Nothing else. If
65
- the count passes a third of a component's use cases, derive it again — `delivery-flow-guide.md` owns the rule
66
- and it MUST NOT be negotiated.
67
-
68
- ### Domain modelling is active, and `domain-modeling` is its engine
69
-
70
- The domain model is not written by taking dictation. **You MUST invoke
71
- `domain-modeling`** to derive it, the same way the spine goes through
72
- `bmad-architecture` — this skill never does the deriving itself, it positions the engine, verifies the
73
- result against `srs-guide.md`, and lands it in this method's template.
74
-
75
- Four behaviours are what the engine is invoked for. Verify each one actually happened before landing
76
- anything; an engine run that produced none of them is a transcription, and the run MUST be reported as such:
77
-
78
- 1. **A term challenged the moment it conflicted** with what the glossary already defines.
79
- 2. **Fuzzy language split** — *"you said account: the Customer or the User?"* Two words for one thing is
80
- drift and Step 1 catches it. **One word for two things is worse and nothing else catches it**, because
81
- both readings survive review looking correct.
82
- 3. **Relationships stress-tested with invented edge scenarios.** This feeds two things asked for elsewhere
83
- here: the `critical` derivation, and the branches that become `05-scenarios/` at `deep`.
84
- 4. **The model cross-referenced against the code**, where code exists, with every contradiction surfaced.
85
- `wdi-reconcile` compares documents with documents and `inventory.py` compares the three inventories with
86
- code — **nothing else compares the domain model with the code.**
87
-
88
- #### Where it MUST NOT write, and which of its rules MUST NOT be followed
89
-
90
- It writes **as it goes, at the repo root**, by its own instruction — *"update `CONTEXT.md` right there,
91
- don't batch these up"* — creating its folders lazily. So its write location MUST be pointed at
92
- `_bmad-output/` **before** it starts, not corrected after. Four of its artifacts are class C working output
93
- here, and **none MUST be landed**:
94
-
95
- | Its artifact | Where the fact goes instead |
96
- |---|---|
97
- | `CONTEXT.md` — its own rule makes it *"a glossary and nothing else"*, so the mapping is exact | `.control/product-glossary.md` |
98
- | `CONTEXT-MAP.md` — where each bounded context lives | `components.yaml` + the two structure maps |
99
- | `docs/adr/` — **Article 3** forbids a `docs/` layer for corpus or rules outright | `.control/decisions/` |
100
- | An ADR file — the name is retired here | a `DEC-` through `wdi-decision` |
101
-
102
- **Its ADR test is narrower than ours and MUST NOT be used.** It offers an ADR only when a decision is hard
103
- to reverse **and** surprising **and** the result of a real trade-off. `decision-guide.md` asks one question
104
- instead — *"in three months, is the answer readable from the code?"* — which deliberately keeps the decisions
105
- that sound small. So it will stay silent on decisions this method wants recorded: apply our test to what it
106
- surfaces, and MUST NOT read its silence as *"nothing worth recording happened"*.
107
-
108
- #### When it is not installed
109
-
110
- `bmad-guide.md` §*When an engine earns being invoked at all* owns the general rule. For this engine: it is a
111
- **plugin, not part of this package's install**, so its absence is a real state and not a defect. Report it
112
- once, name the four behaviours above as the standard the derivation is still held to, and carry them out
113
- here. You MUST NOT block G3 on a missing plugin, and you MUST NOT report its absence as a finding.
114
-
115
- #### What lands, whatever produced it
116
-
117
- The entity table's `Code name` and `Never called` columns, plus the glossary entry each row cites —
118
- `language-guide.md` owns which language the code name is written in. And one rule holds regardless of engine:
119
- **the conceptual layer stays conceptual.** A column type appearing in `03-domain/` means the model has
120
- quietly become physical, and `templates/model.md` owns that.
121
-
122
- **A method term MUST NOT be written into `.constitution/method/method-glossary.md`.** A product term binds one
123
- project; a method term binds every project the method is installed in. Raise it as a proposal, state where it
124
- appeared and why the existing vocabulary does not cover it, and hand it to the owner.
125
-
126
- ## Step 3 — Parallel where there is a key, serial where there is not
127
-
128
- This is not theory. In the previous run, 41 cross-component business rules from seven parallel agents had to
129
- be merged and de-duplicated **serially**, because the target file had no key — and that merge was the most
130
- expensive part of the pass.
131
-
132
- > Parallel fan-out is only for output with a natural key. Output that is a shared list with no key MUST be
133
- > written by one agent that reads the whole input.
134
-
135
- | Work | Parallel? | Key |
136
- |---|---|---|
137
- | UC catalogue, actors, entities per component | yes | Product Component |
138
- | Glossary, cross-component business rules, the spine | **no** | there is none |
139
- | The three inventories | yes, one agent per source | table · endpoint · screen |
140
-
141
- Three guards when running parallel: each agent writes only its own keyed file; shared files are written in one
142
- serial pass afterwards; the owner reviews the merged result, not N agent reports. Open questions from N agents
143
- arrive as **one** ranked batch.
144
-
145
- ## Step 4 — Intent `platform`
146
-
147
- Dispatch `bmad-architecture` at **initiative** altitude for the spine. Do not restate the rules to it — they
148
- arrive through `persistent_facts` in `_bmad/custom/bmad-architecture.toml`, which installs
149
- `architecture-guide.md` there rather than as `doc_standards` deliberately.
150
-
151
- Then verify and land:
152
-
153
- | # | Check | Fails when |
154
- |---|---|---|
155
- | 1 | Home | The spine landed anywhere but `.how/_platform/ARCHITECTURE-SPINE.md` |
156
- | 2 | Every `AD-N` carries Binds, Prevents, and Rule | One is blank — an `AD-N` with no Prevents is a preference |
157
- | 3 | Every `AD-N` is an invariant | Breaking it in one component would not break another. It is a seed, and MUST be marked as one |
158
- | 4 | Stack, tree, and data shapes marked as seeds | Written as contracts, which makes the spine wrong at the first upgrade |
159
- | 5 | No alternatives or cost in the spine | Those live in the `DEC-` behind it; a second copy drifts |
160
- | 6 | Nothing but invariants | A statement affecting one component only — that is its SDD |
161
- | 7 | Memlog at `.control/memlog/spine.md` | A `.memlog.md` appeared inside `.how/` — `--workspace` was used |
162
-
163
- Check 7 MUST be fixed immediately. `memlog-home` rejects a memlog inside the corpus.
164
-
165
- **Land the C4 set by amending, never overwriting.** The files are living and already carry annotations,
166
- including a pre-method provenance note that MUST survive. When the incoming set contradicts an annotation
167
- already there, you MUST stop and report it, and MUST NOT resolve it by preferring the newer drawing. Where a
168
- C4 file and the spine disagree, the spine wins and the disagreement MUST be reported. One
169
- `c4-l3-<container>.md` per `built: true` container **holding more than one Product Component**. A
170
- `built: false` container gets no L3 at all, and a one-PC container needs none because the L2 matrix already
171
- places it. **Not one of the three waits for a spec** — `architecture-guide.md` owns that.
172
-
173
- **Register the containers** in `containers:` in `components.yaml`, in the same act as landing the L2. It is
174
- not a follow-up.
175
-
176
- **And fill every `LC` whose `container:` is empty, in that same act.** Screens registered by `wdi-ux` at
177
- G2 are born without one on purpose — containers do not exist yet — and this is the moment the answer
178
- does. `container-built` starts demanding it as soon as a Product Component lists containers, so filling it here is what
179
- keeps the board clean without anyone tracking a to-do.
180
-
181
- Each container MUST carry `built:` — `true` when we write what is inside it, `false` when we deploy
182
- someone else's implementation. It decides whether the container gets an L3, an `LC`, and a heading in the
183
- codebase map (`container-built`). Something whose **runtime we do not deploy** is an external system: it belongs at L1,
184
- and registering it here promises a codebase-map section that will never exist.
185
-
186
- **Fill each PC's `containers:` in the same act, and land the matrix at L2** — the registry is the SSOT and
187
- the L2 table renders it. A PC MUST list every `built: true` container it lives in; listing only the main
188
- one is the error the matrix exists to catch. Complete for every PC at G3, untouched by `mode`.
189
-
190
- You MUST NOT register a
191
- `product_component` or a `logical_component`.
192
-
193
- **Register what `_platform` owns** in the same pass — a domain entity through `platform_owns`, an inventory
194
- row through that inventory's `platform_rows:`, an `LC` through its `component:`. The test is in
195
- `corpus-guide.md` and both halves MUST hold. Each one MUST then be described under `## Platform-owned` in
196
- `cross-cutting.md`, in the same act: `entity-one-writer` checks that second half, because owning something without
197
- documenting it is taking ownership without taking responsibility.
198
-
199
- A judgement the pattern cannot derive MUST live in the artifact it governs, not in a script and not in a
200
- skill: an inventory's `platform_rows:` and `states:` are declared in that inventory's own frontmatter, so
201
- re-derivation preserves them. Anywhere else, the next run deletes the owner's decision.
202
-
203
- `_platform` is **not** a Product Component. You MUST NOT give it a `mode`, a `risk_accepted`, an SRS, or a
204
- G4, and you MUST NOT move an entity there because its owner is hard to decide.
205
-
206
- ## Step 5 — The three inventories
207
-
208
- They land in `.how/_platform/` with **one owner: this skill.** No negotiation with `wdi-ux`, and no second
209
- copy inside any SDD.
210
-
211
- | State | How each is born |
212
- |---|---|
213
- | No code yet | Written as a **plan** — the tables, endpoints, and screens intended. Nothing can be derived, because there is no source |
214
- | Code exists | **Derived first** by `.constitution/method/scripts/inventory.py`, which reads this product's patterns from `.constitution/project/inventory-readers.py`, then compares with the plan. The difference is a **finding**, not hand work. A product with no reader file is told so and nothing is derived — it is never guessed |
215
-
216
- An inventory MUST NOT be assembled from a README or from route names that look plausible. Numbers are stable:
217
- a new row takes the next number, never a renumber.
218
-
219
- ## Step 6 — The roll-up, and what the owner actually reads
220
-
221
- Regenerate `.how-rendered/blueprint.md` with `validate.py --generate`. It assembles the UC catalogue, the
222
- actor lists, the domain model, and the three inventories into **one page**.
223
-
224
- **That page is what G3 reviews** — not seven files. The catalogue and actors stay in their component kernels as
225
- their permanent home; the roll-up is a view. One fact, one home, one view.
226
-
227
- You MUST NOT hand-write anything under `.control/generated/`, `.what-rendered/`, or `.how-rendered/`.
228
-
229
- ## Step 7 — Review and questions
230
-
231
- - No `doc_standards` fires for an SRS or for the spine. Dispatch `wdi-review`, which reads the lens set from
232
- each component's `risk_accepted`.
233
- - You MUST NOT open G3 on a portrait that has not been through it.
234
- - Every unresolved to-be-confirmed MUST be filed through `wdi-question`, in **one** ranked batch — into
235
- `assumptions.md` by default, `blocking.md` only through its three tests.
236
- - A decision surfacing while writing is **written into the document as its own content** — stated as what
237
- now holds, present tense. Never as a parenthetical aside, and never routed to `wdi-decision` merely for
238
- being a decision: that is only for one with no home here at all, or one touching an `AD-N`.
239
- - An `AD-N` that reverses or narrows an earlier one MUST go through `wdi-decision` first. Editing an `AD-N` in
240
- place is how a reversal happens with nobody deciding it.
241
-
242
- ## Step 8 — A PRD that arrives after G3
243
-
244
- The blueprint is **living and amended**, not repeated. `wdi-init` intent `component` births the new
245
- components, this skill adds their rows to the catalogue and the three inventories, and **G3 reopens over the
246
- delta only**. The 45-minute session does not run again for one additional initiative.
247
-
248
- ## Rules
249
-
250
- - You MUST NOT write into `.how/<pc>/`, and `design-system.md` in `_platform/` belongs to `wdi-ux`.
251
- - You MUST NOT regenerate the C4 set from scratch. The loss of annotations is invisible in a diff that reads
252
- as a rewrite.
253
- - You MUST NOT raise `status:`. Status is a stage; the `reviewed:` block is an event.
254
- - You MUST NOT write a definition into `.constitution/` at all — not the method glossary, not a guide.
255
- - When the portrait cannot be drawn because a PRD has not settled what it must cover, say so and stop.
256
- - Memlog: one per Product Component at `.control/memlog/<pc>.md`, plus `.control/memlog/spine.md` for
257
- `platform`, through `memlog.py --path`. `--workspace` MUST NOT be used.
258
-
259
- ## Output
260
-
261
- Intents run · the catalogue and inventories as counts, per component · glossary terms written, proposed, and
262
- rejected with the rule that rejected each · the `AD-N` that are new or changed · what was amended in the C4
263
- set and what contradicted it · containers registered · plan-versus-code differences reported · whether the
264
- roll-up regenerated and `wdi-review` ran · the one ranked batch of questions.
1
+ ---
2
+ name: wdi-blueprint
3
+ description: Use at G3 Blueprint — the one whole-product portrait, written once. Two intents, catalog and platform. Owns the use case catalogue, actors, domain model, cross-component business rules, the glossary, the spine, C4, cross-cutting, and the three inventories. Never writes a single component's depth.
4
+ ---
5
+
6
+ # WDI Blueprint
7
+
8
+ G3 decides **the whole portrait of the system**: which use cases exist, their entities, their tables, their
9
+ endpoints, their screens, and the invariants that bind everything built from them. Once per product.
10
+
11
+ Two intents, run in this order:
12
+
13
+ | Intent | Writes | Wraps |
14
+ |---|---|---|
15
+ | `catalog` | Per `<pc>`: § Actor Register · § UC Catalogue · `03-domain/domain-model.md`. Product level: `.what/business-rules.md` · `.control/product-glossary.md` · `usecases.yaml` | `domain-modeling` |
16
+ | `platform` | `.how/_platform/`: the spine · C4 L1/L2/L3 · `cross-cutting.md` · the three inventories. Registry: `containers` | `bmad-architecture` |
17
+
18
+ **Blueprint content is untouched by `mode` and by `risk_accepted`.** Everything above exists at every mode,
19
+ including `catalog`. That is what keeps the order non-circular: `mode` is first needed at G4.
20
+
21
+ You MUST NOT write a single component's depth — full UC flows, local rules, failure behaviour, contracts. All
22
+ of that is `wdi-component` at G4. You MUST NOT write a promise; when the blueprint proves a PRD wrong, that is
23
+ `wdi-product`, not a quiet edit here.
24
+
25
+ ## Inputs
26
+
27
+ | Source | What it answers |
28
+ |---|---|
29
+ | `.what/_product-brief/brief.md` | The problem, the primary user, the boundary the portrait MUST respect |
30
+ | `.what/_prd/*/prd.md` — **every one** | Every promise made: the `FR`/`NFR` the portrait has to cover |
31
+ | `.control/registry/components.yaml` | Which components exist, and their `owns:` |
32
+ | `.control/product-glossary.md` | Terms already fixed |
33
+ | `.control/decisions/` | `accepted` and `applied` decisions an `AD-N` usually sits behind |
34
+ | `src/` · `web/` | What actually runs, when this is not a new project |
35
+ | `.constitution/method/document/srs-guide.md` · `architecture-guide.md` | The rules the result is checked against |
36
+
37
+ ## Step 1 — Position
38
+
39
+ - The components MUST already exist. If `components.yaml` holds no `product_components`, route to `wdi-init`
40
+ intent `component` — the slicing is born at the tail of G2, from the brief plus every PRD.
41
+ - `G2` MUST be in `gates_passed`. When it is not, ask the owner whether G2 passed; the components existing
42
+ is not the answer.
43
+ - `catalog` runs before `platform`. The spine is written against a portrait that exists.
44
+ - If the spine and C4 set already exist, `platform` is an **amendment**, never a create. A second create
45
+ overwrites what three specs of annotation put there.
46
+ - If the ask is one component's mechanism or its full flows, route to `wdi-component`.
47
+ - If the ask is what the product promises, route to `wdi-product` — an invariant is not a promise.
48
+
49
+ ## Step 2 — Intent `catalog`, in order
50
+
51
+ The order is binding, and each step is the input to the next. Writing them out of order produces use cases
52
+ whose nouns nobody defined.
53
+
54
+ 1. **Glossary.** Every domain noun, into `.control/product-glossary.md`, alphabetically, each citing the
55
+ document and section its definition came from. You MUST NOT invent a definition — cite a source, or route
56
+ the term to `wdi-question`. Two words meaning one thing is **drift**, and it MUST be resolved to one word
57
+ in the same pass, with the losing synonym corrected in the documents that use it.
58
+ 2. **UC Catalogue**, per component. One line per use case: `UC-N` · title · actor · the `FR` it satisfies ·
59
+ `critical` yes/no. A title MUST be a sentence a user would say, not a system term.
60
+ 3. **Actor Register**, per component. It stays in the SRS kernel; it is the SSOT the SDD mirrors.
61
+ 4. **Domain model** — entities, relations, columns — into `.what/<pc>/03-domain/domain-model.md`. Conceptual;
62
+ database column types belong to `.how/`.
63
+ 5. **Cross-component business rules** into `.what/business-rules.md`. A rule binding only one component is
64
+ G4 work and MUST NOT be written here.
65
+
66
+ `critical` means the use case touches **money, personal data, or an irreversible action**. Nothing else. If
67
+ the count passes a third of a component's use cases, derive it again — `delivery-flow-guide.md` owns the rule
68
+ and it MUST NOT be negotiated.
69
+
70
+ ### Domain modelling is active, and `domain-modeling` is its engine
71
+
72
+ The domain model is not written by taking dictation. **You MUST invoke
73
+ `domain-modeling`** to derive it, the same way the spine goes through
74
+ `bmad-architecture` — this skill never does the deriving itself, it positions the engine, verifies the
75
+ result against `srs-guide.md`, and lands it in this method's template.
76
+
77
+ Four behaviours are what the engine is invoked for. Verify each one actually happened before landing
78
+ anything; an engine run that produced none of them is a transcription, and the run MUST be reported as such:
79
+
80
+ 1. **A term challenged the moment it conflicted** with what the glossary already defines.
81
+ 2. **Fuzzy language split** — *"you said account: the Customer or the User?"* Two words for one thing is
82
+ drift and Step 1 catches it. **One word for two things is worse and nothing else catches it**, because
83
+ both readings survive review looking correct.
84
+ 3. **Relationships stress-tested with invented edge scenarios.** This feeds two things asked for elsewhere
85
+ here: the `critical` derivation, and the branches that become `05-scenarios/` at `deep`.
86
+ 4. **The model cross-referenced against the code**, where code exists, with every contradiction surfaced.
87
+ `wdi-reconcile` compares documents with documents and `inventory.py` compares the three inventories with
88
+ code — **nothing else compares the domain model with the code.**
89
+
90
+ #### Where it MUST NOT write, and which of its rules MUST NOT be followed
91
+
92
+ It writes **as it goes, at the repo root**, by its own instruction — *"update `CONTEXT.md` right there,
93
+ don't batch these up"* — creating its folders lazily. So its write location MUST be pointed at
94
+ `_bmad-output/` **before** it starts, not corrected after. Four of its artifacts are class C working output
95
+ here, and **none MUST be landed**:
96
+
97
+ | Its artifact | Where the fact goes instead |
98
+ |---|---|
99
+ | `CONTEXT.md` — its own rule makes it *"a glossary and nothing else"*, so the mapping is exact | `.control/product-glossary.md` |
100
+ | `CONTEXT-MAP.md` — where each bounded context lives | `components.yaml` + the two structure maps |
101
+ | `docs/adr/` — **Article 3** forbids a `docs/` layer for corpus or rules outright | `.control/decisions/` |
102
+ | An ADR file — the name is retired here | a `DEC-` through `wdi-decision` |
103
+
104
+ **Its ADR test is narrower than ours and MUST NOT be used.** It offers an ADR only when a decision is hard
105
+ to reverse **and** surprising **and** the result of a real trade-off. `decision-guide.md` asks one question
106
+ instead — *"in three months, is the answer readable from the code?"* — which deliberately keeps the decisions
107
+ that sound small. So it will stay silent on decisions this method wants recorded: apply our test to what it
108
+ surfaces, and MUST NOT read its silence as *"nothing worth recording happened"*.
109
+
110
+ #### When it is not installed
111
+
112
+ `bmad-guide.md` §*When an engine earns being invoked at all* owns the general rule. For this engine: it is a
113
+ **plugin, not part of this package's install**, so its absence is a real state and not a defect. Report it
114
+ once, name the four behaviours above as the standard the derivation is still held to, and carry them out
115
+ here. You MUST NOT block G3 on a missing plugin, and you MUST NOT report its absence as a finding.
116
+
117
+ #### What lands, whatever produced it
118
+
119
+ The entity table's `Code name` and `Never called` columns, plus the glossary entry each row cites —
120
+ `language-guide.md` owns which language the code name is written in. And one rule holds regardless of engine:
121
+ **the conceptual layer stays conceptual.** A column type appearing in `03-domain/` means the model has
122
+ quietly become physical, and `templates/model.md` owns that.
123
+
124
+ **A method term MUST NOT be written into `.constitution/method/method-glossary.md`.** A product term binds one
125
+ project; a method term binds every project the method is installed in. Raise it as a proposal, state where it
126
+ appeared and why the existing vocabulary does not cover it, and hand it to the owner.
127
+
128
+ ## Step 3 — Parallel where there is a key, serial where there is not
129
+
130
+ This is not theory. In the previous run, 41 cross-component business rules from seven parallel agents had to
131
+ be merged and de-duplicated **serially**, because the target file had no key — and that merge was the most
132
+ expensive part of the pass.
133
+
134
+ > Parallel fan-out is only for output with a natural key. Output that is a shared list with no key MUST be
135
+ > written by one agent that reads the whole input.
136
+
137
+ | Work | Parallel? | Key |
138
+ |---|---|---|
139
+ | UC catalogue, actors, entities per component | yes | Product Component |
140
+ | Glossary, cross-component business rules, the spine | **no** | there is none |
141
+ | The three inventories | yes, one agent per source | table · endpoint · screen |
142
+
143
+ Three guards when running parallel: each agent writes only its own keyed file; shared files are written in one
144
+ serial pass afterwards; the owner reviews the merged result, not N agent reports. Open questions from N agents
145
+ arrive as **one** ranked batch.
146
+
147
+ ## Step 4 — Intent `platform`
148
+
149
+ Dispatch `bmad-architecture` at **initiative** altitude for the spine. Do not restate the rules to it — they
150
+ arrive through `persistent_facts` in `_bmad/custom/bmad-architecture.toml`, which installs
151
+ `architecture-guide.md` there rather than as `doc_standards` deliberately.
152
+
153
+ Then verify and land:
154
+
155
+ | # | Check | Fails when |
156
+ |---|---|---|
157
+ | 1 | Home | The spine landed anywhere but `.how/_platform/ARCHITECTURE-SPINE.md` |
158
+ | 2 | Every `AD-N` carries Binds, Prevents, and Rule | One is blank — an `AD-N` with no Prevents is a preference |
159
+ | 3 | Every `AD-N` is an invariant | Breaking it in one component would not break another. It is a seed, and MUST be marked as one |
160
+ | 4 | Stack, tree, and data shapes marked as seeds | Written as contracts, which makes the spine wrong at the first upgrade |
161
+ | 5 | No alternatives or cost in the spine | Those live in the `DEC-` behind it; a second copy drifts |
162
+ | 6 | Nothing but invariants | A statement affecting one component only — that is its SDD |
163
+ | 7 | Memlog at `.control/memlog/spine.md` | A `.memlog.md` appeared inside `.how/` — `--workspace` was used |
164
+
165
+ Check 7 MUST be fixed immediately. `memlog-home` rejects a memlog inside the corpus.
166
+
167
+ **Land the C4 set by amending, never overwriting.** The files are living and already carry annotations,
168
+ including a pre-method provenance note that MUST survive. When the incoming set contradicts an annotation
169
+ already there, you MUST stop and report it, and MUST NOT resolve it by preferring the newer drawing. Where a
170
+ C4 file and the spine disagree, the spine wins and the disagreement MUST be reported. One
171
+ `c4-l3-<container>.md` per `built: true` container **holding more than one Product Component**. A
172
+ `built: false` container gets no L3 at all, and a one-PC container needs none because the L2 matrix already
173
+ places it. **Not one of the three waits for a spec** — `architecture-guide.md` owns that.
174
+
175
+ **Register the containers** in `containers:` in `components.yaml`, in the same act as landing the L2. It is
176
+ not a follow-up.
177
+
178
+ **And fill every `LC` whose `container:` is empty, in that same act.** Screens registered by `wdi-ux` at
179
+ G2 are born without one on purpose — containers do not exist yet — and this is the moment the answer
180
+ does. `container-built` starts demanding it as soon as a Product Component lists containers, so filling it here is what
181
+ keeps the board clean without anyone tracking a to-do.
182
+
183
+ Each container MUST carry `built:` — `true` when we write what is inside it, `false` when we deploy
184
+ someone else's implementation. It decides whether the container gets an L3, an `LC`, and a heading in the
185
+ codebase map (`container-built`). Something whose **runtime we do not deploy** is an external system: it belongs at L1,
186
+ and registering it here promises a codebase-map section that will never exist.
187
+
188
+ **Fill each PC's `containers:` in the same act, and land the matrix at L2** — the registry is the SSOT and
189
+ the L2 table renders it. A PC MUST list every `built: true` container it lives in; listing only the main
190
+ one is the error the matrix exists to catch. Complete for every PC at G3, untouched by `mode`.
191
+
192
+ You MUST NOT register a
193
+ `product_component` or a `logical_component`.
194
+
195
+ **Register what `_platform` owns** in the same pass — a domain entity through `platform_owns`, an inventory
196
+ row through that inventory's `platform_rows:`, an `LC` through its `component:`. The test is in
197
+ `corpus-guide.md` and both halves MUST hold. Each one MUST then be described under `## Platform-owned` in
198
+ `cross-cutting.md`, in the same act: `entity-one-writer` checks that second half, because owning something without
199
+ documenting it is taking ownership without taking responsibility.
200
+
201
+ A judgement the pattern cannot derive MUST live in the artifact it governs, not in a script and not in a
202
+ skill: an inventory's `platform_rows:` and `states:` are declared in that inventory's own frontmatter, so
203
+ re-derivation preserves them. Anywhere else, the next run deletes the owner's decision.
204
+
205
+ `_platform` is **not** a Product Component. You MUST NOT give it a `mode`, a `risk_accepted`, an SRS, or a
206
+ G4, and you MUST NOT move an entity there because its owner is hard to decide.
207
+
208
+ ## Step 5 — The three inventories
209
+
210
+ They land in `.how/_platform/` with **one owner: this skill.** No negotiation with `wdi-ux`, and no second
211
+ copy inside any SDD.
212
+
213
+ | State | How each is born |
214
+ |---|---|
215
+ | No code yet | Written as a **plan** — the tables, endpoints, and screens intended. Nothing can be derived, because there is no source |
216
+ | Code exists | **Derived first** by `.constitution/method/scripts/inventory.py`, which reads this product's patterns from `.constitution/project/inventory-readers.py`, then compares with the plan. The difference is a **finding**, not hand work. A product with no reader file is told so and nothing is derived — it is never guessed |
217
+
218
+ An inventory MUST NOT be assembled from a README or from route names that look plausible. Numbers are stable:
219
+ a new row takes the next number, never a renumber.
220
+
221
+ ## Step 6 — The roll-up, and what the owner actually reads
222
+
223
+ Regenerate `.how-rendered/blueprint.md` with `validate.py --generate`. It assembles the UC catalogue, the
224
+ actor lists, the domain model, and the three inventories into **one page**.
225
+
226
+ **That page is what G3 reviews** — not seven files. The catalogue and actors stay in their component kernels as
227
+ their permanent home; the roll-up is a view. One fact, one home, one view.
228
+
229
+ You MUST NOT hand-write anything under `.control/generated/`, `.what-rendered/`, or `.how-rendered/`.
230
+
231
+ ## Step 7 — Review and questions
232
+
233
+ - No `doc_standards` fires for an SRS or for the spine. Dispatch `wdi-review`, which reads the lens set from
234
+ each component's `risk_accepted`.
235
+ - You MUST NOT open G3 on a portrait that has not been through it.
236
+ - Every unresolved to-be-confirmed MUST be filed through `wdi-question`, in **one** ranked batch — into
237
+ `assumptions.md` by default, `blocking.md` only through its three tests.
238
+ - A decision surfacing while writing is **written into the document as its own content** — stated as what
239
+ now holds, present tense. Never as a parenthetical aside, and never routed to `wdi-decision` merely for
240
+ being a decision: that is only for one with no home here at all, or one touching an `AD-N`.
241
+ - An `AD-N` that reverses or narrows an earlier one MUST go through `wdi-decision` first. Editing an `AD-N` in
242
+ place is how a reversal happens with nobody deciding it.
243
+
244
+ ## Step 8 — Record the gate
245
+
246
+ Ask the owner whether G3 passed. Write `G3` into `gates_passed` only on their explicit *yes* —
247
+ `delivery-flow-guide.md` § *Recording a gate that passed*. `wdi-component` reads it next.
248
+
249
+ ## Step 9 — A PRD that arrives after G3
250
+
251
+ The blueprint is **living and amended**, not repeated. `wdi-init` intent `component` births the new
252
+ components, this skill adds their rows to the catalogue and the three inventories, and **G3 reopens over the
253
+ delta only**. The 45-minute session does not run again for one additional initiative.
254
+
255
+ ## Rules
256
+
257
+ - You MUST NOT write into `.how/<pc>/`. `design-system.md` in `_platform/` and `.what/experience.md` belong to `wdi-ux`.
258
+ - You MUST NOT regenerate the C4 set from scratch. The loss of annotations is invisible in a diff that reads
259
+ as a rewrite.
260
+ - You MUST NOT raise `status:`. Status is a stage; the `reviewed:` block is an event.
261
+ - You MUST NOT write a definition into `.constitution/` at all — not the method glossary, not a guide.
262
+ - When the portrait cannot be drawn because a PRD has not settled what it must cover, say so and stop.
263
+ - Memlog: one per Product Component at `.control/memlog/<pc>.md`, plus `.control/memlog/spine.md` for
264
+ `platform`, through `memlog.py --path`. `--workspace` MUST NOT be used.
265
+
266
+ ## Output
267
+
268
+ Intents run · the catalogue and inventories as counts, per component · glossary terms written, proposed, and
269
+ rejected with the rule that rejected each · the `AD-N` that are new or changed · what was amended in the C4
270
+ set and what contradicted it · containers registered · plan-versus-code differences reported · whether the
271
+ roll-up regenerated and `wdi-review` ran · the one ranked batch of questions · whether G3 was recorded.