bmad-method 6.11.1-next.30 → 6.11.1-next.31
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.
- package/package.json +1 -1
- package/src/bmm-skills/plan/bmad-sprint-planning/scripts/__pycache__/sprint_plan.cpython-311.pyc +0 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/scripts/tests/__pycache__/test_sprint_plan.cpython-311-pytest-9.1.1.pyc +0 -0
- package/src/bmm-skills/ship/bmad-build/spec-template.md +3 -2
- package/src/bmm-skills/ship/bmad-build/step-04-review.md +29 -15
- package/src/bmm-skills/ship/bmad-build/step-05-present.md +1 -1
- package/src/bmm-skills/ship/bmad-build/step-oneshot.md +20 -10
- package/src/bmm-skills/ship/bmad-build-auto/spec-template.md +3 -3
- package/src/bmm-skills/ship/bmad-build-auto/step-04-review.md +37 -34
- package/src/bmm-skills/ship/bmad-code-review/steps/step-03-triage.md +26 -16
- package/src/bmm-skills/ship/bmad-code-review/steps/step-04-present.md +8 -8
- package/src/bmm-skills/ship/bmad-retrospective/scripts/__pycache__/sprint_status.cpython-311.pyc +0 -0
- package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/__pycache__/test_git_evidence.cpython-311-pytest-9.1.1.pyc +0 -0
- package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/__pycache__/test_sprint_status.cpython-311-pytest-9.1.1.pyc +0 -0
- package/src/scripts/__pycache__/config_utils.cpython-311.pyc +0 -0
- package/src/scripts/tests/__pycache__/test_config_utils.cpython-311.pyc +0 -0
- package/src/scripts/tests/__pycache__/test_resolve_config.cpython-311.pyc +0 -0
- package/src/scripts/tests/__pycache__/test_resolve_customization.cpython-311.pyc +0 -0
package/package.json
CHANGED
package/src/bmm-skills/plan/bmad-sprint-planning/scripts/__pycache__/sprint_plan.cpython-311.pyc
CHANGED
|
Binary file
|
|
Binary file
|
|
@@ -88,8 +88,9 @@ context: [] # optional: `{project-root}/`-prefixed paths to project-wide standar
|
|
|
88
88
|
|
|
89
89
|
## Review Triage Log
|
|
90
90
|
|
|
91
|
-
<!-- Append-only. Populated by step-04 on every review pass:
|
|
92
|
-
|
|
91
|
+
<!-- Append-only. Populated by step-04 on every review pass: one row per reviewer finding —
|
|
92
|
+
verdict (high/medium/low/false/maybe-false) with its evidence: the refutation for
|
|
93
|
+
false, what would settle it for maybe-false. Empty until the first review pass. -->
|
|
93
94
|
|
|
94
95
|
## Design Notes
|
|
95
96
|
|
|
@@ -28,29 +28,43 @@ If a layer's instruction requires subagents and none are available, for each suc
|
|
|
28
28
|
|
|
29
29
|
### Classify
|
|
30
30
|
|
|
31
|
-
1. Once every layer has reported — and not before — render a verdict on each finding
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
- `high
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
31
|
+
1. 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.
|
|
32
|
+
|
|
33
|
+
For each finding:
|
|
34
|
+
- **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.
|
|
35
|
+
- **Render exactly one verdict** from what verification established — the verdict is the whole triage decision; there is no separate keep-or-dismiss.
|
|
36
|
+
- `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 (inconsistent design, eroded invariants, duplicated sources of truth), name where it will cause trouble — which caller will diverge, which rule will break. 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.
|
|
37
|
+
- `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.
|
|
38
|
+
- `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`.
|
|
39
|
+
|
|
40
|
+
- Every finding gets one row in the `## Review Triage Log` section of `{spec_file}` — verdict plus its evidence in a sentence or two; never drop, merge, or silently skip one.
|
|
41
|
+
|
|
42
|
+
Reject `false` findings on their refutation.
|
|
43
|
+
|
|
44
|
+
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.
|
|
45
|
+
|
|
46
|
+
Out of scope: reject or defer a finding as out of scope only when the intent itself excludes it — not because the spec's scope section, the plan, or the shape of the diff says so. If only those would exclude it, keep the finding: the spec or plan drew the line somewhere the intent did not, so it routes to intent_gap or bad_spec, never to patch or defer.
|
|
47
|
+
|
|
48
|
+
Reject any finding whose fix is to edit this build's spec.
|
|
49
|
+
|
|
50
|
+
All remaining findings continue to grouping.
|
|
51
|
+
|
|
52
|
+
2. 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`).
|
|
53
|
+
3. Route each entry into exactly one triage category. 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`. The first three are **this story's problem** — caused or exposed by the current change. The last is **not this story's problem**.
|
|
41
54
|
- **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.
|
|
42
55
|
- **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.
|
|
43
|
-
- **patch** — caused by the change;
|
|
44
|
-
- **defer** — pre-existing issue not caused by this story
|
|
45
|
-
|
|
56
|
+
- **patch** — caused by the change; its smallest fix is trivial, adds no public surface, and guards no state you did not demonstrate. Just part of the diff. A finding whose smallest fix fails any of those conditions routes to intent_gap when the spec does not settle that fix, otherwise to bad_spec.
|
|
57
|
+
- **defer** — pre-existing issue not caused by this story; or an entry whose members are all `maybe-false`; or any entry whose fix edits agent-context files (CLAUDE.md, AGENTS.md, rules, etc). For maybe-false members, record what would settle them.
|
|
58
|
+
|
|
59
|
+
4. Process entries in cascading order. If intent_gap or bad_spec entries exist, they trigger a loopback — lower entries 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.
|
|
46
60
|
- **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.
|
|
47
61
|
- **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.
|
|
48
|
-
- **patch** — Auto-fix. These are the only findings that survive loopbacks. If the step-03 implementation subagent can be re-engaged with its context intact, send it all patch findings in one synchronous message — for each: the file, what is wrong, and what the fix must do. If it cannot be re-engaged, apply the patches yourself. Then re-run the checks in `{spec_file}`'s `## Verification` section, if present; if verification fails and the failure cannot be fixed, HALT and escalate to the human.
|
|
62
|
+
- **patch** — Auto-fix. These are the only findings that survive loopbacks. If the step-03 implementation subagent can be re-engaged with its context intact, send it all patch findings in one synchronous message — for each: the file, what is wrong, and what the smallest fix must do. If it cannot be re-engaged, apply the patches yourself. Then re-run the checks in `{spec_file}`'s `## Verification` section, if present; if verification fails and the failure cannot be fixed, HALT and escalate to the human.
|
|
49
63
|
- **defer** — Append one new entry to `{{.implementation_artifacts}}/deferred-work.md` using this format. Do not modify existing entries or look for duplicates.
|
|
50
64
|
```markdown
|
|
51
65
|
- source_spec: `{spec_file}`
|
|
52
66
|
summary: <one sentence>
|
|
53
|
-
evidence: <why this is real>
|
|
67
|
+
evidence: <why this is real; for a maybe-false finding, what evidence would settle it>
|
|
54
68
|
```
|
|
55
69
|
|
|
56
70
|
## NEXT
|
|
@@ -65,7 +65,7 @@ If version control is available and the tree is dirty, create a local commit wit
|
|
|
65
65
|
Display summary of your work to the user, including:
|
|
66
66
|
|
|
67
67
|
- The commit hash, if one was created.
|
|
68
|
-
- Review findings breakdown: patches applied, items deferred, and the
|
|
68
|
+
- Review findings breakdown: patches applied, items deferred, and the rejected count — reasons are recorded in the spec's `## Review Triage Log`.
|
|
69
69
|
|
|
70
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.
|
|
71
71
|
|
|
@@ -30,22 +30,32 @@ If a layer's instruction requires subagents and none are available, for each suc
|
|
|
30
30
|
|
|
31
31
|
### Classify
|
|
32
32
|
|
|
33
|
-
Once every layer has reported — and not before — render a verdict on each finding
|
|
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.
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
- **Assign severity** from the verified consequence for the software's user: `low` (none or cosmetic), `medium` (tolerable), `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; never drop a finding silently.
|
|
38
|
-
- A finding whose fix edits an agent-context document (e.g. CLAUDE.md, AGENTS.md, rules files, specs): defer, never patch.
|
|
35
|
+
For each finding:
|
|
39
36
|
|
|
40
|
-
|
|
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
|
+
|
|
44
|
+
Reject `false` findings on their refutation.
|
|
45
|
+
|
|
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.
|
|
47
|
+
|
|
48
|
+
All remaining findings continue to grouping.
|
|
49
|
+
|
|
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:
|
|
41
51
|
|
|
42
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.
|
|
43
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.
|
|
44
|
-
- **defer** — Defer every other entry
|
|
54
|
+
- **defer** — Defer every other entry: pre-existing issues, improvement ideas, entries whose members are all `maybe-false` (record what would settle them), 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.
|
|
45
55
|
```markdown
|
|
46
56
|
- source_spec: `{spec_file}`
|
|
47
57
|
summary: <one sentence>
|
|
48
|
-
evidence: <why this is real>
|
|
58
|
+
evidence: <why this is real; for a maybe-false finding, what evidence would settle it>
|
|
49
59
|
```
|
|
50
60
|
|
|
51
61
|
### Finalize Spec
|
|
@@ -54,7 +64,7 @@ Update `{spec_file}`:
|
|
|
54
64
|
|
|
55
65
|
1. **Frontmatter** — set `status: 'done'`.
|
|
56
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).
|
|
57
|
-
3. **Review Triage Log** — only when
|
|
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.
|
|
58
68
|
|
|
59
69
|
Follow `[[bmad-snapshot:sync-sprint-status.md]]` with `target_status` = `review`.
|
|
60
70
|
|
|
@@ -70,7 +80,7 @@ Display a summary in conversation output, including:
|
|
|
70
80
|
|
|
71
81
|
- The commit hash (if one was created).
|
|
72
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.
|
|
73
|
-
- Review findings breakdown: patches applied, items deferred, and the
|
|
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.
|
|
74
84
|
|
|
75
85
|
Offer to push and/or create a pull request.
|
|
76
86
|
|
|
@@ -73,9 +73,9 @@ deferred: [] # append-only machine-readable deferred review findings; each item
|
|
|
73
73
|
## Review Triage Log
|
|
74
74
|
|
|
75
75
|
<!-- Append-only. Populated by step-04 on EVERY review pass, including loopbacks and blocked exits.
|
|
76
|
-
Each entry records
|
|
77
|
-
|
|
78
|
-
|
|
76
|
+
Each entry records verdict counts (high/medium/low/false/maybe-false) and one row per
|
|
77
|
+
reviewer finding: verdict, route, and evidence — the refutation for false, what would settle
|
|
78
|
+
it for maybe-false, the action taken for patches. Empty until the first review pass. -->
|
|
79
79
|
|
|
80
80
|
## Design Notes
|
|
81
81
|
|
|
@@ -28,50 +28,53 @@ Announce skipped layers first, then launch every active layer before handling an
|
|
|
28
28
|
|
|
29
29
|
### Classify
|
|
30
30
|
|
|
31
|
-
1. Once every layer has reported — and not before — render a verdict on each finding
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
- `high
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
31
|
+
1. 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.
|
|
32
|
+
|
|
33
|
+
For each finding:
|
|
34
|
+
- **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.
|
|
35
|
+
- **Render exactly one verdict** from what verification established — the verdict is the whole triage decision; there is no separate keep-or-dismiss.
|
|
36
|
+
- `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 (inconsistent design, eroded invariants, duplicated sources of truth), name where it will cause trouble — which caller will diverge, which rule will break. 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.
|
|
37
|
+
- `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.
|
|
38
|
+
- `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`.
|
|
39
|
+
|
|
40
|
+
- Every finding gets one row in the triage log below — verdict plus its evidence in a sentence or two; never drop, merge, or silently skip one.
|
|
41
|
+
|
|
42
|
+
Reject `false` findings on their refutation.
|
|
43
|
+
|
|
44
|
+
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.
|
|
45
|
+
|
|
46
|
+
Out of scope: reject or defer a finding as out of scope only when the intent itself excludes it — not because the spec's scope section, the plan, or the shape of the diff says so. If only those would exclude it, keep the finding: the spec or plan drew the line somewhere the intent did not, so it routes to intent_gap or bad_spec, never to patch or defer.
|
|
47
|
+
|
|
48
|
+
Reject any finding whose fix is to edit this build's spec.
|
|
49
|
+
|
|
50
|
+
All remaining findings continue to grouping.
|
|
51
|
+
|
|
52
|
+
2. 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`).
|
|
53
|
+
3. Route each entry into exactly one triage category. 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`. The first three are **this story's problem** — caused or exposed by the current change. The last is **not this story's problem**.
|
|
42
54
|
- **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.
|
|
43
55
|
- **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.
|
|
44
|
-
- **patch** — caused by the change;
|
|
45
|
-
- **defer** — pre-existing issue not caused by this story
|
|
56
|
+
- **patch** — caused by the change; its smallest fix is trivial, adds no public surface, and guards no state you did not demonstrate. Just part of the diff. A finding whose smallest fix fails any of those conditions routes to intent_gap when the spec does not settle that fix, otherwise to bad_spec.
|
|
57
|
+
- **defer** — pre-existing issue not caused by this story; or an entry whose members are all `maybe-false`; or any entry whose fix edits agent-context files (CLAUDE.md, AGENTS.md, rules, etc). For maybe-false members, record what would settle them.
|
|
58
|
+
|
|
46
59
|
4. Append a new entry to the `## Review Triage Log` section in `{spec_file}`, in this format:
|
|
47
60
|
```markdown
|
|
48
61
|
### {date} — Review pass
|
|
49
|
-
-
|
|
50
|
-
-
|
|
51
|
-
|
|
52
|
-
- defer: count
|
|
53
|
-
- dismissed:
|
|
54
|
-
- <finding summary> — <the reason, which must dispose of that finding's own claim>
|
|
55
|
-
- addressed_findings:
|
|
56
|
-
- `[high|medium|low]` `[patch|bad_spec]` <finding summary and action taken in this pass>
|
|
57
|
-
```
|
|
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.
|
|
59
|
-
If no patch was fixed and no bad_spec repair loopback was triggered in this pass, write:
|
|
60
|
-
```markdown
|
|
61
|
-
- addressed_findings:
|
|
62
|
-
- none
|
|
62
|
+
- verdicts: <total> findings — high <N>, medium <N>, low <N>, false <N>, maybe-false <N>
|
|
63
|
+
- findings:
|
|
64
|
+
- `[verdict]` `[intent_gap|bad_spec|patch|defer|reject]` <finding summary> — <evidence: the refutation for false, what would settle it for maybe-false, the action taken for patches, why a rejected low was not worth fixing>
|
|
63
65
|
```
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
- **
|
|
67
|
-
- **
|
|
66
|
+
Where `{date}` is the current system date. One row per finding from every layer, in the order the layers reported them; `<total>` must equal the number of findings the layers reported — a finding missing from the log is a triage failure. Members of a grouped entry keep their own rows and share the route.
|
|
67
|
+
5. Process entries in cascading order. If intent_gap exists, lower entries are moot; follow the intent_gap branch below. If bad_spec exists, lower entries are moot since code will be re-derived. If neither exists, process patch and defer normally. Before each bad_spec loopback, read `{spec_file}` frontmatter `review_loop_iteration` (missing means `0`), increment it by 1, and write it back. If it exceeds 5, append the triage-log entry for this pass, then HALT with status `blocked` and blocking condition `review repair loop exceeded 5 iterations (non-convergence)`.
|
|
68
|
+
- **intent_gap** — Root cause is inside `<intent-contract>`. Save the attempted change as a patch file in `{{.implementation_artifacts}}` and reference it from the triage-log entry, then revert code changes. Append the triage-log entry for this pass, then HALT with status `blocked`, blocking condition `intent gap`, and include the unresolved questions and the saved patch path.
|
|
69
|
+
- **bad_spec** — Root cause is outside `<intent-contract>`. Do not modify content inside `<intent-contract>`. 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 sections outside `<intent-contract>` 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. Append the triage-log entry for this pass, recording in each bad_spec row the amendment it triggered. Read fully and follow `[[bmad-snapshot:step-03-implement.md]]` to re-derive the code, then this step will run again.
|
|
70
|
+
- **patch** — Auto-fix. These are the only findings that survive loopbacks. If the step-03 implementation subagent can be re-engaged with its context intact, send it all patch findings in one synchronous message — for each: the file, what is wrong, and what the smallest fix must do. If it cannot be re-engaged, apply the patches yourself. Then re-run the commands in `{spec_file}`'s `## Verification` section (or perform its manual checks); if verification fails and the failure cannot be fixed, HALT with status `blocked` and blocking condition `patch verification failed`. Append the triage-log entry for this pass, recording in each patched row the fix applied.
|
|
68
71
|
- **defer** — Update the single `deferred` list in `{spec_file}` frontmatter. If the field is absent (including on specs created before this field existed), add it once as an empty list. If it is `deferred: []`, replace that empty value when adding the first item; otherwise append to the existing list. Preserve every existing item, do not look for duplicates, and never add a second `deferred:` key. Serialize free-form values as YAML block scalars so characters such as `:`, `#`, quotes, and line breaks remain data. Each item uses this shape:
|
|
69
72
|
```yaml
|
|
70
73
|
deferred:
|
|
71
74
|
- summary: >-
|
|
72
75
|
<one sentence>
|
|
73
76
|
evidence: |-
|
|
74
|
-
<why this is real>
|
|
77
|
+
<why this is real; for a maybe-false finding, what evidence would settle it>
|
|
75
78
|
location: >- # optional — file:line or component
|
|
76
79
|
src/foo.py:42
|
|
77
80
|
severity: medium # optional — high | medium | low
|
|
@@ -83,8 +86,8 @@ Announce skipped layers first, then launch every active layer before handling an
|
|
|
83
86
|
Write the following details to `{spec_file}` under `## Auto Run Result`:
|
|
84
87
|
- Summary of implemented change
|
|
85
88
|
- Files changed with one-line descriptions
|
|
86
|
-
- Review findings breakdown: patches applied, items deferred, and every
|
|
87
|
-
- Follow-up review recommendation: count only this pass's entries triaged `patch`, at entry
|
|
89
|
+
- Review findings breakdown: patches applied, items deferred, and every rejected finding with its recorded reason
|
|
90
|
+
- Follow-up review recommendation: count only this pass's entries triaged `patch`, at entry verdict — never deferred or `false` ones. `true` if any patched entry was `high`, or if two or more `medium` entries were patched; otherwise `false`. Record the patched counts by verdict.
|
|
88
91
|
- Verification performed, including command outcomes or manual inspection notes
|
|
89
92
|
- Any residual risks
|
|
90
93
|
|
|
@@ -16,27 +16,37 @@
|
|
|
16
16
|
- `detail` -- full description
|
|
17
17
|
- `location` -- file and line reference (if available)
|
|
18
18
|
|
|
19
|
-
2. Once every layer has reported -- and not before -- render a verdict on each finding
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
- `high` --
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
19
|
+
2. 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.
|
|
20
|
+
|
|
21
|
+
For each finding:
|
|
22
|
+
- **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.
|
|
23
|
+
- **Render exactly one verdict** from what verification established -- the verdict is the whole triage decision; there is no separate keep-or-dismiss.
|
|
24
|
+
- `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 (inconsistent design, eroded invariants, duplicated sources of truth), name where it will cause trouble -- which caller will diverge, which rule will break. 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.
|
|
25
|
+
- `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.
|
|
26
|
+
- `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`.
|
|
27
|
+
|
|
28
|
+
- Every finding keeps its verdict and evidence (a sentence or two) for the summary; never drop, merge, or silently skip one.
|
|
29
|
+
|
|
30
|
+
Reject `false` findings on their refutation.
|
|
31
|
+
|
|
32
|
+
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.
|
|
33
|
+
|
|
34
|
+
Reject any finding whose fix is to edit the spec under review.
|
|
35
|
+
|
|
36
|
+
All remaining findings continue to grouping.
|
|
37
|
+
|
|
38
|
+
3. **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 in `detail` and the highest verdict among them (`high` > `medium` > `low` > `maybe-false`); set `source` to the contributing layers joined with `+` (e.g., `blind-hunter+edge-case-hunter`).
|
|
39
|
+
|
|
40
|
+
4. **Route** each entry into exactly one triage bucket. 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`.
|
|
31
41
|
- **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"`.
|
|
32
|
-
- **patch** -- Code issue that is fixable without human input. The correct fix is unambiguous
|
|
33
|
-
- **defer** -- Pre-existing issue not caused by the current change
|
|
42
|
+
- **patch** -- Code issue that is fixable without human input. The correct fix is unambiguous, adds no public surface, and guards no state you did not demonstrate; otherwise `decision_needed`.
|
|
43
|
+
- **defer** -- Pre-existing issue not caused by the current change, real but not actionable now; or an entry whose members are all `maybe-false`; or any entry whose fix edits agent-context files (CLAUDE.md, AGENTS.md, rules, other specs). For maybe-false members, record what would settle them.
|
|
34
44
|
|
|
35
45
|
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).
|
|
36
46
|
|
|
37
|
-
5. If `{failed_layers}` is non-empty, report which layers failed before announcing results. If zero entries remain after
|
|
47
|
+
5. If `{failed_layers}` is non-empty, report which layers failed before announcing results. If zero entries remain after rejections AND `{failed_layers}` is non-empty, warn the user that the review may be incomplete rather than announcing a clean review.
|
|
38
48
|
|
|
39
|
-
6. If zero entries remain after triage (all
|
|
49
|
+
6. If zero entries 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}`.)
|
|
40
50
|
|
|
41
51
|
## NEXT
|
|
42
52
|
|
|
@@ -14,7 +14,7 @@ deferred_work_file: '{implementation_artifacts}/deferred-work.md'
|
|
|
14
14
|
|
|
15
15
|
### 1. Clean review shortcut
|
|
16
16
|
|
|
17
|
-
If zero findings remain after triage (all
|
|
17
|
+
If zero findings remain after triage (all rejected or none raised): state that and proceed to section 6 (Sprint Status Update).
|
|
18
18
|
|
|
19
19
|
### 2. Write findings to the story file
|
|
20
20
|
|
|
@@ -27,7 +27,7 @@ If `{spec_file}` exists and contains a Tasks/Subtasks section, append a `### Rev
|
|
|
27
27
|
`- [ ] [Review][Patch] <Title> [<file>:<line>]`
|
|
28
28
|
|
|
29
29
|
3. **`defer`** findings (checked off, marked deferred):
|
|
30
|
-
`- [x] [Review][Defer] <Title> [<file>:<line>] — deferred
|
|
30
|
+
`- [x] [Review][Defer] <Title> [<file>:<line>] — deferred: <pre-existing, or for maybe-false the evidence that would settle it>`
|
|
31
31
|
|
|
32
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.
|
|
33
33
|
|
|
@@ -35,16 +35,16 @@ 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>
|
|
38
|
+
> **Code review complete.** <D> `decision-needed`, <P> `patch`, <W> `defer`, <R> rejected.
|
|
39
39
|
|
|
40
|
-
The findings report ends with a `
|
|
40
|
+
The findings report ends with a `Rejected` appendix — one line per rejected finding: `false` with its refutation, `low` with why it was not worth fixing — in the story file's `### Review Findings` section when `{spec_file}` is set, at the tail of the chat listing otherwise.
|
|
41
41
|
|
|
42
42
|
If `{spec_file}` is set, add: `Findings written to the review findings section in {spec_file}.`
|
|
43
43
|
Otherwise add: `Findings are listed above. No story file was provided, so nothing was persisted.`
|
|
44
44
|
|
|
45
45
|
### 4. Resolve decision-needed findings
|
|
46
46
|
|
|
47
|
-
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
|
|
47
|
+
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 rejected.
|
|
48
48
|
|
|
49
49
|
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.
|
|
50
50
|
|
|
@@ -80,7 +80,7 @@ If `{spec_file}` is **not** set, present only options 1 and 2 (omit "Leave as ac
|
|
|
80
80
|
- Decision-needed resolved: <D>
|
|
81
81
|
- Patches handled: <P>
|
|
82
82
|
- Deferred: <W>
|
|
83
|
-
-
|
|
83
|
+
- Rejected: <R>
|
|
84
84
|
|
|
85
85
|
### 6. Update story status and sync sprint tracking
|
|
86
86
|
|
|
@@ -88,7 +88,7 @@ Skip this section if `{spec_file}` is not set.
|
|
|
88
88
|
|
|
89
89
|
#### Determine new status based on review outcome
|
|
90
90
|
|
|
91
|
-
- If all `decision-needed` and `patch` findings were resolved (fixed or
|
|
91
|
+
- If all `decision-needed` and `patch` findings were resolved (fixed or rejected) AND no unresolved `high`/`medium` findings remain: set `{new_status}` = `done`. Update the story file Status section to `done`.
|
|
92
92
|
- If `patch` findings were left as action items, or unresolved issues remain: set `{new_status}` = `in-progress`. Update the story file Status section to `in-progress`.
|
|
93
93
|
|
|
94
94
|
Save the story file.
|
|
@@ -114,7 +114,7 @@ If `{sprint_status}` file does not exist, note that story status was updated in
|
|
|
114
114
|
> **Issues Fixed:** <fixed_count>
|
|
115
115
|
> **Action Items Created:** <action_count>
|
|
116
116
|
> **Deferred:** <W>
|
|
117
|
-
> **
|
|
117
|
+
> **Rejected:** <R>
|
|
118
118
|
|
|
119
119
|
### 7. Next steps
|
|
120
120
|
|
package/src/bmm-skills/ship/bmad-retrospective/scripts/__pycache__/sprint_status.cpython-311.pyc
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|