wdi-method 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +203 -0
- package/bin/wdi-method.js +906 -0
- package/kit/.constitution/README.md +66 -0
- package/kit/.constitution/codebase/brownfield-guide.md +18 -0
- package/kit/.constitution/codebase/conventions-guide.md +18 -0
- package/kit/.constitution/codebase/stack-guide.md +18 -0
- package/kit/.constitution/constitution.md +135 -0
- package/kit/.constitution/document/architecture-guide.md +209 -0
- package/kit/.constitution/document/bmad-guide.md +151 -0
- package/kit/.constitution/document/bmad-skill-register.md +71 -0
- package/kit/.constitution/document/brief-guide.md +94 -0
- package/kit/.constitution/document/corpus-guide.md +341 -0
- package/kit/.constitution/document/decision-guide.md +134 -0
- package/kit/.constitution/document/delivery-flow-guide.md +338 -0
- package/kit/.constitution/document/prd-guide.md +202 -0
- package/kit/.constitution/document/sdd-guide.md +206 -0
- package/kit/.constitution/document/srs-guide.md +147 -0
- package/kit/.constitution/document/templates/addendum.md +71 -0
- package/kit/.constitution/document/templates/architecture-spine.md +100 -0
- package/kit/.constitution/document/templates/brief.md +110 -0
- package/kit/.constitution/document/templates/c4.md +77 -0
- package/kit/.constitution/document/templates/contract.md +52 -0
- package/kit/.constitution/document/templates/cross-cutting.md +80 -0
- package/kit/.constitution/document/templates/decision.md +64 -0
- package/kit/.constitution/document/templates/design-system.md +67 -0
- package/kit/.constitution/document/templates/flow.md +51 -0
- package/kit/.constitution/document/templates/integration.md +69 -0
- package/kit/.constitution/document/templates/inventory.md +69 -0
- package/kit/.constitution/document/templates/lc.md +47 -0
- package/kit/.constitution/document/templates/lifecycle.md +52 -0
- package/kit/.constitution/document/templates/meeting.md +47 -0
- package/kit/.constitution/document/templates/model.md +55 -0
- package/kit/.constitution/document/templates/oq.md +45 -0
- package/kit/.constitution/document/templates/prd.md +226 -0
- package/kit/.constitution/document/templates/questions.md +75 -0
- package/kit/.constitution/document/templates/rtr.md +61 -0
- package/kit/.constitution/document/templates/rules.md +47 -0
- package/kit/.constitution/document/templates/scn.md +40 -0
- package/kit/.constitution/document/templates/sdd.md +146 -0
- package/kit/.constitution/document/templates/srs.md +149 -0
- package/kit/.constitution/document/templates/structure-codebase.md +129 -0
- package/kit/.constitution/document/templates/structure-document.md +90 -0
- package/kit/.constitution/document/templates/uc.md +69 -0
- package/kit/.constitution/document/templates/ux.md +77 -0
- package/kit/.constitution/document/ux-guide.md +99 -0
- package/kit/.constitution/language-guide.md +69 -0
- package/kit/.constitution/method/README.md +169 -0
- package/kit/.constitution/method/artifact-map.md +155 -0
- package/kit/.constitution/method/portability.md +91 -0
- package/kit/.constitution/method/rationale.md +246 -0
- package/kit/.constitution/method-glossary.md +169 -0
- package/kit/.constitution/project/README.md +68 -0
- package/kit/.constitution/repo-guide.md +97 -0
- package/kit/.constitution/scripts/inventory.py +527 -0
- package/kit/.constitution/scripts/timeline.py +665 -0
- package/kit/.constitution/scripts/validate.py +1579 -0
- package/kit/.constitution/structure-guide.md +202 -0
- package/kit/assets/bmad-custom/bmad-advanced-elicitation.toml +15 -0
- package/kit/assets/bmad-custom/bmad-architecture.toml +31 -0
- package/kit/assets/bmad-custom/bmad-build-auto.toml +10 -0
- package/kit/assets/bmad-custom/bmad-build.toml +52 -0
- package/kit/assets/bmad-custom/bmad-code-review.toml +12 -0
- package/kit/assets/bmad-custom/bmad-correct-course.toml +27 -0
- package/kit/assets/bmad-custom/bmad-deep-recon.toml +11 -0
- package/kit/assets/bmad-custom/bmad-prd.toml +42 -0
- package/kit/assets/bmad-custom/bmad-product-brief.toml +34 -0
- package/kit/assets/bmad-custom/bmad-retrospective.toml +9 -0
- package/kit/assets/bmad-custom/bmad-spec.toml +15 -0
- package/kit/assets/bmad-custom/bmad-ux.toml +19 -0
- package/kit/assets/bmad-custom/config.toml +6 -0
- package/kit/skills/wdi-blueprint/SKILL.md +203 -0
- package/kit/skills/wdi-build/SKILL.md +244 -0
- package/kit/skills/wdi-component/SKILL.md +172 -0
- package/kit/skills/wdi-decision/.gitkeep +0 -0
- package/kit/skills/wdi-decision/SKILL.md +183 -0
- package/kit/skills/wdi-help/.gitkeep +0 -0
- package/kit/skills/wdi-help/SKILL.md +98 -0
- package/kit/skills/wdi-init/SKILL.md +149 -0
- package/kit/skills/wdi-log/SKILL.md +107 -0
- package/kit/skills/wdi-problem/SKILL.md +90 -0
- package/kit/skills/wdi-product/SKILL.md +127 -0
- package/kit/skills/wdi-question/.gitkeep +0 -0
- package/kit/skills/wdi-question/SKILL.md +88 -0
- package/kit/skills/wdi-reconcile/.gitkeep +0 -0
- package/kit/skills/wdi-reconcile/SKILL.md +146 -0
- package/kit/skills/wdi-report/SKILL.md +205 -0
- package/kit/skills/wdi-review/SKILL.md +118 -0
- package/kit/skills/wdi-systematic-debugging/SKILL.md +193 -0
- package/kit/skills/wdi-systematic-debugging/references/condition-based-waiting.md +115 -0
- package/kit/skills/wdi-systematic-debugging/references/defense-in-depth.md +122 -0
- package/kit/skills/wdi-systematic-debugging/references/find-polluter.sh +72 -0
- package/kit/skills/wdi-systematic-debugging/references/root-cause-tracing.md +169 -0
- package/kit/skills/wdi-ux/SKILL.md +145 -0
- package/kit-overlay/AGENTS.md +196 -0
- package/kit-overlay/README.md +66 -0
- package/kit-overlay/constitution.md +135 -0
- package/kit-overlay/portability.md +91 -0
- package/kit-overlay/repo-guide.md +97 -0
- package/lib/agents-block.mjs +52 -0
- package/lib/identity.mjs +65 -0
- package/package.json +37 -0
- package/scaffold/.control/decisions/.gitkeep +0 -0
- package/scaffold/.control/generated/.gitkeep +2 -0
- package/scaffold/.control/meetings/.gitkeep +0 -0
- package/scaffold/.control/memlog/.gitkeep +0 -0
- package/scaffold/.control/product-glossary.md +21 -0
- package/scaffold/.control/project-non-technical-log.md +23 -0
- package/scaffold/.control/questions/answered.md +11 -0
- package/scaffold/.control/questions/assumptions.md +15 -0
- package/scaffold/.control/questions/blocking.md +21 -0
- package/scaffold/.control/questions/external.md +11 -0
- package/scaffold/.control/registry/components.yaml +21 -0
- package/scaffold/.control/registry/decisions.yaml +6 -0
- package/scaffold/.control/registry/defects.yaml +3 -0
- package/scaffold/.control/registry/index.yaml +46 -0
- package/scaffold/.control/registry/requirements.yaml +15 -0
- package/scaffold/.control/registry/risks.yaml +5 -0
- package/scaffold/.control/registry/usecases.yaml +6 -0
- package/scaffold/.control/registry/waves.yaml +5 -0
- package/scaffold/.control/structure-codebase.md +19 -0
- package/scaffold/.control/structure-document.md +25 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: meeting
|
|
3
|
+
date: '{YYYY-MM-DD}'
|
|
4
|
+
slug: '{slug}'
|
|
5
|
+
attendees: [] # who was actually there, not who was invited
|
|
6
|
+
created: '{YYYY-MM-DD}'
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# {YYYY-MM-DD} — {topic}
|
|
10
|
+
|
|
11
|
+
<!-- TEMPLATE GUIDE — act on these comments, then delete them.
|
|
12
|
+
Record what was DECIDED, not what was discussed. A transcript is not minutes, and nobody
|
|
13
|
+
rereads one. -->
|
|
14
|
+
|
|
15
|
+
## Decisions
|
|
16
|
+
|
|
17
|
+
<!-- Each as one sentence, present tense, stated as what now holds. A "decision" with no owner and
|
|
18
|
+
no consequence is an open question — move it down. -->
|
|
19
|
+
|
|
20
|
+
## Open items
|
|
21
|
+
|
|
22
|
+
<!-- Each unresolved item, with who can resolve it. Every row here MUST also be registered through
|
|
23
|
+
wdi-question so it lands in the single list; a question recorded only in a meeting note is a
|
|
24
|
+
question nobody rereads. -->
|
|
25
|
+
|
|
26
|
+
| Question | Who can answer | By when |
|
|
27
|
+
| --- | --- | --- |
|
|
28
|
+
|
|
29
|
+
## Action items
|
|
30
|
+
|
|
31
|
+
<!-- Grouped by role, each with an owner. -->
|
|
32
|
+
|
|
33
|
+
**Owner** ·
|
|
34
|
+
**UI/UX** ·
|
|
35
|
+
**Development** ·
|
|
36
|
+
**Other** ·
|
|
37
|
+
|
|
38
|
+
## Client commitments
|
|
39
|
+
|
|
40
|
+
<!-- Verbatim where the wording matters. Paraphrasing a commitment is how a scope dispute starts.
|
|
41
|
+
Cut this section for internal meetings. -->
|
|
42
|
+
|
|
43
|
+
## DEC
|
|
44
|
+
|
|
45
|
+
<!-- Back-links to the DEC- this meeting produced, filled after wdi-decision runs. A meeting whose
|
|
46
|
+
decisions have no DEC- — and a DEC- with no meeting note — are both traceability gaps that the
|
|
47
|
+
audit surfaces later at a worse time. -->
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: model
|
|
3
|
+
component: '{pc}'
|
|
4
|
+
layer: physical # conceptual (.what/<pc>/03-domain/) · physical (.how/<pc>/05-model/)
|
|
5
|
+
created: '{YYYY-MM-DD}'
|
|
6
|
+
updated: '{YYYY-MM-DD}'
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Model — {name}
|
|
10
|
+
|
|
11
|
+
<!-- TEMPLATE GUIDE — act on these comments, then delete them.
|
|
12
|
+
|
|
13
|
+
THE LAYER RULE, and it is the one most often broken:
|
|
14
|
+
|
|
15
|
+
conceptual — .what/<pc>/03-domain/ — things, their relationships, their cardinality, and the
|
|
16
|
+
states they move through. Column types MUST NOT appear. This is what the
|
|
17
|
+
Product Owner can read.
|
|
18
|
+
|
|
19
|
+
physical — .how/<pc>/05-model/ — tables, columns, types, indexes, constraints, migrations.
|
|
20
|
+
|
|
21
|
+
Set `layer` in the frontmatter and keep to it. A conceptual model with `VARCHAR(255)` in it has
|
|
22
|
+
already become a physical one, and the Product Owner has quietly lost the ability to review
|
|
23
|
+
the domain. -->
|
|
24
|
+
|
|
25
|
+
## Entities
|
|
26
|
+
|
|
27
|
+
<!-- One row per thing. For a conceptual model the description is what it IS to the business, not
|
|
28
|
+
how it is stored. -->
|
|
29
|
+
|
|
30
|
+
| Entity | What it is | Identified by |
|
|
31
|
+
| --- | --- | --- |
|
|
32
|
+
|
|
33
|
+
## Relationships
|
|
34
|
+
|
|
35
|
+
<!-- Direction and cardinality. State them as sentences a person would say: "satu member punya nol
|
|
36
|
+
atau satu sponsor". -->
|
|
37
|
+
|
|
38
|
+
## State Lifecycle
|
|
39
|
+
|
|
40
|
+
<!-- For entities that change status: which states exist, what triggers each transition, and who is
|
|
41
|
+
allowed to trigger it. G3 asks whether any state can be entered but not left — that question is
|
|
42
|
+
answered here or not at all. Cut this section for entities that never change status. -->
|
|
43
|
+
|
|
44
|
+
| From | To | Trigger | Who may |
|
|
45
|
+
| --- | --- | --- | --- |
|
|
46
|
+
|
|
47
|
+
## Invariants
|
|
48
|
+
|
|
49
|
+
<!-- What MUST always be true regardless of path taken. These usually become BR- entries and
|
|
50
|
+
database constraints at the same time; state them once here and reference from both. -->
|
|
51
|
+
|
|
52
|
+
## Physical notes
|
|
53
|
+
|
|
54
|
+
<!-- ONLY when layer: physical. Indexes, partitioning, retention, migration ordering. Cut entirely
|
|
55
|
+
for a conceptual model. -->
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: oq
|
|
3
|
+
id: OQ-{n}
|
|
4
|
+
component: '{pc}' # or `_platform`
|
|
5
|
+
blocks: [] # gate, FR, UC, or story ids — empty means it blocks nothing
|
|
6
|
+
owner: '{who can answer}'
|
|
7
|
+
by_when: '{gate or date}'
|
|
8
|
+
status: open # open · answered
|
|
9
|
+
created: '{YYYY-MM-DD}'
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# OQ-{n} — {the question, as one answerable sentence}
|
|
13
|
+
|
|
14
|
+
<!-- TEMPLATE GUIDE — act on these comments, then delete them.
|
|
15
|
+
|
|
16
|
+
Most open questions need only a line in one of the four lists in .control/questions/. This file
|
|
17
|
+
exists for the
|
|
18
|
+
few whose discussion outgrows one line; the list then keeps a one-line pointer here.
|
|
19
|
+
|
|
20
|
+
The title MUST be answerable. "How should referrals work?" is a topic, not a question. -->
|
|
21
|
+
|
|
22
|
+
## Why it is open
|
|
23
|
+
|
|
24
|
+
<!-- What makes this undecidable right now — missing information, a stakeholder who has not
|
|
25
|
+
answered, a dependency that has not landed. -->
|
|
26
|
+
|
|
27
|
+
## What it blocks
|
|
28
|
+
|
|
29
|
+
<!-- Concretely. If it blocks nothing, say so — a question that blocks nothing MAY still be
|
|
30
|
+
registered, but mixing blockers with curiosities makes the list useless exactly when it
|
|
31
|
+
matters. -->
|
|
32
|
+
|
|
33
|
+
## Options considered
|
|
34
|
+
|
|
35
|
+
<!-- Only if any exist. A proposed answer for the owner to confirm is useful; recording it as
|
|
36
|
+
settled is not. -->
|
|
37
|
+
|
|
38
|
+
## Answer
|
|
39
|
+
|
|
40
|
+
<!-- Filled when it closes, WITH the date and who answered. The entry is closed in place and MUST
|
|
41
|
+
NOT be deleted — the record of what was once uncertain is what stops it being reopened in three
|
|
42
|
+
months.
|
|
43
|
+
|
|
44
|
+
If the answer amounts to a decision that is expensive to reverse, closing here is not enough:
|
|
45
|
+
route it to wdi-decision so a DEC- carries what was chosen and what it cost. -->
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
# PRD Template
|
|
2
|
+
|
|
3
|
+
## Essential Spine *(almost always present)*
|
|
4
|
+
|
|
5
|
+
```markdown
|
|
6
|
+
---
|
|
7
|
+
title: {Initiative Name}
|
|
8
|
+
initiative: {slug}
|
|
9
|
+
created: {YYYY-MM-DD}
|
|
10
|
+
updated: {YYYY-MM-DD}
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# PRD: {Initiative Name}
|
|
14
|
+
*Working title — confirm.*
|
|
15
|
+
|
|
16
|
+
## Revision History
|
|
17
|
+
|
|
18
|
+
| Date | What changed | Why | Releases affected |
|
|
19
|
+
|---|---|---|---|
|
|
20
|
+
| {YYYY-MM-DD} | Initial version | — | {target release} |
|
|
21
|
+
|
|
22
|
+
[One row per Update run, newest last. Written for an outside reader — a client or sponsor who was
|
|
23
|
+
not in the room — so state what the promise now is, not which section was edited. This table is not
|
|
24
|
+
the memlog: the memlog records every decision inside a run and is an audit trail; this records what
|
|
25
|
+
changed for the reader. Neither replaces the other.]
|
|
26
|
+
|
|
27
|
+
## 0. Document Purpose
|
|
28
|
+
[1 paragraph: who this PRD is for (PM, stakeholders, downstream workflow owners), how it's structured (Glossary-anchored vocabulary, features grouped with FRs nested, assumptions tagged inline and indexed). If UX work or other inputs already exist, name them here and reference where they live — this PRD builds on them, it does not duplicate.]
|
|
29
|
+
|
|
30
|
+
## 1. Vision
|
|
31
|
+
[2-3 paragraphs: what this is, what it does for the user, why it matters. Compelling enough to stand alone.]
|
|
32
|
+
|
|
33
|
+
## 2. Target User
|
|
34
|
+
|
|
35
|
+
### 2.1 Jobs To Be Done
|
|
36
|
+
[Bulleted. Emotional, social, functional, contextual — whichever apply. Even "this is for me as the builder" is a valid framing for a hobby project.]
|
|
37
|
+
|
|
38
|
+
### 2.2 Non-Users (v1) *(add when the audience boundary is non-obvious)*
|
|
39
|
+
[Who this is explicitly not for in v1.]
|
|
40
|
+
|
|
41
|
+
### 2.3 Key User Journeys
|
|
42
|
+
*Named-persona narratives the product enables. Numbered globally as UJ-1 through UJ-N. FRs reference journeys by ID inline ("realizes UJ-3"); SMs may also cross-reference. If a UX doc already exists, mirror its UJ IDs here and point to the source.*
|
|
43
|
+
|
|
44
|
+
**Default shape:** a named scene with entry state, path, climax, and resolution. Each beat forces specificity the team would otherwise leave implicit — auth assumptions, screen order, what tells the user value landed. Read together as a short narrative; the example below shows the form.
|
|
45
|
+
|
|
46
|
+
- **UJ-1. {One-line title — persona doing the thing.}**
|
|
47
|
+
- **Persona + context:** one line, grounded enough to explain the *why*.
|
|
48
|
+
- **Entry state:** authenticated? which surface? coming from where?
|
|
49
|
+
- **Path:** 3-5 concrete beats — taps, screens, decisions.
|
|
50
|
+
- **Climax:** the moment value is delivered and how the user knows.
|
|
51
|
+
- **Resolution:** state they're left in, what's next.
|
|
52
|
+
- **Edge case** *(optional)*: one real failure mode and what the user does next.
|
|
53
|
+
|
|
54
|
+
*Written out, that becomes:*
|
|
55
|
+
> **UJ-3. Priya checks the trip damage before she's even home.**
|
|
56
|
+
> Priya, budgeting on a single income with a new baby, finishes a grocery run and gets in the car. Already authenticated via biometric on a previous session. She opens the app, taps the FAB camera, and scans the receipt. The app OCRs the total and shows a single-screen overlay: this trip $84.20, weekly cap $250, $172.10 remaining, three days left in the week. She closes the app and drives home. **Edge case:** if she scanned a receipt earlier today, the app asks whether this replaces or adds to that trip before counting it against the cap.
|
|
57
|
+
|
|
58
|
+
- **UJ-2. ...**
|
|
59
|
+
|
|
60
|
+
**Scope dial:**
|
|
61
|
+
- **Lighter** — hobby/solo, library/CLI, or when the UJ is essentially a JTBD restated: a single sentence works (`{Persona}, {context}, {what they do and why}.`).
|
|
62
|
+
- **Heavier** — auth, multi-device handoff, complex navigation, or anything feeding downstream UX/architecture: add a numbered Flow, an Edge cases list, and a capability → FR mapping (`The system must {capability}. → FR-N`).
|
|
63
|
+
|
|
64
|
+
## 3. Glossary
|
|
65
|
+
*Downstream workflows and readers must use these terms exactly. FRs, UJs, and SMs use Glossary terms verbatim; introducing a synonym anywhere in the PRD is a discipline violation. If §4 introduces a new domain noun, add it to the Glossary in the same pass.*
|
|
66
|
+
|
|
67
|
+
- **Term** — Definition. Relationships to other Glossary terms. Cardinality where relevant.
|
|
68
|
+
- **Term** — ...
|
|
69
|
+
|
|
70
|
+
[Every domain noun the rest of the document uses. Defined once. No synonyms anywhere else in the PRD.]
|
|
71
|
+
|
|
72
|
+
## 4. Features
|
|
73
|
+
*Each subsection is a coherent feature: behavioral description first, FRs nested under it, optional feature-specific NFRs and notes. FRs are numbered globally (FR-1 through FR-N) so downstream artifacts have stable references even if features get reorganized. Reference user journeys by ID inline ("realizes UJ-2") where the chain matters.*
|
|
74
|
+
|
|
75
|
+
### 4.1 {Feature Name}
|
|
76
|
+
**Capability:** CAP-N — serves BG-N. *(WDI. One feature is one capability; both IDs come from `requirements.yaml`. This is the link that makes the feature schedulable — size, priority, owner, target release, and dependencies on other capabilities all live on the `CAP` entry, not here.)*
|
|
77
|
+
|
|
78
|
+
**Description:** [Behavioral narrative — how this feature works, who uses it, the user experience, edge cases. Realizes UJ-X, UJ-Y. Use Glossary terms exactly. Embed inline `[ASSUMPTION: ...]` tags where you inferred without confirmation.]
|
|
79
|
+
|
|
80
|
+
**Functional Requirements:**
|
|
81
|
+
|
|
82
|
+
#### FR-1: {Short capability name}
|
|
83
|
+
|
|
84
|
+
[Actor] can [capability] [under conditions]. Realizes UJ-X.
|
|
85
|
+
|
|
86
|
+
**Proof of done:** *(WDI, required)* [One sentence a Product Owner can check without opening the code. Business language, no HTTP codes and no table names. This is the sentence that lets one FR become one testable unit of work — it is not the same as the technical consequences below, and one MUST NOT be written in place of the other.]
|
|
87
|
+
|
|
88
|
+
**Consequences (testable):**
|
|
89
|
+
- {Specific testable condition, e.g. "System returns HTTP 429 when request rate exceeds 100/sec per merchant."}
|
|
90
|
+
- {Another testable condition.}
|
|
91
|
+
|
|
92
|
+
**Out of Scope:** *(optional — what this FR explicitly does NOT cover)*
|
|
93
|
+
- {bound}
|
|
94
|
+
|
|
95
|
+
#### FR-2: ...
|
|
96
|
+
|
|
97
|
+
**Feature-specific NFRs:** *(only if any apply uniquely to this feature)*
|
|
98
|
+
- Performance / security / accessibility / etc. specific to this feature.
|
|
99
|
+
|
|
100
|
+
**Notes:** *(optional — open questions specific to this feature, `[NOTE FOR PM]` callouts)*
|
|
101
|
+
|
|
102
|
+
### 4.2 {Feature Name}
|
|
103
|
+
...
|
|
104
|
+
|
|
105
|
+
## 5. Non-Goals (Explicit)
|
|
106
|
+
[Bulleted. What this product is *not* and what it will *not* do in v1. Does outsized work for downstream readers and workflows — prevents the "let me also add this nearby thing" failure mode at every level (epic, ticket, code). Inline `[NON-GOAL for MVP]` callouts within §4 Features cover deferred items within features; this section captures the broader "we are not building X / we are not becoming Y" statements.]
|
|
107
|
+
|
|
108
|
+
## 6. MVP Scope
|
|
109
|
+
|
|
110
|
+
### 6.1 In Scope
|
|
111
|
+
[Bulleted, crisp.]
|
|
112
|
+
|
|
113
|
+
### 6.2 Out of Scope for MVP
|
|
114
|
+
[Bulleted. Each item with a one-line reason if the reason matters. Mark items deferred to v2/v3 explicitly. Add `[NOTE FOR PM]` callouts where a deferred item is emotionally load-bearing — flags it for revisit if timeline permits.]
|
|
115
|
+
|
|
116
|
+
## 7. Success Metrics
|
|
117
|
+
|
|
118
|
+
*Each SM cross-references the FR(s) it validates. Counter-metrics counterbalance specific primary or secondary metrics.*
|
|
119
|
+
|
|
120
|
+
**Primary**
|
|
121
|
+
- **SM-1**: Metric — definition, target. Validates FR-X, FR-Y.
|
|
122
|
+
|
|
123
|
+
**Secondary**
|
|
124
|
+
- **SM-2**: Metric — definition, target. Validates FR-Z.
|
|
125
|
+
|
|
126
|
+
**Counter-metrics (do not optimize)**
|
|
127
|
+
- **SM-C1**: Metric — why this should *not* be optimized. Counterbalances SM-1.
|
|
128
|
+
|
|
129
|
+
[Length scales with stakes. Hobby/utility PRD: a single sentence may be enough ("Success: I use this weekly and don't abandon it after a month"). Public launch / enterprise: full quantitative breakdown with measurement methods. Counter-metrics are as load-bearing as primary metrics — they prevent the architect from optimizing the wrong thing and the dev from gaming the wrong target.]
|
|
130
|
+
|
|
131
|
+
## 8. Open Questions
|
|
132
|
+
[Numbered. Things still unknown — they become future tickets or follow-up research, not silent gaps.]
|
|
133
|
+
|
|
134
|
+
## 9. Assumptions Index
|
|
135
|
+
*Every `[ASSUMPTION]` from the document, surfaced for explicit confirmation:*
|
|
136
|
+
- Inline assumption from §X.Y — short description.
|
|
137
|
+
- ...
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## Adapt-In Menu *(add the clusters the product calls for)*
|
|
143
|
+
|
|
144
|
+
### Cross-cutting quality and shape *(most non-trivial PRDs)*
|
|
145
|
+
- **Cross-Cutting NFRs** — system-wide non-functional requirements not tied to a single feature (performance, security, reliability, observability). Add when system-wide quality attributes are meaningful.
|
|
146
|
+
- **Constraints and Guardrails** — Safety, Privacy, Cost. Subsection per cluster. Add when any of these are real concerns.
|
|
147
|
+
- **Why Now** — add when timing is load-bearing (a market shift, a technology enabler, a regulatory deadline). Drop when timing is incidental.
|
|
148
|
+
|
|
149
|
+
### Consumer / branded products
|
|
150
|
+
- **Aesthetic and Tone** — visual references, anti-references, voice/tone for any product-generated text.
|
|
151
|
+
- **Information Architecture** — top-level surfaces, navigation, screens.
|
|
152
|
+
- **Monetization** — free vs. paid, pricing assumptions, ads policy.
|
|
153
|
+
- **Platform** — web, mobile, PWA, native, v1 vs. v2+.
|
|
154
|
+
|
|
155
|
+
### Enterprise initiatives
|
|
156
|
+
- **Stakeholders and Approvals** — who must sign off, at what stage.
|
|
157
|
+
- **Risk and Mitigations** — operational, security, business, reputational risk register.
|
|
158
|
+
- **ROI / Business Case** — quantified benefit, cost, payback period.
|
|
159
|
+
- **Operational Requirements** — SLAs, RTO/RPO, support tier, on-call expectations.
|
|
160
|
+
- **Integration and Dependencies** — SSO, existing enterprise systems, data sources, downstream consumers.
|
|
161
|
+
- **Rollout and Change Management** — phased rollout plan, training, internal communication.
|
|
162
|
+
- **Data Governance** — residency, sovereignty, classification, retention.
|
|
163
|
+
- **Audit Trail / Decision Provenance** — formal documentation requirements for regulated environments.
|
|
164
|
+
|
|
165
|
+
### Regulated domains
|
|
166
|
+
- **Compliance and Regulatory** — HIPAA, PCI-DSS, GDPR, SOX, SOC 2, Section 508 / WCAG 2.1 AA, FedRAMP, etc. — whichever apply. If any item needs depth, add a `[NOTE FOR PM]` callout to revisit or move to an addendum.
|
|
167
|
+
|
|
168
|
+
### Developer products (libraries, APIs, CLIs, SDKs)
|
|
169
|
+
- **API Contracts / Public Surface** — endpoint shapes, breaking change policy.
|
|
170
|
+
- **Versioning and Deprecation Policy**.
|
|
171
|
+
- **Performance Budgets** — latency, throughput, resource use.
|
|
172
|
+
- **Language / Runtime Targets and Dependency Policy**.
|
|
173
|
+
|
|
174
|
+
### Embedded / hardware
|
|
175
|
+
- **Hardware Constraints** — memory, power, form factor.
|
|
176
|
+
- **Deployment and Update Mechanism** — OTA, manual, image-based.
|
|
177
|
+
- **Environmental and Reliability Requirements**.
|
|
178
|
+
|
|
179
|
+
### Small-scope all-inclusive *(use when scope is 1-2 stories' worth and the user wants a single captured artifact — chosen during the Right-skill check in Discovery)*
|
|
180
|
+
- **Stories** — story-level specs listed inline at the end of the doc. Each story: *"As a [persona], I can [action] [under conditions]. Acceptance: [testable criteria]."* Numbered Story-1, Story-2, ... for reference. Pair with very lean §1 Vision, §2 Target User (often just JTBD + one UJ), §3 Glossary (handful of terms), §4 Features (often a single feature), §6 MVP Scope (in/out very tight). The whole doc fits on a page or two and captures intent + implementable stories in one place. If the user doesn't want the captured artifact at all, `bmad-build` is the better path — this cluster is only for "I want a doc *and* the stories."
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## Project overrides — WDI
|
|
186
|
+
|
|
187
|
+
These rules replace the corresponding BMad defaults for this project. They are additive to the
|
|
188
|
+
shape above; nothing in the shape is removed.
|
|
189
|
+
|
|
190
|
+
- **Scope.** One PRD per **initiative / functional area** — not per product, not per component, and
|
|
191
|
+
not per release. It is a **living document** and is never frozen.
|
|
192
|
+
- **Change.** A behaviour change, a correction, or a new feature closely tied to what is already
|
|
193
|
+
here MUST land through `bmad-prd` intent *Update* on this same file. A second PRD MUST NOT be
|
|
194
|
+
created because the release changed; create one only when the functional area is genuinely
|
|
195
|
+
different and would not read well merged in.
|
|
196
|
+
- **Revision History.** Every Update run MUST add exactly one row, written for an outside reader.
|
|
197
|
+
It is what preserves "what did we promise back then" now that the document is not frozen.
|
|
198
|
+
- **Release.** Carried by `CAP.target_release` in `.control/registry/requirements.yaml` — the only
|
|
199
|
+
place a promise's release is written — and by `release` in `waves.yaml` for the execution side. It
|
|
200
|
+
MUST NOT be expressed through this document's folder name or title, and an `FR` MUST NOT carry a
|
|
201
|
+
release of its own; it inherits one from its capability. Naming a release in prose as context MAY
|
|
202
|
+
happen; the registry is what binds.
|
|
203
|
+
- **Numbering.** `FR-N`, `NFR-N`, `UJ-N`, and `CAP-N` MUST be allocated from
|
|
204
|
+
`.control/registry/requirements.yaml`. They MUST NOT restart at 1 in a new PRD — the sequence is
|
|
205
|
+
global to the product, and a later PRD continues the earlier one.
|
|
206
|
+
- **Two Adapt-In clusters are not optional here.** `Cross-Cutting NFRs` and `Constraints and
|
|
207
|
+
Guardrails` MUST be present. G2 passes on numbered FR **and NFR**, so a PRD with no NFR section
|
|
208
|
+
cannot clear it; and a constraint discovered at G4 costs a decision that a sentence here would
|
|
209
|
+
have prevented. Every other Adapt-In cluster stays conditional as BMad intends.
|
|
210
|
+
- **Constraints state the delta.** Product-wide constraints already live in
|
|
211
|
+
`.what/_product-brief/brief.md`. This section MUST carry only what binds *this initiative* beyond
|
|
212
|
+
them, and MUST say "none beyond the brief" when there is nothing — an absent section reads as
|
|
213
|
+
"not checked".
|
|
214
|
+
- **Prerequisites are not written here.** An initiative that cannot start until another one ships is
|
|
215
|
+
a `depends_on` between `CAP` entries in `requirements.yaml`. Restating it in prose creates a
|
|
216
|
+
second home that will drift.
|
|
217
|
+
- **§2 MUST name which stakeholders from the brief this initiative serves**, using the same role
|
|
218
|
+
names. A PRD that invents its own user labels breaks the trace back to `BG-N`.
|
|
219
|
+
- **Vocabulary.** Every domain noun MUST already exist in `.control/product-glossary.md`, used verbatim. A
|
|
220
|
+
new noun introduced here MUST be added to the Glossary in the same pass, not defined inline.
|
|
221
|
+
- **Boundary.** This document promises; it MUST NOT design. Behaviour of the system belongs to
|
|
222
|
+
`SRS-<pc>.md`, and solution shape to `SDD-<pc>.md`.
|
|
223
|
+
- **Assumptions.** Every `[ASSUMPTION]` left unresolved at Finalize MUST be registered through
|
|
224
|
+
`wdi-question` before this PRD passes G2.
|
|
225
|
+
- **Memlog.** Written to `.control/memlog/prd-<slug>.md` via `--path`, never beside this file. The
|
|
226
|
+
slug matches this PRD's folder.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: questions
|
|
3
|
+
list: blocking # blocking · assumptions · external · answered
|
|
4
|
+
status: draft # draft · reviewed · locked · superseded
|
|
5
|
+
created: '{YYYY-MM-DD}'
|
|
6
|
+
updated: '{YYYY-MM-DD}'
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# {Pertanyaan yang Memblokir | Asumsi | Menunggu Pihak Luar | Terjawab}
|
|
10
|
+
|
|
11
|
+
<!-- TEMPLATE GUIDE — act on these comments, then delete them.
|
|
12
|
+
|
|
13
|
+
ONE template, four lists, all in .control/questions/. `list:` decides which row shape below
|
|
14
|
+
survives; delete the other three.
|
|
15
|
+
|
|
16
|
+
THE SPLIT IS BY WHAT THE READER HAS TO DO — not by subject and not by severity. That is the whole
|
|
17
|
+
design, and it is what the single old list could not express: it reached OQ-146 and the majority
|
|
18
|
+
of its weight was answered entries.
|
|
19
|
+
|
|
20
|
+
blocking holds a gate. Read at every gate. Target <=3 per Product Component
|
|
21
|
+
assumptions the DEFAULT class. Swept once per gate; MAY be skipped. Holds nothing
|
|
22
|
+
external waiting on a file, an action, or a credential from outside. Holds GO-LIVE ONLY,
|
|
23
|
+
never a design gate. Owner and `Sebelum` required on every row
|
|
24
|
+
answered archive. Closed in place, never deleted
|
|
25
|
+
|
|
26
|
+
WHY oq.md IS NOT THIS: oq.md is the shape of ONE question whose discussion outgrew a line, and it
|
|
27
|
+
lives beside these four as OQ-NNN-<slug>.md with a one-line pointer from the list. This is the
|
|
28
|
+
shape of the four LISTS.
|
|
29
|
+
|
|
30
|
+
A ROW MOVES BETWEEN FILES WHEN ITS CLASS CHANGES, and it MUST NOT be copied into a second one.
|
|
31
|
+
|
|
32
|
+
Ids stay OQ-, allocated from the highest ever used including closed ones. An id MUST NOT be
|
|
33
|
+
reused. The literal values inside the tables stay Bahasa Indonesia — [BELUM DITETAPKAN] and the
|
|
34
|
+
rest — wherever they appear, including inside an English template. -->
|
|
35
|
+
|
|
36
|
+
## The class test
|
|
37
|
+
|
|
38
|
+
<!-- Keep this block in blocking.md and assumptions.md; delete it from the other two.
|
|
39
|
+
|
|
40
|
+
A question is filed in `assumptions` unless it passes one of three tests. One is enough:
|
|
41
|
+
|
|
42
|
+
1. It touches money, personal data, or a legal obligation.
|
|
43
|
+
2. It changes the wording of an FR's promise.
|
|
44
|
+
3. Answering it wrong forces a rewrite of more than one Product Component.
|
|
45
|
+
|
|
46
|
+
Failing all three, the agent takes the answer itself and records it as one line.
|
|
47
|
+
|
|
48
|
+
A question MUST NOT be filed as blocking "to be safe". That habit is what produced 146 ids. -->
|
|
49
|
+
|
|
50
|
+
## Terbuka
|
|
51
|
+
|
|
52
|
+
<!-- list: blocking · external -->
|
|
53
|
+
|
|
54
|
+
| id | Pertanyaan | Memblokir | Owner | Sebelum |
|
|
55
|
+
|---|---|---|---|---|
|
|
56
|
+
|
|
57
|
+
<!-- list: assumptions — keep this shape instead
|
|
58
|
+
| id | Asumsi | Akibat kalau salah | Diambil | Oleh |
|
|
59
|
+
|---|---|---|---|---|
|
|
60
|
+
-->
|
|
61
|
+
|
|
62
|
+
<!-- An empty list is a legitimate state and MUST be written as one, with the date and one line
|
|
63
|
+
saying why. An empty table with no sentence reads as an unfinished file. -->
|
|
64
|
+
|
|
65
|
+
## Terjawab
|
|
66
|
+
|
|
67
|
+
<!-- list: answered only.
|
|
68
|
+
|
|
69
|
+
| id | Pertanyaan | Jawaban | Tanggal | Oleh |
|
|
70
|
+
|
|
71
|
+
The answer is written beside the question, not in place of it. The record of what was once
|
|
72
|
+
uncertain is what stops the same question being asked again in three months.
|
|
73
|
+
|
|
74
|
+
An answer amounting to a decision that is expensive to reverse MUST also go to wdi-decision. This
|
|
75
|
+
list records that an answer arrived; a DEC- records what was chosen and what it cost. -->
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: rtr
|
|
3
|
+
id: RTR-{wave}
|
|
4
|
+
wave: '{W<N>}'
|
|
5
|
+
size: L # the wave size that made this required
|
|
6
|
+
status: draft # draft · reviewed · locked · superseded
|
|
7
|
+
created: '{YYYY-MM-DD}'
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# RTR-{wave} — Retrospective, wave {W<N>}
|
|
11
|
+
|
|
12
|
+
<!-- TEMPLATE GUIDE — act on these comments, then delete them.
|
|
13
|
+
|
|
14
|
+
Home: .control/reports/RTR-<wave>.md, landed by wdi-build at wave close. Its old home
|
|
15
|
+
.control/supplements/ is gone.
|
|
16
|
+
|
|
17
|
+
REQUIRED on wave `L`. Advisory on `S` and `M`, and skipping it MUST be stated rather than left
|
|
18
|
+
silent — V19 is advisory for exactly that reason. It is tied to wave SIZE, never to `mode`: depth
|
|
19
|
+
of documents and volume of work are different things.
|
|
20
|
+
|
|
21
|
+
THE SPEC FOLDER IS EPHEMERAL AND THIS IS NOT. bmad-retrospective writes RETROSPECTIVE.md inside
|
|
22
|
+
the run folder; this is the archived form, and it is the only part that survives the wave.
|
|
23
|
+
|
|
24
|
+
WRITE WHAT WAS LEARNED, NOT WHAT HAPPENED. A wave-by-wave narrative is recoverable from git; what
|
|
25
|
+
is not recoverable is what somebody now knows and would otherwise forget. Every section below is
|
|
26
|
+
one question, and a section with nothing under it MUST be cut. -->
|
|
27
|
+
|
|
28
|
+
## What this wave shipped
|
|
29
|
+
|
|
30
|
+
<!-- One line. Which FR, and whether the RTM rows for them are green. Not a story list. -->
|
|
31
|
+
|
|
32
|
+
## What took longer than expected, and why
|
|
33
|
+
|
|
34
|
+
<!-- G5's question 5. One cause, named concretely. "Underestimated" is not a cause. -->
|
|
35
|
+
|
|
36
|
+
## What the corpus got wrong
|
|
37
|
+
|
|
38
|
+
<!-- The section this method exists to feed. Every defect whose root_cause was `requirement` or
|
|
39
|
+
`architecture` rather than code, by BUG- id — and what in .what/ or .how/ was wrong.
|
|
40
|
+
|
|
41
|
+
This ratio is a fact about the METHOD, not about the team, and it is the only place it is
|
|
42
|
+
recorded per wave. -->
|
|
43
|
+
|
|
44
|
+
| BUG- | Root cause | What was wrong upstream | Fixed where |
|
|
45
|
+
| --- | --- | --- | --- |
|
|
46
|
+
|
|
47
|
+
## What we would do differently
|
|
48
|
+
|
|
49
|
+
<!-- Only items with an owner and a next action. An observation nobody owns is not a finding; it is a
|
|
50
|
+
feeling, and it MUST be cut rather than carried forward into the next wave's reading. -->
|
|
51
|
+
|
|
52
|
+
| Change | Owner | Where it lands |
|
|
53
|
+
| --- | --- | --- |
|
|
54
|
+
|
|
55
|
+
<!-- `Where it lands` MUST name a file or a skill. A retrospective item that lands nowhere is why
|
|
56
|
+
retrospectives get a reputation for being theatre — and it is what makes the next one skippable. -->
|
|
57
|
+
|
|
58
|
+
## What is deliberately carried forward
|
|
59
|
+
|
|
60
|
+
<!-- Follow-ups accepted rather than fixed, each pointing at its OQ- or DEC-. Anything here that has
|
|
61
|
+
no id is being lost right now. -->
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: rules
|
|
3
|
+
scope: global # global · component — decides the home and the id prefix
|
|
4
|
+
component: '{pc}' # omit entirely when scope: global
|
|
5
|
+
status: draft # draft · reviewed · locked · superseded
|
|
6
|
+
created: '{YYYY-MM-DD}'
|
|
7
|
+
updated: '{YYYY-MM-DD}'
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Business Rules — {the product | Product Component}
|
|
11
|
+
|
|
12
|
+
<!-- TEMPLATE GUIDE — act on these comments, then delete them.
|
|
13
|
+
|
|
14
|
+
ONE template, two scopes, and the scope decides everything about where this file lives:
|
|
15
|
+
|
|
16
|
+
scope: global -> .what/business-rules.md born at G3, by wdi-blueprint
|
|
17
|
+
scope: component -> .what/<pc>/02-rules/rules-<pc>.md born at G4, from mode: outline up
|
|
18
|
+
|
|
19
|
+
THE TEST IS REACH, NOT IMPORTANCE. A rule binding more than one Product Component is global; a
|
|
20
|
+
rule binding only one is that component's. A rule written locally that turns out to bind a
|
|
21
|
+
second component MUST be PROMOTED to the global file, never copied. Two copies of one rule is
|
|
22
|
+
how components start disagreeing about the same policy.
|
|
23
|
+
|
|
24
|
+
A rule MUST be checkable. If a reviewer cannot tell whether the behaviour obeys it, it is not a
|
|
25
|
+
rule yet — it is an intention, and it belongs in the SRS prose.
|
|
26
|
+
|
|
27
|
+
A rule MUST NOT state a mechanism. "The turn is not consumed until commitment" is a rule; "a
|
|
28
|
+
row is written to the queue table" is a mechanism and belongs to .how/.
|
|
29
|
+
|
|
30
|
+
Ids are allocated GLOBALLY and never restart. A retired rule keeps its id and is marked retired
|
|
31
|
+
with what replaced it — never deleted, because documents still cite it. -->
|
|
32
|
+
|
|
33
|
+
## Rules
|
|
34
|
+
|
|
35
|
+
| id | Rule | Binds | Source | Status |
|
|
36
|
+
| --- | --- | --- | --- | --- |
|
|
37
|
+
| BR-{n} | {one checkable sentence, present tense} | {which components, or `all`} | {FR-n · DEC-n · UC-n · a person and a date} | active |
|
|
38
|
+
|
|
39
|
+
<!-- `Source` MUST name where the rule came from. A rule with no source is an assumption in
|
|
40
|
+
disguise, and it goes through wdi-question instead.
|
|
41
|
+
|
|
42
|
+
`Status`: active · retired. A retired row states what replaced it in the Rule column. -->
|
|
43
|
+
|
|
44
|
+
## Retired
|
|
45
|
+
|
|
46
|
+
<!-- Rows moved here keep their ids. Each MUST name what replaced it and the date it stopped
|
|
47
|
+
holding. This section MAY be absent until the first rule retires. -->
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: scn
|
|
3
|
+
id: SCN-{NN}
|
|
4
|
+
component: '{pc}'
|
|
5
|
+
attaches_to: UC-{NN} # exactly one UC — a scenario that fits two is two scenarios
|
|
6
|
+
created: '{YYYY-MM-DD}'
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# SCN-{NN} — {what this branch is}
|
|
10
|
+
|
|
11
|
+
<!-- TEMPLATE GUIDE — act on these comments, then delete them.
|
|
12
|
+
|
|
13
|
+
A scenario exists so a Use Case does not get fat. It is a long branch lifted out of one UC, and
|
|
14
|
+
it MUST attach to exactly one. If it seems to belong to two, the UC boundary is wrong — fix that
|
|
15
|
+
instead of duplicating the scenario.
|
|
16
|
+
|
|
17
|
+
WRITTEN AT `mode: deep` ONLY. Below deep, a branch that will not fit stays inside its UC file or
|
|
18
|
+
is not written; a scenario file MUST NOT be created to fill the slot. -->
|
|
19
|
+
|
|
20
|
+
## Where it branches
|
|
21
|
+
|
|
22
|
+
<!-- The UC and the numbered step this leaves from. -->
|
|
23
|
+
|
|
24
|
+
## Condition
|
|
25
|
+
|
|
26
|
+
<!-- What makes this branch taken rather than the main flow. -->
|
|
27
|
+
|
|
28
|
+
## Flow
|
|
29
|
+
|
|
30
|
+
<!-- Numbered, same discipline as the UC: behaviour only, no design shape. -->
|
|
31
|
+
|
|
32
|
+
1.
|
|
33
|
+
|
|
34
|
+
## Outcome
|
|
35
|
+
|
|
36
|
+
<!-- Where the user and the system end up, and whether they can rejoin the main flow. -->
|
|
37
|
+
|
|
38
|
+
## Why it is not in the UC
|
|
39
|
+
|
|
40
|
+
<!-- One line. If the honest answer is "it just felt long", it probably belongs back in the UC. -->
|