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,202 +1,204 @@
1
- ---
2
- status: Accepted
3
- ---
4
-
5
- # Structure Guide
6
-
7
- **Loaded when:** writing, reading, or refreshing a structure map — `.control/structure-codebase.md`
8
- or `.control/structure-document.md`.
9
-
10
- ## Two maps
11
-
12
- | Map | Describes | Derived | Refreshed by |
13
- |---|---|---|---|
14
- | `.control/structure-codebase.md` | The code tree: what runs, what it is built from, where new code goes | `wdi-init` intent `structure` | `wdi-init` intent `structure` |
15
- | `.control/structure-document.md` | The corpus tree: which layers and slots actually carry content today | `wdi-init` intent `structure` | `wdi-init` intent `structure` |
16
-
17
- Both ship as empty skeletons, so the slot is taken from day one. The first run replaces a skeleton
18
- **wholesale** rather than filling it in; a half-derived map that still carries skeleton headings
19
- cannot be told apart from a stale one. The intent MAY be run read-only — derive, report the drift,
20
- write nothing — and that is the right mode when the caller is unsure.
21
-
22
- **The maps live in `.control/`, this guide lives here, and the split is deliberate.** A guide states
23
- a rule that holds before the thing exists; a map states what is currently true. That is the same
24
- line the kit already draws between `decision-guide.md` and `.control/decisions/`, and between
25
- `corpus-guide.md` and `.control/registry/`. The two MUST NOT be merged, and a map MUST NOT be moved
26
- into `.constitution/` because it happens to be read alongside these guides.
27
-
28
- Consequence worth knowing: `.control/` is `{project_knowledge}`, so both maps are visible to the
29
- BMad skills that read it. That is intended — a builder that knows where code goes is the point.
30
-
31
- ## Descriptive, not prescriptive — the line that MUST hold
32
-
33
- This is the whole reason the maps can exist without colliding with the guides already in
34
- `.constitution/`.
35
-
36
- | Question | Answered by |
37
- |---|---|
38
- | Where does this live, and what is already there? | **structure map** |
39
- | Which layer owns it, and what is it named? | `document/corpus-guide.md` |
40
- | How is code named, and which patterns apply? | `../project/codebase-conventions-guide.md` |
41
- | What is it built with, and on which version? | `../project/codebase-stack-guide.md` |
42
- | Which legacy shapes are ratified rather than fixed? | `../project/codebase-brownfield-guide.md` |
43
-
44
- - A structure map MUST NOT restate a naming rule, a layer rule, or a version. It MUST reference the
45
- guide that owns it.
46
- - A guide MUST NOT carry a directory tree. A tree in a guide goes stale silently, because nothing
47
- refreshes it.
48
- - Where a map and a guide disagree, the **guide** wins on the rule and the **map** wins on the fact.
49
- The disagreement itself MUST be reported, not smoothed over — one of the two is lying.
50
-
51
- ## What a map MUST contain
52
-
53
- 1. A **Verified** line: date plus the commit the tree was read at.
54
- 2. A **top-level tree**: every base folder in the root, complete, one annotated line each.
55
- 3. A **section per unit**, each carrying its folder convention as an annotated tree.
56
- 4. **Key files marked `★` inline**, inside those trees.
57
-
58
- Nothing else. A map that also explains how the system works has become an architecture document,
59
- and `.how/` already owns that.
60
-
61
- The form is an **annotated tree**, not prose and not a file table. A tree shows convention and
62
- location in the same glance, and a `★` next to a filename is read at the moment it matters. Both
63
- maps MUST close with the one-line legend for `★`.
64
-
65
- ## How units are split
66
-
67
- Each map splits its sections along the axis its reader is lost on, and the two axes differ:
68
-
69
- | Map | Sections | Split by |
70
- |---|---|---|
71
- | `structure-codebase.md` | Containers · Libraries · the non-unit sections below | **Deployability** |
72
- | `structure-document.md` | One per layer that carries content | **Layer** |
73
-
74
- For the codebase map the distinction is exact and MUST NOT be softened:
75
-
76
- - A **container** runs its own code or stores its own data, and can be replaced without rebuilding
77
- another one. `architecture-guide.md` owns the two-question test; this map only applies it. The term
78
- MUST NOT be renamed to "application", "service", or "app" here — a synonym for a term that already
79
- has a glossary entry is drift, and `wdi-reconcile` hunts for it. It does not mean a Docker image.
80
- - A **library** is an includable artifact — compiled into or imported by something else, never run
81
- on its own. A library with an entry point is a container wearing the wrong label, and a library
82
- MUST NOT appear at C4 L2.
83
- - Anything that is neither is not a unit. It stays a line in the top-level tree, or in one of the
84
- non-unit sections below.
85
- - A unit that stops being separately deployable MUST move sections, not keep its old heading.
86
-
87
- ### The registry match is one-directional
88
-
89
- **Every container heading MUST be a container registered in `components.yaml`. Not every registered
90
- container gets a heading.** Reading it both ways makes the rule unsatisfiable: a `built: false` container
91
- — a database, a web server — MUST be registered, because it runs inside the boundary and carries NFRs,
92
- and MUST NOT get a heading, because no code of ours lives there. So the check is **heading = exactly the
93
- `built: true` containers**, and `container-built` runs it. `c4-l2-containers.md` still owns the list itself.
94
-
95
- ### Sections that are not units
96
-
97
- Containers and Libraries are the unit sections. A map MAY also carry sections for what is not a unit at
98
- all, and these MUST NOT be dressed up as containers to earn a place:
99
-
100
- | Section | Holds |
101
- |---|---|
102
- | **Tooling** | Scripts run by a human or by CI, never deployed |
103
- | **Generated** | Output, named with its generator — that is what makes a hand edit visible |
104
- | **Unclaimed** | A folder that exists with no stated purpose. A finding, not a category |
105
-
106
- The list is open, the test is not: a section that is neither a unit nor one of these MUST say in one line
107
- why it exists.
108
-
109
- ## Base folders — complete
110
-
111
- - MUST list every base folder that exists, including the ones that look uninteresting. An unlisted
112
- folder is the one people misuse, because nothing told them what it was for.
113
- - MUST descend only until directories stop carrying distinct roles. A shape that repeats MUST be
114
- described once, generically, rather than enumerated per instance.
115
- - MUST mark a folder that exists but has no stated purpose as unclaimed instead of inventing one.
116
- An unclaimed folder is a finding, and `wdi-init` MUST report it.
117
- - MUST NOT list a folder that the architecture implies but no file has created yet.
118
-
119
- ## Key files — selective
120
-
121
- A file earns a `★` only if it passes one of these:
122
-
123
- - It is an entry point, a composition root, or where dependencies get wired.
124
- - It is the single place a rule is enforced for the whole tree below it.
125
- - An agent asked to change behaviour in that folder would have to open it first.
126
- - Removing it would change what the folder *is*, not merely what it does.
127
-
128
- Everything else MUST be left out. Completeness at file level is what killed every source-tree
129
- document that came before: it is impossible to keep true, so it stops being read.
130
-
131
- A folder with no key file MUST still appear in the tree. Folders are complete; files are not.
132
-
133
- ## Freshness — this is a living document
134
-
135
- - The **Verified** line MUST carry a date and a commit SHA. Without the SHA, staleness cannot be
136
- measured, only felt.
137
- - A map MUST be refreshed when a base folder is born or removed, when a key file moves or is
138
- renamed, when a project or container is added, or when a key file's role changes.
139
- - **Spec close** carries this hook — it left the ticket-closing checklist along with four other items,
140
- because a structural change is visible at the end of a spec and guessed at the end of a ticket.
141
- - A map MUST NOT be edited by hand. `wdi-init` intent `structure` re-derives it from the actual tree;
142
- a hand edit records what someone remembers, and memory is exactly what the map exists to replace.
143
- - A map whose **Verified** commit is no longer an ancestor of `HEAD` SHOULD be treated as stale, and
144
- MUST be refreshed before a gate that reads it.
145
-
146
- ## `structure-codebase.md` — specifics
147
-
148
- - Born as a skeleton listing only what exists. On an empty repo that is almost nothing, and that is
149
- correct: writing the tree the spine implies means guessing.
150
- - Each unit's tree MUST show its **folder convention** — including the shape a feature repeats,
151
- written once with a placeholder, never enumerated per feature.
152
- - Each container MUST mark its entry point and its composition root with `★`. A container whose
153
- tree has neither has not been read properly.
154
- - Each container SHOULD carry one **Flow** line: the authoritative call direction through its
155
- folders. A builder who gets that wrong writes code that works and is still wrong. MUST NOT be
156
- invented where none exists.
157
- - Each library MUST state who consumes it. A library nobody consumes is a finding.
158
- - Generated output MUST be named with its generator, even when it looks like ordinary source — that
159
- is what makes a hand edit visible.
160
- - MUST NOT carry framework versions, and MUST NOT repeat the suffix list from
161
- `conventions-guide.md`. Where new code goes is answered by the convention tree itself; how it is
162
- named is not this file's question.
163
-
164
- ## `structure-document.md` — specifics
165
-
166
- - The four layers and the workspace are fixed by `corpus-guide.md`. This map records which of them
167
- actually carry content: which Product Component folders exist, which slots have been split out of
168
- a kernel, which registries are populated.
169
- - MUST reference the placement test rather than restating it, and MUST NOT explain slot numbering —
170
- `corpus-guide.md` owns both.
171
- - MUST list every Product Component folder that exists in `.what/` or `.how/`, and MUST flag any
172
- that exists on one side only. A PC with an SRS and no SDD is drift, not layout.
173
- - Product Component folders MUST live in the table, and MUST NOT also be expanded in the per-layer
174
- trees. Maintaining the same fact in two places is how one of them starts lying.
175
-
176
- ## File names MUST survive every OS the repo is cloned on
177
-
178
- This is the one structural rule that is not about where a file sits but about whether it can exist at
179
- all. It applies to every file any skill in this method creates — corpus documents, generated tables,
180
- spec folders, and code alike.
181
-
182
- | Rule | Detail |
183
- |---|---|
184
- | Forbidden characters | `\ / : * ? " < > \|` MUST NOT appear in a file or folder name |
185
- | Substitution | A forbidden character MUST be replaced by `-` or dropped, and the substitution MUST be consistent across the repo |
186
- | Trailing characters | A name MUST NOT end in a space or a `.` — Windows strips both silently, and the read path then no longer matches the write path |
187
- | Length | A single path segment SHOULD stay under 255 characters |
188
-
189
- The failure this prevents is not cosmetic. A repository whose branches carry `:` in a filename
190
- **cannot be checked out on Windows at all** — `git checkout` fails outright, and recovering the
191
- content takes per-blob extraction plus a rename map. That has happened in a sibling repo, which is
192
- why this is stated as a rule rather than left to taste.
193
-
194
- A name derived from something else — an endpoint path, a URL, a title — MUST be sanitised at the
195
- moment it becomes a filename, and the mapping SHOULD be recorded when it is not reversible by
196
- inspection.
197
-
198
- ## Writing rules
199
-
200
- Inherited from `.constitution/`: normative keyword on every instruction, concise, no duplication,
201
- English, SHOULD stay under 200 lines. A map that outgrows 200 lines is marking files that never
202
- earned a `★` — cut those, never the folders.
1
+ ---
2
+ status: Accepted
3
+ ---
4
+
5
+ # Structure Guide
6
+
7
+ **Loaded when:** writing, reading, or refreshing a structure map — `.control/structure-codebase.md`
8
+ or `.control/structure-document.md`.
9
+
10
+ ## Two maps
11
+
12
+ | Map | Describes | Derived | Refreshed by |
13
+ |---|---|---|---|
14
+ | `.control/structure-codebase.md` | The code tree: what runs, what it is built from, where new code goes | `wdi-init` intent `structure` | `wdi-init` intent `structure` |
15
+ | `.control/structure-document.md` | The corpus tree: which layers and slots actually carry content today | `wdi-init` intent `structure` | `wdi-init` intent `structure` |
16
+
17
+ Both ship as empty skeletons, so the slot is taken from day one. The first run replaces a skeleton
18
+ **wholesale** rather than filling it in; a half-derived map that still carries skeleton headings
19
+ cannot be told apart from a stale one. The intent MAY be run read-only — derive, report the drift,
20
+ write nothing — and that is the right mode when the caller is unsure.
21
+
22
+ **The maps live in `.control/`, this guide lives here, and the split is deliberate.** A guide states
23
+ a rule that holds before the thing exists; a map states what is currently true. That is the same
24
+ line the kit already draws between `decision-guide.md` and `.control/decisions/`, and between
25
+ `corpus-guide.md` and `.control/registry/`. The two MUST NOT be merged, and a map MUST NOT be moved
26
+ into `.constitution/` because it happens to be read alongside these guides.
27
+
28
+ Consequence worth knowing: `.control/` is `{project_knowledge}`, so both maps are visible to the
29
+ BMad skills that read it. That is intended — a builder that knows where code goes is the point.
30
+
31
+ ## Descriptive, not prescriptive — the line that MUST hold
32
+
33
+ This is the whole reason the maps can exist without colliding with the guides already in
34
+ `.constitution/`.
35
+
36
+ | Question | Answered by |
37
+ |---|---|
38
+ | Where does this live, and what is already there? | **structure map** |
39
+ | Which layer owns it, and what is it named? | `document/corpus-guide.md` |
40
+ | How is code named, and which patterns apply? | `../project/codebase-conventions-guide.md` |
41
+ | What is it built with, and on which version? | `../project/codebase-stack-guide.md` |
42
+ | Which legacy shapes are ratified rather than fixed? | `../project/codebase-brownfield-guide.md` |
43
+
44
+ - A structure map MUST NOT restate a naming rule, a layer rule, or a version. It MUST reference the
45
+ guide that owns it.
46
+ - A guide MUST NOT carry a directory tree. A tree in a guide goes stale silently, because nothing
47
+ refreshes it.
48
+ - Where a map and a guide disagree, the **guide** wins on the rule and the **map** wins on the fact.
49
+ The disagreement itself MUST be reported, not smoothed over — one of the two is lying.
50
+
51
+ ## What a map MUST contain
52
+
53
+ 1. A **Verified** line: date plus the commit the tree was read at.
54
+ 2. A **top-level tree**: every base folder in the root, complete, one annotated line each.
55
+ 3. A **section per unit**, each carrying its folder convention as an annotated tree.
56
+ 4. **Key files marked `★` inline**, inside those trees.
57
+
58
+ Nothing else. A map that also explains how the system works has become an architecture document,
59
+ and `.how/` already owns that.
60
+
61
+ The form is an **annotated tree**, not prose and not a file table. A tree shows convention and
62
+ location in the same glance, and a `★` next to a filename is read at the moment it matters. Both
63
+ maps MUST close with the one-line legend for `★`.
64
+
65
+ ## How units are split
66
+
67
+ Each map splits its sections along the axis its reader is lost on, and the two axes differ:
68
+
69
+ | Map | Sections | Split by |
70
+ |---|---|---|
71
+ | `structure-codebase.md` | Containers · Libraries · the non-unit sections below | **Deployability** |
72
+ | `structure-document.md` | One per layer that carries content | **Layer** |
73
+
74
+ For the codebase map the distinction is exact and MUST NOT be softened:
75
+
76
+ - A **container** runs its own code or stores its own data, and can be replaced without rebuilding
77
+ another one. `architecture-guide.md` owns the two-question test; this map only applies it. The term
78
+ MUST NOT be renamed to "application", "service", or "app" here — a synonym for a term that already
79
+ has a glossary entry is drift, and `wdi-reconcile` hunts for it. It does not mean a Docker image.
80
+ - A **library** is an includable artifact — compiled into or imported by something else, never run
81
+ on its own. A library with an entry point is a container wearing the wrong label, and a library
82
+ MUST NOT appear at C4 L2.
83
+ - Anything that is neither is not a unit. It stays a line in the top-level tree, or in one of the
84
+ non-unit sections below.
85
+ - A unit that stops being separately deployable MUST move sections, not keep its old heading.
86
+
87
+ ### The registry match is one-directional
88
+
89
+ **Every container heading MUST be a container registered in `components.yaml`. Not every registered
90
+ container gets a heading.** Reading it both ways makes the rule unsatisfiable: a `built: false` container
91
+ — a database, a web server — MUST be registered, because it runs inside the boundary and carries NFRs,
92
+ and MUST NOT get a heading, because no code of ours lives there. So the check is **heading = exactly the
93
+ `built: true` containers whose code is in this repo** — those without `repo:` — and `container-built`
94
+ runs it. A container whose `repo:` names another repository gets its heading in THAT repository's map;
95
+ `architecture-guide.md` § *`built`* owns the field. `c4-l2-containers.md` still owns the list itself.
96
+
97
+ ### Sections that are not units
98
+
99
+ Containers and Libraries are the unit sections. A map MAY also carry sections for what is not a unit at
100
+ all, and these MUST NOT be dressed up as containers to earn a place:
101
+
102
+ | Section | Holds |
103
+ |---|---|
104
+ | **Tooling** | Scripts run by a human or by CI, never deployed |
105
+ | **Generated** | Output, named with its generator — that is what makes a hand edit visible |
106
+ | **Unclaimed** | A folder that exists with no stated purpose. A finding, not a category |
107
+
108
+ The list is open, the test is not: a section that is neither a unit nor one of these MUST say in one line
109
+ why it exists.
110
+
111
+ ## Base folders — complete
112
+
113
+ - MUST list every base folder that exists, including the ones that look uninteresting. An unlisted
114
+ folder is the one people misuse, because nothing told them what it was for.
115
+ - MUST descend only until directories stop carrying distinct roles. A shape that repeats MUST be
116
+ described once, generically, rather than enumerated per instance.
117
+ - MUST mark a folder that exists but has no stated purpose as unclaimed instead of inventing one.
118
+ An unclaimed folder is a finding, and `wdi-init` MUST report it.
119
+ - MUST NOT list a folder that the architecture implies but no file has created yet.
120
+
121
+ ## Key files — selective
122
+
123
+ A file earns a `★` only if it passes one of these:
124
+
125
+ - It is an entry point, a composition root, or where dependencies get wired.
126
+ - It is the single place a rule is enforced for the whole tree below it.
127
+ - An agent asked to change behaviour in that folder would have to open it first.
128
+ - Removing it would change what the folder *is*, not merely what it does.
129
+
130
+ Everything else MUST be left out. Completeness at file level is what killed every source-tree
131
+ document that came before: it is impossible to keep true, so it stops being read.
132
+
133
+ A folder with no key file MUST still appear in the tree. Folders are complete; files are not.
134
+
135
+ ## Freshness — this is a living document
136
+
137
+ - The **Verified** line MUST carry a date and a commit SHA. Without the SHA, staleness cannot be
138
+ measured, only felt.
139
+ - A map MUST be refreshed when a base folder is born or removed, when a key file moves or is
140
+ renamed, when a project or container is added, or when a key file's role changes.
141
+ - **Spec close** carries this hook — it left the ticket-closing checklist along with four other items,
142
+ because a structural change is visible at the end of a spec and guessed at the end of a ticket.
143
+ - A map MUST NOT be edited by hand. `wdi-init` intent `structure` re-derives it from the actual tree;
144
+ a hand edit records what someone remembers, and memory is exactly what the map exists to replace.
145
+ - A map whose **Verified** commit is no longer an ancestor of `HEAD` SHOULD be treated as stale, and
146
+ MUST be refreshed before a gate that reads it.
147
+
148
+ ## `structure-codebase.md` — specifics
149
+
150
+ - Born as a skeleton listing only what exists. On an empty repo that is almost nothing, and that is
151
+ correct: writing the tree the spine implies means guessing.
152
+ - Each unit's tree MUST show its **folder convention** — including the shape a feature repeats,
153
+ written once with a placeholder, never enumerated per feature.
154
+ - Each container MUST mark its entry point and its composition root with `★`. A container whose
155
+ tree has neither has not been read properly.
156
+ - Each container SHOULD carry one **Flow** line: the authoritative call direction through its
157
+ folders. A builder who gets that wrong writes code that works and is still wrong. MUST NOT be
158
+ invented where none exists.
159
+ - Each library MUST state who consumes it. A library nobody consumes is a finding.
160
+ - Generated output MUST be named with its generator, even when it looks like ordinary source — that
161
+ is what makes a hand edit visible.
162
+ - MUST NOT carry framework versions, and MUST NOT repeat the suffix list from
163
+ `conventions-guide.md`. Where new code goes is answered by the convention tree itself; how it is
164
+ named is not this file's question.
165
+
166
+ ## `structure-document.md` — specifics
167
+
168
+ - The four layers and the workspace are fixed by `corpus-guide.md`. This map records which of them
169
+ actually carry content: which Product Component folders exist, which slots have been split out of
170
+ a kernel, which registries are populated.
171
+ - MUST reference the placement test rather than restating it, and MUST NOT explain slot numbering —
172
+ `corpus-guide.md` owns both.
173
+ - MUST list every Product Component folder that exists in `.what/` or `.how/`, and MUST flag any
174
+ that exists on one side only. A PC with an SRS and no SDD is drift, not layout.
175
+ - Product Component folders MUST live in the table, and MUST NOT also be expanded in the per-layer
176
+ trees. Maintaining the same fact in two places is how one of them starts lying.
177
+
178
+ ## File names MUST survive every OS the repo is cloned on
179
+
180
+ This is the one structural rule that is not about where a file sits but about whether it can exist at
181
+ all. It applies to every file any skill in this method creates — corpus documents, generated tables,
182
+ spec folders, and code alike.
183
+
184
+ | Rule | Detail |
185
+ |---|---|
186
+ | Forbidden characters | `\ / : * ? " < > \|` MUST NOT appear in a file or folder name |
187
+ | Substitution | A forbidden character MUST be replaced by `-` or dropped, and the substitution MUST be consistent across the repo |
188
+ | Trailing characters | A name MUST NOT end in a space or a `.` — Windows strips both silently, and the read path then no longer matches the write path |
189
+ | Length | A single path segment SHOULD stay under 255 characters |
190
+
191
+ The failure this prevents is not cosmetic. A repository whose branches carry `:` in a filename
192
+ **cannot be checked out on Windows at all** — `git checkout` fails outright, and recovering the
193
+ content takes per-blob extraction plus a rename map. That has happened in a sibling repo, which is
194
+ why this is stated as a rule rather than left to taste.
195
+
196
+ A name derived from something else — an endpoint path, a URL, a title — MUST be sanitised at the
197
+ moment it becomes a filename, and the mapping SHOULD be recorded when it is not reversible by
198
+ inspection.
199
+
200
+ ## Writing rules
201
+
202
+ Inherited from `.constitution/`: normative keyword on every instruction, concise, no duplication,
203
+ English, SHOULD stay under 200 lines. A map that outgrows 200 lines is marking files that never
204
+ earned a `★` — cut those, never the folders.
@@ -146,7 +146,7 @@ Named for the **gate they serve**, so *"which skill do I run"* is answered by *"
146
146
  | Skill | Its trigger |
147
147
  |---|---|
148
148
  | `wdi-daily-what-to-build` | Hand-testing notes to turn into a reviewed spec or ticket. Stops before code, commit, or push |
149
- | `wdi-daily-autopilot` | Start the daily loop: checks for an accepted mandate (preflight if none), resolves reviewers, launches `/loop` over `wdi-autopilot` |
149
+ | `wdi-daily-autopilot` | Start the daily loop: checks for an accepted mandate (preflight if none), resolves reviewers, starts the host's own scheduler over `wdi-autopilot` (one iteration where the host has none) |
150
150
  | `wdi-daily-what-to-test` | After a merge: sync, prune merged branches, prepare the app, build the hand-test checklist |
151
151
  | `wdi-prune-or-archive` | Closed specs to archive or prune, through `lifecycle.py` |
152
152