From a-team
Runs systematic performance audits with baseline measurement, bottleneck identification, and validated improvements. Use before/after optimizations, when regressions are suspected, or as a pre-release gate.
How this skill is triggered — by the user, by Claude, or both
Slash command
/a-team:performance-auditThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
```
A PERFORMANCE CLAIM WITHOUT NUMBERS IS AN OPINION.
"I think it's faster" is not a result.
"p95 latency dropped from 480ms to 42ms on a 1000-item dataset" is a result.
Before measuring anything, define what "good" looks like:
| Category | Example target |
|---|---|
| API latency | p95 < 200ms at 100 concurrent users |
| Page load | First Contentful Paint < 1.5s on 4G |
| Mobile frame rate | 60fps during scroll, 0 jank frames |
| Build time | Full build < 3 minutes |
| Memory | Peak heap < 512MB under load |
| Bundle size | JS bundle < 250KB gzipped |
If no target exists, the first audit establishes the baseline that becomes the target.
Run the benchmark before any changes. Record:
## Baseline — YYYY-MM-DD
**Feature:** User search endpoint
**Tool:** k6
**Command:** `k6 run --vus 50 --duration 60s scripts/search-load-test.js`
**Input:** 1000-user dataset, query="test"
| Metric | Value |
|--------|-------|
| p50 | 45ms |
| p95 | 380ms |
| p99 | 720ms |
| Error rate | 0.2% |
| Throughput | 210 req/s |
Use the appropriate tool for the stack. Read the output. Don't guess.
Web APIs
# Node.js — CPU profile
node --prof app.js
# Run load test, then:
node --prof-process isolate-*.log > profile.txt
# Python — flame graph
pip install py-spy
py-spy record -o profile.svg --pid $(pgrep -f "python app.py")
# Go — pprof
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30
# Database — slow query log
EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON) SELECT ...;
Frontend
# Bundle analysis
npx webpack-bundle-analyzer stats.json
npx source-map-explorer dist/main.js
# Runtime: Chrome DevTools → Performance tab
# Record interaction → identify long tasks (>50ms)
# Lighthouse CI
npx lhci autorun
Mobile
flutter run --profile → DevTools → Performance overlayState the bottleneck with evidence, not assumption:
## Bottleneck Found
**Location:** `UserSearchService.search()` — lines 45-67
**Evidence:** pprof shows 78% of CPU time in this function
**Root cause:** For each of 50 search results, a separate `getUserById()` DB call is made (N+1 query)
**Impact:** 47 sequential DB calls per request × ~8ms each = ~376ms per request
Single change. Document hypothesis and expected impact before applying:
## Change Applied
**Hypothesis:** Replacing per-item DB lookups with a single JOIN will eliminate 46 of the 47 DB calls
**Change:** `UserSearchService.search()` — replace loop + `getUserById()` with `getUsersByIds(ids)` JOIN
**Files modified:** `src/services/UserSearchService.ts`
**Expected impact:** p95 latency from 380ms to < 50ms
Run the exact same benchmark from Step 2.
## After Optimisation — YYYY-MM-DD
**Change:** N+1 query replaced with single JOIN
| Metric | Before | After | Delta |
|--------|--------|-------|-------|
| p50 | 45ms | 12ms | -73% |
| p95 | 380ms | 38ms | -90% |
| p99 | 720ms | 65ms | -91% |
| Error rate | 0.2% | 0.1% | -50% |
| Throughput | 210 req/s | 890 req/s | +324% |
**Verdict:** IMPROVEMENT CONFIRMED
**Root cause validated:** DB calls per request: 47 → 1
**No regression:** error rate stable, memory unchanged
| Verdict | Criteria |
|---|---|
| IMPROVEMENT CONFIRMED | Measurable improvement on target metric, no regression elsewhere |
| INCONCLUSIVE | No measurable change — hypothesis was wrong; identify next bottleneck |
| REGRESSION | Change made things worse — revert immediately, re-diagnose |
| GOAL MET | Target from Step 1 achieved — further optimisation not required |
For release-critical features, define performance budgets in docs/performance-budgets.md:
api_latency:
endpoint: POST /api/search
p95_ms: 200
measured_with: k6
load: 100 concurrent users
bundle_size:
entry: main.js
max_gzip_kb: 250
measured_with: webpack-bundle-analyzer
mobile_fps:
screen: SearchScreen
min_fps: 60
tool: Android Profiler
CI fails if any budget is exceeded. Performance is a feature — it regresses like any other feature.
npx claudepluginhub rbraga01/a-team --plugin a-teamInvestigates and fixes performance issues (slow responses, high memory, CPU spikes) using a measure-first methodology: profile before guessing, baseline before fixing, re-measure after changes.
Profiles and optimizes performance with a mandatory baseline-first gate. Use when something is slow or you need to hit a latency/throughput target.
[ADD v0.11.0] Performance optimization pass — identify and fix bottlenecks