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
|
@@ -24,7 +24,8 @@ You MUST NOT write or edit `prd.md` yourself. If a check fails, name what is mis
|
|
|
24
24
|
|---|---|
|
|
25
25
|
| `.what/_product-brief/brief.md` | The problem, the primary user, the boundary the PRD MUST respect |
|
|
26
26
|
| `.what/_prd/*/prd.md` | Which initiatives already have a PRD, and what each already promises |
|
|
27
|
-
| `.control/registry/
|
|
27
|
+
| `.control/registry/goals.yaml` | The `BG` this initiative serves |
|
|
28
|
+
| `.control/registry/requirements-*.yaml` | Every initiative's `FR`/`NFR`/`UJ`, so the next id continues the product's sequence |
|
|
28
29
|
| `.control/decisions/` | `applied` decisions the PRD MUST already reflect |
|
|
29
30
|
| `.constitution/method/document/prd-guide.md` | The rules the result is checked against |
|
|
30
31
|
| `.control/product-glossary.md` | Terms already fixed |
|
|
@@ -67,33 +68,44 @@ they arrive through `persistent_facts` and `doc_standards` in `_bmad/custom/bmad
|
|
|
67
68
|
Name the brief and, for `update`, the existing PRD and every `applied` decision that reaches it. The skill
|
|
68
69
|
globs its own default locations, which this project redirects.
|
|
69
70
|
|
|
70
|
-
## Step 4 —
|
|
71
|
+
## Step 4 — Land the requirements
|
|
72
|
+
|
|
73
|
+
Each feature's **Realizes:** line cites `FR-N`/`NFR-N` ids. The template gives the statement, the proof
|
|
74
|
+
of done, and the enforcer no home inside `prd.md` any more — write them straight into
|
|
75
|
+
`.control/registry/requirements-<slug>.yaml` — the slug being this PRD's own folder name — on the id's own row, as part of producing this PRD. The `CAP` row goes in the same file: one feature is one capability, and a feature lives in exactly one PRD. This is
|
|
76
|
+
landing, not editing `prd.md`: the same duty `wdi-problem` Step 4 carries for `BG-N`.
|
|
77
|
+
|
|
78
|
+
An `update` run that adds or changes a promise lands the same way — the registry row changes, the PRD
|
|
79
|
+
keeps citing the id, and Revision History (Step 6 below) records what changed for a reader.
|
|
80
|
+
|
|
81
|
+
## Step 5 — Verify
|
|
71
82
|
|
|
72
83
|
| # | Check | Fails when |
|
|
73
84
|
|---|---|---|
|
|
74
85
|
| 1 | Home | Anything outside `.what/_prd/<initiative>/`, or a folder still named `ISI-slug-inisiatif` |
|
|
75
86
|
| 2 | Ids allocated from the registry | `FR-1` restarted, or an id invented in prose |
|
|
76
|
-
| 3 | Every `FR` names its `capability`; every `NFR` names its `goal` |
|
|
77
|
-
| 4 | Every `FR`
|
|
78
|
-
| 5 |
|
|
79
|
-
| 6 |
|
|
80
|
-
| 7 |
|
|
81
|
-
| 8 |
|
|
82
|
-
| 9 |
|
|
83
|
-
| 10 |
|
|
87
|
+
| 3 | Every `FR` names its `capability`; every `NFR` names its `goal` | `chain-links` has nothing to check |
|
|
88
|
+
| 4 | Every `FR`'s statement and proof of done, every `NFR`'s statement and `enforced_by`, live only in `requirements-<slug>.yaml` | Full prose written in `prd.md` instead of, or as well as, the registry row from Step 4 |
|
|
89
|
+
| 5 | Cross-Cutting NFRs (§6) and Constraints and Guardrails (§7) both present | An absent section reads as "not checked" |
|
|
90
|
+
| 6 | No solution shape | A framework, a table, or a transport named in `prd.md` rather than in `addendum.md` |
|
|
91
|
+
| 7 | §1 Why This Initiative states a delta against the brief's `Why`, not a restatement of it | The product's own vision written out again on the first PRD |
|
|
92
|
+
| 8 | No Document Purpose, Glossary, Non-Goals, Open Questions, or Assumptions Index section | Any of the five appeared instead of being routed to its real home — see `prd-guide.md` |
|
|
93
|
+
| 9 | One Revision History row for this run, written for someone not in the room | Zero rows, several rows, or a row that says "Updated §4.2" |
|
|
94
|
+
| 10 | Memlog at `.control/memlog/prd-<slug>.md`, slug matching the folder | A `.memlog.md` appeared inside `.what/` — `--workspace` was used |
|
|
95
|
+
| 11 | `bmad-review` ran through `doc_standards` on `prd.md` and `addendum.md` | It did not fire |
|
|
84
96
|
|
|
85
|
-
Check
|
|
97
|
+
Check 10 MUST be fixed immediately rather than reported. `memlog-home` rejects a memlog inside the corpus.
|
|
86
98
|
|
|
87
|
-
## Step
|
|
99
|
+
## Step 6 — `owns:`, and the collision it prevents
|
|
88
100
|
|
|
89
101
|
A new or changed `FR` that claims write authority over a domain entity MUST be checked against `owns:` in
|
|
90
102
|
`components.yaml`. An entity has exactly one owning Product Component; an `FR` from another PRD that needs to
|
|
91
|
-
change it MUST point at the owner's `FR` rather than promising to write it itself.
|
|
103
|
+
change it MUST point at the owner's `FR` rather than promising to write it itself. `entity-one-writer` checks this, and the
|
|
92
104
|
collision has already happened once for real.
|
|
93
105
|
|
|
94
106
|
Report a collision. You MUST NOT resolve it by widening one PRD's claim.
|
|
95
107
|
|
|
96
|
-
## Step
|
|
108
|
+
## Step 7 — Impact
|
|
97
109
|
|
|
98
110
|
A changed promise changes what other documents can still claim. Check, and **report** — never edit.
|
|
99
111
|
|
|
@@ -111,7 +123,7 @@ NOT reopen one yourself.
|
|
|
111
123
|
|
|
112
124
|
- You MUST NOT write a second PRD for an area that already has one. The reader test decides, and its answer
|
|
113
125
|
is `update` far more often than it feels.
|
|
114
|
-
- You MUST NOT open G2 on a PRD that has not been through check
|
|
126
|
+
- You MUST NOT open G2 on a PRD that has not been through check 11. Gate time is for deciding, not
|
|
115
127
|
proofreading.
|
|
116
128
|
- The gate reads `prd.md` and `EXPERIENCE.md` together. A PRD that passes while the experience side is
|
|
117
129
|
missing has answered half of what G2 decides.
|
|
@@ -123,5 +135,6 @@ NOT reopen one yourself.
|
|
|
123
135
|
|
|
124
136
|
## Output
|
|
125
137
|
|
|
126
|
-
Intent dispatched · what the promise now is in one line · the
|
|
127
|
-
the `owns:` check · impact found and where it was routed · the gates
|
|
138
|
+
Intent dispatched · what the promise now is in one line · the requirements landed in Step 4 · the result of
|
|
139
|
+
all eleven checks naming the failures · the `owns:` check · impact found and where it was routed · the gates
|
|
140
|
+
the matrix names · open questions filed.
|
|
@@ -1,88 +1,170 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: wdi-question
|
|
3
|
-
description: Use when something cannot be decided now and must not be silently assumed. Files it into one of four lists in .control/questions/ by what the reader has to do about it, and closes it in place when the answer arrives.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# WDI Question
|
|
7
|
-
|
|
8
|
-
Free of stage and free of role. The purpose is narrow: make sure an unresolved thing is written down
|
|
9
|
-
where it will be seen, instead of becoming an assumption nobody remembers making.
|
|
10
|
-
|
|
11
|
-
The old single list reached `OQ-146` and stopped being readable. It is now four files in
|
|
12
|
-
`.control/questions/`, split by **what the reader has to do about it** — not by subject, and not by
|
|
13
|
-
severity.
|
|
14
|
-
|
|
15
|
-
| File | Holds | Read when |
|
|
16
|
-
|---|---|---|
|
|
17
|
-
| `blocking.md` | Holds a gate. Target ≤3 per Product Component | Every gate |
|
|
18
|
-
| `assumptions.md` | An assumption the agent took itself. One line: the assumption plus the cost of being wrong | Swept once per gate; MAY be skipped |
|
|
19
|
-
| `external.md` | Waiting on a file, an action, or a credential from outside. Owner and `by_when` required | Before go-live — **not** at a design gate |
|
|
20
|
-
| `answered.md` | Archive. Closed in place, never deleted | Almost never; only to stop a question being reopened |
|
|
21
|
-
|
|
22
|
-
**Only `blocking.md` holds a gate.** `external.md` holds go-live; `assumptions.md` holds nothing.
|
|
23
|
-
|
|
24
|
-
## The default class is `assumptions.md`
|
|
25
|
-
|
|
26
|
-
A question is filed there unless it passes one of three tests. One is enough:
|
|
27
|
-
|
|
28
|
-
1. It touches money, personal data, or a legal obligation.
|
|
29
|
-
2. It changes the wording of an `FR`'s promise.
|
|
30
|
-
3. Answering it wrong forces a rewrite of more than one Product Component.
|
|
31
|
-
|
|
32
|
-
Failing all three, you
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
1
|
+
---
|
|
2
|
+
name: wdi-question
|
|
3
|
+
description: Use when something cannot be decided now and must not be silently assumed. Files it into one of four lists in .control/questions/ by what the reader has to do about it, and closes it in place when the answer arrives.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# WDI Question
|
|
7
|
+
|
|
8
|
+
Free of stage and free of role. The purpose is narrow: make sure an unresolved thing is written down
|
|
9
|
+
where it will be seen, instead of becoming an assumption nobody remembers making.
|
|
10
|
+
|
|
11
|
+
The old single list reached `OQ-146` and stopped being readable. It is now four files in
|
|
12
|
+
`.control/questions/`, split by **what the reader has to do about it** — not by subject, and not by
|
|
13
|
+
severity.
|
|
14
|
+
|
|
15
|
+
| File | Holds | Read when |
|
|
16
|
+
|---|---|---|
|
|
17
|
+
| `blocking.md` | Holds a gate. Target ≤3 per Product Component | Every gate |
|
|
18
|
+
| `assumptions.md` | An assumption the agent took itself. One line: the assumption plus the cost of being wrong | Swept once per gate; MAY be skipped |
|
|
19
|
+
| `external.md` | Waiting on a file, an action, or a credential from outside. Owner and `by_when` required | Before go-live — **not** at a design gate |
|
|
20
|
+
| `answered.md` | Archive. Closed in place, never deleted | Almost never; only to stop a question being reopened |
|
|
21
|
+
|
|
22
|
+
**Only `blocking.md` holds a gate.** `external.md` holds go-live; `assumptions.md` holds nothing.
|
|
23
|
+
|
|
24
|
+
## The default class is `assumptions.md`
|
|
25
|
+
|
|
26
|
+
A question is filed there unless it passes one of three tests. One is enough:
|
|
27
|
+
|
|
28
|
+
1. It touches money, personal data, or a legal obligation.
|
|
29
|
+
2. It changes the wording of an `FR`'s promise.
|
|
30
|
+
3. Answering it wrong forces a rewrite of more than one Product Component.
|
|
31
|
+
|
|
32
|
+
Failing all three, you take the answer yourself — and then one more test decides whether it is
|
|
33
|
+
recorded at all.
|
|
34
|
+
|
|
35
|
+
## The recording threshold — most assumptions MUST NOT be written down
|
|
36
|
+
|
|
37
|
+
**Two filters, and a line has to pass both.**
|
|
38
|
+
|
|
39
|
+
**First: it is about the PRODUCT, not about the corpus.** An open question names something undecided
|
|
40
|
+
about what is being built — a behaviour, a boundary, a promise, a limit. *"Does the SRS contradict the
|
|
41
|
+
SDD"* is not an open question; it is an **edit**, and it goes to whichever skill owns the file. A
|
|
42
|
+
question about which document says what has never once changed what gets built, and it is the single
|
|
43
|
+
easiest way to fill this list with rows nobody can act on.
|
|
44
|
+
|
|
45
|
+
**Second: an assumption whose reversal costs less than the conversation about it MUST NOT be recorded.
|
|
46
|
+
The shipping default IS the record.**
|
|
47
|
+
|
|
48
|
+
The test is the `Cost if wrong` column that already exists. If the honest answer is *one setting
|
|
49
|
+
changes* · *one default changes* · *a shortcut is added later* — with no rework, no migration, and
|
|
50
|
+
nothing already built on it — then there is nothing to decide and nothing to remember. The code says
|
|
51
|
+
what was chosen, and it says it more reliably than a line in a list.
|
|
52
|
+
|
|
53
|
+
This is not a licence to assume quietly. It is the opposite: it protects the list. One real corpus
|
|
54
|
+
carried twenty-five open lines, and **six** of them were this class — a default image dimension, how many
|
|
55
|
+
quality presets to offer, whether one working folder at a time is enough. Every one had a default already
|
|
56
|
+
running and a one-value reversal. Sitting in the same list as six real decisions, they made a
|
|
57
|
+
six-item list look like twenty-five items of homework, and the owner stopped reading it.
|
|
58
|
+
|
|
59
|
+
**The threshold does NOT apply**, and the line is recorded, when being wrong touches money, personal
|
|
60
|
+
data, an irreversible action, a third-party contract, or the wording of an `FR`'s promise. Those are
|
|
61
|
+
the three tests above, and they always win.
|
|
62
|
+
|
|
63
|
+
**You MUST NOT register a question as blocking "to be safe."** That habit is what produced 146 ids and
|
|
64
|
+
a list nobody read, and the cost is paid at every gate afterwards.
|
|
65
|
+
|
|
66
|
+
## One batch, per gate, already ranked
|
|
67
|
+
|
|
68
|
+
Inside a single working pass you do **not** ask. You collect. The batch is delivered once, at the gate,
|
|
69
|
+
ranked, and it MUST NOT be dribbled out as each question surfaces.
|
|
70
|
+
|
|
71
|
+
A healthy batch on `mode: catalog`: **≤3 blocking questions, plus ≤15 one-line assumptions.** A batch
|
|
72
|
+
larger than that is a signal about the pass, not about the corpus — say so rather than delivering it
|
|
73
|
+
as a list.
|
|
74
|
+
|
|
75
|
+
When N agents ran in parallel, their questions arrive as **one** ranked batch, never as N reports.
|
|
76
|
+
|
|
77
|
+
## Every row says whose it is, and whether it can be answered at all
|
|
78
|
+
|
|
79
|
+
The four files split by **what the reader has to do**. That was not enough: a file can still hold
|
|
80
|
+
lines nobody may answer yet beside lines the owner owes today, and then the owner opens it and sees
|
|
81
|
+
one flat pile. In the corpus above, of twenty-five open lines exactly **six** were the owner's and
|
|
82
|
+
answerable — the other nineteen were frozen, waiting on a measurement, external, or fossil.
|
|
83
|
+
|
|
84
|
+
So every row carries **`Whose`**, and the vocabulary is closed:
|
|
85
|
+
|
|
86
|
+
| `Whose` | Means | Who acts |
|
|
87
|
+
|---|---|---|
|
|
88
|
+
| `owner` | A judgement only the owner can make, and it can be made now | the owner |
|
|
89
|
+
| `run: <what>` | The answer comes from running or measuring something, not from an opinion | **you**, not the owner |
|
|
90
|
+
| `frozen: DEC-NNN` | An applied decision forbids answering it yet | nobody, until that `DEC-` lifts |
|
|
91
|
+
|
|
92
|
+
`run:` MUST name what has to be run. "Needs testing" is not a value; `run: capture 5-finding review,
|
|
93
|
+
measure handoff time` is. A row that cannot name it is not waiting on a measurement — it is an
|
|
94
|
+
`owner` row in disguise.
|
|
95
|
+
|
|
96
|
+
`frozen:` MUST name a `DEC-` that is `applied` and that actually forbids the work. A freeze covers
|
|
97
|
+
**planning as well as building**: where a decision bans new `FR`, new use cases, and a UX pass in a
|
|
98
|
+
component, answering a design question there is exactly what it bans. When that `DEC-` lifts or is
|
|
99
|
+
superseded, its frozen rows become `owner` rows automatically — no re-triage.
|
|
100
|
+
|
|
101
|
+
A row whose `Whose` is wrong is worse than a missing row, because it puts work in the wrong person's
|
|
102
|
+
lap and it is invisible.
|
|
103
|
+
|
|
104
|
+
## Registering
|
|
105
|
+
|
|
106
|
+
| Field | Rule |
|
|
107
|
+
|---|---|
|
|
108
|
+
| Question | One sentence, answerable. "How should referrals work?" is a topic, not a question |
|
|
109
|
+
| Blocks | What cannot proceed — a gate, an `FR`, a ticket, or nothing |
|
|
110
|
+
| Whose | `owner` · `run: <what>` · `frozen: DEC-NNN`. See above |
|
|
111
|
+
| Owner | Who can answer. A question with no owner is a wish |
|
|
112
|
+
| By when | The moment it must be answered, usually a gate |
|
|
113
|
+
|
|
114
|
+
Ids stay `OQ-`, allocated from the highest ever used including closed ones. An id MUST NOT be reused.
|
|
115
|
+
|
|
116
|
+
A question whose discussion outgrows one line gets `.control/questions/OQ-NNN-<slug>.md` in the same
|
|
117
|
+
folder, from `templates/oq.md`, and the list keeps a one-line pointer. The old home
|
|
118
|
+
`.control/supplements/` is gone.
|
|
119
|
+
|
|
120
|
+
## Closing
|
|
121
|
+
|
|
122
|
+
An answered question is closed **in place** — the answer written beside it with the date and who
|
|
123
|
+
answered — then moved to `answered.md`. You MUST NOT delete the entry.
|
|
124
|
+
|
|
125
|
+
**A fossil is closed, not answered, and you MUST look for fossils first.** A row questioning a rule, a
|
|
126
|
+
layer, or a validator that has since been repealed cannot bite again: it closes with the repeal as its
|
|
127
|
+
answer and MUST NOT be put to the owner as a decision. These are free, and a long list usually holds
|
|
128
|
+
several — one real corpus was still carrying a question about `parallel-tickets-blocked`'s shape after the layer `parallel-tickets-blocked` runs
|
|
129
|
+
on had been retired.
|
|
130
|
+
|
|
131
|
+
**An answer goes into the document it belongs to, and that is usually the end of it.** An `FR` in the
|
|
132
|
+
PRD, a rule in `business-rules.md`, a line in the brief — written there, closed here, done. The closure
|
|
133
|
+
routes to `wdi-decision` **only** when the answer has no home in any design document, or contradicts an
|
|
134
|
+
`AD-N`. `decision-guide.md` § A decision's first home owns that split, and a `DEC-` is never permission
|
|
135
|
+
to edit a document.
|
|
136
|
+
|
|
137
|
+
This matters most at G1 and G2, where almost nothing is homeless yet: an answer about a brief belongs in
|
|
138
|
+
the brief.
|
|
139
|
+
|
|
140
|
+
## Rules
|
|
141
|
+
|
|
142
|
+
- You MUST NOT answer the question yourself when the owner is the client or a stakeholder. Drafting a
|
|
143
|
+
proposed answer for them to confirm is useful; recording it as settled is not.
|
|
144
|
+
- An `[ASSUMPTION]` tag left in a PRD, an SRS, or an SDD MUST be filed here before that document
|
|
145
|
+
passes its gate. That is precisely the failure this skill exists to prevent.
|
|
146
|
+
- A question past its "by when" MUST be raised, not silently carried forward. Carried forward twice is
|
|
147
|
+
a signal that either the owner is wrong or the question is not real.
|
|
148
|
+
- A row MUST move between files when its class changes, and MUST NOT be copied into a second one. An
|
|
149
|
+
assumption that turns out to touch money moves to `blocking.md`; it does not appear in both.
|
|
150
|
+
- Terms MUST match `.control/product-glossary.md`.
|
|
151
|
+
|
|
152
|
+
## Output
|
|
153
|
+
|
|
154
|
+
**The owner's section MUST contain only `owner` rows.** Everything else is reported as a count with one
|
|
155
|
+
line saying why it is not theirs — never as a list they have to read past. A report that shows all
|
|
156
|
+
nineteen alongside the six is the failure this skill was reshaped to end.
|
|
157
|
+
|
|
158
|
+
| Section | Contents |
|
|
159
|
+
|---|---|
|
|
160
|
+
| **Yours, now** | every `owner` row, ranked. This is the list |
|
|
161
|
+
| Mine | `run:` count, plus what has to be run |
|
|
162
|
+
| Frozen | `frozen:` count, plus which `DEC-` holds them and what lifts it |
|
|
163
|
+
| External | `external.md` count. States plainly that it holds no design gate |
|
|
164
|
+
| Not recorded | how many assumptions the threshold turned away this pass |
|
|
165
|
+
|
|
166
|
+
Then: which file each question landed in, and anything routed on to `wdi-decision`.
|
|
167
|
+
|
|
168
|
+
**"Are we done — no more OQ?" is answerable, and the honest answer is usually no.** Say which third is
|
|
169
|
+
the owner's, name what lifts the frozen third, and name what you have to run for the rest. A clean
|
|
170
|
+
list is not the goal; a list where every line is somebody's and actionable is.
|
|
@@ -6,12 +6,21 @@ description: Use before a gate, or after a batch of changes, to find drift betwe
|
|
|
6
6
|
# WDI Reconcile
|
|
7
7
|
|
|
8
8
|
Documents drift apart quietly. An SRS gets amended while its SDD does not; a `DEC-` is accepted and never
|
|
9
|
-
applied; a
|
|
9
|
+
applied; a ticket ships behaviour the use case never described. None of this shows up as an error, which is
|
|
10
10
|
why it needs a pass that looks for it on purpose.
|
|
11
11
|
|
|
12
12
|
This skill is **read-only**. It MUST NOT edit anything. Its output is a report, and every fix it
|
|
13
13
|
recommends is performed by another skill.
|
|
14
14
|
|
|
15
|
+
**It is not run after every change, and it MUST NOT be offered as one.** Its triggers are a gate, and a
|
|
16
|
+
batch of changes large enough that nobody can hold the delta in their head. Offering it after a two-file
|
|
17
|
+
edit is how a ten-minute change grows a twenty-minute tail — and the offer itself costs the reader
|
|
18
|
+
something, because declining it repeatedly teaches them to decline it always.
|
|
19
|
+
|
|
20
|
+
**Drift is reported only where it is load-bearing** — where a reader believing the stale sentence would
|
|
21
|
+
make the wrong repair. A document behind the code is in its expected state, not a defect;
|
|
22
|
+
`wdi-review` § Stale is not a finding owns the test, and it applies here unchanged.
|
|
23
|
+
|
|
15
24
|
## Step 1 — Scope by gate, then by `mode`
|
|
16
25
|
|
|
17
26
|
Two filters, and skipping either produces a report that is red where the plan says it should be.
|
|
@@ -25,7 +34,7 @@ Establish which gate the work stands at — `wdi-help` answers that — and chec
|
|
|
25
34
|
| G2 | + every `_prd/<initiative>/`, UX output wherever it currently sits, `product_components` with `mode` and `risk_accepted` |
|
|
26
35
|
| G3 | + every `.what/<pc>/` § UC Catalogue and § Actor Register, `domain-model.md`, `business-rules.md`, the spine, the C4 set, `containers`, the three inventories |
|
|
27
36
|
| G4 | + whatever each component's `mode` demands in `.what/<pc>/` and `.how/<pc>/` |
|
|
28
|
-
| G5 | +
|
|
37
|
+
| G5 | + the contract, `specs.yaml`, ticket files, tests, `defects.yaml`, RTM rows |
|
|
29
38
|
|
|
30
39
|
**By `mode`.** An artifact a component's `mode` does not demand MUST NOT be reported as missing. A
|
|
31
40
|
component at `catalog` has an SDD skeleton and no depth, and that is a **finished** state — G4 is skipped
|
|
@@ -38,10 +47,16 @@ the plan. The corpus running ahead of the code is likewise normal and deliberate
|
|
|
38
47
|
A narrower scope MAY be asked for — one Product Component, one initiative, one layer. State the scope
|
|
39
48
|
in one line before checking, and say what it excluded.
|
|
40
49
|
|
|
50
|
+
**A conflict the owner has already decided is not drift.** Where a document disagrees with the code
|
|
51
|
+
because the owner chose the code, the finding is that the **document has not been edited yet** — one
|
|
52
|
+
line, naming the edit — never a re-statement of the conflict and never a question. The decision is not
|
|
53
|
+
reopened here, and `delivery-flow-guide.md` says why: the survey behind that warning was spent when the
|
|
54
|
+
owner answered it.
|
|
55
|
+
|
|
41
56
|
## Step 2 — Run the validators first
|
|
42
57
|
|
|
43
58
|
Run `uv run .constitution/method/scripts/validate.py`, and `uv run .constitution/method/scripts/inventory.py` when code
|
|
44
|
-
exists.
|
|
59
|
+
exists. `goal-has-fr`–`cites-resolve` answer everything that can be **counted**, and you MUST NOT re-derive by reading what they
|
|
45
60
|
already report. Carry their findings as they came, then spend the reading on what no validator can see.
|
|
46
61
|
|
|
47
62
|
`.control/generated/` is their output and MUST NOT be read as an independent source. When it is
|
|
@@ -53,18 +68,18 @@ missing or stale, say so and name `validate.py --generate` rather than working a
|
|
|
53
68
|
|---|---|
|
|
54
69
|
| Top-down | Does every `applied` `DEC-` actually appear in the files its `touches` names? |
|
|
55
70
|
| Bottom-up | Does anything in `.how/<pc>/` describe behaviour that `.what/<pc>/` never promised? |
|
|
56
|
-
| Decisions | Is there an `accepted` `DEC-` that was never applied, or an `applied` one with an empty `touches`? The second is
|
|
57
|
-
| Chain | `BG → CAP → FR/NFR → UC →
|
|
71
|
+
| Decisions | Is there an `accepted` `DEC-` that was never applied, or an `applied` one with an empty `touches`? The second is `applied-dec-touches`; the first no validator can see |
|
|
72
|
+
| Chain | `BG → CAP → FR/NFR → UC → ticket → test` — where does it break? |
|
|
58
73
|
| Depth | Does any document carry more than its component's `mode` demands? Over-writing is drift too, and it is the direction nobody looks for |
|
|
59
74
|
| Vocabulary | Does any document use a domain noun that `.control/product-glossary.md` does not define, or a synonym for one it does? Detect against the rule in `wdi-blueprint`; MUST NOT keep a second rule here |
|
|
60
75
|
| Registry | Does `components.yaml` still describe what the corpus contains — a `<pc>` folder with no entry, an `LC` with no prose in the slot its `type` names, a container in the C4 set but not in `containers`, `owns:` claiming an entity another component also claims |
|
|
61
76
|
| Inventory | Do the three inventories still match the code? `inventory.py` answers it; carry its findings rather than re-deriving them |
|
|
62
77
|
| **Constitution** | Does an artifact break the rule its own guide states? |
|
|
63
78
|
| **Homeless output** | Does anything in `_bmad-output/` have no row in the ownership table in `corpus-guide.md`, or a row whose named owner is not installed? |
|
|
64
|
-
| **Evidence** |
|
|
79
|
+
| **Evidence** | `cites-resolve` answers the mechanical half — does every cited path still resolve. What is left for a reader: does the file still **contain** what is cited |
|
|
65
80
|
|
|
66
81
|
The chain check overlaps the validators on purpose. Validators answer what can be counted; this pass
|
|
67
|
-
answers what has to be read — a `UC` that exists and is wrong passes
|
|
82
|
+
answers what has to be read — a `UC` that exists and is wrong passes `fr-has-uc` and fails here.
|
|
68
83
|
|
|
69
84
|
### The Constitution check
|
|
70
85
|
|
|
@@ -79,6 +94,14 @@ governs it, and the four failures worth looking for are the ones no ID chain rec
|
|
|
79
94
|
| A layer written by a skill that does not own it | The ownership table in `corpus-guide.md` |
|
|
80
95
|
| A rule stated in a `.constitution/method/` file | `status: Reference` — it explains, it MUST NOT bind |
|
|
81
96
|
| A `Reference` file contradicting a guide | The guide wins, and the contradiction is a defect to report |
|
|
97
|
+
| `CONTEXT.md` or `CONTEXT-MAP.md` outside `_bmad-output/` | A second home for the vocabulary and for where each context lives. The homes are `.control/product-glossary.md`, `components.yaml`, and the two structure maps |
|
|
98
|
+
| A `docs/` folder holding corpus or rules — `docs/adr/` above all | **Article 3**: this method has no `docs/` layer, and a leftover one is inventory to sort rather than a second home |
|
|
99
|
+
|
|
100
|
+
**The last two are hunted by artifact, not by author, and that is deliberate.** An engine invoked outside its
|
|
101
|
+
WDI wrapper still writes what it always writes — `wdi-blueprint` points `domain-modeling` at
|
|
102
|
+
`_bmad-output/`, but a skill that calls it directly does not. Policing who invoked what is impossible from
|
|
103
|
+
here; noticing the file that appeared is not. Inside `_bmad-output/` all three are legitimate working output
|
|
104
|
+
and MUST NOT be reported.
|
|
82
105
|
|
|
83
106
|
You MUST NOT invent a rule to fail an artifact against. Every finding here MUST quote the guide it comes
|
|
84
107
|
from. A file at `status: Draft` MAY be read as guidance but MUST NOT be used to reject anything — that
|
|
@@ -90,15 +113,15 @@ anything at all.
|
|
|
90
113
|
It checks whether **citations still resolve**. It does **not** check whether the code implements the
|
|
91
114
|
corpus, and you MUST NOT widen it into that.
|
|
92
115
|
|
|
93
|
-
A general corpus-versus-code comparison would be red through the middle of every
|
|
116
|
+
A general corpus-versus-code comparison would be red through the middle of every spec, and a check
|
|
94
117
|
that is always red is a check people learn to skip. What is already covered elsewhere MUST NOT be
|
|
95
118
|
re-reported here:
|
|
96
119
|
|
|
97
120
|
| Already answered by | Case |
|
|
98
121
|
|---|---|
|
|
99
122
|
| A red RTM row | Promised, not built yet |
|
|
100
|
-
|
|
|
101
|
-
|
|
|
123
|
+
| `fr-has-uc` · `uc-scheduled` | Documented, never scheduled |
|
|
124
|
+
| `ticket-has-test` | A ticket closed with no named test |
|
|
102
125
|
| `inventory.py` | The plan and the code disagreeing about a table, endpoint, or screen |
|
|
103
126
|
|
|
104
127
|
That leaves exactly one gap, and it is the one this check fills: **a descriptive claim about code
|