Skip to content

nidelson/bmad-module-pulse

PULSE

BMAD Module BMAD Version Tests GitHub release License: MIT GitHub stars

AI leverage signals for BMAD teams.

Prove your AI is actually shipping faster — or find where it stalls.

🌐 Português 🇧🇷

Sample output of /bmad-pulse-dashboard — based on a real BMAD project:

🏆 General Statistics

Metric Value
Stories measured 12
Avg AI Leverage 6.9x
Human estimated hours 152h
Actual AI hours 22h
Hours saved 130h
First-pass rate 83%

📈 Leverage Trend by Epic

Epic  1: ████████░░░░░░░░░░░░  4.2x (3 stories)
Epic  4: ██████████░░░░░░░░░░  5.1x (2 stories)
Epic  5: ████████████████░░░░  7.8x (3 stories)
Epic 14: ██████████████░░░░░░  6.9x (3 stories)
Epic 15: ████████████████████  8.4x (1 story)

📊 View full dashboard → (category breakdown, capacity forecast, Levi's insights, story-by-story breakdown)

Browse more dashboard scenarios for different team sizes and adoption stages.


The Problem

At some point, every developer who works with AI has lived this moment: looked at the clock, realized they did in two hours what they estimated for two days, and didn't quite know what to do with that feeling.

PULSE was built for that moment. To turn that feeling into a number. That number into a story. And that story into evidence.

You adopted BMAD. You wired up Claude Code or Cursor. Your team feels faster — but when leadership asks "how much faster?", you're guessing.

Every AI productivity tool measures lines of code, commits, or token spend. None of those answer the question your CTO is actually asking: are we shipping more user-visible value per engineering hour?

There are two kinds of teams in 2026: the team that uses AI, and the team that has AI using AI. The difference doesn't show up in lines of code. It shows up in stories shipped per estimated hour.

PULSE measures that!


What you get

  • A defensible ROI number for AI in your SDLC — leverage ratio, computed sprint over sprint, ready for your stakeholder deck.
  • Early warning on stalled work — capacity forecasts and halt alerts before a sprint slips.
  • A coach, not just a dashboard — Levi (PULSE's agent) reads your signals and tells you where the leverage is leaking.

Why PULSE

The market measures lines. PULSE measures stories.

It's the difference between scale weight and body fat percentage. LOC tells you something is moving. Leverage tells you whether it's muscle or bloat.

A story is the smallest unit of value your users feel. Tracking AI leverage at the story level — estimated hours vs. real hours, planning to done — gives you the only metric that survives a board meeting.

PULSE is also the first BMAD-native observability plugin on the marketplace. There is no incumbent. There is no second place yet. If you're running BMAD and you want SDLC analytics that speak BMAD's vocabulary (epics, stories, agents, workflows), this is the tool.

Stories, not lines. Outcomes, not output. Leverage, not activity.


What PULSE measures

Metric What it is Why it matters
AI Leverage Ratio estimated_hours / actual_hours How much AI multiplied your capacity
First-Pass Rate % of stories approved without revision Quality of the development process
Process Health Adherence to the BMAD workflow Halts, underused skills, drift

Quick start

npx bmad-method install --custom-source https://github.com/nidelson/bmad-module-pulse

Production: pin a released version. The command above tracks main (the manifest records version: main), so every re-run pulls whatever has since landed on main — non-deterministic across a team and across CI. For production projects, pin an explicit released tag:

npx bmad-method install \
  --custom-source https://github.com/nidelson/bmad-module-pulse \
  --version v0.4.5

Bump the tag deliberately when you want a new version. Pick one from the releases. Upgrading over an existing install self-heals automatically — see MIGRATION.md.

Then in your BMAD project:

/bmad-pulse-setup            # Configure once
/bmad-pulse-track-start      # When you start a story
/bmad-pulse-track-done       # When you finish — leverage is computed
/bmad-pulse-track-backfill   # Forgot to track? Recover HI/HF after the fact
/bmad-pulse-dashboard        # See the cumulative trend

PULSE attaches to your existing BMAD story files — no schema migrations, no separate database.


Included Skills

Upgrading from v0.3.x? Slash commands were renamed from pulse-* to bmad-pulse-* in v0.4.0. Read MIGRATION.md before upgrading — v0.4.0 has BREAKING CHANGES.

Skill Command Function
bmad-pulse-setup /bmad-pulse-setup Configure the module in your project
bmad-pulse-track-start /bmad-pulse-track-start [story_id] Register story start
bmad-pulse-track-done /bmad-pulse-track-done [story_id] Register completion + calculate metrics
bmad-pulse-track-backfill /bmad-pulse-track-backfill [story_id] --hi <ts> --hf <ts> Retroactively record HI/HF + metrics for a story tracked too late
bmad-pulse-dashboard /bmad-pulse-dashboard Generate cumulative dashboard

Levi — your coach agent

Levi is PULSE's Hyper-Efficiency Analyst. He reads your metrics and tells you, in plain English, where the squad is losing time: estimation drift, BMAD steps being skipped, agents being misused. He celebrates real wins, calls out drift, and suggests process fixes.

He doesn't moralize. He points.


How it works

PULSE instruments three points in the BMAD story lifecycle:

  1. Story start — captures estimated hours from the story file.
  2. Story done — captures real hours and computes the leverage ratio.
  3. Sprint rollup — aggregates leverage across the active sprint and projects capacity.

Leverage thresholds

Ratio Signal What it means
≥ 3.0x Exceptional AI is materially compressing your SDLC. Document the pattern, replicate it.
1.8x – 2.9x Solid Healthy AI leverage. The norm for mature BMAD teams.
1.2x – 1.7x Caution Marginal gain. Investigate where the AI is slowing down.
< 1.2x Warning AI is not pulling its weight. Levi will surface the likely cause.

Capabilities

  • Track — per-story estimated vs. real hours, start/done timestamps, agent attribution.
  • Aggregate — cumulative dashboard with weekly and sprint-level trends.
  • Forecast — capacity projection based on rolling leverage and team velocity.
  • Audit — process health checks for stories without estimates, halted work, missing artifacts.
  • Alert — halt detection when a story stalls beyond its estimate.
  • Coach — Levi reads the metrics and pinpoints bottlenecks in plain English.

Halt categories — separating dev work from wait time

Wall-clock time can be inflated by latencies that aren't dev work. PULSE captures these as structured halts in process_health.halts and subtracts them from actual_hours so leverage reflects real engineering effort.

kind What it represents
approval_wait Paused waiting for explicit user approval (admin merge, scope expansion, irreversible action).
incident External infra outage, GitHub down, dependency unavailable.
external_pause User-initiated break that should not count as dev work.
other Anything else — document with note.

Threshold: only document halts longer than 2 minutes. Below that is conversational latency, not a halt.

Pre-approved batch decisions: when a prior story granted durable approval covering the current one (e.g., "Admin merge applies to the entire epic-setup batch"), set pre_approved_batch: true on the halt entry. PULSE reports it but does not subtract — this rewards batch-decision behavior, which is operationally correct for human-in-the-loop AI workflows.

process_health:
  halts:
    - kind: approval_wait
      context: admin_merge_decision
      duration_min: 7
      pre_approved_batch: false

Why it matters: AI dev rate >> human review rate. Without this, every "AI does 5min of work, human takes 5min to approve" cycle gets logged as 0.5x leverage instead of the real number.


Configuration

PULSE offers 25 configurable variables with opinionated defaults. During setup (/bmad-pulse-setup), you can customize:

  • Estimation methodology — hours, story points, or t-shirt sizes
  • Field mapping — adapts field names from your project
  • Work categories — backend/web/mobile/fullstack or custom
  • Leverage thresholds — when to consider exceptional, solid, or warning
  • Dashboard — format, sections, and forecasts
  • Process Health — level of checks and alerts

Auto-dashboard

PULSE can regenerate the cumulative dashboard automatically after every track-done — closing the loop "story done → state consistent" without a manual /bmad-pulse-dashboard invocation. The trigger is opt-in via a config flag:

# _bmad/config.yaml — pulse section
pulse:
  # ... other PULSE settings ...
  pulse_auto_dashboard: yes   # default: 'no' (manual regen, preserves pre-flag behavior)

When set to yes, the default on_complete hook in bmad-pulse-track-done invokes /bmad-pulse-dashboard right after the Efficiency Pulse card is shown. When no, missing, or any other value, the hook is a silent no-op.

Trade-off: merge conflicts on parallel PRs

Auto-regenerating dashboard.md on every track-done guarantees merge conflicts in workflows with parallel pull requests — each track-done rewrites the file in full. Three documented mitigation strategies:

1. dashboard.md in .gitignore (recommended for repos with parallel work)

The source of truth lives in sprint-status.yaml under pulse_metrics:. Each developer regenerates locally on demand. Zero conflicts, zero loss of historical data.

# .gitignore
implementation-artifacts/pulse-dashboards/dashboard.md

2. CI workflow on post-merge main

Dashboard is regenerated by a serialized GitHub Action and committed back to main with [skip ci]. Local devs leave pulse_auto_dashboard: no — the central CI owns the file.

# .github/workflows/pulse-dashboard.yml
on:
  push:
    branches: [main]
    paths: ['**/sprint-status.yaml']
jobs:
  regen:
    runs-on: ubuntu-latest
    concurrency:
      group: pulse-dashboard
      cancel-in-progress: false
    # ... invoke /bmad-pulse-dashboard via your runner ...

3. Accept conflict as a trivial resolution

For small teams (1–2 devs working serially), git checkout --theirs dashboard.md && /bmad-pulse-dashboard resolves in ~5 seconds. Acceptable when parallel work is rare.

Disabling the default hook

To leave pulse_auto_dashboard: yes but replace the dashboard regen with your own post-completion behavior (Grafana push, Slack notification, etc.), override on_complete in _bmad/custom/bmad-pulse-track-done.toml. To disable entirely, set on_complete = "" in the same override file.


Customizing PULSE skills

Every PULSE skill ships a customize.toml exposing the same override surface as bmm-shipped skills. Overrides live in _bmad/custom/{skill-name}.toml (team-shared, committed) and _bmad/custom/{skill-name}.user.toml (gitignored). Empty defaults preserve current behavior — nothing to do until you want to extend.

Merge rules (by value shape):

  • Scalars: override wins (icon = "🔥" replaces the default).
  • Arrays: append (base → team → user concatenate).
  • Arrays of tables with code or id: replace matching entries, append new ones.

Example 1 — give Levi a persistent fact

_bmad/custom/bmad-agent-pulse.toml:

[agent]
persistent_facts = [
  "Always celebrate leverage above 4x with an exclamation; below 1.2x, request a halt review.",
]

Example 2 — push metrics to a webhook on every track-done

_bmad/custom/bmad-pulse-track-done.toml:

[workflow]
metric_post_hooks = [
  "curl -X POST -H 'Content-Type: application/json' -d @{pulse_data_folder}/last-pulse.json https://hooks.slack.com/services/AAA/BBB/CCC",
]

Example 3 — register a custom halt category

_bmad/custom/bmad-pulse-track-done.toml:

[workflow]
halt_categories_extra = [
  "security_review_wait",
  "ux_review_wait",
]

These values become valid selections in the halt prompt and are persisted alongside the built-in kinds.

Example 4 — append a team-glossary to every dashboard

_bmad/custom/bmad-pulse-dashboard.toml:

[workflow]
extra_sections = [
  "file:{project-root}/docs/team-glossary.md",
]

Example 5 — override Levi's "new record" cutoff

_bmad/custom/bmad-agent-pulse.toml:

[agent]
celebration_threshold_override = "4.5"

The full surface for each skill is documented in the skill's customize.toml shipped under .claude/skills/<skill>/. The header line # DO NOT EDIT -- overwritten on every update. marks defaults; your overrides go in _bmad/custom/ instead.


Proven leverage

Sustained leverage of 6.9x measured on a production BMAD project (SIP — local-first survey platform, monorepo with mobile, web, backend, and worker apps). The number reflects shipped stories with estimated and real hours captured by PULSE itself across multiple sprints.

PULSE eats its own dog food.

That number isn't the ceiling. It's a data point. PULSE exists so your team can find theirs.


Roadmap

  • v0.5 — Period-navigable dashboard (week / sprint / quarter views, side-by-side comparison)
  • v0.6 — Per-developer and per-agent leverage breakdowns, with privacy guards on by default
  • v0.7 — Slack and Linear digests so signals reach leadership without a meeting
  • v1.0 — Pitch to BMAD core for native adoption.

Requirements

  • BMAD Method >= 6.4.0 (see MIGRATION.md if upgrading from v0.3.x)
  • Python >= 3.9 (for setup scripts)
  • AI assistant tool-agnostic — Claude Code, Cursor, Copilot, or anything else. PULSE measures the squad, not the IDE.

Community

  • Discord — BMad Method community
  • Issues — Bug reports and feature requests

Star history

View star history on star-history.com

License

MIT — see LICENSE.


PULSE — Against facts, there are no arguments.

About

AI leverage analytics for BMAD teams. Story-level leverage ratios, capacity forecasts, halt alerts, and Levi (your coach). Stories, not lines.

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Sponsor this project

Packages

 
 
 

Contributors

Languages