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