@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,111 +1,111 @@
1
- ---
2
- name: "quant-analysis"
3
- pack: "@rune/trading"
4
- description: "Quantitative analysis patterns — portfolio metrics, risk calculations, statistical edge detection, Monte Carlo simulation, and position sizing models."
5
- model: sonnet
6
- tools: [Read, Edit, Write, Grep, Glob, Bash]
7
- ---
8
-
9
- # quant-analysis
10
-
11
- Quantitative analysis patterns — portfolio metrics, risk calculations, statistical edge detection, Monte Carlo simulation, and position sizing models.
12
-
13
- #### Workflow
14
-
15
- **Step 1 — Define analysis scope**
16
- Determine what the user needs: portfolio-level metrics (Sharpe, Sortino, max drawdown, VaR), strategy-level analysis (win rate, profit factor, expectancy, risk-of-ruin), or position sizing (Kelly criterion, fixed fractional, volatility-adjusted). Load trade history from data source (CSV, database query, API response).
17
-
18
- **Step 2 — Calculate core metrics**
19
- For portfolio analysis:
20
- - **Sharpe Ratio**: (mean return - risk-free rate) / std(returns). Annualize with √252.
21
- - **Sortino Ratio**: (mean return - risk-free rate) / downside_std. Only penalizes downside volatility.
22
- - **Max Drawdown**: Largest peak-to-trough decline. Include recovery time.
23
- - **Value at Risk (VaR)**: 95th/99th percentile loss using historical simulation or parametric method.
24
- - **Calmar Ratio**: Annualized return / max drawdown. > 1.0 = good risk-adjusted return.
25
-
26
- For strategy analysis:
27
- - **Expectancy**: (win_rate × avg_win) - (loss_rate × avg_loss). Must be positive.
28
- - **Profit Factor**: gross_profit / gross_loss. > 1.5 = viable, > 2.0 = strong.
29
- - **Risk of Ruin**: probability of losing X% of capital given win rate and risk per trade.
30
-
31
- **Step 3 — Monte Carlo simulation**
32
- Run 10,000 random resamples of the trade sequence to estimate:
33
- - Probability of reaching profit target within N trades
34
- - Confidence interval for max drawdown (95th percentile)
35
- - Optimal position size that maximizes geometric growth (Kelly fraction)
36
-
37
- Emit results as structured data + visualization-ready format for `chart-components`.
38
-
39
- **Step 4 — Position sizing recommendation**
40
- Based on Monte Carlo results, recommend:
41
- - **Conservative**: Half-Kelly (50% of optimal Kelly fraction)
42
- - **Moderate**: Full Kelly
43
- - **Aggressive**: 1.5x Kelly (with warning about increased ruin probability)
44
-
45
- Save analysis to `.rune/trading/quant-analysis-<date>.md`.
46
-
47
- #### Example
48
-
49
- ```typescript
50
- import Decimal from 'decimal.js';
51
-
52
- interface TradeResult {
53
- pnl: Decimal;
54
- entryPrice: Decimal;
55
- exitPrice: Decimal;
56
- size: Decimal;
57
- duration: number; // minutes
58
- }
59
-
60
- interface QuantMetrics {
61
- totalTrades: number;
62
- winRate: Decimal;
63
- profitFactor: Decimal;
64
- expectancy: Decimal;
65
- sharpeRatio: Decimal;
66
- sortinoRatio: Decimal;
67
- maxDrawdown: Decimal;
68
- maxDrawdownDuration: number;
69
- calmarRatio: Decimal;
70
- valueAtRisk95: Decimal;
71
- kellyFraction: Decimal;
72
- riskOfRuin: Decimal;
73
- }
74
-
75
- function calculateExpectancy(trades: TradeResult[]): Decimal {
76
- const wins = trades.filter(t => t.pnl.gt(0));
77
- const losses = trades.filter(t => t.pnl.lte(0));
78
- const winRate = new Decimal(wins.length).div(trades.length);
79
- const avgWin = wins.length > 0
80
- ? wins.reduce((sum, t) => sum.plus(t.pnl), new Decimal(0)).div(wins.length)
81
- : new Decimal(0);
82
- const avgLoss = losses.length > 0
83
- ? losses.reduce((sum, t) => sum.plus(t.pnl.abs()), new Decimal(0)).div(losses.length)
84
- : new Decimal(0);
85
- return winRate.mul(avgWin).minus(new Decimal(1).minus(winRate).mul(avgLoss));
86
- }
87
-
88
- function kellyFraction(winRate: Decimal, avgWinLossRatio: Decimal): Decimal {
89
- // Kelly: f* = (p * b - q) / b where p=winRate, q=1-p, b=avgWin/avgLoss
90
- const q = new Decimal(1).minus(winRate);
91
- return winRate.mul(avgWinLossRatio).minus(q).div(avgWinLossRatio);
92
- }
93
-
94
- // Monte Carlo: resample trades 10,000 times
95
- function monteCarloDrawdown(trades: TradeResult[], simulations = 10000): Decimal {
96
- const drawdowns: Decimal[] = [];
97
- for (let i = 0; i < simulations; i++) {
98
- const shuffled = [...trades].sort(() => Math.random() - 0.5);
99
- let peak = new Decimal(0), maxDd = new Decimal(0), equity = new Decimal(0);
100
- for (const t of shuffled) {
101
- equity = equity.plus(t.pnl);
102
- if (equity.gt(peak)) peak = equity;
103
- const dd = peak.minus(equity).div(peak.gt(0) ? peak : new Decimal(1));
104
- if (dd.gt(maxDd)) maxDd = dd;
105
- }
106
- drawdowns.push(maxDd);
107
- }
108
- drawdowns.sort((a, b) => a.cmp(b));
109
- return drawdowns[Math.floor(simulations * 0.95)]; // 95th percentile
110
- }
111
- ```
1
+ ---
2
+ name: "quant-analysis"
3
+ pack: "@rune/trading"
4
+ description: "Quantitative analysis patterns — portfolio metrics, risk calculations, statistical edge detection, Monte Carlo simulation, and position sizing models."
5
+ model: sonnet
6
+ tools: [Read, Edit, Write, Grep, Glob, Bash]
7
+ ---
8
+
9
+ # quant-analysis
10
+
11
+ Quantitative analysis patterns — portfolio metrics, risk calculations, statistical edge detection, Monte Carlo simulation, and position sizing models.
12
+
13
+ #### Workflow
14
+
15
+ **Step 1 — Define analysis scope**
16
+ Determine what the user needs: portfolio-level metrics (Sharpe, Sortino, max drawdown, VaR), strategy-level analysis (win rate, profit factor, expectancy, risk-of-ruin), or position sizing (Kelly criterion, fixed fractional, volatility-adjusted). Load trade history from data source (CSV, database query, API response).
17
+
18
+ **Step 2 — Calculate core metrics**
19
+ For portfolio analysis:
20
+ - **Sharpe Ratio**: (mean return - risk-free rate) / std(returns). Annualize with √252.
21
+ - **Sortino Ratio**: (mean return - risk-free rate) / downside_std. Only penalizes downside volatility.
22
+ - **Max Drawdown**: Largest peak-to-trough decline. Include recovery time.
23
+ - **Value at Risk (VaR)**: 95th/99th percentile loss using historical simulation or parametric method.
24
+ - **Calmar Ratio**: Annualized return / max drawdown. > 1.0 = good risk-adjusted return.
25
+
26
+ For strategy analysis:
27
+ - **Expectancy**: (win_rate × avg_win) - (loss_rate × avg_loss). Must be positive.
28
+ - **Profit Factor**: gross_profit / gross_loss. > 1.5 = viable, > 2.0 = strong.
29
+ - **Risk of Ruin**: probability of losing X% of capital given win rate and risk per trade.
30
+
31
+ **Step 3 — Monte Carlo simulation**
32
+ Run 10,000 random resamples of the trade sequence to estimate:
33
+ - Probability of reaching profit target within N trades
34
+ - Confidence interval for max drawdown (95th percentile)
35
+ - Optimal position size that maximizes geometric growth (Kelly fraction)
36
+
37
+ Emit results as structured data + visualization-ready format for `chart-components`.
38
+
39
+ **Step 4 — Position sizing recommendation**
40
+ Based on Monte Carlo results, recommend:
41
+ - **Conservative**: Half-Kelly (50% of optimal Kelly fraction)
42
+ - **Moderate**: Full Kelly
43
+ - **Aggressive**: 1.5x Kelly (with warning about increased ruin probability)
44
+
45
+ Save analysis to `.rune/trading/quant-analysis-<date>.md`.
46
+
47
+ #### Example
48
+
49
+ ```typescript
50
+ import Decimal from 'decimal.js';
51
+
52
+ interface TradeResult {
53
+ pnl: Decimal;
54
+ entryPrice: Decimal;
55
+ exitPrice: Decimal;
56
+ size: Decimal;
57
+ duration: number; // minutes
58
+ }
59
+
60
+ interface QuantMetrics {
61
+ totalTrades: number;
62
+ winRate: Decimal;
63
+ profitFactor: Decimal;
64
+ expectancy: Decimal;
65
+ sharpeRatio: Decimal;
66
+ sortinoRatio: Decimal;
67
+ maxDrawdown: Decimal;
68
+ maxDrawdownDuration: number;
69
+ calmarRatio: Decimal;
70
+ valueAtRisk95: Decimal;
71
+ kellyFraction: Decimal;
72
+ riskOfRuin: Decimal;
73
+ }
74
+
75
+ function calculateExpectancy(trades: TradeResult[]): Decimal {
76
+ const wins = trades.filter(t => t.pnl.gt(0));
77
+ const losses = trades.filter(t => t.pnl.lte(0));
78
+ const winRate = new Decimal(wins.length).div(trades.length);
79
+ const avgWin = wins.length > 0
80
+ ? wins.reduce((sum, t) => sum.plus(t.pnl), new Decimal(0)).div(wins.length)
81
+ : new Decimal(0);
82
+ const avgLoss = losses.length > 0
83
+ ? losses.reduce((sum, t) => sum.plus(t.pnl.abs()), new Decimal(0)).div(losses.length)
84
+ : new Decimal(0);
85
+ return winRate.mul(avgWin).minus(new Decimal(1).minus(winRate).mul(avgLoss));
86
+ }
87
+
88
+ function kellyFraction(winRate: Decimal, avgWinLossRatio: Decimal): Decimal {
89
+ // Kelly: f* = (p * b - q) / b where p=winRate, q=1-p, b=avgWin/avgLoss
90
+ const q = new Decimal(1).minus(winRate);
91
+ return winRate.mul(avgWinLossRatio).minus(q).div(avgWinLossRatio);
92
+ }
93
+
94
+ // Monte Carlo: resample trades 10,000 times
95
+ function monteCarloDrawdown(trades: TradeResult[], simulations = 10000): Decimal {
96
+ const drawdowns: Decimal[] = [];
97
+ for (let i = 0; i < simulations; i++) {
98
+ const shuffled = [...trades].sort(() => Math.random() - 0.5);
99
+ let peak = new Decimal(0), maxDd = new Decimal(0), equity = new Decimal(0);
100
+ for (const t of shuffled) {
101
+ equity = equity.plus(t.pnl);
102
+ if (equity.gt(peak)) peak = equity;
103
+ const dd = peak.minus(equity).div(peak.gt(0) ? peak : new Decimal(1));
104
+ if (dd.gt(maxDd)) maxDd = dd;
105
+ }
106
+ drawdowns.push(maxDd);
107
+ }
108
+ drawdowns.sort((a, b) => a.cmp(b));
109
+ return drawdowns[Math.floor(simulations * 0.95)]; // 95th percentile
110
+ }
111
+ ```
@@ -1,58 +1,58 @@
1
- ---
2
- name: "realtime-data"
3
- pack: "@rune/trading"
4
- description: "Real-time data architecture — WebSocket lifecycle management, auto-reconnect with exponential backoff, event normalization, rate limiting, and TanStack Query cache invalidation."
5
- model: sonnet
6
- tools: [Read, Edit, Write, Grep, Glob, Bash]
7
- ---
8
-
9
- # realtime-data
10
-
11
- Real-time data architecture — WebSocket lifecycle management, auto-reconnect with exponential backoff, event normalization, rate limiting, and TanStack Query cache invalidation.
12
-
13
- #### Workflow
14
-
15
- **Step 1 — WebSocket setup and event normalization**
16
- Use `Read` on existing data-fetching files to understand current polling or REST patterns. Replace with a WebSocket client class that emits typed, normalized events regardless of upstream message format. Define a `NormalizedTick` interface at the boundary.
17
-
18
- **Step 2 — Implement exponential backoff reconnect**
19
- In the WebSocket class, add a reconnect handler: attempt 1 after 1 s, attempt 2 after 2 s, attempt 3 after 4 s, cap at 30 s. Use `Bash` to run unit tests covering disconnect and reconnect sequences. Track `reconnectAttempts` in state; reset to 0 on successful open.
20
-
21
- **Step 3 — Wire to TanStack Query cache invalidation**
22
- On each normalized event received, call `queryClient.setQueryData(['ticker', symbol], tick)` for optimistic updates or `queryClient.invalidateQueries(['orderbook', symbol])` for full refresh. Use `Grep` to confirm no stale `setInterval` polling remains alongside the new WebSocket feed.
23
-
24
- #### Example
25
-
26
- ```typescript
27
- class TradingWebSocket {
28
- private ws: WebSocket | null = null;
29
- private reconnectAttempts = 0;
30
- private readonly MAX_DELAY_MS = 30_000;
31
-
32
- connect(url: string, onTick: (tick: NormalizedTick) => void): void {
33
- this.ws = new WebSocket(url);
34
-
35
- this.ws.onmessage = (event) => {
36
- const raw = JSON.parse(event.data as string);
37
- onTick(this.normalize(raw));
38
- };
39
-
40
- this.ws.onclose = () => {
41
- const delay = Math.min(
42
- 1000 * 2 ** this.reconnectAttempts,
43
- this.MAX_DELAY_MS,
44
- );
45
- this.reconnectAttempts += 1;
46
- setTimeout(() => this.connect(url, onTick), delay);
47
- };
48
-
49
- this.ws.onopen = () => { this.reconnectAttempts = 0; };
50
- }
51
-
52
- private normalize(raw: unknown): NormalizedTick {
53
- // map exchange-specific shape to shared interface
54
- const r = raw as Record<string, unknown>;
55
- return { symbol: String(r['s']), price: String(r['p']), ts: Date.now() };
56
- }
57
- }
58
- ```
1
+ ---
2
+ name: "realtime-data"
3
+ pack: "@rune/trading"
4
+ description: "Real-time data architecture — WebSocket lifecycle management, auto-reconnect with exponential backoff, event normalization, rate limiting, and TanStack Query cache invalidation."
5
+ model: sonnet
6
+ tools: [Read, Edit, Write, Grep, Glob, Bash]
7
+ ---
8
+
9
+ # realtime-data
10
+
11
+ Real-time data architecture — WebSocket lifecycle management, auto-reconnect with exponential backoff, event normalization, rate limiting, and TanStack Query cache invalidation.
12
+
13
+ #### Workflow
14
+
15
+ **Step 1 — WebSocket setup and event normalization**
16
+ Use `Read` on existing data-fetching files to understand current polling or REST patterns. Replace with a WebSocket client class that emits typed, normalized events regardless of upstream message format. Define a `NormalizedTick` interface at the boundary.
17
+
18
+ **Step 2 — Implement exponential backoff reconnect**
19
+ In the WebSocket class, add a reconnect handler: attempt 1 after 1 s, attempt 2 after 2 s, attempt 3 after 4 s, cap at 30 s. Use `Bash` to run unit tests covering disconnect and reconnect sequences. Track `reconnectAttempts` in state; reset to 0 on successful open.
20
+
21
+ **Step 3 — Wire to TanStack Query cache invalidation**
22
+ On each normalized event received, call `queryClient.setQueryData(['ticker', symbol], tick)` for optimistic updates or `queryClient.invalidateQueries(['orderbook', symbol])` for full refresh. Use `Grep` to confirm no stale `setInterval` polling remains alongside the new WebSocket feed.
23
+
24
+ #### Example
25
+
26
+ ```typescript
27
+ class TradingWebSocket {
28
+ private ws: WebSocket | null = null;
29
+ private reconnectAttempts = 0;
30
+ private readonly MAX_DELAY_MS = 30_000;
31
+
32
+ connect(url: string, onTick: (tick: NormalizedTick) => void): void {
33
+ this.ws = new WebSocket(url);
34
+
35
+ this.ws.onmessage = (event) => {
36
+ const raw = JSON.parse(event.data as string);
37
+ onTick(this.normalize(raw));
38
+ };
39
+
40
+ this.ws.onclose = () => {
41
+ const delay = Math.min(
42
+ 1000 * 2 ** this.reconnectAttempts,
43
+ this.MAX_DELAY_MS,
44
+ );
45
+ this.reconnectAttempts += 1;
46
+ setTimeout(() => this.connect(url, onTick), delay);
47
+ };
48
+
49
+ this.ws.onopen = () => { this.reconnectAttempts = 0; };
50
+ }
51
+
52
+ private normalize(raw: unknown): NormalizedTick {
53
+ // map exchange-specific shape to shared interface
54
+ const r = raw as Record<string, unknown>;
55
+ return { symbol: String(r['s']), price: String(r['p']), ts: Date.now() };
56
+ }
57
+ }
58
+ ```
@@ -1,104 +1,104 @@
1
- ---
2
- name: "trade-logic"
3
- pack: "@rune/trading"
4
- description: "Trading logic preservation and reasoning — entry/exit spec management, indicator parameter registry, strategy state tracking, and backtest result linkage. Prevents the #1 trading bot failure: AI sessions overwriting working logic without understanding it."
5
- model: sonnet
6
- tools: [Read, Edit, Write, Grep, Glob, Bash]
7
- ---
8
-
9
- # trade-logic
10
-
11
- Trading logic preservation and reasoning — entry/exit spec management, indicator parameter registry, strategy state tracking, and backtest result linkage. Prevents the #1 trading bot failure: AI sessions overwriting working logic without understanding it.
12
-
13
- #### Workflow
14
-
15
- **Step 1 — Load trading logic context**
16
- Check if `logic-guardian` (L2) has a manifest loaded. If `.rune/logic-manifest.json` exists, read it and extract trading-specific components (ENTRY_LOGIC, EXIT_LOGIC, FILTER, INDICATOR). If no manifest exists, trigger `logic-guardian` Phase 3 to generate one with trading-aware scanning.
17
-
18
- Trading-specific file patterns to scan:
19
- - `**/scenarios/**`, `**/signals/**`, `**/strategies/**` — entry/exit logic
20
- - `**/trailing/**`, `**/exit/**`, `**/stoploss/**` — exit engine components
21
- - `**/indicators/**`, `**/core/indicators*` — technical indicator implementations
22
- - `**/backtest/**`, `**/engine*` — backtesting mirrors of production logic
23
- - `**/config/settings*`, `**/config/token*` — parameter source of truth
24
-
25
- **Step 2 — Build trading logic spec**
26
- For each trading component, extract a structured spec:
27
-
28
- ```
29
- COMPONENT: RSI Entry Detector
30
- TYPE: ENTRY_LOGIC
31
- STATUS: ACTIVE (production)
32
- LAYERS: [which layer in the trading pipeline this belongs to]
33
-
34
- ENTRY CONDITIONS:
35
- 1. TrendPass ticket exists with available fires
36
- 2. RSI_MA crosses threshold (65 LONG / 35 SHORT)
37
- 3. Previous RSI in entry zone (30-55 LONG / 45-70 SHORT)
38
- 4. RSI crosses RSI_MA + 40% TF filter + EMA filter
39
-
40
- PARAMETERS:
41
- - rsi_period: 7 (source: settings.py)
42
- - challenge_threshold_long: 65 (source: settings.py)
43
- - entry_zone_long: [30, 55] (source: settings.py)
44
-
45
- DEPENDENCIES: trend_pass.tracker, core.indicators
46
- MIRROR: backtest/engine.py (must stay in sync with production)
47
- ```
48
-
49
- **Step 3 — Enforce production-backtest sync**
50
- For trading bots, production logic and backtest logic MUST be mirrors. Scan for:
51
- - Production file: `src/worker/production_worker.py` or equivalent
52
- - Backtest file: `backtest/engine.py` or equivalent
53
- - Compare entry/exit function signatures and conditional branches
54
- - Flag any divergence: "Production uses condition X but backtest doesn't"
55
-
56
- **Step 4 — Parameter registry**
57
- Build a parameter registry linking every configurable threshold to its source:
58
- - Single source of truth file (e.g., `settings.py`)
59
- - Per-token overrides (e.g., `token_config.py`, `final_config.json`)
60
- - Scan for hardcoded magic numbers in logic files that should be in config
61
- - Flag: "Hardcoded value 65 in detect.py:L42 — should reference settings.CHALLENGE_THRESHOLD_LONG"
62
-
63
- **Step 5 — Strategy state machine documentation**
64
- If the trading logic uses a multi-step state machine (e.g., 3-step RSI entry):
65
- - Document each state and its transition conditions
66
- - Generate a state diagram in text format
67
- - Save to manifest as `state_machine` field on the component
68
-
69
- ```
70
- State Machine: RSI Entry
71
- [IDLE] --ticket_exists--> [STEP1_CHALLENGE]
72
- [STEP1_CHALLENGE] --rsi_ma_crosses_threshold--> [STEP2_ZONE_CHECK]
73
- [STEP2_ZONE_CHECK] --prev_rsi_in_zone--> [STEP3_ENTRY_POINT]
74
- [STEP3_ENTRY_POINT] --rsi_crosses_rsi_ma + filters--> [SIGNAL_EMITTED]
75
- [any_step] --ticket_expired--> [IDLE]
76
- ```
77
-
78
- **Step 6 — Backtest result linkage**
79
- Link logic components to their backtest performance:
80
- - Scan `backtest/scan_results/` or equivalent for result files
81
- - Associate each strategy variant with its performance metrics
82
- - Record in manifest: "RSI Entry v5 with EMA Follow: $20,445 over 6mo backtest"
83
- - Flag if logic was modified AFTER the latest backtest: "Logic changed since last backtest — results may be invalid"
84
-
85
- #### Example
86
-
87
- ```python
88
- # trade-logic generates this spec from code analysis:
89
- # COMPONENT: EMA Follow Exit
90
- # TYPE: EXIT_LOGIC
91
- # STATUS: ACTIVE
92
- # BUG_HISTORY: 2026-02-22 fixed wick detection (was using close, now uses candle_low/high)
93
- #
94
- # EXIT CONDITION:
95
- # if candle_wick crosses EMA120 -> exit position
96
- # (NOT candle_close — this was the V4 bug)
97
- #
98
- # PARAMETERS:
99
- # ema_period: 120 (source: settings.py)
100
- # use_wick: True (source: settings.py, changed from False in V4)
101
- #
102
- # MIRROR: backtest/exit_checker.py:check_ema_follow()
103
- # BACKTEST: $22,481 (x2.0 adaptive variant, validated 2026-02-22)
104
- ```
1
+ ---
2
+ name: "trade-logic"
3
+ pack: "@rune/trading"
4
+ description: "Trading logic preservation and reasoning — entry/exit spec management, indicator parameter registry, strategy state tracking, and backtest result linkage. Prevents the #1 trading bot failure: AI sessions overwriting working logic without understanding it."
5
+ model: sonnet
6
+ tools: [Read, Edit, Write, Grep, Glob, Bash]
7
+ ---
8
+
9
+ # trade-logic
10
+
11
+ Trading logic preservation and reasoning — entry/exit spec management, indicator parameter registry, strategy state tracking, and backtest result linkage. Prevents the #1 trading bot failure: AI sessions overwriting working logic without understanding it.
12
+
13
+ #### Workflow
14
+
15
+ **Step 1 — Load trading logic context**
16
+ Check if `logic-guardian` (L2) has a manifest loaded. If `.rune/logic-manifest.json` exists, read it and extract trading-specific components (ENTRY_LOGIC, EXIT_LOGIC, FILTER, INDICATOR). If no manifest exists, trigger `logic-guardian` Phase 3 to generate one with trading-aware scanning.
17
+
18
+ Trading-specific file patterns to scan:
19
+ - `**/scenarios/**`, `**/signals/**`, `**/strategies/**` — entry/exit logic
20
+ - `**/trailing/**`, `**/exit/**`, `**/stoploss/**` — exit engine components
21
+ - `**/indicators/**`, `**/core/indicators*` — technical indicator implementations
22
+ - `**/backtest/**`, `**/engine*` — backtesting mirrors of production logic
23
+ - `**/config/settings*`, `**/config/token*` — parameter source of truth
24
+
25
+ **Step 2 — Build trading logic spec**
26
+ For each trading component, extract a structured spec:
27
+
28
+ ```
29
+ COMPONENT: RSI Entry Detector
30
+ TYPE: ENTRY_LOGIC
31
+ STATUS: ACTIVE (production)
32
+ LAYERS: [which layer in the trading pipeline this belongs to]
33
+
34
+ ENTRY CONDITIONS:
35
+ 1. TrendPass ticket exists with available fires
36
+ 2. RSI_MA crosses threshold (65 LONG / 35 SHORT)
37
+ 3. Previous RSI in entry zone (30-55 LONG / 45-70 SHORT)
38
+ 4. RSI crosses RSI_MA + 40% TF filter + EMA filter
39
+
40
+ PARAMETERS:
41
+ - rsi_period: 7 (source: settings.py)
42
+ - challenge_threshold_long: 65 (source: settings.py)
43
+ - entry_zone_long: [30, 55] (source: settings.py)
44
+
45
+ DEPENDENCIES: trend_pass.tracker, core.indicators
46
+ MIRROR: backtest/engine.py (must stay in sync with production)
47
+ ```
48
+
49
+ **Step 3 — Enforce production-backtest sync**
50
+ For trading bots, production logic and backtest logic MUST be mirrors. Scan for:
51
+ - Production file: `src/worker/production_worker.py` or equivalent
52
+ - Backtest file: `backtest/engine.py` or equivalent
53
+ - Compare entry/exit function signatures and conditional branches
54
+ - Flag any divergence: "Production uses condition X but backtest doesn't"
55
+
56
+ **Step 4 — Parameter registry**
57
+ Build a parameter registry linking every configurable threshold to its source:
58
+ - Single source of truth file (e.g., `settings.py`)
59
+ - Per-token overrides (e.g., `token_config.py`, `final_config.json`)
60
+ - Scan for hardcoded magic numbers in logic files that should be in config
61
+ - Flag: "Hardcoded value 65 in detect.py:L42 — should reference settings.CHALLENGE_THRESHOLD_LONG"
62
+
63
+ **Step 5 — Strategy state machine documentation**
64
+ If the trading logic uses a multi-step state machine (e.g., 3-step RSI entry):
65
+ - Document each state and its transition conditions
66
+ - Generate a state diagram in text format
67
+ - Save to manifest as `state_machine` field on the component
68
+
69
+ ```
70
+ State Machine: RSI Entry
71
+ [IDLE] --ticket_exists--> [STEP1_CHALLENGE]
72
+ [STEP1_CHALLENGE] --rsi_ma_crosses_threshold--> [STEP2_ZONE_CHECK]
73
+ [STEP2_ZONE_CHECK] --prev_rsi_in_zone--> [STEP3_ENTRY_POINT]
74
+ [STEP3_ENTRY_POINT] --rsi_crosses_rsi_ma + filters--> [SIGNAL_EMITTED]
75
+ [any_step] --ticket_expired--> [IDLE]
76
+ ```
77
+
78
+ **Step 6 — Backtest result linkage**
79
+ Link logic components to their backtest performance:
80
+ - Scan `backtest/scan_results/` or equivalent for result files
81
+ - Associate each strategy variant with its performance metrics
82
+ - Record in manifest: "RSI Entry v5 with EMA Follow: $20,445 over 6mo backtest"
83
+ - Flag if logic was modified AFTER the latest backtest: "Logic changed since last backtest — results may be invalid"
84
+
85
+ #### Example
86
+
87
+ ```python
88
+ # trade-logic generates this spec from code analysis:
89
+ # COMPONENT: EMA Follow Exit
90
+ # TYPE: EXIT_LOGIC
91
+ # STATUS: ACTIVE
92
+ # BUG_HISTORY: 2026-02-22 fixed wick detection (was using close, now uses candle_low/high)
93
+ #
94
+ # EXIT CONDITION:
95
+ # if candle_wick crosses EMA120 -> exit position
96
+ # (NOT candle_close — this was the V4 bug)
97
+ #
98
+ # PARAMETERS:
99
+ # ema_period: 120 (source: settings.py)
100
+ # use_wick: True (source: settings.py, changed from False in V4)
101
+ #
102
+ # MIRROR: backtest/exit_checker.py:check_ema_follow()
103
+ # BACKTEST: $22,481 (x2.0 adaptive variant, validated 2026-02-22)
104
+ ```