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

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-project-context/SKILL.md +1 -1
  3. package/src/bmm-skills/plan/bmad-sprint-planning/scripts/__pycache__/sprint_plan.cpython-311.pyc +0 -0
  4. package/src/bmm-skills/plan/bmad-sprint-planning/scripts/tests/__pycache__/test_sprint_plan.cpython-311-pytest-9.1.1.pyc +0 -0
  5. package/src/bmm-skills/ship/bmad-build/spec-template.md +5 -0
  6. package/src/bmm-skills/ship/bmad-build/step-04-review.md +10 -9
  7. package/src/bmm-skills/ship/bmad-build/step-05-present.md +6 -1
  8. package/src/bmm-skills/ship/bmad-build/step-oneshot.md +13 -6
  9. package/src/bmm-skills/ship/bmad-build-auto/spec-template.md +3 -3
  10. package/src/bmm-skills/ship/bmad-build-auto/step-04-review.md +16 -14
  11. package/src/bmm-skills/ship/bmad-build-auto/workflow.md +1 -1
  12. package/src/bmm-skills/ship/bmad-code-review/steps/step-03-triage.md +14 -21
  13. package/src/bmm-skills/ship/bmad-code-review/steps/step-04-present.md +3 -1
  14. package/src/bmm-skills/ship/bmad-retrospective/scripts/__pycache__/sprint_status.cpython-311.pyc +0 -0
  15. package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/__pycache__/test_git_evidence.cpython-311-pytest-9.1.1.pyc +0 -0
  16. package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/__pycache__/test_sprint_status.cpython-311-pytest-9.1.1.pyc +0 -0
  17. package/src/scripts/__pycache__/config_utils.cpython-311.pyc +0 -0
  18. package/src/scripts/tests/__pycache__/test_config_utils.cpython-311.pyc +0 -0
  19. package/src/scripts/tests/__pycache__/test_resolve_config.cpython-311.pyc +0 -0
  20. package/src/scripts/tests/__pycache__/test_resolve_customization.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.21",
4
+ "version": "6.11.1-next.23",
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-project-context
3
- description: 'Set up, adopt, refresh, or audit a repository''s agent instructions (the AGENTS.md block) so AI agents work well in that repo. Also records observed agent mistakes as pitfalls. Must be invoked by name'
3
+ description: 'Set up, adopt, refresh, or audit a repository''s agent instructions (the AGENTS.md block) so AI agents work well in that repo. Also records observed agent mistakes as pitfalls. Use when invoked by name'
4
4
  ---
5
5
 
6
6
  # Overview
@@ -70,6 +70,11 @@ context: [] # optional: `{project-root}/`-prefixed paths to project-wide standar
70
70
  the amendment avoids, and any KEEP instructions (what worked well and must survive re-derivation).
71
71
  Empty until the first bad_spec loopback. -->
72
72
 
73
+ ## Review Triage Log
74
+
75
+ <!-- Append-only. Populated by step-04 on every review pass: each dismissed finding with the
76
+ reason that disposed of its claim. Empty until the first review pass. -->
77
+
73
78
  ## Design Notes
74
79
 
75
80
  <!-- If the approach is straightforward, DELETE THIS ENTIRE SECTION. Do not write "N/A" or "None". -->
@@ -28,18 +28,20 @@ If a layer's instruction requires subagents and none are available, for each suc
28
28
 
29
29
  ### Classify
30
30
 
31
- 1. Deduplicate only findings with the same claim and same required action. Then evaluate each remaining finding independently. Do not reject a finding because a related finding was rejected.
32
- 2. Assign severity to each finding by consequence for the artifact's main consumer (software user, document reader, etc).
33
- Disregard any severity assigned by a reviewing subagent. Review subagents operate under by-design information asymmetry and do not have enough context to set final severity for this workflow.
34
- - `low`: none or cosmetic
35
- - `medium`: tolerable
36
- - `high`: intolerable
37
- 3. Route each finding into exactly one triage category. The first three categories are **this story's problem**caused or exposed by the current change. The last two are **not this story's problem**.
31
+ 1. Once every layer has reported and not before render a verdict on each finding on its own, ahead of any deduplication or grouping. For each finding:
32
+ - **Verify its own claimed consequence** at the location it names. Read past the diff hunk — into the callers, the guards upstream, whatever else the site depends on — far enough to tell whether that consequence actually occurs. Another finding's outcome, however adjacent, never settles this one.
33
+ - **Assign severity** from the verified consequence for the artifact's main consumer (software user, document reader, etc). Disregard any severity assigned by a reviewing subagent. Review subagents operate under by-design information asymmetry and do not have enough context to set final severity for this workflow.
34
+ - `low`: none or cosmetic
35
+ - `medium`: tolerable
36
+ - `high`: intolerable
37
+ - **Keep or dismiss.** Keep a finding only where verification confirmed its consequence. Dismiss noise, claims the verification refuted, and claims it could not substantiate no path to the claimed consequence at the named site is a valid disposal. Whatever the reason, it must dispose of the finding's own claim: a true fact about neighboring code that leaves the claim standing is not a dismissal, and the finding stays kept. Record each dismissal with its reason in the `## Review Triage Log` section of `{spec_file}`; never drop a finding silently.
38
+ - A finding whose fix edits `{spec_file}`: dismiss. A finding whose fix edits an agent-context document (CLAUDE.md, AGENTS.md, rules files, specs): defer, never patch.
39
+ 2. Group the survivors by shared root cause — two findings belong in one entry only when the same underlying 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 consequence and the highest severity among them.
40
+ 3. Route each entry into exactly one triage category. The first three are **this story's problem** — caused or exposed by the current change. The last is **not this story's problem**.
38
41
  - **intent_gap** — caused by the change; cannot be resolved from the spec because the captured intent is incomplete. Do not infer intent unless there is exactly one possible reading.
39
42
  - **bad_spec** — caused by the change, including direct deviations from spec. The spec should have been clear enough to prevent it. When in doubt between bad_spec and patch, prefer bad_spec — a spec-level fix is more likely to produce coherent code.
40
43
  - **patch** — caused by the change; trivially fixable without human input. Just part of the diff.
41
44
  - **defer** — pre-existing issue not caused by this story, surfaced incidentally by the review. Collect for later focused attention.
42
- - **reject** — noise. Drop silently. When unsure between defer and reject, prefer reject — only defer findings you are confident are real.
43
45
  4. Process findings in cascading order. If intent_gap or bad_spec findings exist, they trigger a loopback — lower findings are moot since code will be re-derived. If neither exists, process patch and defer normally. Before each loopback, read `{spec_file}` frontmatter `review_loop_iteration` (missing means `0`), increment it by 1, and write it back. If it exceeds 5, HALT and escalate to the human.
44
46
  - **intent_gap** — Root cause is inside `<frozen-after-approval>`. Revert code changes. Loop back to the human to resolve. Once resolved, read fully and follow `[[bmad-snapshot:step-02-plan.md]]` to re-run steps 2–4.
45
47
  - **bad_spec** — Root cause is outside `<frozen-after-approval>`. Before reverting code: extract KEEP instructions for positive preservation (what worked well and must survive re-derivation). Revert code changes. Read the `## Spec Change Log` in `{spec_file}` and strictly respect all logged constraints when amending the non-frozen sections that contain the root cause. Append a new change-log entry recording: the triggering finding, what was amended, the known-bad state avoided, and the KEEP instructions. Read fully and follow `[[bmad-snapshot:step-03-implement.md]]` to re-derive the code, then this step will run again.
@@ -50,7 +52,6 @@ If a layer's instruction requires subagents and none are available, for each suc
50
52
  summary: <one sentence>
51
53
  evidence: <why this is real>
52
54
  ```
53
- - **reject** — Drop silently.
54
55
 
55
56
  ## NEXT
56
57
 
@@ -62,7 +62,12 @@ If version control is available and the tree is dirty, create a local commit wit
62
62
 
63
63
  ### Display Summary
64
64
 
65
- Display summary of your work to the user, including the commit hash if one was created. Any file paths shown in conversation/terminal output must use CWD-relative format (no leading `/`) with `:line` notation (e.g., `src/path/file.ts:42`) for terminal clickability — the goal is to make paths clickable in terminal emulators.
65
+ Display summary of your work to the user, including:
66
+
67
+ - The commit hash, if one was created.
68
+ - Review findings breakdown: patches applied, items deferred, and the dismissed count — dismissal reasons are recorded in the spec's `## Review Triage Log`.
69
+
70
+ Any file paths shown in conversation/terminal output must use CWD-relative format (no leading `/`) with `:line` notation (e.g., `src/path/file.ts:42`) for terminal clickability — the goal is to make paths clickable in terminal emulators.
66
71
 
67
72
  Offer to push and/or create a pull request.
68
73
 
@@ -25,17 +25,23 @@ If a layer's instruction requires subagents and none are available, for each suc
25
25
 
26
26
  ### Classify
27
27
 
28
- Deduplicate all review findings, then route each finding in this order:
28
+ Once every layer has reported and not before — render a verdict on each finding on its own, ahead of any deduplication or grouping:
29
29
 
30
- - **patch** Patch every finding caused or exposed by this change that shows a defect that actually occurs, missing coverage for a specific case, or a broken gate or conventionnot 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.
31
- - **HALT** HALT on every finding 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.
32
- - **defer** Defer every other real finding, including pre-existing issues and improvement ideas. Append one new entry to `{{.implementation_artifacts}}/deferred-work.md` using this format. Do not modify existing entries or look for duplicates.
30
+ - **Verify its own claimed consequence** at the location it names. Read past the changed lines into the callers, the guards upstream, whatever else the site depends onfar enough to tell whether that consequence actually occurs. Another finding's outcome, however adjacent, never settles this one.
31
+ - **Assign severity** from the verified consequence for the software's user: `low` (none or cosmetic), `medium` (tolerable), `high` (intolerable).
32
+ - **Keep or dismiss.** Keep a finding only where verification confirmed its consequence. Dismiss noise, claims the verification refuted, and claims it could not substantiate no path to the claimed consequence at the named site is a valid disposal. Whatever the reason, it must dispose of the finding's own claim: a true fact about neighboring code that leaves the claim standing is not a dismissal, and the finding stays kept. Record each dismissal with its reason; never drop a finding silently.
33
+ - A finding whose fix edits an agent-context document (CLAUDE.md, AGENTS.md, rules files, specs): defer, never patch.
34
+
35
+ Group the survivors by shared root cause — two findings belong in one entry only when the same underlying 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 consequence and the highest severity among them. Then route each entry in this order:
36
+
37
+ - **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.
38
+ - **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.
39
+ - **defer** — Defer every other entry, including pre-existing issues and improvement ideas. Append one new entry to `{{.implementation_artifacts}}/deferred-work.md` using this format. Do not modify existing entries or look for duplicates.
33
40
  ```markdown
34
41
  - source_spec: `{spec_file}`
35
42
  summary: <one sentence>
36
43
  evidence: <why this is real>
37
44
  ```
38
- - **reject** — Reject only noise. Drop silently.
39
45
 
40
46
  ### Generate Spec Trace
41
47
 
@@ -46,6 +52,7 @@ Write `{spec_file}` using `[[bmad-snapshot:spec-template.md]]`. Fill only these
46
52
  1. **Frontmatter** — set `title: '{title}'`, `type`, `created`, `status: 'done'`. Add `route: 'one-shot'`.
47
53
  2. **Title and Intent** — `# {title}` heading and `## Intent` with **Problem** and **Approach** lines. Reuse the summary you already generated for the terminal.
48
54
  3. **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).
55
+ 4. **Review Triage Log** — only when findings were dismissed: one line per dismissal, the finding and the reason that disposed of its claim.
49
56
 
50
57
  Follow `[[bmad-snapshot:sync-sprint-status.md]]` with `target_status` = `review`.
51
58
 
@@ -61,7 +68,7 @@ Display a summary in conversation output, including:
61
68
 
62
69
  - The commit hash (if one was created).
63
70
  - List of files changed with one-line descriptions. Any file paths shown in conversation/terminal output must use CWD-relative format (no leading `/`) with `:line` notation (e.g., `src/path/file.ts:42`) for terminal clickability — this differs from spec-file links which use spec-file-relative paths.
64
- - Review findings breakdown: patches applied, items deferred, items rejected. If all findings were rejected, say so.
71
+ - Review findings breakdown: patches applied, items deferred, and the dismissed count — dismissal reasons are recorded in the spec trace. If every finding was dismissed, say so.
65
72
 
66
73
  Offer to push and/or create a pull request.
67
74
 
@@ -76,9 +76,9 @@ deferred: [] # append-only machine-readable deferred review findings; each item
76
76
  ## Review Triage Log
77
77
 
78
78
  <!-- Append-only. Populated by step-04 on EVERY review pass, including loopbacks and blocked exits.
79
- Each entry records triage decision counts for intent_gap, bad_spec, patch, defer, and reject,
80
- with per-category severity breakdowns using low/medium/high, plus the findings addressed in
81
- that pass. Empty until the first review pass. -->
79
+ Each entry records triage decision counts for intent_gap, bad_spec, patch, and defer, with
80
+ per-category severity breakdowns using low/medium/high, plus each dismissed finding with its
81
+ reason and the findings addressed in that pass. Empty until the first review pass. -->
82
82
 
83
83
  ## Design Notes
84
84
 
@@ -28,19 +28,21 @@ Announce skipped layers first, then launch every active layer before handling an
28
28
 
29
29
  ### Classify
30
30
 
31
- 1. Deduplicate only findings with the same claim and same required action. Then evaluate each remaining finding independently. Do not reject a finding because a related finding was rejected.
32
- 2. Assign severity to each finding by consequence for the artifact's main consumer (software user, document reader, etc).
33
- Disregard any severity assigned by a reviewing subagent. Review subagents operate under by-design information asymmetry and do not have enough context to set final severity for this workflow.
34
- - `low`: none or cosmetic
35
- - `medium`: tolerable
36
- - `high`: intolerable
37
- 3. Route each finding into exactly one triage category. The first three categories are **this story's problem**caused or exposed by the current change. The last two are **not this story's problem**.
38
- Scope authority: a finding may be routed to defer or reject *as out of scope* only on the authority of the intent itself. The spec's scope language, the plan, and the diff's own shape are not admissible scope authorities — if only they exclude a finding, treat it as evidence against the chosen reading (intent_gap or bad_spec), not as out of scope.
31
+ 1. Once every layer has reported and not before render a verdict on each finding on its own, ahead of any deduplication or grouping. For each finding:
32
+ - **Verify its own claimed consequence** at the location it names. Read past the diff hunk — into the callers, the guards upstream, whatever else the site depends on — far enough to tell whether that consequence actually occurs. Another finding's outcome, however adjacent, never settles this one.
33
+ - **Assign severity** from the verified consequence for the artifact's main consumer (software user, document reader, etc). Disregard any severity assigned by a reviewing subagent. Review subagents operate under by-design information asymmetry and do not have enough context to set final severity for this workflow.
34
+ - `low`: none or cosmetic
35
+ - `medium`: tolerable
36
+ - `high`: intolerable
37
+ - **Keep or dismiss.** Keep a finding only where verification confirmed its consequence. Dismiss noise, claims the verification refuted, and claims it could not substantiate no path to the claimed consequence at the named site is a valid disposal. Whatever the reason, it must dispose of the finding's own claim: a true fact about neighboring code that leaves the claim standing is not a dismissal, and the finding stays kept. Record each dismissal with its reason in the triage log below; never drop a finding silently.
38
+ - Scope authority: a finding may be dismissed or later deferred *as out of scope* only on the authority of the intent itself. The spec's scope language, the plan, and the diff's own shape are not admissible scope authorities — if only they exclude a finding, treat it as evidence against the chosen reading (intent_gap or bad_spec), not as out of scope.
39
+ - A finding whose fix edits `{spec_file}`: dismiss. A finding whose fix edits an agent-context document (CLAUDE.md, AGENTS.md, rules files, specs): defer, never patch.
40
+ 2. Group the survivors by shared root cause — two findings belong in one entry only when the same underlying 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 consequence and the highest severity among them.
41
+ 3. Route each entry into exactly one triage category. The first three are **this story's problem** — caused or exposed by the current change. The last is **not this story's problem**.
39
42
  - **intent_gap** — caused by the change; cannot be resolved from the spec because the captured intent is incomplete. Do not infer intent unless there is exactly one possible reading.
40
43
  - **bad_spec** — caused by the change, including direct deviations from spec. The spec should have been clear enough to prevent it. When in doubt between bad_spec and patch, prefer bad_spec — a spec-level fix is more likely to produce coherent code.
41
44
  - **patch** — caused by the change; trivially fixable without human input. Just part of the diff.
42
45
  - **defer** — pre-existing issue not caused by this story, surfaced incidentally by the review. Collect for later focused attention.
43
- - **reject** — noise. Drop silently. When unsure between defer and reject, prefer reject — only defer findings you are confident are real.
44
46
  4. Append a new entry to the `## Review Triage Log` section in `{spec_file}`, in this format:
45
47
  ```markdown
46
48
  ### {date} — Review pass
@@ -48,11 +50,12 @@ Announce skipped layers first, then launch every active layer before handling an
48
50
  - bad_spec: count
49
51
  - patch: count
50
52
  - defer: count
51
- - reject: count
53
+ - dismissed:
54
+ - <finding summary> — <the reason, which must dispose of that finding's own claim>
52
55
  - addressed_findings:
53
56
  - `[high|medium|low]` `[patch|bad_spec]` <finding summary and action taken in this pass>
54
57
  ```
55
- Where `{date}` is the current system date and `count` is either just `0`, or total with breakdown by severity `N: (high Nhigh, medium Nmedium, low Nlow)`.
58
+ Where `{date}` is the current system date and `count` is either just `0`, or total with breakdown by severity `N: (high Nhigh, medium Nmedium, low Nlow)`. Give `dismissed` one line per dismissal, or the single line `- none` when nothing was dismissed.
56
59
  If no patch was fixed and no bad_spec repair loopback was triggered in this pass, write:
57
60
  ```markdown
58
61
  - addressed_findings:
@@ -74,15 +77,14 @@ Announce skipped layers first, then launch every active layer before handling an
74
77
  severity: medium # optional — high | medium | low
75
78
  ```
76
79
  After all appends, parse the complete frontmatter as YAML and verify that `deferred` is one list containing every prior item plus the new items with their intended text. Repair serialization errors before continuing.
77
- - **reject** — Drop silently.
78
80
 
79
81
  ## Finalize
80
82
 
81
83
  Write the following details to `{spec_file}` under `## Auto Run Result`:
82
84
  - Summary of implemented change
83
85
  - Files changed with one-line descriptions
84
- - Review findings breakdown: patches applied, items deferred, items rejected
85
- - Follow-up review recommendation: count only this pass's findings triaged `patch` — never defer or reject. `true` if any patched finding was `high` severity, or if `3 × medium count + 1 × low count` is 5 or more; otherwise `false`. Record the patched counts by severity and the score.
86
+ - Review findings breakdown: patches applied, items deferred, and every dismissed finding with its reason
87
+ - Follow-up review recommendation: count only this pass's entries triaged `patch`, at entry severity — never deferred or dismissed ones. `true` if any patched entry was `high` severity, or if `3 × medium count + 1 × low count` is 5 or more; otherwise `false`. Record the patched counts by severity and the score.
86
88
  - Verification performed, including command outcomes or manual inspection notes
87
89
  - Any residual risks
88
90
 
@@ -52,7 +52,7 @@ If anything appears below, follow it as the final terminal instruction before ex
52
52
 
53
53
  Using subagents when instructed is mandatory. If you cannot, HALT with status `blocked` and blocking condition `no subagents`.
54
54
 
55
- Invoke every subagent **synchronously**: launch it, wait for it to return within the same turn, then continue with its result. When a step says to run subagents "in parallel" (e.g. the reviewers), that means several **blocking** calls awaited together in one turn not detached execution. Never run a subagent in the background / detached / async (e.g. `run_in_background: true`), and never end your turn to "await a completion notification." This workflow runs unattended: there is no event loop to resume a yielded turn, so a backgrounded subagent never hands control back and the run stalls. The only sanctioned way to end a turn is the HALT protocol above with an explicit terminal `status`.
55
+ Launch all the subagents a step calls for in **one message** several **blocking** calls awaited together in the same turn then wait for all their results before continuing; a step that calls for one subagent is that same message with one call. Never split a step's launches across messages, and never run one detached. Never run a subagent in the background / detached / async (e.g. `run_in_background: true`), and never end your turn to "await a completion notification." This workflow runs unattended: there is no event loop to resume a yielded turn, so a backgrounded subagent never hands control back and the run stalls. The only sanctioned way to end a turn is the HALT protocol above with an explicit terminal `status`.
56
56
 
57
57
  ## READY FOR DEVELOPMENT STANDARD
58
58
 
@@ -11,39 +11,32 @@
11
11
 
12
12
  1. **Normalize** findings from all layers into a unified list where each finding has:
13
13
  - `id` -- sequential integer
14
- - `source` -- the `id` of the layer that produced the finding (e.g., `blind-hunter`), or merged sources joined with `+` (e.g., `blind-hunter+edge-case-hunter`)
14
+ - `source` -- the `id` of the layer that produced the finding (e.g., `blind-hunter`)
15
15
  - `title` -- one-line summary
16
16
  - `detail` -- full description
17
17
  - `location` -- file and line reference (if available)
18
18
 
19
- 2. **Deduplicate.** Deduplicate only findings with the same claim and same required action. If two or more findings meet both conditions, merge them into one:
20
- - Use the most specific finding as the base (prefer findings with a precise location over prose-only findings).
21
- - Append any unique detail, reasoning, or location references from the other finding(s) into the surviving `detail` field.
22
- - Set `source` to the merged sources (e.g., `blind-hunter+edge-case-hunter`).
19
+ 2. Once every layer has reported -- and not before -- render a verdict on each finding on its own, ahead of any deduplication or grouping. For each finding:
20
+ - **Verify its own claimed consequence** at the location it names. Read past the diff hunk -- into the callers, the guards upstream, whatever else the site depends on -- far enough to tell whether that consequence actually occurs. Another finding's outcome, however adjacent, never settles this one.
21
+ - **Assign severity** from the verified consequence for the artifact's main consumer (software user, document reader, etc). Disregard any severity assigned by a reviewing subagent. Review subagents operate under by-design information asymmetry and do not have enough context to set final severity for this workflow.
22
+ - `low` -- none or cosmetic
23
+ - `medium` -- tolerable
24
+ - `high` -- intolerable
25
+ - **Keep or dismiss.** Keep a finding only where verification confirmed its consequence. Dismiss noise, claims the verification refuted, and claims it could not substantiate -- no path to the claimed consequence at the named site is a valid disposal. Whatever the reason, it must dispose of the finding's own claim: a true fact about neighboring code that leaves the claim standing is not a dismissal, and the finding stays kept. Record each dismissal with its reason for the summary; never drop a finding silently.
26
+ - A finding whose fix edits `{spec_file}`: dismiss. A finding whose fix edits an agent-context document (CLAUDE.md, AGENTS.md, rules files, specs): defer, never patch.
23
27
 
24
- 3. Then evaluate each remaining finding independently. Do not reject a finding because a related finding was rejected.
28
+ 3. **Group the survivors by shared root cause** -- two findings belong in one entry only when the same underlying 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 consequence in `detail` and the highest severity among them; set `source` to the contributing layers joined with `+` (e.g., `blind-hunter+edge-case-hunter`).
25
29
 
26
- 4. **Read the code before rating.** Before assigning severity, open the source at each finding's location and read enough surrounding code to judge reachability -- call sites, guards, and validation that live outside the diff hunk. Do not rate from the diff hunk alone. Severity reflects the real consequence at a real call site, not the worst theoretical reading.
27
-
28
- 5. **Assign severity** to each finding by consequence for the artifact's main consumer (software user, document reader, etc).
29
- Disregard any severity assigned by a reviewing subagent. Review subagents operate under by-design information asymmetry and do not have enough context to set final severity for this workflow.
30
- - `low` -- none or cosmetic
31
- - `medium` -- tolerable
32
- - `high` -- intolerable
33
-
34
- 6. **Route** each finding into exactly one triage bucket:
30
+ 4. **Route** each entry into exactly one triage bucket:
35
31
  - **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"`.
36
32
  - **patch** -- Code issue that is fixable without human input. The correct fix is unambiguous.
37
33
  - **defer** -- Pre-existing issue not caused by the current change. Real but not actionable now.
38
- - **dismiss** -- Noise, false positive, or handled elsewhere.
39
-
40
- 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).
41
34
 
42
- 7. **Drop** all `dismiss` findings. Record the dismiss count for the summary.
35
+ If `{review_mode}` = `"no-spec"` and an entry would otherwise be `decision_needed`, reclassify it as `patch` (if the fix is unambiguous) or `defer` (if not).
43
36
 
44
- 8. 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.
37
+ 5. If `{failed_layers}` is non-empty, report which layers failed before announcing results. If zero entries remain after dismissals AND `{failed_layers}` is non-empty, warn the user that the review may be incomplete rather than announcing a clean review.
45
38
 
46
- 9. 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}`.)
39
+ 6. If zero entries remain after triage (all dismissed or none raised): state "✅ Clean review — all layers passed." (Step 3 already warned if any review layers failed via `{failed_layers}`.)
47
40
 
48
41
  ## NEXT
49
42
 
@@ -35,7 +35,9 @@ Also append each `defer` finding to `{deferred_work_file}` under a heading `## D
35
35
 
36
36
  Announce what was written:
37
37
 
38
- > **Code review complete.** <D> `decision-needed`, <P> `patch`, <W> `defer`, <R> dismissed as noise.
38
+ > **Code review complete.** <D> `decision-needed`, <P> `patch`, <W> `defer`, <R> dismissed.
39
+
40
+ The findings report ends with a `Dismissed` appendix — one line per dismissed finding: the finding and the reason that disposed of its claim — in the story file's `### Review Findings` section when `{spec_file}` is set, at the tail of the chat listing otherwise.
39
41
 
40
42
  If `{spec_file}` is set, add: `Findings written to the review findings section in {spec_file}.`
41
43
  Otherwise add: `Findings are listed above. No story file was provided, so nothing was persisted.`