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
@@ -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
@@ -6,6 +6,11 @@ status: Reference
6
6
 
7
7
  **Opened when:** you are about to change a rule and need to know what you would break.
8
8
 
9
+ `wave` and `story` appear below wherever this file records **what happened** — a past incident, a repealed
10
+ ceremony, a skill's old name. Those are evidence and MUST NOT be rewritten into `spec` and `ticket`;
11
+ `../method-glossary.md` owns that rule. Where this file states a rule still in force, it uses the current
12
+ terms.
13
+
9
14
  This file **explains**. It does not bind — `../document/*-guide.md` does, and where the two disagree the guide
10
15
  wins and the disagreement is a defect to report. **A rule MUST NOT be born here.** If this file notices a
11
16
  rule that should exist, it says so as a finding and the rule is written in its guide.
@@ -42,7 +47,9 @@ Every decision in this method traces to one of these. Anything that traced to no
42
47
  4. **Breadth once, depth per component.** The global portrait is born once and thin; depth is born when its
43
48
  component is actually worked on.
44
49
  5. **What can be derived is not written by hand.** Inventories, structure maps, the decision index, the
45
- global catalogue, story status.
50
+ global catalogue, ticket status. This principle stood here alone for a long time, binding nothing —
51
+ this file explains and MUST NOT hold a rule — while reviews kept re-finding the same drift. It is now
52
+ a rule: `../document/corpus-guide.md` § A derived fact has exactly one home.
46
53
  6. **Mandatory is a cost and must buy something.** A mandatory rule that prevents no concrete failure is
47
54
  repealed, not loosened.
48
55
 
@@ -74,8 +81,8 @@ client through a contract — will demand the artifacts as a deliverable, the to
74
81
 
75
82
  ## Why `mode` has no third scope
76
83
 
77
- `mode` cannot be overridden per wave or per `SPEC.md`. A wave MAY cross several components, so a per-wave
78
- override would give one component two different depths depending on which wave touched it — while the
84
+ `mode` cannot be overridden per spec or per `SPEC.md`. A spec MAY cross several components, so a per-spec
85
+ override would give one component two different depths depending on which spec touched it — while the
79
86
  document is one, and living.
80
87
 
81
88
  > Depth belongs to the component, not to the work.
@@ -190,7 +197,7 @@ Not theory. In the previous run, 41 cross-component business rules from seven pa
190
197
  merged and de-duplicated **serially**, because the target file had no key — and that merge was the most
191
198
  expensive part of the pass.
192
199
 
193
- Keys that exist: the Product Component, the inventory source, the endpoint number, the story, the wave.
200
+ Keys that exist: the Product Component, the inventory source, the endpoint number, the ticket, the spec.
194
201
  Things with no key: the glossary, the cross-component rules, the spine.
195
202
 
196
203
  ## Why nine ceremonies were repealed
@@ -237,7 +244,7 @@ symmetric, the rule demanded a section that would be empty or invented — and t
237
244
  exception but a field: `built` says whether the implementation is ours, and the match became one-directional.
238
245
 
239
246
  **A definition left unwritten will be re-argued in the next corpus.** That is the general lesson, and it is
240
- why `built` is checked by V25 rather than merely described here: prose that nothing verifies is prose that
247
+ why `built` is checked by `container-built` rather than merely described here: prose that nothing verifies is prose that
241
248
  gets contradicted by the first person in a hurry.
242
249
 
243
250
  ## What is not here
@@ -27,7 +27,7 @@ Normative rules that hold **only in this product**, and are not code conventions
27
27
  `inventory-readers.py` — how this product's code is read, for the three inventories. It sits in the
28
28
  room for the same reason the rules do: the method's engine is generic, reading a stack is not, and
29
29
  `update` MUST NOT overwrite what a product wrote about its own code. What ships is a **skeleton** —
30
- no patterns, no stack — and `wdi-init` intent `readers` fills it in against this repo. `V27` does not
30
+ no patterns, no stack — and `wdi-init` intent `readers` fills it in against this repo. `custom-room-declared` does not
31
31
  look at it: only `.md` is a rule.
32
32
 
33
33
  ## What does not
@@ -48,7 +48,7 @@ very failure this rule prevents.
48
48
 
49
49
  ## The shape of a file here
50
50
 
51
- Frontmatter is required, and `V27` checks it:
51
+ Frontmatter is required, and `custom-room-declared` checks it:
52
52
 
53
53
  ```yaml
54
54
  ---
@@ -1,18 +1,18 @@
1
- ---
2
- status: Draft # Article 4: Draft MAY be read as guidance, MUST NOT reject a change
3
- ratified_by: null # the commit whose content ratifies this file
4
- ---
5
-
6
- # brownfield — codebase guide
7
-
8
- **Loaded when:** writing or reviewing code.
9
-
10
- > **Born empty on purpose.** This file is filled by the first wave's distillation — `bmad-spec`'s
11
- > `brownfield.md` companion is promoted here before the wave closes.
12
- >
13
- > Writing it up front means guessing at a convention no code has yet. It MUST NOT be filled before
14
- > code exists that ratifies it.
15
-
16
- > **Status.** While `draft`, its contents MAY be read as guidance but MUST NOT be used to reject a
17
- > change. It rises to `accepted` when the first wave's distillation fills it from real code, and
18
- > `ratified_by` MUST then carry the commit holding that code.
1
+ ---
2
+ status: Draft # Article 4: Draft MAY be read as guidance, MUST NOT reject a change
3
+ ratified_by: null # the commit whose content ratifies this file
4
+ ---
5
+
6
+ # brownfield — codebase guide
7
+
8
+ **Loaded when:** writing or reviewing code.
9
+
10
+ > **Born empty on purpose.** This file is filled by the first spec's distillation — what the
11
+ > contract and the tickets established about the brownfield is promoted here before the spec closes.
12
+ >
13
+ > Writing it up front means guessing at a convention no code has yet. It MUST NOT be filled before
14
+ > code exists that ratifies it.
15
+
16
+ > **Status.** While `draft`, its contents MAY be read as guidance but MUST NOT be used to reject a
17
+ > change. It rises to `accepted` when the first spec's distillation fills it from real code, and
18
+ > `ratified_by` MUST then carry the commit holding that code.
@@ -1,18 +1,18 @@
1
- ---
2
- status: Draft # Article 4: Draft MAY be read as guidance, MUST NOT reject a change
3
- ratified_by: null # the commit whose content ratifies this file
4
- ---
5
-
6
- # conventions — codebase guide
7
-
8
- **Loaded when:** writing or reviewing code.
9
-
10
- > **Born empty on purpose.** This file is filled by the first wave's distillation — `bmad-spec`'s
11
- > `conventions.md` companion is promoted here before the wave closes.
12
- >
13
- > Writing it up front means guessing at a convention no code has yet. It MUST NOT be filled before
14
- > code exists that ratifies it.
15
-
16
- > **Status.** While `draft`, its contents MAY be read as guidance but MUST NOT be used to reject a
17
- > change. It rises to `accepted` when the first wave's distillation fills it from real code, and
18
- > `ratified_by` MUST then carry the commit holding that code.
1
+ ---
2
+ status: Draft # Article 4: Draft MAY be read as guidance, MUST NOT reject a change
3
+ ratified_by: null # the commit whose content ratifies this file
4
+ ---
5
+
6
+ # conventions — codebase guide
7
+
8
+ **Loaded when:** writing or reviewing code.
9
+
10
+ > **Born empty on purpose.** This file is filled by the first spec's distillation — what the
11
+ > contract and the tickets established about the conventions is promoted here before the spec closes.
12
+ >
13
+ > Writing it up front means guessing at a convention no code has yet. It MUST NOT be filled before
14
+ > code exists that ratifies it.
15
+
16
+ > **Status.** While `draft`, its contents MAY be read as guidance but MUST NOT be used to reject a
17
+ > change. It rises to `accepted` when the first spec's distillation fills it from real code, and
18
+ > `ratified_by` MUST then carry the commit holding that code.
@@ -1,18 +1,18 @@
1
- ---
2
- status: Draft # Article 4: Draft MAY be read as guidance, MUST NOT reject a change
3
- ratified_by: null # the commit whose content ratifies this file
4
- ---
5
-
6
- # stack — codebase guide
7
-
8
- **Loaded when:** writing or reviewing code.
9
-
10
- > **Born empty on purpose.** This file is filled by the first wave's distillation — `bmad-spec`'s
11
- > `stack.md` companion is promoted here before the wave closes.
12
- >
13
- > Writing it up front means guessing at a convention no code has yet. It MUST NOT be filled before
14
- > code exists that ratifies it.
15
-
16
- > **Status.** While `draft`, its contents MAY be read as guidance but MUST NOT be used to reject a
17
- > change. It rises to `accepted` when the first wave's distillation fills it from real code, and
18
- > `ratified_by` MUST then carry the commit holding that code.
1
+ ---
2
+ status: Draft # Article 4: Draft MAY be read as guidance, MUST NOT reject a change
3
+ ratified_by: null # the commit whose content ratifies this file
4
+ ---
5
+
6
+ # stack — codebase guide
7
+
8
+ **Loaded when:** writing or reviewing code.
9
+
10
+ > **Born empty on purpose.** This file is filled by the first spec's distillation — what the
11
+ > contract and the tickets established about the stack is promoted here before the spec closes.
12
+ >
13
+ > Writing it up front means guessing at a convention no code has yet. It MUST NOT be filled before
14
+ > code exists that ratifies it.
15
+
16
+ > **Status.** While `draft`, its contents MAY be read as guidance but MUST NOT be used to reject a
17
+ > change. It rises to `accepted` when the first spec's distillation fills it from real code, and
18
+ > `ratified_by` MUST then carry the commit holding that code.
@@ -2,7 +2,7 @@
2
2
  # The spine holds the invariants that keep separately built units from diverging.
3
3
  # Structure (stack, tree, data shapes) is treated as a seed, not a contract.
4
4
  #
5
- # Order binds: the spine comes first, and bmad-spec reads it as a companion — never the other
5
+ # Order binds: the spine comes first, and the spec's contract reads it as a companion — never the other
6
6
  # way round.
7
7
 
8
8
  [workflow]
@@ -9,7 +9,7 @@
9
9
  #
10
10
  # The main danger is not the path but this skill's habit of editing directly: its default is
11
11
  # "direct updates to epics, stories, or PRD sections". In this repo that MUST NOT happen —
12
- # document changes go through wdi-decision intent `apply`, and wave content through wdi-build.
12
+ # document changes go through wdi-decision intent `apply`, and spec content through wdi-build.
13
13
  # That is why the prohibition is installed as a persistent fact, held from activation, rather than
14
14
  # as end-of-run polish.
15
15
 
@@ -18,11 +18,11 @@
18
18
  persistent_facts = [
19
19
  "file:{project-root}/.constitution/method/document/delivery-flow-guide.md",
20
20
  "file:{project-root}/.constitution/method/document/corpus-guide.md",
21
- "This skill MUST NOT write or edit anything in {project-root}/.what/ or {project-root}/.how/. Its output is a proposal; document changes are made by wdi-decision intent `apply` once the `DEC-` is accepted, and wave content by wdi-build.",
22
- "epics.md and sprint-status.yaml are NOT used in this repo we run the stories route. Neither MUST be read as a source, and neither MUST be created.",
23
- "The impact scan MUST cover .what/_prd/, .what/<pc>/, .how/_platform/, .how/<pc>/, SPEC.md, .control/registry/waves.yaml, and the story files. .what/<pc>/ is unknown to this skill entirely, and without this it goes stale silently.",
21
+ "This skill MUST NOT write or edit anything in {project-root}/.what/ or {project-root}/.how/. Its output is a proposal; document changes are made by wdi-decision intent `apply` once the `DEC-` is accepted, and spec content by wdi-build.",
22
+ "epics.md and sprint-status.yaml are NOT used in this repo, and neither is the stories route they belong to. Neither MUST be read as a source, and neither MUST be created.",
23
+ "The impact scan MUST cover .what/_prd/, .what/<pc>/, .how/_platform/, .how/<pc>/, SPEC.md, .control/registry/specs.yaml, and the ticket files. .what/<pc>/ is unknown to this skill entirely, and without this it goes stale silently.",
24
24
  "Every plan change that is expensive to reverse MUST become a `DEC-` through wdi-decision, not a paragraph inside the proposal. A course correction is itself one `DEC-` of type course-correction.",
25
- "A correction that voids more than 30% of a wave's stories MUST NOT be handled as a patch. Say so, and let the wave be re-cut through wdi-build.",
25
+ "A correction that voids more than 30% of a spec's tickets MUST NOT be handled as a patch. Say so, and let the spec be re-cut through wdi-build.",
26
26
  ]
27
27
 
28
28
  on_complete = "Hand the landing to wdi-decision: the whole proposal becomes one `DEC-` of type course-correction, and its run folder MUST NOT be deleted. MUST NOT land itself, MUST NOT edit .what/ or .how/."
@@ -27,16 +27,22 @@ doc_standards = ["file:{project-root}/.constitution/method/document/prd-guide.md
27
27
  # activation. prd-guide.md remains authoritative; where the two disagree, the guide wins and the
28
28
  # line here MUST be fixed.
29
29
  persistent_facts = [
30
- "file:{project-root}/.control/registry/requirements.yaml",
30
+ "file:{project-root}/.control/registry/goals.yaml",
31
31
  "file:{project-root}/.constitution/method/document/prd-guide.md",
32
32
 
33
- "FR-N, NFR-N, UJ-N, and CAP-N MUST be allocated from requirements.yaml and MUST NOT restart from 1. The next initiative's PRD continues the previous PRD's sequence — the sequence is global, one product, one sequence.",
33
+ "BG-N is allocated from goals.yaml, which this PRD only READS. CAP-N, FR-N, NFR-N, and UJ-N are all allocated from this initiative's own requirements-<slug>.yaml, where <slug> is this PRD's folder name under .what/_prd/ — one file, one writer. None of them MUST restart from 1. The next initiative's PRD continues the previous PRD's sequence — the sequence is global, one product, one sequence.",
34
+
35
+ "Every FR's statement and proof of done, and every NFR's statement and enforced_by, are written directly into requirements-<slug>.yaml on the id's own row — as part of finishing this PRD, not a later step. The PRD's own §3 Features section cites the id under a Realizes: line and MUST NOT also carry the full statement or proof of done in prose. A promise written in both places is the same fact with two homes.",
34
36
 
35
37
  "This PRD is a living document. A behaviour change, a closely related feature addition, or a promise correction MUST go through intent Update on the same PRD. A new PRD MUST NOT be created just because the release changed; it is created only when the functional area is genuinely different and reads badly if merged.",
36
38
 
39
+ "§1 Why This Initiative states a DELTA against the product brief's own Why section — what this initiative changes, adds, or unlocks beyond it. It MUST NOT restate the product's vision from scratch; on a single-initiative product, one sentence pointing back to the brief is enough.",
40
+
41
+ "This template carries no Document Purpose section, no Glossary section, no Non-Goals section, no Open Questions section, and no Assumptions Index section — all five were removed. A domain noun MUST already exist in .control/product-glossary.md, used verbatim; a new one is raised through wdi-question in the same pass, never defined in this document. An open question or an unresolved [ASSUMPTION] tag is filed through wdi-question into .control/questions/ the moment it is found, never batched into a section.",
42
+
37
43
  "Every intent Update run MUST add exactly one row to the PRD's Revision History table: the date, what changed in language an outside reader understands, and why. That table is for the reader; the memlog is for the audit. Neither MUST substitute for the other.",
38
44
 
39
- "A release MUST NOT be stated through the PRD's folder name or its title. It is carried by the target_release field in requirements.yaml and waves.yaml. Naming a release number inside the PRD's prose MAY be done as context, but the registry remains what binds.",
45
+ "A release MUST NOT be stated through the PRD's folder name or its title. It is carried by the target_release field on the CAP row in requirements-<slug>.yaml, and by specs.yaml. Naming a release number inside the PRD's prose MAY be done as context, but the registry remains what binds.",
40
46
 
41
47
  "Every memlog.py call — init, append, set, and the read on resume or intent Update — MUST use --path {project-root}/.control/memlog/prd-FILL-initiative-slug.md. The slug MUST match run_folder_pattern above, and both lines MUST change together when the initiative changes. --workspace MUST NOT be used.",
42
48
  ]
@@ -22,9 +22,13 @@ doc_standards = ["file:{project-root}/.constitution/method/document/brief-guide.
22
22
  persistent_facts = [
23
23
  "Every memlog.py call — init, append, set, and the read on resume or intent Update — MUST use --path {project-root}/.control/memlog/brief.md. --workspace MUST NOT be used; it would place a .memlog.md inside .what/, and no memlog is allowed to live in the corpus.",
24
24
 
25
- "The brief template opens with permission to drop a section that does not fit. That permission MUST NOT apply to the eight mandatory sections: The Problem, Who This Serves, Goals, Success Criteria, Scope In, Scope Out, Constraints, Assumptions plus Prerequisites. Other template sections MAY be dropped.",
25
+ "The brief template opens with permission to drop a section that does not fit. That permission MUST NOT apply to the eight mandatory sections: Why, The Problem, Who This Serves, Goals, Success Criteria, Scope In, Scope Out, Constraints. The Solution and What Makes This Different stay optional. Other template sections MAY be dropped.",
26
26
 
27
- "Goals MUST be numbered BG-1, BG-2, and so on. They MUST NOT be numbered G1, G2 G1 through G5 are the names of this method's five gates, and BG is the first link in the BG -> CAP -> FR/NFR -> UC -> Story -> Test traceability chain.",
27
+ "The brief MUST NOT carry an Assumptions section or a Prerequisites sectionboth were removed from the template. An assumption belongs in .control/questions/assumptions.md, a prerequisite in .control/questions/external.md, each filed through wdi-question, never restated in the brief.",
28
+
29
+ "Goals MUST be numbered BG-1, BG-2, and so on. They MUST NOT be numbered G1, G2 — G1 through G5 are the names of this method's five gates, and BG is the first link in the BG -> CAP -> FR/NFR -> UC -> Ticket -> Test traceability chain. The brief's own Goals section is a POINTER ONLY — 'Goals — see goals.yaml -> goals:' — and MUST NOT restate a goal's statement. The statement for each BG-N is written directly into .control/registry/goals.yaml -> goals:, as part of finishing the brief, not left to a later step.",
30
+
31
+ "Success Criteria MUST name exactly ONE measurable figure, with a timeframe — not a mission statement, not a mix of signals. A criterion nobody could check without opening the code fails this.",
28
32
 
29
33
  "The Who This Serves table MUST carry exactly one row marked primary, and MUST cover every stakeholder including one who never opens the product.",
30
34
 
@@ -12,7 +12,7 @@ Two intents, run in this order:
12
12
 
13
13
  | Intent | Writes | Wraps |
14
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` | |
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` | `mattpocock-skills:domain-modeling` |
16
16
  | `platform` | `.how/_platform/`: the spine · C4 L1/L2/L3 · `cross-cutting.md` · the three inventories. Registry: `containers` | `bmad-architecture` |
17
17
 
18
18
  **Blueprint content is untouched by `mode` and by `risk_accepted`.** Everything above exists at every mode,
@@ -40,7 +40,7 @@ of that is `wdi-component` at G4. You MUST NOT write a promise; when the bluepri
40
40
  intent `component` — the slicing is born at the tail of G2, from the brief plus every PRD.
41
41
  - `catalog` runs before `platform`. The spine is written against a portrait that exists.
42
42
  - If the spine and C4 set already exist, `platform` is an **amendment**, never a create. A second create
43
- overwrites what three waves of annotation put there.
43
+ overwrites what three specs of annotation put there.
44
44
  - If the ask is one component's mechanism or its full flows, route to `wdi-component`.
45
45
  - If the ask is what the product promises, route to `wdi-product` — an invariant is not a promise.
46
46
 
@@ -65,6 +65,60 @@ whose nouns nobody defined.
65
65
  the count passes a third of a component's use cases, derive it again — `delivery-flow-guide.md` owns the rule
66
66
  and it MUST NOT be negotiated.
67
67
 
68
+ ### Domain modelling is active, and `mattpocock-skills:domain-modeling` is its engine
69
+
70
+ The domain model is not written by taking dictation. **You MUST invoke
71
+ `mattpocock-skills: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
+
68
122
  **A method term MUST NOT be written into `.constitution/method/method-glossary.md`.** A product term binds one
69
123
  project; a method term binds every project the method is installed in. Raise it as a proposal, state where it
70
124
  appeared and why the existing vocabulary does not cover it, and hand it to the owner.
@@ -106,7 +160,7 @@ Then verify and land:
106
160
  | 6 | Nothing but invariants | A statement affecting one component only — that is its SDD |
107
161
  | 7 | Memlog at `.control/memlog/spine.md` | A `.memlog.md` appeared inside `.how/` — `--workspace` was used |
108
162
 
109
- Check 7 MUST be fixed immediately. V16 rejects a memlog inside the corpus.
163
+ Check 7 MUST be fixed immediately. `memlog-home` rejects a memlog inside the corpus.
110
164
 
111
165
  **Land the C4 set by amending, never overwriting.** The files are living and already carry annotations,
112
166
  including a pre-method provenance note that MUST survive. When the incoming set contradicts an annotation
@@ -114,14 +168,19 @@ already there, you MUST stop and report it, and MUST NOT resolve it by preferrin
114
168
  C4 file and the spine disagree, the spine wins and the disagreement MUST be reported. One
115
169
  `c4-l3-<container>.md` per `built: true` container **holding more than one Product Component**. A
116
170
  `built: false` container gets no L3 at all, and a one-PC container needs none because the L2 matrix already
117
- places it. **Not one of the three waits for a wave** — `architecture-guide.md` owns that.
171
+ places it. **Not one of the three waits for a spec** — `architecture-guide.md` owns that.
118
172
 
119
173
  **Register the containers** in `containers:` in `components.yaml`, in the same act as landing the L2. It is
120
- not a follow-up, and it unblocks everyone else: an `LC` MUST name its container.
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.
121
180
 
122
181
  Each container MUST carry `built:` — `true` when we write what is inside it, `false` when we deploy
123
182
  someone else's implementation. It decides whether the container gets an L3, an `LC`, and a heading in the
124
- codebase map (V25). Something whose **runtime we do not deploy** is an external system: it belongs at L1,
183
+ codebase map (`container-built`). Something whose **runtime we do not deploy** is an external system: it belongs at L1,
125
184
  and registering it here promises a codebase-map section that will never exist.
126
185
 
127
186
  **Fill each PC's `containers:` in the same act, and land the matrix at L2** — the registry is the SSOT and
@@ -134,7 +193,7 @@ You MUST NOT register a
134
193
  **Register what `_platform` owns** in the same pass — a domain entity through `platform_owns`, an inventory
135
194
  row through that inventory's `platform_rows:`, an `LC` through its `component:`. The test is in
136
195
  `corpus-guide.md` and both halves MUST hold. Each one MUST then be described under `## Platform-owned` in
137
- `cross-cutting.md`, in the same act: V21 checks that second half, because owning something without
196
+ `cross-cutting.md`, in the same act: `entity-one-writer` checks that second half, because owning something without
138
197
  documenting it is taking ownership without taking responsibility.
139
198
 
140
199
  A judgement the pattern cannot derive MUST live in the artifact it governs, not in a script and not in a
@@ -159,13 +218,13 @@ a new row takes the next number, never a renumber.
159
218
 
160
219
  ## Step 6 — The roll-up, and what the owner actually reads
161
220
 
162
- Regenerate `.control/generated/blueprint.md` with `validate.py --generate`. It assembles the UC catalogue, the
221
+ Regenerate `.how-rendered/blueprint.md` with `validate.py --generate`. It assembles the UC catalogue, the
163
222
  actor lists, the domain model, and the three inventories into **one page**.
164
223
 
165
224
  **That page is what G3 reviews** — not seven files. The catalogue and actors stay in their component kernels as
166
225
  their permanent home; the roll-up is a view. One fact, one home, one view.
167
226
 
168
- You MUST NOT hand-write anything under `.control/generated/`.
227
+ You MUST NOT hand-write anything under `.control/generated/`, `.what-rendered/`, or `.how-rendered/`.
169
228
 
170
229
  ## Step 7 — Review and questions
171
230
 
@@ -174,7 +233,9 @@ You MUST NOT hand-write anything under `.control/generated/`.
174
233
  - You MUST NOT open G3 on a portrait that has not been through it.
175
234
  - Every unresolved to-be-confirmed MUST be filed through `wdi-question`, in **one** ranked batch — into
176
235
  `assumptions.md` by default, `blocking.md` only through its three tests.
177
- - A decision surfacing while writing goes to `wdi-decision`, never into the document as a parenthetical.
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`.
178
239
  - An `AD-N` that reverses or narrows an earlier one MUST go through `wdi-decision` first. Editing an `AD-N` in
179
240
  place is how a reversal happens with nobody deciding it.
180
241