@rune-kit/rune 2.8.0 → 2.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +68 -34
- package/agents/adversary.md +27 -0
- package/agents/architect.md +19 -29
- package/agents/asset-creator.md +18 -4
- package/agents/audit.md +25 -4
- package/agents/autopsy.md +19 -4
- package/agents/ba.md +35 -0
- package/agents/brainstorm.md +31 -4
- package/agents/browser-pilot.md +21 -4
- package/agents/coder.md +21 -29
- package/agents/completion-gate.md +20 -4
- package/agents/constraint-check.md +18 -4
- package/agents/context-engine.md +22 -4
- package/agents/context-pack.md +32 -0
- package/agents/cook.md +41 -4
- package/agents/db.md +19 -4
- package/agents/debug.md +33 -4
- package/agents/dependency-doctor.md +20 -4
- package/agents/deploy.md +27 -4
- package/agents/design.md +22 -4
- package/agents/doc-processor.md +27 -0
- package/agents/docs-seeker.md +19 -4
- package/agents/docs.md +31 -0
- package/agents/fix.md +37 -4
- package/agents/git.md +29 -0
- package/agents/hallucination-guard.md +20 -4
- package/agents/incident.md +21 -4
- package/agents/integrity-check.md +18 -4
- package/agents/journal.md +19 -4
- package/agents/launch.md +32 -4
- package/agents/logic-guardian.md +26 -11
- package/agents/marketing.md +23 -4
- package/agents/mcp-builder.md +26 -0
- package/agents/neural-memory.md +30 -0
- package/agents/onboard.md +22 -4
- package/agents/perf.md +21 -4
- package/agents/plan.md +29 -4
- package/agents/preflight.md +22 -4
- package/agents/problem-solver.md +20 -4
- package/agents/rescue.md +23 -4
- package/agents/research.md +19 -4
- package/agents/researcher.md +19 -29
- package/agents/retro.md +32 -0
- package/agents/review-intake.md +20 -4
- package/agents/review.md +32 -4
- package/agents/reviewer.md +20 -28
- package/agents/safeguard.md +19 -4
- package/agents/sast.md +18 -4
- package/agents/scaffold.md +41 -0
- package/agents/scanner.md +19 -28
- package/agents/scope-guard.md +18 -4
- package/agents/scout.md +23 -4
- package/agents/sentinel-env.md +26 -0
- package/agents/sentinel.md +33 -4
- package/agents/sequential-thinking.md +20 -4
- package/agents/session-bridge.md +24 -4
- package/agents/skill-forge.md +22 -4
- package/agents/skill-router.md +26 -4
- package/agents/slides.md +24 -0
- package/agents/surgeon.md +19 -4
- package/agents/team.md +30 -4
- package/agents/test.md +36 -4
- package/agents/trend-scout.md +17 -4
- package/agents/verification.md +20 -4
- package/agents/video-creator.md +20 -4
- package/agents/watchdog.md +19 -4
- package/agents/worktree.md +17 -4
- package/commands/rune.md +168 -168
- package/compiler/__tests__/analytics.test.js +370 -0
- package/compiler/adapters/openclaw.js +2 -2
- package/compiler/analytics.js +385 -0
- package/compiler/bin/rune.js +68 -2
- package/compiler/dashboard.js +883 -0
- package/compiler/transforms/branding.js +1 -1
- package/contexts/dev.md +34 -34
- package/contexts/research.md +43 -43
- package/contexts/review.md +55 -55
- package/extensions/ai-ml/PACK.md +88 -88
- package/extensions/ai-ml/skills/ai-agents.md +172 -172
- package/extensions/ai-ml/skills/code-sandbox.md +187 -187
- package/extensions/ai-ml/skills/deep-research.md +146 -146
- package/extensions/ai-ml/skills/embedding-search.md +66 -66
- package/extensions/ai-ml/skills/fine-tuning-guide.md +74 -74
- package/extensions/ai-ml/skills/llm-architect.md +125 -125
- package/extensions/ai-ml/skills/llm-integration.md +64 -64
- package/extensions/ai-ml/skills/prompt-patterns.md +72 -72
- package/extensions/ai-ml/skills/rag-patterns.md +66 -66
- package/extensions/ai-ml/skills/web-extraction.md +114 -114
- package/extensions/analytics/PACK.md +92 -92
- package/extensions/analytics/skills/ab-testing.md +72 -72
- package/extensions/analytics/skills/dashboard-patterns.md +83 -83
- package/extensions/analytics/skills/data-validation.md +68 -68
- package/extensions/analytics/skills/funnel-analysis.md +81 -81
- package/extensions/analytics/skills/sql-patterns.md +57 -57
- package/extensions/analytics/skills/statistical-analysis.md +79 -79
- package/extensions/analytics/skills/tracking-setup.md +71 -71
- package/extensions/backend/PACK.md +104 -104
- package/extensions/backend/skills/api-patterns.md +84 -84
- package/extensions/backend/skills/async-pipeline.md +193 -193
- package/extensions/backend/skills/auth-patterns.md +97 -97
- package/extensions/backend/skills/background-jobs.md +133 -133
- package/extensions/backend/skills/caching-patterns.md +108 -108
- package/extensions/backend/skills/cli-generation.md +133 -133
- package/extensions/backend/skills/database-patterns.md +87 -87
- package/extensions/backend/skills/middleware-patterns.md +104 -104
- package/extensions/chrome-ext/PACK.md +93 -93
- package/extensions/chrome-ext/skills/cws-preflight.md +143 -143
- package/extensions/chrome-ext/skills/cws-publish.md +104 -104
- package/extensions/chrome-ext/skills/ext-ai-integration.md +251 -251
- package/extensions/chrome-ext/skills/ext-messaging.md +139 -139
- package/extensions/chrome-ext/skills/ext-storage.md +133 -133
- package/extensions/chrome-ext/skills/mv3-scaffold.md +164 -164
- package/extensions/content/PACK.md +96 -96
- package/extensions/content/skills/blog-patterns.md +88 -88
- package/extensions/content/skills/cms-integration.md +131 -131
- package/extensions/content/skills/content-scoring.md +107 -107
- package/extensions/content/skills/i18n.md +83 -83
- package/extensions/content/skills/mdx-authoring.md +137 -137
- package/extensions/content/skills/reference.md +1014 -1014
- package/extensions/content/skills/seo-patterns.md +67 -67
- package/extensions/content/skills/video-repurpose.md +153 -153
- package/extensions/devops/PACK.md +101 -101
- package/extensions/devops/skills/chaos-testing.md +67 -67
- package/extensions/devops/skills/ci-cd.md +75 -75
- package/extensions/devops/skills/docker.md +58 -58
- package/extensions/devops/skills/edge-serverless.md +163 -163
- package/extensions/devops/skills/infra-as-code.md +158 -158
- package/extensions/devops/skills/kubernetes.md +110 -110
- package/extensions/devops/skills/monitoring.md +57 -57
- package/extensions/devops/skills/server-setup.md +64 -64
- package/extensions/devops/skills/ssl-domain.md +42 -42
- package/extensions/ecommerce/PACK.md +116 -116
- package/extensions/ecommerce/skills/cart-system.md +79 -79
- package/extensions/ecommerce/skills/inventory-mgmt.md +102 -102
- package/extensions/ecommerce/skills/order-management.md +126 -126
- package/extensions/ecommerce/skills/payment-integration.md +472 -472
- package/extensions/ecommerce/skills/shopify-dev.md +69 -69
- package/extensions/ecommerce/skills/subscription-billing.md +93 -93
- package/extensions/ecommerce/skills/tax-compliance.md +117 -117
- package/extensions/gamedev/PACK.md +142 -142
- package/extensions/gamedev/skills/asset-pipeline.md +74 -74
- package/extensions/gamedev/skills/audio-system.md +129 -129
- package/extensions/gamedev/skills/camera-system.md +87 -87
- package/extensions/gamedev/skills/ecs.md +98 -98
- package/extensions/gamedev/skills/game-loops.md +72 -72
- package/extensions/gamedev/skills/input-system.md +199 -199
- package/extensions/gamedev/skills/multiplayer.md +180 -180
- package/extensions/gamedev/skills/particles.md +105 -105
- package/extensions/gamedev/skills/physics-engine.md +89 -89
- package/extensions/gamedev/skills/scene-management.md +146 -146
- package/extensions/gamedev/skills/threejs-patterns.md +90 -90
- package/extensions/gamedev/skills/webgl.md +71 -71
- package/extensions/mobile/PACK.md +106 -106
- package/extensions/mobile/skills/app-store-connect.md +152 -152
- package/extensions/mobile/skills/app-store-prep.md +66 -66
- package/extensions/mobile/skills/deep-linking.md +109 -109
- package/extensions/mobile/skills/flutter.md +60 -60
- package/extensions/mobile/skills/ios-build-pipeline.md +142 -142
- package/extensions/mobile/skills/native-bridge.md +66 -66
- package/extensions/mobile/skills/ota-updates.md +97 -97
- package/extensions/mobile/skills/push-notifications.md +111 -111
- package/extensions/mobile/skills/react-native.md +82 -82
- package/extensions/saas/PACK.md +116 -116
- package/extensions/saas/skills/billing-integration.md +200 -200
- package/extensions/saas/skills/feature-flags.md +130 -130
- package/extensions/saas/skills/multi-tenant.md +103 -103
- package/extensions/saas/skills/onboarding-flow.md +139 -139
- package/extensions/saas/skills/subscription-flow.md +95 -95
- package/extensions/saas/skills/team-management.md +144 -144
- package/extensions/security/PACK.md +99 -99
- package/extensions/security/skills/api-security.md +140 -140
- package/extensions/security/skills/compliance.md +68 -68
- package/extensions/security/skills/owasp-audit.md +64 -64
- package/extensions/security/skills/pentest-patterns.md +77 -77
- package/extensions/security/skills/secret-mgmt.md +65 -65
- package/extensions/security/skills/supply-chain.md +65 -65
- package/extensions/trading/PACK.md +80 -80
- package/extensions/trading/skills/chart-components.md +55 -55
- package/extensions/trading/skills/experiment-loop.md +125 -125
- package/extensions/trading/skills/fintech-patterns.md +47 -47
- package/extensions/trading/skills/indicator-library.md +58 -58
- package/extensions/trading/skills/quant-analysis.md +111 -111
- package/extensions/trading/skills/realtime-data.md +58 -58
- package/extensions/trading/skills/trade-logic.md +104 -104
- package/extensions/ui/PACK.md +130 -130
- package/extensions/ui/skills/a11y-audit.md +91 -91
- package/extensions/ui/skills/animation-patterns.md +127 -106
- package/extensions/ui/skills/component-patterns.md +100 -75
- package/extensions/ui/skills/design-decision.md +108 -108
- package/extensions/ui/skills/design-system.md +68 -68
- package/extensions/ui/skills/landing-patterns.md +155 -155
- package/extensions/ui/skills/palette-picker.md +173 -173
- package/extensions/ui/skills/react-health.md +90 -90
- package/extensions/ui/skills/type-system.md +125 -125
- package/extensions/ui/skills/web-vitals.md +153 -153
- package/extensions/zalo/PACK.md +145 -145
- package/extensions/zalo/skills/zalo-oa-mcp.md +317 -317
- package/extensions/zalo/skills/zalo-oa-messaging.md +429 -429
- package/extensions/zalo/skills/zalo-oa-setup.md +236 -236
- package/extensions/zalo/skills/zalo-oa-webhook.md +189 -189
- package/extensions/zalo/skills/zalo-personal-messaging.md +194 -194
- package/extensions/zalo/skills/zalo-personal-setup.md +153 -153
- package/extensions/zalo/skills/zalo-rate-guard.md +219 -219
- package/hooks/auto-format/index.cjs +48 -48
- package/hooks/context-watch/index.cjs +95 -68
- package/hooks/hooks.json +111 -111
- package/hooks/metrics-collector/index.cjs +86 -42
- package/hooks/post-session-reflect/index.cjs +189 -153
- package/hooks/pre-compact/index.cjs +95 -95
- package/hooks/run-hook.cmd +1 -1
- package/hooks/secrets-scan/index.cjs +100 -100
- package/hooks/session-start/index.cjs +71 -65
- package/hooks/typecheck/index.cjs +65 -65
- package/package.json +63 -63
- package/references/ui-pro-max-data/LICENSE-UI-PRO-MAX +21 -21
- package/references/ui-pro-max-data/charts.csv +26 -26
- package/references/ui-pro-max-data/colors.csv +161 -161
- package/references/ui-pro-max-data/styles.csv +68 -68
- package/references/ui-pro-max-data/typography.csv +74 -74
- package/references/ui-pro-max-data/ui-reasoning.csv +162 -162
- package/references/ui-pro-max-data/ux-guidelines.csv +99 -99
- package/skills/adversary/SKILL.md +283 -283
- package/skills/asset-creator/SKILL.md +157 -157
- package/skills/audit/SKILL.md +148 -2
- package/skills/autopsy/SKILL.md +335 -259
- package/skills/autopsy/references/repo-analysis-patterns.md +113 -0
- package/skills/ba/SKILL.md +72 -2
- package/skills/brainstorm/SKILL.md +342 -341
- package/skills/browser-pilot/SKILL.md +168 -168
- package/skills/constraint-check/SKILL.md +165 -165
- package/skills/context-engine/SKILL.md +404 -404
- package/skills/cook/SKILL.md +917 -834
- package/skills/cook/references/output-format.md +33 -0
- package/skills/db/SKILL.md +273 -272
- package/skills/debug/SKILL.md +465 -443
- package/skills/dependency-doctor/SKILL.md +265 -235
- package/skills/deploy/SKILL.md +274 -231
- package/skills/design/DESIGN-REFERENCE.md +365 -365
- package/skills/design/SKILL.md +589 -482
- package/skills/doc-processor/SKILL.md +254 -254
- package/skills/docs/SKILL.md +374 -373
- package/skills/docs-seeker/SKILL.md +177 -177
- package/skills/fix/SKILL.md +330 -308
- package/skills/git/SKILL.md +339 -339
- package/skills/graft/SKILL.md +352 -0
- package/skills/graft/references/challenge-framework.md +98 -0
- package/skills/graft/references/mode-decision.md +44 -0
- package/skills/hallucination-guard/SKILL.md +219 -219
- package/skills/incident/SKILL.md +254 -251
- package/skills/integrity-check/SKILL.md +169 -169
- package/skills/journal/SKILL.md +240 -238
- package/skills/launch/SKILL.md +344 -342
- package/skills/logic-guardian/SKILL.md +251 -251
- package/skills/marketing/SKILL.md +290 -245
- package/skills/mcp-builder/SKILL.md +425 -423
- package/skills/mcp-builder/references/auto-discovery-pattern.md +169 -0
- package/skills/neural-memory/SKILL.md +362 -362
- package/skills/onboard/SKILL.md +404 -403
- package/skills/perf/SKILL.md +346 -346
- package/skills/plan/SKILL.md +433 -370
- package/skills/plan/references/feature-map.md +84 -0
- package/skills/preflight/SKILL.md +415 -396
- package/skills/problem-solver/SKILL.md +380 -284
- package/skills/rescue/SKILL.md +474 -450
- package/skills/retro/SKILL.md +5 -1
- package/skills/review/SKILL.md +612 -535
- package/skills/review-intake/SKILL.md +249 -249
- package/skills/safeguard/SKILL.md +200 -200
- package/skills/sast/SKILL.md +190 -190
- package/skills/scaffold/SKILL.md +328 -286
- package/skills/scope-guard/SKILL.md +180 -162
- package/skills/scout/SKILL.md +263 -263
- package/skills/sentinel/SKILL.md +382 -353
- package/skills/sentinel-env/SKILL.md +254 -254
- package/skills/sequential-thinking/SKILL.md +234 -234
- package/skills/session-bridge/SKILL.md +543 -397
- package/skills/skill-forge/SKILL.md +581 -539
- package/skills/skill-router/{skill.md → SKILL.md} +30 -2
- package/skills/surgeon/SKILL.md +215 -215
- package/skills/team/SKILL.md +556 -514
- package/skills/test/SKILL.md +614 -587
- package/skills/trend-scout/SKILL.md +145 -145
- package/skills/verification/SKILL.md +326 -325
- package/skills/video-creator/SKILL.md +201 -201
- package/skills/watchdog/SKILL.md +168 -168
- package/skills/worktree/SKILL.md +140 -140
package/skills/perf/SKILL.md
CHANGED
|
@@ -1,346 +1,346 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: perf
|
|
3
|
-
description: Performance regression gate. Detects N+1 queries, sync-in-async, missing indexes, memory leaks, and bundle bloat before they reach production.
|
|
4
|
-
metadata:
|
|
5
|
-
author: runedev
|
|
6
|
-
version: "0.3.0"
|
|
7
|
-
layer: L2
|
|
8
|
-
model: sonnet
|
|
9
|
-
group: quality
|
|
10
|
-
tools: "Read, Bash, Glob, Grep"
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
# perf
|
|
14
|
-
|
|
15
|
-
## Purpose
|
|
16
|
-
|
|
17
|
-
Performance regression gate. Analyzes code changes for patterns that cause measurable slowdowns — N+1 queries, sync operations in async handlers, unbounded DB queries, missing indexes, memory leaks, and bundle bloat. Not a profiler — a gate. Finds performance bugs with measurable/estimated impact before production, so developers fix them at the cheapest point in the cycle.
|
|
18
|
-
|
|
19
|
-
## Triggers
|
|
20
|
-
|
|
21
|
-
- `/rune perf` — manual invocation before commit
|
|
22
|
-
- Called by `cook` (L1): Phase 5 quality gate
|
|
23
|
-
- Called by `review` (L2): performance patterns detected in diff
|
|
24
|
-
- Called by `deploy` (L2): pre-deploy regression check
|
|
25
|
-
- Called by `audit` (L2): performance health dimension
|
|
26
|
-
|
|
27
|
-
## Calls (outbound)
|
|
28
|
-
|
|
29
|
-
- `scout` (L2): find hotpath files and identify framework in use
|
|
30
|
-
- `browser-pilot` (L3): run Lighthouse / Core Web Vitals for frontend projects
|
|
31
|
-
- `verification` (L3): run benchmark scripts if configured (e.g. `npm run bench`)
|
|
32
|
-
- `design` (L2): when Lighthouse Accessibility BLOCK — design system may lack a11y foundation
|
|
33
|
-
|
|
34
|
-
## Called By (inbound)
|
|
35
|
-
|
|
36
|
-
- `cook` (L1): Phase 5 quality gate before PR
|
|
37
|
-
- `audit` (L2): performance dimension delegation
|
|
38
|
-
- `review` (L2): performance patterns detected in diff
|
|
39
|
-
- `deploy` (L2): pre-deploy perf regression check
|
|
40
|
-
|
|
41
|
-
## References
|
|
42
|
-
|
|
43
|
-
- `references/cost-reference.md` — Cost priority hierarchy, quick wins checklist, instance right-sizing, data transfer traps, serverless optimization, observability cost control, managed vs self-hosted matrix, unit economics tracking. Load when cost analysis or FinOps context detected.
|
|
44
|
-
- `references/scalability-reference.md` — Bottleneck identification flow, performance thresholds, API patterns (cursor pagination, rate limiting, circuit breaker, graceful shutdown), caching strategies, queue-based load leveling, concurrency patterns, K8s HPA, CDN headers, load testing. Load when scaling or infrastructure optimization context detected.
|
|
45
|
-
|
|
46
|
-
## Executable Steps
|
|
47
|
-
|
|
48
|
-
### Step 1 — Scope
|
|
49
|
-
|
|
50
|
-
Determine what to analyze:
|
|
51
|
-
- If called with a file list or diff → analyze those files only
|
|
52
|
-
- If called standalone → invoke `scout` to identify top 10 hotpath files (entry points, routes, DB access layers, render-heavy components)
|
|
53
|
-
- Detect project type: **frontend** (React/Vue/Svelte) | **backend** (Node/Python/Go) | **fullstack** | **CLI**
|
|
54
|
-
|
|
55
|
-
### Step 2 — DB Query Patterns
|
|
56
|
-
|
|
57
|
-
Scan all in-scope files for:
|
|
58
|
-
|
|
59
|
-
**N+1 pattern** — loop containing ORM call:
|
|
60
|
-
```
|
|
61
|
-
# BAD: N+1
|
|
62
|
-
for user in users:
|
|
63
|
-
orders = Order.objects.filter(user=user) # N queries
|
|
64
|
-
|
|
65
|
-
# GOOD: prefetch
|
|
66
|
-
users = User.objects.prefetch_related('orders').all()
|
|
67
|
-
```
|
|
68
|
-
Finding: `N+1 DETECTED — [file:line] — loop over [collection] with [ORM call] inside — use prefetch/JOIN`
|
|
69
|
-
|
|
70
|
-
**Unbounded query** — no LIMIT/pagination:
|
|
71
|
-
```
|
|
72
|
-
# BAD
|
|
73
|
-
db.query("SELECT * FROM events")
|
|
74
|
-
|
|
75
|
-
# GOOD
|
|
76
|
-
db.query("SELECT * FROM events LIMIT 100 OFFSET ?", [offset])
|
|
77
|
-
```
|
|
78
|
-
Finding: `UNBOUNDED_QUERY — [file:line] — missing LIMIT on [table] — add pagination`
|
|
79
|
-
|
|
80
|
-
**SELECT \*** — fetching all columns when only some are needed:
|
|
81
|
-
Finding: `SELECT_STAR — [file:line] — select only needed columns`
|
|
82
|
-
|
|
83
|
-
### Step 3 — Async/Sync Violations
|
|
84
|
-
|
|
85
|
-
Scan for synchronous operations in async contexts:
|
|
86
|
-
|
|
87
|
-
**Blocking I/O in async handler:**
|
|
88
|
-
```javascript
|
|
89
|
-
// BAD: blocks event loop
|
|
90
|
-
async function handler(req) {
|
|
91
|
-
const data = fs.readFileSync('./config.json')
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// GOOD
|
|
95
|
-
async function handler(req) {
|
|
96
|
-
const data = await fs.promises.readFile('./config.json')
|
|
97
|
-
}
|
|
98
|
-
```
|
|
99
|
-
Finding: `SYNC_IN_ASYNC — [file:line] — [readFileSync|execSync|etc] in async function — blocks event loop`
|
|
100
|
-
|
|
101
|
-
**Missing await:**
|
|
102
|
-
```javascript
|
|
103
|
-
// BAD: fire-and-forget
|
|
104
|
-
async function save() {
|
|
105
|
-
db.insert(record) // no await
|
|
106
|
-
}
|
|
107
|
-
```
|
|
108
|
-
Finding: `MISSING_AWAIT — [file:line] — unresolved Promise may cause race condition`
|
|
109
|
-
|
|
110
|
-
### Step 4 — Memory Leak Patterns
|
|
111
|
-
|
|
112
|
-
Scan for:
|
|
113
|
-
|
|
114
|
-
**Event listener without cleanup:**
|
|
115
|
-
```javascript
|
|
116
|
-
// BAD: leak in React
|
|
117
|
-
useEffect(() => {
|
|
118
|
-
window.addEventListener('resize', handler)
|
|
119
|
-
// missing return cleanup
|
|
120
|
-
})
|
|
121
|
-
|
|
122
|
-
// GOOD
|
|
123
|
-
useEffect(() => {
|
|
124
|
-
window.addEventListener('resize', handler)
|
|
125
|
-
return () => window.removeEventListener('resize', handler)
|
|
126
|
-
}, [])
|
|
127
|
-
```
|
|
128
|
-
Finding: `MEMORY_LEAK — [file:line] — addEventListener without cleanup in useEffect`
|
|
129
|
-
|
|
130
|
-
**Growing collection without eviction:**
|
|
131
|
-
```python
|
|
132
|
-
# BAD: unbounded cache
|
|
133
|
-
cache = {}
|
|
134
|
-
def get(key):
|
|
135
|
-
if key not in cache:
|
|
136
|
-
cache[key] = expensive_compute(key)
|
|
137
|
-
return cache[key]
|
|
138
|
-
```
|
|
139
|
-
Finding: `UNBOUNDED_CACHE — [file:line] — dict grows indefinitely — add LRU eviction or TTL`
|
|
140
|
-
|
|
141
|
-
### Step 5 — Bundle Analysis (frontend only)
|
|
142
|
-
|
|
143
|
-
If project type is frontend:
|
|
144
|
-
- Check for large direct imports that block tree-shaking:
|
|
145
|
-
```javascript
|
|
146
|
-
// BAD: imports entire lodash
|
|
147
|
-
import _ from 'lodash'
|
|
148
|
-
// GOOD: named import
|
|
149
|
-
import { debounce } from 'lodash'
|
|
150
|
-
```
|
|
151
|
-
Finding: `BUNDLE_BLOAT — [file:line] — default import of [library] prevents tree-shaking`
|
|
152
|
-
- Check for missing React.memo / useMemo on expensive renders
|
|
153
|
-
- Check for component definitions inside render (recreated every render)
|
|
154
|
-
|
|
155
|
-
If `browser-pilot` is available and project has a URL: invoke it for Lighthouse score.
|
|
156
|
-
|
|
157
|
-
**Lighthouse Score Gates** (apply to any project with a public URL):
|
|
158
|
-
|
|
159
|
-
```
|
|
160
|
-
Performance: ≥ 90 → PASS | 70–89 → WARN | < 70 → BLOCK
|
|
161
|
-
Accessibility: ≥ 95 → PASS | 80–94 → WARN | < 80 → BLOCK
|
|
162
|
-
Best Practices: ≥ 90 → PASS | < 90 → WARN
|
|
163
|
-
SEO: ≥ 80 → PASS | < 80 → WARN (public-facing pages only)
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
**Core Web Vitals thresholds:**
|
|
167
|
-
```
|
|
168
|
-
LCP (Largest Contentful Paint):
|
|
169
|
-
≤ 2.5s → PASS | 2.5–4s → WARN | > 4s → BLOCK
|
|
170
|
-
|
|
171
|
-
INP (Interaction to Next Paint, replaces FID):
|
|
172
|
-
≤ 200ms → PASS | 200–500ms → WARN | > 500ms → BLOCK
|
|
173
|
-
|
|
174
|
-
CLS (Cumulative Layout Shift):
|
|
175
|
-
≤ 0.1 → PASS | 0.1–0.25 → WARN | > 0.25 → BLOCK
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
<HARD-GATE>
|
|
179
|
-
Lighthouse Accessibility score < 80 = BLOCK regardless of other scores.
|
|
180
|
-
Accessibility regressions are legal liability and cannot be auto-fixed by the AI.
|
|
181
|
-
Do NOT downgrade this gate.
|
|
182
|
-
</HARD-GATE>
|
|
183
|
-
|
|
184
|
-
If no URL available (dev-only environment): log `INFO: no URL for Lighthouse — run manually before deploy`
|
|
185
|
-
If Lighthouse MCP not installed: log `INFO: Lighthouse MCP not available — run lighthouse [url] --output json manually`
|
|
186
|
-
|
|
187
|
-
### Step 6 — Framework-Specific Checks
|
|
188
|
-
|
|
189
|
-
**React:**
|
|
190
|
-
- `useEffect` without dependency array → runs every render
|
|
191
|
-
- Expensive computation directly in render (not wrapped in useMemo)
|
|
192
|
-
- Component created inside another component body
|
|
193
|
-
|
|
194
|
-
**Node.js / Express:**
|
|
195
|
-
- `require()` calls inside route handlers (should be top-level)
|
|
196
|
-
- Missing connection pool config (default pool size = 1 on some ORMs)
|
|
197
|
-
- Synchronous crypto operations (use `crypto.subtle` async API)
|
|
198
|
-
|
|
199
|
-
**Python / Django:**
|
|
200
|
-
- Missing `select_related` / `prefetch_related` on ForeignKey traversal
|
|
201
|
-
- `len(queryset)` instead of `queryset.count()` (loads all rows)
|
|
202
|
-
- Celery tasks without `bind=True` retried without backoff
|
|
203
|
-
|
|
204
|
-
**SQL:**
|
|
205
|
-
- JOIN without index on join column
|
|
206
|
-
- WHERE on non-indexed column in large table
|
|
207
|
-
- Cartesian product (missing JOIN condition)
|
|
208
|
-
|
|
209
|
-
### Step 7 — Benchmark Execution
|
|
210
|
-
|
|
211
|
-
If project has benchmark scripts (detected via `package.json` scripts, `Makefile`, or `pytest-benchmark`):
|
|
212
|
-
- Invoke `verification` to run them
|
|
213
|
-
- Compare output to baseline if `.perf-baseline.json` exists
|
|
214
|
-
|
|
215
|
-
If no benchmarks configured: log `INFO: no benchmark scripts found — skipping`
|
|
216
|
-
|
|
217
|
-
### Step 8 — Report
|
|
218
|
-
|
|
219
|
-
Emit structured report:
|
|
220
|
-
|
|
221
|
-
```
|
|
222
|
-
## Perf Report: [scope]
|
|
223
|
-
|
|
224
|
-
### BLOCK (must fix before merge)
|
|
225
|
-
- [FINDING_TYPE] [file:line] — [description] — estimated impact: [Xms|X% bundle|X queries]
|
|
226
|
-
|
|
227
|
-
### WARN (should fix)
|
|
228
|
-
- [FINDING_TYPE] [file:line] — [description] — estimated impact: [...]
|
|
229
|
-
|
|
230
|
-
### PASS
|
|
231
|
-
- DB query patterns: clean
|
|
232
|
-
- Async/sync violations: none
|
|
233
|
-
- [etc.]
|
|
234
|
-
|
|
235
|
-
### Lighthouse (if ran)
|
|
236
|
-
- Performance: [score] [PASS|WARN|BLOCK]
|
|
237
|
-
- Accessibility: [score] [PASS|WARN|BLOCK]
|
|
238
|
-
- Best Practices: [score] [PASS|WARN]
|
|
239
|
-
- SEO: [score] [PASS|WARN]
|
|
240
|
-
- LCP: [Xs] [PASS|WARN|BLOCK] | INP: [Xms] [PASS|WARN|BLOCK] | CLS: [X] [PASS|WARN|BLOCK]
|
|
241
|
-
|
|
242
|
-
### Verdict: PASS | WARN | BLOCK
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
### Step 8.5 — Token Budget Tracking (AI-Powered Apps)
|
|
246
|
-
|
|
247
|
-
For projects that call AI APIs (detected via imports of `anthropic`, `openai`, `@anthropic-ai/sdk`, `@ai-sdk/core`, `langchain`, `llamaindex`, or `fastmcp`), audit token usage patterns per operation type.
|
|
248
|
-
|
|
249
|
-
**Scan for:**
|
|
250
|
-
|
|
251
|
-
| Pattern | Finding | Impact |
|
|
252
|
-
|---------|---------|--------|
|
|
253
|
-
| AI call inside a loop without batching | `TOKEN_LOOP — [file:line] — AI call in loop over [collection] — batch or parallelize` | Cost scales linearly with collection size |
|
|
254
|
-
| No token usage tracking | `NO_TOKEN_TRACKING — [file:line] — AI response usage not captured — add cost logging` | Invisible spend, no budget control |
|
|
255
|
-
| Expensive model for simple tasks | `MODEL_MISMATCH — [file:line] — using [opus/gpt-4] for [classification/extraction] — use [haiku/gpt-4.1-mini]` | 10-30x cost difference for same result |
|
|
256
|
-
| Missing max_tokens on open-ended prompts | `UNBOUNDED_TOKENS — [file:line] — no max_tokens on [call] — add limit to prevent runaway cost` | Single call can consume entire budget |
|
|
257
|
-
| Duplicate AI calls for same input | `DUPLICATE_AI_CALL — [file:line] — same prompt sent to [provider] without caching — add response cache` | Wasted tokens on redundant calls |
|
|
258
|
-
|
|
259
|
-
**Per-Operation Cost Awareness:**
|
|
260
|
-
|
|
261
|
-
When token tracking IS present, analyze the operation type breakdown:
|
|
262
|
-
|
|
263
|
-
```
|
|
264
|
-
Operation Type Avg Tokens Frequency Monthly Est.
|
|
265
|
-
─────────────────────────────────────────────────────────────
|
|
266
|
-
Chat (primary) 2,500 in/800 out high $X.XX
|
|
267
|
-
Background notes 500 in/200 out per-chat $X.XX
|
|
268
|
-
Summarization 1,500 in/300 out periodic $X.XX
|
|
269
|
-
Classification 200 in/50 out high $X.XX
|
|
270
|
-
─────────────────────────────────────────────────────────────
|
|
271
|
-
Total estimated monthly $X.XX
|
|
272
|
-
```
|
|
273
|
-
|
|
274
|
-
**Report this under a `### AI Token Budget` subsection** in the Perf Report. Only include when AI API usage detected — skip entirely for non-AI projects.
|
|
275
|
-
|
|
276
|
-
**Key insight**: The most impactful optimization is often **model selection per operation** — using a cheaper model for background tasks (summarization, classification, metadata extraction) while reserving expensive models for primary user-facing interactions. A 10x cost reduction on 60% of calls = 6x overall savings.
|
|
277
|
-
|
|
278
|
-
## Output Format
|
|
279
|
-
|
|
280
|
-
```
|
|
281
|
-
## Perf Report: src/api/users.ts, src/db/queries.ts
|
|
282
|
-
|
|
283
|
-
### BLOCK
|
|
284
|
-
- N+1_QUERY src/db/queries.ts:47 — loop over users with Order.find() inside — fix: use JOIN or prefetch — estimated: +200ms per 100 users
|
|
285
|
-
|
|
286
|
-
### WARN
|
|
287
|
-
- SYNC_IN_ASYNC src/api/users.ts:23 — readFileSync in async handler — fix: fs.promises.readFile
|
|
288
|
-
|
|
289
|
-
### PASS
|
|
290
|
-
- Memory leak patterns: clean
|
|
291
|
-
- Bundle analysis: N/A (backend project)
|
|
292
|
-
|
|
293
|
-
### Verdict: BLOCK
|
|
294
|
-
```
|
|
295
|
-
|
|
296
|
-
## Constraints
|
|
297
|
-
|
|
298
|
-
1. MUST cite file:line for every finding — "might be slow" without evidence is not a finding
|
|
299
|
-
2. MUST include estimated impact — impact-free findings are noise
|
|
300
|
-
3. MUST NOT fix code — perf investigates only, never edits files
|
|
301
|
-
4. MUST distinguish BLOCK (blocks merge) from WARN (should fix but doesn't block)
|
|
302
|
-
5. MUST run framework-specific checks for detected framework — not just generic patterns
|
|
303
|
-
|
|
304
|
-
## Mesh Gates (L1/L2 only)
|
|
305
|
-
|
|
306
|
-
| Gate | Requires | If Missing |
|
|
307
|
-
|------|----------|------------|
|
|
308
|
-
| Scope Gate | File list or scout result before scanning | Invoke scout to identify hotpath files |
|
|
309
|
-
| Evidence Gate | file:line + estimated impact for every BLOCK finding | Downgrade to WARN or remove finding |
|
|
310
|
-
| Framework Gate | Framework detected before framework-specific checks | Fall back to generic patterns only |
|
|
311
|
-
|
|
312
|
-
## Sharp Edges
|
|
313
|
-
|
|
314
|
-
Known failure modes for this skill. Check these before declaring done.
|
|
315
|
-
|
|
316
|
-
| Failure Mode | Severity | Mitigation |
|
|
317
|
-
|---|---|---|
|
|
318
|
-
| BLOCK finding without impact estimate | HIGH | Every BLOCK needs "estimated impact: X" — evidence gate enforces this |
|
|
319
|
-
| False N+1 on intentional batched loops | MEDIUM | Check if loop has a `batch_size` limiter or is already prefetched upstream |
|
|
320
|
-
| Skipping framework checks because framework not detected | MEDIUM | If scout returns unknown framework, run generic checks + note in report |
|
|
321
|
-
| Calling browser-pilot on backend-only project | LOW | Check project type in Step 1 — browser-pilot only for frontend/fullstack |
|
|
322
|
-
| Reporting WARN as BLOCK (severity inflation) | MEDIUM | BLOCK = measurable regression on hot path; WARN = pattern that could be slow |
|
|
323
|
-
|
|
324
|
-
## Done When
|
|
325
|
-
|
|
326
|
-
- All in-scope files analyzed for DB patterns, async/sync violations, memory leaks
|
|
327
|
-
- Framework-specific checks applied for detected framework
|
|
328
|
-
- Every finding has file:line + estimated impact
|
|
329
|
-
- Bundle analysis ran (frontend) or skipped with reason (backend)
|
|
330
|
-
- Benchmark scripts ran (if configured) or INFO: skipped
|
|
331
|
-
- Perf Report emitted with PASS/WARN/BLOCK verdict
|
|
332
|
-
|
|
333
|
-
## Returns
|
|
334
|
-
|
|
335
|
-
| Artifact | Format | Location |
|
|
336
|
-
|----------|--------|----------|
|
|
337
|
-
| Perf Report with verdict | Markdown (PASS/WARN/BLOCK) | inline |
|
|
338
|
-
| Per-finding details | Structured list (file:line + impact) | inline |
|
|
339
|
-
| Lighthouse scores (if ran) | Score table | inline |
|
|
340
|
-
| Framework-specific findings | Categorized list | inline |
|
|
341
|
-
|
|
342
|
-
## Cost Profile
|
|
343
|
-
|
|
344
|
-
~3000-8000 tokens input, ~500-1500 tokens output. Sonnet for pattern recognition.
|
|
345
|
-
|
|
346
|
-
**Scope guardrail:** perf investigates and reports only — it does not fix code. All fixes are delegated to `fix` (L2) after the report is reviewed.
|
|
1
|
+
---
|
|
2
|
+
name: perf
|
|
3
|
+
description: Performance regression gate. Detects N+1 queries, sync-in-async, missing indexes, memory leaks, and bundle bloat before they reach production.
|
|
4
|
+
metadata:
|
|
5
|
+
author: runedev
|
|
6
|
+
version: "0.3.0"
|
|
7
|
+
layer: L2
|
|
8
|
+
model: sonnet
|
|
9
|
+
group: quality
|
|
10
|
+
tools: "Read, Bash, Glob, Grep"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# perf
|
|
14
|
+
|
|
15
|
+
## Purpose
|
|
16
|
+
|
|
17
|
+
Performance regression gate. Analyzes code changes for patterns that cause measurable slowdowns — N+1 queries, sync operations in async handlers, unbounded DB queries, missing indexes, memory leaks, and bundle bloat. Not a profiler — a gate. Finds performance bugs with measurable/estimated impact before production, so developers fix them at the cheapest point in the cycle.
|
|
18
|
+
|
|
19
|
+
## Triggers
|
|
20
|
+
|
|
21
|
+
- `/rune perf` — manual invocation before commit
|
|
22
|
+
- Called by `cook` (L1): Phase 5 quality gate
|
|
23
|
+
- Called by `review` (L2): performance patterns detected in diff
|
|
24
|
+
- Called by `deploy` (L2): pre-deploy regression check
|
|
25
|
+
- Called by `audit` (L2): performance health dimension
|
|
26
|
+
|
|
27
|
+
## Calls (outbound)
|
|
28
|
+
|
|
29
|
+
- `scout` (L2): find hotpath files and identify framework in use
|
|
30
|
+
- `browser-pilot` (L3): run Lighthouse / Core Web Vitals for frontend projects
|
|
31
|
+
- `verification` (L3): run benchmark scripts if configured (e.g. `npm run bench`)
|
|
32
|
+
- `design` (L2): when Lighthouse Accessibility BLOCK — design system may lack a11y foundation
|
|
33
|
+
|
|
34
|
+
## Called By (inbound)
|
|
35
|
+
|
|
36
|
+
- `cook` (L1): Phase 5 quality gate before PR
|
|
37
|
+
- `audit` (L2): performance dimension delegation
|
|
38
|
+
- `review` (L2): performance patterns detected in diff
|
|
39
|
+
- `deploy` (L2): pre-deploy perf regression check
|
|
40
|
+
|
|
41
|
+
## References
|
|
42
|
+
|
|
43
|
+
- `references/cost-reference.md` — Cost priority hierarchy, quick wins checklist, instance right-sizing, data transfer traps, serverless optimization, observability cost control, managed vs self-hosted matrix, unit economics tracking. Load when cost analysis or FinOps context detected.
|
|
44
|
+
- `references/scalability-reference.md` — Bottleneck identification flow, performance thresholds, API patterns (cursor pagination, rate limiting, circuit breaker, graceful shutdown), caching strategies, queue-based load leveling, concurrency patterns, K8s HPA, CDN headers, load testing. Load when scaling or infrastructure optimization context detected.
|
|
45
|
+
|
|
46
|
+
## Executable Steps
|
|
47
|
+
|
|
48
|
+
### Step 1 — Scope
|
|
49
|
+
|
|
50
|
+
Determine what to analyze:
|
|
51
|
+
- If called with a file list or diff → analyze those files only
|
|
52
|
+
- If called standalone → invoke `scout` to identify top 10 hotpath files (entry points, routes, DB access layers, render-heavy components)
|
|
53
|
+
- Detect project type: **frontend** (React/Vue/Svelte) | **backend** (Node/Python/Go) | **fullstack** | **CLI**
|
|
54
|
+
|
|
55
|
+
### Step 2 — DB Query Patterns
|
|
56
|
+
|
|
57
|
+
Scan all in-scope files for:
|
|
58
|
+
|
|
59
|
+
**N+1 pattern** — loop containing ORM call:
|
|
60
|
+
```
|
|
61
|
+
# BAD: N+1
|
|
62
|
+
for user in users:
|
|
63
|
+
orders = Order.objects.filter(user=user) # N queries
|
|
64
|
+
|
|
65
|
+
# GOOD: prefetch
|
|
66
|
+
users = User.objects.prefetch_related('orders').all()
|
|
67
|
+
```
|
|
68
|
+
Finding: `N+1 DETECTED — [file:line] — loop over [collection] with [ORM call] inside — use prefetch/JOIN`
|
|
69
|
+
|
|
70
|
+
**Unbounded query** — no LIMIT/pagination:
|
|
71
|
+
```
|
|
72
|
+
# BAD
|
|
73
|
+
db.query("SELECT * FROM events")
|
|
74
|
+
|
|
75
|
+
# GOOD
|
|
76
|
+
db.query("SELECT * FROM events LIMIT 100 OFFSET ?", [offset])
|
|
77
|
+
```
|
|
78
|
+
Finding: `UNBOUNDED_QUERY — [file:line] — missing LIMIT on [table] — add pagination`
|
|
79
|
+
|
|
80
|
+
**SELECT \*** — fetching all columns when only some are needed:
|
|
81
|
+
Finding: `SELECT_STAR — [file:line] — select only needed columns`
|
|
82
|
+
|
|
83
|
+
### Step 3 — Async/Sync Violations
|
|
84
|
+
|
|
85
|
+
Scan for synchronous operations in async contexts:
|
|
86
|
+
|
|
87
|
+
**Blocking I/O in async handler:**
|
|
88
|
+
```javascript
|
|
89
|
+
// BAD: blocks event loop
|
|
90
|
+
async function handler(req) {
|
|
91
|
+
const data = fs.readFileSync('./config.json')
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// GOOD
|
|
95
|
+
async function handler(req) {
|
|
96
|
+
const data = await fs.promises.readFile('./config.json')
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
Finding: `SYNC_IN_ASYNC — [file:line] — [readFileSync|execSync|etc] in async function — blocks event loop`
|
|
100
|
+
|
|
101
|
+
**Missing await:**
|
|
102
|
+
```javascript
|
|
103
|
+
// BAD: fire-and-forget
|
|
104
|
+
async function save() {
|
|
105
|
+
db.insert(record) // no await
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
Finding: `MISSING_AWAIT — [file:line] — unresolved Promise may cause race condition`
|
|
109
|
+
|
|
110
|
+
### Step 4 — Memory Leak Patterns
|
|
111
|
+
|
|
112
|
+
Scan for:
|
|
113
|
+
|
|
114
|
+
**Event listener without cleanup:**
|
|
115
|
+
```javascript
|
|
116
|
+
// BAD: leak in React
|
|
117
|
+
useEffect(() => {
|
|
118
|
+
window.addEventListener('resize', handler)
|
|
119
|
+
// missing return cleanup
|
|
120
|
+
})
|
|
121
|
+
|
|
122
|
+
// GOOD
|
|
123
|
+
useEffect(() => {
|
|
124
|
+
window.addEventListener('resize', handler)
|
|
125
|
+
return () => window.removeEventListener('resize', handler)
|
|
126
|
+
}, [])
|
|
127
|
+
```
|
|
128
|
+
Finding: `MEMORY_LEAK — [file:line] — addEventListener without cleanup in useEffect`
|
|
129
|
+
|
|
130
|
+
**Growing collection without eviction:**
|
|
131
|
+
```python
|
|
132
|
+
# BAD: unbounded cache
|
|
133
|
+
cache = {}
|
|
134
|
+
def get(key):
|
|
135
|
+
if key not in cache:
|
|
136
|
+
cache[key] = expensive_compute(key)
|
|
137
|
+
return cache[key]
|
|
138
|
+
```
|
|
139
|
+
Finding: `UNBOUNDED_CACHE — [file:line] — dict grows indefinitely — add LRU eviction or TTL`
|
|
140
|
+
|
|
141
|
+
### Step 5 — Bundle Analysis (frontend only)
|
|
142
|
+
|
|
143
|
+
If project type is frontend:
|
|
144
|
+
- Check for large direct imports that block tree-shaking:
|
|
145
|
+
```javascript
|
|
146
|
+
// BAD: imports entire lodash
|
|
147
|
+
import _ from 'lodash'
|
|
148
|
+
// GOOD: named import
|
|
149
|
+
import { debounce } from 'lodash'
|
|
150
|
+
```
|
|
151
|
+
Finding: `BUNDLE_BLOAT — [file:line] — default import of [library] prevents tree-shaking`
|
|
152
|
+
- Check for missing React.memo / useMemo on expensive renders
|
|
153
|
+
- Check for component definitions inside render (recreated every render)
|
|
154
|
+
|
|
155
|
+
If `browser-pilot` is available and project has a URL: invoke it for Lighthouse score.
|
|
156
|
+
|
|
157
|
+
**Lighthouse Score Gates** (apply to any project with a public URL):
|
|
158
|
+
|
|
159
|
+
```
|
|
160
|
+
Performance: ≥ 90 → PASS | 70–89 → WARN | < 70 → BLOCK
|
|
161
|
+
Accessibility: ≥ 95 → PASS | 80–94 → WARN | < 80 → BLOCK
|
|
162
|
+
Best Practices: ≥ 90 → PASS | < 90 → WARN
|
|
163
|
+
SEO: ≥ 80 → PASS | < 80 → WARN (public-facing pages only)
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
**Core Web Vitals thresholds:**
|
|
167
|
+
```
|
|
168
|
+
LCP (Largest Contentful Paint):
|
|
169
|
+
≤ 2.5s → PASS | 2.5–4s → WARN | > 4s → BLOCK
|
|
170
|
+
|
|
171
|
+
INP (Interaction to Next Paint, replaces FID):
|
|
172
|
+
≤ 200ms → PASS | 200–500ms → WARN | > 500ms → BLOCK
|
|
173
|
+
|
|
174
|
+
CLS (Cumulative Layout Shift):
|
|
175
|
+
≤ 0.1 → PASS | 0.1–0.25 → WARN | > 0.25 → BLOCK
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
<HARD-GATE>
|
|
179
|
+
Lighthouse Accessibility score < 80 = BLOCK regardless of other scores.
|
|
180
|
+
Accessibility regressions are legal liability and cannot be auto-fixed by the AI.
|
|
181
|
+
Do NOT downgrade this gate.
|
|
182
|
+
</HARD-GATE>
|
|
183
|
+
|
|
184
|
+
If no URL available (dev-only environment): log `INFO: no URL for Lighthouse — run manually before deploy`
|
|
185
|
+
If Lighthouse MCP not installed: log `INFO: Lighthouse MCP not available — run lighthouse [url] --output json manually`
|
|
186
|
+
|
|
187
|
+
### Step 6 — Framework-Specific Checks
|
|
188
|
+
|
|
189
|
+
**React:**
|
|
190
|
+
- `useEffect` without dependency array → runs every render
|
|
191
|
+
- Expensive computation directly in render (not wrapped in useMemo)
|
|
192
|
+
- Component created inside another component body
|
|
193
|
+
|
|
194
|
+
**Node.js / Express:**
|
|
195
|
+
- `require()` calls inside route handlers (should be top-level)
|
|
196
|
+
- Missing connection pool config (default pool size = 1 on some ORMs)
|
|
197
|
+
- Synchronous crypto operations (use `crypto.subtle` async API)
|
|
198
|
+
|
|
199
|
+
**Python / Django:**
|
|
200
|
+
- Missing `select_related` / `prefetch_related` on ForeignKey traversal
|
|
201
|
+
- `len(queryset)` instead of `queryset.count()` (loads all rows)
|
|
202
|
+
- Celery tasks without `bind=True` retried without backoff
|
|
203
|
+
|
|
204
|
+
**SQL:**
|
|
205
|
+
- JOIN without index on join column
|
|
206
|
+
- WHERE on non-indexed column in large table
|
|
207
|
+
- Cartesian product (missing JOIN condition)
|
|
208
|
+
|
|
209
|
+
### Step 7 — Benchmark Execution
|
|
210
|
+
|
|
211
|
+
If project has benchmark scripts (detected via `package.json` scripts, `Makefile`, or `pytest-benchmark`):
|
|
212
|
+
- Invoke `verification` to run them
|
|
213
|
+
- Compare output to baseline if `.perf-baseline.json` exists
|
|
214
|
+
|
|
215
|
+
If no benchmarks configured: log `INFO: no benchmark scripts found — skipping`
|
|
216
|
+
|
|
217
|
+
### Step 8 — Report
|
|
218
|
+
|
|
219
|
+
Emit structured report:
|
|
220
|
+
|
|
221
|
+
```
|
|
222
|
+
## Perf Report: [scope]
|
|
223
|
+
|
|
224
|
+
### BLOCK (must fix before merge)
|
|
225
|
+
- [FINDING_TYPE] [file:line] — [description] — estimated impact: [Xms|X% bundle|X queries]
|
|
226
|
+
|
|
227
|
+
### WARN (should fix)
|
|
228
|
+
- [FINDING_TYPE] [file:line] — [description] — estimated impact: [...]
|
|
229
|
+
|
|
230
|
+
### PASS
|
|
231
|
+
- DB query patterns: clean
|
|
232
|
+
- Async/sync violations: none
|
|
233
|
+
- [etc.]
|
|
234
|
+
|
|
235
|
+
### Lighthouse (if ran)
|
|
236
|
+
- Performance: [score] [PASS|WARN|BLOCK]
|
|
237
|
+
- Accessibility: [score] [PASS|WARN|BLOCK]
|
|
238
|
+
- Best Practices: [score] [PASS|WARN]
|
|
239
|
+
- SEO: [score] [PASS|WARN]
|
|
240
|
+
- LCP: [Xs] [PASS|WARN|BLOCK] | INP: [Xms] [PASS|WARN|BLOCK] | CLS: [X] [PASS|WARN|BLOCK]
|
|
241
|
+
|
|
242
|
+
### Verdict: PASS | WARN | BLOCK
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### Step 8.5 — Token Budget Tracking (AI-Powered Apps)
|
|
246
|
+
|
|
247
|
+
For projects that call AI APIs (detected via imports of `anthropic`, `openai`, `@anthropic-ai/sdk`, `@ai-sdk/core`, `langchain`, `llamaindex`, or `fastmcp`), audit token usage patterns per operation type.
|
|
248
|
+
|
|
249
|
+
**Scan for:**
|
|
250
|
+
|
|
251
|
+
| Pattern | Finding | Impact |
|
|
252
|
+
|---------|---------|--------|
|
|
253
|
+
| AI call inside a loop without batching | `TOKEN_LOOP — [file:line] — AI call in loop over [collection] — batch or parallelize` | Cost scales linearly with collection size |
|
|
254
|
+
| No token usage tracking | `NO_TOKEN_TRACKING — [file:line] — AI response usage not captured — add cost logging` | Invisible spend, no budget control |
|
|
255
|
+
| Expensive model for simple tasks | `MODEL_MISMATCH — [file:line] — using [opus/gpt-4] for [classification/extraction] — use [haiku/gpt-4.1-mini]` | 10-30x cost difference for same result |
|
|
256
|
+
| Missing max_tokens on open-ended prompts | `UNBOUNDED_TOKENS — [file:line] — no max_tokens on [call] — add limit to prevent runaway cost` | Single call can consume entire budget |
|
|
257
|
+
| Duplicate AI calls for same input | `DUPLICATE_AI_CALL — [file:line] — same prompt sent to [provider] without caching — add response cache` | Wasted tokens on redundant calls |
|
|
258
|
+
|
|
259
|
+
**Per-Operation Cost Awareness:**
|
|
260
|
+
|
|
261
|
+
When token tracking IS present, analyze the operation type breakdown:
|
|
262
|
+
|
|
263
|
+
```
|
|
264
|
+
Operation Type Avg Tokens Frequency Monthly Est.
|
|
265
|
+
─────────────────────────────────────────────────────────────
|
|
266
|
+
Chat (primary) 2,500 in/800 out high $X.XX
|
|
267
|
+
Background notes 500 in/200 out per-chat $X.XX
|
|
268
|
+
Summarization 1,500 in/300 out periodic $X.XX
|
|
269
|
+
Classification 200 in/50 out high $X.XX
|
|
270
|
+
─────────────────────────────────────────────────────────────
|
|
271
|
+
Total estimated monthly $X.XX
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
**Report this under a `### AI Token Budget` subsection** in the Perf Report. Only include when AI API usage detected — skip entirely for non-AI projects.
|
|
275
|
+
|
|
276
|
+
**Key insight**: The most impactful optimization is often **model selection per operation** — using a cheaper model for background tasks (summarization, classification, metadata extraction) while reserving expensive models for primary user-facing interactions. A 10x cost reduction on 60% of calls = 6x overall savings.
|
|
277
|
+
|
|
278
|
+
## Output Format
|
|
279
|
+
|
|
280
|
+
```
|
|
281
|
+
## Perf Report: src/api/users.ts, src/db/queries.ts
|
|
282
|
+
|
|
283
|
+
### BLOCK
|
|
284
|
+
- N+1_QUERY src/db/queries.ts:47 — loop over users with Order.find() inside — fix: use JOIN or prefetch — estimated: +200ms per 100 users
|
|
285
|
+
|
|
286
|
+
### WARN
|
|
287
|
+
- SYNC_IN_ASYNC src/api/users.ts:23 — readFileSync in async handler — fix: fs.promises.readFile
|
|
288
|
+
|
|
289
|
+
### PASS
|
|
290
|
+
- Memory leak patterns: clean
|
|
291
|
+
- Bundle analysis: N/A (backend project)
|
|
292
|
+
|
|
293
|
+
### Verdict: BLOCK
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
## Constraints
|
|
297
|
+
|
|
298
|
+
1. MUST cite file:line for every finding — "might be slow" without evidence is not a finding
|
|
299
|
+
2. MUST include estimated impact — impact-free findings are noise
|
|
300
|
+
3. MUST NOT fix code — perf investigates only, never edits files
|
|
301
|
+
4. MUST distinguish BLOCK (blocks merge) from WARN (should fix but doesn't block)
|
|
302
|
+
5. MUST run framework-specific checks for detected framework — not just generic patterns
|
|
303
|
+
|
|
304
|
+
## Mesh Gates (L1/L2 only)
|
|
305
|
+
|
|
306
|
+
| Gate | Requires | If Missing |
|
|
307
|
+
|------|----------|------------|
|
|
308
|
+
| Scope Gate | File list or scout result before scanning | Invoke scout to identify hotpath files |
|
|
309
|
+
| Evidence Gate | file:line + estimated impact for every BLOCK finding | Downgrade to WARN or remove finding |
|
|
310
|
+
| Framework Gate | Framework detected before framework-specific checks | Fall back to generic patterns only |
|
|
311
|
+
|
|
312
|
+
## Sharp Edges
|
|
313
|
+
|
|
314
|
+
Known failure modes for this skill. Check these before declaring done.
|
|
315
|
+
|
|
316
|
+
| Failure Mode | Severity | Mitigation |
|
|
317
|
+
|---|---|---|
|
|
318
|
+
| BLOCK finding without impact estimate | HIGH | Every BLOCK needs "estimated impact: X" — evidence gate enforces this |
|
|
319
|
+
| False N+1 on intentional batched loops | MEDIUM | Check if loop has a `batch_size` limiter or is already prefetched upstream |
|
|
320
|
+
| Skipping framework checks because framework not detected | MEDIUM | If scout returns unknown framework, run generic checks + note in report |
|
|
321
|
+
| Calling browser-pilot on backend-only project | LOW | Check project type in Step 1 — browser-pilot only for frontend/fullstack |
|
|
322
|
+
| Reporting WARN as BLOCK (severity inflation) | MEDIUM | BLOCK = measurable regression on hot path; WARN = pattern that could be slow |
|
|
323
|
+
|
|
324
|
+
## Done When
|
|
325
|
+
|
|
326
|
+
- All in-scope files analyzed for DB patterns, async/sync violations, memory leaks
|
|
327
|
+
- Framework-specific checks applied for detected framework
|
|
328
|
+
- Every finding has file:line + estimated impact
|
|
329
|
+
- Bundle analysis ran (frontend) or skipped with reason (backend)
|
|
330
|
+
- Benchmark scripts ran (if configured) or INFO: skipped
|
|
331
|
+
- Perf Report emitted with PASS/WARN/BLOCK verdict
|
|
332
|
+
|
|
333
|
+
## Returns
|
|
334
|
+
|
|
335
|
+
| Artifact | Format | Location |
|
|
336
|
+
|----------|--------|----------|
|
|
337
|
+
| Perf Report with verdict | Markdown (PASS/WARN/BLOCK) | inline |
|
|
338
|
+
| Per-finding details | Structured list (file:line + impact) | inline |
|
|
339
|
+
| Lighthouse scores (if ran) | Score table | inline |
|
|
340
|
+
| Framework-specific findings | Categorized list | inline |
|
|
341
|
+
|
|
342
|
+
## Cost Profile
|
|
343
|
+
|
|
344
|
+
~3000-8000 tokens input, ~500-1500 tokens output. Sonnet for pattern recognition.
|
|
345
|
+
|
|
346
|
+
**Scope guardrail:** perf investigates and reports only — it does not fix code. All fixes are delegated to `fix` (L2) after the report is reviewed.
|