wdi-method 0.5.13 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +436 -271
- package/bin/wdi-method.js +198 -5
- package/kit/.constitution/method/README.md +76 -75
- package/kit/.constitution/method/constitution.md +2 -1
- package/kit/.constitution/method/document/architecture-guide.md +10 -10
- package/kit/.constitution/method/document/bmad-guide.md +50 -16
- package/kit/.constitution/method/document/bmad-skill-register.md +74 -71
- package/kit/.constitution/method/document/brief-guide.md +42 -11
- package/kit/.constitution/method/document/corpus-guide.md +146 -11
- package/kit/.constitution/method/document/decision-guide.md +199 -134
- package/kit/.constitution/method/document/delivery-flow-guide.md +154 -83
- package/kit/.constitution/method/document/prd-guide.md +63 -20
- package/kit/.constitution/method/document/sdd-guide.md +5 -4
- package/kit/.constitution/method/document/srs-guide.md +150 -147
- package/kit/.constitution/method/document/templates/addendum.md +70 -71
- package/kit/.constitution/method/document/templates/architecture-spine.md +6 -4
- package/kit/.constitution/method/document/templates/brief.md +132 -110
- package/kit/.constitution/method/document/templates/c4.md +11 -11
- package/kit/.constitution/method/document/templates/contract.md +51 -52
- package/kit/.constitution/method/document/templates/cross-cutting.md +1 -2
- package/kit/.constitution/method/document/templates/design-system.md +0 -1
- package/kit/.constitution/method/document/templates/integration.md +68 -69
- package/kit/.constitution/method/document/templates/inventory.md +0 -1
- package/kit/.constitution/method/document/templates/lc.md +49 -47
- package/kit/.constitution/method/document/templates/lifecycle.md +51 -52
- package/kit/.constitution/method/document/templates/model.md +68 -55
- package/kit/.constitution/method/document/templates/oq.md +45 -45
- package/kit/.constitution/method/document/templates/prd.md +244 -226
- package/kit/.constitution/method/document/templates/questions.md +100 -76
- package/kit/.constitution/method/document/templates/rules.md +46 -47
- package/kit/.constitution/method/document/templates/sdd.md +26 -11
- package/kit/.constitution/method/document/templates/srs.md +46 -25
- package/kit/.constitution/method/document/templates/uc.md +1 -1
- package/kit/.constitution/method/document/templates/ux.md +76 -77
- package/kit/.constitution/method/document/ux-guide.md +115 -99
- package/kit/.constitution/method/language-guide.md +1 -1
- package/kit/.constitution/method/method-glossary.md +29 -16
- package/kit/.constitution/method/scripts/timeline.py +663 -665
- package/kit/.constitution/method/scripts/validate.py +1143 -362
- package/kit/.constitution/method/structure-guide.md +3 -3
- package/kit/.constitution/method/why/README.md +184 -169
- package/kit/.constitution/method/why/artifact-map.md +15 -13
- package/kit/.constitution/method/why/mode-risk-map.md +140 -0
- package/kit/.constitution/method/why/portability.md +1 -1
- package/kit/.constitution/method/why/rationale.md +12 -5
- package/kit/.constitution/project/README.md +2 -2
- package/kit/.constitution/project/codebase-brownfield-guide.md +18 -18
- package/kit/.constitution/project/codebase-conventions-guide.md +18 -18
- package/kit/.constitution/project/codebase-stack-guide.md +18 -18
- package/kit/assets/bmad-custom/bmad-architecture.toml +1 -1
- package/kit/assets/bmad-custom/bmad-correct-course.toml +5 -5
- package/kit/assets/bmad-custom/bmad-prd.toml +9 -3
- package/kit/assets/bmad-custom/bmad-product-brief.toml +6 -2
- package/kit/skills/wdi-blueprint/SKILL.md +71 -10
- package/kit/skills/wdi-build/SKILL.md +233 -122
- package/kit/skills/wdi-component/SKILL.md +8 -6
- package/kit/skills/wdi-decision/SKILL.md +187 -183
- package/kit/skills/wdi-help/SKILL.md +8 -7
- package/kit/skills/wdi-init/SKILL.md +20 -6
- package/kit/skills/wdi-problem/SKILL.md +31 -13
- package/kit/skills/wdi-product/SKILL.md +30 -17
- package/kit/skills/wdi-question/SKILL.md +170 -88
- package/kit/skills/wdi-reconcile/SKILL.md +33 -10
- package/kit/skills/wdi-report/SKILL.md +77 -25
- package/kit/skills/wdi-review/SKILL.md +201 -118
- package/kit/skills/wdi-systematic-debugging/SKILL.md +7 -7
- package/kit/skills/wdi-upgrade/SKILL.md +179 -0
- package/kit/skills/wdi-ux/SKILL.md +35 -11
- package/kit-overlay/AGENTS.md +2 -2
- package/kit-overlay/README.md +76 -75
- package/kit-overlay/constitution.md +2 -1
- package/kit-overlay/portability.md +1 -1
- package/package.json +43 -43
- package/scaffold/.control/product-glossary.md +1 -1
- package/scaffold/.control/registry/goals.yaml +25 -0
- package/scaffold/.control/registry/index.yaml +5 -5
- package/scaffold/.control/registry/specs.yaml +5 -0
- package/scaffold/.control/structure-codebase.md +19 -19
- package/scaffold/.control/structure-document.md +25 -25
- package/kit/.constitution/method/document/templates/rtr.md +0 -61
- package/kit/assets/bmad-custom/bmad-build-auto.toml +0 -10
- package/kit/assets/bmad-custom/bmad-build.toml +0 -52
- package/kit/assets/bmad-custom/bmad-code-review.toml +0 -13
- package/kit/assets/bmad-custom/bmad-retrospective.toml +0 -9
- package/kit/assets/bmad-custom/bmad-spec.toml +0 -16
- package/scaffold/.control/registry/requirements.yaml +0 -15
- package/scaffold/.control/registry/waves.yaml +0 -5
|
@@ -28,7 +28,7 @@ them only an *example* does — not a rule.
|
|
|
28
28
|
| `templates/design-system.md` | The pointer to wherever this project keeps its tokens | Re-point at that project's token file |
|
|
29
29
|
| `templates/oq.md` | One example of a bad question title | Cosmetic |
|
|
30
30
|
|
|
31
|
-
Everything else — the five gates, the two fields, the
|
|
31
|
+
Everything else — the five gates, the two fields, the sixteen skills, the templates, `validate.py`,
|
|
32
32
|
`inventory.py`, `../method-glossary.md`, and the three files beside this one — carries without edit.
|
|
33
33
|
|
|
34
34
|
One half-exception, and it is by design: `inventory.py` is the generic engine and carries whole, but
|
|
@@ -6,6 +6,11 @@ status: Reference
|
|
|
6
6
|
|
|
7
7
|
**Opened when:** you are about to change a rule and need to know what you would break.
|
|
8
8
|
|
|
9
|
+
`wave` and `story` appear below wherever this file records **what happened** — a past incident, a repealed
|
|
10
|
+
ceremony, a skill's old name. Those are evidence and MUST NOT be rewritten into `spec` and `ticket`;
|
|
11
|
+
`../method-glossary.md` owns that rule. Where this file states a rule still in force, it uses the current
|
|
12
|
+
terms.
|
|
13
|
+
|
|
9
14
|
This file **explains**. It does not bind — `../document/*-guide.md` does, and where the two disagree the guide
|
|
10
15
|
wins and the disagreement is a defect to report. **A rule MUST NOT be born here.** If this file notices a
|
|
11
16
|
rule that should exist, it says so as a finding and the rule is written in its guide.
|
|
@@ -42,7 +47,9 @@ Every decision in this method traces to one of these. Anything that traced to no
|
|
|
42
47
|
4. **Breadth once, depth per component.** The global portrait is born once and thin; depth is born when its
|
|
43
48
|
component is actually worked on.
|
|
44
49
|
5. **What can be derived is not written by hand.** Inventories, structure maps, the decision index, the
|
|
45
|
-
global catalogue,
|
|
50
|
+
global catalogue, ticket status. This principle stood here alone for a long time, binding nothing —
|
|
51
|
+
this file explains and MUST NOT hold a rule — while reviews kept re-finding the same drift. It is now
|
|
52
|
+
a rule: `../document/corpus-guide.md` § A derived fact has exactly one home.
|
|
46
53
|
6. **Mandatory is a cost and must buy something.** A mandatory rule that prevents no concrete failure is
|
|
47
54
|
repealed, not loosened.
|
|
48
55
|
|
|
@@ -74,8 +81,8 @@ client through a contract — will demand the artifacts as a deliverable, the to
|
|
|
74
81
|
|
|
75
82
|
## Why `mode` has no third scope
|
|
76
83
|
|
|
77
|
-
`mode` cannot be overridden per
|
|
78
|
-
override would give one component two different depths depending on which
|
|
84
|
+
`mode` cannot be overridden per spec or per `SPEC.md`. A spec MAY cross several components, so a per-spec
|
|
85
|
+
override would give one component two different depths depending on which spec touched it — while the
|
|
79
86
|
document is one, and living.
|
|
80
87
|
|
|
81
88
|
> Depth belongs to the component, not to the work.
|
|
@@ -190,7 +197,7 @@ Not theory. In the previous run, 41 cross-component business rules from seven pa
|
|
|
190
197
|
merged and de-duplicated **serially**, because the target file had no key — and that merge was the most
|
|
191
198
|
expensive part of the pass.
|
|
192
199
|
|
|
193
|
-
Keys that exist: the Product Component, the inventory source, the endpoint number, the
|
|
200
|
+
Keys that exist: the Product Component, the inventory source, the endpoint number, the ticket, the spec.
|
|
194
201
|
Things with no key: the glossary, the cross-component rules, the spine.
|
|
195
202
|
|
|
196
203
|
## Why nine ceremonies were repealed
|
|
@@ -237,7 +244,7 @@ symmetric, the rule demanded a section that would be empty or invented — and t
|
|
|
237
244
|
exception but a field: `built` says whether the implementation is ours, and the match became one-directional.
|
|
238
245
|
|
|
239
246
|
**A definition left unwritten will be re-argued in the next corpus.** That is the general lesson, and it is
|
|
240
|
-
why `built` is checked by
|
|
247
|
+
why `built` is checked by `container-built` rather than merely described here: prose that nothing verifies is prose that
|
|
241
248
|
gets contradicted by the first person in a hurry.
|
|
242
249
|
|
|
243
250
|
## What is not here
|
|
@@ -27,7 +27,7 @@ Normative rules that hold **only in this product**, and are not code conventions
|
|
|
27
27
|
`inventory-readers.py` — how this product's code is read, for the three inventories. It sits in the
|
|
28
28
|
room for the same reason the rules do: the method's engine is generic, reading a stack is not, and
|
|
29
29
|
`update` MUST NOT overwrite what a product wrote about its own code. What ships is a **skeleton** —
|
|
30
|
-
no patterns, no stack — and `wdi-init` intent `readers` fills it in against this repo. `
|
|
30
|
+
no patterns, no stack — and `wdi-init` intent `readers` fills it in against this repo. `custom-room-declared` does not
|
|
31
31
|
look at it: only `.md` is a rule.
|
|
32
32
|
|
|
33
33
|
## What does not
|
|
@@ -48,7 +48,7 @@ very failure this rule prevents.
|
|
|
48
48
|
|
|
49
49
|
## The shape of a file here
|
|
50
50
|
|
|
51
|
-
Frontmatter is required, and `
|
|
51
|
+
Frontmatter is required, and `custom-room-declared` checks it:
|
|
52
52
|
|
|
53
53
|
```yaml
|
|
54
54
|
---
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
---
|
|
2
|
-
status: Draft # Article 4: Draft MAY be read as guidance, MUST NOT reject a change
|
|
3
|
-
ratified_by: null # the commit whose content ratifies this file
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# brownfield — codebase guide
|
|
7
|
-
|
|
8
|
-
**Loaded when:** writing or reviewing code.
|
|
9
|
-
|
|
10
|
-
> **Born empty on purpose.** This file is filled by the first
|
|
11
|
-
>
|
|
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
|
|
18
|
-
> `ratified_by` MUST then carry the commit holding that code.
|
|
1
|
+
---
|
|
2
|
+
status: Draft # Article 4: Draft MAY be read as guidance, MUST NOT reject a change
|
|
3
|
+
ratified_by: null # the commit whose content ratifies this file
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# brownfield — codebase guide
|
|
7
|
+
|
|
8
|
+
**Loaded when:** writing or reviewing code.
|
|
9
|
+
|
|
10
|
+
> **Born empty on purpose.** This file is filled by the first spec's distillation — what the
|
|
11
|
+
> contract and the tickets established about the brownfield is promoted here before the spec closes.
|
|
12
|
+
>
|
|
13
|
+
> Writing it up front means guessing at a convention no code has yet. It MUST NOT be filled before
|
|
14
|
+
> code exists that ratifies it.
|
|
15
|
+
|
|
16
|
+
> **Status.** While `draft`, its contents MAY be read as guidance but MUST NOT be used to reject a
|
|
17
|
+
> change. It rises to `accepted` when the first spec's distillation fills it from real code, and
|
|
18
|
+
> `ratified_by` MUST then carry the commit holding that code.
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
---
|
|
2
|
-
status: Draft # Article 4: Draft MAY be read as guidance, MUST NOT reject a change
|
|
3
|
-
ratified_by: null # the commit whose content ratifies this file
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# conventions — codebase guide
|
|
7
|
-
|
|
8
|
-
**Loaded when:** writing or reviewing code.
|
|
9
|
-
|
|
10
|
-
> **Born empty on purpose.** This file is filled by the first
|
|
11
|
-
>
|
|
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
|
|
18
|
-
> `ratified_by` MUST then carry the commit holding that code.
|
|
1
|
+
---
|
|
2
|
+
status: Draft # Article 4: Draft MAY be read as guidance, MUST NOT reject a change
|
|
3
|
+
ratified_by: null # the commit whose content ratifies this file
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# conventions — codebase guide
|
|
7
|
+
|
|
8
|
+
**Loaded when:** writing or reviewing code.
|
|
9
|
+
|
|
10
|
+
> **Born empty on purpose.** This file is filled by the first spec's distillation — what the
|
|
11
|
+
> contract and the tickets established about the conventions is promoted here before the spec closes.
|
|
12
|
+
>
|
|
13
|
+
> Writing it up front means guessing at a convention no code has yet. It MUST NOT be filled before
|
|
14
|
+
> code exists that ratifies it.
|
|
15
|
+
|
|
16
|
+
> **Status.** While `draft`, its contents MAY be read as guidance but MUST NOT be used to reject a
|
|
17
|
+
> change. It rises to `accepted` when the first spec's distillation fills it from real code, and
|
|
18
|
+
> `ratified_by` MUST then carry the commit holding that code.
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
---
|
|
2
|
-
status: Draft # Article 4: Draft MAY be read as guidance, MUST NOT reject a change
|
|
3
|
-
ratified_by: null # the commit whose content ratifies this file
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# stack — codebase guide
|
|
7
|
-
|
|
8
|
-
**Loaded when:** writing or reviewing code.
|
|
9
|
-
|
|
10
|
-
> **Born empty on purpose.** This file is filled by the first
|
|
11
|
-
>
|
|
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
|
|
18
|
-
> `ratified_by` MUST then carry the commit holding that code.
|
|
1
|
+
---
|
|
2
|
+
status: Draft # Article 4: Draft MAY be read as guidance, MUST NOT reject a change
|
|
3
|
+
ratified_by: null # the commit whose content ratifies this file
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# stack — codebase guide
|
|
7
|
+
|
|
8
|
+
**Loaded when:** writing or reviewing code.
|
|
9
|
+
|
|
10
|
+
> **Born empty on purpose.** This file is filled by the first spec's distillation — what the
|
|
11
|
+
> contract and the tickets established about the stack is promoted here before the spec closes.
|
|
12
|
+
>
|
|
13
|
+
> Writing it up front means guessing at a convention no code has yet. It MUST NOT be filled before
|
|
14
|
+
> code exists that ratifies it.
|
|
15
|
+
|
|
16
|
+
> **Status.** While `draft`, its contents MAY be read as guidance but MUST NOT be used to reject a
|
|
17
|
+
> change. It rises to `accepted` when the first spec's distillation fills it from real code, and
|
|
18
|
+
> `ratified_by` MUST then carry the commit holding that code.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# The spine holds the invariants that keep separately built units from diverging.
|
|
3
3
|
# Structure (stack, tree, data shapes) is treated as a seed, not a contract.
|
|
4
4
|
#
|
|
5
|
-
# Order binds: the spine comes first, and
|
|
5
|
+
# Order binds: the spine comes first, and the spec's contract reads it as a companion — never the other
|
|
6
6
|
# way round.
|
|
7
7
|
|
|
8
8
|
[workflow]
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
#
|
|
10
10
|
# The main danger is not the path but this skill's habit of editing directly: its default is
|
|
11
11
|
# "direct updates to epics, stories, or PRD sections". In this repo that MUST NOT happen —
|
|
12
|
-
# document changes go through wdi-decision intent `apply`, and
|
|
12
|
+
# document changes go through wdi-decision intent `apply`, and spec content through wdi-build.
|
|
13
13
|
# That is why the prohibition is installed as a persistent fact, held from activation, rather than
|
|
14
14
|
# as end-of-run polish.
|
|
15
15
|
|
|
@@ -18,11 +18,11 @@
|
|
|
18
18
|
persistent_facts = [
|
|
19
19
|
"file:{project-root}/.constitution/method/document/delivery-flow-guide.md",
|
|
20
20
|
"file:{project-root}/.constitution/method/document/corpus-guide.md",
|
|
21
|
-
"This skill MUST NOT write or edit anything in {project-root}/.what/ or {project-root}/.how/. Its output is a proposal; document changes are made by wdi-decision intent `apply` once the `DEC-` is accepted, and
|
|
22
|
-
"epics.md and sprint-status.yaml are NOT used in this repo
|
|
23
|
-
"The impact scan MUST cover .what/_prd/, .what/<pc>/, .how/_platform/, .how/<pc>/, SPEC.md, .control/registry/
|
|
21
|
+
"This skill MUST NOT write or edit anything in {project-root}/.what/ or {project-root}/.how/. Its output is a proposal; document changes are made by wdi-decision intent `apply` once the `DEC-` is accepted, and spec content by wdi-build.",
|
|
22
|
+
"epics.md and sprint-status.yaml are NOT used in this repo, and neither is the stories route they belong to. Neither MUST be read as a source, and neither MUST be created.",
|
|
23
|
+
"The impact scan MUST cover .what/_prd/, .what/<pc>/, .how/_platform/, .how/<pc>/, SPEC.md, .control/registry/specs.yaml, and the ticket files. .what/<pc>/ is unknown to this skill entirely, and without this it goes stale silently.",
|
|
24
24
|
"Every plan change that is expensive to reverse MUST become a `DEC-` through wdi-decision, not a paragraph inside the proposal. A course correction is itself one `DEC-` of type course-correction.",
|
|
25
|
-
"A correction that voids more than 30% of a
|
|
25
|
+
"A correction that voids more than 30% of a spec's tickets MUST NOT be handled as a patch. Say so, and let the spec be re-cut through wdi-build.",
|
|
26
26
|
]
|
|
27
27
|
|
|
28
28
|
on_complete = "Hand the landing to wdi-decision: the whole proposal becomes one `DEC-` of type course-correction, and its run folder MUST NOT be deleted. MUST NOT land itself, MUST NOT edit .what/ or .how/."
|
|
@@ -27,16 +27,22 @@ doc_standards = ["file:{project-root}/.constitution/method/document/prd-guide.md
|
|
|
27
27
|
# activation. prd-guide.md remains authoritative; where the two disagree, the guide wins and the
|
|
28
28
|
# line here MUST be fixed.
|
|
29
29
|
persistent_facts = [
|
|
30
|
-
"file:{project-root}/.control/registry/
|
|
30
|
+
"file:{project-root}/.control/registry/goals.yaml",
|
|
31
31
|
"file:{project-root}/.constitution/method/document/prd-guide.md",
|
|
32
32
|
|
|
33
|
-
"
|
|
33
|
+
"BG-N is allocated from goals.yaml, which this PRD only READS. CAP-N, FR-N, NFR-N, and UJ-N are all allocated from this initiative's own requirements-<slug>.yaml, where <slug> is this PRD's folder name under .what/_prd/ — one file, one writer. None of them MUST restart from 1. The next initiative's PRD continues the previous PRD's sequence — the sequence is global, one product, one sequence.",
|
|
34
|
+
|
|
35
|
+
"Every FR's statement and proof of done, and every NFR's statement and enforced_by, are written directly into requirements-<slug>.yaml on the id's own row — as part of finishing this PRD, not a later step. The PRD's own §3 Features section cites the id under a Realizes: line and MUST NOT also carry the full statement or proof of done in prose. A promise written in both places is the same fact with two homes.",
|
|
34
36
|
|
|
35
37
|
"This PRD is a living document. A behaviour change, a closely related feature addition, or a promise correction MUST go through intent Update on the same PRD. A new PRD MUST NOT be created just because the release changed; it is created only when the functional area is genuinely different and reads badly if merged.",
|
|
36
38
|
|
|
39
|
+
"§1 Why This Initiative states a DELTA against the product brief's own Why section — what this initiative changes, adds, or unlocks beyond it. It MUST NOT restate the product's vision from scratch; on a single-initiative product, one sentence pointing back to the brief is enough.",
|
|
40
|
+
|
|
41
|
+
"This template carries no Document Purpose section, no Glossary section, no Non-Goals section, no Open Questions section, and no Assumptions Index section — all five were removed. A domain noun MUST already exist in .control/product-glossary.md, used verbatim; a new one is raised through wdi-question in the same pass, never defined in this document. An open question or an unresolved [ASSUMPTION] tag is filed through wdi-question into .control/questions/ the moment it is found, never batched into a section.",
|
|
42
|
+
|
|
37
43
|
"Every intent Update run MUST add exactly one row to the PRD's Revision History table: the date, what changed in language an outside reader understands, and why. That table is for the reader; the memlog is for the audit. Neither MUST substitute for the other.",
|
|
38
44
|
|
|
39
|
-
"A release MUST NOT be stated through the PRD's folder name or its title. It is carried by the target_release field in requirements
|
|
45
|
+
"A release MUST NOT be stated through the PRD's folder name or its title. It is carried by the target_release field on the CAP row in requirements-<slug>.yaml, and by specs.yaml. Naming a release number inside the PRD's prose MAY be done as context, but the registry remains what binds.",
|
|
40
46
|
|
|
41
47
|
"Every memlog.py call — init, append, set, and the read on resume or intent Update — MUST use --path {project-root}/.control/memlog/prd-FILL-initiative-slug.md. The slug MUST match run_folder_pattern above, and both lines MUST change together when the initiative changes. --workspace MUST NOT be used.",
|
|
42
48
|
]
|
|
@@ -22,9 +22,13 @@ doc_standards = ["file:{project-root}/.constitution/method/document/brief-guide.
|
|
|
22
22
|
persistent_facts = [
|
|
23
23
|
"Every memlog.py call — init, append, set, and the read on resume or intent Update — MUST use --path {project-root}/.control/memlog/brief.md. --workspace MUST NOT be used; it would place a .memlog.md inside .what/, and no memlog is allowed to live in the corpus.",
|
|
24
24
|
|
|
25
|
-
"The brief template opens with permission to drop a section that does not fit. That permission MUST NOT apply to the eight mandatory sections: The Problem, Who This Serves, Goals, Success Criteria, Scope In, Scope Out, Constraints
|
|
25
|
+
"The brief template opens with permission to drop a section that does not fit. That permission MUST NOT apply to the eight mandatory sections: Why, The Problem, Who This Serves, Goals, Success Criteria, Scope In, Scope Out, Constraints. The Solution and What Makes This Different stay optional. Other template sections MAY be dropped.",
|
|
26
26
|
|
|
27
|
-
"
|
|
27
|
+
"The brief MUST NOT carry an Assumptions section or a Prerequisites section — both were removed from the template. An assumption belongs in .control/questions/assumptions.md, a prerequisite in .control/questions/external.md, each filed through wdi-question, never restated in the brief.",
|
|
28
|
+
|
|
29
|
+
"Goals MUST be numbered BG-1, BG-2, and so on. They MUST NOT be numbered G1, G2 — G1 through G5 are the names of this method's five gates, and BG is the first link in the BG -> CAP -> FR/NFR -> UC -> Ticket -> Test traceability chain. The brief's own Goals section is a POINTER ONLY — 'Goals — see goals.yaml -> goals:' — and MUST NOT restate a goal's statement. The statement for each BG-N is written directly into .control/registry/goals.yaml -> goals:, as part of finishing the brief, not left to a later step.",
|
|
30
|
+
|
|
31
|
+
"Success Criteria MUST name exactly ONE measurable figure, with a timeframe — not a mission statement, not a mix of signals. A criterion nobody could check without opening the code fails this.",
|
|
28
32
|
|
|
29
33
|
"The Who This Serves table MUST carry exactly one row marked primary, and MUST cover every stakeholder including one who never opens the product.",
|
|
30
34
|
|
|
@@ -12,7 +12,7 @@ Two intents, run in this order:
|
|
|
12
12
|
|
|
13
13
|
| Intent | Writes | Wraps |
|
|
14
14
|
|---|---|---|
|
|
15
|
-
| `catalog` | Per `<pc>`: § Actor Register · § UC Catalogue · `03-domain/domain-model.md`. Product level: `.what/business-rules.md` · `.control/product-glossary.md` · `usecases.yaml` |
|
|
15
|
+
| `catalog` | Per `<pc>`: § Actor Register · § UC Catalogue · `03-domain/domain-model.md`. Product level: `.what/business-rules.md` · `.control/product-glossary.md` · `usecases.yaml` | `mattpocock-skills:domain-modeling` |
|
|
16
16
|
| `platform` | `.how/_platform/`: the spine · C4 L1/L2/L3 · `cross-cutting.md` · the three inventories. Registry: `containers` | `bmad-architecture` |
|
|
17
17
|
|
|
18
18
|
**Blueprint content is untouched by `mode` and by `risk_accepted`.** Everything above exists at every mode,
|
|
@@ -40,7 +40,7 @@ of that is `wdi-component` at G4. You MUST NOT write a promise; when the bluepri
|
|
|
40
40
|
intent `component` — the slicing is born at the tail of G2, from the brief plus every PRD.
|
|
41
41
|
- `catalog` runs before `platform`. The spine is written against a portrait that exists.
|
|
42
42
|
- If the spine and C4 set already exist, `platform` is an **amendment**, never a create. A second create
|
|
43
|
-
overwrites what three
|
|
43
|
+
overwrites what three specs of annotation put there.
|
|
44
44
|
- If the ask is one component's mechanism or its full flows, route to `wdi-component`.
|
|
45
45
|
- If the ask is what the product promises, route to `wdi-product` — an invariant is not a promise.
|
|
46
46
|
|
|
@@ -65,6 +65,60 @@ whose nouns nobody defined.
|
|
|
65
65
|
the count passes a third of a component's use cases, derive it again — `delivery-flow-guide.md` owns the rule
|
|
66
66
|
and it MUST NOT be negotiated.
|
|
67
67
|
|
|
68
|
+
### Domain modelling is active, and `mattpocock-skills:domain-modeling` is its engine
|
|
69
|
+
|
|
70
|
+
The domain model is not written by taking dictation. **You MUST invoke
|
|
71
|
+
`mattpocock-skills:domain-modeling`** to derive it, the same way the spine goes through
|
|
72
|
+
`bmad-architecture` — this skill never does the deriving itself, it positions the engine, verifies the
|
|
73
|
+
result against `srs-guide.md`, and lands it in this method's template.
|
|
74
|
+
|
|
75
|
+
Four behaviours are what the engine is invoked for. Verify each one actually happened before landing
|
|
76
|
+
anything; an engine run that produced none of them is a transcription, and the run MUST be reported as such:
|
|
77
|
+
|
|
78
|
+
1. **A term challenged the moment it conflicted** with what the glossary already defines.
|
|
79
|
+
2. **Fuzzy language split** — *"you said account: the Customer or the User?"* Two words for one thing is
|
|
80
|
+
drift and Step 1 catches it. **One word for two things is worse and nothing else catches it**, because
|
|
81
|
+
both readings survive review looking correct.
|
|
82
|
+
3. **Relationships stress-tested with invented edge scenarios.** This feeds two things asked for elsewhere
|
|
83
|
+
here: the `critical` derivation, and the branches that become `05-scenarios/` at `deep`.
|
|
84
|
+
4. **The model cross-referenced against the code**, where code exists, with every contradiction surfaced.
|
|
85
|
+
`wdi-reconcile` compares documents with documents and `inventory.py` compares the three inventories with
|
|
86
|
+
code — **nothing else compares the domain model with the code.**
|
|
87
|
+
|
|
88
|
+
#### Where it MUST NOT write, and which of its rules MUST NOT be followed
|
|
89
|
+
|
|
90
|
+
It writes **as it goes, at the repo root**, by its own instruction — *"update `CONTEXT.md` right there,
|
|
91
|
+
don't batch these up"* — creating its folders lazily. So its write location MUST be pointed at
|
|
92
|
+
`_bmad-output/` **before** it starts, not corrected after. Four of its artifacts are class C working output
|
|
93
|
+
here, and **none MUST be landed**:
|
|
94
|
+
|
|
95
|
+
| Its artifact | Where the fact goes instead |
|
|
96
|
+
|---|---|
|
|
97
|
+
| `CONTEXT.md` — its own rule makes it *"a glossary and nothing else"*, so the mapping is exact | `.control/product-glossary.md` |
|
|
98
|
+
| `CONTEXT-MAP.md` — where each bounded context lives | `components.yaml` + the two structure maps |
|
|
99
|
+
| `docs/adr/` — **Article 3** forbids a `docs/` layer for corpus or rules outright | `.control/decisions/` |
|
|
100
|
+
| An ADR file — the name is retired here | a `DEC-` through `wdi-decision` |
|
|
101
|
+
|
|
102
|
+
**Its ADR test is narrower than ours and MUST NOT be used.** It offers an ADR only when a decision is hard
|
|
103
|
+
to reverse **and** surprising **and** the result of a real trade-off. `decision-guide.md` asks one question
|
|
104
|
+
instead — *"in three months, is the answer readable from the code?"* — which deliberately keeps the decisions
|
|
105
|
+
that sound small. So it will stay silent on decisions this method wants recorded: apply our test to what it
|
|
106
|
+
surfaces, and MUST NOT read its silence as *"nothing worth recording happened"*.
|
|
107
|
+
|
|
108
|
+
#### When it is not installed
|
|
109
|
+
|
|
110
|
+
`bmad-guide.md` §*When an engine earns being invoked at all* owns the general rule. For this engine: it is a
|
|
111
|
+
**plugin, not part of this package's install**, so its absence is a real state and not a defect. Report it
|
|
112
|
+
once, name the four behaviours above as the standard the derivation is still held to, and carry them out
|
|
113
|
+
here. You MUST NOT block G3 on a missing plugin, and you MUST NOT report its absence as a finding.
|
|
114
|
+
|
|
115
|
+
#### What lands, whatever produced it
|
|
116
|
+
|
|
117
|
+
The entity table's `Code name` and `Never called` columns, plus the glossary entry each row cites —
|
|
118
|
+
`language-guide.md` owns which language the code name is written in. And one rule holds regardless of engine:
|
|
119
|
+
**the conceptual layer stays conceptual.** A column type appearing in `03-domain/` means the model has
|
|
120
|
+
quietly become physical, and `templates/model.md` owns that.
|
|
121
|
+
|
|
68
122
|
**A method term MUST NOT be written into `.constitution/method/method-glossary.md`.** A product term binds one
|
|
69
123
|
project; a method term binds every project the method is installed in. Raise it as a proposal, state where it
|
|
70
124
|
appeared and why the existing vocabulary does not cover it, and hand it to the owner.
|
|
@@ -106,7 +160,7 @@ Then verify and land:
|
|
|
106
160
|
| 6 | Nothing but invariants | A statement affecting one component only — that is its SDD |
|
|
107
161
|
| 7 | Memlog at `.control/memlog/spine.md` | A `.memlog.md` appeared inside `.how/` — `--workspace` was used |
|
|
108
162
|
|
|
109
|
-
Check 7 MUST be fixed immediately.
|
|
163
|
+
Check 7 MUST be fixed immediately. `memlog-home` rejects a memlog inside the corpus.
|
|
110
164
|
|
|
111
165
|
**Land the C4 set by amending, never overwriting.** The files are living and already carry annotations,
|
|
112
166
|
including a pre-method provenance note that MUST survive. When the incoming set contradicts an annotation
|
|
@@ -114,14 +168,19 @@ already there, you MUST stop and report it, and MUST NOT resolve it by preferrin
|
|
|
114
168
|
C4 file and the spine disagree, the spine wins and the disagreement MUST be reported. One
|
|
115
169
|
`c4-l3-<container>.md` per `built: true` container **holding more than one Product Component**. A
|
|
116
170
|
`built: false` container gets no L3 at all, and a one-PC container needs none because the L2 matrix already
|
|
117
|
-
places it. **Not one of the three waits for a
|
|
171
|
+
places it. **Not one of the three waits for a spec** — `architecture-guide.md` owns that.
|
|
118
172
|
|
|
119
173
|
**Register the containers** in `containers:` in `components.yaml`, in the same act as landing the L2. It is
|
|
120
|
-
not a follow-up
|
|
174
|
+
not a follow-up.
|
|
175
|
+
|
|
176
|
+
**And fill every `LC` whose `container:` is empty, in that same act.** Screens registered by `wdi-ux` at
|
|
177
|
+
G2 are born without one on purpose — containers do not exist yet — and this is the moment the answer
|
|
178
|
+
does. `container-built` starts demanding it as soon as a Product Component lists containers, so filling it here is what
|
|
179
|
+
keeps the board clean without anyone tracking a to-do.
|
|
121
180
|
|
|
122
181
|
Each container MUST carry `built:` — `true` when we write what is inside it, `false` when we deploy
|
|
123
182
|
someone else's implementation. It decides whether the container gets an L3, an `LC`, and a heading in the
|
|
124
|
-
codebase map (
|
|
183
|
+
codebase map (`container-built`). Something whose **runtime we do not deploy** is an external system: it belongs at L1,
|
|
125
184
|
and registering it here promises a codebase-map section that will never exist.
|
|
126
185
|
|
|
127
186
|
**Fill each PC's `containers:` in the same act, and land the matrix at L2** — the registry is the SSOT and
|
|
@@ -134,7 +193,7 @@ You MUST NOT register a
|
|
|
134
193
|
**Register what `_platform` owns** in the same pass — a domain entity through `platform_owns`, an inventory
|
|
135
194
|
row through that inventory's `platform_rows:`, an `LC` through its `component:`. The test is in
|
|
136
195
|
`corpus-guide.md` and both halves MUST hold. Each one MUST then be described under `## Platform-owned` in
|
|
137
|
-
`cross-cutting.md`, in the same act:
|
|
196
|
+
`cross-cutting.md`, in the same act: `entity-one-writer` checks that second half, because owning something without
|
|
138
197
|
documenting it is taking ownership without taking responsibility.
|
|
139
198
|
|
|
140
199
|
A judgement the pattern cannot derive MUST live in the artifact it governs, not in a script and not in a
|
|
@@ -159,13 +218,13 @@ a new row takes the next number, never a renumber.
|
|
|
159
218
|
|
|
160
219
|
## Step 6 — The roll-up, and what the owner actually reads
|
|
161
220
|
|
|
162
|
-
Regenerate `.
|
|
221
|
+
Regenerate `.how-rendered/blueprint.md` with `validate.py --generate`. It assembles the UC catalogue, the
|
|
163
222
|
actor lists, the domain model, and the three inventories into **one page**.
|
|
164
223
|
|
|
165
224
|
**That page is what G3 reviews** — not seven files. The catalogue and actors stay in their component kernels as
|
|
166
225
|
their permanent home; the roll-up is a view. One fact, one home, one view.
|
|
167
226
|
|
|
168
|
-
You MUST NOT hand-write anything under `.control/generated/`.
|
|
227
|
+
You MUST NOT hand-write anything under `.control/generated/`, `.what-rendered/`, or `.how-rendered/`.
|
|
169
228
|
|
|
170
229
|
## Step 7 — Review and questions
|
|
171
230
|
|
|
@@ -174,7 +233,9 @@ You MUST NOT hand-write anything under `.control/generated/`.
|
|
|
174
233
|
- You MUST NOT open G3 on a portrait that has not been through it.
|
|
175
234
|
- Every unresolved to-be-confirmed MUST be filed through `wdi-question`, in **one** ranked batch — into
|
|
176
235
|
`assumptions.md` by default, `blocking.md` only through its three tests.
|
|
177
|
-
- A decision surfacing while writing
|
|
236
|
+
- A decision surfacing while writing is **written into the document as its own content** — stated as what
|
|
237
|
+
now holds, present tense. Never as a parenthetical aside, and never routed to `wdi-decision` merely for
|
|
238
|
+
being a decision: that is only for one with no home here at all, or one touching an `AD-N`.
|
|
178
239
|
- An `AD-N` that reverses or narrows an earlier one MUST go through `wdi-decision` first. Editing an `AD-N` in
|
|
179
240
|
place is how a reversal happens with nobody deciding it.
|
|
180
241
|
|