@ketecode/loom 0.0.0-stage → 0.2.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 (851) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +616 -2
  3. package/agents/accessibility-reviewer/AGENT.md +70 -0
  4. package/agents/accessibility-reviewer/evals/triggers.json +15 -0
  5. package/agents/agent-evaluator/AGENT.md +74 -0
  6. package/agents/agent-evaluator/evals/triggers.json +15 -0
  7. package/agents/architect/AGENT.md +82 -0
  8. package/agents/architect/evals/triggers.json +17 -0
  9. package/agents/billing-reviewer/AGENT.md +68 -0
  10. package/agents/billing-reviewer/evals/triggers.json +16 -0
  11. package/agents/code-reviewer/AGENT.md +51 -0
  12. package/agents/code-reviewer/evals/behavior.json +60 -0
  13. package/agents/code-reviewer/evals/triggers.json +14 -0
  14. package/agents/code-simplifier/AGENT.md +74 -0
  15. package/agents/code-simplifier/evals/triggers.json +15 -0
  16. package/agents/cpp-build-resolver/AGENT.md +73 -0
  17. package/agents/cpp-build-resolver/evals/triggers.json +16 -0
  18. package/agents/cpp-reviewer/AGENT.md +59 -0
  19. package/agents/cpp-reviewer/evals/triggers.json +16 -0
  20. package/agents/csharp-build-resolver/AGENT.md +84 -0
  21. package/agents/csharp-build-resolver/evals/triggers.json +17 -0
  22. package/agents/csharp-reviewer/AGENT.md +88 -0
  23. package/agents/csharp-reviewer/evals/triggers.json +17 -0
  24. package/agents/dart-build-resolver/AGENT.md +80 -0
  25. package/agents/dart-build-resolver/evals/triggers.json +17 -0
  26. package/agents/dart-reviewer/AGENT.md +66 -0
  27. package/agents/dart-reviewer/evals/triggers.json +17 -0
  28. package/agents/database-reviewer/AGENT.md +72 -0
  29. package/agents/database-reviewer/evals/triggers.json +16 -0
  30. package/agents/django-reviewer/AGENT.md +61 -0
  31. package/agents/django-reviewer/evals/triggers.json +15 -0
  32. package/agents/doc-updater/AGENT.md +92 -0
  33. package/agents/doc-updater/evals/triggers.json +14 -0
  34. package/agents/e2e-runner/AGENT.md +88 -0
  35. package/agents/e2e-runner/evals/triggers.json +16 -0
  36. package/agents/fastapi-reviewer/AGENT.md +63 -0
  37. package/agents/fastapi-reviewer/evals/triggers.json +15 -0
  38. package/agents/flutter-reviewer/AGENT.md +70 -0
  39. package/agents/flutter-reviewer/evals/triggers.json +15 -0
  40. package/agents/fsharp-build-resolver/AGENT.md +81 -0
  41. package/agents/fsharp-build-resolver/evals/triggers.json +15 -0
  42. package/agents/fsharp-reviewer/AGENT.md +77 -0
  43. package/agents/fsharp-reviewer/evals/triggers.json +15 -0
  44. package/agents/go-build-resolver/AGENT.md +85 -0
  45. package/agents/go-build-resolver/evals/triggers.json +16 -0
  46. package/agents/go-reviewer/AGENT.md +66 -0
  47. package/agents/go-reviewer/evals/triggers.json +16 -0
  48. package/agents/healthcare-reviewer/AGENT.md +65 -0
  49. package/agents/healthcare-reviewer/evals/triggers.json +16 -0
  50. package/agents/i18n-reviewer/AGENT.md +64 -0
  51. package/agents/i18n-reviewer/evals/triggers.json +16 -0
  52. package/agents/inbox-triager/AGENT.md +98 -0
  53. package/agents/inbox-triager/evals/triggers.json +16 -0
  54. package/agents/infra-reviewer/AGENT.md +93 -0
  55. package/agents/infra-reviewer/evals/triggers.json +15 -0
  56. package/agents/java-build-resolver/AGENT.md +82 -0
  57. package/agents/java-build-resolver/evals/triggers.json +16 -0
  58. package/agents/java-reviewer/AGENT.md +64 -0
  59. package/agents/java-reviewer/evals/triggers.json +16 -0
  60. package/agents/kotlin-build-resolver/AGENT.md +89 -0
  61. package/agents/kotlin-build-resolver/evals/triggers.json +16 -0
  62. package/agents/kotlin-reviewer/AGENT.md +75 -0
  63. package/agents/kotlin-reviewer/evals/triggers.json +16 -0
  64. package/agents/mle-reviewer/AGENT.md +68 -0
  65. package/agents/mle-reviewer/evals/triggers.json +16 -0
  66. package/agents/network-config-reviewer/AGENT.md +68 -0
  67. package/agents/network-config-reviewer/evals/triggers.json +17 -0
  68. package/agents/payments-reviewer/AGENT.md +64 -0
  69. package/agents/payments-reviewer/evals/triggers.json +16 -0
  70. package/agents/performance-optimizer/AGENT.md +86 -0
  71. package/agents/performance-optimizer/evals/triggers.json +16 -0
  72. package/agents/perl-build-resolver/AGENT.md +84 -0
  73. package/agents/perl-build-resolver/evals/triggers.json +15 -0
  74. package/agents/perl-reviewer/AGENT.md +77 -0
  75. package/agents/perl-reviewer/evals/triggers.json +15 -0
  76. package/agents/php-build-resolver/AGENT.md +88 -0
  77. package/agents/php-build-resolver/evals/triggers.json +16 -0
  78. package/agents/php-reviewer/AGENT.md +61 -0
  79. package/agents/php-reviewer/evals/triggers.json +15 -0
  80. package/agents/planner/AGENT.md +75 -0
  81. package/agents/planner/evals/triggers.json +17 -0
  82. package/agents/pr-test-analyzer/AGENT.md +82 -0
  83. package/agents/pr-test-analyzer/evals/triggers.json +16 -0
  84. package/agents/python-build-resolver/AGENT.md +87 -0
  85. package/agents/python-build-resolver/evals/triggers.json +16 -0
  86. package/agents/python-reviewer/AGENT.md +63 -0
  87. package/agents/python-reviewer/evals/triggers.json +15 -0
  88. package/agents/rag-reviewer/AGENT.md +71 -0
  89. package/agents/rag-reviewer/evals/triggers.json +16 -0
  90. package/agents/react-reviewer/AGENT.md +70 -0
  91. package/agents/react-reviewer/evals/triggers.json +16 -0
  92. package/agents/refactor-cleaner/AGENT.md +82 -0
  93. package/agents/refactor-cleaner/evals/triggers.json +16 -0
  94. package/agents/ruby-build-resolver/AGENT.md +93 -0
  95. package/agents/ruby-build-resolver/evals/triggers.json +16 -0
  96. package/agents/ruby-reviewer/AGENT.md +62 -0
  97. package/agents/ruby-reviewer/evals/triggers.json +16 -0
  98. package/agents/rust-build-resolver/AGENT.md +98 -0
  99. package/agents/rust-build-resolver/evals/triggers.json +16 -0
  100. package/agents/rust-reviewer/AGENT.md +78 -0
  101. package/agents/rust-reviewer/evals/triggers.json +15 -0
  102. package/agents/security-reviewer/AGENT.md +84 -0
  103. package/agents/security-reviewer/evals/triggers.json +16 -0
  104. package/agents/silent-failure-hunter/AGENT.md +66 -0
  105. package/agents/silent-failure-hunter/evals/triggers.json +16 -0
  106. package/agents/solidity-reviewer/AGENT.md +70 -0
  107. package/agents/solidity-reviewer/evals/triggers.json +16 -0
  108. package/agents/spec-reviewer/AGENT.md +95 -0
  109. package/agents/spec-reviewer/evals/behavior.json +57 -0
  110. package/agents/spec-reviewer/evals/triggers.json +16 -0
  111. package/agents/swift-build-resolver/AGENT.md +85 -0
  112. package/agents/swift-build-resolver/evals/triggers.json +15 -0
  113. package/agents/swift-reviewer/AGENT.md +75 -0
  114. package/agents/swift-reviewer/evals/triggers.json +15 -0
  115. package/agents/task-implementer/AGENT.md +89 -0
  116. package/agents/task-implementer/evals/behavior.json +47 -0
  117. package/agents/task-implementer/evals/triggers.json +16 -0
  118. package/agents/typescript-build-resolver/AGENT.md +76 -0
  119. package/agents/typescript-build-resolver/evals/triggers.json +15 -0
  120. package/agents/typescript-reviewer/AGENT.md +76 -0
  121. package/agents/typescript-reviewer/evals/triggers.json +15 -0
  122. package/agents/vue-reviewer/AGENT.md +75 -0
  123. package/agents/vue-reviewer/evals/triggers.json +15 -0
  124. package/bin/kete-loom.js +723 -0
  125. package/commands/aside.md +19 -0
  126. package/commands/brainstorm.md +25 -0
  127. package/commands/build-fix.md +26 -0
  128. package/commands/campaign.md +19 -0
  129. package/commands/changelog.md +36 -0
  130. package/commands/checkpoint.md +26 -0
  131. package/commands/codemap.md +25 -0
  132. package/commands/commit.md +26 -0
  133. package/commands/debug.md +27 -0
  134. package/commands/deps-audit.md +32 -0
  135. package/commands/dual-review.md +34 -0
  136. package/commands/epic-decompose.md +21 -0
  137. package/commands/explain.md +37 -0
  138. package/commands/feature-dev.md +23 -0
  139. package/commands/finish-branch.md +26 -0
  140. package/commands/fix-bug.md +38 -0
  141. package/commands/hookify.md +23 -0
  142. package/commands/i18n-check.md +39 -0
  143. package/commands/issue-sync.md +22 -0
  144. package/commands/jira.md +19 -0
  145. package/commands/learn.md +23 -0
  146. package/commands/loom.md +21 -0
  147. package/commands/loop.md +20 -0
  148. package/commands/model-route.md +27 -0
  149. package/commands/onboard.md +35 -0
  150. package/commands/orchestrate.md +21 -0
  151. package/commands/plan-feature.md +36 -0
  152. package/commands/postmortem.md +42 -0
  153. package/commands/pr-describe.md +39 -0
  154. package/commands/pr.md +22 -0
  155. package/commands/prd.md +41 -0
  156. package/commands/production-readiness.md +45 -0
  157. package/commands/project-init.md +21 -0
  158. package/commands/refactor-clean.md +24 -0
  159. package/commands/resume-session.md +22 -0
  160. package/commands/review.md +35 -0
  161. package/commands/save-session.md +37 -0
  162. package/commands/security-scan.md +32 -0
  163. package/commands/sessions.md +21 -0
  164. package/commands/skill-create.md +21 -0
  165. package/commands/tdd.md +36 -0
  166. package/commands/test-coverage.md +24 -0
  167. package/commands/threat-model.md +36 -0
  168. package/commands/update-docs.md +25 -0
  169. package/commands/usage-report.md +43 -0
  170. package/commands/verify.md +21 -0
  171. package/hooks/block-dangerous-commands/HOOK.md +30 -0
  172. package/hooks/block-dangerous-commands/cases.json +50 -0
  173. package/hooks/block-dangerous-commands/hook.js +75 -0
  174. package/hooks/block-foreground-servers/HOOK.md +34 -0
  175. package/hooks/block-foreground-servers/cases.json +31 -0
  176. package/hooks/block-foreground-servers/hook.js +41 -0
  177. package/hooks/block-no-verify/HOOK.md +25 -0
  178. package/hooks/block-no-verify/cases.json +30 -0
  179. package/hooks/block-no-verify/hook.js +43 -0
  180. package/hooks/capture-lessons/HOOK.md +24 -0
  181. package/hooks/capture-lessons/hook.js +48 -0
  182. package/hooks/format-on-edit/HOOK.md +24 -0
  183. package/hooks/format-on-edit/hook.js +89 -0
  184. package/hooks/guard-secrets/HOOK.md +19 -0
  185. package/hooks/guard-secrets/cases.json +110 -0
  186. package/hooks/guard-secrets/hook.js +44 -0
  187. package/hooks/load-session-context/HOOK.md +20 -0
  188. package/hooks/load-session-context/hook.js +56 -0
  189. package/hooks/notify-on-stop/HOOK.md +25 -0
  190. package/hooks/notify-on-stop/hook.js +27 -0
  191. package/hooks/protect-files/HOOK.md +24 -0
  192. package/hooks/protect-files/cases.json +27 -0
  193. package/hooks/protect-files/hook.js +39 -0
  194. package/hooks/protect-lint-config/HOOK.md +29 -0
  195. package/hooks/protect-lint-config/cases.json +18 -0
  196. package/hooks/protect-lint-config/fixtures/.eslintrc.json +1 -0
  197. package/hooks/protect-lint-config/fixtures/.golangci.yml +1 -0
  198. package/hooks/protect-lint-config/fixtures/.prettierrc +1 -0
  199. package/hooks/protect-lint-config/fixtures/.rubocop.yml +1 -0
  200. package/hooks/protect-lint-config/fixtures/biome.json +1 -0
  201. package/hooks/protect-lint-config/fixtures/eslint.config.mjs +1 -0
  202. package/hooks/protect-lint-config/fixtures/ruff.toml +1 -0
  203. package/hooks/protect-lint-config/hook.js +25 -0
  204. package/hooks/read-before-edit/HOOK.md +26 -0
  205. package/hooks/read-before-edit/cases.json +15 -0
  206. package/hooks/read-before-edit/hook.js +50 -0
  207. package/hooks/run.js +148 -0
  208. package/hooks/verify-before-stop/HOOK.md +32 -0
  209. package/hooks/verify-before-stop/hook.js +70 -0
  210. package/mcp/atlassian.json +11 -0
  211. package/mcp/chrome-devtools.json +18 -0
  212. package/mcp/clickhouse.json +11 -0
  213. package/mcp/cloudflare.json +11 -0
  214. package/mcp/context7.json +11 -0
  215. package/mcp/exa.json +11 -0
  216. package/mcp/fetch.json +17 -0
  217. package/mcp/figma.json +11 -0
  218. package/mcp/firecrawl.json +11 -0
  219. package/mcp/git.json +17 -0
  220. package/mcp/github.json +11 -0
  221. package/mcp/linear.json +11 -0
  222. package/mcp/memory.json +18 -0
  223. package/mcp/notion.json +11 -0
  224. package/mcp/playwright.json +18 -0
  225. package/mcp/sentry.json +11 -0
  226. package/mcp/stripe.json +11 -0
  227. package/mcp/supabase.json +11 -0
  228. package/mcp/time.json +17 -0
  229. package/mcp/vercel.json +11 -0
  230. package/package.json +61 -4
  231. package/profiles.json +214 -0
  232. package/rules/common.md +21 -0
  233. package/rules/cpp.md +29 -0
  234. package/rules/csharp.md +25 -0
  235. package/rules/dart.md +29 -0
  236. package/rules/fsharp.md +28 -0
  237. package/rules/git.md +26 -0
  238. package/rules/go.md +29 -0
  239. package/rules/java.md +29 -0
  240. package/rules/kotlin.md +27 -0
  241. package/rules/perl.md +26 -0
  242. package/rules/php.md +28 -0
  243. package/rules/python.md +30 -0
  244. package/rules/ruby.md +27 -0
  245. package/rules/rust.md +26 -0
  246. package/rules/security.md +29 -0
  247. package/rules/swift.md +28 -0
  248. package/rules/testing.md +25 -0
  249. package/rules/typescript.md +29 -0
  250. package/rules/use-skills.md +23 -0
  251. package/schemas/skill-frontmatter.schema.json +52 -0
  252. package/scripts/lib/audit.js +96 -0
  253. package/scripts/lib/behavior.js +52 -0
  254. package/scripts/lib/frontmatter.js +65 -0
  255. package/scripts/lib/hooks-install.js +294 -0
  256. package/scripts/lib/i18n.js +51 -0
  257. package/scripts/lib/inventory.js +85 -0
  258. package/scripts/lib/lint.js +180 -0
  259. package/scripts/lib/mcp-install.js +288 -0
  260. package/scripts/lib/profiles.js +128 -0
  261. package/scripts/lib/render.js +92 -0
  262. package/scripts/lib/rules-install.js +118 -0
  263. package/scripts/lib/skills.js +87 -0
  264. package/scripts/lib/targets.js +123 -0
  265. package/skills/accounting-api-integration/SKILL.md +81 -0
  266. package/skills/accounting-api-integration/evals/triggers.json +17 -0
  267. package/skills/accounting-api-integration/references/quickbooks.md +48 -0
  268. package/skills/accounting-api-integration/references/xero.md +45 -0
  269. package/skills/agent-failure-debugging/SKILL.md +92 -0
  270. package/skills/agent-failure-debugging/evals/triggers.json +16 -0
  271. package/skills/agent-harness-design/SKILL.md +125 -0
  272. package/skills/agent-harness-design/evals/triggers.json +21 -0
  273. package/skills/agent-outbound-messaging/SKILL.md +92 -0
  274. package/skills/agent-outbound-messaging/evals/triggers.json +16 -0
  275. package/skills/agent-security/SKILL.md +117 -0
  276. package/skills/agent-security/evals/triggers.json +16 -0
  277. package/skills/agent-security/references/host-configs.md +37 -0
  278. package/skills/ai-media-generation/SKILL.md +89 -0
  279. package/skills/ai-media-generation/evals/triggers.json +16 -0
  280. package/skills/ai-media-generation/references/job-pipeline.md +76 -0
  281. package/skills/angular-patterns/SKILL.md +122 -0
  282. package/skills/angular-patterns/evals/triggers.json +16 -0
  283. package/skills/api-client-integration/SKILL.md +86 -0
  284. package/skills/api-client-integration/evals/triggers.json +16 -0
  285. package/skills/api-client-integration/references/resilience.md +57 -0
  286. package/skills/api-design/SKILL.md +96 -0
  287. package/skills/api-design/evals/triggers.json +18 -0
  288. package/skills/api-design/references/conventions.md +133 -0
  289. package/skills/architecture-decision-records/SKILL.md +98 -0
  290. package/skills/architecture-decision-records/evals/triggers.json +17 -0
  291. package/skills/article-writing/SKILL.md +108 -0
  292. package/skills/article-writing/evals/triggers.json +16 -0
  293. package/skills/aspnet-core-patterns/SKILL.md +149 -0
  294. package/skills/aspnet-core-patterns/evals/triggers.json +16 -0
  295. package/skills/auth-patterns/SKILL.md +104 -0
  296. package/skills/auth-patterns/evals/triggers.json +17 -0
  297. package/skills/auth-patterns/references/oauth-oidc.md +64 -0
  298. package/skills/autonomous-loops/SKILL.md +99 -0
  299. package/skills/autonomous-loops/evals/triggers.json +14 -0
  300. package/skills/aws-patterns/SKILL.md +91 -0
  301. package/skills/aws-patterns/evals/triggers.json +16 -0
  302. package/skills/azure-patterns/SKILL.md +86 -0
  303. package/skills/azure-patterns/evals/triggers.json +16 -0
  304. package/skills/benchmark-methodology/SKILL.md +88 -0
  305. package/skills/benchmark-methodology/evals/triggers.json +16 -0
  306. package/skills/benchmark-methodology/references/language-harnesses.md +130 -0
  307. package/skills/bgp-diagnostics/SKILL.md +84 -0
  308. package/skills/bgp-diagnostics/evals/triggers.json +18 -0
  309. package/skills/bgp-diagnostics/references/bgp-reference.md +81 -0
  310. package/skills/bioinformatics-workflows/SKILL.md +108 -0
  311. package/skills/bioinformatics-workflows/evals/triggers.json +16 -0
  312. package/skills/bioinformatics-workflows/references/commands.md +71 -0
  313. package/skills/bioinformatics-workflows/references/formats.md +24 -0
  314. package/skills/bioinformatics-workflows/references/workflow-managers.md +107 -0
  315. package/skills/blender-automation/SKILL.md +100 -0
  316. package/skills/blender-automation/evals/triggers.json +16 -0
  317. package/skills/blender-automation/references/batch-and-render.md +77 -0
  318. package/skills/blender-automation/references/bpy-inspection.md +91 -0
  319. package/skills/blender-automation/references/rig-and-retarget-checks.md +23 -0
  320. package/skills/brand-strategy/SKILL.md +83 -0
  321. package/skills/brand-strategy/evals/triggers.json +16 -0
  322. package/skills/brand-voice/SKILL.md +112 -0
  323. package/skills/brand-voice/evals/triggers.json +16 -0
  324. package/skills/browser-qa/SKILL.md +99 -0
  325. package/skills/browser-qa/evals/triggers.json +16 -0
  326. package/skills/bun-runtime/SKILL.md +93 -0
  327. package/skills/bun-runtime/evals/triggers.json +16 -0
  328. package/skills/change-impact-analysis/SKILL.md +89 -0
  329. package/skills/change-impact-analysis/evals/triggers.json +16 -0
  330. package/skills/change-impact-analysis/references/graph-commands.md +28 -0
  331. package/skills/cisco-ios-config/SKILL.md +101 -0
  332. package/skills/cisco-ios-config/evals/triggers.json +18 -0
  333. package/skills/cisco-ios-config/references/verification.md +63 -0
  334. package/skills/clickhouse-patterns/SKILL.md +101 -0
  335. package/skills/clickhouse-patterns/evals/triggers.json +18 -0
  336. package/skills/clickhouse-patterns/references/engines-and-views.md +138 -0
  337. package/skills/clinical-decision-support/SKILL.md +90 -0
  338. package/skills/clinical-decision-support/evals/triggers.json +16 -0
  339. package/skills/clinical-decision-support/references/cds-hooks.md +76 -0
  340. package/skills/clinical-decision-support/references/regulatory-boundaries.md +37 -0
  341. package/skills/code-tour/SKILL.md +97 -0
  342. package/skills/code-tour/evals/triggers.json +14 -0
  343. package/skills/codebase-onboarding/SKILL.md +112 -0
  344. package/skills/codebase-onboarding/evals/triggers.json +14 -0
  345. package/skills/cold-outreach-sequences/SKILL.md +90 -0
  346. package/skills/cold-outreach-sequences/evals/triggers.json +16 -0
  347. package/skills/content-repurposing/SKILL.md +82 -0
  348. package/skills/content-repurposing/evals/triggers.json +16 -0
  349. package/skills/context-budget/SKILL.md +84 -0
  350. package/skills/context-budget/evals/triggers.json +14 -0
  351. package/skills/contract-drafting/SKILL.md +96 -0
  352. package/skills/contract-drafting/evals/triggers.json +16 -0
  353. package/skills/contract-drafting/references/term-sheets.md +68 -0
  354. package/skills/contract-first-development/SKILL.md +86 -0
  355. package/skills/contract-first-development/evals/triggers.json +16 -0
  356. package/skills/contract-first-development/references/tooling.md +46 -0
  357. package/skills/conventional-commits/SKILL.md +144 -0
  358. package/skills/conventional-commits/evals/triggers.json +16 -0
  359. package/skills/cpp-patterns/SKILL.md +129 -0
  360. package/skills/cpp-patterns/evals/triggers.json +16 -0
  361. package/skills/cpp-patterns/references/cmake-and-tooling.md +88 -0
  362. package/skills/cpp-patterns/references/undefined-behaviour.md +75 -0
  363. package/skills/cpp-testing/SKILL.md +131 -0
  364. package/skills/cpp-testing/evals/triggers.json +16 -0
  365. package/skills/csharp-patterns/SKILL.md +110 -0
  366. package/skills/csharp-patterns/evals/triggers.json +17 -0
  367. package/skills/csharp-patterns/references/analyzers.md +59 -0
  368. package/skills/csharp-testing/SKILL.md +85 -0
  369. package/skills/csharp-testing/evals/triggers.json +17 -0
  370. package/skills/csharp-testing/references/integration-tests.md +77 -0
  371. package/skills/css-architecture/SKILL.md +143 -0
  372. package/skills/css-architecture/evals/triggers.json +16 -0
  373. package/skills/customs-trade-compliance/SKILL.md +95 -0
  374. package/skills/customs-trade-compliance/evals/triggers.json +16 -0
  375. package/skills/customs-trade-compliance/references/incoterms-2020.md +42 -0
  376. package/skills/dart-patterns/SKILL.md +157 -0
  377. package/skills/dart-patterns/evals/triggers.json +18 -0
  378. package/skills/dart-testing/SKILL.md +164 -0
  379. package/skills/dart-testing/evals/triggers.json +18 -0
  380. package/skills/data-analysis-notebooks/SKILL.md +113 -0
  381. package/skills/data-analysis-notebooks/evals/triggers.json +16 -0
  382. package/skills/data-analysis-notebooks/references/dataframe-pitfalls.md +49 -0
  383. package/skills/data-analysis-notebooks/references/statistics-pitfalls.md +24 -0
  384. package/skills/data-pipelines/SKILL.md +90 -0
  385. package/skills/data-pipelines/evals/triggers.json +16 -0
  386. package/skills/data-pipelines/references/orchestrators.md +64 -0
  387. package/skills/database-migrations/SKILL.md +102 -0
  388. package/skills/database-migrations/evals/triggers.json +16 -0
  389. package/skills/database-migrations/references/recipes.md +98 -0
  390. package/skills/database-migrations/references/tools.md +21 -0
  391. package/skills/dbt-patterns/SKILL.md +96 -0
  392. package/skills/dbt-patterns/evals/triggers.json +16 -0
  393. package/skills/dbt-patterns/references/yaml-examples.md +114 -0
  394. package/skills/decision-council/SKILL.md +98 -0
  395. package/skills/decision-council/evals/triggers.json +16 -0
  396. package/skills/deep-research/SKILL.md +107 -0
  397. package/skills/deep-research/evals/triggers.json +14 -0
  398. package/skills/dependency-audit/SKILL.md +103 -0
  399. package/skills/dependency-audit/evals/triggers.json +16 -0
  400. package/skills/dependency-audit/references/tools.md +124 -0
  401. package/skills/deployment-strategies/SKILL.md +108 -0
  402. package/skills/deployment-strategies/evals/triggers.json +16 -0
  403. package/skills/design-brainstorming/SKILL.md +132 -0
  404. package/skills/design-brainstorming/evals/behavior.json +55 -0
  405. package/skills/design-brainstorming/evals/triggers.json +16 -0
  406. package/skills/design-brainstorming/references/visual-mockups.md +34 -0
  407. package/skills/desktop-app-testing/SKILL.md +104 -0
  408. package/skills/desktop-app-testing/evals/triggers.json +16 -0
  409. package/skills/desktop-app-testing/references/drivers.md +81 -0
  410. package/skills/django-patterns/SKILL.md +123 -0
  411. package/skills/django-patterns/evals/triggers.json +16 -0
  412. package/skills/docker-patterns/SKILL.md +132 -0
  413. package/skills/docker-patterns/evals/triggers.json +16 -0
  414. package/skills/docker-patterns/references/dockerfiles.md +105 -0
  415. package/skills/document-processing/SKILL.md +100 -0
  416. package/skills/document-processing/evals/triggers.json +17 -0
  417. package/skills/document-processing/references/extraction-and-ocr.md +71 -0
  418. package/skills/document-processing/references/forms-and-conversion.md +69 -0
  419. package/skills/document-processing/references/redaction.md +61 -0
  420. package/skills/e2e-testing-playwright/SKILL.md +94 -0
  421. package/skills/e2e-testing-playwright/evals/triggers.json +16 -0
  422. package/skills/e2e-testing-playwright/references/config-and-ci.md +129 -0
  423. package/skills/ef-core-patterns/SKILL.md +117 -0
  424. package/skills/ef-core-patterns/evals/triggers.json +16 -0
  425. package/skills/email-deliverability/SKILL.md +99 -0
  426. package/skills/email-deliverability/evals/triggers.json +17 -0
  427. package/skills/email-deliverability/references/dns-records.md +85 -0
  428. package/skills/energy-procurement/SKILL.md +106 -0
  429. package/skills/energy-procurement/evals/triggers.json +16 -0
  430. package/skills/error-handling-patterns/SKILL.md +112 -0
  431. package/skills/error-handling-patterns/evals/triggers.json +18 -0
  432. package/skills/error-handling-patterns/references/language-idioms.md +49 -0
  433. package/skills/estimation-and-scoping/SKILL.md +97 -0
  434. package/skills/estimation-and-scoping/evals/triggers.json +14 -0
  435. package/skills/evm-dapp-integration/SKILL.md +73 -0
  436. package/skills/evm-dapp-integration/evals/triggers.json +16 -0
  437. package/skills/fastapi-patterns/SKILL.md +127 -0
  438. package/skills/fastapi-patterns/evals/triggers.json +16 -0
  439. package/skills/ffmpeg-media-processing/SKILL.md +94 -0
  440. package/skills/ffmpeg-media-processing/evals/triggers.json +16 -0
  441. package/skills/ffmpeg-media-processing/references/recipes.md +112 -0
  442. package/skills/fhir-integration/SKILL.md +81 -0
  443. package/skills/fhir-integration/evals/triggers.json +16 -0
  444. package/skills/fhir-integration/references/search-and-bundles.md +73 -0
  445. package/skills/fhir-integration/references/smart-on-fhir.md +50 -0
  446. package/skills/finishing-a-branch/SKILL.md +127 -0
  447. package/skills/finishing-a-branch/evals/behavior.json +49 -0
  448. package/skills/finishing-a-branch/evals/triggers.json +16 -0
  449. package/skills/flask-patterns/SKILL.md +132 -0
  450. package/skills/flask-patterns/evals/triggers.json +16 -0
  451. package/skills/flutter-patterns/SKILL.md +99 -0
  452. package/skills/flutter-patterns/evals/triggers.json +16 -0
  453. package/skills/flutterwave-integration/SKILL.md +75 -0
  454. package/skills/flutterwave-integration/evals/triggers.json +16 -0
  455. package/skills/flutterwave-integration/references/api.md +73 -0
  456. package/skills/flutterwave-integration/references/webhooks.md +49 -0
  457. package/skills/freight-carrier-management/SKILL.md +107 -0
  458. package/skills/freight-carrier-management/evals/triggers.json +16 -0
  459. package/skills/fsharp-patterns/SKILL.md +133 -0
  460. package/skills/fsharp-patterns/evals/triggers.json +16 -0
  461. package/skills/fsharp-testing/SKILL.md +136 -0
  462. package/skills/fsharp-testing/evals/triggers.json +16 -0
  463. package/skills/gcp-patterns/SKILL.md +86 -0
  464. package/skills/gcp-patterns/evals/triggers.json +16 -0
  465. package/skills/git-workflow/SKILL.md +114 -0
  466. package/skills/git-workflow/evals/triggers.json +16 -0
  467. package/skills/git-worktrees/SKILL.md +130 -0
  468. package/skills/git-worktrees/evals/behavior.json +56 -0
  469. package/skills/git-worktrees/evals/triggers.json +16 -0
  470. package/skills/github-actions-ci/SKILL.md +117 -0
  471. package/skills/github-actions-ci/evals/triggers.json +16 -0
  472. package/skills/github-api-automation/SKILL.md +101 -0
  473. package/skills/github-api-automation/evals/triggers.json +17 -0
  474. package/skills/go-patterns/SKILL.md +118 -0
  475. package/skills/go-patterns/evals/triggers.json +17 -0
  476. package/skills/go-patterns/references/concurrency.md +162 -0
  477. package/skills/go-testing/SKILL.md +154 -0
  478. package/skills/go-testing/evals/triggers.json +17 -0
  479. package/skills/google-workspace-integration/SKILL.md +65 -0
  480. package/skills/google-workspace-integration/evals/triggers.json +17 -0
  481. package/skills/google-workspace-integration/references/api.md +121 -0
  482. package/skills/harmonyos-arkts/SKILL.md +117 -0
  483. package/skills/harmonyos-arkts/evals/triggers.json +16 -0
  484. package/skills/harmonyos-arkts/references/build-errors.md +42 -0
  485. package/skills/hexagonal-architecture/SKILL.md +89 -0
  486. package/skills/hexagonal-architecture/evals/triggers.json +17 -0
  487. package/skills/hipaa-compliance/SKILL.md +91 -0
  488. package/skills/hipaa-compliance/evals/triggers.json +18 -0
  489. package/skills/hipaa-compliance/references/safeguards.md +68 -0
  490. package/skills/hl7v2-integration/SKILL.md +69 -0
  491. package/skills/hl7v2-integration/evals/triggers.json +16 -0
  492. package/skills/hl7v2-integration/references/messages-and-ack.md +78 -0
  493. package/skills/homelab-network-setup/SKILL.md +125 -0
  494. package/skills/homelab-network-setup/evals/triggers.json +18 -0
  495. package/skills/homelab-network-setup/references/firewall-and-dns.md +45 -0
  496. package/skills/homelab-network-setup/references/wireguard.md +72 -0
  497. package/skills/hubtel-integration/SKILL.md +77 -0
  498. package/skills/hubtel-integration/evals/triggers.json +16 -0
  499. package/skills/hubtel-integration/references/api.md +92 -0
  500. package/skills/i18n-localization/SKILL.md +114 -0
  501. package/skills/i18n-localization/evals/triggers.json +16 -0
  502. package/skills/i18n-localization/references/libraries.md +52 -0
  503. package/skills/implementation-plans/SKILL.md +117 -0
  504. package/skills/implementation-plans/evals/behavior.json +54 -0
  505. package/skills/implementation-plans/evals/triggers.json +16 -0
  506. package/skills/incident-postmortem/SKILL.md +118 -0
  507. package/skills/incident-postmortem/evals/triggers.json +14 -0
  508. package/skills/inventory-demand-planning/SKILL.md +89 -0
  509. package/skills/inventory-demand-planning/evals/triggers.json +16 -0
  510. package/skills/inventory-demand-planning/references/formulas.md +62 -0
  511. package/skills/investor-materials/SKILL.md +127 -0
  512. package/skills/investor-materials/evals/triggers.json +16 -0
  513. package/skills/investor-materials/references/templates.md +74 -0
  514. package/skills/invoicing-and-tax/SKILL.md +84 -0
  515. package/skills/invoicing-and-tax/evals/triggers.json +17 -0
  516. package/skills/invoicing-and-tax/references/e-invoicing.md +24 -0
  517. package/skills/invoicing-and-tax/references/invoice-fields.md +38 -0
  518. package/skills/invoicing-and-tax/references/rounding.md +26 -0
  519. package/skills/ios-platform-features/SKILL.md +99 -0
  520. package/skills/ios-platform-features/evals/triggers.json +16 -0
  521. package/skills/ios-platform-features/references/foundation-models.md +90 -0
  522. package/skills/java-patterns/SKILL.md +141 -0
  523. package/skills/java-patterns/evals/triggers.json +17 -0
  524. package/skills/java-testing/SKILL.md +142 -0
  525. package/skills/java-testing/evals/triggers.json +16 -0
  526. package/skills/jetpack-compose-patterns/SKILL.md +88 -0
  527. package/skills/jetpack-compose-patterns/evals/triggers.json +16 -0
  528. package/skills/jira-integration/SKILL.md +92 -0
  529. package/skills/jira-integration/evals/triggers.json +17 -0
  530. package/skills/jpa-hibernate/SKILL.md +92 -0
  531. package/skills/jpa-hibernate/evals/triggers.json +18 -0
  532. package/skills/jpa-hibernate/references/mapping.md +99 -0
  533. package/skills/jvm-sql-mappers/SKILL.md +98 -0
  534. package/skills/jvm-sql-mappers/evals/triggers.json +16 -0
  535. package/skills/jvm-sql-mappers/references/examples.md +129 -0
  536. package/skills/kotlin-multiplatform/SKILL.md +97 -0
  537. package/skills/kotlin-multiplatform/evals/triggers.json +16 -0
  538. package/skills/kotlin-patterns/SKILL.md +128 -0
  539. package/skills/kotlin-patterns/evals/triggers.json +16 -0
  540. package/skills/kotlin-testing/SKILL.md +117 -0
  541. package/skills/kotlin-testing/evals/triggers.json +16 -0
  542. package/skills/ktor-patterns/SKILL.md +135 -0
  543. package/skills/ktor-patterns/evals/triggers.json +18 -0
  544. package/skills/kubernetes-patterns/SKILL.md +106 -0
  545. package/skills/kubernetes-patterns/evals/triggers.json +16 -0
  546. package/skills/kubernetes-patterns/references/manifests.md +115 -0
  547. package/skills/laravel-patterns/SKILL.md +136 -0
  548. package/skills/laravel-patterns/evals/triggers.json +16 -0
  549. package/skills/linear-integration/SKILL.md +98 -0
  550. package/skills/linear-integration/evals/triggers.json +17 -0
  551. package/skills/literature-review/SKILL.md +109 -0
  552. package/skills/literature-review/evals/triggers.json +16 -0
  553. package/skills/literature-review/references/appraisal.md +41 -0
  554. package/skills/literature-review/references/search-sources.md +39 -0
  555. package/skills/llm-app-patterns/SKILL.md +97 -0
  556. package/skills/llm-app-patterns/evals/triggers.json +17 -0
  557. package/skills/llm-evals/SKILL.md +98 -0
  558. package/skills/llm-evals/evals/triggers.json +16 -0
  559. package/skills/llm-evals/references/graders.md +66 -0
  560. package/skills/logistics-exception-management/SKILL.md +90 -0
  561. package/skills/logistics-exception-management/evals/triggers.json +16 -0
  562. package/skills/manim-animations/SKILL.md +106 -0
  563. package/skills/manim-animations/evals/triggers.json +16 -0
  564. package/skills/market-research/SKILL.md +117 -0
  565. package/skills/market-research/evals/triggers.json +16 -0
  566. package/skills/marketing-campaign/SKILL.md +111 -0
  567. package/skills/marketing-campaign/evals/triggers.json +16 -0
  568. package/skills/mcp-server-patterns/SKILL.md +127 -0
  569. package/skills/mcp-server-patterns/evals/triggers.json +18 -0
  570. package/skills/mcp-server-patterns/references/protocol-notes.md +68 -0
  571. package/skills/metrics-dashboards/SKILL.md +113 -0
  572. package/skills/metrics-dashboards/evals/triggers.json +16 -0
  573. package/skills/ml-experiment-workflow/SKILL.md +125 -0
  574. package/skills/ml-experiment-workflow/evals/triggers.json +16 -0
  575. package/skills/mobile-accessibility/SKILL.md +94 -0
  576. package/skills/mobile-accessibility/evals/triggers.json +16 -0
  577. package/skills/mongodb-patterns/SKILL.md +115 -0
  578. package/skills/mongodb-patterns/evals/triggers.json +18 -0
  579. package/skills/mongodb-patterns/references/indexes-and-aggregation.md +94 -0
  580. package/skills/mpesa-daraja-integration/SKILL.md +70 -0
  581. package/skills/mpesa-daraja-integration/evals/triggers.json +16 -0
  582. package/skills/mpesa-daraja-integration/references/api.md +103 -0
  583. package/skills/mpesa-daraja-integration/references/callbacks.md +74 -0
  584. package/skills/mtn-momo-integration/SKILL.md +66 -0
  585. package/skills/mtn-momo-integration/evals/triggers.json +16 -0
  586. package/skills/mtn-momo-integration/references/api.md +153 -0
  587. package/skills/mtn-momo-integration/references/callbacks.md +92 -0
  588. package/skills/mtn-momo-integration/references/sandbox-and-go-live.md +51 -0
  589. package/skills/mtn-momo-integration/scripts/sandbox-setup.js +79 -0
  590. package/skills/mysql-patterns/SKILL.md +96 -0
  591. package/skills/mysql-patterns/evals/triggers.json +16 -0
  592. package/skills/mysql-patterns/references/explain.md +34 -0
  593. package/skills/mysql-patterns/references/online-ddl.md +41 -0
  594. package/skills/nestjs-patterns/SKILL.md +114 -0
  595. package/skills/nestjs-patterns/evals/triggers.json +16 -0
  596. package/skills/nestjs-patterns/references/testing.md +68 -0
  597. package/skills/network-automation/SKILL.md +107 -0
  598. package/skills/network-automation/evals/triggers.json +18 -0
  599. package/skills/network-automation/references/tool-snippets.md +153 -0
  600. package/skills/network-design/SKILL.md +98 -0
  601. package/skills/network-design/evals/triggers.json +16 -0
  602. package/skills/network-troubleshooting/SKILL.md +152 -0
  603. package/skills/network-troubleshooting/evals/triggers.json +18 -0
  604. package/skills/network-troubleshooting/references/commands.md +33 -0
  605. package/skills/nextjs-patterns/SKILL.md +150 -0
  606. package/skills/nextjs-patterns/evals/triggers.json +18 -0
  607. package/skills/nextjs-patterns/references/caching.md +87 -0
  608. package/skills/node-backend-patterns/SKILL.md +103 -0
  609. package/skills/node-backend-patterns/evals/triggers.json +16 -0
  610. package/skills/node-backend-patterns/references/templates.md +122 -0
  611. package/skills/nuxt-patterns/SKILL.md +103 -0
  612. package/skills/nuxt-patterns/evals/triggers.json +16 -0
  613. package/skills/observability/SKILL.md +125 -0
  614. package/skills/observability/evals/triggers.json +17 -0
  615. package/skills/observability/references/otel-setup.md +87 -0
  616. package/skills/observability/references/slo-alerts.md +70 -0
  617. package/skills/open-source-release/SKILL.md +107 -0
  618. package/skills/open-source-release/evals/triggers.json +15 -0
  619. package/skills/open-source-release/references/history-scrub.md +65 -0
  620. package/skills/parallel-agent-orchestration/SKILL.md +106 -0
  621. package/skills/parallel-agent-orchestration/evals/triggers.json +14 -0
  622. package/skills/patent-research/SKILL.md +94 -0
  623. package/skills/patent-research/evals/triggers.json +16 -0
  624. package/skills/patent-research/references/databases-and-queries.md +52 -0
  625. package/skills/paystack-integration/SKILL.md +59 -0
  626. package/skills/paystack-integration/evals/triggers.json +14 -0
  627. package/skills/paystack-integration/references/api.md +73 -0
  628. package/skills/paystack-integration/references/mobile-money.md +50 -0
  629. package/skills/paystack-integration/references/webhooks.md +80 -0
  630. package/skills/pci-dss-scope/SKILL.md +103 -0
  631. package/skills/pci-dss-scope/evals/triggers.json +18 -0
  632. package/skills/pci-dss-scope/references/saq-and-data.md +36 -0
  633. package/skills/perl-patterns/SKILL.md +135 -0
  634. package/skills/perl-patterns/evals/triggers.json +18 -0
  635. package/skills/perl-testing/SKILL.md +126 -0
  636. package/skills/perl-testing/evals/triggers.json +17 -0
  637. package/skills/php-patterns/SKILL.md +116 -0
  638. package/skills/php-patterns/evals/triggers.json +16 -0
  639. package/skills/php-testing/SKILL.md +123 -0
  640. package/skills/php-testing/evals/triggers.json +16 -0
  641. package/skills/postgres-patterns/SKILL.md +103 -0
  642. package/skills/postgres-patterns/evals/triggers.json +17 -0
  643. package/skills/postgres-patterns/references/explain.md +59 -0
  644. package/skills/postgres-patterns/references/locks.md +53 -0
  645. package/skills/prd-writing/SKILL.md +124 -0
  646. package/skills/prd-writing/evals/triggers.json +15 -0
  647. package/skills/prisma-patterns/SKILL.md +83 -0
  648. package/skills/prisma-patterns/evals/triggers.json +18 -0
  649. package/skills/prisma-patterns/references/prisma-8.md +46 -0
  650. package/skills/prisma-patterns/references/workflow.md +50 -0
  651. package/skills/privacy-compliance/SKILL.md +121 -0
  652. package/skills/privacy-compliance/evals/triggers.json +18 -0
  653. package/skills/privacy-compliance/references/jurisdictions.md +51 -0
  654. package/skills/production-scheduling/SKILL.md +98 -0
  655. package/skills/production-scheduling/evals/triggers.json +16 -0
  656. package/skills/prompt-engineering/SKILL.md +92 -0
  657. package/skills/prompt-engineering/evals/triggers.json +16 -0
  658. package/skills/prospect-research/SKILL.md +87 -0
  659. package/skills/prospect-research/evals/triggers.json +16 -0
  660. package/skills/python-app-distribution/SKILL.md +107 -0
  661. package/skills/python-app-distribution/evals/triggers.json +16 -0
  662. package/skills/python-app-distribution/references/pypi-trusted-publishing.md +55 -0
  663. package/skills/python-app-distribution/references/windows-macos-signing.md +70 -0
  664. package/skills/python-patterns/SKILL.md +107 -0
  665. package/skills/python-patterns/evals/triggers.json +16 -0
  666. package/skills/python-patterns/references/tooling.md +101 -0
  667. package/skills/python-testing/SKILL.md +126 -0
  668. package/skills/python-testing/evals/triggers.json +16 -0
  669. package/skills/python-testing/references/mocking.md +71 -0
  670. package/skills/pytorch-patterns/SKILL.md +139 -0
  671. package/skills/pytorch-patterns/evals/triggers.json +16 -0
  672. package/skills/pytorch-patterns/references/debugging.md +39 -0
  673. package/skills/quality-nonconformance/SKILL.md +107 -0
  674. package/skills/quality-nonconformance/evals/triggers.json +16 -0
  675. package/skills/quality-nonconformance/references/8d-and-capa.md +46 -0
  676. package/skills/quarkus-patterns/SKILL.md +93 -0
  677. package/skills/quarkus-patterns/evals/triggers.json +18 -0
  678. package/skills/rag-pipeline-patterns/SKILL.md +117 -0
  679. package/skills/rag-pipeline-patterns/evals/triggers.json +18 -0
  680. package/skills/rag-pipeline-patterns/references/evaluation.md +37 -0
  681. package/skills/rag-pipeline-patterns/references/retrieval-recipes.md +78 -0
  682. package/skills/rails-patterns/SKILL.md +132 -0
  683. package/skills/rails-patterns/evals/triggers.json +16 -0
  684. package/skills/react-native-patterns/SKILL.md +101 -0
  685. package/skills/react-native-patterns/evals/triggers.json +16 -0
  686. package/skills/react-patterns/SKILL.md +140 -0
  687. package/skills/react-patterns/evals/triggers.json +18 -0
  688. package/skills/react-performance/SKILL.md +107 -0
  689. package/skills/react-performance/evals/triggers.json +18 -0
  690. package/skills/react-testing/SKILL.md +121 -0
  691. package/skills/react-testing/evals/triggers.json +18 -0
  692. package/skills/react-testing/references/msw.md +64 -0
  693. package/skills/react-testing/references/queries.md +41 -0
  694. package/skills/react-testing/references/setup.md +74 -0
  695. package/skills/recommender-systems/SKILL.md +119 -0
  696. package/skills/recommender-systems/evals/triggers.json +16 -0
  697. package/skills/recommender-systems/references/evaluation.md +39 -0
  698. package/skills/redis-patterns/SKILL.md +109 -0
  699. package/skills/redis-patterns/evals/triggers.json +18 -0
  700. package/skills/redis-patterns/references/operations.md +61 -0
  701. package/skills/refactoring-safely/SKILL.md +107 -0
  702. package/skills/refactoring-safely/evals/behavior.json +57 -0
  703. package/skills/refactoring-safely/evals/triggers.json +17 -0
  704. package/skills/release-management/SKILL.md +141 -0
  705. package/skills/release-management/evals/triggers.json +16 -0
  706. package/skills/remotion-video/SKILL.md +91 -0
  707. package/skills/remotion-video/evals/triggers.json +16 -0
  708. package/skills/remotion-video/references/lambda.md +66 -0
  709. package/skills/reproducible-dev-environments/SKILL.md +132 -0
  710. package/skills/reproducible-dev-environments/evals/triggers.json +16 -0
  711. package/skills/responding-to-code-review/SKILL.md +124 -0
  712. package/skills/responding-to-code-review/evals/behavior.json +54 -0
  713. package/skills/responding-to-code-review/evals/triggers.json +16 -0
  714. package/skills/returns-reverse-logistics/SKILL.md +97 -0
  715. package/skills/returns-reverse-logistics/evals/triggers.json +16 -0
  716. package/skills/ruby-patterns/SKILL.md +127 -0
  717. package/skills/ruby-patterns/evals/triggers.json +18 -0
  718. package/skills/ruby-testing/SKILL.md +113 -0
  719. package/skills/ruby-testing/evals/triggers.json +18 -0
  720. package/skills/runbook-writing/SKILL.md +101 -0
  721. package/skills/runbook-writing/evals/triggers.json +14 -0
  722. package/skills/rust-patterns/SKILL.md +118 -0
  723. package/skills/rust-patterns/evals/triggers.json +16 -0
  724. package/skills/rust-patterns/references/cargo-and-clippy.md +105 -0
  725. package/skills/rust-patterns/references/errors-and-traits.md +97 -0
  726. package/skills/rust-testing/SKILL.md +148 -0
  727. package/skills/rust-testing/evals/triggers.json +16 -0
  728. package/skills/rust-testing/references/fakes-proptest-async.md +113 -0
  729. package/skills/search-first/SKILL.md +73 -0
  730. package/skills/search-first/evals/triggers.json +14 -0
  731. package/skills/security-review/SKILL.md +58 -0
  732. package/skills/security-review/evals/behavior.json +56 -0
  733. package/skills/security-review/evals/triggers.json +14 -0
  734. package/skills/security-review/references/checklist.md +54 -0
  735. package/skills/security-review/scripts/scan-secrets.js +79 -0
  736. package/skills/seo-audit/SKILL.md +111 -0
  737. package/skills/seo-audit/evals/triggers.json +16 -0
  738. package/skills/seo-audit/references/checks.md +65 -0
  739. package/skills/session-handoff/SKILL.md +101 -0
  740. package/skills/session-handoff/evals/behavior.json +55 -0
  741. package/skills/session-handoff/evals/triggers.json +14 -0
  742. package/skills/skill-authoring/SKILL.md +98 -0
  743. package/skills/skill-authoring/evals/triggers.json +15 -0
  744. package/skills/skill-authoring/references/frontmatter.md +40 -0
  745. package/skills/skill-authoring/references/pressure-testing.md +87 -0
  746. package/skills/slack-app-integration/SKILL.md +108 -0
  747. package/skills/slack-app-integration/evals/triggers.json +17 -0
  748. package/skills/slide-decks/SKILL.md +107 -0
  749. package/skills/slide-decks/evals/triggers.json +18 -0
  750. package/skills/slide-decks/references/html-decks.md +86 -0
  751. package/skills/slide-decks/references/layouts.md +45 -0
  752. package/skills/slide-decks/references/pptx.md +87 -0
  753. package/skills/smart-contract-security/SKILL.md +110 -0
  754. package/skills/smart-contract-security/evals/triggers.json +16 -0
  755. package/skills/smart-contract-security/references/vulnerability-checklist.md +79 -0
  756. package/skills/social-media-publishing/SKILL.md +84 -0
  757. package/skills/social-media-publishing/evals/triggers.json +17 -0
  758. package/skills/social-media-publishing/references/platform-apis.md +116 -0
  759. package/skills/solidity-patterns/SKILL.md +95 -0
  760. package/skills/solidity-patterns/evals/triggers.json +16 -0
  761. package/skills/spring-boot-patterns/SKILL.md +128 -0
  762. package/skills/spring-boot-patterns/evals/triggers.json +18 -0
  763. package/skills/spring-boot-patterns/references/testing.md +72 -0
  764. package/skills/stripe-integration/SKILL.md +69 -0
  765. package/skills/stripe-integration/evals/triggers.json +16 -0
  766. package/skills/stripe-integration/references/api.md +71 -0
  767. package/skills/stripe-integration/references/billing.md +58 -0
  768. package/skills/stripe-integration/references/webhooks.md +76 -0
  769. package/skills/subagent-driven-development/SKILL.md +109 -0
  770. package/skills/subagent-driven-development/evals/behavior.json +53 -0
  771. package/skills/subagent-driven-development/evals/triggers.json +15 -0
  772. package/skills/subagent-driven-development/references/implementer-brief.md +60 -0
  773. package/skills/subagent-driven-development/references/reviewer-briefs.md +52 -0
  774. package/skills/subscription-billing-ops/SKILL.md +118 -0
  775. package/skills/subscription-billing-ops/evals/triggers.json +17 -0
  776. package/skills/subscription-billing-ops/references/proration.md +47 -0
  777. package/skills/subscription-billing-ops/references/revenue-metrics.md +38 -0
  778. package/skills/svelte-patterns/SKILL.md +122 -0
  779. package/skills/svelte-patterns/evals/triggers.json +16 -0
  780. package/skills/swift-patterns/SKILL.md +113 -0
  781. package/skills/swift-patterns/evals/triggers.json +16 -0
  782. package/skills/swift-patterns/references/concurrency-migration.md +40 -0
  783. package/skills/swift-testing/SKILL.md +121 -0
  784. package/skills/swift-testing/evals/triggers.json +16 -0
  785. package/skills/swift-testing/references/swift-testing-cheatsheet.md +81 -0
  786. package/skills/swiftui-patterns/SKILL.md +102 -0
  787. package/skills/swiftui-patterns/evals/triggers.json +16 -0
  788. package/skills/systematic-debugging/SKILL.md +92 -0
  789. package/skills/systematic-debugging/evals/behavior.json +59 -0
  790. package/skills/systematic-debugging/evals/triggers.json +16 -0
  791. package/skills/systematic-debugging/references/condition-waiting.md +52 -0
  792. package/skills/systematic-debugging/references/root-cause-tracing.md +49 -0
  793. package/skills/systematic-debugging/references/test-pollution.md +46 -0
  794. package/skills/tdd-workflow/SKILL.md +69 -0
  795. package/skills/tdd-workflow/evals/behavior.json +55 -0
  796. package/skills/tdd-workflow/evals/triggers.json +15 -0
  797. package/skills/tdd-workflow/references/testing-anti-patterns.md +87 -0
  798. package/skills/technical-writing/SKILL.md +95 -0
  799. package/skills/technical-writing/evals/triggers.json +14 -0
  800. package/skills/terraform-patterns/SKILL.md +122 -0
  801. package/skills/terraform-patterns/evals/triggers.json +16 -0
  802. package/skills/terraform-patterns/references/backends.md +67 -0
  803. package/skills/test-coverage-improvement/SKILL.md +107 -0
  804. package/skills/test-coverage-improvement/evals/triggers.json +16 -0
  805. package/skills/threat-modeling/SKILL.md +113 -0
  806. package/skills/threat-modeling/evals/triggers.json +16 -0
  807. package/skills/transactional-email/SKILL.md +68 -0
  808. package/skills/transactional-email/evals/triggers.json +17 -0
  809. package/skills/transactional-email/references/providers.md +63 -0
  810. package/skills/typescript-patterns/SKILL.md +122 -0
  811. package/skills/typescript-patterns/evals/triggers.json +16 -0
  812. package/skills/typescript-testing/SKILL.md +101 -0
  813. package/skills/typescript-testing/evals/triggers.json +16 -0
  814. package/skills/ui-demo-recording/SKILL.md +93 -0
  815. package/skills/ui-demo-recording/evals/triggers.json +16 -0
  816. package/skills/ui-demo-recording/references/cursor-and-captions.md +48 -0
  817. package/skills/ui-demo-recording/references/playwright-recording.md +63 -0
  818. package/skills/ui-demo-recording/references/post-processing.md +57 -0
  819. package/skills/ui-design-polish/SKILL.md +113 -0
  820. package/skills/ui-design-polish/evals/triggers.json +18 -0
  821. package/skills/ui-design-polish/references/detail-checklist.md +45 -0
  822. package/skills/ui-design-polish/references/tokens.md +68 -0
  823. package/skills/ui-flow-audit/SKILL.md +112 -0
  824. package/skills/ui-flow-audit/evals/triggers.json +17 -0
  825. package/skills/ui-motion/SKILL.md +103 -0
  826. package/skills/ui-motion/evals/triggers.json +18 -0
  827. package/skills/ui-motion/references/patterns.md +138 -0
  828. package/skills/ui-motion/references/tokens.md +52 -0
  829. package/skills/unicode-text-processing/SKILL.md +103 -0
  830. package/skills/unicode-text-processing/evals/triggers.json +17 -0
  831. package/skills/unicode-text-processing/references/apis.md +89 -0
  832. package/skills/unicode-text-processing/references/script-notes.md +50 -0
  833. package/skills/verification-loop/SKILL.md +70 -0
  834. package/skills/verification-loop/evals/behavior.json +52 -0
  835. package/skills/verification-loop/evals/triggers.json +14 -0
  836. package/skills/verification-loop/scripts/detect-checks.js +102 -0
  837. package/skills/video-editing/SKILL.md +111 -0
  838. package/skills/video-editing/evals/triggers.json +16 -0
  839. package/skills/video-editing/references/edl-and-logging.md +44 -0
  840. package/skills/video-editing/references/ffmpeg-edit-recipes.md +92 -0
  841. package/skills/video-editing/references/resolve-scripting.md +53 -0
  842. package/skills/vite-patterns/SKILL.md +117 -0
  843. package/skills/vite-patterns/evals/triggers.json +16 -0
  844. package/skills/vue-patterns/SKILL.md +104 -0
  845. package/skills/vue-patterns/evals/triggers.json +16 -0
  846. package/skills/web-accessibility/SKILL.md +119 -0
  847. package/skills/web-accessibility/evals/triggers.json +16 -0
  848. package/skills/web-performance/SKILL.md +107 -0
  849. package/skills/web-performance/evals/triggers.json +16 -0
  850. package/skills/web-scraping/SKILL.md +80 -0
  851. package/skills/web-scraping/evals/triggers.json +16 -0
@@ -0,0 +1,101 @@
1
+ ---
2
+ name: cisco-ios-config
3
+ description: Reads and writes Cisco IOS and IOS-XE running configuration by hand without cutting off access, covering access and trunk switchports, VLANs and VTP, named extended ACLs edited by sequence number, static routes and basic OSPF, SSH and local user hardening, config archive with configure replace and revert timers, and the show commands that prove each change worked. Use when someone needs CLI commands for a Catalyst switch or ISR/ASR/Catalyst 8000 router, wants a pasted show running-config explained, is about to change a trunk, ACL or VTY line remotely, or needs to roll a Cisco device back to an earlier config.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Works from pasted configuration; live use needs an SSH or console session to the device. Syntax varies by platform and release; check the command reference for the exact IOS/IOS-XE version.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: devops
9
+ kete-loom/risk: read-only
10
+ kete-loom/owner: "Kete-org"
11
+ ---
12
+
13
+ # Cisco IOS and IOS-XE configuration
14
+
15
+ Produce Cisco CLI changes that are minimal, reversible and verified, and explain existing configuration accurately. The operator pastes the commands; this skill writes them, the safety net and the checks.
16
+
17
+ For a per-area list of verification commands and expected output, read `references/verification.md`.
18
+
19
+ ## 0. Before writing any command
20
+
21
+ 1. Get `show version` (platform, IOS or IOS-XE release) and the relevant section of the running config: `show running-config | section <keyword>` or `show running-config interface <if>`. Never write a change against a config you have not seen.
22
+ 2. Ask how the operator is connected: console, or SSH through which interface and VLAN. Any change on that path is a **lockout risk**.
23
+ 3. **Stop and ask** before changing: the management VLAN/SVI, the uplink trunk, VTY `access-class`, AAA/`login` settings, the default route, or routing toward the management network. Propose the change with the revert timer from step 1 below and wait for agreement.
24
+
25
+ ## 1. Safety net for every remote change
26
+
27
+ Enable the archive once (if `show archive` says it is not configured):
28
+
29
+ ```
30
+ archive
31
+ path flash:archive
32
+ maximum 10
33
+ write-memory
34
+ ```
35
+
36
+ Use `bootflash:` instead of `flash:` where that is the platform's local file system. `write-memory` saves an archive copy each time the config is saved.
37
+
38
+ Then, for each change:
39
+
40
+ ```
41
+ configure terminal revert timer 10
42
+ ... changes ...
43
+ end
44
+ ```
45
+
46
+ Verify (step 4). If good, `configure confirm` within the timer, then save. If you lose access, the device rolls back to the archived config when the timer (minutes) runs out. Where the archive is not available, the older fallback is `reload in 10` before the change and `reload cancel` after verifying; it only works if the startup config is the known-good one, and it reboots the device.
47
+
48
+ To return to a saved state on purpose: `configure replace flash:<file>` (replaces the whole running config, unlike `copy <file> running-config`, which only merges). Preview with `show archive config differences flash:<file> system:running-config`.
49
+
50
+ ## 2. Writing changes
51
+
52
+ **Interfaces and VLANs**
53
+ - Access port: `switchport mode access`, `switchport access vlan <id>`, `spanning-tree portfast` (edge ports only), `description <what is connected>`.
54
+ - Trunks: add VLANs with `switchport trunk allowed vlan add <ids>`. `switchport trunk allowed vlan <ids>` without `add` **replaces** the whole list and is a classic outage. Remove with `remove`.
55
+ - Native VLAN: `switchport trunk native vlan <id>` must match on both ends, or untagged traffic (and often the management path) breaks and CDP logs a native VLAN mismatch. Change it with the revert timer running, and plan both ends of the link.
56
+ - Some platforms need `switchport trunk encapsulation dot1q` before `switchport mode trunk`.
57
+ - Create VLANs with `vlan <id>` + `name <name>`. Check `show vtp status` first: a switch in VTP server/client mode can have its VLAN database overwritten by a higher revision. Recommend `vtp mode transparent` or `off` unless VTP is deliberately in use.
58
+ - Reset a port to defaults with `default interface <if>` rather than removing lines one by one.
59
+
60
+ **ACLs**
61
+ - Use named extended ACLs with explicit sequence numbers: `ip access-list extended <NAME>`, `10 permit tcp 10.1.0.0 0.0.255.255 host 10.2.0.5 eq 443`. Remember the implicit `deny any` at the end; add an explicit `deny ip any any log` only when the operator wants the logging.
62
+ - Edit in place: insert with a new sequence number, delete with `no <seq>`, renumber with `ip access-list resequence <NAME> 10 10`. Never delete and re-create an ACL that is applied to a live interface or VTY line.
63
+ - Apply: `ip access-group <NAME> in|out` on the interface; `access-class <NAME> in` under `line vty 0 15` (check how many VTY lines exist with `show line`).
64
+ - Wildcard masks are inverse: `/24` is `0.0.0.255`.
65
+
66
+ **Routing basics**
67
+ - Static: `ip route <prefix> <mask> <next-hop> [distance] name <label>`. A floating backup route uses a higher distance than the primary.
68
+ - OSPF: `router ospf <pid>`, `router-id <x.x.x.x>`, `passive-interface default` then `no passive-interface <uplink>`, and `network <net> <wildcard> area <n>` or `ip ospf <pid> area <n>` on the interface. Changing a router ID or area on a live router resets adjacencies; plan a window.
69
+ - Never remove `router ospf` or `router bgp` to "start clean" on a live device.
70
+
71
+ **Management hardening**
72
+ - `ip ssh version 2` (or the release default), `transport input ssh` under VTY lines, `login local` or AAA, `exec-timeout 10 0`.
73
+ - Local users: `username <u> privilege 15 algorithm-type scrypt secret <pw>` and `enable algorithm-type scrypt secret <pw>` where the release supports it. Type 7 (`password` + `service password-encryption`) is reversible; do not treat it as protection.
74
+ - `no ip http server` unless the web UI is needed; prefer `ip http secure-server` if it is.
75
+
76
+ ## 3. Explaining a pasted config
77
+
78
+ Go section by section (interfaces, VLANs, ACLs, routing, management, AAA, logging/NTP/SNMP). For each: what it does, anything risky (any/any rules, SNMP `public`, telnet enabled, type 7 or plaintext passwords, unused ports in VLAN 1 and up), and anything inconsistent (ACL referenced but not defined, VLAN on a trunk that does not exist). Replace every password, secret, key and community with `<redacted>` in your reply.
79
+
80
+ ## 4. Verify every change
81
+
82
+ Run the matching checks from `references/verification.md` and compare with the output captured before the change. Minimum: `show ip interface brief`, the section you changed, `show logging | include <if or feature>`, and reachability from the management station. Only then `configure confirm` and `copy running-config startup-config` (or `write memory`).
83
+
84
+ ## Never
85
+
86
+ - `write erase`, `erase startup-config`, `delete flash:*`, `reload` without a scheduled `reload cancel` plan, or `format`.
87
+ - `no vlan <id>` or trunk allowed-list changes on uplinks without checking which ports and neighbors use the VLAN.
88
+ - Paste a large config block into a live session without a revert timer.
89
+ - Save to startup before the change is verified.
90
+ - Echo secrets back to the user, even from their own paste.
91
+
92
+ ## Report back
93
+
94
+ ```
95
+ Device: <hostname>, platform <model>, release <version>
96
+ Change: <one line>
97
+ Commands: <block, with revert timer wrapping>
98
+ Verify: <show commands and the expected result>
99
+ Rollback: <configure revert now / configure replace <file> / reload cancel>
100
+ Lockout risk: <none | what could cut access and how the timer covers it>
101
+ ```
@@ -0,0 +1,18 @@
1
+ {
2
+ "should_trigger": [
3
+ "I need to add VLAN 40 to the trunk on Gi1/0/48 of our Catalyst 9300 without breaking the other VLANs",
4
+ "Give me the IOS-XE commands to restrict SSH on the VTY lines to the 10.10.0.0/16 admin subnet",
5
+ "Explain what each part of this show running-config from our ISR 4331 is doing",
6
+ "How do I roll this Cisco switch back to yesterday's config after a bad change?",
7
+ "Change the native VLAN on a Cisco trunk remotely without locking myself out",
8
+ "Write a named extended ACL on IOS that only lets the web servers reach the database on 5432"
9
+ ],
10
+ "should_not_trigger": [
11
+ "Our BGP neighbor to the upstream ISP shows Idle (PfxCt), what happened?",
12
+ "Write an Ansible playbook using cisco.ios.ios_vlans to roll VLANs out to 80 switches",
13
+ "Audit this pfSense export and MikroTik config for ports open to the internet",
14
+ "Our Wi-Fi clients get an IP but can't load any websites, how do I narrow it down?",
15
+ "Design VLANs for my home lab with a guest network and an IoT network",
16
+ "Write a Kubernetes NetworkPolicy so only the API pods can reach Postgres"
17
+ ]
18
+ }
@@ -0,0 +1,63 @@
1
+ # Verification commands
2
+
3
+ Capture each relevant command before and after a change. Exact output columns vary by platform and release.
4
+
5
+ ## Device and config state
6
+
7
+ | Command | Look for |
8
+ |---|---|
9
+ | `show version` | Platform, release, uptime, config register |
10
+ | `show running-config \| section <kw>` | The block you changed, as the device stores it |
11
+ | `show archive` | Archive enabled, the most recent archive file names |
12
+ | `show archive config differences <a> <b>` | Line-level diff between two configs (for example an archive file and `system:running-config`) |
13
+ | `show archive log config all` | Who changed what, if `archive` + `log config` + `logging enable` are configured |
14
+ | `show logging` | `%LINK-3-UPDOWN`, `%LINEPROTO-5-UPDOWN`, `%SYS-5-CONFIG_I`, error messages after the change |
15
+
16
+ ## Interfaces and switching
17
+
18
+ | Command | Look for |
19
+ |---|---|
20
+ | `show ip interface brief` | Status/Protocol `up up`; `administratively down` means `shutdown` |
21
+ | `show interfaces status` | Per port: VLAN, duplex, speed, `err-disabled`, `notconnect` |
22
+ | `show interfaces <if>` | Input/CRC errors, output drops, duplex mismatch symptoms |
23
+ | `show interfaces trunk` | Mode, native VLAN, allowed VLANs and VLANs forwarding on each trunk |
24
+ | `show vlan brief` | VLAN exists, active, and which access ports are in it |
25
+ | `show vtp status` | VTP mode and configuration revision |
26
+ | `show spanning-tree vlan <id>` | Root bridge, port roles; blocked ports you did not expect |
27
+ | `show mac address-table interface <if>` | Hosts learned on the port |
28
+ | `show cdp neighbors detail` / `show lldp neighbors` | What is cabled to each port |
29
+ | `show errdisable recovery` | Why a port went err-disabled and whether it recovers |
30
+
31
+ ## ACLs
32
+
33
+ | Command | Look for |
34
+ |---|---|
35
+ | `show access-lists <NAME>` | Sequence numbers and per-entry match counters rising for the traffic you expect |
36
+ | `show ip interface <if> \| include access list` | Which ACL is applied inbound and outbound |
37
+ | `show line` / `show running-config \| section line vty` | VTY line count and the `access-class` applied |
38
+
39
+ ## Routing
40
+
41
+ | Command | Look for |
42
+ |---|---|
43
+ | `show ip route <prefix>` | Which source and next hop won, and its distance/metric |
44
+ | `show ip route summary` | Route counts per source, before vs after |
45
+ | `show ip protocols` | Running routing processes, networks, passive interfaces |
46
+ | `show ip ospf neighbor` | Adjacencies in `FULL` (or `2WAY` to DROTHER on broadcast segments) |
47
+ | `show ip ospf interface brief` | Interfaces in OSPF, area, cost, state |
48
+ | `ping <ip> source <if>` / `traceroute <ip>` | Reachability along the path you changed |
49
+
50
+ ## Management
51
+
52
+ | Command | Look for |
53
+ |---|---|
54
+ | `show ip ssh` | SSH enabled and version |
55
+ | `show users` | Your own session still listed, and from which line |
56
+ | `show ntp associations` | A synced peer (`*`) so logs have correct timestamps |
57
+
58
+ ## Sources
59
+
60
+ - `configure terminal revert timer` and `configure revert` (1 to 120 minutes), `configure replace`: https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/fundamentals/command/cf_command_ref/C_commands.html
61
+ - Archive `maximum` (1 to 14, default 10) and configuration rollback: https://www.cisco.com/c/en/us/td/docs/switches/lan/catalyst9500/software/release/16-6/configuration_guide/sys_mgmt/b_166_sys_mgmt_9500_cg/b_166_sys_mgmt_9500_cg_chapter_01001.html
62
+ - Configuration change logger (`archive` / `log config` / `logging enable`, `show archive log config`): https://www.cisco.com/c/en/us/td/docs/routers/ios/config/17-x/syst-mgmt/b-system-management/m_cm-config-logger-0.html
63
+ - Type 8 and type 9 (`algorithm-type scrypt`) secrets and release support: https://sec.cloudapps.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-npe-hardening-Dkel83jP
@@ -0,0 +1,101 @@
1
+ ---
2
+ name: clickhouse-patterns
3
+ description: ClickHouse table and query design for analytics, choosing a MergeTree family engine, ordering the sorting key for the filters that matter, keeping partitions coarse, building incremental and refreshable materialised views, batching or async-inserting writes to avoid too many parts, and reading EXPLAIN and system tables to make slow queries fast. Use when creating or changing ClickHouse tables, ingesting events into ClickHouse, a ClickHouse query scans too many rows, or deduplication and rollups give unexpected results.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. SQL runs in clickhouse-client or any ClickHouse driver. ClickHouse Cloud uses SharedMergeTree under the same MergeTree syntax; self-hosted replication uses Replicated* engines.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: data
9
+ kete-loom/risk: runs-commands
10
+ kete-loom/requires: "clickhouse-client"
11
+ kete-loom/owner: "Kete-org"
12
+ ---
13
+
14
+ # ClickHouse patterns
15
+
16
+ ClickHouse is fast when it reads few granules of few columns, and when it receives few, large inserts. Almost every problem is a sorting key, a partition key or an insert pattern that breaks one of those. Engine details and view recipes are in `references/engines-and-views.md`.
17
+
18
+ ## 0. Before you start
19
+
20
+ 1. Get the version and deployment: `SELECT version()`, and whether it's ClickHouse Cloud, a single server, or a replicated cluster (`SELECT * FROM system.clusters`). Use the engine family the existing tables use.
21
+ 2. Read the current table: `SHOW CREATE TABLE db.events`. Never guess the sorting key.
22
+ 3. List the top queries the table must serve: which columns they filter on, group by and return, and the time range. If the table already exists, pull them from `system.query_log` (see section 5). If you can't get them, **stop and ask the user**; the sorting key depends on them.
23
+ 4. The sorting key and partition key can't be changed in place. Changing them means a new table and a backfill (`INSERT INTO new SELECT * FROM old`, in chunks). Agree that plan with the user before starting.
24
+ 5. Never run `DROP TABLE`, `TRUNCATE`, `ALTER TABLE ... DROP PARTITION`, `ALTER TABLE ... DELETE/UPDATE` or `OPTIMIZE ... FINAL` on a shared or production server without explicit approval. Mutations rewrite whole parts and can run for hours.
25
+
26
+ ## 1. Sorting key (ORDER BY)
27
+
28
+ The sorting key decides how much data a query can skip. The primary index is sparse: one entry per granule (8192 rows by default).
29
+
30
+ 1. Start with the columns most queries filter on with equality, usually a tenant, project or event type.
31
+ 2. Order them from **low to high cardinality**: `ORDER BY (tenant_id, event_type, toDate(ts), user_id)`. Low-cardinality leading columns also compress better.
32
+ 3. Put the time column after the equality filters, at the coarsest grain the queries need (`toDate(ts)` or `toStartOfHour(ts)` rather than the raw timestamp), unless queries are mainly time-range scans across all tenants.
33
+ 4. Keep it to about four or five columns. Columns no query filters on don't belong in it.
34
+ 5. `PRIMARY KEY` defaults to `ORDER BY`. Make it a shorter prefix only if the index is too big to keep in memory.
35
+
36
+ Check a query's pruning with `EXPLAIN indexes = 1 SELECT ...`: compare `Granules: selected/total` for the primary key. A query that selects most granules needs a different key, a projection, or a skip index.
37
+
38
+ ## 2. Partitions
39
+
40
+ - Partitioning is for **data management** (dropping or moving old data, TTL), not for speed.
41
+ - Use a coarse key, usually `PARTITION BY toYYYYMM(ts)`, or none at all for small tables. Keep the number of partitions well under about 1000.
42
+ - Never partition by a high-cardinality column (user ID, raw timestamp, day across many years): every insert touching many partitions creates many parts and ends in `Too many parts` errors.
43
+ - Expire data with `TTL ts + INTERVAL 90 DAY`; whole expired partitions are dropped cheaply, especially with `ttl_only_drop_parts = 1`.
44
+
45
+ ## 3. Inserts
46
+
47
+ - Insert in **batches of at least 1,000 rows, ideally 10,000 to 100,000**, at about one insert per second per table or less. Each insert creates at least one part per partition it touches.
48
+ - When many clients send small writes (events from apps, logs), enable server-side buffering instead of building a batcher: `SETTINGS async_insert = 1, wait_for_async_insert = 1`. Keep `wait_for_async_insert = 1` so errors reach the client.
49
+ - Inserts are retried safely when the same block is resent to a replicated or Cloud table: identical blocks are deduplicated. Keep retries byte-identical (same rows, same order).
50
+ - Use the native or RowBinary formats from drivers for throughput; JSONEachRow is fine for moderate volumes.
51
+ - Watch part counts: `SELECT table, partition, count() FROM system.parts WHERE active GROUP BY table, partition ORDER BY count() DESC`. Hundreds of active parts in one partition means inserts are too small or too spread out.
52
+
53
+ ## 4. Column types
54
+
55
+ - Use the smallest type that fits (`UInt32` not `Int64` for counts, `Date` when you don't need time, `DateTime64(3)` for milliseconds).
56
+ - `LowCardinality(String)` for strings with fewer than about 10,000 distinct values (country, status, event name).
57
+ - Avoid `Nullable` unless "unknown" is different from a default; it adds a hidden column and slows queries. Use `DEFAULT` values.
58
+ - Use `Decimal` for money. Add codecs (`CODEC(Delta, ZSTD)` for monotonic timestamps and counters) only after checking `system.columns` compression ratios.
59
+ - Use `Map`, `Tuple`, `JSON` or a `String` column with JSON functions for semi-structured data, and pull hot fields into real columns (`MATERIALIZED JSONExtractString(raw, 'path')`).
60
+
61
+ ## 5. Query optimisation
62
+
63
+ 1. Find the slow queries:
64
+ ```sql
65
+ SELECT query, query_duration_ms, read_rows, formatReadableSize(read_bytes) AS read, memory_usage
66
+ FROM system.query_log
67
+ WHERE type = 'QueryFinish' AND event_time > now() - INTERVAL 1 DAY
68
+ ORDER BY read_bytes DESC LIMIT 20
69
+ ```
70
+ 2. Read fewer columns: never `SELECT *` in production queries.
71
+ 3. Filter on sorting-key columns, in key order. ClickHouse moves selective filters to `PREWHERE` on its own; check with `EXPLAIN`.
72
+ 4. For a second access path, add a **projection** (`ALTER TABLE t ADD PROJECTION p (SELECT * ORDER BY user_id)`, then `ALTER TABLE t MATERIALIZE PROJECTION p` to build it for existing parts; that is a mutation, so ask first on production) or a materialised view into a table with a different key. For needle-in-haystack filters, a skip index (`INDEX idx col TYPE bloom_filter GRANULARITY 4`) can help; prove it with `EXPLAIN indexes = 1`.
73
+ 5. Joins: put the smaller table on the right side, filter both sides before joining, and use dictionaries (`dictGet`) for dimension lookups.
74
+ 6. Use `uniq` instead of `uniqExact` and `quantile` instead of `quantileExact` when approximate is acceptable; say so to the user.
75
+ 7. Pre-aggregate dashboards with a materialised view (section 6) instead of scanning raw events on every page load.
76
+
77
+ ## 6. Materialised views and rollups
78
+
79
+ - An **incremental** materialised view (`CREATE MATERIALIZED VIEW mv TO target AS SELECT ...`) is an insert trigger: it processes only blocks inserted into the source after it is created. It does **not** see existing rows; backfill them with an explicit `INSERT INTO target SELECT ...`.
80
+ - Always use `TO <target table>` so you control the target's engine, key and TTL.
81
+ - Rollups into `SummingMergeTree` or `AggregatingMergeTree` are merged in the background, so rows for one key may exist several times. Queries must still aggregate (`sum(...)`, `uniqMerge(...)` with `GROUP BY`).
82
+ - A **refreshable** materialised view (`REFRESH EVERY 1 HOUR`) re-runs a full query on a schedule; use it for joins and heavy reports where incremental logic is wrong.
83
+ - `ReplacingMergeTree` deduplicates rows with the same sorting key only during merges, at an unknown time. Read with `FINAL` or `argMax(..., version)` per key when you need the latest row.
84
+
85
+ ## Never
86
+
87
+ - Insert one row per request without async inserts.
88
+ - Use `ALTER TABLE ... UPDATE` as a normal write path; model changes as new rows (ReplacingMergeTree, versioned rows) or use lightweight `DELETE FROM` sparingly.
89
+ - Run `OPTIMIZE TABLE ... FINAL` on a schedule to "fix" duplicates; fix the query instead.
90
+ - Claim a speedup without `read_rows` and `query_duration_ms` before and after.
91
+
92
+ ## Report format (when reviewing)
93
+
94
+ ```
95
+ ClickHouse review: <tables or queries>
96
+ Deployment/version: <Cloud | single | replicated>, <version>
97
+ Findings:
98
+ 1. [severity] <table or file:line>: <problem> → <fix>
99
+ Evidence: <query> read_rows / granules selected / duration, before → after
100
+ Not verified: <anything you could not run>
101
+ ```
@@ -0,0 +1,18 @@
1
+ {
2
+ "should_trigger": [
3
+ "Design a ClickHouse table for page view events, what ORDER BY and PARTITION BY should it have?",
4
+ "We get DB::Exception Too many parts when our services insert into ClickHouse",
5
+ "My ClickHouse materialized view doesn't include the rows that were already in the table",
6
+ "ReplacingMergeTree still shows duplicate rows, how do I query only the latest version?",
7
+ "This ClickHouse dashboard query reads 2 billion rows, help me make it faster",
8
+ "Build a daily rollup of events per tenant with AggregatingMergeTree and uniqState"
9
+ ],
10
+ "should_not_trigger": [
11
+ "Our Postgres reporting query is slow, should we add a BRIN index on created_at?",
12
+ "Write a MongoDB aggregation pipeline that groups orders by customer",
13
+ "Set up a Redis sorted set leaderboard for the game",
14
+ "Model order events in the Prisma schema and generate the client",
15
+ "Build a Grafana dashboard for our API latency metrics",
16
+ "Benchmark two implementations of our JSON parser fairly"
17
+ ]
18
+ }
@@ -0,0 +1,138 @@
1
+ # ClickHouse engines and materialised view recipes
2
+
3
+ Read this when choosing an engine, writing a rollup, or deduplicating. Check syntax against clickhouse.com/docs for the server version in use. On ClickHouse Cloud, write the plain engine name (`MergeTree`, `ReplacingMergeTree`); the service maps it to its shared engine. On a self-hosted cluster, use the `Replicated*` variant with the `ON CLUSTER` conventions the existing tables use.
4
+
5
+ ## Choosing an engine
6
+
7
+ | Engine | Merges rows with the same sorting key by | Use for |
8
+ |---|---|---|
9
+ | `MergeTree` | nothing (keeps all rows) | raw events, logs, append-only facts |
10
+ | `ReplacingMergeTree(version)` | keeping the row with the highest `version` (or the last inserted) | latest state per entity, upserts, CDC from OLTP |
11
+ | `SummingMergeTree` | summing numeric columns | simple counters per key |
12
+ | `AggregatingMergeTree` | merging `AggregateFunction` states | rollups with `uniq`, `quantile`, `avg` |
13
+ | `CollapsingMergeTree(sign)` / `VersionedCollapsingMergeTree` | cancelling `+1`/`-1` row pairs | changing aggregates with explicit cancel rows |
14
+
15
+ All merging is eventual. Queries must be correct before merges happen.
16
+
17
+ ## Raw events table
18
+
19
+ ```sql
20
+ CREATE TABLE analytics.events
21
+ (
22
+ tenant_id UInt32,
23
+ event_type LowCardinality(String),
24
+ ts DateTime64(3),
25
+ user_id UInt64,
26
+ session_id String,
27
+ props String CODEC(ZSTD(3))
28
+ )
29
+ ENGINE = MergeTree
30
+ PARTITION BY toYYYYMM(ts)
31
+ ORDER BY (tenant_id, event_type, toDate(ts), user_id)
32
+ TTL toDateTime(ts) + INTERVAL 13 MONTH
33
+ SETTINGS ttl_only_drop_parts = 1;
34
+ ```
35
+
36
+ ## Latest state with ReplacingMergeTree
37
+
38
+ ```sql
39
+ CREATE TABLE app.users_latest
40
+ (
41
+ user_id UInt64,
42
+ email String,
43
+ plan LowCardinality(String),
44
+ updated_at DateTime64(3),
45
+ is_deleted UInt8 DEFAULT 0
46
+ )
47
+ ENGINE = ReplacingMergeTree(updated_at)
48
+ ORDER BY user_id;
49
+ ```
50
+
51
+ Read the current state either way:
52
+
53
+ ```sql
54
+ SELECT * FROM app.users_latest FINAL WHERE is_deleted = 0;
55
+
56
+ SELECT user_id, argMax(plan, updated_at) AS plan
57
+ FROM app.users_latest
58
+ GROUP BY user_id;
59
+ ```
60
+
61
+ `FINAL` is much cheaper on recent versions than it used to be, but still costs more than a plain read; measure it. Newer versions also accept an `is_deleted` column as a second engine parameter; check the docs for your version before relying on it.
62
+
63
+ ## Daily rollup with AggregatingMergeTree
64
+
65
+ ```sql
66
+ CREATE TABLE analytics.daily_events
67
+ (
68
+ tenant_id UInt32,
69
+ day Date,
70
+ event_type LowCardinality(String),
71
+ events SimpleAggregateFunction(sum, UInt64),
72
+ users AggregateFunction(uniq, UInt64)
73
+ )
74
+ ENGINE = AggregatingMergeTree
75
+ PARTITION BY toYYYYMM(day)
76
+ ORDER BY (tenant_id, day, event_type);
77
+
78
+ CREATE MATERIALIZED VIEW analytics.daily_events_mv TO analytics.daily_events AS
79
+ SELECT tenant_id, toDate(ts) AS day, event_type,
80
+ count() AS events,
81
+ uniqState(user_id) AS users
82
+ FROM analytics.events
83
+ GROUP BY tenant_id, day, event_type;
84
+ ```
85
+
86
+ Query it with merge functions, always grouping:
87
+
88
+ ```sql
89
+ SELECT day, sum(events) AS events, uniqMerge(users) AS users
90
+ FROM analytics.daily_events
91
+ WHERE tenant_id = 42 AND day >= today() - 30
92
+ GROUP BY day ORDER BY day;
93
+ ```
94
+
95
+ Backfill existing data once, in chunks by partition, with the same SELECT as the view:
96
+
97
+ ```sql
98
+ INSERT INTO analytics.daily_events
99
+ SELECT tenant_id, toDate(ts) AS day, event_type, count(), uniqState(user_id)
100
+ FROM analytics.events
101
+ WHERE toYYYYMM(ts) = 202609
102
+ GROUP BY tenant_id, day, event_type;
103
+ ```
104
+
105
+ To avoid double counting, create the view first, note the time, and backfill only rows before it, or pause ingestion during the switch.
106
+
107
+ ## Materialised view gotchas
108
+
109
+ - The view's SELECT runs on each inserted **block**, not on the whole table. A `GROUP BY` in it aggregates within the block only; the target engine finishes the job.
110
+ - A failing view makes the insert into the source fail. Test the view's SELECT on sample data first.
111
+ - Joins inside an incremental view read the right-hand table at insert time; later changes to it don't update old rows. Use a dictionary or a refreshable view instead.
112
+ - Changing a view: create the new target and view, backfill, switch readers, then drop the old ones.
113
+
114
+ ## Refreshable view
115
+
116
+ ```sql
117
+ CREATE MATERIALIZED VIEW reports.top_customers
118
+ REFRESH EVERY 1 HOUR
119
+ ENGINE = MergeTree ORDER BY revenue
120
+ AS SELECT customer_id, sum(amount) AS revenue
121
+ FROM sales.orders
122
+ GROUP BY customer_id
123
+ ORDER BY revenue DESC
124
+ LIMIT 100;
125
+ ```
126
+
127
+ Each refresh replaces the content atomically. Check status in `system.view_refreshes`.
128
+
129
+ ## Useful system tables
130
+
131
+ | Table | Use |
132
+ |---|---|
133
+ | `system.query_log` | slow and heavy queries, `read_rows`, `memory_usage` |
134
+ | `system.parts` | active part counts and sizes per partition |
135
+ | `system.merges` | merges in progress |
136
+ | `system.mutations` | `ALTER ... UPDATE/DELETE` progress (`is_done`) |
137
+ | `system.columns` | compressed vs uncompressed size per column |
138
+ | `system.replication_queue` | replicated table backlogs (self-hosted) |
@@ -0,0 +1,90 @@
1
+ ---
2
+ name: clinical-decision-support
3
+ description: Engineering discipline for software that recommends or warns at the point of care, including CDS Hooks services (discovery, patient-view and order-sign hooks, prefetch, cards, suggestions, feedback), alert design that avoids alert fatigue, versioned rule logic tied to cited evidence, clinician sign-off and regression testing on synthetic cases, override and audit trails, and the regulatory line where software becomes a medical device (FDA CDS guidance, EU MDR Rule 11, UK DCB0129). Use when building drug-interaction or dosing alerts, risk scores, care-gap reminders or AI suggestions shown to clinicians, writing a CDS Hooks service, or deciding whether a clinical feature needs regulatory or clinical-safety review.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Works on any codebase; CDS Hooks testing needs a FHIR sandbox or the CDS Hooks sandbox. Regulatory statements must be checked against current FDA, EU and national guidance by a qualified person.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: compliance
9
+ kete-loom/risk: writes-files
10
+ kete-loom/owner: "Kete-org"
11
+ ---
12
+
13
+ # Clinical decision support
14
+
15
+ Build decision support that clinicians trust: it fires rarely and correctly, shows its reasoning and evidence, can be overridden with a reason, is traceable to a reviewed rule version, and stays on the right side of medical device regulation.
16
+
17
+ ## Boundary: not clinical, legal or regulatory advice
18
+
19
+ - You engineer the system. You never author or approve clinical content (thresholds, doses, interactions, risk cut-offs). A named clinician owns every rule and signs off each version.
20
+ - You never decide whether the product is a regulated medical device. You flag the questions; regulatory affairs or counsel decides.
21
+ - Say this once, plainly, when the user asks for clinical thresholds or a regulatory verdict, then continue with the engineering. Never invent a clinical threshold to fill a gap; leave a named placeholder and stop.
22
+
23
+ ## Step 1: classify the feature before building
24
+
25
+ Answer these and write the answers into the design doc:
26
+
27
+ 1. **Who sees it?** A healthcare professional, a patient or caregiver, or nobody (automatic action)?
28
+ 2. **What does it do?** Display reference information, flag something for review, recommend one action, or take an action automatically?
29
+ 3. **What are the inputs?** Structured data and published guidelines, or medical images, signals (ECG, waveforms) or IVD data?
30
+ 4. **Can the clinician independently review the basis?** Are the inputs, logic and evidence shown so they need not rely on the software alone?
31
+ 5. **Is it time-critical?** Would a clinician have time to review the basis before acting?
32
+
33
+ Then apply the regulatory flags in `references/regulatory-boundaries.md`. If the feature analyses images or signals, targets patients directly, acts automatically, is opaque (for example an ML model whose basis the clinician cannot review), or is used in time-critical decisions, **stop and tell the user it needs regulatory review before build**.
34
+
35
+ ## Step 2: design the intervention
36
+
37
+ - **Fire only when actionable.** Every alert names one specific patient, finding and action. If nobody can act on it right now, it is not an interruptive alert: make it passive (a chart flag, a worklist, `info` card) or drop it.
38
+ - **Right time, right person.** Trigger at the workflow step where the decision is made (for drug checks: `order-select` or `order-sign`, not `patient-view`). Target the role that can act.
39
+ - **Severity is earned.** Reserve interruptive or `critical` for harm that is likely and serious. Tier everything else. Track the override rate per rule; a rule overridden most of the time is noise and needs clinical review.
40
+ - **Show the why.** Include the triggering data (values, dates), the rule's logic in plain words, and a link to the evidence source.
41
+ - **Make the right action one click.** Offer a concrete suggestion (adjust dose, order test, discontinue) and allow override with a structured reason.
42
+ - **Suppress duplicates.** Don't re-fire the same alert for the same patient and data in one session; respect snoozes and documented exceptions.
43
+ - **Fail safe and visible.** If the CDS service is down or data is missing, show nothing interruptive but never imply "no issues found". Missing inputs must not be treated as normal values.
44
+
45
+ ## Step 3: build the logic as versioned, reviewable artefacts
46
+
47
+ - Keep rules in data or a dedicated module (for example CQL libraries, or a rules table), not scattered through UI code.
48
+ - Each rule has: ID, semantic version, owner clinician, evidence citation (guideline, version, date), inputs with code systems (LOINC, SNOMED CT, RxNorm), logic, outputs, effective date, review-by date.
49
+ - Units and codes are explicit. Convert units with a library (UCUM), never assume. Handle `preliminary`, `corrected` and `entered-in-error` source data.
50
+ - Every change goes through code review **and** clinical review, and bumps the rule version. Record who approved and when.
51
+
52
+ ## Step 4: implement the delivery
53
+
54
+ For EHR-embedded CDS use CDS Hooks as in `references/cds-hooks.md`: a discovery endpoint, one service per hook, prefetch templates for the data you need, cards with `summary`, `indicator`, `source` and suggestions, and the feedback endpoint to capture accept/override. Authenticate the EHR's JWT on every call and use the `fhirAuthorization` token only for the patient in context.
55
+
56
+ ## Step 5: test with clinicians
57
+
58
+ 1. Build a test set of synthetic patients (never real records) per rule: must fire, must not fire, boundary values, missing data, unit variants, corrected results, duplicate orders.
59
+ 2. Store expected outputs and run them as automated regression tests on every change.
60
+ 3. A clinician reviews the cases and the card wording before release and signs the test report.
61
+ 4. Pilot silently first where possible ("shadow mode": evaluate and log, don't show) and compare fire rates with expectations.
62
+
63
+ ## Step 6: audit and monitor
64
+
65
+ Log, for every evaluation that produced output: timestamp, rule ID and version, patient reference (internal ID, not name), user, hook instance, card shown, action taken, override reason. Keep it append-only and access-controlled like other PHI logs (`hipaa-compliance`). Review override rates, fire rates and reported incidents on a schedule, and give clinicians a way to report a bad alert.
66
+
67
+ ## Stop and ask the user
68
+
69
+ - Before writing any clinical threshold, dose, interaction or score cut-off: ask who the clinical owner is and for the source.
70
+ - When Step 1 raises a regulatory flag.
71
+ - Before making any alert interruptive, or any action automatic.
72
+ - Before shipping a rule change without recorded clinical sign-off.
73
+
74
+ ## Never
75
+
76
+ - Never auto-order, auto-cancel or auto-change medication or orders without explicit clinical governance approval.
77
+ - Never hide the inputs or reasoning behind a recommendation.
78
+ - Never treat missing data as normal.
79
+ - Never ship ML-based suggestions as if they were rule-based, or without documented validation on the target population.
80
+ - Never let a CDS outage silently disable safety checks without telling users.
81
+
82
+ ## Report format
83
+
84
+ ```
85
+ Feature: <name>, audience, hook or trigger point
86
+ Classification: <answers to Step 1>, regulatory flags: <none | list → needs regulatory review>
87
+ Rules: <ID@version, owner, evidence source> per rule
88
+ Test coverage: <cases per rule, clinician sign-off status>
89
+ Open items for clinical/regulatory owners: <list>
90
+ ```
@@ -0,0 +1,16 @@
1
+ {
2
+ "should_trigger": [
3
+ "Build a CDS Hooks service that warns at order-sign when a renally cleared drug is ordered for a patient with low eGFR",
4
+ "Our sepsis alert fires constantly and nurses override 95% of them, how should we redesign it?",
5
+ "Does our symptom checker that recommends a diagnosis to patients count as a medical device under FDA rules?",
6
+ "Set up versioning, clinician sign-off and regression tests for our medication dosing rules",
7
+ "How do we audit which decision support cards were shown, accepted or overridden by each clinician?"
8
+ ],
9
+ "should_not_trigger": [
10
+ "Fetch MedicationRequest resources from the EHR's FHIR API with a SMART standalone launch",
11
+ "Parse ORU^R01 lab results arriving over MLLP and send an ACK",
12
+ "Which HIPAA safeguards does our telehealth backend need for video visits?",
13
+ "Train a gradient boosting model to predict readmission and report its AUC",
14
+ "Review the clinic scheduling service for PHI in logs and missing consent checks"
15
+ ]
16
+ }
@@ -0,0 +1,76 @@
1
+ # CDS Hooks implementation notes
2
+
3
+ Source: CDS Hooks specification 2.0 (cds-hooks.hl7.org, STU 2, based on FHIR R4). Check the EHR vendor's docs for which hooks and features they support.
4
+
5
+ ## Endpoints
6
+
7
+ | Endpoint | Purpose |
8
+ |---|---|
9
+ | `GET {base}/cds-services` | discovery: list of services with `hook`, `id`, `title`, `description`, `prefetch`, optional `usageRequirements` |
10
+ | `POST {base}/cds-services/{id}` | invoke a service for a hook |
11
+ | `POST {base}/cds-services/{id}/feedback` | the EHR reports which cards and suggestions were accepted or overridden |
12
+
13
+ ## Standard hooks
14
+
15
+ `patient-view`, `order-select`, `order-sign`, `order-dispatch`, `appointment-book`, `encounter-start`, `encounter-discharge`, `medication-refill`, `allergyintolerance-create`, `problem-list-item-create`. (`medication-prescribe` and `order-review` are deprecated.) Each hook defines its `context` fields, for example `order-sign` carries `userId`, `patientId`, `encounterId` and `draftOrders` (a Bundle).
16
+
17
+ ## Discovery example
18
+
19
+ ```json
20
+ {
21
+ "services": [{
22
+ "hook": "order-sign",
23
+ "id": "renal-dose-check",
24
+ "title": "Renal dose check",
25
+ "description": "Flags renally cleared drugs ordered for patients with reduced eGFR",
26
+ "prefetch": {
27
+ "patient": "Patient/{{context.patientId}}",
28
+ "egfr": "Observation?patient={{context.patientId}}&code=http://loinc.org|<egfr-code>&_sort=-date&_count=1"
29
+ }
30
+ }]
31
+ }
32
+ ```
33
+
34
+ Prefetch is an optimisation the EHR may skip: if a key is missing, fetch it from `fhirServer` with `fhirAuthorization.access_token`, and if neither is available return no cards rather than guessing. Log that the check could not run and count it, so an outage shows up in monitoring instead of looking like "no issues".
35
+
36
+ ## Request fields
37
+
38
+ `hook`, `hookInstance` (UUID, use it as the correlation ID in audit logs), `fhirServer`, `fhirAuthorization` (`access_token`, `token_type`, `expires_in`, `scope`, `subject`), `context`, `prefetch`.
39
+
40
+ ## Security
41
+
42
+ - The EHR sends a signed JWT bearer token in `Authorization`. Verify it on every request: signature against the EHR's JWK Set (from the optional `jku` header only if that URL is on your allowlist, otherwise a key exchanged out of band), `iss` on your allowlist of EHRs, `aud` equal to the URL of the endpoint being called (`{base}/cds-services/{id}`), `exp` not passed, `iat` present, `jti` not replayed.
43
+ - Use the `fhirAuthorization` token only for the patient in context and discard it after the call.
44
+ - Never log `prefetch` or `context` bodies; log `hookInstance`, service ID, rule versions and card UUIDs.
45
+
46
+ ## Response
47
+
48
+ ```json
49
+ {
50
+ "cards": [{
51
+ "uuid": "6f0c...",
52
+ "summary": "Dose may be too high for eGFR 25 (under 140 chars)",
53
+ "detail": "Markdown: triggering values, the rule in plain words, evidence link",
54
+ "indicator": "warning",
55
+ "source": { "label": "Renal dosing rules v1.4.0", "url": "https://example.org/evidence" },
56
+ "suggestions": [{ "label": "Reduce dose", "uuid": "...", "isRecommended": true, "actions": [{ "type": "update", "description": "...", "resource": {} }] }],
57
+ "selectionBehavior": "at-most-one",
58
+ "overrideReasons": [{ "code": "benefit-outweighs-risk", "system": "https://example.org/override-reasons", "display": "Benefit outweighs risk" }],
59
+ "links": [{ "label": "Guideline", "url": "https://...", "type": "absolute" }]
60
+ }],
61
+ "systemActions": []
62
+ }
63
+ ```
64
+
65
+ - `indicator`: `info`, `warning`, `critical` (increasing urgency).
66
+ - `selectionBehavior` is required when `suggestions` is present.
67
+ - `systemActions` are applied by the EHR without showing the user: leave empty unless clinical governance has approved the automation.
68
+ - Return `{"cards": []}` when nothing applies. Respond fast (the clinician is waiting); set a timeout budget well under the EHR's.
69
+
70
+ ## Feedback
71
+
72
+ Give every card and suggestion a `uuid`: the EHR sends no feedback for a card or suggestion without one. Store each feedback item (`card`, `outcome` accepted/overridden, `acceptedSuggestions`, `overrideReason`, `outcomeTimestamp`) against the rule version. This is the data for override-rate and alert-fatigue review.
73
+
74
+ ## Testing
75
+
76
+ The public CDS Hooks sandbox (sandbox.cds-hooks.org) can call a service you host and render its cards. Use synthetic patients only.