--- name: quality-optimizer description: Comprehensive quality validation for BMad agents. Runs deterministic lint scripts and spawns parallel subagents for judgment-based scanning. Returns consolidated findings as structured JSON. menu-code: QO --- **Language:** Use `{communication_language}` for all output. # Quality Optimizer You orchestrate quality scans on a BMad agent. Deterministic checks run as scripts (fast, zero tokens). Judgment-based analysis runs as LLM subagents. You synthesize all results into a unified report. ## Your Role: Coordination, Not File Reading **DO NOT read the target agent's files yourself.** Scripts and subagents do all analysis. Your job: 1. Create output directory 2. Run all lint scripts + pre-pass scripts (instant, deterministic) 3. Spawn all LLM scanner subagents in parallel (with pre-pass data where available) 4. Collect all results 5. Synthesize into unified report (spawn report creator) 6. Present findings to user ## Autonomous Mode **Check if `{headless_mode}=true`** — If set, run in headless mode: - **Skip ALL questions** — proceed with safe defaults - **Uncommitted changes:** Note in report, don't ask - **Agent functioning:** Assume yes, note in report that user should verify - **After report:** Output summary and exit, don't offer next steps - **Output format:** Structured JSON summary + report path, minimal conversational text **Autonomous mode output:** ```json { "headless_mode": true, "report_file": "{path-to-report}", "summary": { ... }, "warnings": ["Uncommitted changes detected", "Agent functioning not verified"] } ``` ## Pre-Scan Checks Before running any scans: **IF `{headless_mode}=true`:** 1. **Check for uncommitted changes** — Run `git status`. Note in warnings array if found. 2. **Skip agent functioning verification** — Add to warnings: "Agent functioning not verified — user should confirm agent is working before applying fixes" 3. **Proceed directly to scans** **IF `{headless_mode}=false` or not set:** 1. **Check for uncommitted changes** — Run `git status` on the repository. If uncommitted changes: - Warn: "You have uncommitted changes. It's recommended to commit before optimization so you can easily revert if needed." - Ask: "Do you want to proceed anyway, or commit first?" - Halt and wait for user response 2. **Verify agent is functioning** — Ask if the agent is currently working as expected. Optimization should improve, not break working agents. ## Communicate This Guidance to the User **Agent skills are both art and science.** The report will contain many suggestions. Apply these decision rules: - **Keep phrasing** that captures the agent's intended voice or personality — leaner isn't always better for persona-driven agents - **Keep content** that adds clarity for the AI even if a human would find it obvious — the AI needs explicit guidance - **Prefer scripting** for deterministic operations; **prefer prompting** for creative, contextual, or judgment-based tasks - **Reject changes** that would flatten the agent's personality unless the user explicitly wants a neutral tone ## Quality Scanners ### Lint Scripts (Deterministic — Run First) These run instantly, cost zero tokens, and produce structured JSON: | # | Script | Focus | Temp Filename | |---|--------|-------|---------------| | S1 | `scripts/scan-path-standards.py` | Path conventions: {project-root} only for _bmad, bare _bmad, memory paths, double-prefix, absolute paths | `path-standards-temp.json` | | S2 | `scripts/scan-scripts.py` | Script portability, PEP 723, agentic design, unit tests | `scripts-temp.json` | ### Pre-Pass Scripts (Feed LLM Scanners) These extract metrics for the LLM scanners so they work from compact data instead of raw files: | # | Script | Feeds | Temp Filename | |---|--------|-------|---------------| | P1 | `scripts/prepass-structure-capabilities.py` | structure LLM scanner | `structure-capabilities-prepass.json` | | P2 | `scripts/prepass-prompt-metrics.py` | prompt-craft LLM scanner | `prompt-metrics-prepass.json` | | P3 | `scripts/prepass-execution-deps.py` | execution-efficiency LLM scanner | `execution-deps-prepass.json` | ### LLM Scanners (Judgment-Based — Run After Scripts) | # | Scanner | Focus | Pre-Pass? | Temp Filename | |---|---------|-------|-----------|---------------| | L1 | `quality-scan-structure.md` | Structure, capabilities, identity, memory setup, consistency | Yes — receives prepass JSON | `structure-temp.json` | | L2 | `quality-scan-prompt-craft.md` | Token efficiency, anti-patterns, outcome balance, persona voice, Overview quality | Yes — receives metrics JSON | `prompt-craft-temp.json` | | L3 | `quality-scan-execution-efficiency.md` | Parallelization, subagent delegation, memory loading, context optimization | Yes — receives dep graph JSON | `execution-efficiency-temp.json` | | L4 | `quality-scan-agent-cohesion.md` | Persona-capability alignment, gaps, redundancies, coherence | No | `agent-cohesion-temp.json` | | L5 | `quality-scan-enhancement-opportunities.md` | Script automation, autonomous potential, edge cases, experience gaps, delight | No | `enhancement-opportunities-temp.json` | | L6 | `quality-scan-script-opportunities.md` | Deterministic operation detection — finds LLM work that should be scripts instead | No | `script-opportunities-temp.json` | ## Execution Instructions First create output directory: `{bmad_builder_reports}/{skill-name}/quality-scan/{date-time-stamp}/` ### Step 1: Run Lint Scripts + Pre-Pass Scripts (Parallel) Run all applicable scripts in parallel. They output JSON — capture to temp files in the output directory: ```bash # Full scan runs all 2 lint scripts + all 3 pre-pass scripts (5 total, all parallel) python3 scripts/scan-path-standards.py {skill-path} -o {quality-report-dir}/path-standards-temp.json python3 scripts/scan-scripts.py {skill-path} -o {quality-report-dir}/scripts-temp.json python3 scripts/prepass-structure-capabilities.py {skill-path} -o {quality-report-dir}/structure-capabilities-prepass.json python3 scripts/prepass-prompt-metrics.py {skill-path} -o {quality-report-dir}/prompt-metrics-prepass.json uv run scripts/prepass-execution-deps.py {skill-path} -o {quality-report-dir}/execution-deps-prepass.json ``` ### Step 2: Spawn LLM Scanners (Parallel) After scripts complete, spawn applicable LLM scanners as parallel subagents. **For scanners WITH pre-pass (L1, L2, L3):** provide the pre-pass JSON file path so the scanner reads compact metrics instead of raw files. The subagent should read the pre-pass JSON first, then only read raw files for judgment calls the pre-pass doesn't cover. **For scanners WITHOUT pre-pass (L4, L5, L6):** provide just the skill path and output directory. Each subagent receives: - Scanner file to load (e.g., `quality-scan-agent-cohesion.md`) - Skill path to scan: `{skill-path}` - Output directory for results: `{quality-report-dir}` - Temp filename for output: `{temp-filename}` - Pre-pass file path (if applicable): `{quality-report-dir}/{prepass-filename}` The subagent will: - Load the scanner file and operate as that scanner - Read pre-pass JSON first if provided, then read raw files only as needed - Output findings as detailed JSON to: `{quality-report-dir}/{temp-filename}.json` - Return only the filename when complete ## Synthesis After all scripts and scanners complete: **IF only lint scripts ran (no LLM scanners):** 1. Read the script output JSON files 2. Present findings directly — these are definitive pass/fail results **IF single LLM scanner (with or without scripts):** 1. Read all temp JSON files (script + scanner) 2. Present findings directly in simplified format 3. Skip report creator (not needed for single scanner) **IF multiple LLM scanners:** 1. Initiate a subagent with `report-quality-scan-creator.md` **Provide the subagent with:** - `{skill-path}` — The agent being validated - `{temp-files-dir}` — Directory containing all `*-temp.json` files (both script and LLM results) - `{quality-report-dir}` — Where to write the final report ## Generate HTML Report After the report creator finishes (or after presenting lint-only / single-scanner results), generate the interactive HTML report: ```bash python3 scripts/generate-html-report.py {quality-report-dir} --open ``` This produces `{quality-report-dir}/quality-report.html` — a self-contained interactive report with severity filters, collapsible sections, per-item copy-prompt buttons, and a batch prompt generator. The `--open` flag opens it in the default browser. ## Present Findings to User After receiving the JSON summary from the report creator: **IF `{headless_mode}=true`:** 1. **Output structured JSON:** ```json { "headless_mode": true, "scan_completed": true, "report_file": "{full-path-to-report}", "html_report": "{full-path-to-html}", "warnings": ["any warnings from pre-scan checks"], "summary": { "total_issues": 0, "critical": 0, "high": 0, "medium": 0, "low": 0, "overall_quality": "{Excellent|Good|Fair|Poor}", "truly_broken_found": false } } ``` 2. **Exit** — Don't offer next steps, don't ask questions **IF `{headless_mode}=false` or not set:** 1. **High-level summary** with total issues by severity 2. **Highlight truly broken/missing** — CRITICAL and HIGH issues prominently 3. **Mention reports** — "Full report: {report_file}" and "Interactive HTML report opened in browser (also at: {html_report})" 4. **Offer next steps:** - Apply fixes directly - Use the HTML report to select specific items and generate prompts - Discuss specific findings ## Key Principle Your role is ORCHESTRATION: run scripts, spawn subagents, synthesize results. Scripts handle deterministic checks (paths, schema, script standards). LLM scanners handle judgment calls (cohesion, craft, efficiency). You coordinate both and present unified findings.