@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,125 +1,125 @@
1
- ---
2
- name: "type-system"
3
- pack: "@rune/ui"
4
- description: "Typography pairing database — 22 font pairings organized by product vibe. Each pairing includes Google Fonts URL, Tailwind config, size scale from display to caption, weight mapping, and line height ratios."
5
- model: sonnet
6
- tools: [Read, Edit, Write, Grep, Glob, Bash]
7
- ---
8
-
9
- # type-system
10
-
11
- Typography pairing database — 22 font pairings organized by product vibe. Each pairing includes Google Fonts URL, Tailwind config, size scale from display to caption, weight mapping, and line height ratios. Decision tree maps product type and tone to the right pairing.
12
-
13
- #### Workflow
14
-
15
- **Step 1 — Detect product tone**
16
- Read `CLAUDE.md` or ask: "What is the product tone?" Classify: modern-tech | editorial | playful | corporate | developer | luxury | humanist | brutalist | minimal.
17
-
18
- **Step 2 — Recommend pairing**
19
- Apply the decision tree. Output the top 2 pairings with rationale (brand signal, readability score, Google Fonts load weight).
20
-
21
- **Step 3 — Generate @font-face / config**
22
- Emit the `<link>` preconnect + stylesheet tag for Google Fonts. Emit Tailwind `fontFamily` config. Emit a CSS type scale (`--text-display` through `--text-caption`).
23
-
24
- **Step 4 — Verify readability**
25
- Check: body size ≥ 14px, line-height ≥ 1.5 for body, ≤ 1.25 for headings. Flag any contrast failure using the project's background token.
26
-
27
- #### Decision Tree
28
-
29
- ```
30
- Product Tone → Pairing
31
- ──────────────────────────────────────────────────────────
32
- modern tech / saas → Space Grotesk + Inter
33
- editorial / blog → Playfair Display + Source Serif 4
34
- playful / kids / app → Fredoka + Nunito
35
- corporate / enterprise→ IBM Plex Sans + IBM Plex Serif
36
- developer tools / CLI → JetBrains Mono + Inter
37
- luxury / fashion → Cormorant Garamond + Montserrat
38
- humanist / health → DM Sans + DM Serif Display
39
- brutalist / bold → Bebas Neue + IBM Plex Mono
40
- minimal / productivity→ Inter + Inter (weight-only hierarchy)
41
- gaming / esports → Rajdhani + Exo 2
42
- ```
43
-
44
- #### Pairing Reference
45
-
46
- ```html
47
- <!-- Space Grotesk + Inter (modern-tech / saas) -->
48
- <link rel="preconnect" href="https://fonts.googleapis.com">
49
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
50
- <link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
51
-
52
- <!-- Playfair Display + Source Serif 4 (editorial) -->
53
- <link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,700;1,400&family=Source+Serif+4:wght@400;600&display=swap" rel="stylesheet">
54
-
55
- <!-- Fredoka + Nunito (playful) -->
56
- <link href="https://fonts.googleapis.com/css2?family=Fredoka:wght@400;600;700&family=Nunito:wght@400;600&display=swap" rel="stylesheet">
57
-
58
- <!-- IBM Plex Sans + IBM Plex Serif (corporate) -->
59
- <link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500;600&family=IBM+Plex+Serif:wght@400;600&display=swap" rel="stylesheet">
60
-
61
- <!-- JetBrains Mono + Inter (developer tools) -->
62
- <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;700&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
63
-
64
- <!-- Cormorant Garamond + Montserrat (luxury) -->
65
- <link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,600;1,400&family=Montserrat:wght@400;500;700&display=swap" rel="stylesheet">
66
-
67
- <!-- DM Sans + DM Serif Display (humanist / health) -->
68
- <link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600&family=DM+Serif+Display&display=swap" rel="stylesheet">
69
- ```
70
-
71
- ```css
72
- /* Type scale — Space Grotesk + Inter pairing */
73
- :root {
74
- --font-display: 'Space Grotesk', system-ui, sans-serif;
75
- --font-body: 'Inter', system-ui, sans-serif;
76
- --font-mono: 'JetBrains Mono', monospace;
77
-
78
- /* Scale */
79
- --text-display: clamp(2.5rem, 5vw, 4.5rem); /* 40–72px */
80
- --text-h1: clamp(2rem, 4vw, 2.5rem); /* 32–40px */
81
- --text-h2: clamp(1.375rem, 2.5vw, 1.75rem); /* 22–28px */
82
- --text-h3: 1.125rem; /* 18px */
83
- --text-body: 1rem; /* 16px */
84
- --text-small: 0.875rem; /* 14px */
85
- --text-caption: 0.75rem; /* 12px */
86
-
87
- /* Leading */
88
- --leading-tight: 1.2;
89
- --leading-snug: 1.35;
90
- --leading-normal: 1.5;
91
- --leading-relaxed:1.75;
92
- }
93
-
94
- h1, h2, h3 { font-family: var(--font-display); line-height: var(--leading-tight); }
95
- body { font-family: var(--font-body); line-height: var(--leading-normal); }
96
- code, pre { font-family: var(--font-mono); }
97
-
98
- /* Financial numbers — always mono + bold */
99
- .number, .price, .stat {
100
- font-family: var(--font-mono);
101
- font-weight: 700;
102
- font-variant-numeric: tabular-nums;
103
- }
104
- ```
105
-
106
- ```js
107
- // tailwind.config.js — font pairing extension
108
- module.exports = {
109
- theme: {
110
- extend: {
111
- fontFamily: {
112
- display: ['Space Grotesk', 'system-ui', 'sans-serif'],
113
- body: ['Inter', 'system-ui', 'sans-serif'],
114
- mono: ['JetBrains Mono','monospace'],
115
- },
116
- fontSize: {
117
- 'display': ['clamp(2.5rem, 5vw, 4.5rem)', { lineHeight: '1.1' }],
118
- 'h1': ['clamp(2rem, 4vw, 2.5rem)', { lineHeight: '1.2' }],
119
- 'h2': ['1.75rem', { lineHeight: '1.3' }],
120
- 'h3': ['1.125rem', { lineHeight: '1.4' }],
121
- }
122
- }
123
- }
124
- }
125
- ```
1
+ ---
2
+ name: "type-system"
3
+ pack: "@rune/ui"
4
+ description: "Typography pairing database — 22 font pairings organized by product vibe. Each pairing includes Google Fonts URL, Tailwind config, size scale from display to caption, weight mapping, and line height ratios."
5
+ model: sonnet
6
+ tools: [Read, Edit, Write, Grep, Glob, Bash]
7
+ ---
8
+
9
+ # type-system
10
+
11
+ Typography pairing database — 22 font pairings organized by product vibe. Each pairing includes Google Fonts URL, Tailwind config, size scale from display to caption, weight mapping, and line height ratios. Decision tree maps product type and tone to the right pairing.
12
+
13
+ #### Workflow
14
+
15
+ **Step 1 — Detect product tone**
16
+ Read `CLAUDE.md` or ask: "What is the product tone?" Classify: modern-tech | editorial | playful | corporate | developer | luxury | humanist | brutalist | minimal.
17
+
18
+ **Step 2 — Recommend pairing**
19
+ Apply the decision tree. Output the top 2 pairings with rationale (brand signal, readability score, Google Fonts load weight).
20
+
21
+ **Step 3 — Generate @font-face / config**
22
+ Emit the `<link>` preconnect + stylesheet tag for Google Fonts. Emit Tailwind `fontFamily` config. Emit a CSS type scale (`--text-display` through `--text-caption`).
23
+
24
+ **Step 4 — Verify readability**
25
+ Check: body size ≥ 14px, line-height ≥ 1.5 for body, ≤ 1.25 for headings. Flag any contrast failure using the project's background token.
26
+
27
+ #### Decision Tree
28
+
29
+ ```
30
+ Product Tone → Pairing
31
+ ──────────────────────────────────────────────────────────
32
+ modern tech / saas → Space Grotesk + Inter
33
+ editorial / blog → Playfair Display + Source Serif 4
34
+ playful / kids / app → Fredoka + Nunito
35
+ corporate / enterprise→ IBM Plex Sans + IBM Plex Serif
36
+ developer tools / CLI → JetBrains Mono + Inter
37
+ luxury / fashion → Cormorant Garamond + Montserrat
38
+ humanist / health → DM Sans + DM Serif Display
39
+ brutalist / bold → Bebas Neue + IBM Plex Mono
40
+ minimal / productivity→ Inter + Inter (weight-only hierarchy)
41
+ gaming / esports → Rajdhani + Exo 2
42
+ ```
43
+
44
+ #### Pairing Reference
45
+
46
+ ```html
47
+ <!-- Space Grotesk + Inter (modern-tech / saas) -->
48
+ <link rel="preconnect" href="https://fonts.googleapis.com">
49
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
50
+ <link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
51
+
52
+ <!-- Playfair Display + Source Serif 4 (editorial) -->
53
+ <link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,700;1,400&family=Source+Serif+4:wght@400;600&display=swap" rel="stylesheet">
54
+
55
+ <!-- Fredoka + Nunito (playful) -->
56
+ <link href="https://fonts.googleapis.com/css2?family=Fredoka:wght@400;600;700&family=Nunito:wght@400;600&display=swap" rel="stylesheet">
57
+
58
+ <!-- IBM Plex Sans + IBM Plex Serif (corporate) -->
59
+ <link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500;600&family=IBM+Plex+Serif:wght@400;600&display=swap" rel="stylesheet">
60
+
61
+ <!-- JetBrains Mono + Inter (developer tools) -->
62
+ <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;700&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
63
+
64
+ <!-- Cormorant Garamond + Montserrat (luxury) -->
65
+ <link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,600;1,400&family=Montserrat:wght@400;500;700&display=swap" rel="stylesheet">
66
+
67
+ <!-- DM Sans + DM Serif Display (humanist / health) -->
68
+ <link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600&family=DM+Serif+Display&display=swap" rel="stylesheet">
69
+ ```
70
+
71
+ ```css
72
+ /* Type scale — Space Grotesk + Inter pairing */
73
+ :root {
74
+ --font-display: 'Space Grotesk', system-ui, sans-serif;
75
+ --font-body: 'Inter', system-ui, sans-serif;
76
+ --font-mono: 'JetBrains Mono', monospace;
77
+
78
+ /* Scale */
79
+ --text-display: clamp(2.5rem, 5vw, 4.5rem); /* 40–72px */
80
+ --text-h1: clamp(2rem, 4vw, 2.5rem); /* 32–40px */
81
+ --text-h2: clamp(1.375rem, 2.5vw, 1.75rem); /* 22–28px */
82
+ --text-h3: 1.125rem; /* 18px */
83
+ --text-body: 1rem; /* 16px */
84
+ --text-small: 0.875rem; /* 14px */
85
+ --text-caption: 0.75rem; /* 12px */
86
+
87
+ /* Leading */
88
+ --leading-tight: 1.2;
89
+ --leading-snug: 1.35;
90
+ --leading-normal: 1.5;
91
+ --leading-relaxed:1.75;
92
+ }
93
+
94
+ h1, h2, h3 { font-family: var(--font-display); line-height: var(--leading-tight); }
95
+ body { font-family: var(--font-body); line-height: var(--leading-normal); }
96
+ code, pre { font-family: var(--font-mono); }
97
+
98
+ /* Financial numbers — always mono + bold */
99
+ .number, .price, .stat {
100
+ font-family: var(--font-mono);
101
+ font-weight: 700;
102
+ font-variant-numeric: tabular-nums;
103
+ }
104
+ ```
105
+
106
+ ```js
107
+ // tailwind.config.js — font pairing extension
108
+ module.exports = {
109
+ theme: {
110
+ extend: {
111
+ fontFamily: {
112
+ display: ['Space Grotesk', 'system-ui', 'sans-serif'],
113
+ body: ['Inter', 'system-ui', 'sans-serif'],
114
+ mono: ['JetBrains Mono','monospace'],
115
+ },
116
+ fontSize: {
117
+ 'display': ['clamp(2.5rem, 5vw, 4.5rem)', { lineHeight: '1.1' }],
118
+ 'h1': ['clamp(2rem, 4vw, 2.5rem)', { lineHeight: '1.2' }],
119
+ 'h2': ['1.75rem', { lineHeight: '1.3' }],
120
+ 'h3': ['1.125rem', { lineHeight: '1.4' }],
121
+ }
122
+ }
123
+ }
124
+ }
125
+ ```
@@ -1,153 +1,153 @@
1
- ---
2
- name: "web-vitals"
3
- pack: "@rune/ui"
4
- description: "Core Web Vitals performance audit — measures LCP, CLS, FCP, TBT, INP, and Speed Index against Google thresholds. Identifies render-blocking resources, network dependency chains, layout shift culprits, missing preloads, caching gaps, and tree-shaking opportunities."
5
- model: sonnet
6
- tools: [Read, Edit, Write, Grep, Glob, Bash]
7
- ---
8
-
9
- # web-vitals
10
-
11
- Core Web Vitals performance audit — measures LCP, CLS, FCP, TBT, INP, and Speed Index against Google thresholds. Identifies render-blocking resources, network dependency chains, layout shift culprits, missing preloads, caching gaps, and tree-shaking opportunities. Framework-aware analysis for Next.js, Vite, SvelteKit, and Astro.
12
-
13
- #### Workflow
14
-
15
- **Step 1 — Detect build tooling and framework**
16
- Read `package.json`, config files (`next.config.*`, `vite.config.*`, `svelte.config.*`, `astro.config.*`), and build scripts. Identify:
17
- - Bundler: Webpack, Vite, Rollup, esbuild, Turbopack
18
- - Framework: Next.js (App Router vs Pages), SvelteKit, Astro, Remix
19
- - CSS strategy: Tailwind (content config), CSS Modules, global CSS
20
- - Compression: gzip/brotli configuration
21
- - Source maps: enabled in production? (should be external or disabled)
22
-
23
- **Step 2 — Audit render-blocking resources**
24
- Use Grep to scan HTML entry points and framework layouts for:
25
- - `<link rel="stylesheet">` in `<head>` without `media` attribute — blocks first paint
26
- - `<script>` tags without `async` or `defer` — blocks HTML parsing
27
- - CSS `@import` chains — each import is a sequential network request
28
- - Large inline `<style>` blocks (>50KB) — delays first paint
29
-
30
- For each blocking resource, estimate impact: 0ms impact = note but don't prioritize. Focus on resources that delay FCP by >100ms.
31
-
32
- **Step 3 — Analyze layout shift sources (CLS)**
33
- Use Grep to find common CLS culprits:
34
- - `<img>` and `<video>` without explicit `width` and `height` attributes — causes layout shift when media loads
35
- - Dynamic content injection above the fold (`insertBefore`, `prepend`, or React `useState` toggling visibility)
36
- - Web fonts without `font-display: swap` or `font-display: optional` — FOIT causes text layout shift
37
- - Ads or embeds without reserved space (`aspect-ratio` or `min-height` on container)
38
- - CSS animations that trigger layout (`top`, `left`, `width`, `height`) instead of composited properties (`transform`, `opacity`)
39
-
40
- #### CLS Fix Patterns
41
-
42
- ```html
43
- <!-- BEFORE: no dimensions → layout shift when image loads -->
44
- <img src="/hero.jpg" alt="Hero" />
45
-
46
- <!-- AFTER: explicit dimensions prevent CLS -->
47
- <img src="/hero.jpg" alt="Hero" width="1200" height="630"
48
- class="w-full h-auto" loading="lazy" decoding="async" />
49
- ```
50
-
51
- ```css
52
- /* Font display — prevent FOIT layout shift */
53
- @font-face {
54
- font-family: 'Space Grotesk';
55
- src: url('/fonts/space-grotesk.woff2') format('woff2');
56
- font-display: swap; /* show fallback immediately, swap when loaded */
57
- }
58
-
59
- /* Reserve space for dynamic content */
60
- .ad-container {
61
- min-height: 250px; /* match ad unit height */
62
- contain: layout; /* prevent layout influence on siblings */
63
- }
64
- ```
65
-
66
- **Step 4 — Network dependency chain analysis**
67
- Identify critical rendering path bottlenecks:
68
- - **Waterfall chains**: Resource A loads → discovers Resource B → discovers Resource C. Each link adds latency. Fix with `<link rel="preload">` for critical assets.
69
- - **Missing preconnects**: Third-party origins (fonts.googleapis.com, CDN, analytics) without `<link rel="preconnect">`. But verify the origin is actually used — unused preconnects waste connection resources.
70
- - **Large payloads without compression**: JS/CSS bundles >100KB served without gzip/brotli. Check server response headers for `Content-Encoding`.
71
- - **Duplicate requests**: Same resource fetched multiple times (common with CSS @import or uncoordinated dynamic imports).
72
-
73
- ```html
74
- <!-- Preload critical resources discovered late in the waterfall -->
75
- <link rel="preload" href="/fonts/inter-var.woff2" as="font"
76
- type="font/woff2" crossorigin />
77
- <link rel="preload" href="/hero-image.webp" as="image"
78
- fetchpriority="high" />
79
-
80
- <!-- Preconnect to third-party origins ACTUALLY used -->
81
- <link rel="preconnect" href="https://fonts.googleapis.com" />
82
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
83
- ```
84
-
85
- **Step 5 — Tree-shaking and code splitting audit**
86
- Check bundler configuration and import patterns:
87
-
88
- | Issue | Detection | Fix |
89
- |---|---|---|
90
- | Barrel file re-exports break tree-shaking | `index.ts` with `export * from` or `export { A, B, C, ... }` importing everything | Import directly from source: `import { Button } from './Button'` not `from '.'` |
91
- | `sideEffects: false` missing in package.json | Check `package.json` `sideEffects` field | Add `"sideEffects": false` (or list files with side effects like CSS imports) |
92
- | No code splitting at route level | Framework routes without `React.lazy()` or `dynamic()` | Next.js does this automatically; Vite needs manual `React.lazy()` |
93
- | Vendor chunk too large (>250KB) | Check build output for single large chunk | Configure `splitChunks` (Webpack) or `manualChunks` (Vite/Rollup) |
94
- | CSS not purged | Tailwind without `content` config, or unused CSS classes shipping | Verify `tailwind.config.js` `content` paths cover all template files |
95
-
96
- **Step 6 — Image optimization audit**
97
- Scan for image-related performance issues:
98
- - Serving JPEG/PNG when WebP/AVIF would save 30-60% bandwidth — check `<img>` `src` extensions
99
- - Missing `loading="lazy"` on below-the-fold images
100
- - Missing `fetchpriority="high"` on LCP image (hero image, above-the-fold banner)
101
- - Images served at full resolution without responsive `srcset` — wastes bandwidth on mobile
102
- - No `<picture>` element for art direction (different crops for mobile/desktop)
103
-
104
- ```html
105
- <!-- Optimized responsive image with modern formats -->
106
- <picture>
107
- <source srcset="/hero.avif" type="image/avif" />
108
- <source srcset="/hero.webp" type="image/webp" />
109
- <img
110
- src="/hero.jpg"
111
- alt="Product dashboard showing real-time analytics"
112
- width="1200" height="630"
113
- class="w-full h-auto"
114
- fetchpriority="high"
115
- decoding="async"
116
- />
117
- </picture>
118
-
119
- <!-- Below-the-fold: lazy load -->
120
- <img src="/feature.webp" alt="..." loading="lazy" decoding="async"
121
- width="600" height="400" class="w-full h-auto" />
122
- ```
123
-
124
- **Step 7 — Generate performance report**
125
- Produce a structured report with Core Web Vitals thresholds:
126
-
127
- ```
128
- Web Vitals Audit — [Project Name]
129
- ═══════════════════════════════════════
130
- Thresholds (Good / Needs Improvement / Poor):
131
- LCP: < 2.5s / < 4.0s / > 4.0s
132
- FCP: < 1.8s / < 3.0s / > 3.0s
133
- CLS: < 0.1 / < 0.25 / > 0.25
134
- INP: < 200ms / < 500ms / > 500ms
135
- TBT: < 200ms / < 600ms / > 600ms
136
- TTFB: < 800ms / < 1.8s / > 1.8s
137
-
138
- Top Issues (by estimated impact):
139
- 1. [HIGH] Hero image served as 2.4MB PNG — convert to WebP, save ~1.5MB
140
- 2. [HIGH] 3 render-blocking stylesheets in <head> — defer non-critical CSS
141
- 3. [MEDIUM] 4 images missing width/height — causes CLS on load
142
- 4. [MEDIUM] lodash imported wholesale — tree-shake or replace with lodash-es
143
- 5. [LOW] Font preconnect to unused origin — remove to free connection slot
144
- ```
145
-
146
- #### Sharp Edges
147
-
148
- | Failure Mode | Mitigation |
149
- |---|---|
150
- | Recommending image lazy-load on LCP element | Never lazy-load the LCP image — it must load eagerly with `fetchpriority="high"` |
151
- | Flagging render-blocking CSS that's actually critical | Distinguish critical (above-fold) CSS from non-critical before recommending defer |
152
- | Tree-shaking audit false positives on CSS-in-JS | CSS `import './styles.css'` is a side effect — don't flag as unused |
153
- | Preconnect removal breaks actual resource loading | Always verify zero requests went to the origin before recommending removal |
1
+ ---
2
+ name: "web-vitals"
3
+ pack: "@rune/ui"
4
+ description: "Core Web Vitals performance audit — measures LCP, CLS, FCP, TBT, INP, and Speed Index against Google thresholds. Identifies render-blocking resources, network dependency chains, layout shift culprits, missing preloads, caching gaps, and tree-shaking opportunities."
5
+ model: sonnet
6
+ tools: [Read, Edit, Write, Grep, Glob, Bash]
7
+ ---
8
+
9
+ # web-vitals
10
+
11
+ Core Web Vitals performance audit — measures LCP, CLS, FCP, TBT, INP, and Speed Index against Google thresholds. Identifies render-blocking resources, network dependency chains, layout shift culprits, missing preloads, caching gaps, and tree-shaking opportunities. Framework-aware analysis for Next.js, Vite, SvelteKit, and Astro.
12
+
13
+ #### Workflow
14
+
15
+ **Step 1 — Detect build tooling and framework**
16
+ Read `package.json`, config files (`next.config.*`, `vite.config.*`, `svelte.config.*`, `astro.config.*`), and build scripts. Identify:
17
+ - Bundler: Webpack, Vite, Rollup, esbuild, Turbopack
18
+ - Framework: Next.js (App Router vs Pages), SvelteKit, Astro, Remix
19
+ - CSS strategy: Tailwind (content config), CSS Modules, global CSS
20
+ - Compression: gzip/brotli configuration
21
+ - Source maps: enabled in production? (should be external or disabled)
22
+
23
+ **Step 2 — Audit render-blocking resources**
24
+ Use Grep to scan HTML entry points and framework layouts for:
25
+ - `<link rel="stylesheet">` in `<head>` without `media` attribute — blocks first paint
26
+ - `<script>` tags without `async` or `defer` — blocks HTML parsing
27
+ - CSS `@import` chains — each import is a sequential network request
28
+ - Large inline `<style>` blocks (>50KB) — delays first paint
29
+
30
+ For each blocking resource, estimate impact: 0ms impact = note but don't prioritize. Focus on resources that delay FCP by >100ms.
31
+
32
+ **Step 3 — Analyze layout shift sources (CLS)**
33
+ Use Grep to find common CLS culprits:
34
+ - `<img>` and `<video>` without explicit `width` and `height` attributes — causes layout shift when media loads
35
+ - Dynamic content injection above the fold (`insertBefore`, `prepend`, or React `useState` toggling visibility)
36
+ - Web fonts without `font-display: swap` or `font-display: optional` — FOIT causes text layout shift
37
+ - Ads or embeds without reserved space (`aspect-ratio` or `min-height` on container)
38
+ - CSS animations that trigger layout (`top`, `left`, `width`, `height`) instead of composited properties (`transform`, `opacity`)
39
+
40
+ #### CLS Fix Patterns
41
+
42
+ ```html
43
+ <!-- BEFORE: no dimensions → layout shift when image loads -->
44
+ <img src="/hero.jpg" alt="Hero" />
45
+
46
+ <!-- AFTER: explicit dimensions prevent CLS -->
47
+ <img src="/hero.jpg" alt="Hero" width="1200" height="630"
48
+ class="w-full h-auto" loading="lazy" decoding="async" />
49
+ ```
50
+
51
+ ```css
52
+ /* Font display — prevent FOIT layout shift */
53
+ @font-face {
54
+ font-family: 'Space Grotesk';
55
+ src: url('/fonts/space-grotesk.woff2') format('woff2');
56
+ font-display: swap; /* show fallback immediately, swap when loaded */
57
+ }
58
+
59
+ /* Reserve space for dynamic content */
60
+ .ad-container {
61
+ min-height: 250px; /* match ad unit height */
62
+ contain: layout; /* prevent layout influence on siblings */
63
+ }
64
+ ```
65
+
66
+ **Step 4 — Network dependency chain analysis**
67
+ Identify critical rendering path bottlenecks:
68
+ - **Waterfall chains**: Resource A loads → discovers Resource B → discovers Resource C. Each link adds latency. Fix with `<link rel="preload">` for critical assets.
69
+ - **Missing preconnects**: Third-party origins (fonts.googleapis.com, CDN, analytics) without `<link rel="preconnect">`. But verify the origin is actually used — unused preconnects waste connection resources.
70
+ - **Large payloads without compression**: JS/CSS bundles >100KB served without gzip/brotli. Check server response headers for `Content-Encoding`.
71
+ - **Duplicate requests**: Same resource fetched multiple times (common with CSS @import or uncoordinated dynamic imports).
72
+
73
+ ```html
74
+ <!-- Preload critical resources discovered late in the waterfall -->
75
+ <link rel="preload" href="/fonts/inter-var.woff2" as="font"
76
+ type="font/woff2" crossorigin />
77
+ <link rel="preload" href="/hero-image.webp" as="image"
78
+ fetchpriority="high" />
79
+
80
+ <!-- Preconnect to third-party origins ACTUALLY used -->
81
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
82
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
83
+ ```
84
+
85
+ **Step 5 — Tree-shaking and code splitting audit**
86
+ Check bundler configuration and import patterns:
87
+
88
+ | Issue | Detection | Fix |
89
+ |---|---|---|
90
+ | Barrel file re-exports break tree-shaking | `index.ts` with `export * from` or `export { A, B, C, ... }` importing everything | Import directly from source: `import { Button } from './Button'` not `from '.'` |
91
+ | `sideEffects: false` missing in package.json | Check `package.json` `sideEffects` field | Add `"sideEffects": false` (or list files with side effects like CSS imports) |
92
+ | No code splitting at route level | Framework routes without `React.lazy()` or `dynamic()` | Next.js does this automatically; Vite needs manual `React.lazy()` |
93
+ | Vendor chunk too large (>250KB) | Check build output for single large chunk | Configure `splitChunks` (Webpack) or `manualChunks` (Vite/Rollup) |
94
+ | CSS not purged | Tailwind without `content` config, or unused CSS classes shipping | Verify `tailwind.config.js` `content` paths cover all template files |
95
+
96
+ **Step 6 — Image optimization audit**
97
+ Scan for image-related performance issues:
98
+ - Serving JPEG/PNG when WebP/AVIF would save 30-60% bandwidth — check `<img>` `src` extensions
99
+ - Missing `loading="lazy"` on below-the-fold images
100
+ - Missing `fetchpriority="high"` on LCP image (hero image, above-the-fold banner)
101
+ - Images served at full resolution without responsive `srcset` — wastes bandwidth on mobile
102
+ - No `<picture>` element for art direction (different crops for mobile/desktop)
103
+
104
+ ```html
105
+ <!-- Optimized responsive image with modern formats -->
106
+ <picture>
107
+ <source srcset="/hero.avif" type="image/avif" />
108
+ <source srcset="/hero.webp" type="image/webp" />
109
+ <img
110
+ src="/hero.jpg"
111
+ alt="Product dashboard showing real-time analytics"
112
+ width="1200" height="630"
113
+ class="w-full h-auto"
114
+ fetchpriority="high"
115
+ decoding="async"
116
+ />
117
+ </picture>
118
+
119
+ <!-- Below-the-fold: lazy load -->
120
+ <img src="/feature.webp" alt="..." loading="lazy" decoding="async"
121
+ width="600" height="400" class="w-full h-auto" />
122
+ ```
123
+
124
+ **Step 7 — Generate performance report**
125
+ Produce a structured report with Core Web Vitals thresholds:
126
+
127
+ ```
128
+ Web Vitals Audit — [Project Name]
129
+ ═══════════════════════════════════════
130
+ Thresholds (Good / Needs Improvement / Poor):
131
+ LCP: < 2.5s / < 4.0s / > 4.0s
132
+ FCP: < 1.8s / < 3.0s / > 3.0s
133
+ CLS: < 0.1 / < 0.25 / > 0.25
134
+ INP: < 200ms / < 500ms / > 500ms
135
+ TBT: < 200ms / < 600ms / > 600ms
136
+ TTFB: < 800ms / < 1.8s / > 1.8s
137
+
138
+ Top Issues (by estimated impact):
139
+ 1. [HIGH] Hero image served as 2.4MB PNG — convert to WebP, save ~1.5MB
140
+ 2. [HIGH] 3 render-blocking stylesheets in <head> — defer non-critical CSS
141
+ 3. [MEDIUM] 4 images missing width/height — causes CLS on load
142
+ 4. [MEDIUM] lodash imported wholesale — tree-shake or replace with lodash-es
143
+ 5. [LOW] Font preconnect to unused origin — remove to free connection slot
144
+ ```
145
+
146
+ #### Sharp Edges
147
+
148
+ | Failure Mode | Mitigation |
149
+ |---|---|
150
+ | Recommending image lazy-load on LCP element | Never lazy-load the LCP image — it must load eagerly with `fetchpriority="high"` |
151
+ | Flagging render-blocking CSS that's actually critical | Distinguish critical (above-fold) CSS from non-critical before recommending defer |
152
+ | Tree-shaking audit false positives on CSS-in-JS | CSS `import './styles.css'` is a side effect — don't flag as unused |
153
+ | Preconnect removal breaks actual resource loading | Always verify zero requests went to the origin before recommending removal |