bmad-method 6.11.1-next.20 → 6.11.1-next.22
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-project-context/SKILL.md +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/customize.toml +8 -9
- package/src/bmm-skills/ship/bmad-build/references/claims-check.md +14 -0
- package/src/bmm-skills/ship/bmad-build/review-prompts/edge-case-hunter.md +29 -7
- package/src/bmm-skills/ship/bmad-build/review-prompts/verification-gap.md +1 -1
- package/src/bmm-skills/ship/bmad-build/step-03-implement.md +3 -1
- package/src/bmm-skills/ship/bmad-build/step-04-review.md +7 -5
- package/src/bmm-skills/ship/bmad-build-auto/customize.toml +9 -12
- package/src/bmm-skills/ship/bmad-build-auto/references/claims-check.md +14 -0
- package/src/bmm-skills/ship/bmad-build-auto/review-prompts/edge-case-hunter.md +29 -7
- package/src/bmm-skills/ship/bmad-build-auto/review-prompts/verification-gap.md +1 -1
- package/src/bmm-skills/ship/bmad-build-auto/step-03-implement.md +5 -1
- package/src/bmm-skills/ship/bmad-build-auto/step-04-review.md +7 -5
- package/src/bmm-skills/ship/bmad-code-review/steps/step-01-gather-context.md +3 -3
- 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/core-skills/bmad-review/SKILL.md +3 -2
- package/src/core-skills/bmad-review/references/lens-edge-case-hunter.md +16 -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
|
@@ -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.
|
|
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
|
package/src/bmm-skills/plan/bmad-sprint-planning/scripts/__pycache__/sprint_plan.cpython-311.pyc
CHANGED
|
Binary file
|
|
Binary file
|
|
@@ -84,8 +84,10 @@ Launch a subagent with no prior conversation context, with this prompt:
|
|
|
84
84
|
|
|
85
85
|
# Review layers for the review step. `instruction` is the layer's whole
|
|
86
86
|
# execution recipe — subagents by default, but an override may run anything
|
|
87
|
-
# (e.g. an external reviewer via bash). {
|
|
88
|
-
# time
|
|
87
|
+
# (e.g. an external reviewer via bash). {diff_file} and {claims_file} are
|
|
88
|
+
# substituted at run time; both are paths, and {diff_file} is the unified diff
|
|
89
|
+
# file the layer reads. `when` (optional) gates a layer; empty `instruction`
|
|
90
|
+
# disables it.
|
|
89
91
|
|
|
90
92
|
[[workflow.review_layers]]
|
|
91
93
|
id = "blind-hunter"
|
|
@@ -100,8 +102,7 @@ Output a Markdown list of findings only — no severity, priority, or ranking.
|
|
|
100
102
|
If the content is empty, stop and say so.
|
|
101
103
|
If you have zero findings, re-check and keep thinking; do not stop with an empty list.
|
|
102
104
|
|
|
103
|
-
CONTENT:
|
|
104
|
-
{diff_output}
|
|
105
|
+
CONTENT: the unified diff at `{diff_file}`. Read that file — it is the content under review.
|
|
105
106
|
|
|
106
107
|
Do not invoke any skill, and do not spawn subagents of your own — you are the reviewer. Return your findings as text in your final message; do not route them through any findings-reporting tool the host may offer.
|
|
107
108
|
|
|
@@ -115,9 +116,9 @@ Launch a context-free subagent with this prompt:
|
|
|
115
116
|
|
|
116
117
|
Read `{skill-root}/review-prompts/edge-case-hunter.md` completely and follow it as your review instructions.
|
|
117
118
|
|
|
118
|
-
|
|
119
|
+
claims_file (leave unread until your instructions call for it): {claims_file}
|
|
119
120
|
|
|
120
|
-
{
|
|
121
|
+
Review content: the unified diff at `{diff_file}`. Read that file — it is the content under review.
|
|
121
122
|
|
|
122
123
|
Do not invoke any skill, and do not spawn subagents of your own — you are the reviewer. If the instruction file is unreadable, report that exact failure and stop. Return your findings as text in your final message; do not route them through any findings-reporting tool the host may offer.
|
|
123
124
|
|
|
@@ -131,9 +132,7 @@ Launch a context-free subagent with this prompt:
|
|
|
131
132
|
|
|
132
133
|
Read `{skill-root}/review-prompts/verification-gap.md` completely and follow it as your review instructions.
|
|
133
134
|
|
|
134
|
-
Review content:
|
|
135
|
-
|
|
136
|
-
{diff_output}
|
|
135
|
+
Review content: the unified diff at `{diff_file}`. Read that file — it is the content under review.
|
|
137
136
|
|
|
138
137
|
Do not invoke any skill, and do not spawn subagents of your own — you are the reviewer. If the instruction file is unreadable, report that exact failure and stop. Return your findings as text in your final message; do not route them through any findings-reporting tool the host may offer.
|
|
139
138
|
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Claims Check
|
|
2
|
+
|
|
3
|
+
Final pass for the Edge Case Hunter. Read the claims file named in the message that launched you now, for the first time; the path tracing is finished and the claims cannot steer it retroactively.
|
|
4
|
+
|
|
5
|
+
It is the spec the change was built from. Read only its `## Intent` and `## Tasks & Acceptance` sections — the claims live there; ignore the rest of the file. The spec is the change's own account of itself: testimony, not evidence — a claim repeated in a code comment is still the same claim, not confirmation. Extract each checkable claim — what the change does, what it preserves, ordering, arithmetic, and parity with existing code ("exactly as X does") — then try to falsify each one against the code you have already traced. Where your trace is not enough to decide, read the code that decides it: the compared-to function, the actual callee, the state the claim assumes.
|
|
6
|
+
|
|
7
|
+
Append one finding per falsified claim to the same JSON array, with the four standard fields plus:
|
|
8
|
+
|
|
9
|
+
- `kind`: `"claim"`
|
|
10
|
+
- `confidence`: `"high"`, `"medium"`, or `"low"`
|
|
11
|
+
|
|
12
|
+
For a claim finding the standard fields read as: `location` = where the code contradicts the claim; `trigger_condition` = the claim, quoted or tightly paraphrased; `guard_snippet` = what the code actually does; `potential_consequence` = what goes wrong for someone who believed the claim.
|
|
13
|
+
|
|
14
|
+
Verified claims produce nothing. Add nothing if nothing is falsified.
|
|
@@ -5,10 +5,12 @@ When a diff is provided, scan only the diff hunks and list boundaries that are d
|
|
|
5
5
|
When no diff is provided (full file or function), treat the entire provided content as the scope.
|
|
6
6
|
Ignore the rest of the codebase unless the provided content explicitly references external functions.
|
|
7
7
|
A brief secondary deletion check runs as Step 4 when the diff removes code.
|
|
8
|
+
A claims check runs as Step 5.
|
|
8
9
|
|
|
9
10
|
**Inputs:**
|
|
10
|
-
- **content** — Content to review: diff, full file, or function
|
|
11
|
+
- **content** — Content to review, or a path to read it from: diff, full file, or function
|
|
11
12
|
- **also_consider** (optional) — Areas to keep in mind during review alongside normal edge-case analysis
|
|
13
|
+
- **claims_file** — Path to the spec this change was built from. Do NOT read it before Step 5: the path tracing in Steps 2–3 must finish before the claims are seen.
|
|
12
14
|
|
|
13
15
|
**MANDATORY: Execute steps in the Execution section IN EXACT ORDER. DO NOT skip steps or change the sequence. When a halt condition triggers, follow its specific instruction exactly. Each action within a step is a REQUIRED action to complete that step.**
|
|
14
16
|
|
|
@@ -19,8 +21,8 @@ A brief secondary deletion check runs as Step 4 when the diff removes code.
|
|
|
19
21
|
|
|
20
22
|
### Step 1: Receive Content
|
|
21
23
|
|
|
22
|
-
-
|
|
23
|
-
- If content is empty, or cannot be decoded as text, return `[{"location":"N/A","trigger_condition":"Input empty or undecodable","guard_snippet":"Provide valid content to review","potential_consequence":"Review skipped — no analysis performed"}]` and stop
|
|
24
|
+
- Take the content to review from the parent message that launched you — inline, or by reading the file it points to (never from this instruction file)
|
|
25
|
+
- If no content is supplied, or it is empty, unreadable, or cannot be decoded as text, return `[{"location":"N/A","trigger_condition":"Input empty or undecodable","guard_snippet":"Provide valid content to review","potential_consequence":"Review skipped — no analysis performed"}]` and stop
|
|
24
26
|
- Identify content type (diff, full file, or function) to determine scope rules
|
|
25
27
|
|
|
26
28
|
### Step 2: Exhaustive Path Analysis
|
|
@@ -42,7 +44,11 @@ A brief secondary deletion check runs as Step 4 when the diff removes code.
|
|
|
42
44
|
|
|
43
45
|
If the diff removed or replaced meaningful code (ignore pure renames and whitespace): load `references/deletion-check.md` and follow it.
|
|
44
46
|
|
|
45
|
-
### Step 5:
|
|
47
|
+
### Step 5: Claims Check
|
|
48
|
+
|
|
49
|
+
Load `references/claims-check.md` and follow it.
|
|
50
|
+
|
|
51
|
+
### Step 6: Present Findings
|
|
46
52
|
|
|
47
53
|
Output all findings as a single JSON array following the Output Format specification exactly.
|
|
48
54
|
|
|
@@ -60,12 +66,12 @@ Return ONLY a valid JSON array of objects. Each edge-case finding contains exact
|
|
|
60
66
|
}]
|
|
61
67
|
```
|
|
62
68
|
|
|
63
|
-
No extra text, no explanations, no markdown wrapping. An empty array `[]` is valid when nothing is found. Deletion findings from Step 4, if any, go in the same array with the extra fields defined in `references/deletion-check.md`.
|
|
69
|
+
No extra text, no explanations, no markdown wrapping. An empty array `[]` is valid when nothing is found. Deletion findings from Step 4 and claim findings from Step 5, if any, go in the same array with the extra fields defined in `references/deletion-check.md` and `references/claims-check.md`.
|
|
64
70
|
|
|
65
71
|
|
|
66
72
|
## HALT CONDITIONS
|
|
67
73
|
|
|
68
|
-
- If content is empty or cannot be decoded as text, return `[{"location":"N/A","trigger_condition":"Input empty or undecodable","guard_snippet":"Provide valid content to review","potential_consequence":"Review skipped — no analysis performed"}]` and stop
|
|
74
|
+
- If no content is supplied, or it is empty, unreadable, or cannot be decoded as text, return `[{"location":"N/A","trigger_condition":"Input empty or undecodable","guard_snippet":"Provide valid content to review","potential_consequence":"Review skipped — no analysis performed"}]` and stop
|
|
69
75
|
<reference path="references/deletion-check.md">
|
|
70
76
|
# Deletion Check
|
|
71
77
|
|
|
@@ -82,7 +88,23 @@ For a deletion finding the standard fields read as: `location` = the removed ite
|
|
|
82
88
|
|
|
83
89
|
Add nothing if nothing qualifies.
|
|
84
90
|
</reference>
|
|
91
|
+
<reference path="references/claims-check.md">
|
|
92
|
+
# Claims Check
|
|
93
|
+
|
|
94
|
+
Final pass for the Edge Case Hunter. Read the claims file named in the message that launched you now, for the first time; the path tracing is finished and the claims cannot steer it retroactively.
|
|
95
|
+
|
|
96
|
+
It is the spec the change was built from. Read only its `## Intent` and `## Tasks & Acceptance` sections — the claims live there; ignore the rest of the file. The spec is the change's own account of itself: testimony, not evidence — a claim repeated in a code comment is still the same claim, not confirmation. Extract each checkable claim — what the change does, what it preserves, ordering, arithmetic, and parity with existing code ("exactly as X does") — then try to falsify each one against the code you have already traced. Where your trace is not enough to decide, read the code that decides it: the compared-to function, the actual callee, the state the claim assumes.
|
|
97
|
+
|
|
98
|
+
Append one finding per falsified claim to the same JSON array, with the four standard fields plus:
|
|
99
|
+
|
|
100
|
+
- `kind`: `"claim"`
|
|
101
|
+
- `confidence`: `"high"`, `"medium"`, or `"low"`
|
|
102
|
+
|
|
103
|
+
For a claim finding the standard fields read as: `location` = where the code contradicts the claim; `trigger_condition` = the claim, quoted or tightly paraphrased; `guard_snippet` = what the code actually does; `potential_consequence` = what goes wrong for someone who believed the claim.
|
|
104
|
+
|
|
105
|
+
Verified claims produce nothing. Add nothing if nothing is falsified.
|
|
106
|
+
</reference>
|
|
85
107
|
|
|
86
108
|
## CONTENT SOURCE
|
|
87
109
|
|
|
88
|
-
|
|
110
|
+
"Review content:" in the message that launched you gives the content itself or a path to read it from. Read the file when it is a path; either way that is the content under review, and this instruction file never is.
|
|
@@ -110,4 +110,4 @@ When you find no verification gaps and no other findings, output exactly this si
|
|
|
110
110
|
|
|
111
111
|
## CONTENT SOURCE
|
|
112
112
|
|
|
113
|
-
|
|
113
|
+
"Review content:" in the message that launched you gives the content itself or a path to read it from. Read the file when it is a path; either way that is the content under review, and this instruction file never is. If no content is supplied, or the file it points to is missing, empty, or unreadable, say exactly that and stop — never report a clean review for content you could not read.
|
|
@@ -38,7 +38,9 @@ The handoff directs the subagent to load the spec's `context:` files itself, so
|
|
|
38
38
|
|
|
39
39
|
### Tasks & Acceptance Verification
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
Stage the diff and read it first: using the repository's version-control tooling, write a unified diff of all changes since `{baseline_commit}` (from `{spec_file}` frontmatter) — untracked files included — to a uniquely-named file in the system temp directory, set `{diff_file}` to its absolute path, and read that file into your own context. Judge against the diff, not against the implementation subagent's report.
|
|
42
|
+
|
|
43
|
+
Verify every task in the `## Tasks & Acceptance` section of `{spec_file}` is complete and every acceptance criterion is satisfied. Mark each finished task `[x]`. If any task is not done or any acceptance criterion is not satisfied, finish the missing work before proceeding — and when that changes code, rewrite `{diff_file}` and re-read it.
|
|
42
44
|
|
|
43
45
|
### Matrix Test Audit
|
|
44
46
|
|
|
@@ -10,19 +10,21 @@
|
|
|
10
10
|
|
|
11
11
|
Change `{spec_file}` status to `in-review` in the frontmatter before continuing.
|
|
12
12
|
|
|
13
|
-
###
|
|
13
|
+
### Stage the Diff
|
|
14
14
|
|
|
15
|
-
Read `{baseline_commit}` from `{spec_file}` frontmatter. If `{baseline_commit}` is missing or `NO_VCS`, use best effort to determine what changed. Otherwise
|
|
15
|
+
Read `{baseline_commit}` from `{spec_file}` frontmatter. If `{baseline_commit}` is missing or `NO_VCS`, use best effort to determine what changed. Otherwise use the repository's version-control tooling to rewrite `{diff_file}` — the temp file staged in step-03, or a uniquely-named file in the system temp directory when this run has none — with a unified diff of all changes since `{baseline_commit}`, untracked files included. The review layers read that file; the diff text is never pasted into their prompts.
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
Set `{claims_file}` = `{spec_file}`. The spec is the change's own account of itself, and it goes to the edge-case layer alone — as a path, so that layer reads it only after its own tracing and the other layers never see it at all.
|
|
18
|
+
|
|
19
|
+
Writing `{diff_file}` is the only change this section makes. Do NOT `git add` anything.
|
|
18
20
|
|
|
19
21
|
### Review
|
|
20
22
|
|
|
21
|
-
Announce skipped layers first, then launch every active layer before handling any layer's result. Try running all active layers simultaneously: substitute the runtime placeholders (
|
|
23
|
+
Announce skipped layers first, then launch every active layer before handling any layer's result. Try running all active layers simultaneously: substitute the runtime placeholders (`{diff_file}`, `{claims_file}`) into each layer's instruction. `{diff_file}` is a path: substitute the absolute path and let the layer read the file — a launch prompt never carries diff text. When an instruction launches a reviewer subagent, launch that child with the prompt text after placeholder substitution; do not load the reviewer instruction file yourself. For any other customized instruction, execute it as written. Parallel means several blocking calls awaited together in this turn — never backgrounded or detached, never ending the turn to await results. When running layers as subagents, spawn every reviewer before reading or reacting to any of their output; begin collection and triage only once all are launched.
|
|
22
24
|
|
|
23
25
|
{workflow.review_layers}
|
|
24
26
|
|
|
25
|
-
If a layer's instruction requires subagents and none are available, for each such layer write under `{{.implementation_artifacts}}`
|
|
27
|
+
If a layer's instruction requires subagents and none are available, for each such layer write under `{{.implementation_artifacts}}` that layer's child prompt with every file it points to — the diff, the claims, the reviewer instruction file — replaced inline by that file's contents, and every other line left exactly as written. That session shares no filesystem with this one, so its prompt has to stand alone; this is the only place you read a reviewer instruction file yourself. Then HALT. Ask the human to run each in a separate session (ideally a different LLM) and paste back the findings.
|
|
26
28
|
|
|
27
29
|
### Classify
|
|
28
30
|
|
|
@@ -46,8 +46,10 @@ Launch a subagent with no prior conversation context, with this prompt:
|
|
|
46
46
|
|
|
47
47
|
# Review layers for the review step. `instruction` is the layer's whole
|
|
48
48
|
# execution recipe — subagents by default, but an override may run anything
|
|
49
|
-
# (e.g. an external reviewer via bash). {
|
|
50
|
-
# time
|
|
49
|
+
# (e.g. an external reviewer via bash). {diff_file} and {claims_file} are
|
|
50
|
+
# substituted at run time; both are paths, and {diff_file} is the unified diff
|
|
51
|
+
# file the layer reads. `when` (optional) gates a layer; empty `instruction`
|
|
52
|
+
# disables it.
|
|
51
53
|
|
|
52
54
|
[[workflow.review_layers]]
|
|
53
55
|
id = "blind-hunter"
|
|
@@ -62,8 +64,7 @@ Output a Markdown list of findings only — no severity, priority, or ranking.
|
|
|
62
64
|
If the content is empty, stop and say so.
|
|
63
65
|
If you have zero findings, re-check and keep thinking; do not stop with an empty list.
|
|
64
66
|
|
|
65
|
-
CONTENT:
|
|
66
|
-
{diff_output}
|
|
67
|
+
CONTENT: the unified diff at `{diff_file}`. Read that file — it is the content under review.
|
|
67
68
|
|
|
68
69
|
Do not invoke any skill, and do not spawn subagents of your own — you are the reviewer. Return your findings as text in your final message; do not route them through any findings-reporting tool the host may offer.
|
|
69
70
|
|
|
@@ -77,9 +78,9 @@ Launch a context-free subagent with this prompt:
|
|
|
77
78
|
|
|
78
79
|
Read `{skill-root}/review-prompts/edge-case-hunter.md` completely and follow it as your review instructions.
|
|
79
80
|
|
|
80
|
-
|
|
81
|
+
claims_file (leave unread until your instructions call for it): {claims_file}
|
|
81
82
|
|
|
82
|
-
{
|
|
83
|
+
Review content: the unified diff at `{diff_file}`. Read that file — it is the content under review.
|
|
83
84
|
|
|
84
85
|
Do not invoke any skill, and do not spawn subagents of your own — you are the reviewer. If the instruction file is unreadable, report that exact failure and stop. Return your findings as text in your final message; do not route them through any findings-reporting tool the host may offer.
|
|
85
86
|
|
|
@@ -93,9 +94,7 @@ Launch a context-free subagent with this prompt:
|
|
|
93
94
|
|
|
94
95
|
Read `{skill-root}/review-prompts/verification-gap.md` completely and follow it as your review instructions.
|
|
95
96
|
|
|
96
|
-
Review content:
|
|
97
|
-
|
|
98
|
-
{diff_output}
|
|
97
|
+
Review content: the unified diff at `{diff_file}`. Read that file — it is the content under review.
|
|
99
98
|
|
|
100
99
|
Do not invoke any skill, and do not spawn subagents of your own — you are the reviewer. If the instruction file is unreadable, report that exact failure and stop. Return your findings as text in your final message; do not route them through any findings-reporting tool the host may offer.
|
|
101
100
|
|
|
@@ -111,9 +110,7 @@ You are an intent-alignment auditor. You have no other context about how this ch
|
|
|
111
110
|
|
|
112
111
|
{verbatim_intent}
|
|
113
112
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
{diff_output}
|
|
113
|
+
The diff is the unified diff at `{diff_file}`. Read that file — it is the change under review.
|
|
117
114
|
|
|
118
115
|
Your task is strictly descriptive — do not prescribe additional work. Report: (1) the defensible readings of the intent, enumerated; (2) which reading this diff implements; (3) where the readings and the diff diverge — specifically, which surface the intent's expectations live at versus which surface the diff's changes and its tests exercise.
|
|
119
116
|
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Claims Check
|
|
2
|
+
|
|
3
|
+
Final pass for the Edge Case Hunter. Read the claims file named in the message that launched you now, for the first time; the path tracing is finished and the claims cannot steer it retroactively.
|
|
4
|
+
|
|
5
|
+
It is the spec the change was built from. Read only its `## Intent` and `## Tasks & Acceptance` sections — the claims live there; ignore the rest of the file. The spec is the change's own account of itself: testimony, not evidence — a claim repeated in a code comment is still the same claim, not confirmation. Extract each checkable claim — what the change does, what it preserves, ordering, arithmetic, and parity with existing code ("exactly as X does") — then try to falsify each one against the code you have already traced. Where your trace is not enough to decide, read the code that decides it: the compared-to function, the actual callee, the state the claim assumes.
|
|
6
|
+
|
|
7
|
+
Append one finding per falsified claim to the same JSON array, with the four standard fields plus:
|
|
8
|
+
|
|
9
|
+
- `kind`: `"claim"`
|
|
10
|
+
- `confidence`: `"high"`, `"medium"`, or `"low"`
|
|
11
|
+
|
|
12
|
+
For a claim finding the standard fields read as: `location` = where the code contradicts the claim; `trigger_condition` = the claim, quoted or tightly paraphrased; `guard_snippet` = what the code actually does; `potential_consequence` = what goes wrong for someone who believed the claim.
|
|
13
|
+
|
|
14
|
+
Verified claims produce nothing. Add nothing if nothing is falsified.
|
|
@@ -5,10 +5,12 @@ When a diff is provided, scan only the diff hunks and list boundaries that are d
|
|
|
5
5
|
When no diff is provided (full file or function), treat the entire provided content as the scope.
|
|
6
6
|
Ignore the rest of the codebase unless the provided content explicitly references external functions.
|
|
7
7
|
A brief secondary deletion check runs as Step 4 when the diff removes code.
|
|
8
|
+
A claims check runs as Step 5.
|
|
8
9
|
|
|
9
10
|
**Inputs:**
|
|
10
|
-
- **content** — Content to review: diff, full file, or function
|
|
11
|
+
- **content** — Content to review, or a path to read it from: diff, full file, or function
|
|
11
12
|
- **also_consider** (optional) — Areas to keep in mind during review alongside normal edge-case analysis
|
|
13
|
+
- **claims_file** — Path to the spec this change was built from. Do NOT read it before Step 5: the path tracing in Steps 2–3 must finish before the claims are seen.
|
|
12
14
|
|
|
13
15
|
**MANDATORY: Execute steps in the Execution section IN EXACT ORDER. DO NOT skip steps or change the sequence. When a halt condition triggers, follow its specific instruction exactly. Each action within a step is a REQUIRED action to complete that step.**
|
|
14
16
|
|
|
@@ -19,8 +21,8 @@ A brief secondary deletion check runs as Step 4 when the diff removes code.
|
|
|
19
21
|
|
|
20
22
|
### Step 1: Receive Content
|
|
21
23
|
|
|
22
|
-
-
|
|
23
|
-
- If content is empty, or cannot be decoded as text, return `[{"location":"N/A","trigger_condition":"Input empty or undecodable","guard_snippet":"Provide valid content to review","potential_consequence":"Review skipped — no analysis performed"}]` and stop
|
|
24
|
+
- Take the content to review from the parent message that launched you — inline, or by reading the file it points to (never from this instruction file)
|
|
25
|
+
- If no content is supplied, or it is empty, unreadable, or cannot be decoded as text, return `[{"location":"N/A","trigger_condition":"Input empty or undecodable","guard_snippet":"Provide valid content to review","potential_consequence":"Review skipped — no analysis performed"}]` and stop
|
|
24
26
|
- Identify content type (diff, full file, or function) to determine scope rules
|
|
25
27
|
|
|
26
28
|
### Step 2: Exhaustive Path Analysis
|
|
@@ -42,7 +44,11 @@ A brief secondary deletion check runs as Step 4 when the diff removes code.
|
|
|
42
44
|
|
|
43
45
|
If the diff removed or replaced meaningful code (ignore pure renames and whitespace): load `references/deletion-check.md` and follow it.
|
|
44
46
|
|
|
45
|
-
### Step 5:
|
|
47
|
+
### Step 5: Claims Check
|
|
48
|
+
|
|
49
|
+
Load `references/claims-check.md` and follow it.
|
|
50
|
+
|
|
51
|
+
### Step 6: Present Findings
|
|
46
52
|
|
|
47
53
|
Output all findings as a single JSON array following the Output Format specification exactly.
|
|
48
54
|
|
|
@@ -60,12 +66,12 @@ Return ONLY a valid JSON array of objects. Each edge-case finding contains exact
|
|
|
60
66
|
}]
|
|
61
67
|
```
|
|
62
68
|
|
|
63
|
-
No extra text, no explanations, no markdown wrapping. An empty array `[]` is valid when nothing is found. Deletion findings from Step 4, if any, go in the same array with the extra fields defined in `references/deletion-check.md`.
|
|
69
|
+
No extra text, no explanations, no markdown wrapping. An empty array `[]` is valid when nothing is found. Deletion findings from Step 4 and claim findings from Step 5, if any, go in the same array with the extra fields defined in `references/deletion-check.md` and `references/claims-check.md`.
|
|
64
70
|
|
|
65
71
|
|
|
66
72
|
## HALT CONDITIONS
|
|
67
73
|
|
|
68
|
-
- If content is empty or cannot be decoded as text, return `[{"location":"N/A","trigger_condition":"Input empty or undecodable","guard_snippet":"Provide valid content to review","potential_consequence":"Review skipped — no analysis performed"}]` and stop
|
|
74
|
+
- If no content is supplied, or it is empty, unreadable, or cannot be decoded as text, return `[{"location":"N/A","trigger_condition":"Input empty or undecodable","guard_snippet":"Provide valid content to review","potential_consequence":"Review skipped — no analysis performed"}]` and stop
|
|
69
75
|
<reference path="references/deletion-check.md">
|
|
70
76
|
# Deletion Check
|
|
71
77
|
|
|
@@ -82,7 +88,23 @@ For a deletion finding the standard fields read as: `location` = the removed ite
|
|
|
82
88
|
|
|
83
89
|
Add nothing if nothing qualifies.
|
|
84
90
|
</reference>
|
|
91
|
+
<reference path="references/claims-check.md">
|
|
92
|
+
# Claims Check
|
|
93
|
+
|
|
94
|
+
Final pass for the Edge Case Hunter. Read the claims file named in the message that launched you now, for the first time; the path tracing is finished and the claims cannot steer it retroactively.
|
|
95
|
+
|
|
96
|
+
It is the spec the change was built from. Read only its `## Intent` and `## Tasks & Acceptance` sections — the claims live there; ignore the rest of the file. The spec is the change's own account of itself: testimony, not evidence — a claim repeated in a code comment is still the same claim, not confirmation. Extract each checkable claim — what the change does, what it preserves, ordering, arithmetic, and parity with existing code ("exactly as X does") — then try to falsify each one against the code you have already traced. Where your trace is not enough to decide, read the code that decides it: the compared-to function, the actual callee, the state the claim assumes.
|
|
97
|
+
|
|
98
|
+
Append one finding per falsified claim to the same JSON array, with the four standard fields plus:
|
|
99
|
+
|
|
100
|
+
- `kind`: `"claim"`
|
|
101
|
+
- `confidence`: `"high"`, `"medium"`, or `"low"`
|
|
102
|
+
|
|
103
|
+
For a claim finding the standard fields read as: `location` = where the code contradicts the claim; `trigger_condition` = the claim, quoted or tightly paraphrased; `guard_snippet` = what the code actually does; `potential_consequence` = what goes wrong for someone who believed the claim.
|
|
104
|
+
|
|
105
|
+
Verified claims produce nothing. Add nothing if nothing is falsified.
|
|
106
|
+
</reference>
|
|
85
107
|
|
|
86
108
|
## CONTENT SOURCE
|
|
87
109
|
|
|
88
|
-
|
|
110
|
+
"Review content:" in the message that launched you gives the content itself or a path to read it from. Read the file when it is a path; either way that is the content under review, and this instruction file never is.
|
|
@@ -110,4 +110,4 @@ When you find no verification gaps and no other findings, output exactly this si
|
|
|
110
110
|
|
|
111
111
|
## CONTENT SOURCE
|
|
112
112
|
|
|
113
|
-
|
|
113
|
+
"Review content:" in the message that launched you gives the content itself or a path to read it from. Read the file when it is a path; either way that is the content under review, and this instruction file never is. If no content is supplied, or the file it points to is missing, empty, or unreadable, say exactly that and stop — never report a clean review for content you could not read.
|
|
@@ -33,7 +33,11 @@ Invoke the subagent **synchronously** and wait for it to return in this same tur
|
|
|
33
33
|
|
|
34
34
|
### Verify
|
|
35
35
|
|
|
36
|
-
After the implementation subagent returns: if it reported unfinished work, finish it before proceeding.
|
|
36
|
+
After the implementation subagent returns: if it reported unfinished work, finish it before proceeding.
|
|
37
|
+
|
|
38
|
+
Stage the diff and read it: using the repository's version-control tooling, write a unified diff of all changes since `{baseline_revision}` (from `{spec_file}` frontmatter) — untracked files included — to a uniquely-named file in the system temp directory, set `{diff_file}` to its absolute path, and read that file into your own context. Judge against the diff, not against the implementation subagent's report.
|
|
39
|
+
|
|
40
|
+
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`, blocking condition `implementation verification failed`, and include the failing command or check and reason. When fixing a failure changes code, rewrite `{diff_file}` and re-read it. Acceptance criteria are judged at review, not here.
|
|
37
41
|
|
|
38
42
|
### Matrix Test Audit
|
|
39
43
|
|
|
@@ -10,17 +10,19 @@
|
|
|
10
10
|
|
|
11
11
|
Change `{spec_file}` status to `in-review` in the frontmatter before continuing.
|
|
12
12
|
|
|
13
|
-
###
|
|
13
|
+
### Stage the Diff
|
|
14
14
|
|
|
15
|
-
Read `{baseline_revision}` from `{spec_file}` frontmatter. If `{baseline_revision}` is missing or `NO_VCS`, use best effort to determine what changed. Otherwise
|
|
15
|
+
Read `{baseline_revision}` from `{spec_file}` frontmatter. If `{baseline_revision}` is missing or `NO_VCS`, use best effort to determine what changed. Otherwise use the repository's version-control tooling to rewrite `{diff_file}` — the temp file staged in step-03, or a uniquely-named file in the system temp directory when this run has none — with a unified diff of all changes since `{baseline_revision}`, untracked files included. The review layers read that file; the diff text is never pasted into their prompts.
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
Set `{claims_file}` = `{spec_file}`. The spec is the change's own account of itself, and it goes to the edge-case layer alone — as a path, so that layer reads it only after its own tracing and the other layers never see it at all.
|
|
18
|
+
|
|
19
|
+
Writing `{diff_file}` is the only change this section makes. Do NOT `git add` anything.
|
|
18
20
|
|
|
19
21
|
### Review
|
|
20
22
|
|
|
21
|
-
Runtime placeholders: `{
|
|
23
|
+
Runtime placeholders: `{diff_file}` is the diff staged above and `{claims_file}` the narrative staged with it — both paths, substituted absolute so a layer can read them; a launch prompt never carries diff text. `{verbatim_intent}` is the invocation intent exactly as this run received it at step-01; if the run started from an existing spec file rather than a fresh intent, it is the spec's `<intent-contract>` block instead. Before launching a layer, expand its skill-root placeholder to this skill's absolute installed directory; never leave that placeholder unresolved in a child prompt.
|
|
22
24
|
|
|
23
|
-
Announce skipped layers first, then launch every active layer before handling any layer's result. Try running all active layers simultaneously: substitute the runtime placeholders (e.g. `{
|
|
25
|
+
Announce skipped layers first, then launch every active layer before handling any layer's result. Try running all active layers simultaneously: substitute the runtime placeholders (e.g. `{diff_file}`) into each layer's instruction. When an instruction launches a reviewer subagent, launch that child with the prompt text after placeholder substitution; do not load the reviewer instruction file yourself. For any other customized instruction, execute it as written. Parallel means several blocking calls awaited together in this turn — never backgrounded or detached, never ending the turn to await results (see workflow.md → Subagents). Spawn every reviewer subagent before reading or reacting to any of their output; begin collection and triage only once all are launched.
|
|
24
26
|
|
|
25
27
|
{workflow.review_layers}
|
|
26
28
|
|
|
@@ -12,7 +12,7 @@ story_key: '' # set at runtime when discovered from sprint status
|
|
|
12
12
|
|
|
13
13
|
- YOU MUST ALWAYS SPEAK OUTPUT in your Agent communication style with the config `{communication_language}`
|
|
14
14
|
- The prompt that triggered this workflow IS the intent — not a hint.
|
|
15
|
-
- Writing `{diff_file}` and
|
|
15
|
+
- Writing `{diff_file}` and the claims file is the only change this step may make. Otherwise it is read-only.
|
|
16
16
|
|
|
17
17
|
## INSTRUCTIONS
|
|
18
18
|
|
|
@@ -58,7 +58,7 @@ story_key: '' # set at runtime when discovered from sprint status
|
|
|
58
58
|
- **Specific commit range** (ask for the range)
|
|
59
59
|
- **Provided diff or file list** (user pastes or provides a path)
|
|
60
60
|
|
|
61
|
-
3. Write the diff for the chosen source to `{diff_file}`
|
|
61
|
+
3. Write the diff for the chosen source to `{diff_file}` — a uniquely-named file in the system temp directory, so concurrent reviews cannot collide. The review layers read that file; the diff text is never pasted into their prompts.
|
|
62
62
|
- For **staged changes only**: run `git diff --cached > {diff_file}`.
|
|
63
63
|
- For **uncommitted changes** (staged + unstaged): run `git diff HEAD > {diff_file}`.
|
|
64
64
|
- For **branch diff**: verify the base branch exists, then run `git diff <base-branch>...HEAD > {diff_file}`. If it does not exist, HALT and ask the user for a valid branch.
|
|
@@ -68,7 +68,7 @@ story_key: '' # set at runtime when discovered from sprint status
|
|
|
68
68
|
- After writing `{diff_file}`, verify it is non-empty regardless of source type. If empty, HALT and tell the user there is nothing to review.
|
|
69
69
|
- Read `{diff_file}` yourself whenever you need the diff for your own context — triage and presentation later in this workflow.
|
|
70
70
|
|
|
71
|
-
4. **Stage the claims file.** Collect the change's own narrative: for a branch diff or commit range, the commit messages it covers (`git log <base>..<head>`); for other sources, whatever description of the change the user or conversation supplied. Write it verbatim to a file in the system temp directory and set `{claims_file}` to its path. If there is no narrative, set `{claims_file}` = `''`. Do not analyze or summarize the narrative — it is input for one review layer, staged as a file precisely so the other layers never see it.
|
|
71
|
+
4. **Stage the claims file.** Collect the change's own narrative: for a branch diff or commit range, the commit messages it covers (`git log <base>..<head>`); for other sources, whatever description of the change the user or conversation supplied. Write it verbatim to a uniquely-named file in the system temp directory and set `{claims_file}` to its path. If there is no narrative, set `{claims_file}` = `''`. Do not analyze or summarize the narrative — it is input for one review layer, staged as a file precisely so the other layers never see it.
|
|
72
72
|
|
|
73
73
|
5. **Set the spec context.**
|
|
74
74
|
- If the triggering request or recent conversation **explicitly** states there is no spec (e.g. "no spec", "without a spec", "no-spec"): set `{review_mode}` = `"no-spec"` and clear `{spec_file}` (set it to `''`). Do **not** ask for a spec. Do **not** infer no-spec mode merely because the invocation omitted a spec path.
|
package/src/bmm-skills/ship/bmad-retrospective/scripts/__pycache__/sprint_status.cpython-311.pyc
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -14,6 +14,7 @@ The lens set is whatever `{workflow.lenses}` resolves to, not a fixed list — o
|
|
|
14
14
|
- **content** — what to review: a diff, branch, uncommitted changes, file, spec, story, or any document. Args: `[path]`.
|
|
15
15
|
- **lenses** (optional) — one or more lens codes or names, however the caller expresses them: a spoken request, or a directive of the form `skill:bmad-review lenses=<code>[,<code>...]` (the form bmm's `doc_standards` uses). Default: every applicable lens (a full review).
|
|
16
16
|
- **also_consider** (optional) — areas to keep in mind alongside each lens's normal analysis.
|
|
17
|
+
- **claims** (optional) — the change's own narrative: the commit messages it covers, or whatever description of it the caller supplied. Goes to the edge-case lens alone.
|
|
17
18
|
- **pre-resolved customization** (optional) — `[workflow]` field values supplied by a forwarding caller. See Execution step 1.
|
|
18
19
|
|
|
19
20
|
## Conventions
|
|
@@ -25,10 +26,10 @@ The lens set is whatever `{workflow.lenses}` resolves to, not a fixed list — o
|
|
|
25
26
|
## Execution
|
|
26
27
|
|
|
27
28
|
1. **Resolve customization:** `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow`. On failure, read `{skill-root}/customize.toml` directly and use defaults. **Forwarded activation:** if a caller invoked you with pre-resolved customization fields (e.g. the `bmad-editorial-review` shim), honor them verbatim for those named fields — they already carry the user's overrides — and resolve only the remaining fields from your own `customize.toml`. Then execute each `{workflow.activation_steps_prepend}` entry in order, hold `{workflow.persistent_facts}` as standing context for the session, and treat `{workflow.review_guidance}` entries as standing review directives for every lens.
|
|
28
|
-
2. **Load the content.**
|
|
29
|
+
2. **Load the content.** Stage it once as a file: when the content is a branch, uncommitted work, or a commit range, use the repository's version-control tooling to write the unified diff to a uniquely-named file in the system temp directory and take that file's absolute path as the content. A branch means its diff against the merge base with its base branch; uncommitted work includes untracked files. Stage `claims` to its own file the same way — it is input for one lens, staged separately precisely so the other lenses never see it. If the content is empty or cannot be decoded as text: when the caller expects the raw findings JSON array (e.g. the legacy edge-case forwarder), return `[{"location":"N/A","trigger_condition":"Input empty or undecodable","guard_snippet":"Provide valid content to review","potential_consequence":"Review skipped — no analysis performed"}]` (no `lens` field) and stop; otherwise say what's wrong and ask for reviewable content. Classify the content — diff, source file, function, or document — and whether it is **code** or **docs**; scope rules and lens applicability both depend on it. A document that defines behavior (spec, requirements, plan, story) is `docs` that a behavioral lens may still apply to; judge by `when`.
|
|
29
30
|
3. **Select lenses** from `{workflow.lenses}`. A lens with an empty `instruction` is disabled. If the user or caller named lenses, run exactly those only — `applies_to` and `when` do not filter an explicit request. Otherwise run every enabled lens whose `applies_to` covers the content class (`any` always covers) and whose `when` applies.
|
|
30
31
|
4. **Announce the plan** in one line before running anything: the content class, the lenses about to run, and — when any lens has `after` set — that it runs on top of the named lens's findings. Skip the announcement entirely when the caller pinned an exact output contract (the legacy forwarders that demand raw JSON or one exact line) — their contract covers everything you emit, not just the findings block. Then execute each `{workflow.activation_steps_append}` entry in order.
|
|
31
|
-
5. **Run the independent lenses** — every selected lens without `after`. Each sees the content and `also_consider`, never another lens's findings. Follow each lens's `instruction`; the shipped lenses load their reference file just-in-time, so load only what runs. When subagents are available, launch every independent lens before handling any lens's result. Try running them simultaneously: spawn one per lens; give it the lens `instruction` with `{skill-root}` and paths resolved absolute, the content
|
|
32
|
+
5. **Run the independent lenses** — every selected lens without `after`. Each sees the content and `also_consider`, never another lens's findings. Follow each lens's `instruction`; the shipped lenses load their reference file just-in-time, so load only what runs. When subagents are available, launch every independent lens before handling any lens's result. Try running them simultaneously: spawn one per lens; give it the lens `instruction` with `{skill-root}` and paths resolved absolute, the absolute path of the staged content file (a lens prompt carries the path and the lens reads the file, never the content bytes; inline the content only when it was never staged as a file), any `also_consider` areas, the standing review directives, the `claims` path to the edge-case lens alone (marked to leave unread until its instructions call for it), and the constraint "Return ONLY your findings — no other output. Do not invoke any skill, and do not spawn subagents of your own — you are the reviewer. Return your findings as text in your final message; do not route them through any findings-reporting tool the host may offer." Otherwise run the lenses sequentially yourself, completing one before starting the next.
|
|
32
33
|
6. **Run the dependent lenses** — every selected lens with `after`, once the lens it names has completed, passing that lens's findings in. A lens whose `after` target was not selected or produced nothing still runs, with no prior findings. Dependent lenses that name different targets are independent of each other: launch every ready one before handling any of their results. Try running them simultaneously. When subagents are available, spawn them with the same constraint as independent lenses: "Return ONLY your findings — no other output. Do not invoke any skill, and do not spawn subagents of your own — you are the reviewer. Return your findings as text in your final message; do not route them through any findings-reporting tool the host may offer."
|
|
33
34
|
7. **Assemble and present** per Output below. Keep every lens's findings — overlap between lenses is signal, not duplication; note it in the markdown report rather than deduping. Execute `{workflow.on_complete}` if set.
|
|
34
35
|
|
|
@@ -9,6 +9,7 @@ You are a pure path tracer. Never comment on whether the content is good or bad;
|
|
|
9
9
|
- When the content is a diff, scan only the diff hunks and list boundaries that are directly reachable from the changed lines and lack an explicit guard in the diff.
|
|
10
10
|
- When it is not a diff (full file, function, or document), the entire provided content is the scope.
|
|
11
11
|
- Ignore the rest of the codebase unless the provided content explicitly references external functions.
|
|
12
|
+
- When the launch message names a claims file, do NOT read it before Step 4: the path tracing in Steps 1–2 must finish before the narrative is seen.
|
|
12
13
|
|
|
13
14
|
## Step 1: Exhaustive path analysis
|
|
14
15
|
|
|
@@ -38,6 +39,21 @@ Deletion findings go in the same array with the four standard fields plus:
|
|
|
38
39
|
|
|
39
40
|
For a deletion finding the standard fields read as: `location` = the removed item; `trigger_condition` = the behavior or contract it enforced; `guard_snippet` = where or how to re-establish it; `potential_consequence` = the regression or orphan.
|
|
40
41
|
|
|
42
|
+
## Step 4: Claims check
|
|
43
|
+
|
|
44
|
+
Runs only when the message that launched you named a claims file. Read that file now, for the first time; the path tracing is finished and the claims cannot steer it retroactively.
|
|
45
|
+
|
|
46
|
+
The file holds the change's own narrative — commit messages and any stated description. The narrative is the author's testimony, not evidence: a claim repeated in a code comment is still the same claim, not confirmation. Extract each checkable claim — what the change does, what it preserves, ordering, arithmetic, and parity with existing code ("exactly as X does") — then try to falsify each one against the code you have already traced. Where your trace is not enough to decide, read the code that decides it: the compared-to function, the actual callee, the state the claim assumes.
|
|
47
|
+
|
|
48
|
+
Claim findings go in the same array with the four standard fields plus:
|
|
49
|
+
|
|
50
|
+
- `kind`: `"claim"`
|
|
51
|
+
- `confidence`: `"high"`, `"medium"`, or `"low"`
|
|
52
|
+
|
|
53
|
+
For a claim finding the standard fields read as: `location` = where the code contradicts the claim; `trigger_condition` = the claim, quoted or tightly paraphrased; `guard_snippet` = what the code actually does; `potential_consequence` = what goes wrong for someone who believed the claim.
|
|
54
|
+
|
|
55
|
+
Verified claims produce nothing. Add nothing if nothing is falsified.
|
|
56
|
+
|
|
41
57
|
## Findings shape
|
|
42
58
|
|
|
43
59
|
Each edge-case finding contains exactly these four fields:
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|