@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.
Files changed (287) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +68 -34
  3. package/agents/adversary.md +27 -0
  4. package/agents/architect.md +19 -29
  5. package/agents/asset-creator.md +18 -4
  6. package/agents/audit.md +25 -4
  7. package/agents/autopsy.md +19 -4
  8. package/agents/ba.md +35 -0
  9. package/agents/brainstorm.md +31 -4
  10. package/agents/browser-pilot.md +21 -4
  11. package/agents/coder.md +21 -29
  12. package/agents/completion-gate.md +20 -4
  13. package/agents/constraint-check.md +18 -4
  14. package/agents/context-engine.md +22 -4
  15. package/agents/context-pack.md +32 -0
  16. package/agents/cook.md +41 -4
  17. package/agents/db.md +19 -4
  18. package/agents/debug.md +33 -4
  19. package/agents/dependency-doctor.md +20 -4
  20. package/agents/deploy.md +27 -4
  21. package/agents/design.md +22 -4
  22. package/agents/doc-processor.md +27 -0
  23. package/agents/docs-seeker.md +19 -4
  24. package/agents/docs.md +31 -0
  25. package/agents/fix.md +37 -4
  26. package/agents/git.md +29 -0
  27. package/agents/hallucination-guard.md +20 -4
  28. package/agents/incident.md +21 -4
  29. package/agents/integrity-check.md +18 -4
  30. package/agents/journal.md +19 -4
  31. package/agents/launch.md +32 -4
  32. package/agents/logic-guardian.md +26 -11
  33. package/agents/marketing.md +23 -4
  34. package/agents/mcp-builder.md +26 -0
  35. package/agents/neural-memory.md +30 -0
  36. package/agents/onboard.md +22 -4
  37. package/agents/perf.md +21 -4
  38. package/agents/plan.md +29 -4
  39. package/agents/preflight.md +22 -4
  40. package/agents/problem-solver.md +20 -4
  41. package/agents/rescue.md +23 -4
  42. package/agents/research.md +19 -4
  43. package/agents/researcher.md +19 -29
  44. package/agents/retro.md +32 -0
  45. package/agents/review-intake.md +20 -4
  46. package/agents/review.md +32 -4
  47. package/agents/reviewer.md +20 -28
  48. package/agents/safeguard.md +19 -4
  49. package/agents/sast.md +18 -4
  50. package/agents/scaffold.md +41 -0
  51. package/agents/scanner.md +19 -28
  52. package/agents/scope-guard.md +18 -4
  53. package/agents/scout.md +23 -4
  54. package/agents/sentinel-env.md +26 -0
  55. package/agents/sentinel.md +33 -4
  56. package/agents/sequential-thinking.md +20 -4
  57. package/agents/session-bridge.md +24 -4
  58. package/agents/skill-forge.md +22 -4
  59. package/agents/skill-router.md +26 -4
  60. package/agents/slides.md +24 -0
  61. package/agents/surgeon.md +19 -4
  62. package/agents/team.md +30 -4
  63. package/agents/test.md +36 -4
  64. package/agents/trend-scout.md +17 -4
  65. package/agents/verification.md +20 -4
  66. package/agents/video-creator.md +20 -4
  67. package/agents/watchdog.md +19 -4
  68. package/agents/worktree.md +17 -4
  69. package/commands/rune.md +168 -168
  70. package/compiler/__tests__/analytics.test.js +370 -0
  71. package/compiler/adapters/openclaw.js +2 -2
  72. package/compiler/analytics.js +385 -0
  73. package/compiler/bin/rune.js +68 -2
  74. package/compiler/dashboard.js +883 -0
  75. package/compiler/transforms/branding.js +1 -1
  76. package/contexts/dev.md +34 -34
  77. package/contexts/research.md +43 -43
  78. package/contexts/review.md +55 -55
  79. package/extensions/ai-ml/PACK.md +88 -88
  80. package/extensions/ai-ml/skills/ai-agents.md +172 -172
  81. package/extensions/ai-ml/skills/code-sandbox.md +187 -187
  82. package/extensions/ai-ml/skills/deep-research.md +146 -146
  83. package/extensions/ai-ml/skills/embedding-search.md +66 -66
  84. package/extensions/ai-ml/skills/fine-tuning-guide.md +74 -74
  85. package/extensions/ai-ml/skills/llm-architect.md +125 -125
  86. package/extensions/ai-ml/skills/llm-integration.md +64 -64
  87. package/extensions/ai-ml/skills/prompt-patterns.md +72 -72
  88. package/extensions/ai-ml/skills/rag-patterns.md +66 -66
  89. package/extensions/ai-ml/skills/web-extraction.md +114 -114
  90. package/extensions/analytics/PACK.md +92 -92
  91. package/extensions/analytics/skills/ab-testing.md +72 -72
  92. package/extensions/analytics/skills/dashboard-patterns.md +83 -83
  93. package/extensions/analytics/skills/data-validation.md +68 -68
  94. package/extensions/analytics/skills/funnel-analysis.md +81 -81
  95. package/extensions/analytics/skills/sql-patterns.md +57 -57
  96. package/extensions/analytics/skills/statistical-analysis.md +79 -79
  97. package/extensions/analytics/skills/tracking-setup.md +71 -71
  98. package/extensions/backend/PACK.md +104 -104
  99. package/extensions/backend/skills/api-patterns.md +84 -84
  100. package/extensions/backend/skills/async-pipeline.md +193 -193
  101. package/extensions/backend/skills/auth-patterns.md +97 -97
  102. package/extensions/backend/skills/background-jobs.md +133 -133
  103. package/extensions/backend/skills/caching-patterns.md +108 -108
  104. package/extensions/backend/skills/cli-generation.md +133 -133
  105. package/extensions/backend/skills/database-patterns.md +87 -87
  106. package/extensions/backend/skills/middleware-patterns.md +104 -104
  107. package/extensions/chrome-ext/PACK.md +93 -93
  108. package/extensions/chrome-ext/skills/cws-preflight.md +143 -143
  109. package/extensions/chrome-ext/skills/cws-publish.md +104 -104
  110. package/extensions/chrome-ext/skills/ext-ai-integration.md +251 -251
  111. package/extensions/chrome-ext/skills/ext-messaging.md +139 -139
  112. package/extensions/chrome-ext/skills/ext-storage.md +133 -133
  113. package/extensions/chrome-ext/skills/mv3-scaffold.md +164 -164
  114. package/extensions/content/PACK.md +96 -96
  115. package/extensions/content/skills/blog-patterns.md +88 -88
  116. package/extensions/content/skills/cms-integration.md +131 -131
  117. package/extensions/content/skills/content-scoring.md +107 -107
  118. package/extensions/content/skills/i18n.md +83 -83
  119. package/extensions/content/skills/mdx-authoring.md +137 -137
  120. package/extensions/content/skills/reference.md +1014 -1014
  121. package/extensions/content/skills/seo-patterns.md +67 -67
  122. package/extensions/content/skills/video-repurpose.md +153 -153
  123. package/extensions/devops/PACK.md +101 -101
  124. package/extensions/devops/skills/chaos-testing.md +67 -67
  125. package/extensions/devops/skills/ci-cd.md +75 -75
  126. package/extensions/devops/skills/docker.md +58 -58
  127. package/extensions/devops/skills/edge-serverless.md +163 -163
  128. package/extensions/devops/skills/infra-as-code.md +158 -158
  129. package/extensions/devops/skills/kubernetes.md +110 -110
  130. package/extensions/devops/skills/monitoring.md +57 -57
  131. package/extensions/devops/skills/server-setup.md +64 -64
  132. package/extensions/devops/skills/ssl-domain.md +42 -42
  133. package/extensions/ecommerce/PACK.md +116 -116
  134. package/extensions/ecommerce/skills/cart-system.md +79 -79
  135. package/extensions/ecommerce/skills/inventory-mgmt.md +102 -102
  136. package/extensions/ecommerce/skills/order-management.md +126 -126
  137. package/extensions/ecommerce/skills/payment-integration.md +472 -472
  138. package/extensions/ecommerce/skills/shopify-dev.md +69 -69
  139. package/extensions/ecommerce/skills/subscription-billing.md +93 -93
  140. package/extensions/ecommerce/skills/tax-compliance.md +117 -117
  141. package/extensions/gamedev/PACK.md +142 -142
  142. package/extensions/gamedev/skills/asset-pipeline.md +74 -74
  143. package/extensions/gamedev/skills/audio-system.md +129 -129
  144. package/extensions/gamedev/skills/camera-system.md +87 -87
  145. package/extensions/gamedev/skills/ecs.md +98 -98
  146. package/extensions/gamedev/skills/game-loops.md +72 -72
  147. package/extensions/gamedev/skills/input-system.md +199 -199
  148. package/extensions/gamedev/skills/multiplayer.md +180 -180
  149. package/extensions/gamedev/skills/particles.md +105 -105
  150. package/extensions/gamedev/skills/physics-engine.md +89 -89
  151. package/extensions/gamedev/skills/scene-management.md +146 -146
  152. package/extensions/gamedev/skills/threejs-patterns.md +90 -90
  153. package/extensions/gamedev/skills/webgl.md +71 -71
  154. package/extensions/mobile/PACK.md +106 -106
  155. package/extensions/mobile/skills/app-store-connect.md +152 -152
  156. package/extensions/mobile/skills/app-store-prep.md +66 -66
  157. package/extensions/mobile/skills/deep-linking.md +109 -109
  158. package/extensions/mobile/skills/flutter.md +60 -60
  159. package/extensions/mobile/skills/ios-build-pipeline.md +142 -142
  160. package/extensions/mobile/skills/native-bridge.md +66 -66
  161. package/extensions/mobile/skills/ota-updates.md +97 -97
  162. package/extensions/mobile/skills/push-notifications.md +111 -111
  163. package/extensions/mobile/skills/react-native.md +82 -82
  164. package/extensions/saas/PACK.md +116 -116
  165. package/extensions/saas/skills/billing-integration.md +200 -200
  166. package/extensions/saas/skills/feature-flags.md +130 -130
  167. package/extensions/saas/skills/multi-tenant.md +103 -103
  168. package/extensions/saas/skills/onboarding-flow.md +139 -139
  169. package/extensions/saas/skills/subscription-flow.md +95 -95
  170. package/extensions/saas/skills/team-management.md +144 -144
  171. package/extensions/security/PACK.md +99 -99
  172. package/extensions/security/skills/api-security.md +140 -140
  173. package/extensions/security/skills/compliance.md +68 -68
  174. package/extensions/security/skills/owasp-audit.md +64 -64
  175. package/extensions/security/skills/pentest-patterns.md +77 -77
  176. package/extensions/security/skills/secret-mgmt.md +65 -65
  177. package/extensions/security/skills/supply-chain.md +65 -65
  178. package/extensions/trading/PACK.md +80 -80
  179. package/extensions/trading/skills/chart-components.md +55 -55
  180. package/extensions/trading/skills/experiment-loop.md +125 -125
  181. package/extensions/trading/skills/fintech-patterns.md +47 -47
  182. package/extensions/trading/skills/indicator-library.md +58 -58
  183. package/extensions/trading/skills/quant-analysis.md +111 -111
  184. package/extensions/trading/skills/realtime-data.md +58 -58
  185. package/extensions/trading/skills/trade-logic.md +104 -104
  186. package/extensions/ui/PACK.md +130 -130
  187. package/extensions/ui/skills/a11y-audit.md +91 -91
  188. package/extensions/ui/skills/animation-patterns.md +127 -106
  189. package/extensions/ui/skills/component-patterns.md +100 -75
  190. package/extensions/ui/skills/design-decision.md +108 -108
  191. package/extensions/ui/skills/design-system.md +68 -68
  192. package/extensions/ui/skills/landing-patterns.md +155 -155
  193. package/extensions/ui/skills/palette-picker.md +173 -173
  194. package/extensions/ui/skills/react-health.md +90 -90
  195. package/extensions/ui/skills/type-system.md +125 -125
  196. package/extensions/ui/skills/web-vitals.md +153 -153
  197. package/extensions/zalo/PACK.md +145 -145
  198. package/extensions/zalo/skills/zalo-oa-mcp.md +317 -317
  199. package/extensions/zalo/skills/zalo-oa-messaging.md +429 -429
  200. package/extensions/zalo/skills/zalo-oa-setup.md +236 -236
  201. package/extensions/zalo/skills/zalo-oa-webhook.md +189 -189
  202. package/extensions/zalo/skills/zalo-personal-messaging.md +194 -194
  203. package/extensions/zalo/skills/zalo-personal-setup.md +153 -153
  204. package/extensions/zalo/skills/zalo-rate-guard.md +219 -219
  205. package/hooks/auto-format/index.cjs +48 -48
  206. package/hooks/context-watch/index.cjs +95 -68
  207. package/hooks/hooks.json +111 -111
  208. package/hooks/metrics-collector/index.cjs +86 -42
  209. package/hooks/post-session-reflect/index.cjs +189 -153
  210. package/hooks/pre-compact/index.cjs +95 -95
  211. package/hooks/run-hook.cmd +1 -1
  212. package/hooks/secrets-scan/index.cjs +100 -100
  213. package/hooks/session-start/index.cjs +71 -65
  214. package/hooks/typecheck/index.cjs +65 -65
  215. package/package.json +63 -63
  216. package/references/ui-pro-max-data/LICENSE-UI-PRO-MAX +21 -21
  217. package/references/ui-pro-max-data/charts.csv +26 -26
  218. package/references/ui-pro-max-data/colors.csv +161 -161
  219. package/references/ui-pro-max-data/styles.csv +68 -68
  220. package/references/ui-pro-max-data/typography.csv +74 -74
  221. package/references/ui-pro-max-data/ui-reasoning.csv +162 -162
  222. package/references/ui-pro-max-data/ux-guidelines.csv +99 -99
  223. package/skills/adversary/SKILL.md +283 -283
  224. package/skills/asset-creator/SKILL.md +157 -157
  225. package/skills/audit/SKILL.md +148 -2
  226. package/skills/autopsy/SKILL.md +335 -259
  227. package/skills/autopsy/references/repo-analysis-patterns.md +113 -0
  228. package/skills/ba/SKILL.md +72 -2
  229. package/skills/brainstorm/SKILL.md +342 -341
  230. package/skills/browser-pilot/SKILL.md +168 -168
  231. package/skills/constraint-check/SKILL.md +165 -165
  232. package/skills/context-engine/SKILL.md +404 -404
  233. package/skills/cook/SKILL.md +917 -834
  234. package/skills/cook/references/output-format.md +33 -0
  235. package/skills/db/SKILL.md +273 -272
  236. package/skills/debug/SKILL.md +465 -443
  237. package/skills/dependency-doctor/SKILL.md +265 -235
  238. package/skills/deploy/SKILL.md +274 -231
  239. package/skills/design/DESIGN-REFERENCE.md +365 -365
  240. package/skills/design/SKILL.md +589 -482
  241. package/skills/doc-processor/SKILL.md +254 -254
  242. package/skills/docs/SKILL.md +374 -373
  243. package/skills/docs-seeker/SKILL.md +177 -177
  244. package/skills/fix/SKILL.md +330 -308
  245. package/skills/git/SKILL.md +339 -339
  246. package/skills/graft/SKILL.md +352 -0
  247. package/skills/graft/references/challenge-framework.md +98 -0
  248. package/skills/graft/references/mode-decision.md +44 -0
  249. package/skills/hallucination-guard/SKILL.md +219 -219
  250. package/skills/incident/SKILL.md +254 -251
  251. package/skills/integrity-check/SKILL.md +169 -169
  252. package/skills/journal/SKILL.md +240 -238
  253. package/skills/launch/SKILL.md +344 -342
  254. package/skills/logic-guardian/SKILL.md +251 -251
  255. package/skills/marketing/SKILL.md +290 -245
  256. package/skills/mcp-builder/SKILL.md +425 -423
  257. package/skills/mcp-builder/references/auto-discovery-pattern.md +169 -0
  258. package/skills/neural-memory/SKILL.md +362 -362
  259. package/skills/onboard/SKILL.md +404 -403
  260. package/skills/perf/SKILL.md +346 -346
  261. package/skills/plan/SKILL.md +433 -370
  262. package/skills/plan/references/feature-map.md +84 -0
  263. package/skills/preflight/SKILL.md +415 -396
  264. package/skills/problem-solver/SKILL.md +380 -284
  265. package/skills/rescue/SKILL.md +474 -450
  266. package/skills/retro/SKILL.md +5 -1
  267. package/skills/review/SKILL.md +612 -535
  268. package/skills/review-intake/SKILL.md +249 -249
  269. package/skills/safeguard/SKILL.md +200 -200
  270. package/skills/sast/SKILL.md +190 -190
  271. package/skills/scaffold/SKILL.md +328 -286
  272. package/skills/scope-guard/SKILL.md +180 -162
  273. package/skills/scout/SKILL.md +263 -263
  274. package/skills/sentinel/SKILL.md +382 -353
  275. package/skills/sentinel-env/SKILL.md +254 -254
  276. package/skills/sequential-thinking/SKILL.md +234 -234
  277. package/skills/session-bridge/SKILL.md +543 -397
  278. package/skills/skill-forge/SKILL.md +581 -539
  279. package/skills/skill-router/{skill.md → SKILL.md} +30 -2
  280. package/skills/surgeon/SKILL.md +215 -215
  281. package/skills/team/SKILL.md +556 -514
  282. package/skills/test/SKILL.md +614 -587
  283. package/skills/trend-scout/SKILL.md +145 -145
  284. package/skills/verification/SKILL.md +326 -325
  285. package/skills/video-creator/SKILL.md +201 -201
  286. package/skills/watchdog/SKILL.md +168 -168
  287. package/skills/worktree/SKILL.md +140 -140
@@ -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.