bmad-method 6.11.1-next.8 → 6.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/AGENTS.md +12 -0
  3. package/CLAUDE.md +1 -0
  4. package/README.md +13 -19
  5. package/README_CN.md +0 -10
  6. package/README_KR.md +90 -0
  7. package/README_VN.md +0 -10
  8. package/greptile.json +52 -0
  9. package/package.json +6 -5
  10. package/src/bmm-skills/agents/bmad-agent-analyst/SKILL.md +1 -1
  11. package/src/bmm-skills/agents/bmad-agent-analyst/customize.toml +1 -3
  12. package/src/bmm-skills/agents/bmad-agent-architect/SKILL.md +1 -1
  13. package/src/bmm-skills/agents/bmad-agent-architect/customize.toml +1 -3
  14. package/src/bmm-skills/agents/bmad-agent-dev/SKILL.md +1 -1
  15. package/src/bmm-skills/agents/bmad-agent-dev/customize.toml +1 -3
  16. package/src/bmm-skills/agents/bmad-agent-pm/SKILL.md +1 -1
  17. package/src/bmm-skills/agents/bmad-agent-pm/customize.toml +1 -3
  18. package/src/bmm-skills/agents/bmad-agent-ux-designer/SKILL.md +1 -1
  19. package/src/bmm-skills/agents/bmad-agent-ux-designer/customize.toml +1 -3
  20. package/src/bmm-skills/module-help.csv +2 -2
  21. package/src/bmm-skills/plan/bmad-architecture/SKILL.md +1 -1
  22. package/src/bmm-skills/plan/bmad-architecture/customize.toml +5 -6
  23. package/src/bmm-skills/plan/bmad-create-epics-and-stories/SKILL.md +1 -1
  24. package/src/bmm-skills/plan/bmad-create-epics-and-stories/customize.toml +1 -3
  25. package/src/bmm-skills/plan/bmad-create-epics-and-stories/steps/step-04-final-validation.md +1 -1
  26. package/src/bmm-skills/plan/bmad-prd/SKILL.md +1 -1
  27. package/src/bmm-skills/plan/bmad-prd/customize.toml +5 -6
  28. package/src/bmm-skills/plan/bmad-prfaq/SKILL.md +1 -1
  29. package/src/bmm-skills/plan/bmad-prfaq/customize.toml +1 -3
  30. package/src/bmm-skills/plan/bmad-prfaq/references/verdict.md +1 -1
  31. package/src/bmm-skills/plan/bmad-product-brief/SKILL.md +1 -1
  32. package/src/bmm-skills/plan/bmad-product-brief/customize.toml +5 -6
  33. package/src/bmm-skills/plan/bmad-project-context/SKILL.md +7 -6
  34. package/src/bmm-skills/plan/bmad-project-context/references/best-practices.md +2 -2
  35. package/src/bmm-skills/plan/bmad-spec/SKILL.md +1 -1
  36. package/src/bmm-skills/plan/bmad-spec/customize.toml +5 -5
  37. package/src/bmm-skills/plan/bmad-sprint-planning/SKILL.md +1 -1
  38. package/src/bmm-skills/plan/bmad-sprint-planning/customize.toml +1 -3
  39. package/src/bmm-skills/plan/bmad-sprint-planning/scripts/__pycache__/sprint_plan.cpython-311.pyc +0 -0
  40. package/src/bmm-skills/plan/bmad-sprint-planning/scripts/tests/__pycache__/test_sprint_plan.cpython-311-pytest-9.1.1.pyc +0 -0
  41. package/src/bmm-skills/plan/bmad-ux/SKILL.md +1 -1
  42. package/src/bmm-skills/plan/bmad-ux/customize.toml +1 -3
  43. package/src/bmm-skills/ship/bmad-build/SKILL.md +1 -1
  44. package/src/bmm-skills/ship/bmad-build/customize.toml +21 -33
  45. package/src/bmm-skills/ship/bmad-build/references/claims-check.md +14 -0
  46. package/src/bmm-skills/ship/bmad-build/review-prompts/edge-case-hunter.md +31 -7
  47. package/src/bmm-skills/ship/bmad-build/review-prompts/verification-gap.md +4 -4
  48. package/src/bmm-skills/ship/bmad-build/spec-template.md +26 -4
  49. package/src/bmm-skills/ship/bmad-build/step-01-clarify-and-route.md +21 -26
  50. package/src/bmm-skills/ship/bmad-build/step-02-plan.md +31 -16
  51. package/src/bmm-skills/ship/bmad-build/step-03-implement.md +5 -3
  52. package/src/bmm-skills/ship/bmad-build/step-04-review.md +49 -19
  53. package/src/bmm-skills/ship/bmad-build/step-05-present.md +9 -41
  54. package/src/bmm-skills/ship/bmad-build/step-oneshot.md +60 -29
  55. package/src/bmm-skills/ship/bmad-build/sync-sprint-status.md +5 -19
  56. package/src/bmm-skills/ship/bmad-build-auto/customize.toml +17 -19
  57. package/src/bmm-skills/ship/bmad-build-auto/references/claims-check.md +14 -0
  58. package/src/bmm-skills/ship/bmad-build-auto/review-prompts/edge-case-hunter.md +31 -7
  59. package/src/bmm-skills/ship/bmad-build-auto/review-prompts/verification-gap.md +4 -4
  60. package/src/bmm-skills/ship/bmad-build-auto/spec-template.md +4 -7
  61. package/src/bmm-skills/ship/bmad-build-auto/step-01-clarify-and-route.md +3 -2
  62. package/src/bmm-skills/ship/bmad-build-auto/step-03-implement.md +5 -1
  63. package/src/bmm-skills/ship/bmad-build-auto/step-04-review.md +58 -38
  64. package/src/bmm-skills/ship/bmad-build-auto/workflow.md +1 -1
  65. package/src/bmm-skills/ship/bmad-code-review/SKILL.md +1 -1
  66. package/src/bmm-skills/ship/bmad-code-review/customize.toml +15 -18
  67. package/src/bmm-skills/ship/bmad-code-review/references/claims-check.md +14 -0
  68. package/src/bmm-skills/ship/bmad-code-review/review-prompts/edge-case-hunter.md +31 -7
  69. package/src/bmm-skills/ship/bmad-code-review/review-prompts/verification-gap.md +4 -4
  70. package/src/bmm-skills/ship/bmad-code-review/steps/step-01-gather-context.md +30 -23
  71. package/src/bmm-skills/ship/bmad-code-review/steps/step-02-review.md +3 -3
  72. package/src/bmm-skills/ship/bmad-code-review/steps/step-03-triage.md +25 -21
  73. package/src/bmm-skills/ship/bmad-code-review/steps/step-04-present.md +20 -18
  74. package/src/bmm-skills/ship/bmad-correct-course/SKILL.md +13 -5
  75. package/src/bmm-skills/ship/bmad-correct-course/customize.toml +1 -3
  76. package/src/bmm-skills/ship/bmad-qa-generate-e2e-tests/SKILL.md +2 -2
  77. package/src/bmm-skills/ship/bmad-qa-generate-e2e-tests/customize.toml +1 -3
  78. package/src/bmm-skills/ship/bmad-retrospective/SKILL.md +1 -1
  79. package/src/bmm-skills/ship/bmad-retrospective/customize.toml +1 -3
  80. package/src/bmm-skills/ship/bmad-retrospective/scripts/__pycache__/sprint_status.cpython-311.pyc +0 -0
  81. package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/__pycache__/test_git_evidence.cpython-311-pytest-9.1.1.pyc +0 -0
  82. package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/__pycache__/test_sprint_status.cpython-311-pytest-9.1.1.pyc +0 -0
  83. package/src/bmm-skills/ship/{bmad-checkpoint-preview → bmad-walkthrough}/SKILL.md +4 -4
  84. package/src/bmm-skills/ship/{bmad-checkpoint-preview → bmad-walkthrough}/customize.toml +2 -4
  85. package/src/bmm-skills/ship/{bmad-checkpoint-preview → bmad-walkthrough}/step-05-wrapup.md +1 -1
  86. package/src/bmm-skills/v6-shims/README.md +1 -0
  87. package/src/bmm-skills/v6-shims/bmad-checkpoint-preview/SKILL.md +21 -0
  88. package/src/bmm-skills/v6-shims/bmad-create-architecture/SKILL.md +1 -1
  89. package/src/bmm-skills/v6-shims/bmad-create-architecture/customize.toml +1 -3
  90. package/src/bmm-skills/v6-shims/bmad-create-prd/SKILL.md +1 -1
  91. package/src/bmm-skills/v6-shims/bmad-create-prd/customize.toml +1 -3
  92. package/src/bmm-skills/v6-shims/bmad-create-story/SKILL.md +3 -3
  93. package/src/bmm-skills/v6-shims/bmad-create-story/customize.toml +1 -3
  94. package/src/bmm-skills/v6-shims/bmad-dev-story/SKILL.md +2 -2
  95. package/src/bmm-skills/v6-shims/bmad-dev-story/customize.toml +1 -6
  96. package/src/bmm-skills/v6-shims/bmad-domain-research/SKILL.md +1 -1
  97. package/src/bmm-skills/v6-shims/bmad-edit-prd/SKILL.md +1 -1
  98. package/src/bmm-skills/v6-shims/bmad-edit-prd/customize.toml +1 -3
  99. package/src/bmm-skills/v6-shims/bmad-market-research/SKILL.md +1 -1
  100. package/src/bmm-skills/v6-shims/bmad-sprint-status/SKILL.md +1 -1
  101. package/src/bmm-skills/v6-shims/bmad-sprint-status/customize.toml +1 -3
  102. package/src/bmm-skills/v6-shims/bmad-technical-research/SKILL.md +1 -1
  103. package/src/bmm-skills/v6-shims/bmad-validate-prd/SKILL.md +1 -1
  104. package/src/bmm-skills/v6-shims/bmad-validate-prd/customize.toml +1 -3
  105. package/src/core-skills/bmad-advanced-elicitation/SKILL.md +22 -23
  106. package/src/core-skills/bmad-brainstorming/SKILL.md +1 -1
  107. package/src/core-skills/bmad-brainstorming/customize.toml +5 -6
  108. package/src/core-skills/bmad-brainstorming/scripts/brain.py +19 -0
  109. package/src/core-skills/bmad-brainstorming/scripts/tests/test_brain.py +50 -0
  110. package/src/core-skills/bmad-customize/SKILL.md +1 -1
  111. package/src/core-skills/bmad-deep-recon/SKILL.md +1 -1
  112. package/src/core-skills/bmad-forge-idea/SKILL.md +1 -1
  113. package/src/core-skills/bmad-forge-idea/customize.toml +5 -6
  114. package/src/core-skills/bmad-forge-idea/scripts/resolve_personas.py +3 -1
  115. package/src/core-skills/bmad-forge-idea/scripts/tests/test_resolve_personas.py +22 -0
  116. package/src/core-skills/bmad-help/SKILL.md +1 -1
  117. package/src/core-skills/bmad-party-mode/SKILL.md +1 -1
  118. package/src/core-skills/bmad-party-mode/customize.toml +4 -4
  119. package/src/core-skills/bmad-party-mode/references/create-party.md +1 -1
  120. package/src/core-skills/bmad-party-mode/scripts/resolve_party.py +3 -1
  121. package/src/core-skills/bmad-party-mode/scripts/tests/test_resolve_party.py +22 -0
  122. package/src/core-skills/bmad-review/SKILL.md +5 -4
  123. package/src/core-skills/bmad-review/customize.toml +1 -1
  124. package/src/core-skills/bmad-review/references/lens-edge-case-hunter.md +18 -0
  125. package/src/core-skills/module-help.csv +1 -1
  126. package/src/scripts/__pycache__/config_utils.cpython-311.pyc +0 -0
  127. package/src/scripts/resolve_config.py +9 -1
  128. package/src/scripts/resolve_customization.py +72 -7
  129. package/src/scripts/tests/__pycache__/test_config_utils.cpython-311.pyc +0 -0
  130. package/src/scripts/tests/__pycache__/test_resolve_config.cpython-311.pyc +0 -0
  131. package/src/scripts/tests/__pycache__/test_resolve_customization.cpython-311.pyc +0 -0
  132. package/src/scripts/tests/test_resolve_config.py +28 -0
  133. package/src/scripts/tests/test_resolve_customization.py +102 -0
  134. package/tools/installer/core/installer.js +33 -1
  135. package/tools/installer/core/shim-policy.js +75 -7
  136. package/tools/installer/ide/platform-codes.yaml +13 -0
  137. package/tools/installer/prompts.js +15 -2
  138. package/tools/installer/ui.js +28 -8
  139. package/tools/skill-validator.md +85 -151
  140. package/tools/tests/__pycache__/test_validate_skills.cpython-311.pyc +0 -0
  141. package/tools/tests/fixtures/validate-skills/bmad/SKILL.md +8 -0
  142. package/tools/tests/fixtures/validate-skills/deprecated-shim/SKILL.md +9 -0
  143. package/tools/tests/fixtures/validate-skills/missing-trigger/SKILL.md +9 -0
  144. package/tools/tests/fixtures/validate-skills/with-trigger/SKILL.md +8 -0
  145. package/tools/tests/test_validate_skills.py +476 -0
  146. package/tools/validate-published-implementation-model.mjs +0 -9
  147. package/tools/validate_skills.py +698 -0
  148. package/tools/validate-skills.js +0 -735
  149. /package/src/bmm-skills/ship/{bmad-checkpoint-preview → bmad-walkthrough}/generate-trail.md +0 -0
  150. /package/src/bmm-skills/ship/{bmad-checkpoint-preview → bmad-walkthrough}/step-01-orientation.md +0 -0
  151. /package/src/bmm-skills/ship/{bmad-checkpoint-preview → bmad-walkthrough}/step-02-walkthrough.md +0 -0
  152. /package/src/bmm-skills/ship/{bmad-checkpoint-preview → bmad-walkthrough}/step-03-detail-pass.md +0 -0
  153. /package/src/bmm-skills/ship/{bmad-checkpoint-preview → bmad-walkthrough}/step-04-testing.md +0 -0
@@ -169,6 +169,13 @@ platforms:
169
169
  target_dir: .agents/skills
170
170
  global_target_dir: ~/.config/agents/skills
171
171
 
172
+ grok:
173
+ name: "Grok"
174
+ preferred: false
175
+ installer:
176
+ target_dir: .agents/skills
177
+ global_target_dir: ~/.grok/skills
178
+
172
179
  hermes:
173
180
  name: "Hermes Agent"
174
181
  preferred: false
@@ -281,6 +288,12 @@ platforms:
281
288
  target_dir: .agents/skills
282
289
  global_target_dir: ~/.agents/skills
283
290
 
291
+ polytoken:
292
+ name: "Polytoken"
293
+ preferred: false
294
+ installer:
295
+ target_dir: .agents/skills
296
+
284
297
  qoder:
285
298
  name: "Qoder"
286
299
  preferred: false
@@ -316,7 +316,9 @@ async function autocompleteMultiselect(options) {
316
316
 
317
317
  switch (this.state) {
318
318
  case 'submit': {
319
- return `${title}${color.gray(clack.S_BAR)} ${color.dim(`${this.selectedValues.length} items selected`)}`;
319
+ const count = this.selectedValues.length;
320
+ const emptyHint = count === 0 && options.emptyLabel ? ` (${options.emptyLabel})` : '';
321
+ return `${title}${color.gray(clack.S_BAR)} ${color.dim(`${count} item${count === 1 ? '' : 's'} selected${emptyHint}`)}`;
320
322
  }
321
323
 
322
324
  case 'cancel': {
@@ -331,7 +333,18 @@ async function autocompleteMultiselect(options) {
331
333
 
332
334
  const errorLine = this.state === 'error' ? [`${bar} ${color.yellow(this.error)}`] : [];
333
335
 
334
- const headerLines = [...`${title}${bar}`.split('\n'), `${bar} ${searchDisplay}${matchCount}`, ...noMatchesLine, ...errorLine];
336
+ const emptyLine =
337
+ this.selectedValues.length === 0 && options.emptyLabel
338
+ ? [`${bar} ${color.dim(`Nothing selected: installs ${options.emptyLabel}`)}`]
339
+ : [];
340
+
341
+ const headerLines = [
342
+ ...`${title}${bar}`.split('\n'),
343
+ `${bar} ${searchDisplay}${matchCount}`,
344
+ ...noMatchesLine,
345
+ ...errorLine,
346
+ ...emptyLine,
347
+ ];
335
348
 
336
349
  const footerLines = [`${bar} ${color.dim(hints.join(' • '))}`, `${barEnd}`];
337
350
 
@@ -111,7 +111,7 @@ async function getModuleVersion(moduleCode, { repoUrl = null, registryDefault =
111
111
  * UI utilities for the installer
112
112
  */
113
113
  class UI {
114
- async _selectShimPreference({ selectedModules, bmadDir, existing, options, channelOptions }) {
114
+ async _selectShimPreference({ selectedModules, bmadDir, existing, options, channelOptions, quickUpdate = false }) {
115
115
  const { OfficialModules } = require('./modules/official-modules');
116
116
  const officialModules = new OfficialModules({ channelOptions });
117
117
  const availableShims = await officialModules.discoverShims(selectedModules, { channelOptions });
@@ -132,10 +132,20 @@ class UI {
132
132
 
133
133
  if (typeof options.shims === 'boolean' || options.yes) return currentValue;
134
134
 
135
- return prompts.confirm({
136
- message: `Install ${availableShims.length} deprecated compatibility shim skill(s)?`,
137
- default: currentValue,
138
- });
135
+ // clack's confirm never resolves without a TTY: a scripted run would exit mid-install.
136
+ if (!process.stdin.isTTY) return currentValue;
137
+
138
+ // Nothing to give up, so nothing to ask on every single update.
139
+ if (quickUpdate && !currentValue) return currentValue;
140
+
141
+ const verb = currentValue ? 'Keep' : 'Install';
142
+ const message =
143
+ `${verb} ${availableShims.length} deprecated compatibility shim skill(s)? Recommended: No. ` +
144
+ `If you say yes, the deprecated skills will exist as a skill that forwards to its replacement skill. ` +
145
+ `Shims will be removed with v7. You should only retain if you customized a shimmed skill and need to ` +
146
+ `still transition it to the replacement.`;
147
+
148
+ return prompts.confirm({ message, default: currentValue });
139
149
  }
140
150
 
141
151
  /**
@@ -346,11 +356,21 @@ class UI {
346
356
  // Quick update never shows the module picker, so this is the only
347
357
  // place an existing install of a deprecated module hears about it.
348
358
  await this._warnDeprecatedModules(existingInstall.moduleIds || []);
359
+
360
+ const installShims = await this._selectShimPreference({
361
+ selectedModules: existingInstall.moduleIds || [],
362
+ bmadDir,
363
+ existing: true,
364
+ options,
365
+ channelOptions,
366
+ quickUpdate: true,
367
+ });
368
+
349
369
  return {
350
370
  actionType: 'quick-update',
351
371
  directory: confirmedDirectory,
352
372
  skipPrompts: options.yes || false,
353
- installShims: options.shims,
373
+ installShims: installShims === undefined ? options.shims : installShims,
354
374
  };
355
375
  }
356
376
 
@@ -1116,9 +1136,9 @@ class UI {
1116
1136
  message: 'Select official modules to install:',
1117
1137
  options: allOptions,
1118
1138
  initialValues: initialValues.length > 0 ? initialValues : undefined,
1119
- // Not required: core is installed either way, so an empty selection is a
1120
- // legitimate "core only" install rather than a mistake to block on.
1139
+ // Core installs either way and is not a row here, so empty is a valid core-only install.
1121
1140
  required: false,
1141
+ emptyLabel: 'core only',
1122
1142
  maxItems: allOptions.length,
1123
1143
  });
1124
1144
 
@@ -1,25 +1,25 @@
1
1
  # Skill Validator — Inference-Based
2
2
 
3
- An LLM-readable validation prompt for skills following the Agent Skills open standard.
3
+ An LLM-readable validation prompt for skills following the [Agent Skills specification](https://agentskills.io/specification).
4
4
 
5
5
  ## First Pass — Deterministic Checks
6
6
 
7
7
  Before running inference-based validation, run the deterministic validator:
8
8
 
9
9
  ```bash
10
- node tools/validate-skills.js --json path/to/skill-dir
10
+ uv run --python 3.11 tools/validate_skills.py --json path/to/skill-dir
11
11
  ```
12
12
 
13
- This checks 13 rules deterministically: SKILL-01, SKILL-02, SKILL-03, SKILL-04, SKILL-05, SKILL-06, SKILL-07, PATH-02, STEP-01, STEP-06, STEP-07, SEQ-02, TPL-01.
13
+ This checks 10 rules deterministically: SKILL-01, SKILL-02, SKILL-03, SKILL-04, SKILL-05, SKILL-06, SKILL-07, PATH-02, SEQ-02, TPL-01.
14
14
 
15
- Review its JSON output. For any rule that produced **zero findings** in the first pass, **skip it** during inference-based validation below — it has already been verified. If a rule produced any findings, the inference validator should still review that rule (some rules like SKILL-04 and SKILL-06 have sub-checks that benefit from judgment). Focus your inference effort on the remaining rules that require judgment (PATH-01, PATH-03, PATH-04, PATH-05, WF-03, STEP-02, STEP-03, STEP-04, STEP-05, SEQ-01, REF-01, REF-02, REF-03).
15
+ Review its JSON output. Skip any rule that produced zero findings — it is already verified. A rule that produced findings still gets reviewed (SKILL-06's what-and-when check benefits from judgment). The 10 rules that need judgment are PATH-01, PATH-03, PATH-04, PATH-05, STEP-04, STEP-05, SEQ-01, REF-01, REF-02, REF-03.
16
16
 
17
17
  ## How to Use
18
18
 
19
19
  1. You are given a **skill directory path** to validate.
20
20
  2. Run the deterministic first pass (see above) and note which rules passed.
21
21
  3. Read every file in the skill directory recursively.
22
- 4. Apply every rule in the catalog below to every applicable file, **skipping rules that passed the deterministic first pass**.
22
+ 4. Apply every remaining rule in the catalog below to every applicable file.
23
23
  5. Produce a findings report using the report template at the end, including any deterministic findings from the first pass.
24
24
 
25
25
  If no findings are generated (from either pass), the skill passes validation.
@@ -32,9 +32,40 @@ If no findings are generated (from either pass), the skill passes validation.
32
32
  - **Internal reference**: a file path from one file in the skill to another file in the same skill.
33
33
  - **External reference**: a file path from a skill file to a file outside the skill directory.
34
34
  - **Originating file**: the file that contains the reference (path resolution is relative to this file's location).
35
- - **Config variable**: a name-value pair whose value comes from the project config file (e.g., `planning_artifacts`, `implementation_artifacts`, `communication_language`).
35
+ - **Config value**: a key declared with a `prompt:` in `src/core-skills/module.yaml` or `src/bmm-skills/module.yaml`. The installer writes these to `{project-root}/_bmad/config.toml` (team scope) and `config.user.toml` (user scope); `_bmad/custom/` may override either. Examples: `project_name`, `output_folder`, `communication_language`, `planning_artifacts`, `project_knowledge`.
36
+ - **Customization value**: a key from the skill's own `customize.toml`, in its `[workflow]` table (most skills) or `[agent]` table (agent skills), layered with `_bmad/custom/<skill-name>.toml` and `.user.toml`.
36
37
  - **Runtime variable**: a name-value pair whose value is set during workflow execution (e.g., `spec_file`, `date`, `status`).
37
- - **Intra-skill path variable**: a frontmatter variable whose value is a path to another file within the same skill — this is an anti-pattern.
38
+ - **Intra-skill path variable**: a variable whose value is a path to another file within the same skill — this is an anti-pattern.
39
+ - **Rendered skill**: a skill whose `SKILL.md` invokes `render_skill.py`, which renders the skill's Markdown files (entry point `workflow.md`; `SKILL.md` excluded) into an immutable snapshot before execution. Only rendered skills may use compile-time tokens. Every other skill interpolates customization values itself at runtime.
40
+
41
+ ---
42
+
43
+ ## Skill Layouts
44
+
45
+ Three layouts coexist. None is preferred, and the validator does not enforce a choice between them:
46
+
47
+ - **Single-file** — all instructions inline in `SKILL.md`, with optional supporting files (`references/`, `templates/`, `checklist.md`). The common case.
48
+ - **Flat step files** — `step-NN-name.md` beside `SKILL.md` at the skill root.
49
+ - **`steps/` subdirectory** — `steps/step-NN-name.md`.
50
+
51
+ Path resolution differs between the last two; see PATH-01.
52
+
53
+ ---
54
+
55
+ ## Token Forms
56
+
57
+ | Form | Resolved by | Valid where |
58
+ | -------------------------------- | ------------------------------------------------------------------------------------------ | ------------------------------------------------------- |
59
+ | `{name}` | the agent, at runtime | anywhere |
60
+ | `{project-root}`, `{skill-root}` | the agent, at runtime — the project working directory and the skill's own directory | anywhere |
61
+ | `{workflow.key}` | `render_skill.py` at render time, or the agent from `resolve_customization.py` JSON output | any skill with a `[workflow]` table in `customize.toml` |
62
+ | `{agent.key}` | the agent, from `resolve_customization.py` JSON output | agent skills |
63
+ | `{{.key}}` | `render_skill.py`, at render time | rendered skills only |
64
+ | `{{config.key}}` | `render_skill.py`, at render time | rendered skills only |
65
+ | `{{name}}` (no leading dot) | nothing — survives verbatim into the generated artifact | templates and the artifacts they seed |
66
+ | `[[bmad-snapshot:file.md]]` | `render_skill.py`, at render time | rendered skills only |
67
+
68
+ The distinction between `{{name}}` and `{{.name}}` matters: the first is an artifact placeholder the consumer of the generated document fills in later; the second is a substitution baked in at render time. See REF-01 and TPL-01.
38
69
 
39
70
  ---
40
71
 
@@ -68,15 +99,15 @@ If no findings are generated (from either pass), the skill passes validation.
68
99
 
69
100
  - **Severity:** HIGH
70
101
  - **Applies to:** `SKILL.md`
71
- - **Rule:** The `name` value must start with `bmad-`, use only lowercase letters, numbers, and single hyphens between segments.
72
- - **Detection:** Regex test: `^bmad-[a-z0-9]+(-[a-z0-9]+)*$`.
102
+ - **Rule:** The `name` value must be `bmad` or start with `bmad-`, using only lowercase letters, numbers, and single hyphens between segments.
103
+ - **Detection:** Regex test: `^(?:bmad|bmad-[a-z0-9]+(?:-[a-z0-9]+)*)$`.
73
104
  - **Fix:** Rename to comply with the format (e.g., `bmad-my-skill`).
74
105
 
75
106
  ### SKILL-05 — `name` Must Match Directory Name
76
107
 
77
108
  - **Severity:** HIGH
78
109
  - **Applies to:** `SKILL.md`
79
- - **Rule:** The `name` value in SKILL.md frontmatter must exactly match the skill directory name. The directory name is the canonical identifier used by installers, manifests, and `skill:` references throughout the project.
110
+ - **Rule:** The `name` value in SKILL.md frontmatter must exactly match the skill directory name. The directory name is the canonical identifier used by installers, manifests, and skill references throughout the project.
80
111
  - **Detection:** Compare the `name:` frontmatter value against the basename of the skill directory (i.e., the immediate parent directory of `SKILL.md`).
81
112
  - **Fix:** Change the `name:` value to match the directory name, or rename the directory to match — prefer changing `name:` unless other references depend on the current value.
82
113
 
@@ -92,42 +123,25 @@ If no findings are generated (from either pass), the skill passes validation.
92
123
 
93
124
  - **Severity:** HIGH
94
125
  - **Applies to:** `SKILL.md`
95
- - **Rule:** SKILL.md must have non-empty markdown body content after the frontmatter. The body provides L2 instructions — a SKILL.md with only frontmatter is incomplete.
126
+ - **Rule:** SKILL.md must have non-empty markdown body content after the frontmatter. A SKILL.md with only frontmatter is incomplete.
96
127
  - **Detection:** Extract content after the closing `---` frontmatter delimiter and check it is non-empty after trimming whitespace.
97
128
  - **Fix:** Add markdown body with skill instructions after the closing `---`.
98
129
 
99
130
  ---
100
131
 
101
- ### WF-03 — workflow.md Frontmatter Variables Must Be Config or Runtime Only
102
-
103
- - **Severity:** HIGH
104
- - **Applies to:** `workflow.md` frontmatter
105
- - **Rule:** Every variable defined in workflow.md frontmatter must be either:
106
- - A config variable (value references `{project-root}` or a config-derived variable like `{planning_artifacts}`)
107
- - A runtime variable (value is empty, a placeholder, or set during execution)
108
- - A legitimate external path expression (must not violate PATH-05 — no paths into another skill's directory)
109
-
110
- It must NOT be a path to a file within the skill directory (see PATH-04), nor a path into another skill's directory (see PATH-05).
111
-
112
- - **Detection:** For each frontmatter variable, check if its value resolves to a file inside the skill (e.g., starts with `./`, `{installed_path}`, or is a bare relative path to a sibling file). If so, it is an intra-skill path variable. Also check if the value is a path into another skill's directory — if so, it violates PATH-05 and is not a legitimate external path.
113
- - **Fix:** Remove the variable. Use a hardcoded relative path inline where the file is referenced.
114
-
115
- ---
116
-
117
132
  ### PATH-01 — Internal References Must Be Relative From Originating File
118
133
 
119
134
  - **Severity:** CRITICAL
120
135
  - **Applies to:** all files in the skill
121
136
  - **Rule:** Any reference from one file in the skill to another file in the same skill must be a relative path resolved from the directory of the originating file. Use `./` prefix for siblings or children, `../` for parent traversal. Bare relative filenames in markdown links (e.g., `[text](sibling.md)`) are also acceptable.
122
- - **Detection:** Scan for file path references (in markdown links, frontmatter values, inline backtick paths, and prose instructions like "Read fully and follow"). Verify each internal reference uses relative notation (`./`, `../`, or bare filename). Always resolve the path from the originating file's directory — a reference to `./steps/step-01.md` from a file already inside `steps/` would resolve to `steps/steps/step-01.md`, which is wrong.
137
+ - **Detection:** Scan for file path references (in markdown links, frontmatter values, inline backtick paths, and prose instructions like "Read fully and follow"). Verify each internal reference uses relative notation (`./`, `../`, or bare filename). Always resolve the path from the originating file's directory — a reference to `./steps/step-02-review.md` from a file already inside `steps/` would resolve to `steps/steps/step-02-review.md`, which is wrong.
123
138
  - **Examples:**
124
- - CORRECT: `./steps/step-01-init.md` (from workflow.md at skill root to a step)
125
- - CORRECT: `./template.md` (from workflow.md to a sibling)
126
- - CORRECT: `../template.md` (from steps/step-01.md to a skill-root file)
139
+ - CORRECT: `./steps/step-01-gather-context.md` (from a skill-root file into a `steps/` subdirectory)
140
+ - CORRECT: `./step-02-plan.md` (sibling, in the flat step layout or from inside `steps/`)
141
+ - CORRECT: `./template.md` (from SKILL.md to a sibling)
142
+ - CORRECT: `../spec-template.md` (from `steps/step-01.md` to a skill-root file)
127
143
  - CORRECT: `workflow.md` (bare relative filename for sibling)
128
- - CORRECT: `./step-02-plan.md` (from steps/step-01.md to a sibling step)
129
- - WRONG: `./steps/step-02-plan.md` (from a file already inside steps/ — resolves to steps/steps/)
130
- - WRONG: `{installed_path}/template.md`
144
+ - WRONG: `./steps/step-02-review.md` (from a file already inside `steps/` — resolves to `steps/steps/`)
131
145
  - WRONG: `{project-root}/.claude/skills/my-skill/template.md`
132
146
  - WRONG: `/Users/someone/.claude/skills/my-skill/steps/step-01.md`
133
147
  - WRONG: `~/.claude/skills/my-skill/file.md`
@@ -136,75 +150,50 @@ If no findings are generated (from either pass), the skill passes validation.
136
150
 
137
151
  - **Severity:** HIGH
138
152
  - **Applies to:** all files in the skill
139
- - **Rule:** The `installed_path` variable is an anti-pattern from the pre-skill workflow era. It must not be defined in any frontmatter, and `{installed_path}` must not appear anywhere in any file.
153
+ - **Rule:** The `installed_path` variable is a leftover from pre-skill workflows. It must not be defined in any frontmatter, and `{installed_path}` must not appear anywhere in any file.
140
154
  - **Detection:** Search all files for:
141
155
  - Frontmatter key `installed_path:`
142
156
  - String `{installed_path}` anywhere in content
143
157
  - Markdown/prose assigning `installed_path` (e.g., `` `installed_path` = `.` ``)
144
158
  - **Fix:** Remove all `installed_path` definitions. Replace every `{installed_path}/path` with `./path` (relative from the file that contains the reference). If the reference is in a step file and points to a skill-root file, use `../path` instead.
145
159
 
146
- ### PATH-03 — External References Must Use `{project-root}` or Config Variables
160
+ ### PATH-03 — External References Must Use `{project-root}` or Config Values
147
161
 
148
162
  - **Severity:** HIGH
149
163
  - **Applies to:** all files in the skill
150
- - **Rule:** References to files outside the skill directory must use `{project-root}/...` or a config-derived variable path (e.g., `{planning_artifacts}/...`, `{implementation_artifacts}/...`).
151
- - **Detection:** Identify file references that point outside the skill. Verify they start with `{project-root}` or a known config variable. Flag absolute paths, home-relative paths (`~/`), or bare paths that resolve outside the skill.
152
- - **Fix:** Replace with `{project-root}/...` or the appropriate config variable.
153
-
154
- ### PATH-05 — No File Path References Into Another Skill
155
-
156
- - **Severity:** HIGH
157
- - **Applies to:** all files in the skill
158
- - **Rule:** A skill must never reference any file inside another skill's directory by file path. Skill directories are encapsulated — their internal files (steps, templates, checklists, data files, workflow.md) are private implementation details. The only valid way to reference another skill is via `skill:skill-name` syntax, which invokes the skill as a unit. Reaching into another skill to cherry-pick an internal file (e.g., a template, a step, or even its workflow.md) breaks encapsulation and creates fragile coupling that breaks when the target skill is moved or reorganized.
159
- - **Detection:** For each external file reference (frontmatter values, markdown links, inline paths), check whether the resolved path points into a directory that is or contains a skill (has a `SKILL.md`). Patterns to flag:
160
- - `{project-root}/_bmad/.../other-skill/anything.md`
161
- - `{project-root}/_bmad/.../other-skill/steps/...`
162
- - `{project-root}/_bmad/.../other-skill/templates/...`
163
- - References to old pre-conversion locations that were skill directories (e.g., `core/workflows/skill-name/` when the skill has since moved to `core/skills/skill-name/`)
164
- - **Fix:**
165
- - If the intent is to invoke the other skill: replace with `skill:skill-name`.
166
- - If the intent is to use a shared resource (template, data file): the resource should be extracted to a shared location outside both skills (e.g., `core/data/`, `bmm/data/`, or a config-referenced path) — not reached into from across skill boundaries.
164
+ - **Rule:** References to files outside the skill directory must use `{project-root}/...` or a config-derived path (e.g., `{planning_artifacts}/...`, `{implementation_artifacts}/...`, `{project_knowledge}/...`).
165
+ - **Detection:** Identify file references that point outside the skill. Verify they start with `{project-root}` or a known config key. Flag absolute paths, home-relative paths (`~/`), or bare paths that resolve outside the skill.
166
+ - **Fix:** Replace with `{project-root}/...` or the appropriate config value.
167
167
 
168
168
  ### PATH-04 — No Intra-Skill Path Variables
169
169
 
170
170
  - **Severity:** MEDIUM
171
171
  - **Applies to:** all files (frontmatter AND body content)
172
172
  - **Rule:** Variables must not store paths to files within the same skill. These paths should be hardcoded as relative paths inline where used. This applies to YAML frontmatter variables AND markdown body variable assignments (e.g., `` `template` = `./template.md` `` under a `### Paths` section).
173
- - **Detection:** For each variable with a path-like value — whether defined in frontmatter or in body text — determine if the target is inside the skill directory. Indicators: value starts with `./`, `../`, `{installed_path}`, or is a bare filename of a file that exists in the skill. Exclude variables whose values are prefixed with a config variable like `{planning_artifacts}`, `{implementation_artifacts}`, `{project-root}`, or other config-derived paths — these are external references and are legitimate.
173
+ - **Detection:** For each variable with a path-like value — whether defined in frontmatter or in body text — determine if the target is inside the skill directory. Indicators: value starts with `./`, `../`, or is a bare filename of a file that exists in the skill. Exclude variables whose values are prefixed with a config key like `{planning_artifacts}`, `{implementation_artifacts}`, or `{project-root}` — these are external references and are legitimate.
174
174
  - **Fix:** Remove the variable. Replace each `{variable_name}` usage with the direct relative path.
175
175
  - **Exception:** If a path variable is used in 4+ locations across multiple files and the path is non-trivial, a variable MAY be acceptable. Flag it as LOW instead and note the exception.
176
176
 
177
- ---
178
-
179
- ### STEP-01 — Step File Naming
180
-
181
- - **Severity:** MEDIUM
182
- - **Applies to:** files in `steps/` directory
183
- - **Rule:** Step files must be named `step-NN-description.md` where NN is a zero-padded two-digit number. An optional single-letter variant suffix is allowed for branching steps (e.g., `step-01b-continue.md`).
184
- - **Detection:** Regex: `^step-\d{2}[a-z]?-[a-z0-9-]+\.md$`
185
- - **Fix:** Rename to match the pattern.
186
-
187
- ### STEP-02 — Step Must Have a Goal Section
177
+ ### PATH-05 — No File Path References Into Another Skill
188
178
 
189
179
  - **Severity:** HIGH
190
- - **Applies to:** step files
191
- - **Rule:** Each step must clearly state its goal. Look for a heading like `## YOUR TASK`, `## STEP GOAL`, `## INSTRUCTIONS`, `## INITIALIZATION`, `## EXECUTION`, `# Step N:`, or a frontmatter `goal:` field.
192
- - **Detection:** Scan for goal-indicating headings (including `# Step N: Title` as a top-level heading that names the step's purpose) or frontmatter.
193
- - **Fix:** Add a clear goal section.
194
-
195
- ### STEP-03 — Step Must Reference Next Step
180
+ - **Applies to:** all files in the skill
181
+ - **Rule:** A skill must never reference a file inside another skill's directory by path. A skill's files are private to it, and a path into another skill breaks when that skill is moved or reorganized.
182
+ - **Detection:** For each external file reference (frontmatter values, markdown links, inline paths), check whether the resolved path points into a directory that is or contains a skill (has a `SKILL.md`). Patterns to flag:
183
+ - `{project-root}/_bmad/.../other-skill/anything.md`
184
+ - `{project-root}/_bmad/.../other-skill/steps/...`
185
+ - `{project-root}/_bmad/.../other-skill/templates/...`
186
+ - References to pre-conversion locations that were skill directories, where the skill has since moved
187
+ - **Fix:**
188
+ - If the intent is to invoke the other skill: use invoke language in prose — ``Invoke the `skill-name` skill`` (see REF-03).
189
+ - If the intent is to use a shared resource (template, data file): extract it to a location outside both skills — a config-referenced path such as `{project_knowledge}/...`, or a `file:`-prefixed entry in `customize.toml` — rather than reaching across a skill boundary.
196
190
 
197
- - **Severity:** MEDIUM
198
- - **Applies to:** step files (except the final step)
199
- - **Rule:** Each non-terminal step must contain a reference to the next step file for sequential execution.
200
- - **Detection:** Look for `## NEXT` section or inline reference to a next step file. Remember to resolve the reference from the originating file's directory (PATH-01 applies here too).
201
- - **Fix:** Add a `## NEXT` section with the relative path to the next step.
202
- - **Note:** A terminal step is one that has no next-step reference and either contains completion/finalization language or is the highest-numbered step. If a workflow branches, there may be multiple terminal steps.
191
+ ---
203
192
 
204
193
  ### STEP-04 — Halt Before Menu
205
194
 
206
195
  - **Severity:** HIGH
207
- - **Applies to:** step files
196
+ - **Applies to:** step files and any file presenting a menu
208
197
  - **Rule:** Any step that presents a user menu (e.g., `[C] Continue`, `[A] Approve`, `[S] Split`) must explicitly HALT and wait for user response before proceeding.
209
198
  - **Detection:** Find menu patterns (bracketed letter options). Check that text within the same section (under the same heading) includes "HALT", "wait", "stop", "FORBIDDEN to proceed", or equivalent.
210
199
  - **Fix:** Add an explicit HALT instruction before or after the menu.
@@ -213,26 +202,10 @@ If no findings are generated (from either pass), the skill passes validation.
213
202
 
214
203
  - **Severity:** HIGH
215
204
  - **Applies to:** step files
216
- - **Rule:** A step must not load or read future step files until the current step is complete. Just-in-time loading only.
205
+ - **Rule:** A step must not load or read future step files until the current step is complete. Load each step when it is reached.
217
206
  - **Detection:** Look for instructions to read multiple step files simultaneously, or unconditional references to step files with higher numbers than the current step. Exempt locations: `## NEXT` sections, navigation/dispatch sections that list valid resumption targets, and conditional routing branches.
218
207
  - **Fix:** Remove premature step loading. Ensure only the current step is active.
219
208
 
220
- ### STEP-06 — Step File Frontmatter: No `name` or `description`
221
-
222
- - **Severity:** MEDIUM
223
- - **Applies to:** step files
224
- - **Rule:** Step files should not have `name:` or `description:` in their YAML frontmatter. These are metadata noise — the step's purpose is conveyed by its goal section and filename.
225
- - **Detection:** Parse step file frontmatter for `name:` or `description:` keys.
226
- - **Fix:** Remove `name:` and `description:` from step file frontmatter.
227
-
228
- ### STEP-07 — Step Count
229
-
230
- - **Severity:** LOW
231
- - **Applies to:** workflow as a whole
232
- - **Rule:** A sharded workflow should have between 2 and 10 step files. More than 10 risks LLM context degradation.
233
- - **Detection:** Count files matching `step-*.md` in the `steps/` directory.
234
- - **Fix:** Consider consolidating steps if over 10.
235
-
236
209
  ---
237
210
 
238
211
  ### SEQ-01 — No Skip Instructions
@@ -257,42 +230,43 @@ If no findings are generated (from either pass), the skill passes validation.
257
230
 
258
231
  - **Severity:** HIGH
259
232
  - **Applies to:** `.md` files whose name contains `template` (case-insensitive)
260
- - **Rule:** Template files seed durable, version-controlled artifacts (e.g. spec files) that execute on other machines. A `{{.var}}` compile-time substitution would be baked at render time and freeze a machine-local value into every artifact produced from the template.
233
+ - **Rule:** Template files become artifacts (for example spec files) that are committed and used on other machines. `render_skill.py` would replace a `{{.var}}` with a value from the rendering machine's config, and every artifact produced from the template would carry it.
261
234
  - **Detection:** Regex `\{\{\.\w+\}\}` match anywhere in a file whose basename matches `/template/i`.
262
- - **Fix:** Remove the `{{.var}}` reference. Use single-curly `{var}` if the value should be resolved at LLM runtime by the consumer of the generated artifact.
235
+ - **Fix:** Remove the `{{.var}}` reference. Use single-curly `{var}` if the value should be resolved at runtime by the consumer of the generated artifact, or plain double-curly `{{var}}` if it is a placeholder the consumer fills in.
263
236
 
264
237
  ---
265
238
 
266
- ### REF-01 — Variable References Must Be Defined
239
+ ### REF-01 — Variable References Must Resolve
267
240
 
268
241
  - **Severity:** HIGH
269
242
  - **Applies to:** all files
270
- - **Rule:** Every `{variable_name}` reference in any file (body text, frontmatter values, inline instructions) must resolve to a defined source. Valid sources are:
271
- 1. A frontmatter variable in the same file
272
- 2. A frontmatter variable in the skill's `workflow.md` (workflow-level variables are available to all steps)
273
- 3. A known config variable from the project config (e.g., `project-root`, `planning_artifacts`, `implementation_artifacts`, `communication_language`)
274
- 4. A known runtime variable set during execution (e.g., `date`, `status`, `project_name`, user-provided input variables)
275
- - **Detection:** Collect all `{...}` tokens in the file. For each, check whether it is defined in the file's own frontmatter, in `workflow.md` frontmatter, or is a recognized config/runtime variable. Flag any token that cannot be traced to a source. Use the config variable list from the project's `config.yaml` as the reference for recognized config variables. Runtime variables are those explicitly described as user-provided or set during execution in the workflow instructions.
243
+ - **Rule:** Every token must resolve to a defined source, per the Token Forms table above:
244
+ - `{name}` — a frontmatter variable in the same file, a config key, a runtime variable set during execution, or the path anchors `{project-root}` and `{skill-root}`.
245
+ - `{workflow.key}` — must name a key in the `[workflow]` table of the skill's own `customize.toml`.
246
+ - `{agent.key}` — must name a key in the `[agent]` table of the skill's own `customize.toml`.
247
+ - `{{.key}}`, `{{config.key}}`, `[[bmad-snapshot:file.md]]` — only in a rendered skill (one whose SKILL.md invokes `render_skill.py`). In any other skill nothing will substitute them and they reach the agent verbatim. A `[[bmad-snapshot:file.md]]` target must name a Markdown file in the skill other than `SKILL.md`, which the renderer excludes from its source set.
248
+ - **Detection:** Collect all tokens in the file and classify them by form. Resolve config keys against the `prompt:` keys in `module.yaml`; resolve `{workflow.*}` and `{agent.*}` against the skill's `customize.toml`. Before flagging a compile-time token, grep the skill's `SKILL.md` for `render_skill.py` — if it is a rendered skill, the token is legitimate. Flag any token that cannot be traced to a source.
276
249
  - **Exceptions:**
277
- - Double-curly `{{variable}}` — these are template placeholders intended to survive into generated output (e.g., `{{project_name}}` in a template file). Do not flag these.
250
+ - Plain double-curly `{{name}}` with **no** leading dot — an artifact placeholder that survives rendering into the generated document, to be filled in by whoever consumes it (e.g. `{{story_key}}` in a story template). Do not flag these. Dotted `{{.key}}` and `{{config.key}}` are **not** covered by this exception; they are compile-time substitutions governed by the rule above and by TPL-01.
278
251
  - Variables inside fenced code blocks that are clearly illustrative examples.
279
- - **Fix:** Either define the variable in the appropriate frontmatter, or replace the reference with a literal value. If the variable is a config variable that was misspelled, correct the spelling.
252
+ - **Fix:** Either define the variable in the appropriate `customize.toml` table or frontmatter, or replace the reference with a literal value. If a config key was misspelled, correct the spelling.
280
253
 
281
254
  ### REF-02 — File References Must Resolve
282
255
 
283
256
  - **Severity:** HIGH
284
257
  - **Applies to:** all files
285
258
  - **Rule:** All file path references within the skill (markdown links, backtick paths, frontmatter values) should point to files that plausibly exist.
286
- - **Detection:** For internal references, verify the target file exists in the skill directory. For external references using config variables, verify the path structure is plausible (you cannot resolve config variables, but you can check that the path after the variable looks reasonable — e.g., `{planning_artifacts}/*.md` is plausible, `{planning_artifacts}/../../etc/passwd` is not).
259
+ - **Detection:** For internal references, verify the target file exists in the skill directory. For external references using config keys, verify the path structure is plausible (you cannot resolve config keys, but you can check that the path after the key looks reasonable — e.g., `{planning_artifacts}/*.md` is plausible, `{planning_artifacts}/../../etc/passwd` is not).
287
260
  - **Fix:** Correct the path or remove the dead reference.
288
261
 
289
262
  ### REF-03 — Skill Invocation Must Use "Invoke" Language
290
263
 
291
264
  - **Severity:** HIGH
292
265
  - **Applies to:** all files
293
- - **Rule:** When a skill references another skill by name, the surrounding instruction must use the word "invoke". The canonical form is `Invoke the \`skill-name\` skill`. Phrases like "Read fully and follow", "Execute", "Run", "Load", "Open", or "Follow" are invalid — they imply file-level operations on a document, not skill invocation. A skill is a unit that is invoked, not a file that is read.
294
- - **Detection:** Find all references to other skills by name (typically backtick-quoted skill names like \`bmad-foo\`). Check the surrounding instruction text (same sentence or directive) for file-oriented verbs: "read", "follow", "load", "execute", "run", "open". Flag any that do not use "invoke" (or a close synonym like "activate" or "launch").
295
- - **Fix:** Replace the instruction with `Invoke the \`skill-name\` skill`. Remove any "read fully and follow" or similar file-oriented phrasing. Do NOT add a `skill:` prefix to the name — use natural language.
266
+ - **Rule:** When a skill references another skill by name in prose, the surrounding instruction must use the word "invoke". The canonical form is ``Invoke the `skill-name` skill``. Phrases like "Read fully and follow", "Execute", "Run", "Load", "Open", or "Follow" are invalid — they imply file-level operations on a document, not skill invocation.
267
+ - **Detection:** Find all references to other skills by name (typically backtick-quoted skill names like `bmad-foo`). Check the surrounding instruction text (same sentence or directive) for file-oriented verbs: "read", "follow", "load", "execute", "run", "open". Flag any that do not use "invoke" (or a close synonym like "activate" or "launch").
268
+ - **Fix:** Replace the instruction with ``Invoke the `skill-name` skill``. Remove any "read fully and follow" or similar file-oriented phrasing. Do NOT add a `skill:` prefix in prose — use natural language.
269
+ - **Exception:** `skill:skill-name` is the correct form inside `customize.toml` values (for example a `persistent_facts` entry, or a directive such as `skill:bmad-review lenses=<code>`), where the string is data consumed by a resolver rather than an instruction to the agent. Do not flag it there.
296
270
 
297
271
  ---
298
272
 
@@ -335,44 +309,4 @@ When reporting findings, use this format:
335
309
  (list rule IDs that produced no findings)
336
310
  ```
337
311
 
338
- If zero findings: report "All {N} rules passed. No findings." and list all passed rule IDs.
339
-
340
- ---
341
-
342
- ## Skill Spec Cheatsheet
343
-
344
- Quick-reference for the Agent Skills open standard.
345
- For the full standard, see: [Agent Skills specification](https://agentskills.io/specification)
346
-
347
- ### Structure
348
-
349
- - Every skill is a directory with `SKILL.md` as the required entrypoint
350
- - YAML frontmatter between `---` markers provides metadata; markdown body provides instructions
351
- - Supporting files (scripts, templates, references) live alongside SKILL.md
352
-
353
- ### Path resolution
354
-
355
- - Relative file references resolve from the directory of the file that contains the reference, not from the skill root
356
- - Example: from `branch-a/deep/next.md`, `./deeper/final.md` resolves to `branch-a/deep/deeper/final.md`
357
- - Example: from `branch-a/deep/next.md`, `./branch-b/alt/leaf.md` incorrectly resolves to `branch-a/deep/branch-b/alt/leaf.md`
358
-
359
- ### Frontmatter fields (standard)
360
-
361
- - `name`: lowercase letters, numbers, hyphens only; max 64 chars; no "anthropic" or "claude"
362
- - `description`: required, max 1024 chars; should state what the skill does AND when to use it
363
-
364
- ### Progressive disclosure — three loading levels
365
-
366
- - **L1 Metadata** (~100 tokens): `name` + `description` loaded at startup into system prompt
367
- - **L2 Instructions** (<5k tokens): SKILL.md body loaded only when skill is triggered
368
- - **L3 Resources** (unlimited): additional files + scripts loaded/executed on demand; script output enters context, script code does not
369
-
370
- ### Key design principle
371
-
372
- - Skills are filesystem-based directories, not API payloads — Claude reads them via bash/file tools
373
- - Keep SKILL.md focused; offload detailed reference to separate files
374
-
375
- ### Practical tips
376
-
377
- - Keep SKILL.md under 500 lines
378
- - `description` drives auto-discovery — use keywords users would naturally say
312
+ If zero findings: report "All 20 rules passed. No findings." and list all passed rule IDs.
@@ -0,0 +1,8 @@
1
+ ---
2
+ name: bmad
3
+ description: 'Provides the canonical BMad entrypoint. Use when the root BMad skill needs validation.'
4
+ ---
5
+
6
+ # BMad
7
+
8
+ Canonical root-skill validation fixture.
@@ -0,0 +1,9 @@
1
+ ---
2
+ name: deprecated-shim
3
+ description: 'DEPRECATED — consolidated into bmad-foo; this skill will be removed in v7 in favor of `bmad-foo`.'
4
+ ---
5
+
6
+ # DEPRECATED — forwards to bmad-foo
7
+
8
+ This skill was consolidated into `bmad-foo` and is retained as a thin compatibility
9
+ shim so existing invocations keep working. New work should invoke `bmad-foo` directly.
@@ -0,0 +1,9 @@
1
+ ---
2
+ name: missing-trigger
3
+ description: 'Generates a thing and writes it to disk for the user.'
4
+ ---
5
+
6
+ # Missing Trigger
7
+
8
+ An active (non-deprecated) skill whose description omits a "Use when" trigger phrase.
9
+ This fixture guards against regressions: SKILL-06 must still flag it.
@@ -0,0 +1,8 @@
1
+ ---
2
+ name: with-trigger
3
+ description: 'Generates a thing and writes it to disk. Use when the user asks to scaffold a thing.'
4
+ ---
5
+
6
+ # With Trigger
7
+
8
+ An active skill whose description includes a "Use when" trigger phrase.