bmad-method 6.11.1-next.2 → 6.11.1-next.21

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 (99) hide show
  1. package/package.json +2 -2
  2. package/src/bmm-skills/agents/bmad-agent-analyst/customize.toml +1 -3
  3. package/src/bmm-skills/agents/bmad-agent-architect/customize.toml +1 -3
  4. package/src/bmm-skills/agents/bmad-agent-dev/customize.toml +1 -3
  5. package/src/bmm-skills/agents/bmad-agent-pm/customize.toml +1 -3
  6. package/src/bmm-skills/agents/bmad-agent-ux-designer/customize.toml +1 -3
  7. package/src/bmm-skills/plan/bmad-architecture/SKILL.md +1 -1
  8. package/src/bmm-skills/plan/bmad-architecture/customize.toml +5 -6
  9. package/src/bmm-skills/plan/bmad-create-epics-and-stories/customize.toml +1 -3
  10. package/src/bmm-skills/plan/bmad-generate-project-context/SKILL.md +2 -0
  11. package/src/bmm-skills/plan/bmad-prd/customize.toml +5 -6
  12. package/src/bmm-skills/plan/bmad-prfaq/customize.toml +1 -3
  13. package/src/bmm-skills/plan/bmad-product-brief/customize.toml +5 -6
  14. package/src/bmm-skills/plan/bmad-project-context/SKILL.md +23 -12
  15. package/src/bmm-skills/plan/bmad-project-context/references/best-practices.md +26 -7
  16. package/src/bmm-skills/plan/bmad-project-context/references/template.md +1 -1
  17. package/src/bmm-skills/plan/bmad-spec/customize.toml +5 -5
  18. package/src/bmm-skills/plan/bmad-sprint-planning/customize.toml +1 -3
  19. package/src/bmm-skills/plan/bmad-sprint-planning/scripts/__pycache__/sprint_plan.cpython-311.pyc +0 -0
  20. package/src/bmm-skills/plan/bmad-sprint-planning/scripts/tests/__pycache__/test_sprint_plan.cpython-311-pytest-9.1.1.pyc +0 -0
  21. package/src/bmm-skills/plan/bmad-ux/customize.toml +1 -3
  22. package/src/bmm-skills/ship/bmad-build/SKILL.md +1 -1
  23. package/src/bmm-skills/ship/bmad-build/customize.toml +13 -16
  24. package/src/bmm-skills/ship/bmad-build/references/claims-check.md +14 -0
  25. package/src/bmm-skills/ship/bmad-build/review-prompts/edge-case-hunter.md +29 -7
  26. package/src/bmm-skills/ship/bmad-build/review-prompts/verification-gap.md +1 -1
  27. package/src/bmm-skills/ship/bmad-build/step-01-clarify-and-route.md +12 -7
  28. package/src/bmm-skills/ship/bmad-build/step-02-plan.md +13 -10
  29. package/src/bmm-skills/ship/bmad-build/step-03-implement.md +3 -1
  30. package/src/bmm-skills/ship/bmad-build/step-04-review.md +7 -5
  31. package/src/bmm-skills/ship/bmad-build/step-oneshot.md +7 -8
  32. package/src/bmm-skills/ship/bmad-build-auto/customize.toml +16 -18
  33. package/src/bmm-skills/ship/bmad-build-auto/references/claims-check.md +14 -0
  34. package/src/bmm-skills/ship/bmad-build-auto/review-prompts/edge-case-hunter.md +29 -7
  35. package/src/bmm-skills/ship/bmad-build-auto/review-prompts/verification-gap.md +1 -1
  36. package/src/bmm-skills/ship/bmad-build-auto/step-03-implement.md +5 -1
  37. package/src/bmm-skills/ship/bmad-build-auto/step-04-review.md +7 -5
  38. package/src/bmm-skills/ship/bmad-checkpoint-preview/customize.toml +1 -3
  39. package/src/bmm-skills/ship/bmad-code-review/customize.toml +14 -17
  40. package/src/bmm-skills/ship/bmad-code-review/references/claims-check.md +14 -0
  41. package/src/bmm-skills/ship/bmad-code-review/review-prompts/edge-case-hunter.md +29 -7
  42. package/src/bmm-skills/ship/bmad-code-review/review-prompts/verification-gap.md +1 -1
  43. package/src/bmm-skills/ship/bmad-code-review/steps/step-01-gather-context.md +22 -15
  44. package/src/bmm-skills/ship/bmad-code-review/steps/step-02-review.md +2 -2
  45. package/src/bmm-skills/ship/bmad-correct-course/SKILL.md +11 -3
  46. package/src/bmm-skills/ship/bmad-correct-course/customize.toml +1 -3
  47. package/src/bmm-skills/ship/bmad-qa-generate-e2e-tests/customize.toml +1 -3
  48. package/src/bmm-skills/ship/bmad-retrospective/customize.toml +1 -3
  49. package/src/bmm-skills/ship/bmad-retrospective/scripts/__pycache__/sprint_status.cpython-311.pyc +0 -0
  50. package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/__pycache__/test_git_evidence.cpython-311-pytest-9.1.1.pyc +0 -0
  51. package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/__pycache__/test_sprint_status.cpython-311-pytest-9.1.1.pyc +0 -0
  52. package/src/bmm-skills/v6-shims/bmad-create-architecture/SKILL.md +2 -0
  53. package/src/bmm-skills/v6-shims/bmad-create-architecture/customize.toml +1 -3
  54. package/src/bmm-skills/v6-shims/bmad-create-prd/SKILL.md +2 -0
  55. package/src/bmm-skills/v6-shims/bmad-create-prd/customize.toml +1 -3
  56. package/src/bmm-skills/v6-shims/bmad-create-story/SKILL.md +3 -1
  57. package/src/bmm-skills/v6-shims/bmad-create-story/customize.toml +1 -3
  58. package/src/bmm-skills/v6-shims/bmad-dev-auto/SKILL.md +2 -0
  59. package/src/bmm-skills/v6-shims/bmad-dev-story/SKILL.md +2 -0
  60. package/src/bmm-skills/v6-shims/bmad-dev-story/customize.toml +1 -6
  61. package/src/bmm-skills/v6-shims/bmad-document-project/SKILL.md +2 -0
  62. package/src/bmm-skills/v6-shims/bmad-domain-research/SKILL.md +2 -0
  63. package/src/bmm-skills/v6-shims/bmad-edit-prd/SKILL.md +2 -0
  64. package/src/bmm-skills/v6-shims/bmad-edit-prd/customize.toml +1 -3
  65. package/src/bmm-skills/v6-shims/bmad-market-research/SKILL.md +2 -0
  66. package/src/bmm-skills/v6-shims/bmad-quick-dev/SKILL.md +2 -0
  67. package/src/bmm-skills/v6-shims/bmad-sprint-status/SKILL.md +2 -0
  68. package/src/bmm-skills/v6-shims/bmad-sprint-status/customize.toml +1 -3
  69. package/src/bmm-skills/v6-shims/bmad-technical-research/SKILL.md +2 -0
  70. package/src/bmm-skills/v6-shims/bmad-validate-prd/SKILL.md +2 -0
  71. package/src/bmm-skills/v6-shims/bmad-validate-prd/customize.toml +1 -3
  72. package/src/core-skills/bmad-advanced-elicitation/SKILL.md +21 -22
  73. package/src/core-skills/bmad-brainstorming/customize.toml +5 -6
  74. package/src/core-skills/bmad-forge-idea/customize.toml +5 -6
  75. package/src/core-skills/bmad-party-mode/customize.toml +4 -4
  76. package/src/core-skills/bmad-review/SKILL.md +5 -4
  77. package/src/core-skills/bmad-review/customize.toml +1 -1
  78. package/src/core-skills/bmad-review/references/lens-edge-case-hunter.md +16 -0
  79. package/src/core-skills/v6-shims/bmad-editorial-review/SKILL.md +2 -0
  80. package/src/core-skills/v6-shims/bmad-editorial-review-prose/SKILL.md +2 -0
  81. package/src/core-skills/v6-shims/bmad-editorial-review-structure/SKILL.md +2 -0
  82. package/src/core-skills/v6-shims/bmad-review-adversarial-general/SKILL.md +2 -0
  83. package/src/core-skills/v6-shims/bmad-review-edge-case-hunter/SKILL.md +2 -0
  84. package/src/core-skills/v6-shims/bmad-review-verification-gap/SKILL.md +2 -0
  85. package/src/scripts/__pycache__/config_utils.cpython-311.pyc +0 -0
  86. package/src/scripts/tests/__pycache__/test_config_utils.cpython-311.pyc +0 -0
  87. package/src/scripts/tests/__pycache__/test_resolve_config.cpython-311.pyc +0 -0
  88. package/src/scripts/tests/__pycache__/test_resolve_customization.cpython-311.pyc +0 -0
  89. package/tools/installer/commands/install.js +2 -0
  90. package/tools/installer/core/config.js +3 -0
  91. package/tools/installer/core/installer.js +57 -1
  92. package/tools/installer/core/manifest-generator.js +6 -0
  93. package/tools/installer/core/manifest.js +6 -0
  94. package/tools/installer/core/shim-policy.js +159 -0
  95. package/tools/installer/ide/_config-driven.js +3 -3
  96. package/tools/installer/ide/platform-codes.yaml +7 -0
  97. package/tools/installer/modules/official-modules.js +38 -6
  98. package/tools/installer/prompts.js +15 -2
  99. package/tools/installer/ui.js +68 -3
@@ -5,10 +5,12 @@ When a diff is provided, scan only the diff hunks and list boundaries that are d
5
5
  When no diff is provided (full file or function), treat the entire provided content as the scope.
6
6
  Ignore the rest of the codebase unless the provided content explicitly references external functions.
7
7
  A brief secondary deletion check runs as Step 4 when the diff removes code.
8
+ A claims check runs as Step 5 when the launch message names a claims file.
8
9
 
9
10
  **Inputs:**
10
- - **content** — Content to review: diff, full file, or function
11
+ - **content** — Content to review, or a path to read it from: diff, full file, or function
11
12
  - **also_consider** (optional) — Areas to keep in mind during review alongside normal edge-case analysis
13
+ - **claims_file** (optional) — Path to the change's stated narrative. Do NOT read it before Step 5: the path tracing in Steps 2–3 must finish before the narrative is seen.
12
14
 
13
15
  **MANDATORY: Execute steps in the Execution section IN EXACT ORDER. DO NOT skip steps or change the sequence. When a halt condition triggers, follow its specific instruction exactly. Each action within a step is a REQUIRED action to complete that step.**
14
16
 
@@ -19,8 +21,8 @@ A brief secondary deletion check runs as Step 4 when the diff removes code.
19
21
 
20
22
  ### Step 1: Receive Content
21
23
 
22
- - Load the content to review strictly from the parent message that launched you (not from this instruction file)
23
- - If content is empty, or cannot be decoded as text, return `[{"location":"N/A","trigger_condition":"Input empty or undecodable","guard_snippet":"Provide valid content to review","potential_consequence":"Review skipped — no analysis performed"}]` and stop
24
+ - Take the content to review from the parent message that launched you — inline, or by reading the file it points to (never from this instruction file)
25
+ - If no content is supplied, or it is empty, unreadable, or cannot be decoded as text, return `[{"location":"N/A","trigger_condition":"Input empty or undecodable","guard_snippet":"Provide valid content to review","potential_consequence":"Review skipped — no analysis performed"}]` and stop
24
26
  - Identify content type (diff, full file, or function) to determine scope rules
25
27
 
26
28
  ### Step 2: Exhaustive Path Analysis
@@ -42,7 +44,11 @@ A brief secondary deletion check runs as Step 4 when the diff removes code.
42
44
 
43
45
  If the diff removed or replaced meaningful code (ignore pure renames and whitespace): load `references/deletion-check.md` and follow it.
44
46
 
45
- ### Step 5: Present Findings
47
+ ### Step 5: Claims Check
48
+
49
+ If the launch message provided a `claims_file` path and the file exists and is non-empty: load `references/claims-check.md` and follow it.
50
+
51
+ ### Step 6: Present Findings
46
52
 
47
53
  Output all findings as a single JSON array following the Output Format specification exactly.
48
54
 
@@ -60,12 +66,12 @@ Return ONLY a valid JSON array of objects. Each edge-case finding contains exact
60
66
  }]
61
67
  ```
62
68
 
63
- No extra text, no explanations, no markdown wrapping. An empty array `[]` is valid when nothing is found. Deletion findings from Step 4, if any, go in the same array with the extra fields defined in `references/deletion-check.md`.
69
+ No extra text, no explanations, no markdown wrapping. An empty array `[]` is valid when nothing is found. Deletion findings from Step 4 and claim findings from Step 5, if any, go in the same array with the extra fields defined in `references/deletion-check.md` and `references/claims-check.md`.
64
70
 
65
71
 
66
72
  ## HALT CONDITIONS
67
73
 
68
- - If content is empty or cannot be decoded as text, return `[{"location":"N/A","trigger_condition":"Input empty or undecodable","guard_snippet":"Provide valid content to review","potential_consequence":"Review skipped — no analysis performed"}]` and stop
74
+ - If no content is supplied, or it is empty, unreadable, or cannot be decoded as text, return `[{"location":"N/A","trigger_condition":"Input empty or undecodable","guard_snippet":"Provide valid content to review","potential_consequence":"Review skipped — no analysis performed"}]` and stop
69
75
  <reference path="references/deletion-check.md">
70
76
  # Deletion Check
71
77
 
@@ -82,7 +88,23 @@ For a deletion finding the standard fields read as: `location` = the removed ite
82
88
 
83
89
  Add nothing if nothing qualifies.
84
90
  </reference>
91
+ <reference path="references/claims-check.md">
92
+ # Claims Check
93
+
94
+ Final pass for the Edge Case Hunter — runs only when the message that launched you named a claims file. Read that file now, for the first time; the path tracing is finished and the claims cannot steer it retroactively.
95
+
96
+ The file holds the change's own narrative — commit messages and any stated description. The narrative is the author's testimony, not evidence: a claim repeated in a code comment is still the same claim, not confirmation. Extract each checkable claim — what the change does, what it preserves, ordering, arithmetic, and parity with existing code ("exactly as X does") — then try to falsify each one against the code you have already traced. Where your trace is not enough to decide, read the code that decides it: the compared-to function, the actual callee, the state the claim assumes.
97
+
98
+ Append one finding per falsified claim to the same JSON array, with the four standard fields plus:
99
+
100
+ - `kind`: `"claim"`
101
+ - `confidence`: `"high"`, `"medium"`, or `"low"`
102
+
103
+ For a claim finding the standard fields read as: `location` = where the code contradicts the claim; `trigger_condition` = the claim, quoted or tightly paraphrased; `guard_snippet` = what the code actually does; `potential_consequence` = what goes wrong for someone who believed the claim.
104
+
105
+ Verified claims produce nothing. Add nothing if nothing is falsified.
106
+ </reference>
85
107
 
86
108
  ## CONTENT SOURCE
87
109
 
88
- Review the content supplied under "Review content:" in the message that launched you.
110
+ "Review content:" in the message that launched you gives the content itself or a path to read it from. Read the file when it is a path; either way that is the content under review, and this instruction file never is.
@@ -110,4 +110,4 @@ When you find no verification gaps and no other findings, output exactly this si
110
110
 
111
111
  ## CONTENT SOURCE
112
112
 
113
- Review the content supplied under "Review content:" in the message that launched you. If none is supplied, stop with exactly: `No verification gaps found.`
113
+ "Review content:" in the message that launched you gives the content itself or a path to read it from. Read the file when it is a path; either way that is the content under review, and this instruction file never is. If no content is supplied, or it is empty or unreadable, stop with exactly: `No verification gaps found.`
@@ -1,5 +1,6 @@
1
1
  ---
2
- diff_output: '' # set at runtime
2
+ diff_file: '' # set at runtime: path to the diff file
3
+ claims_file: '' # set at runtime (path or empty)
3
4
  spec_file: '' # set at runtime (path or empty)
4
5
  review_mode: '' # set at runtime: "full" or "no-spec"
5
6
  story_key: '' # set at runtime when discovered from sprint status
@@ -11,7 +12,7 @@ story_key: '' # set at runtime when discovered from sprint status
11
12
 
12
13
  - YOU MUST ALWAYS SPEAK OUTPUT in your Agent communication style with the config `{communication_language}`
13
14
  - The prompt that triggered this workflow IS the intent — not a hint.
14
- - Do not modify any files. This step is read-only.
15
+ - Writing `{diff_file}` and the claims file is the only change this step may make. Otherwise it is read-only.
15
16
 
16
17
  ## INSTRUCTIONS
17
18
 
@@ -35,7 +36,10 @@ story_key: '' # set at runtime when discovered from sprint status
35
36
 
36
37
  **Tier 3 — Sprint tracking.**
37
38
  Look for a sprint status file (`*sprint-status*`) in `{implementation_artifacts}` or `{planning_artifacts}`. If found, scan for stories with status `review`:
38
- - **Exactly one `review` story:** Set `{story_key}` to the story's key (e.g., `1-2-user-auth`). Suggest it: "I found story <story-id> in `review` status. Would you like to review its changes? [Y] Yes / [N] No, let me choose". If confirmed, use the story context to determine the diff source (branch name derived from story slug, or uncommitted changes). If declined, clear `{story_key}` and fall through.
39
+ - **Exactly one `review` story:** Set `{story_key}` to the story's key (e.g., `1-2-user-auth`). HALT and give the user a choice:
40
+ - **Review this story** — review the detected story `<story-id>` (status `review`).
41
+ - **Choose another target** — pick a different review target.
42
+ If the user chooses **Review this story**, use the story context to determine the diff source (branch name derived from story slug, or uncommitted changes). If they choose **Choose another target**, clear `{story_key}` and fall through.
39
43
  - **Multiple `review` stories:** Present them as numbered options alongside a manual choice option. Wait for user selection. If a story is selected, set `{story_key}` and use its context to determine the diff source. If manual choice is selected, clear `{story_key}` and fall through.
40
44
  - **None:** Fall through.
41
45
 
@@ -54,16 +58,19 @@ story_key: '' # set at runtime when discovered from sprint status
54
58
  - **Specific commit range** (ask for the range)
55
59
  - **Provided diff or file list** (user pastes or provides a path)
56
60
 
57
- 3. Construct `{diff_output}` from the chosen source.
58
- - For **staged changes only**: run `git diff --cached`.
59
- - For **uncommitted changes** (staged + unstaged): run `git diff HEAD`.
60
- - For **branch diff**: verify the base branch exists before running `git diff`. If it does not exist, HALT and ask the user for a valid branch.
61
- - For **commit range**: verify the range resolves. If it does not, HALT and ask the user for a valid range.
62
- - For **provided diff**: validate the content is non-empty and parseable as a unified diff. If it is not parseable, HALT and ask the user to provide a valid diff.
63
- - For **file list**: validate each path exists in the working tree. Construct `{diff_output}` by running `git diff HEAD -- <path1> <path2> ...`. If any paths are untracked (new files not yet staged), use `git diff --no-index /dev/null <path>` to include them. If the diff is empty (files have no uncommitted changes and are not untracked), ask the user whether to review the full file contents or to specify a different baseline.
64
- - After constructing `{diff_output}`, verify it is non-empty regardless of source type. If empty, HALT and tell the user there is nothing to review.
61
+ 3. Write the diff for the chosen source to `{diff_file}` a uniquely-named file in the system temp directory, so concurrent reviews cannot collide. The review layers read that file; the diff text is never pasted into their prompts.
62
+ - For **staged changes only**: run `git diff --cached > {diff_file}`.
63
+ - For **uncommitted changes** (staged + unstaged): run `git diff HEAD > {diff_file}`.
64
+ - For **branch diff**: verify the base branch exists, then run `git diff <base-branch>...HEAD > {diff_file}`. If it does not exist, HALT and ask the user for a valid branch.
65
+ - For **commit range**: verify the range resolves, then run `git diff <range> > {diff_file}`. If it does not resolve, HALT and ask the user for a valid range.
66
+ - For **provided diff**: validate the content is non-empty and parseable as a unified diff. If it is not parseable, HALT and ask the user to provide a valid diff. Write the validated diff to `{diff_file}`.
67
+ - For **file list**: validate each path exists in the working tree. Run `git diff HEAD -- <path1> <path2> ... > {diff_file}`. If any paths are untracked (new files not yet staged), append them with `git diff --no-index /dev/null <path> >> {diff_file}`. If the diff is empty (files have no uncommitted changes and are not untracked), ask the user whether to review the full file contents or to specify a different baseline.
68
+ - After writing `{diff_file}`, verify it is non-empty regardless of source type. If empty, HALT and tell the user there is nothing to review.
69
+ - Read `{diff_file}` yourself whenever you need the diff for your own context — triage and presentation later in this workflow.
65
70
 
66
- 4. **Set the spec context.**
71
+ 4. **Stage the claims file.** Collect the change's own narrative: for a branch diff or commit range, the commit messages it covers (`git log <base>..<head>`); for other sources, whatever description of the change the user or conversation supplied. Write it verbatim to a uniquely-named file in the system temp directory and set `{claims_file}` to its path. If there is no narrative, set `{claims_file}` = `''`. Do not analyze or summarize the narrative — it is input for one review layer, staged as a file precisely so the other layers never see it.
72
+
73
+ 5. **Set the spec context.**
67
74
  - If the triggering request or recent conversation **explicitly** states there is no spec (e.g. "no spec", "without a spec", "no-spec"): set `{review_mode}` = `"no-spec"` and clear `{spec_file}` (set it to `''`). Do **not** ask for a spec. Do **not** infer no-spec mode merely because the invocation omitted a spec path.
68
75
  - Else if `{spec_file}` is already set (from Tier 1 or Tier 2): verify the file exists and is readable, then set `{review_mode}` = `"full"`.
69
76
  - Else (neither a spec path nor an explicit no-spec declaration is present): ask the user to choose:
@@ -72,10 +79,10 @@ story_key: '' # set at runtime when discovered from sprint status
72
79
  - If the user provides a path: set `{spec_file}` to that path, verify the file exists and is readable, then set `{review_mode}` = `"full"`.
73
80
  - If the user explicitly chooses to continue without a spec: set `{review_mode}` = `"no-spec"`.
74
81
 
75
- 5. If `{review_mode}` = `"full"` and the file at `{spec_file}` has a `context` field in its frontmatter listing additional docs, load each referenced document. Warn the user about any docs that cannot be found.
82
+ 6. If `{review_mode}` = `"full"` and the file at `{spec_file}` has a `context` field in its frontmatter listing additional docs, load each referenced document. Warn the user about any docs that cannot be found.
76
83
 
77
- 6. Sanity check: if `{diff_output}` exceeds approximately 3000 lines, warn the user and offer to chunk the review by file group.
78
- - If the user opts to chunk: agree on the first group, narrow `{diff_output}` accordingly, and list the remaining groups for the user to note for follow-up runs.
84
+ 7. Sanity check: if `wc -l {diff_file}` exceeds approximately 3000 lines, warn the user and offer to chunk the review by file group.
85
+ - If the user opts to chunk: agree on the first group, rebuild `{diff_file}` narrowed to that group, and list the remaining groups for the user to note for follow-up runs.
79
86
  - If the user declines: proceed as-is with the full diff.
80
87
 
81
88
  ### CHECKPOINT
@@ -8,7 +8,7 @@ failed_layers: '' # set at runtime: comma-separated list of layers that failed o
8
8
 
9
9
  - YOU MUST ALWAYS SPEAK OUTPUT in your Agent communication style with the config `{communication_language}`
10
10
  - All review subagents must run at the same model capability as the current session.
11
- - Run subagents synchronously: launch them together, then wait for all results before continuing.
11
+ - Run subagents synchronously: launch them together as blocking calls awaited in this turn — never backgrounded or detached, never ending the turn to await results.
12
12
 
13
13
  ## INSTRUCTIONS
14
14
 
@@ -21,7 +21,7 @@ failed_layers: '' # set at runtime: comma-separated list of layers that failed o
21
21
 
22
22
  If no layer is active, HALT with status `blocked` and blocking condition `no active review layers`.
23
23
 
24
- 3. Execute all active layers in parallel wherever their execution methods allow: expand `{skill-root}` in each layer's `instruction` to this skill's absolute installed directory, then substitute the runtime placeholders (`{diff_output}`, `{spec_file}`). For an instruction that launches a reviewer subagent, launch that child with the prompt text after placeholder substitution; do not load the reviewer instruction file yourself. For any other customized instruction, execute it as written. Do not leave `{skill-root}` unresolved in a child prompt. If a layer's instruction requires subagents and subagents are not available, for each such layer write under `{implementation_artifacts}` the exact child prompt from that layer's instruction after placeholder substitution (not a path-only pointer), then HALT. Ask the user to run each in a separate session (ideally a different LLM) and paste back the findings. When findings are pasted, treat them as those layers' findings and resume from this point. This is the only allowed parent-side read of a reviewer instruction file.
24
+ 3. Announce skipped layers first, then launch every active layer before handling any layer's result. Try running all active layers simultaneously: expand `{skill-root}` in each layer's `instruction` to this skill's absolute installed directory, then substitute the runtime placeholders (`{diff_file}`, `{claims_file}`, `{spec_file}`). `{diff_file}` is a path: substitute the path itself and let the layer read the file — a launch prompt never carries diff text. For an instruction that launches a reviewer subagent, launch that child with the prompt text after placeholder substitution; do not load the reviewer instruction file yourself. For any other customized instruction, execute it as written. Do not leave `{skill-root}` unresolved in a child prompt, and resolve `{diff_file}` to an absolute path — the child's working directory is not yours. If a layer's instruction requires subagents and subagents are not available, for each such layer write under `{implementation_artifacts}` that layer's child prompt with everything after its content label replaced by the contents of `{diff_file}` (not a path-only pointer) — that session may not share this filesystem, so its prompt must be self-contained. Then HALT. Ask the user to run each in a separate session (ideally a different LLM) and paste back the findings. When findings are pasted, treat them as those layers' findings and resume from this point. This is the only allowed parent-side read of a reviewer instruction file.
25
25
 
26
26
  4. **Layer failure handling**: If any layer fails, times out, or returns empty results, append the layer's `name` to `{failed_layers}` (comma-separated) and proceed with findings from the remaining layers.
27
27
 
@@ -182,8 +182,12 @@ Activation is complete. If `activation_steps_prepend` or `activation_steps_appen
182
182
 
183
183
  <check if="mode is Incremental">
184
184
  <action>Present each edit proposal individually</action>
185
- <ask>Review and refine this change? Options: Approve [a], Edit [e], Skip [s]</ask>
186
- <action>Iterate on each proposal based on user feedback</action>
185
+ <action>HALT and give the user a choice:
186
+ - **Approve** accept this proposal
187
+ - **Edit** — refine this proposal
188
+ - **Skip** — drop this proposal
189
+ </action>
190
+ <action>If the user chooses **Approve**, keep the proposal. If they choose **Edit**, refine it with them. If they choose **Skip**, drop it. Continue to the next proposal.</action>
187
191
  </check>
188
192
 
189
193
  <action if="mode is Batch">Collect all edit proposals and present together at end of step</action>
@@ -232,7 +236,11 @@ Activation is complete. If `activation_steps_prepend` or `activation_steps_appen
232
236
 
233
237
  <action>Present complete Sprint Change Proposal to user</action>
234
238
  <action>Write Sprint Change Proposal document to {default_output_file}</action>
235
- <ask>Review complete proposal. Continue [c] or Edit [e]?</ask>
239
+ <action>HALT and give the user a choice:
240
+ - **Continue** — proceed to approval
241
+ - **Edit** — revise the proposal first
242
+ </action>
243
+ <action>If the user chooses **Edit**, revise the proposal with them and write the updated document before continuing.</action>
236
244
  </step>
237
245
 
238
246
  <step n="5" goal="Finalize and Route for Implementation">
@@ -30,9 +30,7 @@ activation_steps_append = []
30
30
  # - a file reference prefixed with `file:`, e.g. "file:{project-root}/docs/standards.md"
31
31
  # (glob patterns are supported; the file's contents are loaded and treated as facts).
32
32
 
33
- persistent_facts = [
34
- "file:{project-root}/**/project-context.md",
35
- ]
33
+ persistent_facts = []
36
34
 
37
35
  # Scalar: executed when the workflow reaches Step 6 (Workflow Completion),
38
36
  # after the Sprint Change Proposal is finalized and handoff is confirmed. Override wins.
@@ -30,9 +30,7 @@ activation_steps_append = []
30
30
  # - a file reference prefixed with `file:`, e.g. "file:{project-root}/docs/standards.md"
31
31
  # (glob patterns are supported; the file's contents are loaded and treated as facts).
32
32
 
33
- persistent_facts = [
34
- "file:{project-root}/**/project-context.md",
35
- ]
33
+ persistent_facts = []
36
34
 
37
35
  # Scalar: executed when the workflow reaches Step 5 (Create Summary),
38
36
  # after all tests pass and the summary document is saved. Override wins.
@@ -30,9 +30,7 @@ activation_steps_append = []
30
30
  # - a file reference prefixed with `file:`, e.g. "file:{project-root}/docs/standards.md"
31
31
  # (glob patterns are supported; the file's contents are loaded and treated as facts).
32
32
 
33
- persistent_facts = [
34
- "file:{project-root}/**/project-context.md",
35
- ]
33
+ persistent_facts = []
36
34
 
37
35
  # Scalar: executed at the end of Phase 5 (Close), after the retrospective
38
36
  # document is saved and sprint-status is updated. Override wins.
@@ -1,6 +1,8 @@
1
1
  ---
2
2
  name: bmad-create-architecture
3
3
  description: 'Deprecated — forwards to bmad-architecture (create intent)'
4
+ metadata:
5
+ lifecycle: shim
4
6
  ---
5
7
 
6
8
  # DEPRECATED — forwards to bmad-architecture (create intent)
@@ -30,9 +30,7 @@ activation_steps_append = []
30
30
  # - a file reference prefixed with `file:`, e.g. "file:{project-root}/docs/standards.md"
31
31
  # (glob patterns are supported; the file's contents are loaded and treated as facts).
32
32
 
33
- persistent_facts = [
34
- "file:{project-root}/**/project-context.md",
35
- ]
33
+ persistent_facts = []
36
34
 
37
35
  # Scalar: executed when the workflow reaches Step 8 (Architecture Completion & Handoff),
38
36
  # after the architecture document frontmatter is updated and next-steps guidance is given.
@@ -1,6 +1,8 @@
1
1
  ---
2
2
  name: bmad-create-prd
3
3
  description: 'Deprecated — forwards to bmad-prd (create intent)'
4
+ metadata:
5
+ lifecycle: shim
4
6
  ---
5
7
 
6
8
  # DEPRECATED — forwards to bmad-prd (create intent)
@@ -30,9 +30,7 @@ activation_steps_append = []
30
30
  # - a file reference prefixed with `file:`, e.g. "file:{project-root}/docs/standards.md"
31
31
  # (glob patterns are supported; the file's contents are loaded and treated as facts).
32
32
 
33
- persistent_facts = [
34
- "file:{project-root}/**/project-context.md",
35
- ]
33
+ persistent_facts = []
36
34
 
37
35
  # Scalar: executed when the workflow reaches Step 12 (Workflow Completion),
38
36
  # after the PRD is finalized and workflow status is updated. Override wins.
@@ -1,6 +1,8 @@
1
1
  ---
2
2
  name: bmad-create-story
3
3
  description: "Deprecated: `bmad-build` is now the official implementation method. Only use this when explicitly invoked by name"
4
+ metadata:
5
+ lifecycle: shim
4
6
  ---
5
7
 
6
8
  # Create Story Workflow
@@ -255,7 +257,7 @@ Activation is complete. If `activation_steps_prepend` or `activation_steps_appen
255
257
 
256
258
  <!-- Load all available content through discovery protocol -->
257
259
  <action>Read fully and follow `./discover-inputs.md` to load all input files</action>
258
- <note>Available content: {epics_content}, {prd_content}, {architecture_content}, {ux_content}, plus the project-context facts loaded during activation via `persistent_facts`.</note>
260
+ <note>Available content: {epics_content}, {prd_content}, {architecture_content}, {ux_content}, plus any facts loaded during activation via `persistent_facts` (empty unless the user opted in).</note>
259
261
 
260
262
  <!-- Analyze epics file for story foundation -->
261
263
  <action>From {epics_content}, extract Epic {{epic_num}} complete context:</action> **EPIC ANALYSIS:** - Epic
@@ -30,9 +30,7 @@ activation_steps_append = []
30
30
  # - a file reference prefixed with `file:`, e.g. "file:{project-root}/docs/standards.md"
31
31
  # (glob patterns are supported; the file's contents are loaded and treated as facts).
32
32
 
33
- persistent_facts = [
34
- "file:{project-root}/**/project-context.md",
35
- ]
33
+ persistent_facts = []
36
34
 
37
35
  # Scalar: executed when the workflow reaches Step 6 (Update sprint status and finalize),
38
36
  # after the story file is saved and sprint-status.yaml is updated. Override wins.
@@ -1,6 +1,8 @@
1
1
  ---
2
2
  name: bmad-dev-auto
3
3
  description: "Deprecated: forwards to bmad-build-auto. Do not use unless invoked by name"
4
+ metadata:
5
+ lifecycle: shim
4
6
  ---
5
7
 
6
8
  # Deprecated Build Auto Alias
@@ -1,6 +1,8 @@
1
1
  ---
2
2
  name: bmad-dev-story
3
3
  description: "Deprecated: `bmad-build` is now the official implementation method. Only use this when explicitly invoked by name"
4
+ metadata:
5
+ lifecycle: shim
4
6
  ---
5
7
 
6
8
  # Dev Story Workflow
@@ -30,12 +30,7 @@ activation_steps_append = []
30
30
  # - a file reference prefixed with `file:`, e.g. "file:{project-root}/docs/standards.md"
31
31
  # (glob patterns are supported; the file's contents are loaded and treated as facts).
32
32
 
33
- persistent_facts = [
34
- "file:{project-root}/**/project-context.md",
35
- "Never add epic or story references as inline code comments (e.g. # Epic: X, # Story: PROJ-42).",
36
- "Code comments explain why, not what — no AI workflow metadata, planning refs, or story tracking in source code.",
37
- "Generated code must be production-ready: clean, minimal, and free of AI-generated noise.",
38
- ]
33
+ persistent_facts = []
39
34
 
40
35
  # Scalar: executed when the workflow reaches its final step,
41
36
  # after the story implementation is complete and status is updated. Override wins.
@@ -1,6 +1,8 @@
1
1
  ---
2
2
  name: bmad-document-project
3
3
  description: 'Deprecated — forwards to bmad-project-context. Use when the user says "document this project" or "generate project docs"'
4
+ metadata:
5
+ lifecycle: shim
4
6
  ---
5
7
 
6
8
  # DEPRECATED — forwards to bmad-project-context
@@ -1,6 +1,8 @@
1
1
  ---
2
2
  name: bmad-domain-research
3
3
  description: 'Deprecated — forwards to bmad-deep-recon (domain type)'
4
+ metadata:
5
+ lifecycle: shim
4
6
  ---
5
7
 
6
8
  # DEPRECATED — forwards to bmad-deep-recon (domain type)
@@ -1,6 +1,8 @@
1
1
  ---
2
2
  name: bmad-edit-prd
3
3
  description: 'Deprecated — forwards to bmad-prd (update intent)'
4
+ metadata:
5
+ lifecycle: shim
4
6
  ---
5
7
 
6
8
  # DEPRECATED — forwards to bmad-prd (update intent)
@@ -30,9 +30,7 @@ activation_steps_append = []
30
30
  # - a file reference prefixed with `file:`, e.g. "file:{project-root}/docs/standards.md"
31
31
  # (glob patterns are supported; the file's contents are loaded and treated as facts).
32
32
 
33
- persistent_facts = [
34
- "file:{project-root}/**/project-context.md",
35
- ]
33
+ persistent_facts = []
36
34
 
37
35
  # Scalar: executed when the workflow reaches Step E-4 (Complete & Validate) and the
38
36
  # user exits via [S] Summary or [X] Exit — not on [V] Validate (which chains to
@@ -1,6 +1,8 @@
1
1
  ---
2
2
  name: bmad-market-research
3
3
  description: 'Deprecated — forwards to bmad-deep-recon (market type)'
4
+ metadata:
5
+ lifecycle: shim
4
6
  ---
5
7
 
6
8
  # DEPRECATED — forwards to bmad-deep-recon (market type)
@@ -1,6 +1,8 @@
1
1
  ---
2
2
  name: bmad-quick-dev
3
3
  description: "Deprecated: forwards to bmad-build. Do not use unless invoked by name"
4
+ metadata:
5
+ lifecycle: shim
4
6
  ---
5
7
 
6
8
  # Deprecated Build Alias
@@ -1,6 +1,8 @@
1
1
  ---
2
2
  name: bmad-sprint-status
3
3
  description: 'Deprecated — forwards to bmad-sprint-planning (status view)'
4
+ metadata:
5
+ lifecycle: shim
4
6
  ---
5
7
 
6
8
  # DEPRECATED — forwards to bmad-sprint-planning (status view)
@@ -30,9 +30,7 @@ activation_steps_append = []
30
30
  # - a file reference prefixed with `file:`, e.g. "file:{project-root}/docs/standards.md"
31
31
  # (glob patterns are supported; the file's contents are loaded and treated as facts).
32
32
 
33
- persistent_facts = [
34
- "file:{project-root}/**/project-context.md",
35
- ]
33
+ persistent_facts = []
36
34
 
37
35
  # Scalar: executed when the workflow reaches its final step,
38
36
  # after sprint status is summarized and risks are surfaced. Override wins.
@@ -1,6 +1,8 @@
1
1
  ---
2
2
  name: bmad-technical-research
3
3
  description: 'Deprecated — forwards to bmad-deep-recon (technical type)'
4
+ metadata:
5
+ lifecycle: shim
4
6
  ---
5
7
 
6
8
  # DEPRECATED — forwards to bmad-deep-recon (technical type)
@@ -1,6 +1,8 @@
1
1
  ---
2
2
  name: bmad-validate-prd
3
3
  description: 'Deprecated — forwards to bmad-prd (validate intent)'
4
+ metadata:
5
+ lifecycle: shim
4
6
  ---
5
7
 
6
8
  # DEPRECATED — forwards to bmad-prd (validate intent)
@@ -30,9 +30,7 @@ activation_steps_append = []
30
30
  # - a file reference prefixed with `file:`, e.g. "file:{project-root}/docs/standards.md"
31
31
  # (glob patterns are supported; the file's contents are loaded and treated as facts).
32
32
 
33
- persistent_facts = [
34
- "file:{project-root}/**/project-context.md",
35
- ]
33
+ persistent_facts = []
36
34
 
37
35
  # Scalar: executed when the workflow reaches Step 13 (Validation Report Complete) and
38
36
  # the user exits via [X] Exit — not on [E] Use Edit Workflow (which chains to
@@ -19,7 +19,7 @@ You are BMad's shared refinement checkpoint: other skills invoke you at natural
19
19
 
20
20
  ## Serving the Catalog
21
21
 
22
- `scripts/pick_methods.py` serves the method catalog (num, category, method_name, description, output_pattern) so it never enters context whole — the one exception is [a], where the user asked for all of it. Invoke as:
22
+ `scripts/pick_methods.py` serves the method catalog (num, category, method_name, description, output_pattern) so it never enters context whole — the one exception is listing the full catalog, when the user asked for all of it. Invoke as:
23
23
 
24
24
  ```bash
25
25
  uv run {skill-root}/scripts/pick_methods.py --file {workflow.methods_file} <command>
@@ -28,7 +28,7 @@ uv run {skill-root}/scripts/pick_methods.py --file {workflow.methods_file} <comm
28
28
  If `{workflow.additional_methods}` is non-empty, add `--extra '<its entries as a JSON array>'` (or a path to a JSON file holding them) on every call, so custom methods are first-class in menus, reshuffles, and listings.
29
29
 
30
30
  - `categories` — category names + counts, the cheap map.
31
- - `list --category <cat> [--category <cat>]` — the index for chosen categories; `--all` dumps the whole catalog, only for [a].
31
+ - `list --category <cat> [--category <cat>]` — the index for chosen categories; `--all` dumps the whole catalog, only when listing all.
32
32
  - `show <name-or-num> [...]` — full rows by name or num.
33
33
  - `random -n 5 --spread [--exclude <name>]...` — a category-diverse random draw.
34
34
 
@@ -36,30 +36,29 @@ If `{workflow.additional_methods}` is non-empty, add `--extra '<its entries as a
36
36
 
37
37
  ## The Menu
38
38
 
39
- ```
40
- **Advanced Elicitation Options**
41
- Choose a number (1-5), [r] to Reshuffle, [a] List All, or [x] to Proceed:
42
-
43
- 1. [Method Name]
44
- 2. [Method Name]
45
- 3. [Method Name]
46
- 4. [Method Name]
47
- 5. [Method Name]
48
- r. Reshuffle the list with 5 new options
49
- a. List all methods with descriptions
50
- x. Proceed / No Further Actions
51
- ```
39
+ HALT and give the user a choice:
40
+
41
+ - The five offered methods, listed by name. The user may pick one or several.
42
+ - **Reshuffle** — replace the list with five new options.
43
+ - **List all** — show the full catalog with descriptions.
44
+ - **Proceed** — no further elicitation.
52
45
 
53
- This menu is the interface other skills and their users rely on — keep its options and behavior stable. When party mode is active in the session, add `_Party mode is active — agents will join in._` under the heading. Handle the response:
46
+ This menu is the interface other skills and their users rely on — keep its options and behavior stable. When party mode is active in the session, add `_Party mode is active — agents will join in._` under the heading.
54
47
 
55
- - **1–5** run that method (several numbers: in sequence), then re-present the menu.
56
- - **r** reshuffle as above and re-present.
57
- - **a** show the full catalog (`list --all`) as a compact table; a pick by name or number runs like a numbered choice.
58
- - **x** done. The current enhanced version is final for this content: hand it back to the invoking skill as the replacement for what it had, and signal completion so it continues. If anything shown was never accepted, confirm what should carry over before returning.
59
- - **Anything else** treat as direction: apply it to the target and re-present the menu.
48
+ - If the user picks methods: run them (several: in sequence), then offer the menu again.
49
+ - If the user chooses **Reshuffle**: reshuffle as above and offer the menu again.
50
+ - If the user chooses **List all**: show the full catalog (`list --all`) as a compact table; a pick by name or number runs like a method choice.
51
+ - If the user chooses **Proceed**: done. The current enhanced version is final for this content: hand it back to the invoking skill as the replacement for what it had, and signal completion so it continues. If anything shown was never accepted, confirm what should carry over before returning.
52
+ - Any other reply is direction: apply it to the target and offer the menu again.
60
53
 
61
54
  ## Running a Method
62
55
 
63
- Use the method's description as its intent and its output_pattern as a flexible flow guide; scale depth to the target — a paragraph gets a light pass, an architecture decision gets the full treatment. Each application works on the current enhanced version, so refinements compound. Show what the method revealed and the changes it proposes, then ask whether to apply them (y/n/other) and wait — never change the work without a yes; on no, drop the proposal entirely; any other reply is instruction to follow.
56
+ Use the method's description as its intent and its output_pattern as a flexible flow guide; scale depth to the target — a paragraph gets a light pass, an architecture decision gets the full treatment. Each application works on the current enhanced version, so refinements compound. Show what the method revealed and the changes it proposes, then HALT and give the user a choice:
57
+
58
+ - **Apply** — accept the proposed changes.
59
+ - **Reject** — drop the proposal entirely.
60
+ - Or give different direction.
61
+
62
+ Never change the work unless the user accepts the proposal. If they reject it, drop the proposal entirely. Any other reply is instruction to follow.
64
63
 
65
64
  When a method casts personas (round tables, panels, debates), reuse party members already in the session if party mode is active; otherwise resolve installed agents on demand via `uv run {project-root}/_bmad/scripts/resolve_config.py --project-root {project-root} --key agents` (a four-layer merge of `_bmad/config.toml`, `config.user.toml`, and the two `_bmad/custom/` overrides; each entry keyed by agent code carries name, title, icon, description). If neither yields a fit, invent named viewpoints suited to the content.
@@ -22,12 +22,11 @@ activation_steps_append = []
22
22
  # Persistent facts the facilitator keeps in mind for the whole session
23
23
  # (domain constraints, house rules, stylistic guardrails). Each entry is a
24
24
  # literal sentence, a skill prefixed with `skill:`, or a `file:`-prefixed
25
- # path/glob whose contents are loaded as facts. Default loads project-context.md
26
- # if bmad-generate-project-context has produced one, giving the facilitator
27
- # persistent awareness of the project's domain without re-asking.
28
- persistent_facts = [
29
- "file:{project-root}/**/project-context.md",
30
- ]
25
+ # path/glob whose contents are loaded as facts. Empty by default — repo-wide context
26
+ # belongs in AGENTS.md (see bmad-project-context), which every skill already sees. Use
27
+ # this for context only the facilitator needs, loaded on demand rather than carried as
28
+ # constant memory (e.g. `file:{project-root}/**/project-context.md` if you keep one).
29
+ persistent_facts = []
31
30
 
32
31
  # The technique library loaded on demand during the session. Swap the path in
33
32
  # team/user TOML to ship a different or extended catalog of creative methods.
@@ -20,12 +20,11 @@ activation_steps_append = []
20
20
  # Persistent facts the interrogator keeps in mind for the whole session
21
21
  # (domain constraints, house rules, what's off the table). Each entry is a
22
22
  # literal sentence, a skill prefixed with `skill:`, or a `file:`-prefixed
23
- # path/glob whose contents are loaded as facts. Default loads project-context.md
24
- # when one exists (e.g. from bmad-generate-project-context), so the forge grounds
25
- # in the project's tech, domain, and constraints without re-asking.
26
- persistent_facts = [
27
- "file:{project-root}/**/project-context.md",
28
- ]
23
+ # path/glob whose contents are loaded as facts. Empty by default — repo-wide context
24
+ # belongs in AGENTS.md (see bmad-project-context), which every skill already sees. Use
25
+ # this for context only the forge needs, loaded on demand rather than carried as constant
26
+ # memory (e.g. `file:{project-root}/**/project-context.md` if you keep one).
27
+ persistent_facts = []
29
28
 
30
29
  # Executed when the session completes. Scalar or array of instructions. Empty for none.
31
30
  on_complete = []
@@ -22,10 +22,10 @@ activation_steps_append = []
22
22
  # Persistent facts the orchestrator keeps in mind for the whole session
23
23
  # (house rules, running gags, topics to avoid). Each entry is a literal
24
24
  # sentence, a `skill:`-prefixed reference, or a `file:`-prefixed path/glob whose
25
- # contents load as facts. Default picks up project-context.md if one exists.
26
- persistent_facts = [
27
- "file:{project-root}/**/project-context.md",
28
- ]
25
+ # contents load as facts. Empty by default — repo-wide context belongs in AGENTS.md
26
+ # (see bmad-project-context), which every skill already sees. Use this for context only
27
+ # the party needs, loaded on demand rather than carried as constant memory.
28
+ persistent_facts = []
29
29
 
30
30
  # Which party loads when the user just says "party mode" with no override.
31
31
  # Empty = the installed BMAD agents — exactly the default behavior of a plain