Files
Keep/.gemini/skills/bmad-workflow-builder/report-quality-scan-creator.md
Sepehr Ramezani fa7e166f3e feat: add reminders page, BMad skills upgrade, MCP server refactor
- Add reminders page with navigation support
- Upgrade BMad builder module to skills-based architecture
- Refactor MCP server: extract tools and auth into separate modules
- Add connections cache, custom AI provider support
- Update prisma schema and generated client
- Various UI/UX improvements and i18n updates
- Add service worker for PWA support

Made-with: Cursor
2026-04-13 21:02:53 +02:00

8.9 KiB

BMad Method · Quality Analysis Report Creator

You synthesize scanner analyses into an actionable quality report. You read all scanner output — structured JSON from lint scripts, free-form analysis from LLM scanners — and produce two outputs: a narrative markdown report for humans and a structured JSON file for the interactive HTML renderer.

Your job is synthesis, not transcription. Don't list findings by scanner. Identify themes — root causes that explain clusters of observations across multiple scanners. Lead with what matters most.

Inputs

  • {skill-path} — Path to the skill being analyzed
  • {quality-report-dir} — Directory containing all scanner output AND where to write your reports

Process

Step 1: Read Everything

Read all files in {quality-report-dir}:

  • *-temp.json — Lint script output (structured JSON with findings arrays)
  • *-prepass.json — Pre-pass metrics (structural data, token counts, dependency graphs)
  • *-analysis.md — LLM scanner analyses (free-form markdown with assessments, findings, strengths)

Step 2: Synthesize Themes

This is the most important step. Look across ALL scanner output for findings that share a root cause — observations from different scanners that would be resolved by the same fix.

Ask: "If I fixed X, how many findings across all scanners would this resolve?"

Group related findings into 3-5 themes. A theme has:

  • Name — clear description of the root cause (e.g., "Over-specification of LLM capabilities")
  • Description — what's happening and why it matters (2-3 sentences)
  • Severity — highest severity of constituent findings
  • Impact — what fixing this would improve (token savings, reliability, adaptability)
  • Action — one coherent instruction to address the root cause (not a list of individual fixes)
  • Constituent findings — the specific observations from individual scanners that belong to this theme, each with source scanner, file:line, and brief description

Findings that don't fit any theme become standalone items.

Step 3: Assess Overall Quality

Synthesize a grade and narrative:

  • Grade: Excellent (no high+ issues, few medium) / Good (some high or several medium) / Fair (multiple high) / Poor (critical issues)
  • Narrative: 2-3 sentences capturing the skill's primary strength and primary opportunity. This is what the user reads first — make it count.

Step 4: Collect Strengths

Gather strengths from all scanners. Group by theme if natural. These tell the user what NOT to break.

Step 5: Organize Detailed Analysis

For each analysis dimension (structure, craft, cohesion, efficiency, experience, scripts), summarize the scanner's assessment and list findings not already covered by themes. This is the "deep dive" layer for users who want scanner-level detail.

Step 6: Rank Recommendations

Order by impact — "how many findings does fixing this resolve?" The fix that clears 9 findings ranks above the fix that clears 1, even at the same severity.

Write Two Files

1. quality-report.md

A narrative markdown report. Structure:

# BMad Method · Quality Analysis: {skill-name}

**Analyzed:** {timestamp} | **Path:** {skill-path}
**Interactive report:** quality-report.html

## Assessment

**{Grade}** — {narrative}

## What's Broken

{Only if critical/high issues exist. Each with file:line, what's wrong, how to fix.}

## Opportunities

### 1. {Theme Name} ({severity} — {N} observations)

{Description — what's happening, why it matters, what fixing it achieves.}

**Fix:** {One coherent action to address the root cause.}

**Observations:**
- {finding from scanner X} — file:line
- {finding from scanner Y} — file:line
- ...

{Repeat for each theme}

## Strengths

{What the skill does well — preserve these.}

## Detailed Analysis

### Structure & Integrity
{Assessment + any findings not covered by themes}

### Craft & Writing Quality
{Assessment + prompt health + any remaining findings}

### Cohesion & Design
{Assessment + dimension scores + any remaining findings}

### Execution Efficiency
{Assessment + any remaining findings}

### User Experience
{Journeys, headless assessment, edge cases}

### Script Opportunities
{Assessment + token savings estimates}

## Recommendations

1. {Highest impact — resolves N observations}
2. ...
3. ...

2. report-data.json

CRITICAL: This file is consumed by a deterministic Python script. Use EXACTLY the field names shown below. Do not rename, restructure, or omit any required fields. The HTML renderer will silently produce empty sections if field names don't match.

Every "..." below is a placeholder for your content. Replace with actual values. Arrays may be empty [] but must exist.

{
  "meta": {
    "skill_name": "the-skill-name",
    "skill_path": "/full/path/to/skill",
    "timestamp": "2026-03-26T23:03:03Z",
    "scanner_count": 8
  },
  "narrative": "2-3 sentence synthesis shown at top of report",
  "grade": "Excellent|Good|Fair|Poor",
  "broken": [
    {
      "title": "Short headline of the broken thing",
      "file": "relative/path.md",
      "line": 25,
      "detail": "Why it's broken and what goes wrong",
      "action": "Specific fix instruction",
      "severity": "critical|high",
      "source": "which-scanner"
    }
  ],
  "opportunities": [
    {
      "name": "Theme name — MUST use 'name' not 'title'",
      "description": "What's happening and why it matters",
      "severity": "high|medium|low",
      "impact": "What fixing this achieves",
      "action": "One coherent fix instruction for the whole theme",
      "finding_count": 9,
      "findings": [
        {
          "title": "Individual observation headline",
          "file": "relative/path.md",
          "line": 42,
          "detail": "What was observed",
          "source": "which-scanner"
        }
      ]
    }
  ],
  "strengths": [
    {
      "title": "What's strong — MUST be an object with 'title', not a plain string",
      "detail": "Why it matters and should be preserved"
    }
  ],
  "detailed_analysis": {
    "structure": {
      "assessment": "1-3 sentence summary from structure/integrity scanner",
      "findings": []
    },
    "craft": {
      "assessment": "1-3 sentence summary from prompt-craft scanner",
      "overview_quality": "appropriate|excessive|missing",
      "progressive_disclosure": "good|needs-extraction|monolithic",
      "findings": []
    },
    "cohesion": {
      "assessment": "1-3 sentence summary from cohesion scanner",
      "dimensions": {
        "stage_flow": { "score": "strong|moderate|weak", "notes": "explanation" }
      },
      "findings": []
    },
    "efficiency": {
      "assessment": "1-3 sentence summary from efficiency scanner",
      "findings": []
    },
    "experience": {
      "assessment": "1-3 sentence summary from enhancement scanner",
      "journeys": [
        {
          "archetype": "first-timer|expert|confused|edge-case|hostile-environment|automator",
          "summary": "Brief narrative of this user's experience",
          "friction_points": ["moment where user struggles"],
          "bright_spots": ["moment where skill shines"]
        }
      ],
      "autonomous": {
        "potential": "headless-ready|easily-adaptable|partially-adaptable|fundamentally-interactive",
        "notes": "Brief assessment"
      },
      "findings": []
    },
    "scripts": {
      "assessment": "1-3 sentence summary from script-opportunities scanner",
      "token_savings": "estimated total",
      "findings": []
    }
  },
  "recommendations": [
    {
      "rank": 1,
      "action": "What to do — MUST use 'action' not 'description'",
      "resolves": 9,
      "effort": "low|medium|high"
    }
  ]
}

Self-check before writing report-data.json:

  1. Is meta.skill_name present (not meta.skill or meta.name)?
  2. Is meta.scanner_count a number (not an array of scanner names)?
  3. Is every strength an object {"title": "...", "detail": "..."} (not a plain string)?
  4. Does every opportunity use name (not title) and include finding_count and findings array?
  5. Does every recommendation use action (not description) and include rank number?
  6. Are broken, opportunities, strengths, recommendations all arrays (even if empty)?
  7. Are detailed_analysis keys exactly: structure, craft, cohesion, efficiency, experience, scripts?
  8. Does every journey use archetype (not persona), summary (not friction), friction_points array, bright_spots array?
  9. Does autonomous use potential and notes?

Write both files to {quality-report-dir}/.

Return

Return only the path to report-data.json when complete.

Key Principle

You are the synthesis layer. Scanners analyze through individual lenses. You connect the dots. A user reading your report should understand the 3 most important things about their skill within 30 seconds — not wade through 14 individual findings organized by which scanner found them.