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,66 +1,96 @@
1
- ---
2
- type: design-system
3
- scope: _platform
4
- status: draft # draft · reviewed · locked · superseded
5
- created: '{YYYY-MM-DD}'
6
- ---
7
-
8
- # Design System — {product}
9
-
10
- <!-- TEMPLATE GUIDE — act on these comments, then delete them.
11
-
12
- Home: .how/_platform/design-system.md. Written by wdi-ux, and it is the ONE file in _platform/
13
- that wdi-blueprint does not own. Optional, like the rest of UX: it exists when the interface is
14
- a substantial part of what the PRD promises.
15
-
16
- WHY IT IS NOT IN A COMPONENT: tokens and base elements cross Product Components by definition. A
17
- colour scale living in one component's 01-ux/ is a colour scale the other six will each redefine.
18
-
19
- WHY ux.md DOES NOT SERVE IT: ux.md is the shape of DESIGN.md and EXPERIENCE.md, which are per
20
- component. This is the third file, at product level, and it had no template at all.
21
-
22
- THE CODE IS THE SSOT FOR VALUES. Where this repo's web side states a token in tokens.css, this
23
- file MUST reference it rather than repeat the value. Two homes for one hex code is two hex codes
24
- within a month. Read web/README.md before writing anything here — it is the authority for the
25
- web side, and it MUST NOT be contradicted from this file.
26
-
27
- Token and element NAMES are English: they are machine-facing keys, per language-guide.md. -->
28
-
29
- ## Where the values actually live
30
-
31
- <!-- One line per source of truth — the stylesheet, the config, the generated file — with its path.
32
- This section is what stops the rest of the document becoming a stale copy. -->
33
-
34
- ## Tokens
35
-
36
- <!-- One table per scale. Name, what it is for, and where it resolves. NOT the raw value, unless this
37
- file is genuinely the only place it exists. -->
38
-
39
- | Token | For | Resolves in |
40
- | --- | --- | --- |
41
-
42
- ## Base elements
43
-
44
- <!-- The LC type `ui-element`, registered in components.yaml. One row each: what it is, its states,
45
- and where its implementation lives. A composite reused across screens is `ui-composite` and
46
- belongs in .how/<pc>/01-ux/, not here. -->
47
-
48
- | Element | States it MUST support | Implementation |
49
- | --- | --- | --- |
50
-
51
- <!-- Every element MUST state its empty, loading, error, and disabled states where they apply. The
52
- populated state is the one that always gets designed; the others are the ones that ship broken. -->
53
-
54
- ## Rules that bind every screen
55
-
56
- <!-- Only what a screen cannot legitimately override. Each MUST state what it prevents — a rule with
57
- no failure behind it is a preference, and preferences go to ../../../project/codebase-conventions-guide.md.
58
-
59
- A rule here that also holds for non-UI code is an AD-N and belongs in the spine instead. -->
60
-
61
- | Rule | Prevents |
62
- | --- | --- |
63
-
64
- ## What this system deliberately does not cover
65
-
66
- <!-- Where a component is free to choose for itself. Absent, every local choice reads as a violation. -->
1
+ ---
2
+ type: design-system
3
+ scope: _platform
4
+ landed_from: [] # the run file(s) in _bmad-output/ux/ this landed from — provenance, kept after the run is gone
5
+ status: draft # draft · reviewed · locked · superseded
6
+ created: '{YYYY-MM-DD}'
7
+ ---
8
+
9
+ # Design System — {product}
10
+
11
+ <!-- TEMPLATE GUIDE — act on these comments, then delete them.
12
+
13
+ Home: .how/_platform/design-system.md. Written by wdi-ux, and it is the ONE file in _platform/
14
+ that wdi-blueprint does not own. Optional, like the rest of UX: it exists when the interface is
15
+ a substantial part of what the PRD promises.
16
+
17
+ WHY IT IS NOT IN A COMPONENT: tokens and base elements cross Product Components by definition. A
18
+ colour scale living in one component's 01-ux/ is a colour scale the other six will each redefine.
19
+
20
+ WHY ux.md DOES NOT SERVE IT: ux.md is the shape of DESIGN.md and EXPERIENCE.md, which are per
21
+ component. This is the product-level DESIGN — tokens, base elements, and every build pattern
22
+ that holds for all components.
23
+
24
+ WHAT DOES NOT BELONG HERE: a promise. Information architecture, voice and tone, the flow map,
25
+ journeys that cross components, and shared edge cases are still true after a redesign, so they
26
+ are experience and live in .what/experience.md (templates/experience.md). A section that holds
27
+ both is split at the sentence — ux-guide.md § Product level.
28
+
29
+ THE CODE IS THE SSOT FOR VALUES. Where this repo's web side states a token in tokens.css, this
30
+ file MUST reference it rather than repeat the value. Two homes for one hex code is two hex codes
31
+ within a month. Read web/README.md before writing anything here — it is the authority for the
32
+ web side, and it MUST NOT be contradicted from this file.
33
+
34
+ Token and element NAMES are English: they are machine-facing keys, per language-guide.md. -->
35
+
36
+ ## Where the values actually live
37
+
38
+ <!-- One line per source of truth — the stylesheet, the config, the generated file — with its path.
39
+ This section is what stops the rest of the document becoming a stale copy. -->
40
+
41
+ ## Tokens
42
+
43
+ <!-- One table per scale. Name, what it is for, and where it resolves. NOT the raw value, unless this
44
+ file is genuinely the only place it exists. -->
45
+
46
+ | Token | For | Resolves in |
47
+ | --- | --- | --- |
48
+
49
+ ## Base elements
50
+
51
+ <!-- The LC type `ui-element`, registered in components.yaml. One row each: what it is, its states,
52
+ and where its implementation lives. A composite reused across screens is `ui-composite` and
53
+ belongs in .how/<pc>/01-ux/ of the component that holds its implementation, not here — unless
54
+ nearly every component uses it, and then it is a base element. -->
55
+
56
+ | Element | States it MUST support | Implementation |
57
+ | --- | --- | --- |
58
+
59
+ <!-- Every element MUST state its empty, loading, error, and disabled states where they apply. The
60
+ populated state is the one that always gets designed; the others are the ones that ship broken. -->
61
+
62
+ ## State patterns
63
+
64
+ <!-- How empty, loading, error, offline, and disabled are BUILT everywhere. The promise a state keeps
65
+ is in .what/experience.md; this section is how it is met. -->
66
+
67
+ | State | Built as | Used by |
68
+ | --- | --- | --- |
69
+
70
+ ## Interaction primitives
71
+
72
+ <!-- Gestures, feedback, confirmation, undo — the few moves every screen shares. -->
73
+
74
+ ## Accessibility — how it is met
75
+
76
+ <!-- The standard met is a promise and lives in .what/experience.md. Here: contrast pairs, target
77
+ sizes, focus order, motion — each resolving to a token or an element above. -->
78
+
79
+ ## Surfaces that are not screens
80
+
81
+ <!-- Notifications, widgets, share sheets: how each looks and is built. What the user is told, and
82
+ when, is in .what/experience.md. -->
83
+
84
+ ## Rules that bind every screen
85
+
86
+ <!-- Only what a screen cannot legitimately override. Each MUST state what it prevents — a rule with
87
+ no failure behind it is a preference, and preferences go to ../../../project/codebase-conventions-guide.md.
88
+
89
+ A rule here that also holds for non-UI code is an AD-N and belongs in the spine instead. -->
90
+
91
+ | Rule | Prevents |
92
+ | --- | --- |
93
+
94
+ ## What this system deliberately does not cover
95
+
96
+ <!-- Where a component is free to choose for itself. Absent, every local choice reads as a violation. -->
@@ -0,0 +1,62 @@
1
+ ---
2
+ type: experience
3
+ scope: product
4
+ landed_from: [] # the run file(s) in _bmad-output/ux/ this landed from — provenance, kept after the run is gone
5
+ status: draft # draft · reviewed · locked · superseded
6
+ created: '{YYYY-MM-DD}'
7
+ ---
8
+
9
+ # Experience — {product}
10
+
11
+ <!-- TEMPLATE GUIDE — act on these comments, then delete them.
12
+
13
+ Home: .what/experience.md. Written by wdi-ux, landed from a bmad-ux run at G2 — its path has no
14
+ <pc>, so it does not wait for components. Optional, like the rest of UX.
15
+
16
+ WHAT IT IS: the product-level half of EXPERIENCE. What holds for EVERY component, in the promise
17
+ layer. One component's own journeys stay in .what/<pc>/04-usecases/EXPERIENCE.md.
18
+
19
+ THE TEST, per sentence: still true after a full redesign → here. Names a layout, a component,
20
+ or a token → .how/_platform/design-system.md. ux-guide.md § Product level maps bmad-ux's sections
21
+ onto the two files.
22
+
23
+ A cross-component rule the SYSTEM enforces — not what the user perceives — is a business rule,
24
+ and belongs in .what/business-rules.md instead. -->
25
+
26
+ ## Foundation
27
+
28
+ <!-- Who it is for, and the few principles every surface keeps. Each principle MUST be checkable: a
29
+ principle no screen could violate is a slogan. -->
30
+
31
+ ## Information architecture
32
+
33
+ <!-- The product's surfaces and how someone moves between them. A component's inner surfaces belong to
34
+ that component's EXPERIENCE.md. -->
35
+
36
+ ## Voice and tone
37
+
38
+ <!-- How the product speaks. User-facing nouns MUST match .control/product-glossary.md where an entry
39
+ exists. -->
40
+
41
+ ## Flow map
42
+
43
+ <!-- The whole map, across components. Each zoom-in lives with the component that owns the screens in
44
+ it — ux-guide.md § Product level. Reference UJ-N and UC-N by id. -->
45
+
46
+ ## Cross-component journeys
47
+
48
+ <!-- A journey that crosses components — onboarding is the usual one — told once, here, with the
49
+ components it passes through named in order. -->
50
+
51
+ ## Promises every surface keeps
52
+
53
+ <!-- The promise side of state patterns, accessibility, and surfaces that are not screens: what the
54
+ user can count on everywhere. HOW each is met is design-system.md. -->
55
+
56
+ | Promise | Holds for |
57
+ | --- | --- |
58
+
59
+ ## Shared edge cases
60
+
61
+ <!-- Failure moments that are not one component's: offline, a lost session, an interrupted sync. What
62
+ the user does next. -->
@@ -1,129 +1,131 @@
1
- ---
2
- type: structure
3
- scope: codebase
4
- verified: '{YYYY-MM-DD}' # the day the tree was actually read
5
- commit: '{sha}' # the commit it was read at — staleness is measured against this
6
- ---
7
-
8
- # Codebase Structure
9
-
10
- <!-- TEMPLATE GUIDE — act on these comments, then delete them.
11
-
12
- This file is DESCRIPTIVE. It states what the code tree looks like today. It MUST NOT carry
13
- naming rules (conventions-guide.md), versions (stack-guide.md), or ratified legacy shapes
14
- (brownfield-guide.md) — reference them instead.
15
-
16
- Written and refreshed only by `wdi-init` intent `structure`, never by hand. Rules for both maps live in
17
- .constitution/method/structure-guide.md.
18
-
19
- THE SHAPE: annotated trees, not prose. Folders are complete; files are marked ★ inline and only
20
- when they earn it. A tree that lists every file is unmaintainable, and an unmaintainable map
21
- stops being read — that is how every source-tree document before this one died.
22
-
23
- THREE SECTIONS, and the split is by DEPLOYABILITY, not by size or importance:
24
- Top level every base folder in the repo root
25
- Container runs or deploys on its own — the same word C4 L2 and components.yaml use
26
- Library an includable artifact — compiled or imported into something else, never run
27
-
28
- "Container" is the kit's word, defined in templates/c4.md and carried by every LC's `container`
29
- field. It MUST NOT be swapped for "application", "service", or "app" here — a synonym for a
30
- term that already has a glossary entry is drift, and `wdi-reconcile` hunts for it. It does not
31
- mean a Docker image; packaging is a separate question.
32
-
33
- A unit that is neither is not a unit; it stays a line in Top level. When a unit stops being
34
- separately deployable, it MUST move sections rather than keep its old heading. -->
35
-
36
- ## Verified
37
-
38
- <!-- One line: date, commit SHA, and how the tree was read. If the commit is no longer an ancestor
39
- of HEAD, this map is stale and MUST be refreshed before a gate reads it. -->
40
-
41
- ## Top level
42
-
43
- <!-- Every base folder in the repo root, COMPLETE — including the dull ones. An unlisted folder is
44
- the one people misuse, because nothing told them what it was for. Tag each entry so the two
45
- sections below are predictable: [container] · [lib] · [docs] · [tooling] · [generated]. One
46
- line of purpose per entry; no second line. -->
47
-
48
- ```text
49
- {repo-root}/
50
- ├── {unit}/ # [container] what it is answerable for
51
- ├── {unit}/ # [lib] ...
52
- └── {folder}/ # [docs] ...
53
- ```
54
-
55
- ## Containers
56
-
57
- <!-- One subsection per unit that runs or deploys on its own. Repeat the block below verbatim per
58
- unit; if there is only one, there is still a subsection — a repo grows a second container
59
- without warning.
60
-
61
- Heading names MUST match the `container` values used in components.yaml, so an LC's container
62
- can be checked against this map instead of trusted. A container with no code in this repo MUST
63
- NOT get a subsection — it belongs to c4-l2-containers.md. A folder that builds more than one
64
- container MUST say which. -->
65
-
66
- ### {container}
67
-
68
- <!-- One line: what it is, and how it ships. Then the tree: folder convention first, ★ on the files
69
- that earn it. Descend only until directories stop carrying distinct roles, and describe a
70
- repeating shape ONCE with a placeholder such as <feature>/ rather than per instance. -->
71
-
72
- ```text
73
- {container}/
74
- ├── {entry-file} # ★ ENTRY: what execution actually does first
75
- ├── {folder}/ # convention: what belongs here
76
- │ └── {file} # ★ why this one is key
77
- └── {folder}/<feature>/ # the shape every feature repeats
78
- ├── {sub}/ # what goes in it
79
- └── {sub}/ # ...
80
- ```
81
-
82
- <!-- One line, only when the unit has one: the authoritative call direction through those folders.
83
- A builder who gets this wrong writes code that works and is still wrong. Cut if there is none;
84
- do not invent one to fill the slot. -->
85
-
86
- **Flow:** {layer} → {layer} → {layer}
87
-
88
- ## Libraries
89
-
90
- <!-- One subsection per includable artifact — compiled into or imported by something else, never
91
- deployed on its own. A library is deliberately NOT a container, and MUST NOT appear at C4 L2.
92
-
93
- Same block shape as a container, minus the entry point: a library that has one is a container
94
- wearing the wrong label. -->
95
-
96
- ### {library}
97
-
98
- <!-- One line: what it holds, and who consumes it. Then the annotated tree. -->
99
-
100
- ```text
101
- {library}/
102
- ├── {folder}/ # convention: what belongs here
103
- │ └── {file} # ★ why this one is key
104
- └── {folder}/
105
- ```
106
-
107
- **Consumed by:** {units}
108
-
109
- ## Generated
110
-
111
- <!-- Anything not written by hand, with its generator: codegen output, vendored trees, migration
112
- snapshots. A generated folder edited by hand is a defect, so it MUST be named here even when it
113
- looks like ordinary source. Cut the section if there is none. -->
114
-
115
- | Path | Generated by |
116
- | --- | --- |
117
-
118
- ## Unclaimed
119
-
120
- <!-- Folders that exist but no one can state a purpose for. These are findings, not layout. Leave
121
- them here, named, until they are claimed or deleted — inventing a purpose to empty this section
122
- is the failure mode it exists to catch. Cut the section only when it is genuinely empty. -->
123
-
124
- ---
125
-
126
- <!-- Keep this legend last, and keep it one line. -->
127
-
128
- ★ = key file: entry point, wiring root, the single place a rule is enforced, or a file that must be
129
- opened before behaviour in its folder can be changed.
1
+ ---
2
+ type: structure
3
+ scope: codebase
4
+ verified: '{YYYY-MM-DD}' # the day the tree was actually read
5
+ commit: '{sha}' # the commit it was read at — staleness is measured against this
6
+ ---
7
+
8
+ # Codebase Structure
9
+
10
+ <!-- TEMPLATE GUIDE — act on these comments, then delete them.
11
+
12
+ This file is DESCRIPTIVE. It states what the code tree looks like today. It MUST NOT carry
13
+ naming rules (conventions-guide.md), versions (stack-guide.md), or ratified legacy shapes
14
+ (brownfield-guide.md) — reference them instead.
15
+
16
+ Written and refreshed only by `wdi-init` intent `structure`, never by hand. Rules for both maps live in
17
+ .constitution/method/structure-guide.md.
18
+
19
+ THE SHAPE: annotated trees, not prose. Folders are complete; files are marked ★ inline and only
20
+ when they earn it. A tree that lists every file is unmaintainable, and an unmaintainable map
21
+ stops being read — that is how every source-tree document before this one died.
22
+
23
+ THREE SECTIONS, and the split is by DEPLOYABILITY, not by size or importance:
24
+ Top level every base folder in the repo root
25
+ Container runs or deploys on its own — the same word C4 L2 and components.yaml use
26
+ Library an includable artifact — compiled or imported into something else, never run
27
+
28
+ "Container" is the kit's word, defined in templates/c4.md and carried by every LC's `container`
29
+ field. It MUST NOT be swapped for "application", "service", or "app" here — a synonym for a
30
+ term that already has a glossary entry is drift, and `wdi-reconcile` hunts for it. It does not
31
+ mean a Docker image; packaging is a separate question.
32
+
33
+ A unit that is neither is not a unit; it stays a line in Top level. When a unit stops being
34
+ separately deployable, it MUST move sections rather than keep its old heading. -->
35
+
36
+ ## Verified
37
+
38
+ <!-- One line: date, commit SHA, and how the tree was read. If the commit is no longer an ancestor
39
+ of HEAD, this map is stale and MUST be refreshed before a gate reads it. -->
40
+
41
+ ## Top level
42
+
43
+ <!-- Every base folder in the repo root, COMPLETE — including the dull ones. An unlisted folder is
44
+ the one people misuse, because nothing told them what it was for. Tag each entry so the two
45
+ sections below are predictable: [container] · [lib] · [docs] · [tooling] · [generated]. One
46
+ line of purpose per entry; no second line. -->
47
+
48
+ ```text
49
+ {repo-root}/
50
+ ├── {unit}/ # [container] what it is answerable for
51
+ ├── {unit}/ # [lib] ...
52
+ └── {folder}/ # [docs] ...
53
+ ```
54
+
55
+ ## Containers
56
+
57
+ <!-- One subsection per unit that runs or deploys on its own. Repeat the block below verbatim per
58
+ unit; if there is only one, there is still a subsection — a repo grows a second container
59
+ without warning.
60
+
61
+ Heading names MUST match the `container` values used in components.yaml, so an LC's container
62
+ can be checked against this map instead of trusted. The headings are exactly the `built: true`
63
+ containers WITHOUT `repo:` — `container-built` checks it. A container whose code is in another
64
+ repository carries `repo:` in components.yaml and gets its subsection in THAT repo's map; one
65
+ that is ours but has no code yet still gets a subsection, one line saying so. A folder that builds more than one
66
+ container MUST say which. -->
67
+
68
+ ### {container}
69
+
70
+ <!-- One line: what it is, and how it ships. Then the tree: folder convention first, ★ on the files
71
+ that earn it. Descend only until directories stop carrying distinct roles, and describe a
72
+ repeating shape ONCE with a placeholder such as <feature>/ rather than per instance. -->
73
+
74
+ ```text
75
+ {container}/
76
+ ├── {entry-file} # ★ ENTRY: what execution actually does first
77
+ ├── {folder}/ # convention: what belongs here
78
+ │ └── {file} # ★ why this one is key
79
+ └── {folder}/<feature>/ # the shape every feature repeats
80
+ ├── {sub}/ # what goes in it
81
+ └── {sub}/ # ...
82
+ ```
83
+
84
+ <!-- One line, only when the unit has one: the authoritative call direction through those folders.
85
+ A builder who gets this wrong writes code that works and is still wrong. Cut if there is none;
86
+ do not invent one to fill the slot. -->
87
+
88
+ **Flow:** {layer} → {layer} → {layer}
89
+
90
+ ## Libraries
91
+
92
+ <!-- One subsection per includable artifact — compiled into or imported by something else, never
93
+ deployed on its own. A library is deliberately NOT a container, and MUST NOT appear at C4 L2.
94
+
95
+ Same block shape as a container, minus the entry point: a library that has one is a container
96
+ wearing the wrong label. -->
97
+
98
+ ### {library}
99
+
100
+ <!-- One line: what it holds, and who consumes it. Then the annotated tree. -->
101
+
102
+ ```text
103
+ {library}/
104
+ ├── {folder}/ # convention: what belongs here
105
+ │ └── {file} # ★ why this one is key
106
+ └── {folder}/
107
+ ```
108
+
109
+ **Consumed by:** {units}
110
+
111
+ ## Generated
112
+
113
+ <!-- Anything not written by hand, with its generator: codegen output, vendored trees, migration
114
+ snapshots. A generated folder edited by hand is a defect, so it MUST be named here even when it
115
+ looks like ordinary source. Cut the section if there is none. -->
116
+
117
+ | Path | Generated by |
118
+ | --- | --- |
119
+
120
+ ## Unclaimed
121
+
122
+ <!-- Folders that exist but no one can state a purpose for. These are findings, not layout. Leave
123
+ them here, named, until they are claimed or deleted — inventing a purpose to empty this section
124
+ is the failure mode it exists to catch. Cut the section only when it is genuinely empty. -->
125
+
126
+ ---
127
+
128
+ <!-- Keep this legend last, and keep it one line. -->
129
+
130
+ ★ = key file: entry point, wiring root, the single place a rule is enforced, or a file that must be
131
+ opened before behaviour in its folder can be changed.