src/bmm-skills/ship/bmad-build-auto/step-04-review.md
{{.communication_language}}, tailored to {{.user_skill_level}}. Write files in {{.document_output_language}}.Change {spec_file} status to in-review in the frontmatter before continuing.
Read {baseline_revision} from {spec_file} frontmatter. If {baseline_revision} is missing or NO_VCS, use best effort to determine what changed. Otherwise, construct {diff_output} covering all changes — tracked and untracked — since {baseline_revision}.
Do NOT git add anything — this is read-only inspection.
Runtime placeholders: {diff_output} is the diff constructed above. {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.
Execute these review layers in parallel wherever their execution methods allow: substitute the runtime placeholders (e.g. {diff_output}) 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.
{workflow.review_layers}
low: none or cosmeticmedium: tolerablehigh: intolerable## Review Triage Log section in {spec_file}, in this format:
### {date} — Review pass
- intent_gap: count
- bad_spec: count
- patch: count
- defer: count
- reject: count
- addressed_findings:
- `[high|medium|low]` `[patch|bad_spec]` <finding summary and action taken in this pass>
{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).
If no patch was fixed and no bad_spec repair loopback was triggered in this pass, write:
- addressed_findings:
- none
{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 with addressed_findings: none, then HALT with status blocked and blocking condition review repair loop exceeded 5 iterations (non-convergence).
<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 with addressed_findings: none, then HALT with status blocked, blocking condition intent gap, and include the unresolved questions and the saved patch path.<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, listing every bad_spec finding that triggered the spec amendment and implementation loopback under addressed_findings. Read fully and follow [[bmad-snapshot:step-03-implement.md]] to re-derive the code, then this step will run again.{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, listing every patch fixed in this pass under addressed_findings.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:
deferred:
- summary: >-
<one sentence>
evidence: |-
<why this is real>
location: >- # optional — file:line or component
src/foo.py:42
severity: medium # optional — high | medium | low
deferred is one list containing every prior item plus the new items with their intended text. Repair serialization errors before continuing.Write the following details to {spec_file} under ## Auto Run Result:
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.Set {spec_file} frontmatter followup_review_recommended from the computation above.
If version control is unavailable, set {spec_file} frontmatter status: done, then proceed to HALT.
If version control is available, write status: done into {spec_file} frontmatter, then:
{spec_file} when it is tracked in that working copy. Keep commits already created during this run. Verify every reviewed-diff file appears in the change set after {baseline_revision} and none remains uncommitted. Do not push.blocked and blocking condition finalization left repository dirty.HALT with status done.