wdi-method 0.3.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 (122) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +203 -0
  3. package/bin/wdi-method.js +906 -0
  4. package/kit/.constitution/README.md +66 -0
  5. package/kit/.constitution/codebase/brownfield-guide.md +18 -0
  6. package/kit/.constitution/codebase/conventions-guide.md +18 -0
  7. package/kit/.constitution/codebase/stack-guide.md +18 -0
  8. package/kit/.constitution/constitution.md +135 -0
  9. package/kit/.constitution/document/architecture-guide.md +209 -0
  10. package/kit/.constitution/document/bmad-guide.md +151 -0
  11. package/kit/.constitution/document/bmad-skill-register.md +71 -0
  12. package/kit/.constitution/document/brief-guide.md +94 -0
  13. package/kit/.constitution/document/corpus-guide.md +341 -0
  14. package/kit/.constitution/document/decision-guide.md +134 -0
  15. package/kit/.constitution/document/delivery-flow-guide.md +338 -0
  16. package/kit/.constitution/document/prd-guide.md +202 -0
  17. package/kit/.constitution/document/sdd-guide.md +206 -0
  18. package/kit/.constitution/document/srs-guide.md +147 -0
  19. package/kit/.constitution/document/templates/addendum.md +71 -0
  20. package/kit/.constitution/document/templates/architecture-spine.md +100 -0
  21. package/kit/.constitution/document/templates/brief.md +110 -0
  22. package/kit/.constitution/document/templates/c4.md +77 -0
  23. package/kit/.constitution/document/templates/contract.md +52 -0
  24. package/kit/.constitution/document/templates/cross-cutting.md +80 -0
  25. package/kit/.constitution/document/templates/decision.md +64 -0
  26. package/kit/.constitution/document/templates/design-system.md +67 -0
  27. package/kit/.constitution/document/templates/flow.md +51 -0
  28. package/kit/.constitution/document/templates/integration.md +69 -0
  29. package/kit/.constitution/document/templates/inventory.md +69 -0
  30. package/kit/.constitution/document/templates/lc.md +47 -0
  31. package/kit/.constitution/document/templates/lifecycle.md +52 -0
  32. package/kit/.constitution/document/templates/meeting.md +47 -0
  33. package/kit/.constitution/document/templates/model.md +55 -0
  34. package/kit/.constitution/document/templates/oq.md +45 -0
  35. package/kit/.constitution/document/templates/prd.md +226 -0
  36. package/kit/.constitution/document/templates/questions.md +75 -0
  37. package/kit/.constitution/document/templates/rtr.md +61 -0
  38. package/kit/.constitution/document/templates/rules.md +47 -0
  39. package/kit/.constitution/document/templates/scn.md +40 -0
  40. package/kit/.constitution/document/templates/sdd.md +146 -0
  41. package/kit/.constitution/document/templates/srs.md +149 -0
  42. package/kit/.constitution/document/templates/structure-codebase.md +129 -0
  43. package/kit/.constitution/document/templates/structure-document.md +90 -0
  44. package/kit/.constitution/document/templates/uc.md +69 -0
  45. package/kit/.constitution/document/templates/ux.md +77 -0
  46. package/kit/.constitution/document/ux-guide.md +99 -0
  47. package/kit/.constitution/language-guide.md +69 -0
  48. package/kit/.constitution/method/README.md +169 -0
  49. package/kit/.constitution/method/artifact-map.md +155 -0
  50. package/kit/.constitution/method/portability.md +91 -0
  51. package/kit/.constitution/method/rationale.md +246 -0
  52. package/kit/.constitution/method-glossary.md +169 -0
  53. package/kit/.constitution/project/README.md +68 -0
  54. package/kit/.constitution/repo-guide.md +97 -0
  55. package/kit/.constitution/scripts/inventory.py +527 -0
  56. package/kit/.constitution/scripts/timeline.py +665 -0
  57. package/kit/.constitution/scripts/validate.py +1579 -0
  58. package/kit/.constitution/structure-guide.md +202 -0
  59. package/kit/assets/bmad-custom/bmad-advanced-elicitation.toml +15 -0
  60. package/kit/assets/bmad-custom/bmad-architecture.toml +31 -0
  61. package/kit/assets/bmad-custom/bmad-build-auto.toml +10 -0
  62. package/kit/assets/bmad-custom/bmad-build.toml +52 -0
  63. package/kit/assets/bmad-custom/bmad-code-review.toml +12 -0
  64. package/kit/assets/bmad-custom/bmad-correct-course.toml +27 -0
  65. package/kit/assets/bmad-custom/bmad-deep-recon.toml +11 -0
  66. package/kit/assets/bmad-custom/bmad-prd.toml +42 -0
  67. package/kit/assets/bmad-custom/bmad-product-brief.toml +34 -0
  68. package/kit/assets/bmad-custom/bmad-retrospective.toml +9 -0
  69. package/kit/assets/bmad-custom/bmad-spec.toml +15 -0
  70. package/kit/assets/bmad-custom/bmad-ux.toml +19 -0
  71. package/kit/assets/bmad-custom/config.toml +6 -0
  72. package/kit/skills/wdi-blueprint/SKILL.md +203 -0
  73. package/kit/skills/wdi-build/SKILL.md +244 -0
  74. package/kit/skills/wdi-component/SKILL.md +172 -0
  75. package/kit/skills/wdi-decision/.gitkeep +0 -0
  76. package/kit/skills/wdi-decision/SKILL.md +183 -0
  77. package/kit/skills/wdi-help/.gitkeep +0 -0
  78. package/kit/skills/wdi-help/SKILL.md +98 -0
  79. package/kit/skills/wdi-init/SKILL.md +149 -0
  80. package/kit/skills/wdi-log/SKILL.md +107 -0
  81. package/kit/skills/wdi-problem/SKILL.md +90 -0
  82. package/kit/skills/wdi-product/SKILL.md +127 -0
  83. package/kit/skills/wdi-question/.gitkeep +0 -0
  84. package/kit/skills/wdi-question/SKILL.md +88 -0
  85. package/kit/skills/wdi-reconcile/.gitkeep +0 -0
  86. package/kit/skills/wdi-reconcile/SKILL.md +146 -0
  87. package/kit/skills/wdi-report/SKILL.md +205 -0
  88. package/kit/skills/wdi-review/SKILL.md +118 -0
  89. package/kit/skills/wdi-systematic-debugging/SKILL.md +193 -0
  90. package/kit/skills/wdi-systematic-debugging/references/condition-based-waiting.md +115 -0
  91. package/kit/skills/wdi-systematic-debugging/references/defense-in-depth.md +122 -0
  92. package/kit/skills/wdi-systematic-debugging/references/find-polluter.sh +72 -0
  93. package/kit/skills/wdi-systematic-debugging/references/root-cause-tracing.md +169 -0
  94. package/kit/skills/wdi-ux/SKILL.md +145 -0
  95. package/kit-overlay/AGENTS.md +196 -0
  96. package/kit-overlay/README.md +66 -0
  97. package/kit-overlay/constitution.md +135 -0
  98. package/kit-overlay/portability.md +91 -0
  99. package/kit-overlay/repo-guide.md +97 -0
  100. package/lib/agents-block.mjs +52 -0
  101. package/lib/identity.mjs +65 -0
  102. package/package.json +37 -0
  103. package/scaffold/.control/decisions/.gitkeep +0 -0
  104. package/scaffold/.control/generated/.gitkeep +2 -0
  105. package/scaffold/.control/meetings/.gitkeep +0 -0
  106. package/scaffold/.control/memlog/.gitkeep +0 -0
  107. package/scaffold/.control/product-glossary.md +21 -0
  108. package/scaffold/.control/project-non-technical-log.md +23 -0
  109. package/scaffold/.control/questions/answered.md +11 -0
  110. package/scaffold/.control/questions/assumptions.md +15 -0
  111. package/scaffold/.control/questions/blocking.md +21 -0
  112. package/scaffold/.control/questions/external.md +11 -0
  113. package/scaffold/.control/registry/components.yaml +21 -0
  114. package/scaffold/.control/registry/decisions.yaml +6 -0
  115. package/scaffold/.control/registry/defects.yaml +3 -0
  116. package/scaffold/.control/registry/index.yaml +46 -0
  117. package/scaffold/.control/registry/requirements.yaml +15 -0
  118. package/scaffold/.control/registry/risks.yaml +5 -0
  119. package/scaffold/.control/registry/usecases.yaml +6 -0
  120. package/scaffold/.control/registry/waves.yaml +5 -0
  121. package/scaffold/.control/structure-codebase.md +19 -0
  122. package/scaffold/.control/structure-document.md +25 -0
@@ -0,0 +1,183 @@
1
+ ---
2
+ name: wdi-decision
3
+ description: Use when a decision worth remembering has been made, when one has to be carried into the documents it governs, or when a planning assumption turns out to be void. Three intents — open, accept, apply. Wraps bmad-correct-course. Produces a globally numbered DEC-.
4
+ ---
5
+
6
+ # WDI Decision
7
+
8
+ Free of stage and free of role: a decision MAY be made at any point by anyone. What is fixed is where its
9
+ output lives — `.control/decisions/DEC-NNN-<slug>.md`, numbered globally from `decisions.yaml`.
10
+
11
+ Three intents, because deciding, ratifying, and rewriting the documents are three different acts and merging
12
+ them means documents change before anyone approved the change.
13
+
14
+ | Intent | Does | Who |
15
+ |---|---|---|
16
+ | `open` | Writes a `DEC-` at `status: draft`. Also the entry point for a void planning assumption, which is where `bmad-correct-course` is dispatched | anyone |
17
+ | `accept` | Raises `draft` → `accepted` | **the Product Owner only** |
18
+ | `apply` | Dispatches the owner of every document the decision reaches, checks what came back, fills `touches`, raises `applied` | anyone |
19
+
20
+ Applying is what **freezes** a decision, not accepting. `decision-guide.md` owns the full ladder and this skill
21
+ MUST NOT restate it.
22
+
23
+ ## The one test, before anything is written
24
+
25
+ > **If someone asks in three months why it is like this, is the answer readable from the code?**
26
+
27
+ Yes → it MUST NOT be recorded. No → record it.
28
+
29
+ **Recording is not mandatory**, and a decision nobody recorded is normal rather than negligence. You MUST NOT
30
+ log it as debt or backfill it later from memory. One case stays mandatory: a decision that **contradicts or
31
+ changes an `AD-N`**.
32
+
33
+ The old name ADR forced the wrong question — *"is this architectural?"* — and that question threw away exactly
34
+ the decisions most worth keeping, the ones that sound small.
35
+
36
+ ## Intent `open`
37
+
38
+ ### Inputs
39
+
40
+ Any of these, alone or together: minutes in `.control/meetings/`, an answered question in
41
+ `.control/questions/`, a review or debugging finding, a memlog in `.control/memlog/`, a `wdi-reconcile` conflict.
42
+
43
+ The memlog is the richest source and the most often forgotten. It is the record of *why* — read it before
44
+ writing the Why section rather than reconstructing the reasoning from the outcome.
45
+
46
+ ### What it writes
47
+
48
+ Three sections, always: **Decision** (one sentence, present tense, quotable) · **Why** · **Cost** (what becomes
49
+ harder). Alternatives, a reversal trigger, and Trace are required only when the decision reaches a Product
50
+ Component whose `risk_accepted` is `low`; elsewhere an empty one MUST be dropped rather than left as a heading.
51
+
52
+ Frontmatter carries `touches: []` — empty until applied — and `type:` when it is useful. There is no `layer:`
53
+ and no `component:`; both were classifications demanded before anything was known.
54
+
55
+ A `DEC-` MUST NOT hold an open question. Those go to `wdi-question`.
56
+
57
+ ### A void planning assumption
58
+
59
+ This is the same intent, with one extra step in front. The trigger is one thing: **a planning assumption turned
60
+ out to be void.** It usually surfaces while building, but its impact reaches back into G2, G3, and G4.
61
+
62
+ Three things it is **not**:
63
+
64
+ | Ask | Route |
65
+ |---|---|
66
+ | Something is broken and the cause is unknown | `wdi-systematic-debugging` **first**. A correction built on a guessed cause corrects the wrong thing |
67
+ | A decision exists and documents must follow | intent `apply`. There is no plan to re-cut |
68
+ | Scope grows without invalidating anything | `wdi-product` intent `update`, then the normal flow |
69
+
70
+ State the void assumption in **one line** before dispatching. A correction whose trigger cannot be stated in one
71
+ line is a re-plan, and it belongs upstream.
72
+
73
+ Then dispatch `bmad-correct-course`. Do not restate the rules to it — they arrive through `persistent_facts` in
74
+ `_bmad/custom/bmad-correct-course.toml`, including the ban on direct edits. Name the corpus files in scope
75
+ explicitly; it globs its own defaults, which this project does not use.
76
+
77
+ **Its impact analysis is incomplete by construction** — it knows a PRD, epics, and stories, and it cannot see
78
+ `.what/<pc>/`, `.how/`, `.control/`, or `.constitution/`. Every one of these MUST be checked here:
79
+
80
+ | Layer | What to look for |
81
+ |---|---|
82
+ | `.what/_prd/` | The `FR`/`NFR` that no longer holds, and every one depending on it |
83
+ | `.what/<pc>/` | Use cases realising those `FR`, business rules, state lifecycles that lose a state |
84
+ | `.how/_platform/` | An `AD-N` the correction breaks, a container the C4 set no longer describes, an inventory row with nothing behind it |
85
+ | `.how/<pc>/` | Contracts, flows, and Failure Behaviour written against the old promise |
86
+ | `SPEC.md` | What the wave projected — a SPEC MUST NOT be edited to match; it is re-derived |
87
+ | `waves.yaml` | The wave's size, and whether the correction changes it |
88
+ | Story files | Which stories are `in-progress`, and which are not yet started |
89
+
90
+ The result is a `DEC-` of **`type: course-correction`**. The `SCP-` code is retired — a course correction is a
91
+ decision, and no second code names the same thing.
92
+
93
+ A correction cancelling more than **30%** of a wave's stories MUST NOT be handled as a patch. Say so, and let
94
+ the wave be re-cut through `wdi-build`.
95
+
96
+ A story already `in-progress` MUST NOT have its contract changed. Report it; stopping it and returning it to
97
+ `ready-for-dev` is the coordinator's act.
98
+
99
+ ## Intent `accept`
100
+
101
+ Only the Product Owner MAY raise a `DEC-` to `accepted`. **An agent MUST NOT accept its own.** When work is
102
+ blocked waiting on one, the block is reported, never resolved by self-approval.
103
+
104
+ An `accepted` `DEC-` that is still unapplied MAY be corrected in place, with the correction recorded in the
105
+ memlog. Nothing has been built on it, so there is no divergent record to preserve.
106
+
107
+ ## Intent `apply`
108
+
109
+ **You apply nothing yourself.** Every artifact has an owner, and the owner writes it. A hand-edit here produces
110
+ a change with no author, no input trail, and nothing that verifies it.
111
+
112
+ Exactly one `DEC-`, at `status: accepted`. You MUST NOT apply one in any other status.
113
+
114
+ ### Step 1 — List the targets before touching one
115
+
116
+ Name every document the decision reaches, and the skill that owns each, **before** anything is dispatched. A
117
+ list assembled while editing is a list that grows to fit what was already done.
118
+
119
+ | Target | Dispatch |
120
+ |---|---|
121
+ | `.what/_product-brief/` | `wdi-problem` |
122
+ | `.what/_prd/<initiative>/` | `wdi-product` intent `update` |
123
+ | `.what/<pc>/` § Actor Register · § UC Catalogue · `03-domain/domain-model.md` | `wdi-blueprint` intent `catalog` |
124
+ | `.what/business-rules.md` · `.control/product-glossary.md` | `wdi-blueprint` intent `catalog` |
125
+ | `.how/_platform/` — spine, C4, `cross-cutting.md`, the three inventories | `wdi-blueprint` intent `platform` |
126
+ | `.what/<pc>/` slots `02`–`05` — full flows, local rules, lifecycles, scenarios | `wdi-component` intent `behaviour` |
127
+ | `.how/<pc>/` minus `01-ux/` | `wdi-component` intent `design` |
128
+ | `EXPERIENCE.md` · `.how/<pc>/01-ux/` · `design-system.md` | `wdi-ux` |
129
+ | `components.yaml` — a PC born or changed · `mode` · `risk_accepted` · the two structure maps | `wdi-init`, by intent |
130
+ | `waves.yaml`, or anything inside an open wave | `wdi-build` |
131
+ | `.control/questions/` | `wdi-question` |
132
+ | `.control/project-non-technical-log.md` · `.control/meetings/` | `wdi-log` |
133
+
134
+ A target with **no row here** MUST be reported as a gap in the method, not given a plausible owner.
135
+
136
+ Apply in layer order — **`.what/` before `.how/`** — so the lower layer is written against the promise it is
137
+ supposed to serve, not against the one it is about to replace. The retired `layer:` field used to declare that
138
+ order in advance; it is now simply the order.
139
+
140
+ ### Step 2 — Dispatch, one owner at a time
141
+
142
+ Hand each owner the `DEC-` id and the exact change its layer has to carry. You MUST NOT restate the decision in
143
+ your own words; **quote it.** A paraphrase drifts, and the drift is invisible because both texts read reasonably.
144
+
145
+ Each owner keeps its own rules — its review, its memlog, its registry entry. You MUST NOT ask an owner to skip
146
+ any of them because the change is small.
147
+
148
+ ### Step 3 — Name the gates
149
+
150
+ Run the change-control matrix in `delivery-flow-guide.md` and **report** which gates it names. You MUST NOT
151
+ reopen a gate yourself, and you MUST NOT treat a green application as a gate that has already passed.
152
+
153
+ ### Step 4 — Close the trail
154
+
155
+ - Fill `touches:` with the files that were **actually** changed, in the `DEC-` and in `decisions.yaml`. Raise
156
+ `status: applied`. **From that point the file MUST NOT be edited** — not the Decision, not the Cost, not a
157
+ typo in the Why. Documents cite it now.
158
+ - V8 checks that an `applied` decision names a non-empty `touches`.
159
+ - Regenerate `.control/generated/decisions.md` with `validate.py --generate`. That table is how a decision is
160
+ found now; searching the memlog for decisions is retired, and the memlog is a run log again.
161
+ - Report what changed, and what the decision implied but was **not** changed.
162
+
163
+ ## Rules
164
+
165
+ - You MUST NOT widen scope beyond the decision. A neighbouring paragraph that now looks wrong is a finding to
166
+ report, not a change to make.
167
+ - You MUST NOT introduce a new domain noun. If the decision requires one, it goes through `wdi-blueprint` first.
168
+ - If applying would contradict another `applied` decision, you MUST stop and report the conflict. Two applied
169
+ decisions that disagree is work for intent `open`, not something to resolve by preferring the newer one.
170
+ - If the decision is unapplicable as written — the document it names no longer exists, or the change was already
171
+ made differently — you MUST report that instead of improvising.
172
+ - You MUST NOT apply into a wave that is already closed.
173
+ - `AD-N` is a different thing: a living rule with Binds · Prevents · Rule, edited in place. You MUST NOT convert
174
+ one into the other.
175
+ - A decision that emerged from a failed third fix attempt MUST say so in Why. That is the signal
176
+ `wdi-systematic-debugging` exists to raise, and burying it wastes the finding.
177
+
178
+ ## Output
179
+
180
+ Intent taken. For `open`: the decision in one sentence, its three required sections, and — for a correction —
181
+ the void assumption in one line plus what the scan found that `bmad-correct-course` could not see. For `apply`:
182
+ every target with its owner, what each owner changed, what was reported instead of changed and why, the gates the
183
+ matrix names, and whether `touches` and `applied` were filled.
File without changes
@@ -0,0 +1,98 @@
1
+ ---
2
+ name: wdi-help
3
+ description: Use when you need to know where the project stands in the delivery flow and which skill comes next. Answers from this project's five gates, not from BMad's phase column.
4
+ ---
5
+
6
+ # WDI Help
7
+
8
+ `bmad-help` cannot answer "where am I" in this project. Its progress detection globs `output-location`
9
+ paths resolved from `resolve_config.py`, so it is blind to every class-A artifact this project redirects
10
+ into `.what/` and `.how/`. It also lists two required gates — `epics.md` and `sprint-status.yaml` — that
11
+ this project's route never produces, and it is the only BMad skill with no `customize.toml`, so none of
12
+ that can be corrected.
13
+
14
+ This skill replaces it for position and routing. `bmad-help` remains useful for one thing only: questions
15
+ about BMad itself.
16
+
17
+ ## Inputs
18
+
19
+ | Source | What it answers |
20
+ |---|---|
21
+ | `.control/generated/status` | Which wave is open, which stories sit at which status, which validators are red |
22
+ | `.control/registry/index.yaml` | The global `mode`, and the gate map |
23
+ | `.control/registry/components.yaml` | Per-component `mode`, `risk_accepted`, and `g4_passed` |
24
+ | `.control/registry/waves.yaml` | Wave → release, size, `depends_on` |
25
+ | `.constitution/document/delivery-flow-guide.md` | The five gates and their checklists |
26
+ | `.constitution/method/README.md` | The whole shape, when the caller has never seen the method |
27
+
28
+ You MUST read `.control/generated/status` rather than counting files yourself. It is generated from the
29
+ registry; hand-counting produces a second answer that will disagree.
30
+
31
+ ## What to answer
32
+
33
+ Three things, in this order, and nothing else unless asked:
34
+
35
+ 1. **Where the project stands** — the last gate passed, and which gate is next.
36
+ 2. **What blocks that gate** — the specific artifact, validator, or blocking question that is not ready.
37
+ 3. **Which skill to invoke next** — one skill, named, with its intent, and the reason in a clause.
38
+
39
+ Keep it under fifteen lines. A routing answer that needs scrolling has failed at its job.
40
+
41
+ ## The one thing that changes the answer
42
+
43
+ **Read the component's `mode` before routing to G4.** A component at `mode: catalog` skips G4 entirely —
44
+ routing it to `wdi-component` is wrong, and the next step is `wdi-build`. That is the single most common
45
+ mis-route in this flow, because every other gate is the same for every component.
46
+
47
+ ## Routing by what exists
48
+
49
+ | State | Next |
50
+ |---|---|
51
+ | No registry, or no global `mode` set | `wdi-init` intent `setup` — nothing has started |
52
+ | No `.what/_product-brief/brief.md` | `wdi-problem` — G1 has not started |
53
+ | A brief exists, and no PRD covers the area in play | `wdi-product` intent `prd` |
54
+ | A PRD covers it but the promise has moved | `wdi-product` intent `update` — never a second PRD for the same area |
55
+ | Only the **wording** of an `FR` is wrong | Nobody. Whichever skill is at work fixes it directly; putting it behind a gate is how three earlier corrections were dropped |
56
+ | A PRD exists and the interface is a large part of what it promises | `wdi-ux` — optional, and it lands nothing until a `<pc>` exists |
57
+ | A PRD exists, no `product_components` yet | `wdi-init` intent `component` — the slicing is born here, at the tail of G2 |
58
+ | Components exist, `mode` or `risk_accepted` unset | `wdi-init` intents `mode` and `risk` — both are the owner's, and G4 cannot be read without them |
59
+ | Components exist, no UC catalogue or no spine | `wdi-blueprint` — intent `catalog` first, then `platform` |
60
+ | The blueprint is complete and G3 has not been held | The gate. Read `.control/generated/blueprint.md`, not seven files |
61
+ | G3 passed, a component at `outline`/`guarded`/`deep` has no depth | `wdi-component` |
62
+ | G3 passed, the component is at `mode: catalog` | `wdi-build` — G4 is skipped by design |
63
+ | Depth done and G4 passed for every component the work touches | `wdi-build` — it opens the wave, runs `bmad-spec`, ships each story, closes the wave |
64
+ | A small fix touching no `FR`, `UC`, `AD-N`, or domain model | Fast Path: `bmad-build` directly. It stops and becomes a wave `S` the moment an `FR` is touched |
65
+ | A planning assumption turned out void | `wdi-decision` intent `open` — it proposes, and changes nothing |
66
+ | An accepted `DEC-` has not reached its documents | `wdi-decision` intent `apply` |
67
+ | A bug, a failing test, unexpected behaviour | `wdi-systematic-debugging`, before any fix is proposed |
68
+ | Numbers are wanted before the work is committed | `wdi-report` intent `estimate` |
69
+
70
+ A brief that exists but is thin is still a brief. You MUST NOT route back to `wdi-problem` because a
71
+ section reads weakly — route there only when the brief is absent, when a change signal invalidates what
72
+ it claims, or when one of its eight required sections is missing outright.
73
+
74
+ ## Rules
75
+
76
+ - You MUST answer from this project's five gates — G1 Problem · G2 Product · G3 Blueprint · G4 Component ·
77
+ G5 Release. BMad's `phase` column MUST NOT be used; it mixes two conventions and names gates this
78
+ project does not run.
79
+ - When a `wdi-*` wrapper exists for a BMad skill, you MUST name the wrapper, never the skill it wraps. The
80
+ wrapper carries the position check and the content checks; routing past it produces an artifact nothing
81
+ verifies. Today every BMad skill this method uses has one: `wdi-problem`, `wdi-product`,
82
+ `wdi-blueprint`, `wdi-build`, `wdi-decision`, `wdi-review`, `wdi-ux`.
83
+ - Only `.control/questions/blocking.md` holds a gate. `external.md` holds go-live and MUST NOT be reported
84
+ as blocking a design gate; `assumptions.md` holds nothing.
85
+ - You MUST NOT invent progress. If `.control/generated/status` is missing or stale, say so and name
86
+ `validate.py --generate`.
87
+ - You MUST NOT run other skills on the user's behalf. Name the skill; let them invoke it.
88
+ - When the next step is blocked by a decision rather than by work, route to `wdi-question` or
89
+ `wdi-decision`, not to a producing skill.
90
+ - When asked about BMad itself — what a BMad skill does, what it writes, which are deprecated — answer
91
+ from `bmad-skill-register.md`, and only fall back to `bmad-help` for module documentation.
92
+ - When the caller has never seen this method, point at `.constitution/method/README.md` rather than
93
+ paraphrasing it here.
94
+
95
+ ## When there is no wave open
96
+
97
+ Say so plainly, then route by the table above. An artifact a later gate produces MUST NOT be reported as
98
+ missing — that is not a gap, it is the plan.
@@ -0,0 +1,149 @@
1
+ ---
2
+ name: wdi-init
3
+ description: Use for anything that must exist before work can start or continue — scaffolding the registries at install, birthing Product Components after G2, setting or changing a component's mode, setting or reviewing its risk_accepted, and refreshing the two structure maps. Five intents. Never writes .what/ or .how/ content beyond a skeleton.
4
+ ---
5
+
6
+ # WDI Init
7
+
8
+ Five intents, one skill, because all five answer the same question: **what has to exist before the
9
+ next piece of work makes sense?** A registry row, a folder pair, a depth setting, a risk note, a map
10
+ of where things are.
11
+
12
+ | Intent | Does | Precondition | How often |
13
+ |---|---|---|---|
14
+ | `setup` | Guide the global `mode` setting · scaffold the registries that are still empty · **report** the documents already present, read-only · derive the two structure maps | before G1 | once per project |
15
+ | `component` | Propose the slicing from the brief plus every PRD · birth what is accepted: registry row plus `SRS`/`SDD` skeletons · propose `mode`, `risk_accepted`, `risk_note`, `owns` | **G2 passed** | each time a component is born |
16
+ | `mode` | Change `mode` — global in `index.yaml`, or one component in `components.yaml`. Guided | — | any time |
17
+ | `risk` | Set or review one component's `risk_accepted`, with disclosure of what it touches | the component exists | any time, usually before G4 |
18
+ | `structure` | Re-derive `.control/structure-codebase.md` and `structure-document.md` from the tree on disk | — | when folders change, and at wave close |
19
+
20
+ ## Two boundaries
21
+
22
+ - It **does not sort, move, or delete** an existing document. Intent `setup` reports what is there and
23
+ stops. A file that predates the method enters the corpus only through the skill owning its slot —
24
+ `corpus-guide.md` owns that rule.
25
+ - Retiring or renaming a Product Component that already carries an SRS **is not its authority**. That
26
+ goes through `wdi-decision`. Birthing is cheap; retiring is not.
27
+
28
+ ## Intent `setup`
29
+
30
+ 1. Read the tree. Report every document already present, by path, with one line on what it looks like.
31
+ **Read-only.** You MUST NOT move one.
32
+ 2. Scaffold the registry files that carry no rows yet. A file that already has rows MUST NOT be
33
+ rewritten.
34
+ 3. Put the global `mode` to the owner. The default is `catalog`; the four values and what each buys are
35
+ in `delivery-flow-guide.md`, and MUST NOT be restated here.
36
+ 4. Run intent `structure`.
37
+
38
+ ## Intent `component`
39
+
40
+ 1. Read the brief and **every** PRD. A slicing proposed from one PRD is a slicing of one PRD.
41
+ 2. Propose the list. The naming rule and the presentation rule live in `corpus-guide.md` — a name that
42
+ states a layer, a service, or a pattern MUST be rejected at proposal time, and additions, changes,
43
+ and removals MUST be presented separately with the `FR` behind each.
44
+ 3. The owner decides. You MUST NOT register a component the owner has not accepted.
45
+ 4. For each accepted birth, write in one act:
46
+ - the `product_components` row in `.control/registry/components.yaml`, carrying `owns:`
47
+ - `.what/<pc>/SRS-<pc>.md` from `templates/srs.md`
48
+ - `.how/<pc>/SDD-<pc>.md` from `templates/sdd.md`
49
+ - the empty slots each kernel's guide names
50
+ 5. Run the disclosure below, then propose `mode` and `risk_accepted` per component.
51
+
52
+ Content SHOULD stay in the kernel until it grows past roughly 400 lines — a suggestion, not a threshold.
53
+ The first slot to be split out SHOULD be `04-usecases/`; it is always the largest.
54
+
55
+ **Logical Components are not born here.** An `LC` is born by the skill that draws it — `wdi-component`
56
+ intent `design`, or `wdi-ux` for a screen — and `components.yaml` states the entry shape and the `type`
57
+ → prose-home mapping in its own header. You MAY report an `LC` that looks wrong; you MUST NOT create
58
+ one.
59
+
60
+ **Neither is `platform_owns`.** An entity that no component's promise explains belongs to `_platform`,
61
+ and `wdi-blueprint` intent `platform` registers it. You MUST name the candidate and the reason, and you
62
+ MUST NOT claim it — and before naming one, you MUST apply the test in `corpus-guide.md`: ask which `FR`
63
+ would have to be withdrawn for the entity to stop being needed. If that `FR` exists, the entity belongs
64
+ to its component, however platform-shaped the table looks.
65
+
66
+ ## Intents `mode` and `risk` — disclose, then propose
67
+
68
+ `mode` controls **document depth** and nothing else. `risk_accepted` controls **review intensity** and
69
+ nothing else. Their definitions live in `delivery-flow-guide.md`. What this skill owns is the
70
+ conversation around changing them.
71
+
72
+ **You do not judge. You disclose, then propose.** Read the `FR` that fall to the component, then name
73
+ what it touches:
74
+
75
+ - money moving
76
+ - personal data
77
+ - an irreversible action
78
+ - a contractual promise to an outside party
79
+ - a third-party integration that cannot be rolled back
80
+
81
+ Only after that do you propose `mode` and `risk_accepted`.
82
+
83
+ Raising or lowering `mode` is **free and needs no justification** — it is a preference, and a preference
84
+ does not have to be defended. Setting `mode: catalog` on a sensitive component requires nothing, as long
85
+ as its review stays hard; that combination is the one the split exists to make sayable.
86
+
87
+ Two things are not free:
88
+
89
+ - **`risk_accepted: high` on a component that touches any of the five** requires a `DEC-` of
90
+ `type: risk-acceptance`, and `risk_accepted_by:` pointing at it. V23 checks this. On a component that
91
+ touches none of them, `high` is free.
92
+ - **An outside party who will demand the artifacts as a deliverable** — a regulator, an auditor, a
93
+ client through a contract — puts the touched component at `mode: deep` and `risk_accepted: low`,
94
+ whatever the global setting says. That floor MUST NOT be traded against a preference: the risk there
95
+ is not the owner's alone to accept.
96
+
97
+ > The control is not a veto, it is disclosure. The owner MAY choose fast anywhere, but never without
98
+ > knowing what is being staked.
99
+
100
+ **Lowering `mode` does not delete anything.** A file already written stops being required, and that is
101
+ all. Deleting it throws away knowledge already paid for, and a lowered `mode` is a preference — not a
102
+ statement that the content was wrong.
103
+
104
+ **Raising `mode` on a component whose code already runs** produces an **as-built record**, not a design.
105
+ `wdi-component` writes it, under the evidence labels `sdd-guide.md` owns.
106
+
107
+ ## Intent `structure`
108
+
109
+ The rules for what belongs in a map live in `.constitution/structure-guide.md`. This intent applies
110
+ them; it MUST NOT restate them.
111
+
112
+ 1. **Derive from the tree on disk**, honouring `.gitignore`. A map assembled from what the caller says
113
+ is there is the failure this intent exists to prevent.
114
+ 2. Classify each base folder. For the codebase map the only test is deployability — a **container** runs
115
+ its own code or stores its own data, a **library** is imported by something else, anything else stays
116
+ a line in the top-level tree or in a non-unit section. Size and importance MUST NOT decide it.
117
+ Container headings MUST be **exactly the `built: true` containers** in `components.yaml`: every
118
+ heading is a registered container, and a `built: false` one MUST NOT get a heading because no code of
119
+ ours lives in it. The match is one-directional, and reading it both ways makes it unsatisfiable.
120
+ 3. Draw the convention, not the contents. A shape that repeats MUST be written once with a placeholder.
121
+ 4. Mark key files `★` by the four tests in the guide. Borderline files are left out.
122
+ 5. Write from `templates/structure-codebase.md` and `templates/structure-document.md`. Template comments
123
+ and the skeleton block MUST be deleted from the finished file.
124
+ 6. Stamp `Verified` with the date and the commit SHA the tree was read at.
125
+ 7. Report drift, unclaimed folders, and one-sided Product Components separately. This intent MUST NOT
126
+ fix them.
127
+
128
+ It MAY be run **read-only** — derive, report the drift, write nothing. That is the right mode when the
129
+ caller is unsure: a map is cheap to check and expensive to get wrong.
130
+
131
+ A hand-edited map MUST be treated as drift: re-derive, then say what the hand edit claimed that the tree
132
+ does not support.
133
+
134
+ ## Rules
135
+
136
+ - You MUST NOT write `.what/` or `.how/` content beyond a skeleton and its frontmatter. Behaviour is
137
+ `wdi-blueprint` and `wdi-component`; mechanism is `wdi-component`.
138
+ - You MUST NOT write into `.constitution/`.
139
+ - You MUST NOT fill `mode` or `risk_accepted` with a value the owner has not confirmed. Both are the
140
+ owner's, and a proposal recorded as a decision is the one failure disclosure cannot survive.
141
+ - You MUST NOT create a Product Component because a folder would look tidy. A PC no `FR` points at is a
142
+ folder with nothing inside it.
143
+ - You MUST NOT put database column types in `03-domain/`. That slot holds the conceptual domain model.
144
+
145
+ ## Output
146
+
147
+ Intent taken · what was scaffolded, proposed, or refreshed · for `component`, the slicing with the `FR`
148
+ behind each row and what the owner accepted · for `mode` and `risk`, what was disclosed before the
149
+ proposal · for `structure`, the drift found and what was left unfixed.
@@ -0,0 +1,107 @@
1
+ ---
2
+ name: wdi-log
3
+ description: Use when a fact from outside the code has to be recorded — a meeting that finished, or a non-technical fact that constrains what may be built. Two intents, meeting and fact. Routes decisions and open questions to their own skills.
4
+ ---
5
+
6
+ # WDI Log
7
+
8
+ Free of stage and free of role. Two intents, because both record **a fact that came from outside the code** and
9
+ neither belongs to any gate.
10
+
11
+ | Intent | Owns | Home |
12
+ |---|---|---|
13
+ | `meeting` | What a meeting decided and left open | `.control/meetings/YYYY-MM-DD-<slug>.md` |
14
+ | `fact` | A non-technical fact that constrains what may be built, used, or promised | `.control/project-non-technical-log.md` |
15
+
16
+ They share a shape and a failure mode: both are tempting places to record something that belongs somewhere with
17
+ an owner. Neither MAY absorb a decision or an open question.
18
+
19
+ ## Intent `meeting`
20
+
21
+ ### What the note MUST carry
22
+
23
+ | Section | Content |
24
+ |---|---|
25
+ | Attendees and date | Who was actually there, not who was invited |
26
+ | What was decided | Each decision as one sentence, stated as what now holds |
27
+ | What was left open | Each unresolved item, with who can resolve it |
28
+ | Action items | Grouped by role, each with an owner |
29
+ | `## DEC` | Links to the decisions this meeting produced — filled after `wdi-decision` runs |
30
+
31
+ The `## DEC` back-link makes the trail run both ways. Minutes whose decisions have no `DEC-`, and a `DEC-` with
32
+ no minutes behind it, are both traceability gaps the audit surfaces later at a worse time.
33
+
34
+ ### Rules
35
+
36
+ - It MUST NOT write the decision itself. That goes to `wdi-decision` intent `open`, which numbers it globally.
37
+ Minutes say what was **discussed**; a `DEC-` says what was **chosen** and what it cost.
38
+ - It MUST NOT write to `.what/` or `.how/`. A meeting changes documents only through `wdi-decision` intent
39
+ `apply`.
40
+ - It MUST NOT record an open question only in the note. Those go to `wdi-question`, so they land in one of four
41
+ lists rather than scattered across meetings nobody rereads.
42
+ - Record what was decided, not what was discussed. A transcript is not minutes, and nobody rereads one.
43
+ - A decision recorded with no owner and no consequence MUST be treated as an open question instead. "We agreed
44
+ to look into it" is not a decision.
45
+ - Client commitments MUST be recorded verbatim where the wording matters. Paraphrasing a commitment is how a
46
+ scope dispute starts.
47
+
48
+ ## Intent `fact`
49
+
50
+ `.control/project-non-technical-log.md` is the authority on **what may be recorded** — its content boundary, its
51
+ closed category list, and the table of facts belonging to another home. Read it before acting; this skill MUST
52
+ NOT restate those rules and MUST NOT override them. What this skill owns is **how** the file is read and written.
53
+
54
+ ### Looking one up
55
+
56
+ 1. Read the Berlaku table in full. It is short by design and MUST NOT be sampled with grep alone — a fact retired
57
+ last week reads as current when only its row is seen.
58
+ 2. Check Tidak Berlaku Lagi for the same subject. A superseded entry names its replacement.
59
+ 3. If the answer is absent, **say it is absent.** You MUST NOT infer a fact from a commit message, from
60
+ `.control/memlog/`, or from a sibling repo and report it as recorded — those are leads for registering, not
61
+ answers.
62
+
63
+ An entry marked `[BELUM DIKONFIRMASI]` MUST be reported with that tag attached, never flattened into a plain
64
+ fact.
65
+
66
+ ### Registering one
67
+
68
+ 1. Apply the log's content boundary first. A fact that fails it is refused here and MUST NOT be softened to fit —
69
+ say which rule refused it and where it belongs.
70
+ 2. **Route before writing.** If the fact is a decision expensive to reverse, an open question, a meeting outcome,
71
+ a domain term, or an infrastructure asset detail, its own skill or repo runs first. A row here MAY then hold
72
+ only the consequence for this product, pointing at that home.
73
+ 3. Assign the next `NT-NNN` from the highest id ever used, including retired ones. An id MUST NOT be reused.
74
+ 4. Fill every column. `Akibat` MUST name something in this repo — a gate, an `FR`, a prerequisite, a file.
75
+ `Sumber` MUST name a person, a repo and path, or another entry id.
76
+ 5. A fact whose source is hearsay MUST be written with `[BELUM DIKONFIRMASI]` **and** filed through
77
+ `wdi-question` in the same run. Recording it and leaving it unowned is the failure this step exists to stop.
78
+
79
+ **One fact, one row.** A single event producing several facts — a domain bought, and a launch date it makes
80
+ possible — MUST become several rows, because they stop holding at different times.
81
+
82
+ ### Updating one
83
+
84
+ A fact that changed is **never** edited in place, and its row is never deleted.
85
+
86
+ 1. Move the old row to Tidak Berlaku Lagi, filling `Berhenti berlaku` with the date and `Digantikan` with the new
87
+ id.
88
+ 2. Register the new fact as a fresh `NT-NNN`.
89
+ 3. Follow the old row's `Akibat` and check whatever it named. A fact that stops holding usually leaves a document
90
+ behind that still assumes it; that document MUST be raised, and if it sits under an `applied` decision, routed
91
+ to `wdi-decision` intent `apply`.
92
+
93
+ Correcting a typo or a wrong `Sumber` is not an update in this sense and MAY be edited in place.
94
+
95
+ ## Rules
96
+
97
+ - Terms MUST match `.control/product-glossary.md`. A note that coins a new domain noun MUST propose it through
98
+ `wdi-blueprint`, not leave two words meaning the same thing.
99
+ - This skill MUST NOT write any file other than the two it owns. Every other file it touches is reached through
100
+ the skill that owns it.
101
+ - `.control/structure-document.md` MUST NOT be edited to reflect a new entry — it maps folders, not rows, and
102
+ `wdi-init` intent `structure` re-derives it.
103
+
104
+ ## Output
105
+
106
+ Intent taken · what was recorded, in one line · what was **routed** rather than recorded, and to which skill ·
107
+ for `fact`, the `NT-` id and what its `Akibat` names.
@@ -0,0 +1,90 @@
1
+ ---
2
+ name: wdi-problem
3
+ description: Use at G1 Problem — when the product brief is created, updated, or validated. Checks position and preconditions, dispatches bmad-product-brief, then verifies the result against brief-guide.md and the template. Never writes the brief itself.
4
+ ---
5
+
6
+ # WDI Problem
7
+
8
+ G1 decides **what the problem is, whose it is, and why it earns work.** `bmad-product-brief` writes the
9
+ brief; this skill decides whether it should run at all, hands it the right intent, and checks what came
10
+ back. Both halves matter: the override TOML controls **where** the artifact lands, and nothing in BMad
11
+ checks **what is in it**.
12
+
13
+ You MUST NOT write or edit `brief.md` yourself. If a check fails, name what is missing and re-dispatch — a
14
+ hand-patched brief makes the memlog lie about how it got that way.
15
+
16
+ ## Inputs
17
+
18
+ | Source | What it answers |
19
+ |---|---|
20
+ | `.what/_product-brief/brief.md` | Whether a brief already exists, and what intent applies |
21
+ | `.constitution/document/brief-guide.md` | The rules the result is checked against |
22
+ | `.constitution/document/templates/brief.md` | The required shape |
23
+ | `_bmad-output/brainstorming/` · `forge/` · `planning-artifacts/` | Raw material available to feed in |
24
+ | `.control/product-glossary.md` | Terms already fixed, so the brief does not invent competing ones |
25
+
26
+ ## Step 1 — Position
27
+
28
+ - If `brief.md` exists, the intent is **update** or **validate**, never **create**. A second create would
29
+ overwrite the singleton.
30
+ - If a wave is open and the ask is a scope change rather than a problem change, this is the wrong skill.
31
+ Route to `wdi-decision`, which wraps `bmad-correct-course`.
32
+ - If the ask is about one initiative rather than the product, route to `wdi-product`.
33
+
34
+ ## Step 2 — Preconditions
35
+
36
+ None of these block. Each is a question you MUST put to the owner before dispatching, once.
37
+
38
+ | Check | Why it matters |
39
+ |---|---|
40
+ | Is there raw material worth feeding in? | Exploration output in `_bmad-output/` is invisible to the skill unless it is named |
41
+ | Does the claim rest on outside data? | Market size, competitor, stack choice — those want `bmad-deep-recon` first |
42
+ | Is the primary user already obvious? | If not, discovery is not finished and the brief will stall at the gate |
43
+
44
+ ## Step 3 — Dispatch
45
+
46
+ Invoke `bmad-product-brief` with the detected intent. Do not restate the rules to it — they arrive through
47
+ `persistent_facts` and `doc_standards` in `_bmad/custom/bmad-product-brief.toml`. Repeating them here would
48
+ create a second copy that drifts.
49
+
50
+ Name the raw-material files explicitly in the handoff. The skill globs its own output locations, and this
51
+ project redirects them.
52
+
53
+ ## Step 4 — Verify
54
+
55
+ Check the returned brief against the guide. Report every failure; fix none of them by hand.
56
+
57
+ | # | Check | Fails when |
58
+ |---|---|---|
59
+ | 1 | Home | Anything landed outside `.what/_product-brief/` |
60
+ | 2 | Eight required sections present | The template's "drop what does not earn its place" was applied to one of them |
61
+ | 3 | Exactly one `primary` in Who This Serves | Zero, or more than one |
62
+ | 4 | Goals numbered `BG-N` | Numbered `G1`–`G4`, which collides with the gates |
63
+ | 5 | Scope Out written as items | Left implicit |
64
+ | 6 | Memlog at `.control/memlog/brief.md` | A `.memlog.md` appeared inside `.what/` — `--workspace` was used |
65
+ | 7 | No raw material folded in | Research or brainstorming prose copied into the brief instead of cited |
66
+ | 8 | No Product Component list | A slicing was written at G1; it belongs to `wdi-init` intent `component`, after G2 |
67
+ | 9 | `bmad-review` structure + prose ran | `doc_standards` did not fire |
68
+
69
+ Check 6 MUST be fixed immediately rather than reported. A `.memlog.md` inside `.what/` is corpus pollution,
70
+ and every later run compounds it.
71
+
72
+ ## Rules
73
+
74
+ - You MUST NOT land anything from `_bmad-output/` into the corpus beyond the brief itself. Every other
75
+ output has its owner in the table in `corpus-guide.md`, and for exploration output the answer is that it
76
+ stays put.
77
+ - You MUST NOT delete an exploration run folder after feeding it in. The `update` intents re-read the
78
+ original inputs.
79
+ - You MUST NOT open G1 on a brief that has not been through check 9. Gate time is for deciding.
80
+ - A brief concluding the idea is not worth building is a **pass**. You MUST report it as one rather than
81
+ offering to rework it.
82
+ - Every unresolved `[ASSUMPTION]` MUST be filed through `wdi-question` before the gate opens — into
83
+ `assumptions.md` by default, `blocking.md` only through the three tests that file states.
84
+ - When the ask is about the Product Component slicing, this is the wrong skill at any point. Before the list
85
+ exists it belongs to `wdi-init` intent `component`; after G3 a correction goes through `wdi-decision`.
86
+
87
+ ## Output
88
+
89
+ A short report: intent dispatched, what the brief now claims in one line, and the result of all nine checks
90
+ — naming the failures, not summarising them away.