wdi-method 0.6.0 → 0.6.2
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 +14 -4
- package/bin/wdi-method.js +2 -0
- package/kit/.constitution/method/README.md +1 -1
- package/kit/.constitution/method/document/decision-guide.md +208 -199
- package/kit/.constitution/method/document/delivery-flow-guide.md +412 -409
- package/kit/.constitution/method/document/templates/decision.md +6 -1
- package/kit/.constitution/method/method-glossary.md +183 -182
- package/kit/.constitution/method/scripts/validate.py +102 -2
- package/kit/.constitution/method/why/README.md +3 -1
- package/kit/.constitution/method/why/artifact-map.md +1 -1
- package/kit/.constitution/method/why/portability.md +98 -98
- package/kit/skills/wdi-autopilot/SKILL.md +366 -0
- package/kit/skills/wdi-build/SKILL.md +371 -357
- package/kit/skills/wdi-decision/SKILL.md +197 -187
- package/kit/skills/wdi-explain-to-me/SKILL.md +84 -0
- package/kit/skills/wdi-help/SKILL.md +102 -99
- package/kit/skills/wdi-question/SKILL.md +176 -170
- package/kit-overlay/AGENTS.md +223 -216
- package/kit-overlay/README.md +1 -1
- package/kit-overlay/portability.md +98 -98
- package/package.json +1 -1
|
@@ -1,99 +1,102 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: wdi-help
|
|
3
|
-
description: Use when you need to know where the project stands in the delivery flow and which skill comes next. Answers from this project's five gates, not from BMad's phase column.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# WDI Help
|
|
7
|
-
|
|
8
|
-
`bmad-help` cannot answer "where am I" in this project. Its progress detection globs `output-location`
|
|
9
|
-
paths resolved from `resolve_config.py`, so it is blind to every class-A artifact this project redirects
|
|
10
|
-
into `.what/` and `.how/`. It also lists two required gates — `epics.md` and `sprint-status.yaml` — that
|
|
11
|
-
this project's route never produces, and it is the only BMad skill with no `customize.toml`, so none of
|
|
12
|
-
that can be corrected.
|
|
13
|
-
|
|
14
|
-
This skill replaces it for position and routing. `bmad-help` remains useful for one thing only: questions
|
|
15
|
-
about BMad itself.
|
|
16
|
-
|
|
17
|
-
## Inputs
|
|
18
|
-
|
|
19
|
-
| Source | What it answers |
|
|
20
|
-
|---|---|
|
|
21
|
-
| `.control/generated/status` | Which spec is open, how many of its tickets are done, which validators are red |
|
|
22
|
-
| `.control/registry/index.yaml` | The global `mode`, and the gate map |
|
|
23
|
-
| `.control/registry/components.yaml` | Per-component `mode`, `risk_accepted`, and `g4_passed` |
|
|
24
|
-
| `.control/registry/specs.yaml` | Spec → release, size, `depends_on`, and its ticket index |
|
|
25
|
-
| `.constitution/method/document/delivery-flow-guide.md` | The five gates and their checklists |
|
|
26
|
-
| `.constitution/method/why/README.md` | The whole shape, when the caller has never seen the method |
|
|
27
|
-
|
|
28
|
-
You MUST read `.control/generated/status` rather than counting files yourself. It is generated from the
|
|
29
|
-
registry; hand-counting produces a second answer that will disagree.
|
|
30
|
-
|
|
31
|
-
## What to answer
|
|
32
|
-
|
|
33
|
-
Three things, in this order, and nothing else unless asked:
|
|
34
|
-
|
|
35
|
-
1. **Where the project stands** — the last gate passed, and which gate is next.
|
|
36
|
-
2. **What blocks that gate** — the specific artifact, validator, or blocking question that is not ready.
|
|
37
|
-
3. **Which skill to invoke next** — one skill, named, with its intent, and the reason in a clause.
|
|
38
|
-
|
|
39
|
-
Keep it under fifteen lines. A routing answer that needs scrolling has failed at its job.
|
|
40
|
-
|
|
41
|
-
## The one thing that changes the answer
|
|
42
|
-
|
|
43
|
-
**Read the component's `mode` before routing to G4.** A component at `mode: catalog` skips G4 entirely —
|
|
44
|
-
routing it to `wdi-component` is wrong, and the next step is `wdi-build`. That is the single most common
|
|
45
|
-
mis-route in this flow, because every other gate is the same for every component.
|
|
46
|
-
|
|
47
|
-
## Routing by what exists
|
|
48
|
-
|
|
49
|
-
| State | Next |
|
|
50
|
-
|---|---|
|
|
51
|
-
| `wdi-method update` just ran and its summary printed an `upgrade` line | `wdi-upgrade` — **before anything else**. Content is still in the old shape, and every skill below reads the new one |
|
|
52
|
-
| No registry, or no global `mode` set | `wdi-init` intent `setup` — nothing has started |
|
|
53
|
-
| No `.what/_product-brief/brief.md` | `wdi-problem` — G1 has not started |
|
|
54
|
-
| A brief exists, and no PRD covers the area in play | `wdi-product` intent `prd` |
|
|
55
|
-
| A PRD covers it but the promise has moved | `wdi-product` intent `update` — never a second PRD for the same area |
|
|
56
|
-
| Only the **wording** of an `FR` is wrong | Nobody. Whichever skill is at work fixes it directly; putting it behind a gate is how three earlier corrections were dropped |
|
|
57
|
-
| A PRD exists and the interface is a large part of what it promises | `wdi-ux` — optional, and it runs **before G2**, which reads its `EXPERIENCE.md`. It needs no Product Component: `design-system.md` lands at once, and the two `<pc>`-scoped halves land when `wdi-init` intent `component` runs |
|
|
58
|
-
| A PRD exists, no `product_components` yet | `wdi-init` intent `component` — the slicing is born here, at the tail of G2 |
|
|
59
|
-
| Components exist, `mode` or `risk_accepted` unset | `wdi-init` intents `mode` and `risk` — both are the owner's, and G4 cannot be read without them |
|
|
60
|
-
| Components exist, no UC catalogue or no spine | `wdi-blueprint` — intent `catalog` first, then `platform` |
|
|
61
|
-
| The blueprint is complete and G3 has not been held | The gate. Read `.how-rendered/blueprint.md`, not seven files |
|
|
62
|
-
| G3 passed, a component at `outline`/`guarded`/`deep` has no depth | `wdi-component` |
|
|
63
|
-
| G3 passed, the component is at `mode: catalog` | `wdi-build` — G4 is skipped by design |
|
|
64
|
-
| Depth done and G4 passed for every component the work touches | `wdi-build` — it opens the spec, has the owner run `to-spec` and `to-tickets`, ships each ticket, closes the spec |
|
|
65
|
-
| A small fix touching no `FR`, `UC`, `AD-N`, or domain model | Fast Path: the owner runs `/implement` directly. It stops and becomes a spec `S` the moment an `FR` is touched |
|
|
66
|
-
|
|
|
67
|
-
|
|
|
68
|
-
|
|
|
69
|
-
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
-
|
|
87
|
-
`
|
|
88
|
-
- You MUST NOT
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
1
|
+
---
|
|
2
|
+
name: wdi-help
|
|
3
|
+
description: Use when you need to know where the project stands in the delivery flow and which skill comes next. Answers from this project's five gates, not from BMad's phase column.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# WDI Help
|
|
7
|
+
|
|
8
|
+
`bmad-help` cannot answer "where am I" in this project. Its progress detection globs `output-location`
|
|
9
|
+
paths resolved from `resolve_config.py`, so it is blind to every class-A artifact this project redirects
|
|
10
|
+
into `.what/` and `.how/`. It also lists two required gates — `epics.md` and `sprint-status.yaml` — that
|
|
11
|
+
this project's route never produces, and it is the only BMad skill with no `customize.toml`, so none of
|
|
12
|
+
that can be corrected.
|
|
13
|
+
|
|
14
|
+
This skill replaces it for position and routing. `bmad-help` remains useful for one thing only: questions
|
|
15
|
+
about BMad itself.
|
|
16
|
+
|
|
17
|
+
## Inputs
|
|
18
|
+
|
|
19
|
+
| Source | What it answers |
|
|
20
|
+
|---|---|
|
|
21
|
+
| `.control/generated/status` | Which spec is open, how many of its tickets are done, which validators are red |
|
|
22
|
+
| `.control/registry/index.yaml` | The global `mode`, and the gate map |
|
|
23
|
+
| `.control/registry/components.yaml` | Per-component `mode`, `risk_accepted`, and `g4_passed` |
|
|
24
|
+
| `.control/registry/specs.yaml` | Spec → release, size, `depends_on`, and its ticket index |
|
|
25
|
+
| `.constitution/method/document/delivery-flow-guide.md` | The five gates and their checklists |
|
|
26
|
+
| `.constitution/method/why/README.md` | The whole shape, when the caller has never seen the method |
|
|
27
|
+
|
|
28
|
+
You MUST read `.control/generated/status` rather than counting files yourself. It is generated from the
|
|
29
|
+
registry; hand-counting produces a second answer that will disagree.
|
|
30
|
+
|
|
31
|
+
## What to answer
|
|
32
|
+
|
|
33
|
+
Three things, in this order, and nothing else unless asked:
|
|
34
|
+
|
|
35
|
+
1. **Where the project stands** — the last gate passed, and which gate is next.
|
|
36
|
+
2. **What blocks that gate** — the specific artifact, validator, or blocking question that is not ready.
|
|
37
|
+
3. **Which skill to invoke next** — one skill, named, with its intent, and the reason in a clause.
|
|
38
|
+
|
|
39
|
+
Keep it under fifteen lines. A routing answer that needs scrolling has failed at its job.
|
|
40
|
+
|
|
41
|
+
## The one thing that changes the answer
|
|
42
|
+
|
|
43
|
+
**Read the component's `mode` before routing to G4.** A component at `mode: catalog` skips G4 entirely —
|
|
44
|
+
routing it to `wdi-component` is wrong, and the next step is `wdi-build`. That is the single most common
|
|
45
|
+
mis-route in this flow, because every other gate is the same for every component.
|
|
46
|
+
|
|
47
|
+
## Routing by what exists
|
|
48
|
+
|
|
49
|
+
| State | Next |
|
|
50
|
+
|---|---|
|
|
51
|
+
| `wdi-method update` just ran and its summary printed an `upgrade` line | `wdi-upgrade` — **before anything else**. Content is still in the old shape, and every skill below reads the new one |
|
|
52
|
+
| No registry, or no global `mode` set | `wdi-init` intent `setup` — nothing has started |
|
|
53
|
+
| No `.what/_product-brief/brief.md` | `wdi-problem` — G1 has not started |
|
|
54
|
+
| A brief exists, and no PRD covers the area in play | `wdi-product` intent `prd` |
|
|
55
|
+
| A PRD covers it but the promise has moved | `wdi-product` intent `update` — never a second PRD for the same area |
|
|
56
|
+
| Only the **wording** of an `FR` is wrong | Nobody. Whichever skill is at work fixes it directly; putting it behind a gate is how three earlier corrections were dropped |
|
|
57
|
+
| A PRD exists and the interface is a large part of what it promises | `wdi-ux` — optional, and it runs **before G2**, which reads its `EXPERIENCE.md`. It needs no Product Component: `design-system.md` lands at once, and the two `<pc>`-scoped halves land when `wdi-init` intent `component` runs |
|
|
58
|
+
| A PRD exists, no `product_components` yet | `wdi-init` intent `component` — the slicing is born here, at the tail of G2 |
|
|
59
|
+
| Components exist, `mode` or `risk_accepted` unset | `wdi-init` intents `mode` and `risk` — both are the owner's, and G4 cannot be read without them |
|
|
60
|
+
| Components exist, no UC catalogue or no spine | `wdi-blueprint` — intent `catalog` first, then `platform` |
|
|
61
|
+
| The blueprint is complete and G3 has not been held | The gate. Read `.how-rendered/blueprint.md`, not seven files |
|
|
62
|
+
| G3 passed, a component at `outline`/`guarded`/`deep` has no depth | `wdi-component` |
|
|
63
|
+
| G3 passed, the component is at `mode: catalog` | `wdi-build` — G4 is skipped by design |
|
|
64
|
+
| Depth done and G4 passed for every component the work touches | `wdi-build` — it opens the spec, has the owner run `to-spec` and `to-tickets`, ships each ticket, closes the spec |
|
|
65
|
+
| A small fix touching no `FR`, `UC`, `AD-N`, or domain model | Fast Path: the owner runs `/implement` directly. It stops and becomes a spec `S` the moment an `FR` is touched |
|
|
66
|
+
| The owner wants every `FR` delivered without being asked in between | `wdi-autopilot` — a preflight first, then one mandate the owner accepts, then a loop that fires it. Route here only when the owner asks for it; it is never the default next step |
|
|
67
|
+
| A planning assumption turned out void | `wdi-decision` intent `open` — it proposes, and changes nothing |
|
|
68
|
+
| The owner has to decide something and wants the reading done first | `wdi-explain-to-me` — it briefs, and changes nothing; the decision then goes to `wdi-decision` or `wdi-question` |
|
|
69
|
+
| An accepted `DEC-` has not reached its documents | `wdi-decision` intent `apply` |
|
|
70
|
+
| A bug, a failing test, unexpected behaviour | `wdi-systematic-debugging`, before any fix is proposed |
|
|
71
|
+
| Numbers are wanted before the work is committed | `wdi-report` intent `estimate` |
|
|
72
|
+
|
|
73
|
+
A brief that exists but is thin is still a brief. You MUST NOT route back to `wdi-problem` because a
|
|
74
|
+
section reads weakly — route there only when the brief is absent, when a change signal invalidates what
|
|
75
|
+
it claims, or when one of its eight required sections is missing outright.
|
|
76
|
+
|
|
77
|
+
## Rules
|
|
78
|
+
|
|
79
|
+
- You MUST answer from this project's five gates — G1 Problem · G2 Product · G3 Blueprint · G4 Component ·
|
|
80
|
+
G5 Release. BMad's `phase` column MUST NOT be used; it mixes two conventions and names gates this
|
|
81
|
+
project does not run.
|
|
82
|
+
- When a `wdi-*` wrapper exists for a BMad skill, you MUST name the wrapper, never the skill it wraps. The
|
|
83
|
+
wrapper carries the position check and the content checks; routing past it produces an artifact nothing
|
|
84
|
+
verifies. Today every BMad skill this method uses has one: `wdi-problem`, `wdi-product`,
|
|
85
|
+
`wdi-blueprint`, `wdi-build`, `wdi-decision`, `wdi-review`, `wdi-ux`.
|
|
86
|
+
- Only `.control/questions/blocking.md` holds a gate. `external.md` holds go-live and MUST NOT be reported
|
|
87
|
+
as blocking a design gate; `assumptions.md` holds nothing.
|
|
88
|
+
- You MUST NOT invent progress. If `.control/generated/status` is missing or stale, say so and name
|
|
89
|
+
`validate.py --generate`.
|
|
90
|
+
- You MUST NOT run other skills on the user's behalf. Name the skill; let them invoke it. The one skill that
|
|
91
|
+
runs others is `wdi-autopilot`, and only under a mandate the owner accepted — that is what the mandate is.
|
|
92
|
+
- When the next step is blocked by a decision rather than by work, route to `wdi-question` or
|
|
93
|
+
`wdi-decision`, not to a producing skill.
|
|
94
|
+
- When asked about BMad itself — what a BMad skill does, what it writes, which are deprecated — answer
|
|
95
|
+
from `bmad-skill-register.md`, and only fall back to `bmad-help` for module documentation.
|
|
96
|
+
- When the caller has never seen this method, point at `.constitution/method/why/README.md` rather than
|
|
97
|
+
paraphrasing it here.
|
|
98
|
+
|
|
99
|
+
## When there is no spec open
|
|
100
|
+
|
|
101
|
+
Say so plainly, then route by the table above. An artifact a later gate produces MUST NOT be reported as
|
|
102
|
+
missing — that is not a gap, it is the plan.
|
|
@@ -1,170 +1,176 @@
|
|
|
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
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
**
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
the brief.
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
-
|
|
149
|
-
|
|
150
|
-
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
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
|
+
**Under an active mandate, `owner` rows are `wdi-autopilot`'s.** It answers each with a default, files the
|
|
105
|
+
line in `assumptions.md` with its cost and `under: DEC-<mandate>`, and closes it in `answered.md` in the same
|
|
106
|
+
pass. Two things do not move: a row the mandate lists as `parked` stays `owner` and is reported, and a row
|
|
107
|
+
whose owner is the client or a stakeholder — the first rule below — is never the agent's to answer, mandate or
|
|
108
|
+
not. The mandate came from the owner; it cannot delegate what was never the owner's.
|
|
109
|
+
|
|
110
|
+
## Registering
|
|
111
|
+
|
|
112
|
+
| Field | Rule |
|
|
113
|
+
|---|---|
|
|
114
|
+
| Question | One sentence, answerable. "How should referrals work?" is a topic, not a question |
|
|
115
|
+
| Blocks | What cannot proceed — a gate, an `FR`, a ticket, or nothing |
|
|
116
|
+
| Whose | `owner` · `run: <what>` · `frozen: DEC-NNN`. See above |
|
|
117
|
+
| Owner | Who can answer. A question with no owner is a wish |
|
|
118
|
+
| By when | The moment it must be answered, usually a gate |
|
|
119
|
+
|
|
120
|
+
Ids stay `OQ-`, allocated from the highest ever used including closed ones. An id MUST NOT be reused.
|
|
121
|
+
|
|
122
|
+
A question whose discussion outgrows one line gets `.control/questions/OQ-NNN-<slug>.md` in the same
|
|
123
|
+
folder, from `templates/oq.md`, and the list keeps a one-line pointer. The old home
|
|
124
|
+
`.control/supplements/` is gone.
|
|
125
|
+
|
|
126
|
+
## Closing
|
|
127
|
+
|
|
128
|
+
An answered question is closed **in place** — the answer written beside it with the date and who
|
|
129
|
+
answered — then moved to `answered.md`. You MUST NOT delete the entry.
|
|
130
|
+
|
|
131
|
+
**A fossil is closed, not answered, and you MUST look for fossils first.** A row questioning a rule, a
|
|
132
|
+
layer, or a validator that has since been repealed cannot bite again: it closes with the repeal as its
|
|
133
|
+
answer and MUST NOT be put to the owner as a decision. These are free, and a long list usually holds
|
|
134
|
+
several — one real corpus was still carrying a question about `parallel-tickets-blocked`'s shape after the layer `parallel-tickets-blocked` runs
|
|
135
|
+
on had been retired.
|
|
136
|
+
|
|
137
|
+
**An answer goes into the document it belongs to, and that is usually the end of it.** An `FR` in the
|
|
138
|
+
PRD, a rule in `business-rules.md`, a line in the brief — written there, closed here, done. The closure
|
|
139
|
+
routes to `wdi-decision` **only** when the answer has no home in any design document, or contradicts an
|
|
140
|
+
`AD-N`. `decision-guide.md` § A decision's first home owns that split, and a `DEC-` is never permission
|
|
141
|
+
to edit a document.
|
|
142
|
+
|
|
143
|
+
This matters most at G1 and G2, where almost nothing is homeless yet: an answer about a brief belongs in
|
|
144
|
+
the brief.
|
|
145
|
+
|
|
146
|
+
## Rules
|
|
147
|
+
|
|
148
|
+
- You MUST NOT answer the question yourself when the owner is the client or a stakeholder. Drafting a
|
|
149
|
+
proposed answer for them to confirm is useful; recording it as settled is not.
|
|
150
|
+
- An `[ASSUMPTION]` tag left in a PRD, an SRS, or an SDD MUST be filed here before that document
|
|
151
|
+
passes its gate. That is precisely the failure this skill exists to prevent.
|
|
152
|
+
- A question past its "by when" MUST be raised, not silently carried forward. Carried forward twice is
|
|
153
|
+
a signal that either the owner is wrong or the question is not real.
|
|
154
|
+
- A row MUST move between files when its class changes, and MUST NOT be copied into a second one. An
|
|
155
|
+
assumption that turns out to touch money moves to `blocking.md`; it does not appear in both.
|
|
156
|
+
- Terms MUST match `.control/product-glossary.md`.
|
|
157
|
+
|
|
158
|
+
## Output
|
|
159
|
+
|
|
160
|
+
**The owner's section MUST contain only `owner` rows.** Everything else is reported as a count with one
|
|
161
|
+
line saying why it is not theirs — never as a list they have to read past. A report that shows all
|
|
162
|
+
nineteen alongside the six is the failure this skill was reshaped to end.
|
|
163
|
+
|
|
164
|
+
| Section | Contents |
|
|
165
|
+
|---|---|
|
|
166
|
+
| **Yours, now** | every `owner` row, ranked. This is the list |
|
|
167
|
+
| Mine | `run:` count, plus what has to be run |
|
|
168
|
+
| Frozen | `frozen:` count, plus which `DEC-` holds them and what lifts it |
|
|
169
|
+
| External | `external.md` count. States plainly that it holds no design gate |
|
|
170
|
+
| Not recorded | how many assumptions the threshold turned away this pass |
|
|
171
|
+
|
|
172
|
+
Then: which file each question landed in, and anything routed on to `wdi-decision`.
|
|
173
|
+
|
|
174
|
+
**"Are we done — no more OQ?" is answerable, and the honest answer is usually no.** Say which third is
|
|
175
|
+
the owner's, name what lifts the frozen third, and name what you have to run for the rest. A clean
|
|
176
|
+
list is not the goal; a list where every line is somebody's and actionable is.
|