Skip to content

Commit 9088d49

Browse files
alexeyvclaude
andauthored
fix(code-review): restore actionable review output with interactive choices (#2055)
* fix(code-review): restore actionable review output with interactive choices The March 15 rewrite (PR #2007) removed the ability to auto-fix patches, create action items in story files, and handle deferred/spec findings. This restores interactive post-review actions: - Deferred findings: auto-written to deferred-work.md and checked off in story - Intent gap/bad spec: conversation with downgrade-to-patch, patch-spec, reset-to-ready-for-dev, or dismiss options - Patch findings: fix automatically, create action items, or show details Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor(code-review): simplify triage to decision-needed/patch/defer/dismiss Replace 5-bucket classification (intent_gap, bad_spec, patch, defer, reject) with 4 pragmatic buckets. Findings always written to story file first. Decision-needed findings gate patch handling — resolve ambiguity before fixing. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(code-review): address PR review findings in step-04-present Replace undefined curly-brace placeholders with angle-bracket syntax, add HALT guard before patch menu, guard spec_file references for no-spec mode, and backtick category names for consistency. * feat(code-review): add HALT guards, batch option, defer reason, final summary Add strong HALT guards after decision-needed and patch menus to prevent auto-progression. Add batch-apply option 0 for >3 patch findings. Prompt for defer reason and append to story file and deferred-work.md. Show boxed final summary with counts. Polish clean-review shortcut in triage. --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 0d2863f commit 9088d49

2 files changed

Lines changed: 72 additions & 27 deletions

File tree

src/bmm-skills/4-implementation/bmad-code-review/steps/step-03-triage.md

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,19 +30,18 @@
3030
- Set `source` to the merged sources (e.g., `blind+edge`).
3131

3232
3. **Classify** each finding into exactly one bucket:
33-
- **intent_gap** -- The spec/intent is incomplete; cannot resolve from existing information. Only possible if `{review_mode}` = `"full"`.
34-
- **bad_spec** -- The spec should have prevented this; spec is wrong or ambiguous. Only possible if `{review_mode}` = `"full"`.
35-
- **patch** -- Code issue that is trivially fixable without human input. Just needs a code change.
33+
- **decision_needed** -- There is an ambiguous choice that requires human input. The code cannot be correctly patched without knowing the user's intent. Only possible if `{review_mode}` = `"full"`.
34+
- **patch** -- Code issue that is fixable without human input. The correct fix is unambiguous.
3635
- **defer** -- Pre-existing issue not caused by the current change. Real but not actionable now.
37-
- **reject** -- Noise, false positive, or handled elsewhere.
36+
- **dismiss** -- Noise, false positive, or handled elsewhere.
3837

39-
If `{review_mode}` = `"no-spec"` and a finding would otherwise be `intent_gap` or `bad_spec`, reclassify it as `patch` (if code-fixable) or `defer` (if not).
38+
If `{review_mode}` = `"no-spec"` and a finding would otherwise be `decision_needed`, reclassify it as `patch` (if the fix is unambiguous) or `defer` (if not).
4039

41-
4. **Drop** all `reject` findings. Record the reject count for the summary.
40+
4. **Drop** all `dismiss` findings. Record the dismiss count for the summary.
4241

43-
5. If `{failed_layers}` is non-empty, report which layers failed before announcing results. If zero findings remain after dropping rejects AND `{failed_layers}` is non-empty, warn the user that the review may be incomplete rather than announcing a clean review.
42+
5. If `{failed_layers}` is non-empty, report which layers failed before announcing results. If zero findings remain after dropping dismissed AND `{failed_layers}` is non-empty, warn the user that the review may be incomplete rather than announcing a clean review.
4443

45-
6. If zero findings remain after dropping rejects and no layers failed, note clean review.
44+
6. If zero findings remain after triage (all rejected or none raised): state "✅ Clean review — all layers passed." (Step 3 already warned if any review layers failed via `{failed_layers}`.)
4645

4746

4847
## NEXT
Lines changed: 65 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,84 @@
11
---
2+
deferred_work_file: '{implementation_artifacts}/deferred-work.md'
23
---
34

4-
# Step 4: Present
5+
# Step 4: Present and Act
56

67
## RULES
78

89
- YOU MUST ALWAYS SPEAK OUTPUT in your Agent communication style with the config `{communication_language}`
9-
- Do NOT auto-fix anything. Present findings and let the user decide next steps.
10+
- When `{spec_file}` is set, always write findings to the story file before offering action choices.
11+
- `decision-needed` findings must be resolved before handling `patch` findings.
1012

1113
## INSTRUCTIONS
1214

13-
1. Group remaining findings by category.
15+
### 1. Clean review shortcut
1416

15-
2. Present to the user in this order (include a section only if findings exist in that category):
17+
If zero findings remain after triage (all dismissed or none raised): state that and end the workflow.
1618

17-
- **Intent Gaps**: "These findings suggest the captured intent is incomplete. Consider clarifying intent before proceeding."
18-
- List each with title + detail.
19+
### 2. Write findings to the story file
1920

20-
- **Bad Spec**: "These findings suggest the spec should be amended. Consider regenerating or amending the spec with this context:"
21-
- List each with title + detail + suggested spec amendment.
21+
If `{spec_file}` exists and contains a Tasks/Subtasks section, append a `### Review Findings` subsection. Write all findings in this order:
2222

23-
- **Patch**: "These are fixable code issues:"
24-
- List each with title + detail + location (if available).
23+
1. **`decision-needed`** findings (unchecked):
24+
`- [ ] [Review][Decision] <Title> — <Detail>`
2525

26-
- **Defer**: "Pre-existing issues surfaced by this review (not caused by current changes):"
27-
- List each with title + detail.
26+
2. **`patch`** findings (unchecked):
27+
`- [ ] [Review][Patch] <Title> [<file>:<line>]`
2828

29-
3. Summary line: **X** intent_gap, **Y** bad_spec, **Z** patch, **W** defer findings. **R** findings rejected as noise.
29+
3. **`defer`** findings (checked off, marked deferred):
30+
`- [x] [Review][Defer] <Title> [<file>:<line>] — deferred, pre-existing`
3031

31-
4. If clean review (zero findings across all layers after triage): state that N findings were raised but all were classified as noise, or that no findings were raised at all (as applicable).
32+
Also append each `defer` finding to `{deferred_work_file}` under a heading `## Deferred from: code review ({date})`. If `{spec_file}` is set, include its basename in the heading (e.g., `code review of story-3.3 (2026-03-18)`). One bullet per finding with description.
3233

33-
5. Offer the user next steps (recommendations, not automated actions):
34-
- If `patch` findings exist: "These can be addressed in a follow-up implementation pass or manually."
35-
- If `intent_gap` or `bad_spec` findings exist: "Consider running the planning workflow to clarify intent or amend the spec before continuing."
36-
- If only `defer` findings remain: "No action needed for this change. Deferred items are noted for future attention."
34+
### 3. Present summary
3735

38-
Workflow complete.
36+
Announce what was written:
37+
38+
> **Code review complete.** <D> `decision-needed`, <P> `patch`, <W> `defer`, <R> dismissed as noise.
39+
40+
If `{spec_file}` is set, add: `Findings written to the review findings section in {spec_file}.`
41+
Otherwise add: `Findings are listed above. No story file was provided, so nothing was persisted.`
42+
43+
### 4. Resolve decision-needed findings
44+
45+
If `decision_needed` findings exist, present each one with its detail and the options available. The user must decide — the correct fix is ambiguous without their input. Walk through each finding (or batch related ones) and get the user's call. Once resolved, each becomes a `patch`, `defer`, or is dismissed.
46+
47+
If the user chooses to defer, ask: Quick one-line reason for deferring this item? (helps future reviews): — then append that reason to both the story file bullet and the `{deferred_work_file}` entry.
48+
49+
**HALT** — I am waiting for your numbered choice. Reply with only the number (or "0" for batch). Do not proceed until you select an option.
50+
51+
### 5. Handle `patch` findings
52+
53+
If `patch` findings exist (including any resolved from step 4), HALT. Ask the user:
54+
55+
If `{spec_file}` is set, present all three options (if >3 `patch` findings exist, also show option 0):
56+
57+
> **How would you like to handle the <Z> `patch` findings?**
58+
> 0. **Batch-apply all** — automatically fix every non-controversial patch (recommended when there are many)
59+
> 1. **Fix them automatically** — I will apply fixes now
60+
> 2. **Leave as action items** — they are already in the story file
61+
> 3. **Walk through each** — let me show details before deciding
62+
63+
If `{spec_file}` is **not** set, present only options 1 and 3 (omit option 2 — findings were not written to a file). If >3 `patch` findings exist, also show option 0:
64+
65+
> **How would you like to handle the <Z> `patch` findings?**
66+
> 0. **Batch-apply all** — automatically fix every non-controversial patch (recommended when there are many)
67+
> 1. **Fix them automatically** — I will apply fixes now
68+
> 2. **Walk through each** — let me show details before deciding
69+
70+
**HALT** — I am waiting for your numbered choice. Reply with only the number (or "0" for batch). Do not proceed until you select an option.
71+
72+
- **Option 0** (only when >3 findings): Apply all non-controversial patches without per-finding confirmation. Skip any finding that requires judgment. Present a summary of changes made and any skipped findings.
73+
- **Option 1**: Apply each fix. After all patches are applied, present a summary of changes made. If `{spec_file}` is set, check off the items in the story file.
74+
- **Option 2** (only when `{spec_file}` is set): Done — findings are already written to the story.
75+
- **Walk through each**: Present each finding with full detail, diff context, and suggested fix. After walkthrough, re-offer the applicable options above.
76+
77+
**HALT** — I am waiting for your numbered choice. Reply with only the number (or "0" for batch). Do not proceed until you select an option.
78+
79+
**✅ Code review actions complete**
80+
81+
- Decision-needed resolved: <D>
82+
- Patches handled: <P>
83+
- Deferred: <W>
84+
- Dismissed: <R>

0 commit comments

Comments
 (0)