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