wdi-method 0.4.3 → 0.4.6
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 +252 -222
- package/bin/wdi-method.js +1030 -1029
- package/kit/.constitution/document/delivery-flow-guide.md +1 -1
- package/kit/.constitution/document/templates/cross-cutting.md +4 -4
- package/kit/.constitution/document/templates/model.md +2 -2
- package/kit/.constitution/document/templates/questions.md +10 -9
- package/kit/.constitution/document/templates/srs.md +2 -2
- package/kit/.constitution/scripts/inventory.py +102 -100
- package/kit/.constitution/scripts/timeline.py +665 -665
- package/kit/.constitution/scripts/validate.py +314 -312
- package/kit/assets/bmad-custom/bmad-advanced-elicitation.toml +15 -15
- package/kit/assets/bmad-custom/bmad-architecture.toml +17 -15
- package/kit/assets/bmad-custom/bmad-build-auto.toml +5 -5
- package/kit/assets/bmad-custom/bmad-build.toml +52 -52
- package/kit/assets/bmad-custom/bmad-code-review.toml +6 -5
- package/kit/assets/bmad-custom/bmad-correct-course.toml +28 -27
- package/kit/assets/bmad-custom/bmad-deep-recon.toml +12 -11
- package/kit/assets/bmad-custom/bmad-prd.toml +22 -22
- package/kit/assets/bmad-custom/bmad-product-brief.toml +34 -34
- package/kit/assets/bmad-custom/bmad-retrospective.toml +9 -9
- package/kit/assets/bmad-custom/bmad-spec.toml +9 -8
- package/kit/assets/bmad-custom/bmad-ux.toml +7 -7
- package/kit/assets/bmad-custom/config.toml +3 -3
- package/kit/skills/wdi-report/SKILL.md +5 -5
- package/package.json +2 -2
- package/scaffold/.control/product-glossary.md +21 -21
- package/scaffold/.control/project-non-technical-log.md +23 -23
- package/scaffold/.control/questions/answered.md +11 -11
- package/scaffold/.control/questions/assumptions.md +15 -15
- package/scaffold/.control/questions/blocking.md +21 -21
- package/scaffold/.control/questions/external.md +11 -11
- package/scaffold/.control/registry/components.yaml +21 -21
- package/scaffold/.control/registry/defects.yaml +3 -3
- package/scaffold/.control/registry/index.yaml +46 -46
- package/scaffold/.control/registry/requirements.yaml +15 -15
- package/scaffold/.control/registry/risks.yaml +5 -5
- package/scaffold/.control/registry/usecases.yaml +6 -6
|
@@ -44,11 +44,11 @@ it prints before reading anything else:
|
|
|
44
44
|
|
|
45
45
|
| What it says | What you MUST do |
|
|
46
46
|
|---|---|
|
|
47
|
-
| `rtm/status
|
|
48
|
-
| `git
|
|
49
|
-
| `registry
|
|
50
|
-
| `story
|
|
51
|
-
| `n
|
|
47
|
+
| `rtm/status not yet generated` (exit 3) | Stop. The tables cannot be built, so there is nothing honest to report |
|
|
48
|
+
| `git did not respond` (exit 3) | Stop. Every actual date comes from git; without it there is no time dimension |
|
|
49
|
+
| `the registry has uncommitted changes` | Say so in the report header. The numbers describe a working tree, not `main` |
|
|
50
|
+
| `story with no git history` | Name those stories. They count toward promise progress but cannot appear under Proven |
|
|
51
|
+
| `n findings` | Report the count and, if any are red, say which gate they block |
|
|
52
52
|
|
|
53
53
|
A report built on stale tables is worse than no report: it looks authoritative and is not.
|
|
54
54
|
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wdi-method",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.6",
|
|
4
4
|
"description": "WDI Method — software delivery method that wraps BMad",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
|
-
"wdi-method": "
|
|
7
|
+
"wdi-method": "bin/wdi-method.js"
|
|
8
8
|
},
|
|
9
9
|
"files": [
|
|
10
10
|
"bin/",
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
# Product Glossary
|
|
2
|
-
|
|
3
|
-
**
|
|
4
|
-
|
|
5
|
-
SSOT
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
##
|
|
13
|
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
|
|
19
|
-
##
|
|
20
|
-
|
|
21
|
-
<!--
|
|
1
|
+
# Product Glossary
|
|
2
|
+
|
|
3
|
+
**Loaded when:** writing any document in the corpus.
|
|
4
|
+
|
|
5
|
+
The SSOT for **product** vocabulary — what this product talks about. Every term is defined **once**
|
|
6
|
+
here, then used as-is across the corpus.
|
|
7
|
+
|
|
8
|
+
**Method** vocabulary lives in `.constitution/method-glossary.md` and MUST NOT be redefined here. The
|
|
9
|
+
split test: does this term still hold if used in another product? Yes → `method-glossary.md`, no →
|
|
10
|
+
here.
|
|
11
|
+
|
|
12
|
+
## Rules
|
|
13
|
+
|
|
14
|
+
- A new term appearing in any document MUST be added here **in the same pass**.
|
|
15
|
+
- A definition MUST name its relationship to other terms and its cardinality where relevant.
|
|
16
|
+
- One term MUST NOT have two entries.
|
|
17
|
+
- This file is born **empty** and filled from the product. Its first entries are born with the brief at G1.
|
|
18
|
+
|
|
19
|
+
## Entries
|
|
20
|
+
|
|
21
|
+
<!-- Alphabetical. Format: **Term** — definition. Relationship. Cardinality where relevant. -->
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
# Project Non-Technical Log
|
|
2
|
-
|
|
3
|
-
**
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
##
|
|
14
|
-
|
|
15
|
-
| id |
|
|
16
|
-
|---|---|---|---|---|---|
|
|
17
|
-
| — | — | — | — | — | — |
|
|
18
|
-
|
|
19
|
-
##
|
|
20
|
-
|
|
21
|
-
| id |
|
|
22
|
-
|---|---|---|---|
|
|
23
|
-
| — | — | — | — |
|
|
1
|
+
# Project Non-Technical Log
|
|
2
|
+
|
|
3
|
+
**Loaded when:** a non-technical fact that constrains this product's build changes, or when finding
|
|
4
|
+
out what already holds outside the code.
|
|
5
|
+
|
|
6
|
+
Written through the `wdi-log` skill's `fact` intent, never by hand directly.
|
|
7
|
+
|
|
8
|
+
One-sentence test: **if the number were deleted and the fact would still be useful to whoever is
|
|
9
|
+
building, it belongs here.**
|
|
10
|
+
|
|
11
|
+
Categories: `domain` · `account` · `legal` · `schedule` · `organisation`.
|
|
12
|
+
|
|
13
|
+
## In force
|
|
14
|
+
|
|
15
|
+
| id | Date | Category | Fact | Effect | Source |
|
|
16
|
+
|---|---|---|---|---|---|
|
|
17
|
+
| — | — | — | — | — | — |
|
|
18
|
+
|
|
19
|
+
## No longer in force
|
|
20
|
+
|
|
21
|
+
| id | Fact | Stopped holding | Superseded by |
|
|
22
|
+
|---|---|---|---|
|
|
23
|
+
| — | — | — | — |
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
**
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
##
|
|
8
|
-
|
|
9
|
-
| id |
|
|
10
|
-
|---|---|---|---|
|
|
11
|
-
| — | — | — | — |
|
|
1
|
+
# Answered
|
|
2
|
+
|
|
3
|
+
**Loaded when:** looking for a decision that was reached through a question, not through a `DEC-`.
|
|
4
|
+
|
|
5
|
+
Rows move here from the other three lists. MUST NOT be deleted.
|
|
6
|
+
|
|
7
|
+
## Answered
|
|
8
|
+
|
|
9
|
+
| id | Question | Answer | Closed |
|
|
10
|
+
|---|---|---|---|
|
|
11
|
+
| — | — | — | — |
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
**
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
##
|
|
12
|
-
|
|
13
|
-
| id |
|
|
14
|
-
|---|---|---|---|---|
|
|
15
|
-
| — | — | — | — | — |
|
|
1
|
+
# Assumptions
|
|
2
|
+
|
|
3
|
+
**Loaded when:** swept once per gate; MAY be skipped.
|
|
4
|
+
|
|
5
|
+
The **default** class for a question. The agent takes the answer itself and records it here, one
|
|
6
|
+
row: the assumption, plus the cost if it turns out wrong. This file **holds nothing**.
|
|
7
|
+
|
|
8
|
+
A row here MUST move up to `blocking.md` the moment it passes one of the three tests that file
|
|
9
|
+
states.
|
|
10
|
+
|
|
11
|
+
## Open
|
|
12
|
+
|
|
13
|
+
| id | Assumption | Cost if wrong | Taken | By |
|
|
14
|
+
|---|---|---|---|---|
|
|
15
|
+
| — | — | — | — | — |
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
**
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
1.
|
|
12
|
-
2.
|
|
13
|
-
3.
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
##
|
|
18
|
-
|
|
19
|
-
| id |
|
|
20
|
-
|---|---|---|---|---|
|
|
21
|
-
| — | — | — | — | — |
|
|
1
|
+
# Blocking Questions
|
|
2
|
+
|
|
3
|
+
**Loaded when:** every gate.
|
|
4
|
+
|
|
5
|
+
Only this file holds a gate. Written through `wdi-question`, never by hand directly; the row shape
|
|
6
|
+
lives in `.constitution/document/templates/questions.md`.
|
|
7
|
+
|
|
8
|
+
Target **<=3 rows per Product Component**. A question rises to here only through three tests, one is
|
|
9
|
+
enough:
|
|
10
|
+
|
|
11
|
+
1. It touches money, personal data, or a legal obligation.
|
|
12
|
+
2. It changes the wording of an `FR`'s promise.
|
|
13
|
+
3. Answering it wrong forces a rewrite of more than one component.
|
|
14
|
+
|
|
15
|
+
Failing all three → `assumptions.md`. A question MUST NOT be filed here "to be safe".
|
|
16
|
+
|
|
17
|
+
## Open
|
|
18
|
+
|
|
19
|
+
| id | Question | Blocks | Owner | Before |
|
|
20
|
+
|---|---|---|---|---|
|
|
21
|
+
| — | — | — | — | — |
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
**
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
##
|
|
8
|
-
|
|
9
|
-
| id |
|
|
10
|
-
|---|---|---|---|
|
|
11
|
-
| — | — | — | — |
|
|
1
|
+
# Waiting on an Outside Party
|
|
2
|
+
|
|
3
|
+
**Loaded when:** an answer can only come from outside this session.
|
|
4
|
+
|
|
5
|
+
This file **does not hold a gate** unless its row is also pointed to from `blocking.md`.
|
|
6
|
+
|
|
7
|
+
## Open
|
|
8
|
+
|
|
9
|
+
| id | Question | Waiting on | Since |
|
|
10
|
+
|---|---|---|---|
|
|
11
|
+
| — | — | — | — |
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
# components.yaml — SSOT
|
|
2
|
-
#
|
|
3
|
-
#
|
|
4
|
-
# Product Component (PC) —
|
|
5
|
-
# Container — unit
|
|
6
|
-
# Logical Component (LC) —
|
|
7
|
-
#
|
|
8
|
-
# `mode` —
|
|
9
|
-
# `risk_accepted` —
|
|
10
|
-
# `owns` —
|
|
11
|
-
# `g4_passed` —
|
|
12
|
-
#
|
|
13
|
-
#
|
|
14
|
-
|
|
15
|
-
product_components: []
|
|
16
|
-
|
|
17
|
-
platform_owns: []
|
|
18
|
-
|
|
19
|
-
containers: []
|
|
20
|
-
|
|
21
|
-
logical_components: []
|
|
1
|
+
# components.yaml — SSOT for Product Components, containers, and Logical Components
|
|
2
|
+
#
|
|
3
|
+
# Three different things, two of which share the word "component":
|
|
4
|
+
# Product Component (PC) — a DOMAIN slice, a surface a user could name
|
|
5
|
+
# Container — a unit that runs or deploys on its own; owned by C4 L2
|
|
6
|
+
# Logical Component (LC) — one nameable build unit
|
|
7
|
+
#
|
|
8
|
+
# `mode` — DOCUMENT DEPTH. Written ONLY on a component that genuinely needs to differ from global.
|
|
9
|
+
# `risk_accepted` — REVIEW INTENSITY, not depth. low · medium · high
|
|
10
|
+
# `owns` — the domain entities this component is AUTHORISED TO WRITE.
|
|
11
|
+
# `g4_passed` — only means something on a component at a mode above catalog.
|
|
12
|
+
#
|
|
13
|
+
# A component is born through wdi-init intent `component` at the tail of G2. This file is born empty.
|
|
14
|
+
|
|
15
|
+
product_components: []
|
|
16
|
+
|
|
17
|
+
platform_owns: []
|
|
18
|
+
|
|
19
|
+
containers: []
|
|
20
|
+
|
|
21
|
+
logical_components: []
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
# defects.yaml — SSOT
|
|
2
|
-
|
|
3
|
-
defects: []
|
|
1
|
+
# defects.yaml — SSOT for defects: ordinary bugs and hotfixes.
|
|
2
|
+
|
|
3
|
+
defects: []
|
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
# index.yaml —
|
|
2
|
-
#
|
|
3
|
-
#
|
|
4
|
-
#
|
|
5
|
-
|
|
6
|
-
#
|
|
7
|
-
# constitution.md
|
|
8
|
-
product:
|
|
9
|
-
name: "{product}"
|
|
10
|
-
client: ""
|
|
11
|
-
|
|
12
|
-
#
|
|
13
|
-
#
|
|
14
|
-
# catalog
|
|
15
|
-
# outline +
|
|
16
|
-
# guarded + Failure Behaviour
|
|
17
|
-
# deep + ABCE, spec
|
|
18
|
-
#
|
|
19
|
-
#
|
|
20
|
-
mode: catalog
|
|
21
|
-
|
|
22
|
-
#
|
|
23
|
-
#
|
|
24
|
-
gates_passed: []
|
|
25
|
-
|
|
26
|
-
roles: []
|
|
27
|
-
# - role: Product Owner
|
|
28
|
-
# files: []
|
|
29
|
-
|
|
30
|
-
gates:
|
|
31
|
-
G1: { name: Problem, stage: 1, budget_minutes: 20 }
|
|
32
|
-
G2: { name: Product, stage: 2, budget_minutes: 45 }
|
|
33
|
-
G3: { name: Blueprint, stage: 3, budget_minutes: 45 }
|
|
34
|
-
G4: { name: Component, stage: 4, budget_minutes: 30 }
|
|
35
|
-
G5: { name: Release, stage: 5, budget_minutes: 10 }
|
|
36
|
-
|
|
37
|
-
question_budget:
|
|
38
|
-
blocking_per_component: 3
|
|
39
|
-
assumptions_per_gate: 15
|
|
40
|
-
|
|
41
|
-
wave_sizes:
|
|
42
|
-
S: { stories: "<=3", note: "
|
|
43
|
-
M: { stories: "4-12", note: "
|
|
44
|
-
L: { stories: ">12", note: "
|
|
45
|
-
|
|
46
|
-
touches_vocabulary: []
|
|
1
|
+
# index.yaml — the control map
|
|
2
|
+
#
|
|
3
|
+
# Holds what has no home in another registry: product identity, global depth, roles, gate time
|
|
4
|
+
# budgets, the open-question budget, and the `touches` vocabulary.
|
|
5
|
+
|
|
6
|
+
# PRODUCT IDENTITY. The one structured place for it. Filled at G1.
|
|
7
|
+
# constitution.md Article 1 and the brief's title quote this value — they MUST NOT become a second source.
|
|
8
|
+
product:
|
|
9
|
+
name: "{product}"
|
|
10
|
+
client: ""
|
|
11
|
+
|
|
12
|
+
# GLOBAL DEPTH. The only document-depth knob, and it MUST NOT also govern review intensity —
|
|
13
|
+
# that is `risk_accepted` per component in components.yaml.
|
|
14
|
+
# catalog UC list + three inventories + C4; zero extra files per component. G4 is skipped
|
|
15
|
+
# outline + full flows for at most 3 UC, local business rules, Decision Summary, LC list
|
|
16
|
+
# guarded + Failure Behaviour for every boundary, Inherited Constraints, integration documents
|
|
17
|
+
# deep + ABCE, a contract spec per endpoint, data dictionary, flow, state machine, scenarios
|
|
18
|
+
# Defaults to `catalog` when this line is absent. A component's own row in components.yaml WINS over this.
|
|
19
|
+
# There is no third scope: `mode` MUST NOT be overridden per wave or per SPEC.md.
|
|
20
|
+
mode: catalog
|
|
21
|
+
|
|
22
|
+
# GATES ALREADY PASSED. Written only by the repo owner's own decision at their own gate, and MUST NOT
|
|
23
|
+
# be filled by an agent to clear its own way forward.
|
|
24
|
+
gates_passed: []
|
|
25
|
+
|
|
26
|
+
roles: []
|
|
27
|
+
# - role: Product Owner
|
|
28
|
+
# files: []
|
|
29
|
+
|
|
30
|
+
gates:
|
|
31
|
+
G1: { name: Problem, stage: 1, budget_minutes: 20 }
|
|
32
|
+
G2: { name: Product, stage: 2, budget_minutes: 45 }
|
|
33
|
+
G3: { name: Blueprint, stage: 3, budget_minutes: 45 }
|
|
34
|
+
G4: { name: Component, stage: 4, budget_minutes: 30 }
|
|
35
|
+
G5: { name: Release, stage: 5, budget_minutes: 10 }
|
|
36
|
+
|
|
37
|
+
question_budget:
|
|
38
|
+
blocking_per_component: 3
|
|
39
|
+
assumptions_per_gate: 15
|
|
40
|
+
|
|
41
|
+
wave_sizes:
|
|
42
|
+
S: { stories: "<=3", note: "no new FR; G4 and G5 merge into one 20-minute session" }
|
|
43
|
+
M: { stories: "4-12", note: "as usual" }
|
|
44
|
+
L: { stories: ">12", note: "or a new container; a retrospective runs" }
|
|
45
|
+
|
|
46
|
+
touches_vocabulary: []
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
# requirements.yaml — SSOT
|
|
2
|
-
#
|
|
3
|
-
#
|
|
4
|
-
#
|
|
5
|
-
#
|
|
6
|
-
|
|
7
|
-
goals: []
|
|
8
|
-
|
|
9
|
-
capabilities: []
|
|
10
|
-
|
|
11
|
-
functional: []
|
|
12
|
-
|
|
13
|
-
nonfunctional: []
|
|
14
|
-
|
|
15
|
-
journeys: []
|
|
1
|
+
# requirements.yaml — SSOT for BG · CAP · FR · NFR · UJ
|
|
2
|
+
#
|
|
3
|
+
# Keys are English; prose values follow the product's chosen `doc_language`.
|
|
4
|
+
# Numbers are allocated FROM HERE and MUST NOT restart per document, per component, or per release.
|
|
5
|
+
# The sequence is global to one product.
|
|
6
|
+
|
|
7
|
+
goals: []
|
|
8
|
+
|
|
9
|
+
capabilities: []
|
|
10
|
+
|
|
11
|
+
functional: []
|
|
12
|
+
|
|
13
|
+
nonfunctional: []
|
|
14
|
+
|
|
15
|
+
journeys: []
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
# risks.yaml — Risk Register
|
|
2
|
-
#
|
|
3
|
-
# `pivot_trigger`
|
|
4
|
-
|
|
5
|
-
risks: []
|
|
1
|
+
# risks.yaml — Risk Register
|
|
2
|
+
#
|
|
3
|
+
# `pivot_trigger` is a measurable condition that makes turning or giving up the right call.
|
|
4
|
+
|
|
5
|
+
risks: []
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# usecases.yaml — SSOT
|
|
2
|
-
#
|
|
3
|
-
# `critical: true`
|
|
4
|
-
#
|
|
5
|
-
|
|
6
|
-
usecases: []
|
|
1
|
+
# usecases.yaml — SSOT for UC
|
|
2
|
+
#
|
|
3
|
+
# `critical: true` when the UC touches MONEY, PERSONAL DATA, or an IRREVERSIBLE ACTION.
|
|
4
|
+
# This label decides something ONLY at `mode: deep`.
|
|
5
|
+
|
|
6
|
+
usecases: []
|