wdi-method 0.6.30 → 0.6.32

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.
Files changed (43) hide show
  1. package/CHANGELOG.md +129 -0
  2. package/NOTICE +7 -2
  3. package/README.md +16 -11
  4. package/bin/wdi-method.js +396 -87
  5. package/kit/.constitution/method/document/architecture-guide.md +217 -209
  6. package/kit/.constitution/method/document/bmad-skill-register.md +107 -104
  7. package/kit/.constitution/method/document/corpus-guide.md +522 -517
  8. package/kit/.constitution/method/document/decision-guide.md +236 -216
  9. package/kit/.constitution/method/document/delivery-flow-guide.md +20 -0
  10. package/kit/.constitution/method/document/prd-guide.md +245 -245
  11. package/kit/.constitution/method/document/templates/design-system.md +96 -66
  12. package/kit/.constitution/method/document/templates/experience.md +62 -0
  13. package/kit/.constitution/method/document/templates/structure-codebase.md +131 -129
  14. package/kit/.constitution/method/document/templates/ux.md +78 -76
  15. package/kit/.constitution/method/document/ux-guide.md +161 -115
  16. package/kit/.constitution/method/method-glossary.md +3 -0
  17. package/kit/.constitution/method/scripts/validate.py +3375 -3200
  18. package/kit/.constitution/method/structure-guide.md +204 -202
  19. package/kit/.constitution/method/why/README.md +1 -1
  20. package/kit/.constitution/method/why/artifact-map.md +158 -157
  21. package/kit/.constitution/method/why/portability.md +19 -2
  22. package/kit/skills/wdi-autopilot/SKILL.md +32 -19
  23. package/kit/skills/wdi-blueprint/SKILL.md +271 -264
  24. package/kit/skills/wdi-build/SKILL.md +28 -19
  25. package/kit/skills/wdi-component/SKILL.md +179 -174
  26. package/kit/skills/wdi-daily-autopilot/SKILL.md +24 -13
  27. package/kit/skills/wdi-daily-what-to-build/SKILL.md +9 -6
  28. package/kit/skills/wdi-daily-what-to-test/SKILL.md +2 -0
  29. package/kit/skills/wdi-decision/SKILL.md +206 -203
  30. package/kit/skills/wdi-explain-to-me/SKILL.md +2 -0
  31. package/kit/skills/wdi-help/SKILL.md +130 -125
  32. package/kit/skills/wdi-init/SKILL.md +10 -5
  33. package/kit/skills/wdi-problem/SKILL.md +114 -108
  34. package/kit/skills/wdi-product/SKILL.md +167 -162
  35. package/kit/skills/wdi-prune-or-archive/SKILL.md +2 -0
  36. package/kit/skills/wdi-reconcile/SKILL.md +170 -169
  37. package/kit/skills/wdi-upgrade/SKILL.md +234 -215
  38. package/kit/skills/wdi-ux/SKILL.md +187 -169
  39. package/kit-overlay/AGENTS.md +15 -2
  40. package/kit-overlay/portability.md +19 -2
  41. package/lib/platforms.mjs +420 -248
  42. package/package.json +1 -1
  43. package/scaffold/.control/registry/index.yaml +2 -1
@@ -1,157 +1,158 @@
1
- ---
2
- status: Reference
3
- ---
4
-
5
- # Artifact Map — what exists, where, and who owns it
6
-
7
- **Opened when:** someone asks *"where does this file go"*, or *"does this document exist at my `mode`"*.
8
-
9
- This file **explains**. It does not bind — `../document/*-guide.md` does, and where the two disagree the guide
10
- wins and the disagreement is a defect to report.
11
-
12
- It answers three questions and nothing else: which files exist at each `mode`, who owns each one, and how
13
- the units of work line up. The **rules** about depth live in `../document/delivery-flow-guide.md`; what is
14
- here is the map. What `mode` and `risk_accepted` do **together**, cell by cell, is in `mode-risk-map.md`.
15
-
16
- ## The one thing to read first
17
-
18
- Nine things exist at **every** `mode`, including `catalog`, because they belong to the blueprint at G3 and
19
- the depth knob does not reach the blueprint:
20
-
21
- > the use case list · the API list · the table list with its key columns · the screen list · the domain
22
- > model · the actor list · the spine `AD-N` · C4 L1 + L2 + L3 · cross-component business rules
23
-
24
- That is why nobody needs a fifth mode. The request behind wanting one is almost always *"I need at minimum
25
- the use cases, the API, and the database"* — and all three are already in `catalog`.
26
-
27
- ## What each mode gives you, cumulatively
28
-
29
- | `mode` | What you hold |
30
- |---|---|
31
- | `catalog` | The nine above. **Zero extra files per component** |
32
- | `outline` | + `Decision Summary` · the `LC` list per component · full flows for at most 3 use cases · local business rules |
33
- | `guarded` | + `Failure Behaviour` for every boundary · `Inherited Constraints` · third-party integration documents · boundary `LC` registered |
34
- | `deep` | + ABCE robustness analysis · five-lane contract spec per endpoint · data dictionary per column · flow diagrams · state machines · branch scenarios · every `critical` use case gets a full flow |
35
-
36
- Marks used below: **always** = present at all four modes, born at G1, G2, or G3 · ✓ = written at that mode
37
- · skeleton = the file exists carrying headings and frontmatter · — = not written at all.
38
-
39
- ## `.what/`
40
-
41
- | File | Holds | Born | `catalog` | `outline` | `guarded` | `deep` |
42
- |---|---|---|---|---|---|---|
43
- | `_product-brief/brief.md` | Problem, users, measure of success, non-goals | G1 | always | always | always | always |
44
- | `_product-brief/addendum.md` | Depth that does not fit the brief's narrative | G1 | always | always | always | always |
45
- | `_prd/<initiative>/prd.md` | `CAP` · `FR` · `NFR` · `UJ` · one proof of done per `FR` | G2 | always | always | always | always |
46
- | `_prd/<initiative>/addendum.md` | Rejected alternatives, option matrices, sizing | G2 | always | always | always | always |
47
- | `<pc>/04-usecases/EXPERIENCE.md` | The user-facing journey | G2, optional | optional | optional | optional | optional |
48
- | `business-rules.md` | `BR-N` binding more than one component | G3 | always | always | always | always |
49
- | **`<pc>/SRS-<pc>.md`** | § Actor Register · **§ UC Catalogue — this is the use case list** · Constraints · Non-Goals · Prerequisite · Assumptions/Risks/TBC | G3 | **always** | always | always | always |
50
- | `<pc>/03-domain/domain-model.md` | Entities · relations · columns | G3 | always | always | always | always |
51
- | `<pc>/02-rules/rules-<pc>.md` | Rules binding only this component | G4 | — | ✓ | ✓ | ✓ |
52
- | `<pc>/04-usecases/UC-<n>-<slug>.md` | One full flow, at most eight steps | G4 | — | max **3** | max **3** | every `critical` UC |
53
- | `<pc>/03-domain/state-machines.md` | The lifecycle of each multi-state entity | G4 | — | — | — | ✓ |
54
- | `<pc>/05-scenarios/SCN-<nn>-<slug>.md` | A branch that does not fit its use case file | G4 | — | — | — | ✓ |
55
-
56
- **So `SRS-<pc>.md` exists at `mode: catalog`.** It carries the actor list and the use case catalogue. What
57
- is absent there is the `UC-<n>-<slug>.md` files — the step-by-step flows.
58
-
59
- Repealed: `<pc>/01-requirements/` (permanently empty; `FR` live in the PRD and the SRS cites them) and
60
- `<pc>/supplements/` (existed for `ANX-`).
61
-
62
- ## `.how/`
63
-
64
- | File | Holds | Born | `catalog` | `outline` | `guarded` | `deep` |
65
- |---|---|---|---|---|---|---|
66
- | `_platform/ARCHITECTURE-SPINE.md` | `AD-N` — Binds · Prevents · Rule. Invariants only | G3 | always | always | always | always |
67
- | `_platform/c4-l1-system-context.md` | System, outside actors, outside systems | G3 | always | always | always | always |
68
- | `_platform/c4-l2-containers.md` | Containers, their technology, their relations, and the PC × container matrix. **Owns the container list** | G3 | always | always | always | always |
69
- | `_platform/c4-l3-<container>.md` | One file per `built: true` container holding more than one Product Component | G3 | always | always | always | always |
70
- | **`_platform/inventory-db.md`** | **Table list**: `No` · table · owning component · what it holds · **key columns** | G3 | **always** | always | always | always |
71
- | **`_platform/inventory-api.md`** | **Endpoint list**: `No` · method · path · owning component · description · status | G3 | **always** | always | always | always |
72
- | **`_platform/inventory-screen.md`** | **Screen list**: `No` · screen · route · owning component · actor · `UC` served | G3 | **always** | always | always | always |
73
- | `_platform/cross-cutting.md` | One error envelope for the whole product, and the rest of what is shared | G3 | always | always | always | always |
74
- | `_platform/design-system.md` | Tokens and base elements | G2, optional | optional | optional | optional | optional |
75
- | `<pc>/SDD-<pc>.md` § Decision Summary | What this component is built as, and the costliest choices reversed | G4 | skeleton | ✓ | ✓ | ✓ |
76
- | `<pc>/SDD-<pc>.md` § Structure | The `LC` list and their dependency direction | G4 | skeleton | ✓ | ✓ | ✓ |
77
- | `<pc>/SDD-<pc>.md` § Inherited Constraints | The `AD-N` binding this component, quoted not paraphrased | G4 | — | — | ✓ | ✓ |
78
- | **`<pc>/SDD-<pc>.md` § Failure Behaviour** | Per boundary: the other side slow, absent, or lying | G4 | — | — | **✓ every boundary** | ✓ |
79
- | `<pc>/SDD-<pc>.md` § Robustness Analysis | ABCE per `critical` use case | G4 | — | — | — | ✓ |
80
- | `<pc>/03-integrations/<name>.md` | A third party: who owns it, and what happens when they change it | G4 | — | — | ✓ if any | ✓ |
81
- | `<pc>/02-contracts/00-inventory.md` | This component's endpoints, stably numbered | G4 | — | — | — | ✓ |
82
- | `<pc>/02-contracts/<nn>-<resource>.md` | One endpoint, five lanes: auth · validation · error · rate limit · idempotency | G4 | — | — | — | ✓ |
83
- | `<pc>/04-components/<name>.md` | Services and jobs | G4 | — | — | — | ✓ |
84
- | `<pc>/05-model/data-model.md` | Component ERD + **data dictionary per column** | G4 | — | — | — | ✓ |
85
- | `<pc>/06-flows/<nn>-<flow>.md` | Sequence diagram, only for money, irreversible state, or a third party | G4 | — | — | — | ✓ |
86
- | `<pc>/01-ux/<screen>.md` | Screens and composites, **field detail per form** | G4 | — | — | — | ✓, or earlier via `wdi-ux` |
87
-
88
- Repealed: `_platform/architecture/` (one file does not earn a folder) and `<pc>/supplements/`.
89
-
90
- ## Registry and derived files
91
-
92
- | File | Holds | Present at |
93
- |---|---|---|
94
- | `.control/registry/goals.yaml` | `BG` | every mode |
95
- | `.control/registry/requirements-<slug>.yaml` | `CAP` · `FR` · `NFR` · `UJ`, one file per PRD initiative | every mode |
96
- | `.control/registry/usecases.yaml` | `UC-N` with `critical` and the `FR` it satisfies | every mode |
97
- | `.control/registry/components.yaml` → `product_components` | Component · `mode` · `risk_accepted` · `risk_note` · `owns` · `g4_passed` | every mode |
98
- | `.control/registry/components.yaml` → `containers` | The containers from C4 L2 | every mode |
99
- | `.control/registry/components.yaml` → `platform_owns` | Entities no Product Component's promise explains. `_platform` is not a component and has no `mode` | every mode |
100
- | `.control/registry/components.yaml` → `logical_components` | `LC` | boundary from `guarded`; boundary + control at `deep` |
101
- | `.control/registry/decisions.yaml` · `specs.yaml` · `defects.yaml` · `risks.yaml` · `index.yaml` | Decisions · work · defects · risks · the global `mode` and gate map | every mode |
102
- | `.how-rendered/blueprint.md` | **The one-page roll-up reviewed at G3** | every mode |
103
- | `.control/generated/decisions.md` | The flat index of every `DEC-` | every mode |
104
- | `.control/generated/estimate.md` | The candidate task table | every mode |
105
- | `.control/generated/rtm` · `status` · `dag` · `components` · `risks` | Traceability and progress | every mode |
106
-
107
- ## Who owns each file
108
-
109
- A skill lands the output of the layer it owns, and landing is part of producing it — never a follow-up
110
- someone else performs. `../document/corpus-guide.md` holds the binding version of this table.
111
-
112
- | Owner | Writes |
113
- |---|---|
114
- | `wdi-init` | The registry scaffold, `mode`, `risk_accepted`, component birth, the `SRS`/`SDD` skeletons, the two structure maps |
115
- | `wdi-problem` | `.what/_product-brief/` |
116
- | `wdi-product` | `.what/_prd/<initiative>/` |
117
- | `wdi-blueprint` | `.what/<pc>/` § Actor Register + § UC Catalogue + `03-domain/domain-model.md` · `.what/business-rules.md` · `.control/product-glossary.md` · all of `.how/_platform/` except `design-system.md` |
118
- | `wdi-component` | `.what/<pc>/` slots `02`–`05` · `.how/<pc>/` except `01-ux/` |
119
- | `wdi-ux` | `EXPERIENCE.md` · `.how/<pc>/01-ux/` · `.how/_platform/design-system.md` |
120
- | `wdi-build` | `specs.yaml` · `.scratch/<spec-id>-<slug>/` · `src/` · `web/` |
121
- | `wdi-decision` | `.control/decisions/` · `decisions.yaml`, and at apply time whatever `touches` names — through each file's owner |
122
- | `wdi-question` | `.control/questions/` |
123
- | `wdi-log` | `.control/meetings/` · `.control/project-non-technical-log.md` |
124
- | `wdi-report` | `.control/reports/<period>.md` |
125
- | a script | everything in `.control/generated/`, and the three inventories once code exists |
126
-
127
- Five skills write **no file at all**, and that is deliberate: `wdi-reconcile`, `wdi-help`, `wdi-explain-to-me`,
128
- `wdi-report` intent `dispatch`, and `wdi-review` apart from one frontmatter block. What reports MUST NOT
129
- also change things — otherwise there is nothing left to check with.
130
-
131
- ## How the units of work line up
132
-
133
- `FR` is a **promise** and permanent; a spec is a **unit of work** and temporary; `SPEC.md` is the machine
134
- contract for one spec — written from size `M` up, and at `S` the tickets are the contract; a ticket is one
135
- vertical slice one builder takes to a green PR.
136
-
137
- One spec = one parent issue, and a ticket is an **issue**, not a sub-task, because its blocking edges are
138
- what make the frontier visible in the tracker's own UI. **`FR` is not an issue** — it travels as a label,
139
- because one `FR` can be delivered by tickets in two specs and one ticket can satisfy part of two `FR`.
140
-
141
- The binding version of all of this, including why a spec MAY cross components and what has to be true
142
- first, is in `../document/delivery-flow-guide.md`. It is not restated here.
143
-
144
- ## What needs no template, and why
145
-
146
- Stated so the next completeness audit does not report it again:
147
-
148
- | File | Why it has no template |
149
- |---|---|
150
- | `.control/generated/*` | Script output. Its shape is code, not a template |
151
- | `.control/reports/<period>.md` | Rendered by `timeline.py` |
152
- | `.control/project-non-technical-log.md` | States its own entry shape in its own header, and there is exactly one such file |
153
- | `SPEC.md` · ticket files | Their shape belongs to `to-spec` and `to-tickets`. WDI owns where they land, not how they read |
154
- | Registry `*.yaml` | Their shape is the comment block at the head of each file, plus the validator |
155
-
156
- Everything else in this map has a template in `../document/templates/` — 26 of them, and every row above is
157
- covered by one.
1
+ ---
2
+ status: Reference
3
+ ---
4
+
5
+ # Artifact Map — what exists, where, and who owns it
6
+
7
+ **Opened when:** someone asks *"where does this file go"*, or *"does this document exist at my `mode`"*.
8
+
9
+ This file **explains**. It does not bind — `../document/*-guide.md` does, and where the two disagree the guide
10
+ wins and the disagreement is a defect to report.
11
+
12
+ It answers three questions and nothing else: which files exist at each `mode`, who owns each one, and how
13
+ the units of work line up. The **rules** about depth live in `../document/delivery-flow-guide.md`; what is
14
+ here is the map. What `mode` and `risk_accepted` do **together**, cell by cell, is in `mode-risk-map.md`.
15
+
16
+ ## The one thing to read first
17
+
18
+ Nine things exist at **every** `mode`, including `catalog`, because they belong to the blueprint at G3 and
19
+ the depth knob does not reach the blueprint:
20
+
21
+ > the use case list · the API list · the table list with its key columns · the screen list · the domain
22
+ > model · the actor list · the spine `AD-N` · C4 L1 + L2 + L3 · cross-component business rules
23
+
24
+ That is why nobody needs a fifth mode. The request behind wanting one is almost always *"I need at minimum
25
+ the use cases, the API, and the database"* — and all three are already in `catalog`.
26
+
27
+ ## What each mode gives you, cumulatively
28
+
29
+ | `mode` | What you hold |
30
+ |---|---|
31
+ | `catalog` | The nine above. **Zero extra files per component** |
32
+ | `outline` | + `Decision Summary` · the `LC` list per component · full flows for at most 3 use cases · local business rules |
33
+ | `guarded` | + `Failure Behaviour` for every boundary · `Inherited Constraints` · third-party integration documents · boundary `LC` registered |
34
+ | `deep` | + ABCE robustness analysis · five-lane contract spec per endpoint · data dictionary per column · flow diagrams · state machines · branch scenarios · every `critical` use case gets a full flow |
35
+
36
+ Marks used below: **always** = present at all four modes, born at G1, G2, or G3 · ✓ = written at that mode
37
+ · skeleton = the file exists carrying headings and frontmatter · — = not written at all.
38
+
39
+ ## `.what/`
40
+
41
+ | File | Holds | Born | `catalog` | `outline` | `guarded` | `deep` |
42
+ |---|---|---|---|---|---|---|
43
+ | `_product-brief/brief.md` | Problem, users, measure of success, non-goals | G1 | always | always | always | always |
44
+ | `_product-brief/addendum.md` | Depth that does not fit the brief's narrative | G1 | always | always | always | always |
45
+ | `_prd/<initiative>/prd.md` | `CAP` · `FR` · `NFR` · `UJ` · one proof of done per `FR` | G2 | always | always | always | always |
46
+ | `_prd/<initiative>/addendum.md` | Rejected alternatives, option matrices, sizing | G2 | always | always | always | always |
47
+ | `experience.md` | The experience every component keeps: foundation, IA, voice, flow map, journeys across components | G2, optional | optional | optional | optional | optional |
48
+ | `<pc>/04-usecases/EXPERIENCE.md` | The user-facing journey | G2, optional | optional | optional | optional | optional |
49
+ | `business-rules.md` | `BR-N` binding more than one component | G3 | always | always | always | always |
50
+ | **`<pc>/SRS-<pc>.md`** | § Actor Register · **§ UC Catalogue — this is the use case list** · Constraints · Non-Goals · Prerequisite · Assumptions/Risks/TBC | G3 | **always** | always | always | always |
51
+ | `<pc>/03-domain/domain-model.md` | Entities · relations · columns | G3 | always | always | always | always |
52
+ | `<pc>/02-rules/rules-<pc>.md` | Rules binding only this component | G4 | — | ✓ | ✓ | ✓ |
53
+ | `<pc>/04-usecases/UC-<n>-<slug>.md` | One full flow, at most eight steps | G4 | — | max **3** | max **3** | every `critical` UC |
54
+ | `<pc>/03-domain/state-machines.md` | The lifecycle of each multi-state entity | G4 | — | — | — | ✓ |
55
+ | `<pc>/05-scenarios/SCN-<nn>-<slug>.md` | A branch that does not fit its use case file | G4 | — | — | — | ✓ |
56
+
57
+ **So `SRS-<pc>.md` exists at `mode: catalog`.** It carries the actor list and the use case catalogue. What
58
+ is absent there is the `UC-<n>-<slug>.md` files — the step-by-step flows.
59
+
60
+ Repealed: `<pc>/01-requirements/` (permanently empty; `FR` live in the PRD and the SRS cites them) and
61
+ `<pc>/supplements/` (existed for `ANX-`).
62
+
63
+ ## `.how/`
64
+
65
+ | File | Holds | Born | `catalog` | `outline` | `guarded` | `deep` |
66
+ |---|---|---|---|---|---|---|
67
+ | `_platform/ARCHITECTURE-SPINE.md` | `AD-N` — Binds · Prevents · Rule. Invariants only | G3 | always | always | always | always |
68
+ | `_platform/c4-l1-system-context.md` | System, outside actors, outside systems | G3 | always | always | always | always |
69
+ | `_platform/c4-l2-containers.md` | Containers, their technology, their relations, and the PC × container matrix. **Owns the container list** | G3 | always | always | always | always |
70
+ | `_platform/c4-l3-<container>.md` | One file per `built: true` container holding more than one Product Component | G3 | always | always | always | always |
71
+ | **`_platform/inventory-db.md`** | **Table list**: `No` · table · owning component · what it holds · **key columns** | G3 | **always** | always | always | always |
72
+ | **`_platform/inventory-api.md`** | **Endpoint list**: `No` · method · path · owning component · description · status | G3 | **always** | always | always | always |
73
+ | **`_platform/inventory-screen.md`** | **Screen list**: `No` · screen · route · owning component · actor · `UC` served | G3 | **always** | always | always | always |
74
+ | `_platform/cross-cutting.md` | One error envelope for the whole product, and the rest of what is shared | G3 | always | always | always | always |
75
+ | `_platform/design-system.md` | Tokens, base elements, and the build patterns every component shares | G2, optional | optional | optional | optional | optional |
76
+ | `<pc>/SDD-<pc>.md` § Decision Summary | What this component is built as, and the costliest choices reversed | G4 | skeleton | ✓ | ✓ | ✓ |
77
+ | `<pc>/SDD-<pc>.md` § Structure | The `LC` list and their dependency direction | G4 | skeleton | ✓ | ✓ | ✓ |
78
+ | `<pc>/SDD-<pc>.md` § Inherited Constraints | The `AD-N` binding this component, quoted not paraphrased | G4 | — | — | ✓ | ✓ |
79
+ | **`<pc>/SDD-<pc>.md` § Failure Behaviour** | Per boundary: the other side slow, absent, or lying | G4 | — | — | **✓ every boundary** | ✓ |
80
+ | `<pc>/SDD-<pc>.md` § Robustness Analysis | ABCE per `critical` use case | G4 | — | — | — | ✓ |
81
+ | `<pc>/03-integrations/<name>.md` | A third party: who owns it, and what happens when they change it | G4 | — | — | ✓ if any | ✓ |
82
+ | `<pc>/02-contracts/00-inventory.md` | This component's endpoints, stably numbered | G4 | — | — | — | ✓ |
83
+ | `<pc>/02-contracts/<nn>-<resource>.md` | One endpoint, five lanes: auth · validation · error · rate limit · idempotency | G4 | — | — | — | ✓ |
84
+ | `<pc>/04-components/<name>.md` | Services and jobs | G4 | — | — | — | ✓ |
85
+ | `<pc>/05-model/data-model.md` | Component ERD + **data dictionary per column** | G4 | — | — | — | ✓ |
86
+ | `<pc>/06-flows/<nn>-<flow>.md` | Sequence diagram, only for money, irreversible state, or a third party | G4 | — | — | — | ✓ |
87
+ | `<pc>/01-ux/<screen>.md` | Screens and composites, **field detail per form** | G4 | — | — | — | ✓, or earlier via `wdi-ux` |
88
+
89
+ Repealed: `_platform/architecture/` (one file does not earn a folder) and `<pc>/supplements/`.
90
+
91
+ ## Registry and derived files
92
+
93
+ | File | Holds | Present at |
94
+ |---|---|---|
95
+ | `.control/registry/goals.yaml` | `BG` | every mode |
96
+ | `.control/registry/requirements-<slug>.yaml` | `CAP` · `FR` · `NFR` · `UJ`, one file per PRD initiative | every mode |
97
+ | `.control/registry/usecases.yaml` | `UC-N` with `critical` and the `FR` it satisfies | every mode |
98
+ | `.control/registry/components.yaml` → `product_components` | Component · `mode` · `risk_accepted` · `risk_note` · `owns` · `g4_passed` | every mode |
99
+ | `.control/registry/components.yaml` → `containers` | The containers from C4 L2 | every mode |
100
+ | `.control/registry/components.yaml` → `platform_owns` | Entities no Product Component's promise explains. `_platform` is not a component and has no `mode` | every mode |
101
+ | `.control/registry/components.yaml` → `logical_components` | `LC` | boundary from `guarded`; boundary + control at `deep` |
102
+ | `.control/registry/decisions.yaml` · `specs.yaml` · `defects.yaml` · `risks.yaml` · `index.yaml` | Decisions · work · defects · risks · the global `mode` and gate map | every mode |
103
+ | `.how-rendered/blueprint.md` | **The one-page roll-up reviewed at G3** | every mode |
104
+ | `.control/generated/decisions.md` | The flat index of every `DEC-` | every mode |
105
+ | `.control/generated/estimate.md` | The candidate task table | every mode |
106
+ | `.control/generated/rtm` · `status` · `dag` · `components` · `risks` | Traceability and progress | every mode |
107
+
108
+ ## Who owns each file
109
+
110
+ A skill lands the output of the layer it owns, and landing is part of producing it — never a follow-up
111
+ someone else performs. `../document/corpus-guide.md` holds the binding version of this table.
112
+
113
+ | Owner | Writes |
114
+ |---|---|
115
+ | `wdi-init` | The registry scaffold, `mode`, `risk_accepted`, component birth, the `SRS`/`SDD` skeletons, the two structure maps |
116
+ | `wdi-problem` | `.what/_product-brief/` |
117
+ | `wdi-product` | `.what/_prd/<initiative>/` |
118
+ | `wdi-blueprint` | `.what/<pc>/` § Actor Register + § UC Catalogue + `03-domain/domain-model.md` · `.what/business-rules.md` · `.control/product-glossary.md` · all of `.how/_platform/` except `design-system.md` |
119
+ | `wdi-component` | `.what/<pc>/` slots `02`–`05` · `.how/<pc>/` except `01-ux/` |
120
+ | `wdi-ux` | `.what/experience.md` · `EXPERIENCE.md` · `.how/<pc>/01-ux/` · `.how/_platform/design-system.md` |
121
+ | `wdi-build` | `specs.yaml` · `.scratch/<spec-id>-<slug>/` · `src/` · `web/` |
122
+ | `wdi-decision` | `.control/decisions/` · `decisions.yaml`, and at apply time whatever `touches` names — through each file's owner |
123
+ | `wdi-question` | `.control/questions/` |
124
+ | `wdi-log` | `.control/meetings/` · `.control/project-non-technical-log.md` |
125
+ | `wdi-report` | `.control/reports/<period>.md` |
126
+ | a script | everything in `.control/generated/`, and the three inventories once code exists |
127
+
128
+ Five skills write **no file at all**, and that is deliberate: `wdi-reconcile`, `wdi-help`, `wdi-explain-to-me`,
129
+ `wdi-report` intent `dispatch`, and `wdi-review` apart from one frontmatter block. What reports MUST NOT
130
+ also change things — otherwise there is nothing left to check with.
131
+
132
+ ## How the units of work line up
133
+
134
+ `FR` is a **promise** and permanent; a spec is a **unit of work** and temporary; `SPEC.md` is the machine
135
+ contract for one spec — written from size `M` up, and at `S` the tickets are the contract; a ticket is one
136
+ vertical slice one builder takes to a green PR.
137
+
138
+ One spec = one parent issue, and a ticket is an **issue**, not a sub-task, because its blocking edges are
139
+ what make the frontier visible in the tracker's own UI. **`FR` is not an issue** — it travels as a label,
140
+ because one `FR` can be delivered by tickets in two specs and one ticket can satisfy part of two `FR`.
141
+
142
+ The binding version of all of this, including why a spec MAY cross components and what has to be true
143
+ first, is in `../document/delivery-flow-guide.md`. It is not restated here.
144
+
145
+ ## What needs no template, and why
146
+
147
+ Stated so the next completeness audit does not report it again:
148
+
149
+ | File | Why it has no template |
150
+ |---|---|
151
+ | `.control/generated/*` | Script output. Its shape is code, not a template |
152
+ | `.control/reports/<period>.md` | Rendered by `timeline.py` |
153
+ | `.control/project-non-technical-log.md` | States its own entry shape in its own header, and there is exactly one such file |
154
+ | `SPEC.md` · ticket files | Their shape belongs to `to-spec` and `to-tickets`. WDI owns where they land, not how they read |
155
+ | Registry `*.yaml` | Their shape is the comment block at the head of each file, plus the validator |
156
+
157
+ Everything else in this map has a template in `../document/templates/` — 26 of them, and every row above is
158
+ covered by one.
@@ -56,9 +56,26 @@ others leaves a method that cannot run:
56
56
  | Set | Note |
57
57
  |---|---|
58
58
  | `.constitution/` | Minus the product articles; `promote` / `install` handle the seam |
59
- | `.claude/skills/wdi-*/` (and `.agents/skills/wdi-*/` when those agents are selected) | Every wrapper. A wrapper without its guide, or a guide without its wrapper, is half a method |
59
+ | `.<host>/skills/wdi-*/` for every host selected at install | Every wrapper. A wrapper without its guide, or a guide without its wrapper, is half a method |
60
60
  | `_bmad/custom/*.toml` | The one most likely to be forgotten. `*.user.toml` stays behind |
61
- | `AGENTS.md` | The routing table is the method; from `## Code` down is the product. `install` / `update` MUST NOT overwrite an existing `AGENTS.md` |
61
+ | `AGENTS.md`, and each rule file a selected host reads beside it | The routing table is the method; from `## Code` down is the product. `install` / `update` MUST NOT overwrite an existing `AGENTS.md` |
62
+
63
+ ## One method, many hosts
64
+
65
+ The method runs on every host the installer offers, and each host differs in five ways that matter.
66
+ `lib/platforms.mjs` in the package is the one record of them; `install` writes the selected hosts into
67
+ `.control/wdi-method.yaml` under `hosts:`, and the skills and `validate.py` read them from there.
68
+
69
+ | Difference | What the method does about it |
70
+ |---|---|
71
+ | **Where skills are read** (`reads:`) | The `wdi-*` skills go to each host's own folder. The six engines MUST be in a folder every selected host reads — Kiro reads only `.kiro/skills` — and `npx wdi-method engines` names the `npx skills add --agent` that puts them there |
72
+ | **How a skill is loaded** | Through the host's own mechanism: a skill tool where it has one, otherwise reading the whole `SKILL.md`. Both are invocation; a paraphrase is neither |
73
+ | **How a person types one** (`invoke:`) | `/name`, `$name`, `/skill:name`, `@name`, or asked for by name. `wdi-help` names the next skill in this host's form |
74
+ | **Manual-only** (`manual_only:`) | Three layers. The host's own lock where it has one (`disable-model-invocation`; `.claude/settings.json` deny rules; `opencode.json` `ask`). A guard line at the top of each manual-only skill. The `AGENTS.md` block, mirrored into every rule file a host reads. On a host with no lock the last two are all there is, and that is the host's limit, not a gap in the install |
75
+ | **A scheduler of its own** (`loop:`) | `wdi-daily-autopilot` and `wdi-autopilot` start it where it exists. Where it does not, they run one iteration per invocation — a shell loop or an OS scheduler is not a substitute |
76
+
77
+ A host the method dropped is named by `update` and left alone: its folders may hold the product's own
78
+ files too, so removing them is the owner's call.
62
79
 
63
80
  ## Two directions
64
81
 
@@ -43,8 +43,8 @@ NOT start the loop while any row in the first two groups is red.
43
43
  | **Engines** | BMad installed; every `wdi-*` skill the run will call present | A wrapper is missing — name it and `npx wdi-method update` |
44
44
  | | All six engines present IN this repo — `to-spec` · `to-tickets` · `implement` · `tdd` · `code-review` · `domain-modeling` — with the **path** of each `SKILL.md` | Any missing. `npx skills@latest add mattpocock/skills`; a user-level plugin does not count |
45
45
  | | The three flagged engines are **invocable**: no `disable-model-invocation` in the repo's copies | Any still flagged — no skill can invoke it, so Phase 2 would stall. `npx wdi-method engines --fix`, or the `wdi-init` / `wdi-upgrade` skill |
46
- | | The retired BMad G5 wrappers are locked out of model invocation, and `.claude/settings.json` denies them | Any still invocable. Same fix — BMad's installer restores its wrappers whenever it runs |
47
- | | This skill and `wdi-build` are themselves invocable — no `skillOverrides` entry in `settings.json` set to `off` or `user-invocable-only` | Either is overridden. Nothing else can start the loop, and the override is silent |
46
+ | | The retired BMad G5 wrappers are locked out of model invocation wherever this host offers a lock (`.claude/settings.json` deny rules, `opencode.json` `ask`) | Any still invocable. Same fix — BMad's installer restores its wrappers whenever it runs |
47
+ | | This skill and `wdi-build` are themselves invocable — on Claude Code, no `skillOverrides` entry in `settings.json` set to `off` or `user-invocable-only` | Either is overridden. Nothing else can start the loop, and the override is silent |
48
48
  | | The tracker the engines publish to is configured — `docs/agents/issue-tracker.md`, written once by `/setup-matt-pocock-skills` | Missing. `to-tickets` would stop to ask for it, and this skill never asks; the owner runs the setup before confirming |
49
49
  | | Reviewers separate from the builder can be dispatched | The session cannot spawn a second agent and any touched component is `risk_accepted: low` — Step 3 of `wdi-build` would block |
50
50
  | | `.constitution/project/codebase-stack-guide.md` names build and test commands, **and the test command exits 0 here** (prefer quiet output flags, e.g. `-- --quiet`, to keep context compact; on non-zero exit, surface the failure details and abort preflight) | Absent or failing. Every ticket's "full suite green once" and the smoke test read it. Found at minute one, not at hour six |
@@ -57,8 +57,8 @@ NOT start the loop while any row in the first two groups is red.
57
57
  | **Settings** | `scope` — the `FR` ids to deliver, or `all` | — (default `all` open `FR`) |
58
58
  | | `parked` — what stops for the owner instead of being decided: any of `promise` · `ad-n` · `sensitive` | — (default **`ad-n`**, and nothing else. `decision-guide.md` says narrowing an invariant MUST NOT be softened further, so removing it is the owner's to say out loud — not a default they never saw) |
59
59
  | | `smoke_test` — `agent` or `owner` | — (default `agent`, and **`owner` when `codebase-stack-guide.md` names no way to run the app** — an agent cannot smoke-test what it cannot launch) |
60
- | | `loop` — the interval between iterations | — (default `5m`) |
61
- | | `expires` — the date the mandate lapses | — (default 7 days from today; a `/loop` task expires then too) |
60
+ | | `loop` — the interval between iterations | — (default `5m`). On a host with no scheduler of its own (`loop: none` in `hosts:`) the row reads **once** — see § Starting the loop |
61
+ | | `expires` — the date the mandate lapses | — (default 7 days from today; a scheduled task expires then too) |
62
62
  | | Where the ledger and the final report will be written | — |
63
63
  | | The **run branch** — `autopilot/<mandate-id>`, using the next free `DEC-` id from `decisions.yaml`, which the mandate then takes — and that the run will open **one** PR from it | The branch already exists with commits nobody can account for |
64
64
  | **Runtime** | The session runs with permission prompts bypassed | Cannot be verified from inside the session. Printed as a line the owner confirms |
@@ -69,15 +69,16 @@ the same rule the installer follows. A preflight that asks fourteen questions on
69
69
 
70
70
  ### The engines are invoked — there is no route to find
71
71
 
72
- `to-spec`, `to-tickets` and `implement` ship with `disable-model-invocation: true`, which blocks the Skill
73
- tool for this session and every subagent, and no setting lifts it: the gate reads the frontmatter and
74
- consults nothing else. Two releases of this skill worked around that by reading the engine's `SKILL.md`
75
- and carrying out its process. **That route is retired.** The engines are installed in the repo, the
76
- installer strips the flag from the repo's own copies, and `wdi-build` invokes them like any other skill.
72
+ `to-spec`, `to-tickets` and `implement` ship with `disable-model-invocation: true`. Where the host
73
+ honours that key it blocks every model-initiated load, and no setting lifts it. The engines are installed
74
+ in the repo, the installer strips the flag from the repo's own copies, and `wdi-build` invokes them like
75
+ any other skill — through the host's own skill mechanism, which on a host with no skill tool is reading the
76
+ engine's whole `SKILL.md` from the repo (`wdi-build` § All six engines).
77
77
 
78
- What preflight checks is therefore not *which route exists* but *whether the flag is back* — `npx skills
79
- update` restores the author's file byte for byte, and `engines-invocable` in `validate.py` is red when it
80
- has. A stalled Phase 2 three hours into an unattended run is what this replaces.
78
+ What preflight checks is therefore not *which route exists* but *whether the flag is back* and *whether
79
+ this host can see the engines* — `npx skills update` restores the author's file byte for byte, an engine
80
+ installed for one host is invisible to another, and `engines-invocable` in `validate.py` is red for both.
81
+ A stalled Phase 2 three hours into an unattended run is what this replaces.
81
82
 
82
83
  The `to-tickets` quiz — granularity and blocking edges — is still **answered by this skill**: ticket
83
84
  count from the size table in `delivery-flow-guide.md`, edges from `depends_on` and `touches`. The answers
@@ -96,19 +97,31 @@ On the owner's confirmation, and not before:
96
97
  `smoke_test` · `loop` · `expires` — live **only** on its row in `decisions.yaml`; the file carries
97
98
  Decision, Why, and Cost, and points at the row. One fact, one home.
98
99
  2. Write the ledger header — see § The ledger.
99
- 3. Start the loop. In Claude Code, invoke the `loop` skill with `<interval> /wdi-autopilot`. Where that is
100
- not available, print the command for the owner to type, and name the alternative the platform has:
100
+ 3. Start the loop — § Starting the loop.
101
101
 
102
- ```
103
- /loop 5m /wdi-autopilot
104
- ```
102
+ ### Starting the loop
103
+
104
+ The loop is the **host's own scheduler**, and nothing else counts: a shell `while`, an OS cron job, or a
105
+ second agent firing this one is not a loop this skill starts. Read this host's `loop:` from `hosts:` in
106
+ `.control/wdi-method.yaml` (the entry whose `id` is the host running this session):
107
+
108
+ | `loop:` | What this skill does |
109
+ |---|---|
110
+ | `{kind: command, how: …}` | Types the command, filling `{interval}` and `{prompt}` (`/wdi-autopilot`) — e.g. `/loop 5m /wdi-autopilot` on Claude Code |
111
+ | `{kind: scheduler, how: …}` | Creates the schedule the way `how` names it, with the same interval and prompt |
112
+ | `none` | **Runs one iteration now**, in this turn (Door 2), and reports that this host has no scheduler: the next iteration starts when the owner invokes this skill again. The mandate, the ledger, and the branch carry over unchanged, so each invocation resumes where the last stopped |
113
+
114
+ A host missing from `hosts:` (an old stamp) is treated as `none`. The `none` row is not a lesser run: one
115
+ iteration works as far as it safely can, exactly as a scheduled one does, and stops only at the same three
116
+ stops.
105
117
 
106
118
  The interval is the **pause between** iterations, not the length of one. An iteration that outlives it
107
- finishes first; the next firing waits.
119
+ finishes first; the next firing waits. "Cancel the loop", wherever this skill says it, means cancelling
120
+ that scheduled task; where there is none, it means nothing further is started.
108
121
 
109
122
  **Session survivability across environments:**
110
123
  - **Linux / Remote SSH:** Run inside a session manager such as `tmux` (`tmux new -s autopilot`) or `screen` before starting the loop. Disconnecting SSH or closing the terminal then leaves the autonomous loop running unharmed.
111
- - **Windows (PowerShell / Windows Terminal):** `tmux` is not native to Windows PowerShell. Run the session in a dedicated persistent Windows Terminal tab or window left active, or via background subagent tools (`run_in_background`). Do not invoke or require `tmux` on Windows environments.
124
+ - **Windows (PowerShell / Windows Terminal):** `tmux` is not native to Windows PowerShell. Run the session in a dedicated persistent Windows Terminal tab or window left active. Do not invoke or require `tmux` on Windows environments.
112
125
 
113
126
  ## Door 2 — One iteration
114
127