src/bmm-skills/2-plan-workflows/bmad-prd/references/validate.md
The Validate intent playbook. Standalone — this intent critiques an existing PRD without changing it and ends after the user has seen the report; it does not run Finalize. The synthesis pipeline below is also reused for mid-session report requests during Create/Update.
Source-extract against .decision-log.md, any original inputs, and the PRD/addendum themselves. Delegate to subagents per PRD Discipline → "Extract, don't ingest" (in SKILL.md); the parent assembles from extracts.
Run the Reviewer Gate (see SKILL.md) against prd.md (and addendum.md if present). The rubric walker is the default entry in the gate menu; under Validate intent it additionally runs the synthesis pipeline below. The Finalize discipline pass during Create/Update does NOT render a report — findings stay in-conversation.
The rubric walker is the primary review entry. Spawn it as a subagent with this prompt:
You are validating a PRD against the quality rubric at
{workflow.validation_checklist_template}. Read the full rubric first, then readprd.md(andaddendum.mdif present). Form a judgment per dimension — strong / adequate / thin / broken — and write findings only where they add information. Cite specific PRD locations and quote phrases. Severity ranks impact on the PRD's usefulness, not how easy the fix is. Write your review to{doc_workspace}/review-rubric.mdin the format the rubric specifies. Return ONLY a compact summary (overall verdict, dimension verdicts, finding counts by severity, file path).
The Reviewer Gate may also dispatch additional reviewers from {workflow.finalize_reviewers} (adversarial-general by default) and any ad-hoc reviewers the parent judges warranted. Each writes its review to {doc_workspace}/review-{slug}.md and returns a compact summary. Run in parallel.
Once every selected reviewer has returned, the parent synthesizes one consolidated report. Do not skip this step under Validate intent — it produces the persistent artifact the user opens.
{doc_workspace}/review-rubric.md — primary, structured by the seven dimensions{doc_workspace}/review-{slug}.md files — extra reviewers (adversarial, etc.){workflow.validation_report_template} — the HTML skeleton{doc_workspace}/review-*.md.grade-excellent | grade-good | grade-fair | grade-poor class.<section class="dimension"> per assessed dimension, in rubric order. <details open> for thin and broken; closed for strong and adequate. Each contains the dimension judgment (the prose from review-rubric.md) and the findings list.<section class="reviewer-section"> per extra reviewer that ran. The source file path goes in the <span class="reviewer-source">. Closed by default. Adversarial findings keep their adversarial voice — do not soften.{doc_workspace}/validation-report.html.{doc_workspace}/validation-report.md (same content, grouped by severity rather than by dimension — see format below; this is the canonical form for downstream re-reading).python3 -c "import webbrowser, pathlib; webbrowser.open(pathlib.Path('{doc_workspace}/validation-report.html').resolve().as_uri())"
references/headless.md).# Validation Report — {prd_name}
- **PRD:** `{prd_path}`
- **Rubric:** `{rubric_path}`
- **Run at:** {ISO timestamp}
- **Grade:** {Excellent | Good | Fair | Poor}
## Overall verdict
{synthesis paragraphs}
## Dimension verdicts
- Decision-readiness — {verdict}
- Substance over theater — {verdict}
- (etc. for each assessed dimension)
## Findings by severity
### Critical (n)
**[Dimension or Reviewer]** — Title (§ location)
{Note}
Fix: {suggested fix}
### High (n)
...
### Medium (n)
...
### Low (n)
...
## Mechanical notes
- {bullet}
## Reviewer files
- `review-rubric.md`
- `review-adversarial-general.md` (if present)
- (etc.)
Re-running validation overwrites the consolidated report in place. The individual review-*.md files are preserved so the user can drill in.
Surface artifact paths; the rendered HTML/markdown is the persistent artifact. Always offer to roll findings into an Update.