plugins/pm-engineering/skills/performance-budget/SKILL.md
Define and document performance budgets for a web service or application. Use when asked to set performance targets, define SLOs for latency or throughput, establish Core Web Vitals targets, create a performance baseline, or document performance regression policy. Produces a structured performance budget covering key user journeys, Core Web Vitals, backend latency SLOs, measurement tooling, CI enforcement, and breach response process.
npx skillsauth add mohitagw15856/pm-claude-skills performance-budgetInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Produce a complete, actionable performance budget document for a web service or application. A performance budget is not a wishlist — it is a set of measurable, enforced constraints that define what "acceptable performance" means and who is responsible when those constraints are violated.
A good performance budget answers: what are the targets, how are they measured, what triggers an investigation, and what happens when a budget is breached.
Ask for these if not already provided:
Service: [Name] | Team: [Team name] Last updated: [Date] | Owner: [Name / role] Environment: [Production / Staging baseline] | Review cadence: [Quarterly / per-sprint]
[2–3 sentences describing the service, its user-facing performance requirements, and why performance is a priority. Reference the business impact of latency — e.g. conversion rate, user retention, SLA obligations.]
Performance philosophy: [e.g. "Performance is a feature. Every engineer is responsible for keeping the service within budget. Regressions must be caught in CI before they reach production."]
Define the critical paths that the performance budget is designed to protect.
| Journey ID | Journey name | Entry point | Exit point | Criticality | |---|---|---|---|---| | UJ-1 | [e.g. New user sign-up] | [Landing page] | [Dashboard] | Critical | | UJ-2 | [e.g. Core workflow task] | [e.g. /app/tasks] | [e.g. Task complete] | High | | UJ-3 | [e.g. Search and select] | [e.g. /search] | [e.g. Detail page] | High | | UJ-4 | [e.g. API data fetch] | [e.g. GET /api/items] | [e.g. 200 response] | Medium |
Complete this section for web and mobile applications. Skip for API-only services.
Targets apply to the 75th percentile of real user sessions (field data), measured on a mid-range Android device on a 4G connection unless otherwise stated.
| Metric | Description | Good | Needs Improvement | Poor | Our Target | Current baseline | |---|---|---|---|---|---|---| | LCP | Largest Contentful Paint — perceived load speed | ≤2.5s | 2.5–4.0s | >4.0s | [≤X.Xs] | [Xs / not measured] | | INP | Interaction to Next Paint — responsiveness | ≤200ms | 200–500ms | >500ms | [≤Xms] | [Xms / not measured] | | CLS | Cumulative Layout Shift — visual stability | ≤0.1 | 0.1–0.25 | >0.25 | [≤0.X] | [X.XX / not measured] | | FCP | First Contentful Paint | ≤1.8s | 1.8–3.0s | >3.0s | [≤X.Xs] | [Xs / not measured] | | TTFB | Time to First Byte | ≤800ms | 800ms–1.8s | >1.8s | [≤Xms] | [Xms / not measured] |
| Asset type | Max size (compressed) | Current | Status | |---|---|---|---| | Total page weight | [e.g. 500KB] | [XKB / unknown] | [Within / Over / Unknown] | | JavaScript (initial load) | [e.g. 200KB] | [XKB / unknown] | [Within / Over / Unknown] | | CSS | [e.g. 50KB] | [XKB / unknown] | [Within / Over / Unknown] | | Images (above fold) | [e.g. 150KB] | [XKB / unknown] | [Within / Over / Unknown] | | Web fonts | [e.g. 50KB] | [XKB / unknown] | [Within / Over / Unknown] | | Third-party scripts | [e.g. 100KB] | [XKB / unknown] | [Within / Over / Unknown] |
| Journey | LCP | INP | CLS | FCP | TTFB | |---|---|---|---|---|---| | UJ-1: [Journey name] | [≤Xs] | [≤Xms] | [≤0.X] | [≤Xs] | [≤Xms] | | UJ-2: [Journey name] | [≤Xs] | [≤Xms] | [≤0.X] | [≤Xs] | [≤Xms] | | UJ-3: [Journey name] | [≤Xs] | [≤Xms] | [≤0.X] | [≤Xs] | [≤Xms] |
Targets measured at the service boundary (not including client-side network latency).
| Endpoint / operation | Method | P50 | P95 | P99 | Max (hard limit) | Error rate | |---|---|---|---|---|---|---| | [e.g. /api/auth/login] | POST | [≤Xms] | [≤Xms] | [≤Xms] | [≤Xms] | [<X%] | | [e.g. /api/items] | GET | [≤Xms] | [≤Xms] | [≤Xms] | [≤Xms] | [<X%] | | [e.g. /api/items/:id] | GET | [≤Xms] | [≤Xms] | [≤Xms] | [≤Xms] | [<X%] | | [e.g. /api/items] | POST | [≤Xms] | [≤Xms] | [≤Xms] | [≤Xms] | [<X%] | | [e.g. Background job: sync] | — | [≤Xs] | [≤Xs] | [≤Xs] | [≤Xs] | [<X%] |
Overall service SLOs:
| SLO | Target | Measurement window | |---|---|---| | Availability | [99.X%] | 30-day rolling | | P95 latency (all endpoints) | [≤Xms] | 30-day rolling | | Error rate (5xx) | [<X%] | 30-day rolling | | Throughput (sustained) | [≥X req/s] | Peak hour |
| Query / operation | P50 | P95 | Max | Notes |
|---|---|---|---|---|
| [e.g. User lookup by ID] | [≤Xms] | [≤Xms] | [≤Xms] | Index on user_id |
| [e.g. List items for user] | [≤Xms] | [≤Xms] | [≤Xms] | Paginated, max 100 rows |
| [e.g. Full-text search] | [≤Xms] | [≤Xms] | [≤Xms] | Elasticsearch / pg_trgm |
Tool: [e.g. Google CrUX, SpeedCurve, Datadog RUM, Sentry Performance, custom] Data source: [Field data from real users / Lab data from synthetic tests / Both] Sample rate: [X% of sessions] How to access: [Dashboard URL or tool access instructions]
What is measured:
Tool: [e.g. Lighthouse CI, WebPageTest, k6, Artillery, Playwright with performance assertions] Frequency: [Every X minutes / on every deploy / nightly] Test location(s): [e.g. eu-west-1, us-east-1] Device profile: [Desktop 10Mbps / Mobile 4G Moto G4 / both]
Synthetic test suite location: [Link to test files]
APM tool: [e.g. Datadog, Grafana + Prometheus, New Relic, AWS X-Ray] Metrics collected:
Dashboard: [Link to primary performance dashboard]
Performance budgets are enforced at two gates:
Tool: [e.g. bundlesize, size-limit, webpack-bundle-analyzer with CI assertion]
Config file: [[.bundlesizerc / .size-limit.js / etc.]]
Trigger: Every PR targeting main
Blocking: Yes — PR cannot merge if bundle size budget is exceeded
// Example .size-limit.js
[
{
"path": "dist/js/*.js",
"limit": "200 KB"
},
{
"path": "dist/css/*.css",
"limit": "50 KB"
}
]
Tool: [e.g. Lighthouse CI, k6, Artillery] Trigger: On deploy to staging Blocking: Yes — production deploy is blocked if thresholds fail Thresholds checked:
CI config location: [[.github/workflows/perf.yml / ci/performance.yaml]]
How to run locally:
# Run Lighthouse CI against local build
[command — e.g. lhci autorun --config=lighthouserc.js]
# Run load test locally
[command — e.g. k6 run load-tests/api-smoke.js]
A budget breach is when a measured metric exceeds its target for [X consecutive measurements / X minutes sustained / a single deploy].
| Severity | Condition | Response time | Who acts | |---|---|---|---| | P1 — Critical | >2× budget threshold in production | Immediate | On-call engineer + team lead | | P2 — High | >1.5× budget threshold in production | Within 4 hours | On-call engineer | | P3 — Medium | Threshold exceeded in production | Within 1 sprint | PR author + team | | P4 — Low | Threshold exceeded in staging only | Before merge | PR author |
When a breach is detected, work through this checklist in order:
1. Identify the regression commit
# Compare performance across recent deploys
[command — e.g. datadog metrics query, lighthouse-ci compare, git bisect]
2. Classify the breach
3. Immediate actions
4. Resolution
Budget change policy: Budget thresholds may only be relaxed if: (a) the feature delivering the regression has measurable business value that outweighs the performance cost, and (b) the change is reviewed and approved by [tech lead].
| Trigger | Action | |---|---| | Every sprint | Review P95/P99 latency trends; flag any creeping degradation | | Every quarter | Full performance budget review — update baselines, adjust targets, audit tooling | | After major feature launch | Re-measure all Core Web Vitals and API SLOs; update baselines | | After infrastructure change | Re-run full synthetic test suite; confirm no regression | | After dependency upgrade | Run bundle size diff; confirm no unexpected size increase |
Next scheduled review: [Date] Review owner: [Name / role]
development
Analyse competitor moves and translate them into strategic implications for your product roadmap. Use when a competitor announces a new feature, pricing change, partnership, or strategic shift, or when producing a periodic competitive intelligence report. Produces a categorised signal analysis with reactive-vs-proactive assessment, threat ratings, specific roadmap implications, and recommended responses with owners.
development
Build a community management playbook for a brand's social media channels. Use when asked to create guidelines for managing comments, DMs, and community interactions, define a moderation policy, or build response frameworks for social media community managers. Produces a complete playbook with response templates, escalation paths, moderation rules, and tone guidelines.
development
Activate a 4-stage coding discipline framework that forces Claude to plan before coding, isolate changes on a branch, write tests first, and self-review output twice before presenting it. Use when starting a complex coding task, when past Claude sessions produced broken first drafts, or when you want to prevent rework cycles. Produces a confirmed written plan, isolated feature branch, test-first implementation, and a double-reviewed output with a correctness and code-quality checklist.
development
Optimize an article for Answer Engine Optimization (AEO) — restructuring content so AI engines like ChatGPT, Perplexity, and Claude can extract, quote, and cite it. Rewrites headings as questions, drops 50-80 word answer capsules, audits paragraph length, and flags trust signals. Use when asked to AEO-optimize, make content AI-readable, improve AI citation chances, or adapt an article for answer engines.