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.
- package/LICENSE +21 -0
- package/README.md +203 -0
- package/bin/wdi-method.js +906 -0
- package/kit/.constitution/README.md +66 -0
- package/kit/.constitution/codebase/brownfield-guide.md +18 -0
- package/kit/.constitution/codebase/conventions-guide.md +18 -0
- package/kit/.constitution/codebase/stack-guide.md +18 -0
- package/kit/.constitution/constitution.md +135 -0
- package/kit/.constitution/document/architecture-guide.md +209 -0
- package/kit/.constitution/document/bmad-guide.md +151 -0
- package/kit/.constitution/document/bmad-skill-register.md +71 -0
- package/kit/.constitution/document/brief-guide.md +94 -0
- package/kit/.constitution/document/corpus-guide.md +341 -0
- package/kit/.constitution/document/decision-guide.md +134 -0
- package/kit/.constitution/document/delivery-flow-guide.md +338 -0
- package/kit/.constitution/document/prd-guide.md +202 -0
- package/kit/.constitution/document/sdd-guide.md +206 -0
- package/kit/.constitution/document/srs-guide.md +147 -0
- package/kit/.constitution/document/templates/addendum.md +71 -0
- package/kit/.constitution/document/templates/architecture-spine.md +100 -0
- package/kit/.constitution/document/templates/brief.md +110 -0
- package/kit/.constitution/document/templates/c4.md +77 -0
- package/kit/.constitution/document/templates/contract.md +52 -0
- package/kit/.constitution/document/templates/cross-cutting.md +80 -0
- package/kit/.constitution/document/templates/decision.md +64 -0
- package/kit/.constitution/document/templates/design-system.md +67 -0
- package/kit/.constitution/document/templates/flow.md +51 -0
- package/kit/.constitution/document/templates/integration.md +69 -0
- package/kit/.constitution/document/templates/inventory.md +69 -0
- package/kit/.constitution/document/templates/lc.md +47 -0
- package/kit/.constitution/document/templates/lifecycle.md +52 -0
- package/kit/.constitution/document/templates/meeting.md +47 -0
- package/kit/.constitution/document/templates/model.md +55 -0
- package/kit/.constitution/document/templates/oq.md +45 -0
- package/kit/.constitution/document/templates/prd.md +226 -0
- package/kit/.constitution/document/templates/questions.md +75 -0
- package/kit/.constitution/document/templates/rtr.md +61 -0
- package/kit/.constitution/document/templates/rules.md +47 -0
- package/kit/.constitution/document/templates/scn.md +40 -0
- package/kit/.constitution/document/templates/sdd.md +146 -0
- package/kit/.constitution/document/templates/srs.md +149 -0
- package/kit/.constitution/document/templates/structure-codebase.md +129 -0
- package/kit/.constitution/document/templates/structure-document.md +90 -0
- package/kit/.constitution/document/templates/uc.md +69 -0
- package/kit/.constitution/document/templates/ux.md +77 -0
- package/kit/.constitution/document/ux-guide.md +99 -0
- package/kit/.constitution/language-guide.md +69 -0
- package/kit/.constitution/method/README.md +169 -0
- package/kit/.constitution/method/artifact-map.md +155 -0
- package/kit/.constitution/method/portability.md +91 -0
- package/kit/.constitution/method/rationale.md +246 -0
- package/kit/.constitution/method-glossary.md +169 -0
- package/kit/.constitution/project/README.md +68 -0
- package/kit/.constitution/repo-guide.md +97 -0
- package/kit/.constitution/scripts/inventory.py +527 -0
- package/kit/.constitution/scripts/timeline.py +665 -0
- package/kit/.constitution/scripts/validate.py +1579 -0
- package/kit/.constitution/structure-guide.md +202 -0
- package/kit/assets/bmad-custom/bmad-advanced-elicitation.toml +15 -0
- package/kit/assets/bmad-custom/bmad-architecture.toml +31 -0
- package/kit/assets/bmad-custom/bmad-build-auto.toml +10 -0
- package/kit/assets/bmad-custom/bmad-build.toml +52 -0
- package/kit/assets/bmad-custom/bmad-code-review.toml +12 -0
- package/kit/assets/bmad-custom/bmad-correct-course.toml +27 -0
- package/kit/assets/bmad-custom/bmad-deep-recon.toml +11 -0
- package/kit/assets/bmad-custom/bmad-prd.toml +42 -0
- package/kit/assets/bmad-custom/bmad-product-brief.toml +34 -0
- package/kit/assets/bmad-custom/bmad-retrospective.toml +9 -0
- package/kit/assets/bmad-custom/bmad-spec.toml +15 -0
- package/kit/assets/bmad-custom/bmad-ux.toml +19 -0
- package/kit/assets/bmad-custom/config.toml +6 -0
- package/kit/skills/wdi-blueprint/SKILL.md +203 -0
- package/kit/skills/wdi-build/SKILL.md +244 -0
- package/kit/skills/wdi-component/SKILL.md +172 -0
- package/kit/skills/wdi-decision/.gitkeep +0 -0
- package/kit/skills/wdi-decision/SKILL.md +183 -0
- package/kit/skills/wdi-help/.gitkeep +0 -0
- package/kit/skills/wdi-help/SKILL.md +98 -0
- package/kit/skills/wdi-init/SKILL.md +149 -0
- package/kit/skills/wdi-log/SKILL.md +107 -0
- package/kit/skills/wdi-problem/SKILL.md +90 -0
- package/kit/skills/wdi-product/SKILL.md +127 -0
- package/kit/skills/wdi-question/.gitkeep +0 -0
- package/kit/skills/wdi-question/SKILL.md +88 -0
- package/kit/skills/wdi-reconcile/.gitkeep +0 -0
- package/kit/skills/wdi-reconcile/SKILL.md +146 -0
- package/kit/skills/wdi-report/SKILL.md +205 -0
- package/kit/skills/wdi-review/SKILL.md +118 -0
- package/kit/skills/wdi-systematic-debugging/SKILL.md +193 -0
- package/kit/skills/wdi-systematic-debugging/references/condition-based-waiting.md +115 -0
- package/kit/skills/wdi-systematic-debugging/references/defense-in-depth.md +122 -0
- package/kit/skills/wdi-systematic-debugging/references/find-polluter.sh +72 -0
- package/kit/skills/wdi-systematic-debugging/references/root-cause-tracing.md +169 -0
- package/kit/skills/wdi-ux/SKILL.md +145 -0
- package/kit-overlay/AGENTS.md +196 -0
- package/kit-overlay/README.md +66 -0
- package/kit-overlay/constitution.md +135 -0
- package/kit-overlay/portability.md +91 -0
- package/kit-overlay/repo-guide.md +97 -0
- package/lib/agents-block.mjs +52 -0
- package/lib/identity.mjs +65 -0
- package/package.json +37 -0
- package/scaffold/.control/decisions/.gitkeep +0 -0
- package/scaffold/.control/generated/.gitkeep +2 -0
- package/scaffold/.control/meetings/.gitkeep +0 -0
- package/scaffold/.control/memlog/.gitkeep +0 -0
- package/scaffold/.control/product-glossary.md +21 -0
- package/scaffold/.control/project-non-technical-log.md +23 -0
- package/scaffold/.control/questions/answered.md +11 -0
- package/scaffold/.control/questions/assumptions.md +15 -0
- package/scaffold/.control/questions/blocking.md +21 -0
- package/scaffold/.control/questions/external.md +11 -0
- package/scaffold/.control/registry/components.yaml +21 -0
- package/scaffold/.control/registry/decisions.yaml +6 -0
- package/scaffold/.control/registry/defects.yaml +3 -0
- package/scaffold/.control/registry/index.yaml +46 -0
- package/scaffold/.control/registry/requirements.yaml +15 -0
- package/scaffold/.control/registry/risks.yaml +5 -0
- package/scaffold/.control/registry/usecases.yaml +6 -0
- package/scaffold/.control/registry/waves.yaml +5 -0
- package/scaffold/.control/structure-codebase.md +19 -0
- package/scaffold/.control/structure-document.md +25 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
status: Reference
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# `.constitution/` — index
|
|
6
|
+
|
|
7
|
+
Method files arrive from the public WDI Method package via `npx wdi-method install`
|
|
8
|
+
or `update`. Load [`constitution.md`](constitution.md) before acting. Guides are
|
|
9
|
+
loaded **lazily** — only when the task matches, and every guide states when on its
|
|
10
|
+
own **Loaded when:** line.
|
|
11
|
+
|
|
12
|
+
Every file here carries a `status:` — Article 4 owns the five values. Only `Accepted` binds;
|
|
13
|
+
`Reference` explains and MUST NOT be cited to reject a change. A template carries no status of its
|
|
14
|
+
own, because its frontmatter belongs to the artifact it produces.
|
|
15
|
+
|
|
16
|
+
A file this product added (one that is not in the snapshot) stays here across `update` and MUST be
|
|
17
|
+
listed from `constitution.md` Article 2 or from `AGENTS.md` routing — this index is overwritten on
|
|
18
|
+
every update.
|
|
19
|
+
|
|
20
|
+
## `method/` — the explanation, `status: Reference`
|
|
21
|
+
|
|
22
|
+
Never a rule. When it disagrees with a guide, the guide wins and the disagreement is a defect.
|
|
23
|
+
|
|
24
|
+
| File | Opened when |
|
|
25
|
+
|---|---|
|
|
26
|
+
| [`method/README.md`](method/README.md) | You want the whole shape in five minutes — five gates, two settings, fifteen skills, WDI ↔ BMad |
|
|
27
|
+
| [`method/artifact-map.md`](method/artifact-map.md) | "Where does this file go", or "does this document exist at my `mode`" |
|
|
28
|
+
| [`method/rationale.md`](method/rationale.md) | Before changing a rule, to know what you would break |
|
|
29
|
+
| [`method/portability.md`](method/portability.md) | Which files are the method and which are the product; how promote and install move them |
|
|
30
|
+
|
|
31
|
+
## Cross-domain
|
|
32
|
+
|
|
33
|
+
| File | Loaded when |
|
|
34
|
+
|---|---|
|
|
35
|
+
| [`repo-guide.md`](repo-guide.md) | Adding a file that is neither code nor corpus; the content boundary, `.work/`, cross-repo references |
|
|
36
|
+
| [`language-guide.md`](language-guide.md) | Naming anything — a code identifier, a code file, a document file |
|
|
37
|
+
| [`method-glossary.md`](method-glossary.md) | Unsure what a method term means — layer, wave, Product Component, ID code |
|
|
38
|
+
| [`structure-guide.md`](structure-guide.md) | Writing or checking the two structure maps in `.control/` |
|
|
39
|
+
|
|
40
|
+
## `document/` — document rules
|
|
41
|
+
|
|
42
|
+
| File | Governs |
|
|
43
|
+
|---|---|
|
|
44
|
+
| [`corpus-guide.md`](document/corpus-guide.md) | Where a file lives. Read before the other guides |
|
|
45
|
+
| [`delivery-flow-guide.md`](document/delivery-flow-guide.md) | Five gates, `mode`, `risk_accepted`, the gate checklists, units of work, wave size, Fast Path, the story-closing checklist, change control |
|
|
46
|
+
| [`bmad-guide.md`](document/bmad-guide.md) | How BMad skills are used here; classes A–D, the read-write map, memlog |
|
|
47
|
+
| [`bmad-skill-register.md`](document/bmad-skill-register.md) | The installed BMad skills with the documents each reads and writes |
|
|
48
|
+
| [`brief-guide.md`](document/brief-guide.md) · [`prd-guide.md`](document/prd-guide.md) · [`ux-guide.md`](document/ux-guide.md) | The G1 and G2 artifacts |
|
|
49
|
+
| [`srs-guide.md`](document/srs-guide.md) · [`sdd-guide.md`](document/sdd-guide.md) | The G3 and G4 artifacts, per Product Component |
|
|
50
|
+
| [`architecture-guide.md`](document/architecture-guide.md) | The architecture spine, `AD-N`, C4, and the three inventories |
|
|
51
|
+
| [`decision-guide.md`](document/decision-guide.md) | `DEC-`: the one test for recording at all, shape, global numbering, the `draft → accepted → applied` ladder, supersession |
|
|
52
|
+
| [`templates/`](document/templates/) | Templates, one per kind of document; they MUST be copied, and MUST NOT be reproduced from memory |
|
|
53
|
+
|
|
54
|
+
## `codebase/` — code rules
|
|
55
|
+
|
|
56
|
+
All three are written by the **project**, not the kit. While `Draft`, their contents MAY be read as
|
|
57
|
+
guidance but MUST NOT be used to reject a change.
|
|
58
|
+
|
|
59
|
+
[`stack-guide.md`](codebase/stack-guide.md) · [`conventions-guide.md`](codebase/conventions-guide.md) · [`brownfield-guide.md`](codebase/brownfield-guide.md)
|
|
60
|
+
|
|
61
|
+
## `scripts/`
|
|
62
|
+
|
|
63
|
+
`validate.py` — registry gates and the `.control/generated/` generator. `timeline.py` — the time
|
|
64
|
+
dimension from git history. `inventory.py` — derives the three inventories from code and reports the
|
|
65
|
+
difference against the plan; it MUST NOT patch either side into agreement. All three run through
|
|
66
|
+
`uv run`.
|
|
@@ -0,0 +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.
|
|
@@ -0,0 +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.
|
|
@@ -0,0 +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.
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
---
|
|
2
|
+
status: Accepted
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Constitution — {product}
|
|
6
|
+
|
|
7
|
+
Rewrite Articles 2 and 5 for the product this repo is. Article 1 cites
|
|
8
|
+
`.control/registry/index.yaml` — replace `{product}` there at G1, not here.
|
|
9
|
+
Articles 3, 4, 6, and 7 are the method and travel unchanged.
|
|
10
|
+
|
|
11
|
+
An agent working here MUST be able to act on the contents of this repo alone.
|
|
12
|
+
|
|
13
|
+
## Article 1 — Scope
|
|
14
|
+
|
|
15
|
+
This repo covers the product named at `product.name` in
|
|
16
|
+
`.control/registry/index.yaml`. One product, one repo. A second product MUST
|
|
17
|
+
get a repo of its own.
|
|
18
|
+
|
|
19
|
+
`product.client` in the same file names the client if there is one, and stays
|
|
20
|
+
empty if there is not. The product brief at G1 uses `product.name` as its
|
|
21
|
+
title. Neither this file nor the brief is a second source of the name.
|
|
22
|
+
|
|
23
|
+
An agent working here MUST NOT demand that sibling organisation repositories
|
|
24
|
+
be open in the same session.
|
|
25
|
+
|
|
26
|
+
## Article 2 — Content boundary, `.work/`, and cross-repo references
|
|
27
|
+
|
|
28
|
+
All three are governed by [`repo-guide.md`](repo-guide.md). Its rules MUST NOT be
|
|
29
|
+
repeated here — one rule, one place.
|
|
30
|
+
|
|
31
|
+
What is particular to this repo, and therefore lives here:
|
|
32
|
+
|
|
33
|
+
- Name any extra boundary this product has (a public-repo rule, a ban on `3p.md`,
|
|
34
|
+
a `.work/` resting state). If there is none, delete this bullet list and the
|
|
35
|
+
sentence above it.
|
|
36
|
+
- `3p.md` MUST NOT be created in a product repo. Operational engagement memory
|
|
37
|
+
lives outside.
|
|
38
|
+
|
|
39
|
+
## Article 3 — Layers
|
|
40
|
+
|
|
41
|
+
The repo layout is governed by `corpus-guide.md` and mapped by
|
|
42
|
+
`.control/structure-document.md`. What MUST be known before opening either:
|
|
43
|
+
|
|
44
|
+
| Path | Role |
|
|
45
|
+
|---|---|
|
|
46
|
+
| `.constitution/` | Rules — how we work. `method/` holds the non-binding explanation of them |
|
|
47
|
+
| `.control/` | Control — what currently holds and what has been decided |
|
|
48
|
+
| `.what/` | What is promised |
|
|
49
|
+
| `.how/` | How it is built |
|
|
50
|
+
| `_bmad-output/` | Run workspace; committed, not curated |
|
|
51
|
+
| `.work/` | Scratch; committed, emptied when a task closes |
|
|
52
|
+
| *(application roots)* | Application code — name them in this row |
|
|
53
|
+
|
|
54
|
+
The method does not use a `docs/` layer for corpus or rules. A leftover `docs/`
|
|
55
|
+
folder is inventory to sort, not a second home.
|
|
56
|
+
|
|
57
|
+
## Article 4 — Lifecycle
|
|
58
|
+
|
|
59
|
+
Every `.constitution/` file MUST carry a `status:` frontmatter, and it MUST be one of five:
|
|
60
|
+
|
|
61
|
+
| Status | Means |
|
|
62
|
+
|---|---|
|
|
63
|
+
| `Accepted` | **Binds.** It MAY be cited as the reason to reject a change |
|
|
64
|
+
| `Reference` | **Explains, does not bind.** It MUST NOT be cited as the reason to reject a change, and MUST NOT be installed as `doc_standards` or `persistent_facts` |
|
|
65
|
+
| `Draft` | Not settled. Its contents MAY be read as guidance but MUST NOT be used to reject a change |
|
|
66
|
+
| `Superseded` | Replaced. It MUST name its replacement |
|
|
67
|
+
| `Cancelled` | Withdrawn without a replacement, and kept so nobody rewrites it |
|
|
68
|
+
|
|
69
|
+
**One exception, by construction:** a file in `document/templates/` MUST NOT carry a `status:` of its own.
|
|
70
|
+
A template's frontmatter is the *artifact's* frontmatter — it is copied into what the template produces —
|
|
71
|
+
so a status there would land in the artifact and mean something else entirely.
|
|
72
|
+
|
|
73
|
+
A missing header anywhere else is a **finding**, not an implicit anything.
|
|
74
|
+
|
|
75
|
+
`Reference` exists so that the *explanation* of a rule can live beside the rule without competing with it —
|
|
76
|
+
`method/` holds four such files. Where a `Reference` file and an `Accepted` one disagree, the `Accepted`
|
|
77
|
+
one wins, and the disagreement MUST be reported as a defect rather than resolved by preferring whichever was
|
|
78
|
+
opened first. A rule MUST NOT be born in a `Reference` file; when one is noticed there, it is stated as a
|
|
79
|
+
finding and written in the guide that owns it.
|
|
80
|
+
|
|
81
|
+
## Article 5 — The method arrives from WDI Method
|
|
82
|
+
|
|
83
|
+
This is the **consumer** article. Use it in every product repo.
|
|
84
|
+
|
|
85
|
+
`.constitution/` guides and templates (except this file's Articles 1, 2, and 5,
|
|
86
|
+
`codebase/*-guide.md`, and any extra file this repo added), the `wdi-*` skills,
|
|
87
|
+
and `_bmad/custom/*.toml` arrive from the public WDI Method package via
|
|
88
|
+
`npx wdi-method install` / `update`.
|
|
89
|
+
|
|
90
|
+
- A method file MUST NOT be invented or patched here to improve the method. If a
|
|
91
|
+
rule is wrong, it is fixed in the WDI Method package, then brought here with
|
|
92
|
+
`update`.
|
|
93
|
+
- `wdi-method update` MUST overwrite method files and MUST NOT touch `.what/`,
|
|
94
|
+
`.how/`, `.control/` product state, this file's Articles 1–2 and 5,
|
|
95
|
+
`codebase/*-guide.md` once `Accepted`, extra constitution files this repo
|
|
96
|
+
added, or `_bmad/custom/*.user.toml`.
|
|
97
|
+
- A rule particular to this repo MUST be written out in full in this file or a
|
|
98
|
+
sibling, and MUST NOT be replaced by a pointer into another repository.
|
|
99
|
+
|
|
100
|
+
A prefix in `.claude/skills/` names the **method**, not the owner: `bmad-*` is
|
|
101
|
+
BMad's, `wdi-*` is this method's.
|
|
102
|
+
|
|
103
|
+
## Article 6 — Decisions
|
|
104
|
+
|
|
105
|
+
A decision worth remembering is a `DEC-NNN`. Its shape, the one test that decides whether it is
|
|
106
|
+
recorded at all, global numbering, the `draft → accepted → applied` status ladder, and supersession
|
|
107
|
+
are governed by [`document/decision-guide.md`](document/decision-guide.md). Decisions live in
|
|
108
|
+
`.control/decisions/` and are registered in `.control/registry/decisions.yaml`.
|
|
109
|
+
|
|
110
|
+
Recording a decision is **not mandatory**, and one case is: a decision that contradicts or changes an
|
|
111
|
+
`AD-N`. The guide owns both halves and they MUST NOT be restated here.
|
|
112
|
+
|
|
113
|
+
The name ADR is retired, along with `layer:` and `component:` on a decision. `ADR-NNN` appearing in a
|
|
114
|
+
document frozen before that date is a retired alias for `DEC-NNN`, and those documents MUST NOT be
|
|
115
|
+
rewritten for the prefix. A course correction is a `DEC-` of `type: course-correction`.
|
|
116
|
+
|
|
117
|
+
## Article 7 — Non-technical facts
|
|
118
|
+
|
|
119
|
+
A non-technical fact that constrains what may be built, used, or promised — a domain now held, a
|
|
120
|
+
third-party account now active, the legal entity a screen must name, a date that locks scope — MUST
|
|
121
|
+
be recorded in `.control/project-non-technical-log.md`, and MUST NOT be scattered into a `DEC-`, a
|
|
122
|
+
PRD, or a code comment as though it were an engineering constraint.
|
|
123
|
+
|
|
124
|
+
That file states its own entry shape, its closed category list, and which facts belong to another
|
|
125
|
+
home instead. It MUST be written through the skill `wdi-log` intent `fact`, never by hand.
|
|
126
|
+
|
|
127
|
+
Two boundaries hold over it and MUST NOT be relaxed there:
|
|
128
|
+
|
|
129
|
+
- The content boundary in [`repo-guide.md`](repo-guide.md). This file is not an exemption from it;
|
|
130
|
+
a commercial fact does not become admissible by being called non-technical.
|
|
131
|
+
- Article 2's ban on `3p.md`. Operational engagement memory stays outside this repo, and the log
|
|
132
|
+
MUST NOT grow into a substitute for it.
|
|
133
|
+
|
|
134
|
+
It is control, not chronology. What happened on a given day is recovered from git by `wdi-report`;
|
|
135
|
+
what is recorded here is what still holds.
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
---
|
|
2
|
+
status: Accepted
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Architecture Guide
|
|
6
|
+
|
|
7
|
+
**Loaded when:** writing or changing the architecture spine, an `AD-N`, or the C4 set
|
|
8
|
+
|
|
9
|
+
The spine holds the invariants that stop separately built components from diverging. It is not a design
|
|
10
|
+
document — one component's design is its `SDD-<pc>.md`. If a statement only affects one component, it does
|
|
11
|
+
not belong here.
|
|
12
|
+
|
|
13
|
+
The spine, the C4 set, `cross-cutting.md`, and the three inventories are all **G3 Blueprint** output, written
|
|
14
|
+
by `wdi-blueprint` intent `platform`. All of them exist at every `mode`, including `catalog`: they belong to
|
|
15
|
+
the blueprint, and the blueprint is not touched by the depth knob.
|
|
16
|
+
|
|
17
|
+
## Home
|
|
18
|
+
|
|
19
|
+
`.how/_platform/ARCHITECTURE-SPINE.md` — a file directly in `_platform/`. The `architecture/` sub-folder is
|
|
20
|
+
**repealed**; one file does not earn a folder, and the extra level made the spine harder to find than the
|
|
21
|
+
things it constrains.
|
|
22
|
+
|
|
23
|
+
## Invariants only
|
|
24
|
+
|
|
25
|
+
An entry earns a place when breaking it in one component would break another. Everything else is a **seed**:
|
|
26
|
+
useful as a starting point, not binding.
|
|
27
|
+
|
|
28
|
+
| Kind of statement | Spine? |
|
|
29
|
+
|---|---|
|
|
30
|
+
| "Every service authenticates through the same token format" | Yes — invariant |
|
|
31
|
+
| "Money is stored as integer minor units, never float" | Yes — invariant |
|
|
32
|
+
| "We use MariaDB 11 and Go 1.23" | No — seed. It informs, it does not forbid |
|
|
33
|
+
| "The repo is laid out as `src/` and `web/`" | No — seed, and `structure-codebase.md` describes it |
|
|
34
|
+
| "The member portal caches its dashboard for 60 seconds" | No — one component's design |
|
|
35
|
+
|
|
36
|
+
Stack, tree shape, and data shapes are seeds and MUST be marked as such. Writing them as contracts makes the
|
|
37
|
+
spine wrong the first time anything is upgraded, and a spine that is wrong in a visible place stops being
|
|
38
|
+
read in the places where it is right.
|
|
39
|
+
|
|
40
|
+
## Every `AD-N` carries three things
|
|
41
|
+
|
|
42
|
+
| Field | States |
|
|
43
|
+
|---|---|
|
|
44
|
+
| **Binds** | Which components or containers this holds for. "All" is a valid answer and MUST be written, not left blank |
|
|
45
|
+
| **Prevents** | The concrete failure this exists to stop. Written as the thing going wrong, not as a principle |
|
|
46
|
+
| **Rule** | One sentence, quotable, checkable. If a reviewer cannot tell whether code obeys it, it is not a rule yet |
|
|
47
|
+
|
|
48
|
+
An `AD-N` with no **Prevents** is a preference. Preferences belong in
|
|
49
|
+
`.constitution/codebase/conventions-guide.md`, where nothing has to justify itself.
|
|
50
|
+
|
|
51
|
+
## The spine stops being touched every story
|
|
52
|
+
|
|
53
|
+
This is the change that ends the tax that was being paid before the information existed.
|
|
54
|
+
|
|
55
|
+
- **The spine holds invariants and nothing else.** It changes only when an `AD-N` is born or reversed, and
|
|
56
|
+
both are decision events. For a mid-sized product: once at the start, around 6–10 `AD-N`, then almost
|
|
57
|
+
never.
|
|
58
|
+
- **A story MUST NOT touch the spine.** A story that contradicts an `AD-N` **stops** and opens a `DEC-` —
|
|
59
|
+
the one case where recording a decision is still mandatory.
|
|
60
|
+
- **Editing an `AD-N` MUST NOT quietly reverse it.** A reversal is a decision, and it goes through
|
|
61
|
+
`wdi-decision` first.
|
|
62
|
+
- **An inventory is not the spine.** The three inventories are living registers, derived from code once code
|
|
63
|
+
exists. A plan-versus-reality difference is a validator finding, not a spine amendment.
|
|
64
|
+
|
|
65
|
+
## `AD-N` versus `DEC-NNN`
|
|
66
|
+
|
|
67
|
+
`AD-N` is a **living rule**, edited in place as understanding improves. `DEC-NNN` is a **decision event**,
|
|
68
|
+
never edited once `applied`, only superseded.
|
|
69
|
+
|
|
70
|
+
An `AD-N` usually has a `DEC-` behind it: the invariant is what people obey, the decision record is why it
|
|
71
|
+
exists and what it cost. The full comparison is in `decision-guide.md` and MUST NOT be restated here.
|
|
72
|
+
|
|
73
|
+
The spine MUST NOT name a decision's alternatives or its cost. Those live in the `DEC-` behind it; repeating
|
|
74
|
+
them here creates a second version that will drift.
|
|
75
|
+
|
|
76
|
+
## The C4 set, and what else a run produces
|
|
77
|
+
|
|
78
|
+
`bmad-architecture` runs at **initiative** altitude for the spine. Anything else the run produces at feature
|
|
79
|
+
altitude — a deck, a fuller solution document — is a **rendering**, not the spine, and the two MUST NOT be
|
|
80
|
+
confused:
|
|
81
|
+
|
|
82
|
+
| Rendering | Has a slot | What follows |
|
|
83
|
+
|---|---|---|
|
|
84
|
+
| The **C4 set** — L1, L2, and one L3 per `built: true` container **holding more than one Product Component** | Yes: `.how/_platform/c4-l1-system-context.md` · `c4-l2-containers.md` · `c4-l3-<container>.md` | `wdi-blueprint` lands it, amending rather than overwriting. Once landed it is corpus, and `c4-l2-containers.md` **owns** the container list. The next section owns what a container *is* |
|
|
85
|
+
| Deck, solution document, anything else | No | Stays in the run folder, cited by path, never promoted |
|
|
86
|
+
|
|
87
|
+
**Placement is what makes a C4 binding, and only for what its level owns.** Before placement it is one run's
|
|
88
|
+
drawing; after, it is the corpus's description of the system. The spine still wins on any invariant, because
|
|
89
|
+
the C4 set describes and the spine forbids. A C4 file MUST NOT be used to justify a rule; a rule that matters
|
|
90
|
+
belongs in an `AD-N`.
|
|
91
|
+
|
|
92
|
+
The C4 set is **living**. It is amended when a container is added or changed — it MUST NOT be regenerated from
|
|
93
|
+
scratch, which would drop the annotations three waves of amendment put there.
|
|
94
|
+
|
|
95
|
+
## What counts as a container, and what does not
|
|
96
|
+
|
|
97
|
+
Two questions, and **both MUST be yes**:
|
|
98
|
+
|
|
99
|
+
1. **Does it run its own code or store its own data?** Its own process, its own browser page, its own
|
|
100
|
+
engine — not a folder inside another container's process.
|
|
101
|
+
2. **Can it be replaced without rebuilding another container?** It has its own build or publish path.
|
|
102
|
+
|
|
103
|
+
**Shipping two containers in one release does not merge them.** One atomic deploy swapping a binary and
|
|
104
|
+
two browser bundles together is a deployment choice, and a deployment choice MUST NOT be read as an
|
|
105
|
+
architectural one. The failure this guards against is the quiet one: a browser bundle with its own
|
|
106
|
+
JavaScript filed as "static assets" of the web server, carrying real behaviour with no row, no owner, and
|
|
107
|
+
no NFR. Handwritten HTML that runs **no** code of its own is content the web server delivers; the moment
|
|
108
|
+
it carries a script, it passes question 1.
|
|
109
|
+
|
|
110
|
+
### `built` — the one boolean, and its four consequences
|
|
111
|
+
|
|
112
|
+
A container is inside the boundary whether or not we wrote it. `built:` records which:
|
|
113
|
+
|
|
114
|
+
| | `built: true` | `built: false` |
|
|
115
|
+
|---|---|---|
|
|
116
|
+
| An L3 | Yes, where it holds more than one PC | **Never.** No box inside it is ours to draw |
|
|
117
|
+
| An `LC` naming it as `container` | Yes | **Never** |
|
|
118
|
+
| A heading in `structure-codebase.md` | **Required** | **Never** — no code of ours lives there |
|
|
119
|
+
| Listed in a PC's `containers:` | Yes | **Never** — see the matrix below |
|
|
120
|
+
|
|
121
|
+
V25 checks all four. This is what makes the class settled rather than re-argued: a database and a web
|
|
122
|
+
server are containers, they carry NFRs, and they still produce no design artifact of ours.
|
|
123
|
+
|
|
124
|
+
**What IS ours about a `built: false` container MUST have a home outside the C4 set** — its configuration
|
|
125
|
+
and any invariant it enforces belong in an `AD-N` or in `cross-cutting.md`. A rule surviving only as a
|
|
126
|
+
note beside a C4 box is a rule nobody can find.
|
|
127
|
+
|
|
128
|
+
### External system — outside the boundary
|
|
129
|
+
|
|
130
|
+
**The line is who deploys the runtime.** We deploy it, whoever wrote it → container. Someone else
|
|
131
|
+
runs it and we call it or configure it through their control plane → external system.
|
|
132
|
+
|
|
133
|
+
An external system appears at **C4 L1 and nowhere else**. It MUST NOT be registered in `containers`,
|
|
134
|
+
MUST NOT be an `LC`'s `container`, and MUST NOT get a heading in the codebase map. What the product
|
|
135
|
+
depends on it for lives in `cross-cutting.md` or an integration contract.
|
|
136
|
+
|
|
137
|
+
### The PC × container matrix
|
|
138
|
+
|
|
139
|
+
A PC and a container cross, so neither list implies the other — and the crossing is what a builder needs
|
|
140
|
+
first: *which container does this promise live in, and is it more than one?*
|
|
141
|
+
|
|
142
|
+
- The **SSOT is each PC's `containers:`** in `components.yaml`; C4 L2 renders it, and V25 fails when the
|
|
143
|
+
two disagree.
|
|
144
|
+
- Complete at **G3** for every PC. It is blueprint content, so `mode` does not touch it.
|
|
145
|
+
- A PC MUST list every `built: true` container it lives in. Listing only the main one is the error the
|
|
146
|
+
matrix exists to catch.
|
|
147
|
+
|
|
148
|
+
### Which C4 files exist, and when
|
|
149
|
+
|
|
150
|
+
`artifact-map.md` owns the schedule: all three at **G3**, at every `mode`. Two conditions belong here.
|
|
151
|
+
|
|
152
|
+
**L2 MUST be complete** — every container, plus the matrix. **L3 exists once per `built: true` container
|
|
153
|
+
holding more than one PC**; a one-PC container needs none because the matrix already places it.
|
|
154
|
+
|
|
155
|
+
**Not one of the three waits for a wave.** Which container a PC lives in cannot be discovered by a wave,
|
|
156
|
+
because a wave picks its stories from that answer — a wave forced to invent it answers a G3 question with
|
|
157
|
+
a fraction of G3's information.
|
|
158
|
+
|
|
159
|
+
## Cross-cutting
|
|
160
|
+
|
|
161
|
+
`.how/_platform/cross-cutting.md` holds what is defined once for the whole product, the error envelope first
|
|
162
|
+
among them. Every contract references it rather than restating it.
|
|
163
|
+
|
|
164
|
+
A rule that belongs there MUST NOT also be written as an `AD-N` unless breaking it in one component breaks
|
|
165
|
+
another. One fact, one home.
|
|
166
|
+
|
|
167
|
+
**The platform MAY own things, and owning one costs a row here.** `_platform` is a legitimate owner in every
|
|
168
|
+
position that asks which component owns something — a domain entity through `platform_owns`, an inventory row,
|
|
169
|
+
an `LC`. Whatever it owns MUST be described under `## Milik platform` in this file: what it is, its kind, why
|
|
170
|
+
no component's promise explains it, who touches it, and the shape every toucher obeys. V21 checks that second
|
|
171
|
+
half, because a platform that owns something without documenting it has taken ownership without taking
|
|
172
|
+
responsibility.
|
|
173
|
+
|
|
174
|
+
Four kinds qualify today — data, endpoint, job, screen — and the list is open. What is **not** open is the
|
|
175
|
+
test, and `corpus-guide.md` owns it: no single component's promise explains it, **and** more than one
|
|
176
|
+
component depends on it. Failing either half, it belongs to a component.
|
|
177
|
+
|
|
178
|
+
`_platform` is **not** a Product Component — `corpus-guide.md` owns that distinction and the test for when an
|
|
179
|
+
entity legitimately belongs here. It has no `mode` and no `risk_accepted`: the documents in this folder exist
|
|
180
|
+
at every mode.
|
|
181
|
+
|
|
182
|
+
## Binding order
|
|
183
|
+
|
|
184
|
+
Spine first, then the SDD, then `bmad-spec`. An `SDD-<pc>.md` written before the spine will be rewritten,
|
|
185
|
+
because the constraints it was supposed to inherit did not exist yet. A `SPEC.md` written before the SDD has
|
|
186
|
+
nothing to project. `bmad-spec` MUST keep `AD` ids stable so downstream artifacts can cite them.
|
|
187
|
+
|
|
188
|
+
## Inheritance downward
|
|
189
|
+
|
|
190
|
+
From `mode: guarded` up, every `AD-N` that reaches a component MUST appear in that component's SDD under
|
|
191
|
+
**Inherited Constraints**, quoted rather than paraphrased. Below `guarded` the quoting is not written, and the
|
|
192
|
+
spine still binds — an invariant does not stop holding because a document is thin.
|
|
193
|
+
|
|
194
|
+
## Review is manual here
|
|
195
|
+
|
|
196
|
+
`bmad-architecture` excludes the spine from `doc_standards` deliberately — the spine is terse by design and
|
|
197
|
+
prose polish softens rules that need to stay rigid. Two consequences:
|
|
198
|
+
|
|
199
|
+
- This guide is installed as `persistent_facts`, not `doc_standards`.
|
|
200
|
+
- `bmad-review` over the spine MUST be invoked through `wdi-review` before G3 closes.
|
|
201
|
+
|
|
202
|
+
## Rules
|
|
203
|
+
|
|
204
|
+
- The spine MUST stay short enough to be read in one sitting. An `AD-N` nobody remembers is not an invariant,
|
|
205
|
+
it is a document.
|
|
206
|
+
- An `AD-N` MUST NOT be added because something feels important. The test is only ever: does breaking this in
|
|
207
|
+
one place break another?
|
|
208
|
+
- Structure statements MUST be marked as seeds, and MUST NOT be checked as if they were rules.
|
|
209
|
+
- Memlog goes to `.control/memlog/spine.md` via `--path`, never beside the spine.
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
---
|
|
2
|
+
status: Accepted
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# BMad Guide
|
|
6
|
+
|
|
7
|
+
**Loaded when:** invoking any BMad skill, or placing its output
|
|
8
|
+
|
|
9
|
+
BMad supplies the skills; this method supplies the corpus they write into. This guide states which
|
|
10
|
+
route we run, where each skill's output belongs, and the places where BMad's defaults would put a
|
|
11
|
+
file somewhere this method cannot use.
|
|
12
|
+
|
|
13
|
+
The per-skill read/write map lives in `bmad-skill-register.md` and MUST NOT be duplicated here.
|
|
14
|
+
|
|
15
|
+
## Stories mode only
|
|
16
|
+
|
|
17
|
+
BMad offers two routes. We run one.
|
|
18
|
+
|
|
19
|
+
| | Sprint route | **Stories route — ours** |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| Planning artifact | `epics.md` | `.what/<pc>/SRS-<pc>.md` + `SPEC.md` + `stories.yaml` |
|
|
22
|
+
| Status home | `sprint-status.yaml` | Story-file frontmatter |
|
|
23
|
+
| Produced by | `bmad-create-epics-and-stories` · `bmad-sprint-planning` | `bmad-spec` |
|
|
24
|
+
|
|
25
|
+
`bmad-create-epics-and-stories` and `bmad-sprint-planning` are **NOT USED**. Neither MUST be invoked,
|
|
26
|
+
and neither MUST be named as a gate condition.
|
|
27
|
+
|
|
28
|
+
The sprint route was dropped because it keeps status in a hand-edited file. Two workers running in
|
|
29
|
+
parallel then contend for one file, and status becomes something a worker declares about itself.
|
|
30
|
+
Reading status from story-file frontmatter removes both problems — V18 checks it.
|
|
31
|
+
|
|
32
|
+
## Skill classes
|
|
33
|
+
|
|
34
|
+
The criterion is **lifetime**, not importance:
|
|
35
|
+
|
|
36
|
+
| Class | Criterion | Output home |
|
|
37
|
+
|---|---|---|
|
|
38
|
+
| **A** | A living document, still correct after the wave | Straight into `.what/` or `.how/` |
|
|
39
|
+
| **B** | Living, but its granularity is not configurable | Neutral `_bmad-output/` → the owner in `corpus-guide.md` lands it |
|
|
40
|
+
| **C** | Ends when its work does | `_bmad-output/`, committed, not curated |
|
|
41
|
+
| **D** | No artifact at all | — |
|
|
42
|
+
|
|
43
|
+
Class B exists because some skills write several things at once that belong to different layers.
|
|
44
|
+
`bmad-ux` is the case: `EXPERIENCE.md` is a promise and `DESIGN.md` is a build detail, and no
|
|
45
|
+
configuration can send them to two places.
|
|
46
|
+
|
|
47
|
+
Which skill lands which class-B output is the ownership table in `corpus-guide.md`. A skill MUST NOT
|
|
48
|
+
write into a layer it does not own.
|
|
49
|
+
|
|
50
|
+
## `_bmad-output/` is committed but not curated
|
|
51
|
+
|
|
52
|
+
Committing it makes citation by path stable, so a `DEC-` or a PRD MAY point into it. Two rules follow:
|
|
53
|
+
|
|
54
|
+
- Nothing there is promoted into the corpus. Research, brainstorming, forge, and PRFAQ output stays
|
|
55
|
+
where it lands, permanently.
|
|
56
|
+
- A run folder MUST NOT be deleted. The `update` intents re-read the original inputs in place, and
|
|
57
|
+
`bmad-deep-recon` refresh operates on the existing folder.
|
|
58
|
+
|
|
59
|
+
## `_bmad/custom/*.toml` are live rules, not documentation
|
|
60
|
+
|
|
61
|
+
The `persistent_facts` inside them are **injected into every BMad run from activation onward**. A skill
|
|
62
|
+
name that has been deleted, or a folder that no longer exists, left sitting in there is not merely
|
|
63
|
+
stale — it is a live instruction that a worker will carry out.
|
|
64
|
+
|
|
65
|
+
So every time a `wdi-*` skill is renamed or merged, a folder is deleted, or a document code is
|
|
66
|
+
repealed, `_bmad/custom/*.toml` MUST be swept **in the same pass**. No validator guards it — no `V`
|
|
67
|
+
reads TOML — so the only things guarding it are this rule and a sweep that includes it.
|
|
68
|
+
|
|
69
|
+
This lesson was paid for: the consistency sweep of 2026-08-18 used a path list that did not include
|
|
70
|
+
`_bmad/custom/`, and five TOML files went on telling workers to land `SCP-` into
|
|
71
|
+
`.control/supplements/` through `wdi-correct-course` — three things that no longer exist. **A
|
|
72
|
+
verification path list MUST be treated as a minimum, never as a boundary.**
|
|
73
|
+
|
|
74
|
+
`.claude/skills/bmad-*/customize.toml` is a different thing and MUST NOT be edited — it is overwritten
|
|
75
|
+
on every BMad update. What gets swept is `_bmad/custom/`.
|
|
76
|
+
|
|
77
|
+
## Memlog
|
|
78
|
+
|
|
79
|
+
**A memlog follows its artifact. What lands in the corpus leaves its memlog in `.control/memlog/`,
|
|
80
|
+
because a memlog is not a deliverable.**
|
|
81
|
+
|
|
82
|
+
```text
|
|
83
|
+
.control/memlog/ brief.md · prd-<slug>.md · spine.md · ux.md class A and B only
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
`memlog.py` accepts `--workspace DIR` (the memlog is always `{DIR}/.memlog.md`) and `--path FILE`.
|
|
87
|
+
BMad skills call `--workspace` by default; the class-A home is reached by installing a `--path`
|
|
88
|
+
instruction as a `persistent_fact`.
|
|
89
|
+
|
|
90
|
+
- A class-A or class-B skill MUST use `--path`. `--workspace` MUST NOT be used — it would leave a
|
|
91
|
+
`.memlog.md` inside `.what/` or `.how/`, which V16 rejects.
|
|
92
|
+
- Class-C memlogs stay beside their output in `_bmad-output/`.
|
|
93
|
+
- Every memlog MUST carry `artifact:` in its frontmatter, pointing at a file that exists.
|
|
94
|
+
|
|
95
|
+
## Configuration
|
|
96
|
+
|
|
97
|
+
Overrides live in `_bmad/custom/*.toml`, installed by `bmad-customize` so the merge is verified.
|
|
98
|
+
|
|
99
|
+
| Merge behaviour | Applies to |
|
|
100
|
+
|---|---|
|
|
101
|
+
| Scalar — override wins | `*_output_path`, `run_folder_pattern`, `*_template` |
|
|
102
|
+
| Array — **append**, base entries cannot be removed | `persistent_facts`, `doc_standards`, `activation_steps_*`, `external_*` |
|
|
103
|
+
| String — replaces the base entirely | `implementation_handoff` |
|
|
104
|
+
|
|
105
|
+
Two placement rules that are easy to get wrong:
|
|
106
|
+
|
|
107
|
+
- **`doc_standards` MUST NOT be chosen just because the file is a guide.** Each skill declares what
|
|
108
|
+
its polish pass applies to, and that declaration MUST be read first. `bmad-architecture` excludes
|
|
109
|
+
the spine — *"never to the spine"* — so `architecture-guide.md` installed there would only ever
|
|
110
|
+
polish renderings. A guide governing an artifact outside the polish target MUST be a
|
|
111
|
+
`persistent_fact`.
|
|
112
|
+
- **Facts MUST NOT be installed as `doc_standards`.** The two structure maps in `.control/` are
|
|
113
|
+
facts; treating them as standards makes an agent read today's state as a rule.
|
|
114
|
+
|
|
115
|
+
`config.toml` sets `project_knowledge` to `.control/`. Personal files — `config.user.toml` — belong
|
|
116
|
+
to whoever runs the repo and MUST NOT be copied between projects.
|
|
117
|
+
|
|
118
|
+
## Only five skills review themselves
|
|
119
|
+
|
|
120
|
+
`doc_standards` exists on `bmad-product-brief`, `bmad-prd`, `bmad-ux`, `bmad-architecture`, and
|
|
121
|
+
`bmad-deep-recon`, and it runs two lenses: `structure` and `prose`.
|
|
122
|
+
|
|
123
|
+
Everything else MUST be reviewed by invoking `wdi-review` explicitly — the spine, every SRS, every
|
|
124
|
+
SDD, and every `SPEC.md`. Three lenses never fire on their own anywhere: `adversarial`,
|
|
125
|
+
`edge-case-hunter`, and `verification-gap`.
|
|
126
|
+
|
|
127
|
+
**Code review does not use `bmad-review`.** `bmad-code-review` reads its lenses from a bundled copy
|
|
128
|
+
under `review-prompts/`, and each layer ends with an instruction not to invoke any skill. An override
|
|
129
|
+
placed on `bmad-review` is therefore **invisible** to code review. Getting the current lenses onto a
|
|
130
|
+
diff requires calling `bmad-review` by hand.
|
|
131
|
+
|
|
132
|
+
## Renamed and retired
|
|
133
|
+
|
|
134
|
+
| Old name | Now |
|
|
135
|
+
|---|---|
|
|
136
|
+
| `bmad-create-prd` · `bmad-edit-prd` · `bmad-validate-prd` | Shims over `bmad-prd` — use the intent, not the shim |
|
|
137
|
+
| `bmad-create-architecture` | `bmad-architecture` |
|
|
138
|
+
| `bmad-create-epics-and-stories` · `bmad-sprint-planning` | **Not used** — sprint route |
|
|
139
|
+
|
|
140
|
+
Roughly a third of the installed skills are deprecated aliases. `bmad-skill-register.md` is the
|
|
141
|
+
authority on which is which, and it MUST be consulted rather than guessed from a name that looks
|
|
142
|
+
plausible.
|
|
143
|
+
|
|
144
|
+
## Rules
|
|
145
|
+
|
|
146
|
+
- A `wdi-*` wrapper, where one exists, MUST be called instead of the skill it wraps. The wrapper
|
|
147
|
+
carries the position and content checks; going around it produces an artifact nothing verifies.
|
|
148
|
+
- `bmad-help` MUST NOT be used to answer "where am I". Its progress detection globs paths this method
|
|
149
|
+
redirects, and it names gates this route never produces. Use `wdi-help`.
|
|
150
|
+
- Any output with no home in the distillation table MUST be reported as a gap in the method, not
|
|
151
|
+
filed somewhere plausible.
|