wdi-method 0.6.7 → 0.6.15
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/README.md +37 -10
- package/bin/wdi-method.js +498 -27
- package/kit/.constitution/method/constitution.md +4 -1
- package/kit/.constitution/method/document/bmad-guide.md +10 -6
- package/kit/.constitution/method/document/bmad-skill-register.md +36 -6
- package/kit/.constitution/method/document/corpus-guide.md +35 -0
- package/kit/.constitution/method/method-glossary.md +184 -183
- package/kit/.constitution/method/scripts/validate.py +179 -11
- package/kit/.constitution/method/why/README.md +192 -186
- package/kit/.constitution/method/why/artifact-map.md +1 -1
- package/kit/skills/wdi-autopilot/SKILL.md +383 -375
- package/kit/skills/wdi-blueprint/SKILL.md +3 -3
- package/kit/skills/wdi-build/SKILL.md +393 -371
- package/kit/skills/wdi-help/SKILL.md +111 -110
- package/kit/skills/wdi-init/SKILL.md +19 -1
- package/kit/skills/wdi-product/SKILL.md +22 -0
- package/kit/skills/wdi-upgrade/SKILL.md +214 -187
- package/kit-overlay/constitution.md +4 -1
- package/package.json +1 -1
- package/scaffold/docs/agents/issue-tracker.md +56 -43
|
@@ -25,10 +25,13 @@ The repo layout is governed by `corpus-guide.md` and mapped by
|
|
|
25
25
|
| `.how/` | How it is built |
|
|
26
26
|
| `.what-rendered/` · `.how-rendered/` | The two above, assembled for a human to read — one page per gate, at the mirror path. Regenerated by `validate.py`, never edited, never read by a skill |
|
|
27
27
|
| `_bmad-output/` | Run workspace; MUST be in git, not curated |
|
|
28
|
+
| `.scratch/` | One directory per effort: a spec's `SPEC.md` and its ticket files, and ad hoc work that has no `FR` yet. MUST be in git — the corpus cites into it by path |
|
|
28
29
|
| `.work/` | Scratch; MUST be in git, emptied when a task closes |
|
|
29
30
|
| *(application roots)* | Application code — named and mapped in `.control/structure-codebase.md` |
|
|
30
31
|
|
|
31
|
-
|
|
32
|
+
**One exception, and it is not corpus.** `docs/agents/issue-tracker.md` and `docs/agents/domain.md` are the ENGINES' config, and their path belongs to the engines' author — `to-spec`, `to-tickets`, `implement` and `triage` read those two files and nowhere else. What they SAY is this method's, and `wdi-method` seeds both already answered. Neither is corpus, neither is a rule, and nothing else MAY be added beside them.
|
|
33
|
+
|
|
34
|
+
Otherwise the method does not use a `docs/` layer for corpus or rules. A leftover `docs/`
|
|
32
35
|
folder is inventory to sort, not a second home.
|
|
33
36
|
|
|
34
37
|
## Article 4 — Lifecycle
|
|
@@ -47,12 +47,16 @@ inventory, and putting somebody else's skill in it makes the register a lie.
|
|
|
47
47
|
|
|
48
48
|
No → **absorb the discipline and invoke nothing.** Prose we could have written is not an engine.
|
|
49
49
|
|
|
50
|
-
An engine whose output this corpus keeps is invoked even
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
50
|
+
An engine whose output this corpus keeps is invoked even though it is **not part of this package's
|
|
51
|
+
install** — `domain-modeling` is the case, and `wdi-blueprint` invokes it. It is one of the six the
|
|
52
|
+
installer requires IN the repo, so it is named without a plugin prefix: a repo may hold the engines as
|
|
53
|
+
its own files or not at all, and `mattpocock-skills:domain-modeling` resolves to nothing in the first
|
|
54
|
+
case. Two rules make the reference safe in a repo that does not have it:
|
|
55
|
+
|
|
56
|
+
- **A missing engine is a state, not a defect — at G1–G4.** Report it once, name the standard the work
|
|
57
|
+
is still held to, and do the work. You MUST NOT block one of those gates on it, and you MUST NOT
|
|
58
|
+
report its absence as a finding. G5 is the exception and always was: `wdi-build` cannot run without
|
|
59
|
+
the engines, and the installer refuses rather than let that be discovered with a spec already open.
|
|
56
60
|
- **The wrapper carries the standard, never the plugin.** What the engine is invoked *for* MUST be written
|
|
57
61
|
in the wrapping skill as behaviours to verify — so the same bar is met either way, and a run that
|
|
58
62
|
produced none of them is reported as a transcription rather than landed.
|
|
@@ -26,9 +26,11 @@ method does not invoke, ask `bmad-help`, which reads BMad's own documentation.
|
|
|
26
26
|
| Course correction | `bmad-correct-course` | `wdi-decision` |
|
|
27
27
|
|
|
28
28
|
**Everything below G5 left this table.** `SPEC.md`, the tickets, the code, and the code panel are produced
|
|
29
|
-
by `to-spec`, `to-tickets`, `implement`, `tdd`, and `code-review` — engines that are not BMad's
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
by `to-spec`, `to-tickets`, `implement`, `tdd`, and `code-review` — engines that are not BMad's. Three of
|
|
30
|
+
the five ship with `disable-model-invocation: true`; `wdi-method` strips it from the copies installed in
|
|
31
|
+
this repo and writes a guard line naming who may drive them, so **`wdi-build` and `wdi-autopilot` invoke
|
|
32
|
+
them directly** and an unattended iteration needs nobody. `wdi-build` owns that pipeline;
|
|
33
|
+
`bmad-guide.md` owns the reasoning.
|
|
32
34
|
|
|
33
35
|
**The three bold rows are why this method exists.** BMad stops at the promise and starts again at the
|
|
34
36
|
mechanism, and every behaviour in between had no author. Three consequences attach to those artifacts and
|
|
@@ -50,15 +52,43 @@ A Fast Path that turns out to touch an `FR` MUST stop and become a spec `S`, whi
|
|
|
50
52
|
|---|---|
|
|
51
53
|
| `bmad-advanced-elicitation` · `bmad-party-mode` | Thinking aids. They produce no artifact and MUST NOT be treated as authors |
|
|
52
54
|
| `bmad-deep-recon` | Research, before a brief rests on outside data. Its output stays in `_bmad-output/` permanently and MUST NOT be folded into the brief |
|
|
55
|
+
| `bmad-qa-generate-e2e-tests` | Tests for a feature that **already exists**. `tdd` is test-first for work being built, so this has no replacement here and is NOT retired — but what it writes is a test, never a contract, and it MUST NOT be read as one |
|
|
56
|
+
| `bmad-checkpoint-preview` | A human reading aid over a change, the same class as `bmad-advanced-elicitation`. It MUST NOT be counted as the Step 3 panel: that one is a separate dispatch by a different agent |
|
|
53
57
|
| `bmad-help` | Questions about BMad itself. It MUST NOT be used to answer "where am I" — that is `wdi-help` |
|
|
54
58
|
|
|
55
59
|
## What is NOT USED, and MUST NOT be
|
|
56
60
|
|
|
61
|
+
**The criterion, and it binds every row below.** A BMad skill is retired only where this method has a
|
|
62
|
+
**named replacement** for what it produces. Without one it is not retired — it goes in the table above
|
|
63
|
+
instead, as something that may be used but MUST NOT author. Banning a capability with nothing in its
|
|
64
|
+
place is how a method gets worked around rather than followed.
|
|
65
|
+
|
|
66
|
+
### Retired at G5 — enforced by install and update
|
|
67
|
+
|
|
68
|
+
**This is enforced, not only stated.** `install` and `update` set `disable-model-invocation: true` on
|
|
69
|
+
every wrapper below and add a `Skill(<name>)` deny rule to `.claude/settings.json`, both re-applied on
|
|
70
|
+
every run because BMad's installer rewrites its own wrappers. A person typing `/bmad-build` still gets
|
|
71
|
+
it: the method retires a default, it does not confiscate a tool. The list lives in
|
|
72
|
+
`bin/wdi-method.js` as `BMAD_RETIRED_G5`, and a test fails when this table and that array disagree.
|
|
73
|
+
|
|
74
|
+
| Skill | Replaced by | Why |
|
|
75
|
+
|---|---|---|
|
|
76
|
+
| `bmad-spec` | `to-spec` | **Retired.** The contract below G5 is no longer BMad's. Its `_bmad/custom/*.toml` override is withdrawn and `update` removes any still installed |
|
|
77
|
+
| `bmad-build` · `bmad-build-auto` | `implement` · `wdi-autopilot` | **Retired.** `bmad-build` describes itself as implementing "any user intent, requirement, story, bug fix or change request" — the most inviting description in the repo's skill index, for the one thing this method owns most tightly. `bmad-build-auto` is an unattended loop, which is `wdi-autopilot`'s |
|
|
78
|
+
| `bmad-code-review` | `code-review` | **Retired.** The panel at Step 3 is a separate dispatch by a different agent; BMad's own review layers are the builder reviewing itself |
|
|
79
|
+
| `bmad-retrospective` | — | **Retired** with `RTR-` and `V19`. A frozen `RTR-` file stays where it is |
|
|
80
|
+
| `bmad-agent-dev` | `implement` | **Retired.** "Senior software engineer for story execution and code implementation" is `implement`'s sentence |
|
|
81
|
+
| `bmad-create-epics-and-stories` | `to-tickets` | **Retired**, and not merely by preference: the `epics` level between a spec and its tickets is **repealed in code** — `validate.py` reads a flat `tickets:` list. A skill whose only output is a shape nothing reads |
|
|
82
|
+
| `bmad-create-story` · `bmad-dev-story` · `bmad-dev-auto` · `bmad-quick-dev` | `implement` | **Retired.** BMad deprecated all four in favour of `bmad-build`, which is itself retired here. An alias to a retired skill is retired |
|
|
83
|
+
| `bmad-sprint-planning` · `bmad-sprint-status` | the ticket itself | **Retired.** The sprint route keeps status in a hand-edited file; this method reads status from the ticket — `bmad-guide.md` owns the reasoning |
|
|
84
|
+
|
|
85
|
+
### Not used for other reasons — not enforced, and not G5's
|
|
86
|
+
|
|
87
|
+
These are outside the enforced list above: nothing locks them, because nothing here replaces them and
|
|
88
|
+
none of them competes for G5's work.
|
|
89
|
+
|
|
57
90
|
| Skill | Why |
|
|
58
91
|
|---|---|
|
|
59
|
-
| `bmad-spec` · `bmad-build` · `bmad-build-auto` · `bmad-code-review` · `bmad-retrospective` | **Retired.** The engine layer below G5 is no longer BMad's. Their `_bmad/custom/*.toml` overrides are withdrawn and `update` removes any still installed |
|
|
60
|
-
| `bmad-create-epics-and-stories` · `bmad-sprint-planning` · `bmad-sprint-status` | They belong to the sprint route, which keeps status in a hand-edited file. This method reads status from the ticket itself — `bmad-guide.md` owns the reasoning |
|
|
61
|
-
| `bmad-create-story` · `bmad-dev-story` · `bmad-quick-dev` · `bmad-dev-auto` | Deprecated in BMad itself, and their replacements are retired too |
|
|
62
92
|
| `bmad-editorial-review*` · `bmad-review-*` | Shims onto `bmad-review` lenses. Ask for the lens, not the shim |
|
|
63
93
|
| `bmad-document-project` · `bmad-generate-project-context` | Forward to `bmad-project-context`. This repo's agent instructions are maintained by hand |
|
|
64
94
|
| Any skill named as a **gate condition** | A gate is passed by its checklist and its validators, never by a skill having run |
|
|
@@ -63,6 +63,41 @@ decision or a PRD MAY point into it. Research, brainstorming, forge, and PRFAQ r
|
|
|
63
63
|
A run folder MUST NOT be deleted **while anything still needs it** — the `update` intents re-read the original
|
|
64
64
|
inputs in place. "Never deleted" is not the rule; the rule is a **retirement condition**, and it is below.
|
|
65
65
|
|
|
66
|
+
### A withdrawn promise STAYS in the registry
|
|
67
|
+
|
|
68
|
+
A `BG` · `CAP` · `FR` · `NFR` · `UC` the product stops promising is marked, never deleted:
|
|
69
|
+
|
|
70
|
+
```yaml
|
|
71
|
+
- id: CAP-8
|
|
72
|
+
title: "Publish an order as a public page"
|
|
73
|
+
status: withdrawn
|
|
74
|
+
withdrawn_by: DEC-026
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**Why the row stays.** One repo deleted two withdrawn capabilities and paid for it in twelve
|
|
78
|
+
`refs-resolve` findings: eight `DEC-` rows still named them in `serves:`, and six of those eight
|
|
79
|
+
genuinely served them at the time. The other repair — editing those decisions — is refused by the
|
|
80
|
+
section above: a `DEC-` is a record of what happened, and a retired name inside one is a fact about
|
|
81
|
+
the past.
|
|
82
|
+
|
|
83
|
+
**So a withdrawn row is read two ways, and both matter.** It is still **defined**: every old
|
|
84
|
+
reference resolves, and `id-allocated-once` still refuses the number to anything else — an id is
|
|
85
|
+
allocated once, withdrawal included. It is no longer **promised**: no `UC` is owed, no ticket, no RTM
|
|
86
|
+
row, and `promise_progress` is not dragged down by something nobody promises any more.
|
|
87
|
+
|
|
88
|
+
**Two rules keep it honest**, and `withdrawn-recorded` is what enforces both:
|
|
89
|
+
|
|
90
|
+
- `withdrawn_by` MUST name a `DEC-` that exists. Retiring an id is decision-worthy on this method's
|
|
91
|
+
own terms — the **ID chain** row under § *Landing that MUST be confirmed first* says so outright —
|
|
92
|
+
and without the pointer `withdrawn` is only a word that quiets a validator.
|
|
93
|
+
- A live row MUST NOT hang off a withdrawn one. An `FR` under a withdrawn `CAP` still promises
|
|
94
|
+
something whose capability nobody promises: withdraw it too, or move it under something live.
|
|
95
|
+
Withdrawal that takes half a chain with it silently is worse than the deletion it replaced, because
|
|
96
|
+
deletion at least went red.
|
|
97
|
+
|
|
98
|
+
`wdi-product` owns the edit, because it owns the row. The withdrawal itself goes through
|
|
99
|
+
`wdi-decision` first — the `DEC-` is what `withdrawn_by` points at.
|
|
100
|
+
|
|
66
101
|
## Who lands what
|
|
67
102
|
|
|
68
103
|
There is no separate placement skill. A skill lands the output of the layer **it owns**, and the landing is
|
|
@@ -1,183 +1,184 @@
|
|
|
1
|
-
---
|
|
2
|
-
status: Accepted
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Method Glossary
|
|
6
|
-
|
|
7
|
-
**Loaded when:** a method term is unclear, and before coining a new one.
|
|
8
|
-
|
|
9
|
-
The words this method uses for **itself**. What the product is about belongs to
|
|
10
|
-
`.control/product-glossary.md` instead. A term defined here MUST NOT be redefined there, and the
|
|
11
|
-
reverse holds too. The test: would this term still apply on a different product? Yes → here.
|
|
12
|
-
|
|
13
|
-
## Layers
|
|
14
|
-
|
|
15
|
-
| Term | Means |
|
|
16
|
-
|---|---|
|
|
17
|
-
| **Corpus** | The four layers below. `_bmad-output/` is not part of it |
|
|
18
|
-
| **`.constitution/`** | How we work. Rules. Rarely changes |
|
|
19
|
-
| **`.control/`** | What currently holds and what has been decided. Facts. Changes often. Equals `{project_knowledge}` |
|
|
20
|
-
| **`.what/`** | What was promised |
|
|
21
|
-
| **`.how/`** | How it is built |
|
|
22
|
-
| **Workspace** | `_bmad-output/` — work in progress, committed but not curated |
|
|
23
|
-
| **Placement test** | Is this file still true after its spec has passed? Yes → corpus. No → workspace |
|
|
24
|
-
|
|
25
|
-
## Units
|
|
26
|
-
|
|
27
|
-
| Term | Means |
|
|
28
|
-
|---|---|
|
|
29
|
-
| **Product Component** (PC) | A domain slice — the box at C4 L3. Lives in `.what/<pc>/` and `.how/<pc>/`, and its `containers:` says where it runs |
|
|
30
|
-
| **Logical Component** (LC) | One addressable unit of build. Registered in `components.yaml` with `type` · `container` · `owner` · `area` |
|
|
31
|
-
| **Container** | Something that **runs its own code or stores its own data** and can be replaced without rebuilding another one. The C4 L2 term, and the value of an LC's `container` field. Two questions decide it and both MUST be yes — `architecture-guide.md` owns the test. Shipping two containers in one release does **not** merge them |
|
|
32
|
-
| **`built`** | A container's one boolean. `true` when we write what is inside it, `false` when we deploy someone else's implementation. It decides whether the container gets an L3, an `LC`, and a heading in the codebase map — `container-built` checks all three |
|
|
33
|
-
| **External system** | Something the product talks to whose **runtime we do not deploy**. It belongs at C4 L1, and MUST NOT be a container, an `LC`'s `container`, or a heading in the codebase map. What we lean on it for lives in `cross-cutting.md` or an integration contract |
|
|
34
|
-
| **`_platform`** | **Not a component.** The home for what belongs to no Product Component: the spine, the C4 set, `cross-cutting.md`, the three inventories, and whatever it **owns**. A legitimate value in every position that asks which component owns something — `platform_owns`, an inventory row, an `LC`. Four kinds today: data · endpoint · job · screen. It carries no `mode`, no `risk_accepted`, and no G4 |
|
|
35
|
-
| **Library** | An includable artifact — compiled into or imported by something else, never run on its own. Not a container |
|
|
36
|
-
| **Slot** | A numbered sub-folder of a PC. `.what/<pc>/` 02–05 is reading order; `.how/<pc>/` 01–06 is ABCE classification. The two numberings do **not** mean the same thing |
|
|
37
|
-
| **Kernel** | The `SRS-<pc>.md` or `SDD-<pc>.md` file itself. Content SHOULD stay in it until it grows past roughly 400 lines — a suggestion, not a threshold |
|
|
38
|
-
|
|
39
|
-
A PC is not a container: a container runs, a PC is a domain. One container holds several PCs, and
|
|
40
|
-
one PC may appear in more than one container. Because they cross, neither list implies the other, and
|
|
41
|
-
the crossing MUST be written down rather than inferred — that is the PC × container matrix at C4 L2,
|
|
42
|
-
rendered from each PC's `containers:`.
|
|
43
|
-
|
|
44
|
-
## Flow
|
|
45
|
-
|
|
46
|
-
There is no "stage". The five gates are the only flow vocabulary, and the word **area** is not used at all —
|
|
47
|
-
there is only Product Component.
|
|
48
|
-
|
|
49
|
-
| Term | Means |
|
|
50
|
-
|---|---|
|
|
51
|
-
| **Gate** | One of five decision points: G1 Problem · G2 Product · G3 Blueprint · G4 Component · G5 Release. Named after what is decided there, not after the work before it |
|
|
52
|
-
| **`mode`** | The one knob for **document depth**, and nothing else. `catalog` · `outline` · `guarded` · `deep`, default `catalog`. Two scopes — global in `index.yaml`, per component in `components.yaml`, and the per-component one wins. **No third scope** |
|
|
53
|
-
| **`risk_accepted`** | The one field for **review intensity**, and nothing else. `low` · `medium` · `high`. It MUST NOT be derived from `mode`, nor `mode` from it |
|
|
54
|
-
| **Blueprint** | The whole-product portrait decided once at G3: one line per use case, table, endpoint, and screen, plus entities, actors, the spine, C4, and cross-component rules. It names a **gate and a skill**, never a document or a folder |
|
|
55
|
-
| **Spec** | One unit of delivered work: the tickets that reach one outcome. Opens at G4 or G5, closes at G5, recorded in `specs.yaml`. Its document is `SPEC.md`, **optional at size `S`** — one term, one entry, and the document is named after the unit the way a `DEC-` file is named after its decision |
|
|
56
|
-
| **Release** | What a PRD promises. One release MAY span several specs; the relation is data, never inferred from numbering |
|
|
57
|
-
| **Spec size** | `S` ≤3 tickets no new FR · `M` 4–12 · `L` >12 or a new container. MAY be raised mid-flight, MUST NOT be lowered. It does **not** choose which gates are active — that is `mode`. It decides two things: whether G4 and G5 merge into one session (`S`), and whether `SPEC.md` is written at all (`M` and up) |
|
|
58
|
-
| **Fast Path** | A fix that skips all gates: ≤1 ticket, no FR/UC/`AD-N`/domain-model change, no money, personal data, or third-party integration |
|
|
59
|
-
| **Step** | One of the five points inside `wdi-build`'s ship pipeline — plan · build · panel · publish · CI. It is **not** a gate and not a stage, and the word MUST NOT be used for anything at gate altitude |
|
|
60
|
-
|
|
61
|
-
## Artifacts
|
|
62
|
-
|
|
63
|
-
| Term | Means |
|
|
64
|
-
|---|---|
|
|
65
|
-
| **Brief** | One problem, one user, one measure. Singleton, spans releases |
|
|
66
|
-
| **PRD** | What is promised for **one initiative**, across every release it touches. FR and NFR numbered from the registry |
|
|
67
|
-
| **SRS** | Per PC: what the system must do. `.what/` — slices space, while the PRD slices initiative. It **exists at every `mode`**, carrying the actor list and the use case catalogue |
|
|
68
|
-
| **SDD** | Per PC: how it is built. `.how/`. At `mode: catalog` it is a skeleton, and that is a finished state |
|
|
69
|
-
| **Inventory** | One of three living registers at product level — tables, endpoints, screens. Written as a plan when there is no code, **derived** from code once there is |
|
|
70
|
-
| **Architecture spine** | `ARCHITECTURE-SPINE.md` — invariants as `AD-N`, each carrying Binds · Prevents · Rule. It constrains; it does not describe |
|
|
71
|
-
| **C4** | L1 system context · L2 containers · L3 components, one file per container. L1+L2 together are what other methods call the HLD |
|
|
72
|
-
| **`DESIGN.md`** | UX per PC, in `.how/<pc>/01-ux/` |
|
|
73
|
-
| **`EXPERIENCE.md`** | The user-facing journey, in `.what/<pc>/04-usecases/` |
|
|
74
|
-
| **`DEC-`** | One decision worth remembering, numbered globally. Lives in `.control/decisions/`. Recording is **not mandatory**; it freezes at `applied`, not at `accepted` |
|
|
75
|
-
| **SPEC** | The document of **one spec**: a projection of `.what/` + `.how/` that MUST NOT contain anything new. Not read by humans, and **not written at size `S`** — there the tickets are the contract |
|
|
76
|
-
| **Ticket** | One unit of build: a tracer-bullet vertical slice, complete through every layer, verifiable on its own, sized to one fresh context window. Carries the tickets that **block** it. Status is read from the ticket itself, never copied elsewhere |
|
|
77
|
-
| **Structure map** | `.control/structure-codebase.md` and `structure-document.md` — where things actually are today |
|
|
78
|
-
| **Mandate** | A `DEC-` of `type: mandate`: the owner's one dated, expiring delegation that lets `wdi-autopilot` decide what the skills would otherwise have asked. Its parameters live on its registry row only; every decision taken under it is a row in the ledger, `.control/memlog/autopilot-<date>.md` |
|
|
79
|
-
| **Memlog** | The record of *why* while an artifact was written. Never copied into a document; a source when writing a `DEC-`. It is a **run log**, and it MUST NOT be searched as an index of decisions — `.control/generated/decisions.md` is that |
|
|
80
|
-
|
|
81
|
-
## Identifiers
|
|
82
|
-
|
|
83
|
-
| Code | For |
|
|
84
|
-
|---|---|
|
|
85
|
-
| `BG-` · `FR-` · `NFR-` · `UJ-` | Business goal · functional requirement · non-functional requirement · user journey |
|
|
86
|
-
| `UC-` | Use case |
|
|
87
|
-
| `AD-` | An invariant in the architecture spine |
|
|
88
|
-
| `DEC-` | A decision |
|
|
89
|
-
| `LC-` | A Logical Component |
|
|
90
|
-
| `OQ-` | An open question |
|
|
91
|
-
| `
|
|
92
|
-
| `
|
|
93
|
-
| `
|
|
94
|
-
| `
|
|
95
|
-
| `
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
| **
|
|
110
|
-
| **
|
|
111
|
-
| **
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
| **
|
|
122
|
-
| **
|
|
123
|
-
| **
|
|
124
|
-
|
|
|
125
|
-
| **`
|
|
126
|
-
| **`
|
|
127
|
-
| **`
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
| `
|
|
135
|
-
| `
|
|
136
|
-
| `
|
|
137
|
-
|
|
|
138
|
-
|
|
|
139
|
-
|
|
|
140
|
-
| `
|
|
141
|
-
|
|
|
142
|
-
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
|
152
|
-
|
|
|
153
|
-
|
|
|
154
|
-
|
|
|
155
|
-
|
|
|
156
|
-
| **
|
|
157
|
-
|
|
|
158
|
-
|
|
|
159
|
-
|
|
|
160
|
-
|
|
|
161
|
-
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
1
|
+
---
|
|
2
|
+
status: Accepted
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Method Glossary
|
|
6
|
+
|
|
7
|
+
**Loaded when:** a method term is unclear, and before coining a new one.
|
|
8
|
+
|
|
9
|
+
The words this method uses for **itself**. What the product is about belongs to
|
|
10
|
+
`.control/product-glossary.md` instead. A term defined here MUST NOT be redefined there, and the
|
|
11
|
+
reverse holds too. The test: would this term still apply on a different product? Yes → here.
|
|
12
|
+
|
|
13
|
+
## Layers
|
|
14
|
+
|
|
15
|
+
| Term | Means |
|
|
16
|
+
|---|---|
|
|
17
|
+
| **Corpus** | The four layers below. `_bmad-output/` is not part of it |
|
|
18
|
+
| **`.constitution/`** | How we work. Rules. Rarely changes |
|
|
19
|
+
| **`.control/`** | What currently holds and what has been decided. Facts. Changes often. Equals `{project_knowledge}` |
|
|
20
|
+
| **`.what/`** | What was promised |
|
|
21
|
+
| **`.how/`** | How it is built |
|
|
22
|
+
| **Workspace** | `_bmad-output/` — work in progress, committed but not curated |
|
|
23
|
+
| **Placement test** | Is this file still true after its spec has passed? Yes → corpus. No → workspace |
|
|
24
|
+
|
|
25
|
+
## Units
|
|
26
|
+
|
|
27
|
+
| Term | Means |
|
|
28
|
+
|---|---|
|
|
29
|
+
| **Product Component** (PC) | A domain slice — the box at C4 L3. Lives in `.what/<pc>/` and `.how/<pc>/`, and its `containers:` says where it runs |
|
|
30
|
+
| **Logical Component** (LC) | One addressable unit of build. Registered in `components.yaml` with `type` · `container` · `owner` · `area` |
|
|
31
|
+
| **Container** | Something that **runs its own code or stores its own data** and can be replaced without rebuilding another one. The C4 L2 term, and the value of an LC's `container` field. Two questions decide it and both MUST be yes — `architecture-guide.md` owns the test. Shipping two containers in one release does **not** merge them |
|
|
32
|
+
| **`built`** | A container's one boolean. `true` when we write what is inside it, `false` when we deploy someone else's implementation. It decides whether the container gets an L3, an `LC`, and a heading in the codebase map — `container-built` checks all three |
|
|
33
|
+
| **External system** | Something the product talks to whose **runtime we do not deploy**. It belongs at C4 L1, and MUST NOT be a container, an `LC`'s `container`, or a heading in the codebase map. What we lean on it for lives in `cross-cutting.md` or an integration contract |
|
|
34
|
+
| **`_platform`** | **Not a component.** The home for what belongs to no Product Component: the spine, the C4 set, `cross-cutting.md`, the three inventories, and whatever it **owns**. A legitimate value in every position that asks which component owns something — `platform_owns`, an inventory row, an `LC`. Four kinds today: data · endpoint · job · screen. It carries no `mode`, no `risk_accepted`, and no G4 |
|
|
35
|
+
| **Library** | An includable artifact — compiled into or imported by something else, never run on its own. Not a container |
|
|
36
|
+
| **Slot** | A numbered sub-folder of a PC. `.what/<pc>/` 02–05 is reading order; `.how/<pc>/` 01–06 is ABCE classification. The two numberings do **not** mean the same thing |
|
|
37
|
+
| **Kernel** | The `SRS-<pc>.md` or `SDD-<pc>.md` file itself. Content SHOULD stay in it until it grows past roughly 400 lines — a suggestion, not a threshold |
|
|
38
|
+
|
|
39
|
+
A PC is not a container: a container runs, a PC is a domain. One container holds several PCs, and
|
|
40
|
+
one PC may appear in more than one container. Because they cross, neither list implies the other, and
|
|
41
|
+
the crossing MUST be written down rather than inferred — that is the PC × container matrix at C4 L2,
|
|
42
|
+
rendered from each PC's `containers:`.
|
|
43
|
+
|
|
44
|
+
## Flow
|
|
45
|
+
|
|
46
|
+
There is no "stage". The five gates are the only flow vocabulary, and the word **area** is not used at all —
|
|
47
|
+
there is only Product Component.
|
|
48
|
+
|
|
49
|
+
| Term | Means |
|
|
50
|
+
|---|---|
|
|
51
|
+
| **Gate** | One of five decision points: G1 Problem · G2 Product · G3 Blueprint · G4 Component · G5 Release. Named after what is decided there, not after the work before it |
|
|
52
|
+
| **`mode`** | The one knob for **document depth**, and nothing else. `catalog` · `outline` · `guarded` · `deep`, default `catalog`. Two scopes — global in `index.yaml`, per component in `components.yaml`, and the per-component one wins. **No third scope** |
|
|
53
|
+
| **`risk_accepted`** | The one field for **review intensity**, and nothing else. `low` · `medium` · `high`. It MUST NOT be derived from `mode`, nor `mode` from it |
|
|
54
|
+
| **Blueprint** | The whole-product portrait decided once at G3: one line per use case, table, endpoint, and screen, plus entities, actors, the spine, C4, and cross-component rules. It names a **gate and a skill**, never a document or a folder |
|
|
55
|
+
| **Spec** | One unit of delivered work: the tickets that reach one outcome. Opens at G4 or G5, closes at G5, recorded in `specs.yaml`. Its document is `SPEC.md`, **optional at size `S`** — one term, one entry, and the document is named after the unit the way a `DEC-` file is named after its decision |
|
|
56
|
+
| **Release** | What a PRD promises. One release MAY span several specs; the relation is data, never inferred from numbering |
|
|
57
|
+
| **Spec size** | `S` ≤3 tickets no new FR · `M` 4–12 · `L` >12 or a new container. MAY be raised mid-flight, MUST NOT be lowered. It does **not** choose which gates are active — that is `mode`. It decides two things: whether G4 and G5 merge into one session (`S`), and whether `SPEC.md` is written at all (`M` and up) |
|
|
58
|
+
| **Fast Path** | A fix that skips all gates: ≤1 ticket, no FR/UC/`AD-N`/domain-model change, no money, personal data, or third-party integration |
|
|
59
|
+
| **Step** | One of the five points inside `wdi-build`'s ship pipeline — plan · build · panel · publish · CI. It is **not** a gate and not a stage, and the word MUST NOT be used for anything at gate altitude |
|
|
60
|
+
|
|
61
|
+
## Artifacts
|
|
62
|
+
|
|
63
|
+
| Term | Means |
|
|
64
|
+
|---|---|
|
|
65
|
+
| **Brief** | One problem, one user, one measure. Singleton, spans releases |
|
|
66
|
+
| **PRD** | What is promised for **one initiative**, across every release it touches. FR and NFR numbered from the registry |
|
|
67
|
+
| **SRS** | Per PC: what the system must do. `.what/` — slices space, while the PRD slices initiative. It **exists at every `mode`**, carrying the actor list and the use case catalogue |
|
|
68
|
+
| **SDD** | Per PC: how it is built. `.how/`. At `mode: catalog` it is a skeleton, and that is a finished state |
|
|
69
|
+
| **Inventory** | One of three living registers at product level — tables, endpoints, screens. Written as a plan when there is no code, **derived** from code once there is |
|
|
70
|
+
| **Architecture spine** | `ARCHITECTURE-SPINE.md` — invariants as `AD-N`, each carrying Binds · Prevents · Rule. It constrains; it does not describe |
|
|
71
|
+
| **C4** | L1 system context · L2 containers · L3 components, one file per container. L1+L2 together are what other methods call the HLD |
|
|
72
|
+
| **`DESIGN.md`** | UX per PC, in `.how/<pc>/01-ux/` |
|
|
73
|
+
| **`EXPERIENCE.md`** | The user-facing journey, in `.what/<pc>/04-usecases/` |
|
|
74
|
+
| **`DEC-`** | One decision worth remembering, numbered globally. Lives in `.control/decisions/`. Recording is **not mandatory**; it freezes at `applied`, not at `accepted` |
|
|
75
|
+
| **SPEC** | The document of **one spec**: a projection of `.what/` + `.how/` that MUST NOT contain anything new. Not read by humans, and **not written at size `S`** — there the tickets are the contract |
|
|
76
|
+
| **Ticket** | One unit of build: a tracer-bullet vertical slice, complete through every layer, verifiable on its own, sized to one fresh context window. Carries the tickets that **block** it. Status is read from the ticket itself, never copied elsewhere |
|
|
77
|
+
| **Structure map** | `.control/structure-codebase.md` and `structure-document.md` — where things actually are today |
|
|
78
|
+
| **Mandate** | A `DEC-` of `type: mandate`: the owner's one dated, expiring delegation that lets `wdi-autopilot` decide what the skills would otherwise have asked. Its parameters live on its registry row only; every decision taken under it is a row in the ledger, `.control/memlog/autopilot-<date>.md` |
|
|
79
|
+
| **Memlog** | The record of *why* while an artifact was written. Never copied into a document; a source when writing a `DEC-`. It is a **run log**, and it MUST NOT be searched as an index of decisions — `.control/generated/decisions.md` is that |
|
|
80
|
+
|
|
81
|
+
## Identifiers
|
|
82
|
+
|
|
83
|
+
| Code | For |
|
|
84
|
+
|---|---|
|
|
85
|
+
| `BG-` · `FR-` · `NFR-` · `UJ-` | Business goal · functional requirement · non-functional requirement · user journey |
|
|
86
|
+
| `UC-` | Use case |
|
|
87
|
+
| `AD-` | An invariant in the architecture spine |
|
|
88
|
+
| `DEC-` | A decision |
|
|
89
|
+
| `LC-` | A Logical Component |
|
|
90
|
+
| `OQ-` | An open question |
|
|
91
|
+
| `status: withdrawn` | On a `BG` · `CAP` · `FR` · `NFR` · `UC` row: the product stopped promising it, and the row stays so every old reference still resolves and its id is never reused. It names the `DEC-` that withdrew it in `withdrawn_by`. Still **defined**, no longer **promised** — `corpus-guide.md` owns the rule |
|
|
92
|
+
| `RTR-` | **Retired.** It was an archived retrospective in `.control/reports/`; the retrospective step and `V19` went together. A frozen `RTR-` file stays where it is |
|
|
93
|
+
| `CAP-` | A capability — the planning unit |
|
|
94
|
+
| `NT-` | A non-technical fact |
|
|
95
|
+
| `BUG-` · `HOT-` | A defect · a hotfix |
|
|
96
|
+
| `goal-has-fr`–`container-built` | Validators. `V10` fell and its number is not reused |
|
|
97
|
+
|
|
98
|
+
IDs are allocated **globally** and never restart per document, per component, or per release. The chain
|
|
99
|
+
that must hold end to end: `BG → FR → UC → ticket → test`.
|
|
100
|
+
|
|
101
|
+
`ADR-` is **retired**. It was renamed to `DEC-` on 2026-08-18 with the numbers unchanged, so `ADR-004`
|
|
102
|
+
inside a document frozen before that date is an alias for `DEC-004`, and those documents MUST NOT be
|
|
103
|
+
rewritten for the prefix.
|
|
104
|
+
|
|
105
|
+
## Registry and generated
|
|
106
|
+
|
|
107
|
+
| Term | Means |
|
|
108
|
+
|---|---|
|
|
109
|
+
| **Registry** | `.control/registry/` — the source of truth for IDs and plans. Written through `wdi-*` skills |
|
|
110
|
+
| **Generated** | `.control/generated/` — derived from the registry. Written by the generator only, by hand **never** |
|
|
111
|
+
| **RTM** | Requirements traceability matrix. Generated, never hand-maintained |
|
|
112
|
+
| **Validator** | A script that answers what can be counted. It does not replace a gate checklist, which answers what must be judged |
|
|
113
|
+
|
|
114
|
+
## BMad terms
|
|
115
|
+
|
|
116
|
+
BMad terms live in a WDI glossary because WDI runs on BMad. Each is defined **as WDI uses it**;
|
|
117
|
+
where BMad's own meaning is wider, the narrower one here wins.
|
|
118
|
+
|
|
119
|
+
| Term | Means |
|
|
120
|
+
|---|---|
|
|
121
|
+
| **Stories mode** | **Retired.** It was BMad's route — `SPEC.md` + `stories.yaml` produced by `bmad-spec`. The engine layer below G5 no longer runs it; `bmad-guide.md` says what replaced it |
|
|
122
|
+
| **Skill class** | `A` living document, straight to the corpus · `B` living but wrongly granular, lands neutral then is placed · `C` spent after its work · `D` no artifact |
|
|
123
|
+
| **Companion** | A side file a BMad skill produces next to its main output. The lasting ones are promoted by the distillation table |
|
|
124
|
+
| **Distillation** | Promoting what is durable out of `_bmad-output/` before a spec closes. What is not promoted dies with the folder |
|
|
125
|
+
| **`persistent_facts`** | Files a skill always reads. Routing alone does not achieve this |
|
|
126
|
+
| **`doc_standards`** | Rule files a skill checks its output against. Facts MUST NOT be installed here, and neither MUST anything at `status: Reference` |
|
|
127
|
+
| **`{project_knowledge}`** | The config variable pointing at `.control/` |
|
|
128
|
+
| **`_bmad/custom/`** | Where every BMad override lives. `.claude/skills/bmad-*/customize.toml` MUST NOT be edited — it is overwritten on update |
|
|
129
|
+
|
|
130
|
+
## Retired — MUST NOT be used as current
|
|
131
|
+
|
|
132
|
+
| Retired | Instead |
|
|
133
|
+
|---|---|
|
|
134
|
+
| `ADR-` | `DEC-` — same numbers, new prefix |
|
|
135
|
+
| `ANX-`, and the annex concept | Nothing. Zero annexes were ever born |
|
|
136
|
+
| `SCP-` | A `DEC-` of `type: course-correction` |
|
|
137
|
+
| `layer:` on a decision | `touches:`, filled from what actually changed |
|
|
138
|
+
| "Stage 1"…"Stage 5" as flow vocabulary | The five gates |
|
|
139
|
+
| `epics.md` · `sprint-status.yaml` · `bmad-sprint-planning` · `bmad-create-epics-and-stories` · `stories.yaml` | Tickets, each carrying its own status and its blocking edges |
|
|
140
|
+
| Validator `V10` | Nothing. Its number is not reused |
|
|
141
|
+
| `bmad-help` as the answer to "where am I" | `wdi-help` |
|
|
142
|
+
| The skills `wdi-analysis` · `wdi-architecture` · `wdi-design` · `wdi-glossary` · `wdi-structure` · `wdi-apply` · `wdi-correct-course` · `wdi-wave` · `wdi-ship-story` · `wdi-product-brief` · `wdi-meeting` · `wdi-project-log` | The eighteen in `why/README.md`. `why/rationale.md` says which absorbed which, and why |
|
|
143
|
+
| An Indonesian synonym for a `mode` value — *ringkas*, *terjaga*, *katalog* as prose | The English value, used as written: `catalog` · `outline` · `guarded` · `deep` |
|
|
144
|
+
|
|
145
|
+
## Synonyms that MUST NOT be coined
|
|
146
|
+
|
|
147
|
+
A synonym for a term that already has an entry is drift, and `wdi-reconcile` hunts for it.
|
|
148
|
+
|
|
149
|
+
| Do not say | Say | Because |
|
|
150
|
+
|---|---|---|
|
|
151
|
+
| application · app · service, for a deployable | **container** | The term is already defined at C4 L2 and carried by every LC |
|
|
152
|
+
| infrastructure · third-party · dependency, for something inside the boundary | **container** with `built: false` | Calling it something else is how a container ends up with no row, no owner, and no NFR |
|
|
153
|
+
| container, for something whose runtime we do not deploy | **external system** | It has no `built`, no L3, and no heading. Registering it as a container promises a section of the codebase map that will never exist |
|
|
154
|
+
| module · package, for a unit of build | **Logical Component** | `components.yaml` names it, and `lc-registered` resolves against that name |
|
|
155
|
+
| epic · sprint, for a batch of work | **spec** | Both belong to the sprint route this method dropped |
|
|
156
|
+
| **wave**, for a unit of delivered work | **spec** | Retired when the engine layer below G5 changed. See the retired-alias rule below |
|
|
157
|
+
| **story**, for a unit of build | **ticket** | Same retirement. A ticket is a vertical slice that blocks and is blocked; a story was a row in a file BMad owned |
|
|
158
|
+
| area, for a domain slice | **Product Component** | The word "area" is not used anywhere in this method |
|
|
159
|
+
| platform, for a Product Component | **`_platform`**, and only for what is not one | Registering `_platform` as a PC gives it a `mode`, an SRS, and a G4 it has no use for |
|
|
160
|
+
| profile · tier · level, for document depth | **`mode`** | One knob, four values, and no matrix behind it |
|
|
161
|
+
| feature, for a domain slice | **Product Component** | A feature is a promise; a PC is a folder pair with an owner |
|
|
162
|
+
| requirements document | **PRD** or **SRS** | They cut different axes — time versus space — and merging the names merges the documents |
|
|
163
|
+
|
|
164
|
+
## Retired terms keep their frozen documents
|
|
165
|
+
|
|
166
|
+
`wave` and `story` are **retired aliases** of `spec` and `ticket`. A `wave` or a `story` appearing in a
|
|
167
|
+
document frozen before the change — a closed `DEC-`, an `RTR-`, minutes, `why/rationale.md`'s record of what
|
|
168
|
+
happened — reads as its replacement, and those documents **MUST NOT be rewritten for the term.** This is the
|
|
169
|
+
same rule Article 6 already applies to `ADR-NNN` → `DEC-NNN`, and for the same reason: a frozen record that
|
|
170
|
+
cites a name is evidence, and rewriting evidence to tidy a vocabulary destroys the thing that made it useful.
|
|
171
|
+
|
|
172
|
+
What MUST use the new term: every `Accepted` guide, every skill, every registry, and anything written from
|
|
173
|
+
here on.
|
|
174
|
+
|
|
175
|
+
## Rules
|
|
176
|
+
|
|
177
|
+
- A new method term MUST be added here in the same pass it first appears, not defined where it is
|
|
178
|
+
used. Adding one is a change to the **method itself** — `wdi-blueprint` MAY propose it and MUST NOT
|
|
179
|
+
write it, because a method term binds every project the method is installed in.
|
|
180
|
+
- One term MUST NOT have two entries. Two meanings mean two terms.
|
|
181
|
+
- A domain term MUST go to `.control/product-glossary.md` instead. If it is unclear which, ask whether the
|
|
182
|
+
term would survive being applied to a different product: yes → here, no → there.
|
|
183
|
+
- Common technical terms stay in English when the industry name is the one that matches the code,
|
|
184
|
+
the error message, or the reader's expectation.
|