bmad-method 6.11.1-next.42 → 6.11.1-next.44

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 (20) hide show
  1. package/package.json +1 -1
  2. package/src/bmm-skills/plan/bmad-sprint-planning/scripts/__pycache__/sprint_plan.cpython-311.pyc +0 -0
  3. package/src/bmm-skills/plan/bmad-sprint-planning/scripts/tests/__pycache__/test_sprint_plan.cpython-311-pytest-9.1.1.pyc +0 -0
  4. package/src/bmm-skills/ship/bmad-build/SKILL.md +1 -1
  5. package/src/bmm-skills/ship/bmad-build/customize.toml +6 -15
  6. package/src/bmm-skills/ship/bmad-build/spec-template.md +4 -4
  7. package/src/bmm-skills/ship/bmad-build/step-01-clarify-and-route.md +2 -2
  8. package/src/bmm-skills/ship/bmad-build/step-02-plan.md +1 -1
  9. package/src/bmm-skills/ship/bmad-build/step-03-implement.md +1 -1
  10. package/src/bmm-skills/ship/bmad-build/step-05-present.md +6 -43
  11. package/src/bmm-skills/ship/bmad-build/step-oneshot.md +50 -38
  12. package/src/bmm-skills/ship/bmad-build/sync-sprint-status.md +5 -19
  13. package/src/bmm-skills/ship/bmad-retrospective/scripts/__pycache__/sprint_status.cpython-311.pyc +0 -0
  14. package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/__pycache__/test_git_evidence.cpython-311-pytest-9.1.1.pyc +0 -0
  15. package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/__pycache__/test_sprint_status.cpython-311-pytest-9.1.1.pyc +0 -0
  16. package/src/scripts/__pycache__/config_utils.cpython-311.pyc +0 -0
  17. package/src/scripts/tests/__pycache__/test_config_utils.cpython-311.pyc +0 -0
  18. package/src/scripts/tests/__pycache__/test_resolve_config.cpython-311.pyc +0 -0
  19. package/src/scripts/tests/__pycache__/test_resolve_customization.cpython-311.pyc +0 -0
  20. package/tools/tests/__pycache__/test_validate_skills.cpython-311.pyc +0 -0
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "bmad-method",
4
- "version": "6.11.1-next.42",
4
+ "version": "6.11.1-next.44",
5
5
  "description": "Breakthrough Method of Agile AI-driven Development",
6
6
  "keywords": [
7
7
  "agile",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: bmad-build
3
- description: 'Turns a work item — feature, story, bug fix, change request — into working code, reviewed and verified. Use when the user hands over an outcome and leaves the edits to you; a bare story or issue link counts. Also use whenever the user asks BMAD by name then any change qualifies, even a tiny fully-specified edit. Do not volunteer for interactive edits the user directs and reviews themselves, or for version-control operations that record existing work without changing it.'
3
+ description: 'Turns implementation work into working code, reviewed and verified. Use when the user delegates a feature, story, bug fix, or meaningful change; a bare story or issue link counts. Skip obvious, low-risk mechanical maintenance such as small ignore-file, typo-only, formatting-only, or configuration-hygiene edits. Explicit BMAD requests always qualify. Do not volunteer for user-directed interactive edits or version-control operations that only record existing work.'
4
4
  ---
5
5
 
6
6
  Run the following command exactly once without changing the current working directory. Replace `{project-root}` with the absolute path to the project root and `{skill-root}` with the absolute path to this skill's directory:
@@ -31,19 +31,16 @@ persistent_facts = []
31
31
 
32
32
  on_complete = ""
33
33
 
34
- # How Build opens a completed spec for human review. The default deliberately
35
- # opens the repository root first and the spec second in a reused VS Code
36
- # window so relative review links resolve in the correct workspace. Override
37
- # this with the application and equivalent behavior you prefer. Set it to an
38
- # empty string to disable automatic opening and all related completion output.
34
+ # Optional instructions for opening a completed spec. The empty default leaves
35
+ # the spec closed. Override this with the application and behavior you prefer.
39
36
  # Example requests for bmad-customize: "Open completed specs in Cursor and
40
37
  # reuse the project window" or "Do not open completed specs automatically."
41
38
  #
42
39
  # Example `open_spec` override instructions for bmad-build.user.toml:
43
40
  # {project-root} and {spec_file} are substituted at run time.
44
41
  #
45
- # VS Code and compatible GUI editors — shipped default uses `code`; Cursor,
46
- # Windsurf, Antigravity, Zed, and similar editors can substitute their launcher.
42
+ # VS Code and compatible GUI editors — a custom override can use `code`; Cursor,
43
+ # Windsurf, Antigravity, Zed, and similar editors can use their own launcher.
47
44
  # Preserve reuse-window behavior when the launcher supports it, and always pass
48
45
  # the repository root first and the spec second:
49
46
  # Run `code -r "{project-root}" "{spec_file}"`, root first.
@@ -61,13 +58,7 @@ on_complete = ""
61
58
  # Emacs — reuse an Emacs server without waiting for the buffer to close:
62
59
  # Run `cd "{project-root}" && emacsclient -n "{spec_file}"`.
63
60
  #
64
- # For every non-empty override, also tell Build to note in the completion summary
65
- # that the spec was sent to the chosen editor and contains a Suggested Review
66
- # Order, then include the default navigation tip shown below.
67
-
68
- open_spec = """
69
- Run `code -r "{project-root}" "{spec_file}"` — the repository root first so VS Code opens in the right context, then the spec file. Always double-quote both paths to handle spaces and special characters. If `code` is unavailable or the command fails, skip gracefully and tell the user the spec file path instead. In the completion summary, note that the spec was sent to VS Code and that it contains a Suggested Review Order, then add this navigation tip: "Ctrl+click (Cmd+click on macOS) the links in the Suggested Review Order to jump to each stop."
70
- """
61
+ open_spec = ""
71
62
 
72
63
  # Handoff for the implementation subagent in step 03. The whole execution
73
64
  # recipe — a subagent by default, but an override may run it any other way
@@ -138,7 +129,7 @@ Do not invoke any skill, and do not spawn subagents of your own — you are the
138
129
 
139
130
  """
140
131
 
141
- # Review layers for the in-session (light) route.
132
+ # Review layers for the oneshot route.
142
133
 
143
134
  [[workflow.oneshot_review_layers]]
144
135
  id = "blind-hunter"
@@ -3,7 +3,7 @@ title: '{title}'
3
3
  type: 'feature' # feature | bugfix | refactor | chore
4
4
  created: '{date}'
5
5
  status: 'draft' # draft | ready-for-dev | in-progress | in-review | done
6
- route: '' # in-session | dispatch — set by step-02's route gate after design
6
+ route: '' # oneshot | dispatch — set by step-02's route gate after design
7
7
  review_loop_iteration: 0 # incremented by step-04 before each review loopback
8
8
  context: [] # optional: `{project-root}/`-prefixed paths to project-wide standards/docs the implementation agent should load. Keep short — only what isn't already distilled into the spec body.
9
9
  ---
@@ -26,7 +26,7 @@ context: [] # optional: `{project-root}/`-prefixed paths to project-wide standar
26
26
  ## Boundaries & Constraints
27
27
 
28
28
  <!-- Two tiers: Always = invariant rules. Never = out of scope + forbidden approaches. -->
29
- <!-- If step-02's route gate reported all facts clean (route: 'in-session'), DELETE THIS ENTIRE SECTION. -->
29
+ <!-- If step-02's route gate reported all facts clean (route: 'oneshot'), DELETE THIS ENTIRE SECTION. -->
30
30
 
31
31
  **Always:** INVARIANT_RULES
32
32
 
@@ -56,7 +56,7 @@ context: [] # optional: `{project-root}/`-prefixed paths to project-wide standar
56
56
  ## Code Map
57
57
 
58
58
  <!-- Agent-populated during planning. Annotated paths prevent blind codebase searching. -->
59
- <!-- If step-02's route gate reported all facts clean (route: 'in-session'), DELETE THIS ENTIRE SECTION. -->
59
+ <!-- If step-02's route gate reported all facts clean (route: 'oneshot'), DELETE THIS ENTIRE SECTION. -->
60
60
 
61
61
  - `FILE` -- ROLE_OR_RELEVANCE
62
62
  - `FILE` -- ROLE_OR_RELEVANCE
@@ -66,7 +66,7 @@ context: [] # optional: `{project-root}/`-prefixed paths to project-wide standar
66
66
  <!-- Tasks: backtick-quoted file path -- action -- rationale. Prefer one task per file; group tightly-coupled changes when splitting would be artificial. -->
67
67
  <!-- If an I/O Matrix is present, include a task to unit-test its edge cases. -->
68
68
  <!-- AC covers system-level behaviors not captured by the I/O Matrix. Do not duplicate I/O scenarios here. -->
69
- <!-- If step-02's route gate reported all facts clean (route: 'in-session'), DELETE THIS ENTIRE SECTION. -->
69
+ <!-- If step-02's route gate reported all facts clean (route: 'oneshot'), DELETE THIS ENTIRE SECTION. -->
70
70
 
71
71
  **Execution:**
72
72
  - [ ] `FILE` -- ACTION -- RATIONALE
@@ -20,7 +20,7 @@ Before listing artifacts, resolve existing workflow state in this order. Skip th
20
20
  Did the user pass a specific file path, spec name, or clear instruction this message?
21
21
  - If the user explicitly supplied a spec folder and a story id, with no specific spec file path, set `spec_folder` and `story_id`. Read `{spec_folder}/stories.yaml`; if it is missing or fails to parse, HALT rather than falling back to `{{.implementation_artifacts}}`. Find the one entry whose string `id` exactly equals `story_id`; if none exists, HALT rather than falling back. Use that entry's `title` and `description` as the starting intent.
22
22
  - Look for files matching `{spec_folder}/stories/{story_id}-*.md`. More than one match → HALT rather than choosing one. Exactly one match → set `spec_file` to that path and process it exactly as if the user had supplied that specific file path, including **Story-key resolution** and the existing status route below. No matches → derive a valid kebab-case slug from the entry's `title` (and `description` if needed), then set `spec_file` = `{spec_folder}/stories/{story_id}-{slug}.md` and proceed to INSTRUCTIONS.
23
- - If it points to a file that matches the spec template (has `status` frontmatter with a recognized value: draft, ready-for-dev, in-progress, in-review, or done) → set `spec_file`. Before exiting, run **Story-key resolution** (below). Then **EARLY EXIT** to the appropriate step: `draft` → `[[bmad-snapshot:step-02-plan.md]]`, `ready-for-dev`/`in-progress` → `[[bmad-snapshot:step-03-implement.md]]`, `in-review` → `[[bmad-snapshot:step-04-review.md]]`. For `done`, ingest as context and proceed to INSTRUCTIONS — do not resume.
23
+ - If it points to a file that matches the spec template (has `status` frontmatter with a recognized value: draft, ready-for-dev, in-progress, in-review, or done) → set `spec_file`. Before exiting, run **Story-key resolution** (below). Then **EARLY EXIT** to the appropriate step: `draft` → `[[bmad-snapshot:step-02-plan.md]]`, `ready-for-dev`/`in-progress` → `[[bmad-snapshot:step-03-implement.md]]` (or `[[bmad-snapshot:step-oneshot.md]]` when `route` is `oneshot`), `in-review` → `[[bmad-snapshot:step-04-review.md]]`. For `done`, ingest as context and proceed to INSTRUCTIONS — do not resume.
24
24
  - Anything else (intent files, external docs, plans, descriptions) → ingest it as starting intent and proceed to INSTRUCTIONS. Do not attempt to infer a workflow state from it.
25
25
 
26
26
  2. Recent conversation
@@ -32,7 +32,7 @@ Before listing artifacts, resolve existing workflow state in this order. Skip th
32
32
  - Resume one of the listed specs
33
33
  - **New** — start new work
34
34
  If `draft` selected: Set `spec_file`. Run **Story-key resolution** (below). **EARLY EXIT** → `[[bmad-snapshot:step-02-plan.md]]` (resume planning from the draft)
35
- If `ready-for-dev` or `in-progress` selected: Set `spec_file`. Run **Story-key resolution** (below). **EARLY EXIT** → `[[bmad-snapshot:step-03-implement.md]]`
35
+ If `ready-for-dev` or `in-progress` selected: Set `spec_file`. Run **Story-key resolution** (below). **EARLY EXIT** → `[[bmad-snapshot:step-03-implement.md]]` (or `[[bmad-snapshot:step-oneshot.md]]` when `route` is `oneshot`)
36
36
  If `in-review` selected: Set `spec_file`. Run **Story-key resolution** (below). **EARLY EXIT** → `[[bmad-snapshot:step-04-review.md]]`
37
37
  If the user chooses **New**: proceed to INSTRUCTIONS
38
38
  - Unformatted spec or intent file lacking `status` frontmatter? → Suggest treating its contents as the starting intent. Do NOT attempt to infer a state and resume it.
@@ -17,7 +17,7 @@
17
17
  - **Irreversibles** — things you cannot undo: migrations, data deletion or mutation, external side effects, deploy or config triggers.
18
18
  - **Footprint** — how big: files you will change, and anything new that other code will call or depend on.
19
19
 
20
- If there are no intent gaps, nothing irreversible, and the change is small: read `[[bmad-snapshot:spec-template.md]]` fully and write `{spec_file}` with only the frontmatter, `## Intent` (inside its `<frozen-after-approval>` block), and `## Implementation Notes`. Delete every other section; the template says you may. Set `route: 'in-session'` and `status: 'in-progress'`, resolving `date` to the current system date. If `preserved_intent` is non-empty, use it as the frozen block. **EARLY EXIT** → `[[bmad-snapshot:step-oneshot.md]]`.
20
+ If there are no intent gaps, nothing irreversible, and the change is small: read `[[bmad-snapshot:spec-template.md]]` fully and write `{spec_file}` with only the frontmatter, `## Intent` (inside its `<frozen-after-approval>` block), and `## Implementation Notes`. Delete every other section; the template says you may. Set `route: 'oneshot'` and `status: 'in-progress'`, resolving `date` to the current system date. If `preserved_intent` is non-empty, use it as the frozen block. **EARLY EXIT** → `[[bmad-snapshot:step-oneshot.md]]`.
21
21
 
22
22
  Otherwise write the full spec. Set `route: 'dispatch'` and continue.
23
23
  4. Read `[[bmad-snapshot:spec-template.md]]` fully. Fill it out from the intent and investigation, resolving the template's `date` field to the current system date. Put the investigation into `## Code Map`: paths, symbols or lines, what to reuse, and what not to change. Implementation should work from the spec without being told the investigation again. For each intent gap, add one `## Open Questions` entry: the choice, the options, and what each option means. Never write an intent gap into the frozen block as an assumption. If `preserved_intent` is non-empty, replace the `<frozen-after-approval>` block with it before writing. Write the result to `{spec_file}`.
@@ -24,7 +24,7 @@ Capture `baseline_commit` (current HEAD, or `NO_VCS` if version control is unava
24
24
 
25
25
  Change `{spec_file}` status to `in-progress` in the frontmatter before starting implementation.
26
26
 
27
- Follow `[[bmad-snapshot:sync-sprint-status.md]]` with `target_status` = `in-progress`.
27
+ If `{story_key}` is not empty and `{{.implementation_artifacts}}/sprint-status.yaml` exists, read `[[bmad-snapshot:sync-sprint-status.md]]` with `{target_status}` = `in-progress`.
28
28
 
29
29
  Execute the implementation handoff below: substitute the runtime placeholders (e.g. `{spec_file}`) into it, then follow it verbatim.
30
30
 
@@ -10,49 +10,11 @@
10
10
 
11
11
  ## INSTRUCTIONS
12
12
 
13
- ### Generate Suggested Review Order
14
-
15
- Read `{baseline_commit}` from `{spec_file}` frontmatter and construct the diff of all changes since that commit.
16
-
17
- Append the review order as a `## Suggested Review Order` section to `{spec_file}` **after the last existing section**. Do not modify the Code Map.
18
-
19
- Build the trail as an ordered sequence of **stops** — clickable `path:line` references with brief framing — optimized for a human reviewer reading top-down to understand the change:
20
-
21
- 1. **Order by concern, not by file.** Group stops by the conceptual concern they address (e.g., "validation logic", "schema change", "UI binding"). A single file may appear under multiple concerns.
22
- 2. **Lead with the entry point** — the single highest-leverage file:line a reviewer should look at first to grasp the design intent.
23
- 3. **Inside each concern**, order stops from most important / architecturally interesting to supporting. Lightly bias toward higher-risk or boundary-crossing stops.
24
- 4. **End with peripherals** — tests, config, types, and other supporting changes come last.
25
- 5. **Every code reference is a clickable spec-file-relative link.** Compute each link target as a relative path from `{spec_file}`'s directory to the changed file. Format each stop as a markdown link: `[short-name:line](../../path/to/file.ts#L42)`. Use a `#L` line anchor. Use the file's basename (or shortest unambiguous suffix) plus line number as the link text. The relative path must be dynamically derived — never hardcode the depth.
26
- 6. **Each stop gets one ultra-concise line of framing** (≤15 words) — why this approach was chosen here and what it achieves in the context of the change. No paragraphs.
27
-
28
- Format each stop as framing first, link on the next indented line:
29
-
30
- ```markdown
31
- ## Suggested Review Order
32
-
33
- **{Concern name}**
34
-
35
- - {one-line framing}
36
- [`file.ts:42`](../../src/path/to/file.ts#L42)
37
-
38
- - {one-line framing}
39
- [`other.ts:17`](../../src/path/to/other.ts#L17)
40
-
41
- **{Next concern}**
42
-
43
- - {one-line framing}
44
- [`file.ts:88`](../../src/path/to/file.ts#L88)
45
- ```
46
-
47
- > The `../../` prefix above is illustrative — compute the actual relative path from `{spec_file}`'s directory to each target file.
48
-
49
- When there is only one concern, omit the bold label — just list the stops directly.
50
-
51
13
  ### Mark Spec Done
52
14
 
53
15
  Change `{spec_file}` status to `done` in the frontmatter.
54
16
 
55
- Follow `[[bmad-snapshot:sync-sprint-status.md]]` with `target_status` = `review`.
17
+ If `{story_key}` is not empty and `{{.implementation_artifacts}}/sprint-status.yaml` exists, read `[[bmad-snapshot:sync-sprint-status.md]]` with `{target_status}` = `review`.
56
18
 
57
19
  ### Commit and Complete
58
20
 
@@ -62,14 +24,15 @@ If version control is available and the tree is dirty, create a local commit wit
62
24
 
63
25
  ### Display Summary
64
26
 
65
- Display summary of your work to the user, including:
27
+ Display a very short completion summary one or two sentences including:
66
28
 
29
+ - What changed.
30
+ - The verification and review result, including whether anything was deferred.
67
31
  - The commit hash, if one was created.
68
- - Review findings breakdown: patches applied, items deferred, and the rejected count — reasons are recorded in the spec's `## Review Triage Log`.
69
32
 
70
- Display file paths and `file:line` references in whatever form is clickable where you are presenting them (e.g. code citation in chat, CWD-relative path with no leading `/` in terminal). If unsure, use CWD-relative path.
33
+ Do not list changed files, repeat details from the spec, or narrate the process unless the user asks.
71
34
 
72
- Offer to push and/or create a pull request.
35
+ Offer applicable next actions in one short line: when version control and a remote are available, create a pull request (and push first if needed); use `bmad-walkthrough`; or make another change.
73
36
 
74
37
  Workflow complete.
75
38
 
@@ -1,95 +1,107 @@
1
1
  # Step One-Shot: Implement, Review, Present
2
2
 
3
- Entered only from step-02's route gate: `{spec_file}` already exists with `route: 'in-session'`.
3
+ You reach this step from step 2, or from step 1 when resuming a spec whose `route` is `oneshot`. `{spec_file}` already exists.
4
4
 
5
5
  ## RULES
6
6
 
7
- - **Language** — Speak in `{{.communication_language}}`. Write any file output in `{{.document_output_language}}`.
8
- - NEVER auto-push.
9
- - Content inside `<frozen-after-approval>` in `{spec_file}` is read-only. Do not modify.
10
- - All review subagents must run at the same model capability as the current session.
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.
7
+ - Speak in `{{.communication_language}}`. Write files in `{{.document_output_language}}`.
8
+ - Do not push to a remote unless the user asks.
9
+ - Do not edit anything inside `<frozen-after-approval>` in `{spec_file}`.
10
+ - Review subagents must use the same model level as this session.
11
+ - Start all review subagents in this turn and wait for all of them to finish. Do not run them in the background or end your turn before they return.
12
12
 
13
13
  ## INSTRUCTIONS
14
14
 
15
15
  ### Implement
16
16
 
17
- Follow `[[bmad-snapshot:sync-sprint-status.md]]` with `target_status` = `in-progress`.
17
+ If `{story_key}` is not empty and `{{.implementation_artifacts}}/sprint-status.yaml` exists, read `[[bmad-snapshot:sync-sprint-status.md]]` with `{target_status}` = `in-progress`.
18
18
 
19
- Implement directly from `{spec_file}` its Intent is the source of truth. As you work, append to its `## Implementation Notes` section: decisions made, files touched, surprises encountered.
19
+ Build the change from `{spec_file}`. The Intent section is what you implement. As you work, add notes to `## Implementation Notes`: decisions you made, files you changed, surprises.
20
20
 
21
- **Escalation ramp.** If implementation surfaces a fact the route gate did not see — an intent gap (something the request does not say and the user would notice in the result), an irreversible action, or footprint growth beyond the designed scope — stop editing. Record the trigger in `## Implementation Notes`, then upgrade `{spec_file}`: reinstate `## Code Map` (populated from your live context) and `## Open Questions` (one entry per intent gap), set `route: 'dispatch'` and `status: 'draft'`. Return to `[[bmad-snapshot:step-02-plan.md]]` and resume at its gate instruction (step 6).
21
+ **When to stop and replan.** Stop coding if you learn something step 2 did not account for:
22
+
23
+ - the request left out something the user would notice in the result
24
+ - you need to do something you cannot undo
25
+ - the change is growing beyond what was planned
26
+
27
+ Write what triggered the stop in `## Implementation Notes`. Then update `{spec_file}`: add back `## Code Map` (filled in from what you learned while implementing) and `## Open Questions` (one question per gap), set `route: 'dispatch'` and `status: 'draft'`. Go back to `[[bmad-snapshot:step-02-plan.md]]` step 6.
22
28
 
23
29
  ### Review
24
30
 
25
- Announce skipped layers first, then launch every active layer before handling any layer's result. Try running all active layers simultaneously. After substituting runtime placeholders, when an instruction launches a reviewer subagent, launch that child with the prompt text; do not load the reviewer instruction file yourself. For any other customized instruction, execute it as written:
31
+ Say which review layers you are skipping, then start every active layer before reading any results. Run them at the same time when you can. Fill in runtime placeholders first. When a layer tells you to launch a reviewer subagent, launch it with that prompt text. Do not read the reviewer's instruction file yourself. For any other customized instruction, do what it says:
26
32
 
27
33
  {workflow.oneshot_review_layers}
28
34
 
29
- If a layer's instruction requires subagents and none are 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 human to run each in a separate session and paste back the findings.
35
+ If a layer needs subagents and you cannot launch them, write the full prompt for each layer under `{{.implementation_artifacts}}` (with placeholders filled in, not just file paths). Stop and ask the user to run each prompt in a separate session and paste back the findings.
30
36
 
31
37
  ### Classify
32
38
 
33
- Once every layer has reported and not before — render a verdict on each finding, ahead of any deduplication or grouping. Disregard any severity a reviewing subagent assigned they lack the context to grade.
39
+ Wait until every review layer has reported. Then judge each finding. Ignore severity labels from reviewersyou decide.
34
40
 
35
41
  For each finding:
36
42
 
37
- - **Verify the finding's claim.** At the cited file and line, does the bad outcome the reviewer describes actually occur? Read beyond the changed lines — follow callers, guards upstream, etc — until you can answer yes or no. A different finding about nearby code does not settle this one. Judge whether the problem is real, not whether the proposed fix is plausible. Code that loudly fails on a situation you never showed the program can reach is correct behavior, not a defect.
38
- - **Render exactly one verdict** from what verification established — the verdict is the whole triage decision; there is no separate keep-or-dismiss.
39
- - `high` (intolerable), `medium` (tolerable), `low` (cosmetic or negligible) — the bad outcome is real. Assign severity by how much it hurts end users or developers. For developer-only problems, name where it will cause trouble; a vague "this is messy" with no named harm is not a severity grade — use `false` or `maybe-false` instead. When the harm is real but you cannot tell how bad, pick the higher grade.
40
- - `false` you checked, and the bad outcome does not happen at the cited location. Write what disproves this specific claim. A true fact about nearby code that does not disprove the claim does not count.
41
- - `maybe-false` — you could not tell whether the bad outcome happens. Write what you would need to check to find out. Use this only when the diff and surrounding code leave the question open; when they are enough to decide, pick `high`, `medium`, `low`, or `false`.
42
- - Record every finding with its verdict and evidence; never drop one silently.
43
+ - **Check the claim.** Go to the cited file and line. Does the problem the reviewer describes actually happen? Read surrounding code and callers until you can say yes or no. A nearby issue does not answer this one. Judge whether the bug is real, not whether the suggested fix sounds good. Code that fails loudly on a state you have not shown the program can reach is correct, not a bug.
44
+
45
+ - **Pick one verdict:**
46
+ - `high` (intolerable), `medium` (tolerable), or `low` (cosmetic or negligible) — the problem is real. Rate it by harm to users or developers. For developer-only issues, say where it will hurt. Vague complaints like "this is messy" are not `high`/`medium`/`low` use `false` or `maybe-false`. When unsure how bad, pick the higher grade.
47
+ - `false` — you checked and the problem does not happen. Say what you found that disproves it.
48
+ - `maybe-false` you could not tell. Say what you would need to check. Use this only when the code and diff are not enough to decide.
49
+
50
+ - Write down every finding with its verdict and evidence. Do not drop any.
43
51
 
44
- Reject `false` findings on their refutation.
52
+ Reject `false` findings.
45
53
 
46
- Reject `low` findings when it is unlikely that users or developers would meet the defect in everyday use (judged plainly — no proof needed) and the fix is more than a direct correction or deletion — adding guards, branches, parameters, or other complexity.
54
+ Reject `low` findings when users or developers would rarely hit the problem in normal use and the fix would add more than a simple correction or deletion.
47
55
 
48
- All remaining findings continue to grouping.
56
+ Group what remains by root cause — two findings go together only if the same bug caused both. Same file or same fix is not enough. For each group, keep the worst verdict (`high` > `medium` > `low` > `maybe-false`). If a group has verified `high`, `medium`, or `low` members, route by the worst of those — not `defer` just because one member is `maybe-false`.
49
57
 
50
- Group the survivors by shared root cause — two findings belong in one entry only when the same defect produced both. Same location alone is not a shared root cause, and neither is a shared fix. An entry carries every member's verified bad outcome and the highest verdict among them (`high` > `medium` > `low` > `maybe-false`). A group that includes verified `high`, `medium`, or `low` members routes by its highest such verdict — not to defer just because a member is `maybe-false`. Route each entry in this order:
58
+ For each group:
59
+
60
+ - **patch** — This change caused or exposed the problem. The smallest fix is simple, adds no new public API, and does not guard code paths you did not show are reachable. Fix it now.
61
+ - **HALT** — Same as patch, but the smallest fix is not that simple. Stop and ask the user before continuing.
62
+ - **defer** — Everything else: old bugs not caused by this change, ideas for later, groups where every member is `maybe-false` and would be `medium` or `high` if true (record that severity marked unverified, and what would prove it; if it would only be `low`, reject it), or fixes that would edit CLAUDE.md, AGENTS.md, rules, or specs. Add one entry to `{{.implementation_artifacts}}/deferred-work.md`:
51
63
 
52
- - **patch** — Patch every entry caused or exposed by this change that shows a defect that actually occurs, missing coverage for a specific case, or a broken gate or convention — not a state nothing reaches — and whose smallest fix is trivial, adds no public surface, and guards no state the finding did not demonstrate. Apply that smallest fix immediately.
53
- - **HALT** — HALT on every entry caused or exposed by this change that shows the same evidence but whose smallest fix fails any of those conditions. Present it to the human for decision before proceeding.
54
- - **defer** — Defer every other entry: pre-existing issues, improvement ideas, entries whose members are all `maybe-false` where the claim, if true, would be `medium` or `high` (record that severity marked unverified, plus what would settle it; if it would only be `low`, reject it with the same note), and any entry whose fix edits agent-context files (CLAUDE.md, AGENTS.md, rules, specs). Append one new entry to `{{.implementation_artifacts}}/deferred-work.md` using this format. Do not modify existing entries or look for duplicates.
55
64
  ```markdown
56
65
  - source_spec: `{spec_file}`
57
66
  summary: <one sentence>
58
- evidence: <why this is real; for a maybe-false finding, what evidence would settle it>
67
+ evidence: <why this is real; for maybe-false, what would prove it>
59
68
  ```
60
69
 
70
+ Do not edit old entries or check for duplicates.
71
+
61
72
  ### Finalize Spec
62
73
 
63
74
  Update `{spec_file}`:
64
75
 
65
- 1. **Frontmatter** — set `status: 'done'`.
66
- 2. **Suggested Review Order** append after Intent. Build using the same convention as `[[bmad-snapshot:step-05-present.md]]` § "Generate Suggested Review Order" (spec-file-relative links, concern-based ordering, ultra-concise framing).
67
- 3. **Review Triage Log** — only when the review produced findings: add the section with one line per finding with its verdict and evidence — the refutation for `false`, what would settle it for `maybe-false`, why a rejected `low` was not worth fixing.
76
+ 1. Set `status: 'done'` in the frontmatter.
77
+ 2. If review found anything, add `## Review Triage Log` with one line per finding: verdict and evidence. For `false`, the disproof. For `maybe-false`, what would settle it. For rejected `low`, why it was not worth fixing.
68
78
 
69
- Follow `[[bmad-snapshot:sync-sprint-status.md]]` with `target_status` = `review`.
79
+ If `{story_key}` is not empty and `{{.implementation_artifacts}}/sprint-status.yaml` exists, read `[[bmad-snapshot:sync-sprint-status.md]]` with `{target_status}` = `review`.
70
80
 
71
81
  ### Commit
72
82
 
73
- If version control is available and the tree is dirty, create a local commit with a conventional message derived from the intent. If VCS is unavailable, skip.
83
+ If git is available and there are uncommitted changes, commit with a conventional message based on the Intent. If git is not available, skip.
74
84
 
75
85
  ### Present
76
86
 
77
87
  {workflow.open_spec}
78
88
 
79
- Display a summary in conversation output, including:
89
+ Give the user a short summary one or two sentences:
90
+
91
+ - What changed.
92
+ - Review result, including anything deferred.
93
+ - Commit hash, if you made one.
80
94
 
81
- - The commit hash (if one was created).
82
- - List of files changed with one-line descriptions. Display file paths and `file:line` references in whatever form is clickable where you are presenting them (e.g. code citation in chat, CWD-relative path with no leading `/` in terminal). If unsure, use CWD-relative path. This differs from spec-file links which use spec-file-relative paths.
83
- - Review findings breakdown: patches applied, items deferred, and the rejected count — reasons are recorded in the spec. If every finding was rejected, say so.
95
+ Do not list files, repeat the spec, or walk through what you did unless asked.
84
96
 
85
- Offer to push and/or create a pull request.
97
+ Offer next steps in one line: create a PR (push first if needed) when git and a remote exist; use `bmad-walkthrough`; or make another change.
86
98
 
87
- HALT and wait for human input.
99
+ Stop and wait for the user.
88
100
 
89
101
  Workflow complete.
90
102
 
91
103
  ## On Complete
92
104
 
93
- If anything appears below, follow it as the final terminal instruction before exiting; otherwise exit normally.
105
+ If anything appears below, do it before exiting. Otherwise exit.
94
106
 
95
107
  {workflow.on_complete}
@@ -1,19 +1,5 @@
1
- # Sync Sprint Status
2
-
3
- Shared sub-step for updating `sprint-status.yaml` during build. Called from any route (dispatch, in-session, future routes) with a `target_status` parameter.
4
-
5
- ## Preconditions
6
-
7
- Skip this entire file (return to caller) if ANY of:
8
- - `story_key` is unset
9
- - `{{.implementation_artifacts}}/sprint-status.yaml` does not exist on disk
10
-
11
- ## Instructions
12
-
13
- 1. Load the FULL `{{.implementation_artifacts}}/sprint-status.yaml` file.
14
- 2. Find the `development_status` entry matching `{story_key}`. If not found, warn the user once (`"{story_key} not found in sprint-status; skipping sprint sync"`) and return to caller.
15
- 3. **Idempotency check.** If `development_status[{story_key}]` is already at `target_status` or a later state (`review` is later than `in-progress`; `done` is later than both), return to caller — no write needed. Never regress a story's status.
16
- 4. Set `development_status[{story_key}]` to `{target_status}`.
17
- 5. **Epic lift (only when `target_status` = `in-progress`).** Derive the parent epic key as `epic-{N}` from the leading numeric segment of `{story_key}` (e.g., `3-2-digest-delivery` → `epic-3`). If that entry exists and is `backlog`, set it to `in-progress`. Leave it alone otherwise. Skip this sub-step entirely when `target_status` is not `in-progress`.
18
- 6. Refresh `last_updated` to the current date.
19
- 7. Save the file, preserving ALL comments and structure including STATUS DEFINITIONS and WORKFLOW NOTES.
1
+ Set `development_status[{story_key}]` to `{target_status}` in `{{.implementation_artifacts}}/sprint-status.yaml`.
2
+ If `{story_key}` is missing, warn once and stop.
3
+ If the story is already at `{target_status}` or later, stop.
4
+ When `{target_status}` is `in-progress`, set parent epic (e.g. `3-2-foo` → `epic-3`) from `backlog` to `in-progress` if present.
5
+ Update `last_updated`. Preserve comments and structure.