@ketecode/loom 0.0.0-stage → 0.1.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 (656) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +516 -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/triggers.json +14 -0
  13. package/agents/code-simplifier/AGENT.md +74 -0
  14. package/agents/code-simplifier/evals/triggers.json +15 -0
  15. package/agents/cpp-build-resolver/AGENT.md +73 -0
  16. package/agents/cpp-build-resolver/evals/triggers.json +16 -0
  17. package/agents/cpp-reviewer/AGENT.md +59 -0
  18. package/agents/cpp-reviewer/evals/triggers.json +16 -0
  19. package/agents/csharp-build-resolver/AGENT.md +84 -0
  20. package/agents/csharp-build-resolver/evals/triggers.json +17 -0
  21. package/agents/csharp-reviewer/AGENT.md +88 -0
  22. package/agents/csharp-reviewer/evals/triggers.json +17 -0
  23. package/agents/dart-build-resolver/AGENT.md +80 -0
  24. package/agents/dart-build-resolver/evals/triggers.json +17 -0
  25. package/agents/dart-reviewer/AGENT.md +66 -0
  26. package/agents/dart-reviewer/evals/triggers.json +17 -0
  27. package/agents/database-reviewer/AGENT.md +72 -0
  28. package/agents/database-reviewer/evals/triggers.json +16 -0
  29. package/agents/django-reviewer/AGENT.md +61 -0
  30. package/agents/django-reviewer/evals/triggers.json +15 -0
  31. package/agents/doc-updater/AGENT.md +92 -0
  32. package/agents/doc-updater/evals/triggers.json +14 -0
  33. package/agents/e2e-runner/AGENT.md +88 -0
  34. package/agents/e2e-runner/evals/triggers.json +16 -0
  35. package/agents/fastapi-reviewer/AGENT.md +63 -0
  36. package/agents/fastapi-reviewer/evals/triggers.json +15 -0
  37. package/agents/flutter-reviewer/AGENT.md +70 -0
  38. package/agents/flutter-reviewer/evals/triggers.json +15 -0
  39. package/agents/fsharp-build-resolver/AGENT.md +81 -0
  40. package/agents/fsharp-build-resolver/evals/triggers.json +15 -0
  41. package/agents/fsharp-reviewer/AGENT.md +77 -0
  42. package/agents/fsharp-reviewer/evals/triggers.json +15 -0
  43. package/agents/go-build-resolver/AGENT.md +85 -0
  44. package/agents/go-build-resolver/evals/triggers.json +16 -0
  45. package/agents/go-reviewer/AGENT.md +66 -0
  46. package/agents/go-reviewer/evals/triggers.json +16 -0
  47. package/agents/healthcare-reviewer/AGENT.md +65 -0
  48. package/agents/healthcare-reviewer/evals/triggers.json +16 -0
  49. package/agents/i18n-reviewer/AGENT.md +64 -0
  50. package/agents/i18n-reviewer/evals/triggers.json +16 -0
  51. package/agents/infra-reviewer/AGENT.md +93 -0
  52. package/agents/infra-reviewer/evals/triggers.json +15 -0
  53. package/agents/java-build-resolver/AGENT.md +82 -0
  54. package/agents/java-build-resolver/evals/triggers.json +16 -0
  55. package/agents/java-reviewer/AGENT.md +64 -0
  56. package/agents/java-reviewer/evals/triggers.json +16 -0
  57. package/agents/kotlin-build-resolver/AGENT.md +89 -0
  58. package/agents/kotlin-build-resolver/evals/triggers.json +16 -0
  59. package/agents/kotlin-reviewer/AGENT.md +75 -0
  60. package/agents/kotlin-reviewer/evals/triggers.json +16 -0
  61. package/agents/mle-reviewer/AGENT.md +68 -0
  62. package/agents/mle-reviewer/evals/triggers.json +16 -0
  63. package/agents/network-config-reviewer/AGENT.md +68 -0
  64. package/agents/network-config-reviewer/evals/triggers.json +17 -0
  65. package/agents/payments-reviewer/AGENT.md +64 -0
  66. package/agents/payments-reviewer/evals/triggers.json +16 -0
  67. package/agents/performance-optimizer/AGENT.md +86 -0
  68. package/agents/performance-optimizer/evals/triggers.json +16 -0
  69. package/agents/perl-build-resolver/AGENT.md +84 -0
  70. package/agents/perl-build-resolver/evals/triggers.json +15 -0
  71. package/agents/perl-reviewer/AGENT.md +77 -0
  72. package/agents/perl-reviewer/evals/triggers.json +15 -0
  73. package/agents/php-build-resolver/AGENT.md +88 -0
  74. package/agents/php-build-resolver/evals/triggers.json +16 -0
  75. package/agents/php-reviewer/AGENT.md +61 -0
  76. package/agents/php-reviewer/evals/triggers.json +15 -0
  77. package/agents/planner/AGENT.md +75 -0
  78. package/agents/planner/evals/triggers.json +17 -0
  79. package/agents/pr-test-analyzer/AGENT.md +82 -0
  80. package/agents/pr-test-analyzer/evals/triggers.json +16 -0
  81. package/agents/python-build-resolver/AGENT.md +87 -0
  82. package/agents/python-build-resolver/evals/triggers.json +16 -0
  83. package/agents/python-reviewer/AGENT.md +63 -0
  84. package/agents/python-reviewer/evals/triggers.json +15 -0
  85. package/agents/rag-reviewer/AGENT.md +71 -0
  86. package/agents/rag-reviewer/evals/triggers.json +16 -0
  87. package/agents/react-reviewer/AGENT.md +70 -0
  88. package/agents/react-reviewer/evals/triggers.json +16 -0
  89. package/agents/refactor-cleaner/AGENT.md +82 -0
  90. package/agents/refactor-cleaner/evals/triggers.json +16 -0
  91. package/agents/ruby-build-resolver/AGENT.md +93 -0
  92. package/agents/ruby-build-resolver/evals/triggers.json +16 -0
  93. package/agents/ruby-reviewer/AGENT.md +62 -0
  94. package/agents/ruby-reviewer/evals/triggers.json +16 -0
  95. package/agents/rust-build-resolver/AGENT.md +98 -0
  96. package/agents/rust-build-resolver/evals/triggers.json +16 -0
  97. package/agents/rust-reviewer/AGENT.md +78 -0
  98. package/agents/rust-reviewer/evals/triggers.json +15 -0
  99. package/agents/security-reviewer/AGENT.md +84 -0
  100. package/agents/security-reviewer/evals/triggers.json +16 -0
  101. package/agents/silent-failure-hunter/AGENT.md +66 -0
  102. package/agents/silent-failure-hunter/evals/triggers.json +16 -0
  103. package/agents/solidity-reviewer/AGENT.md +70 -0
  104. package/agents/solidity-reviewer/evals/triggers.json +16 -0
  105. package/agents/swift-build-resolver/AGENT.md +85 -0
  106. package/agents/swift-build-resolver/evals/triggers.json +15 -0
  107. package/agents/swift-reviewer/AGENT.md +75 -0
  108. package/agents/swift-reviewer/evals/triggers.json +15 -0
  109. package/agents/typescript-build-resolver/AGENT.md +76 -0
  110. package/agents/typescript-build-resolver/evals/triggers.json +15 -0
  111. package/agents/typescript-reviewer/AGENT.md +76 -0
  112. package/agents/typescript-reviewer/evals/triggers.json +15 -0
  113. package/agents/vue-reviewer/AGENT.md +75 -0
  114. package/agents/vue-reviewer/evals/triggers.json +15 -0
  115. package/bin/kete-loom.js +683 -0
  116. package/commands/aside.md +19 -0
  117. package/commands/build-fix.md +26 -0
  118. package/commands/campaign.md +19 -0
  119. package/commands/changelog.md +36 -0
  120. package/commands/checkpoint.md +26 -0
  121. package/commands/codemap.md +25 -0
  122. package/commands/commit.md +26 -0
  123. package/commands/deps-audit.md +32 -0
  124. package/commands/epic-decompose.md +21 -0
  125. package/commands/explain.md +37 -0
  126. package/commands/feature-dev.md +22 -0
  127. package/commands/hookify.md +23 -0
  128. package/commands/i18n-check.md +39 -0
  129. package/commands/issue-sync.md +22 -0
  130. package/commands/jira.md +19 -0
  131. package/commands/learn.md +23 -0
  132. package/commands/loom.md +21 -0
  133. package/commands/loop.md +20 -0
  134. package/commands/model-route.md +27 -0
  135. package/commands/onboard.md +35 -0
  136. package/commands/orchestrate.md +21 -0
  137. package/commands/plan-feature.md +36 -0
  138. package/commands/postmortem.md +42 -0
  139. package/commands/pr-describe.md +39 -0
  140. package/commands/pr.md +22 -0
  141. package/commands/prd.md +41 -0
  142. package/commands/project-init.md +21 -0
  143. package/commands/refactor-clean.md +24 -0
  144. package/commands/resume-session.md +22 -0
  145. package/commands/review.md +35 -0
  146. package/commands/save-session.md +37 -0
  147. package/commands/security-scan.md +32 -0
  148. package/commands/sessions.md +21 -0
  149. package/commands/skill-create.md +21 -0
  150. package/commands/tdd.md +36 -0
  151. package/commands/test-coverage.md +24 -0
  152. package/commands/threat-model.md +36 -0
  153. package/commands/update-docs.md +25 -0
  154. package/commands/verify.md +21 -0
  155. package/hooks/block-dangerous-commands/HOOK.md +30 -0
  156. package/hooks/block-dangerous-commands/cases.json +50 -0
  157. package/hooks/block-dangerous-commands/hook.js +75 -0
  158. package/hooks/block-no-verify/HOOK.md +25 -0
  159. package/hooks/block-no-verify/cases.json +30 -0
  160. package/hooks/block-no-verify/hook.js +43 -0
  161. package/hooks/format-on-edit/HOOK.md +24 -0
  162. package/hooks/format-on-edit/hook.js +89 -0
  163. package/hooks/guard-secrets/HOOK.md +19 -0
  164. package/hooks/guard-secrets/cases.json +110 -0
  165. package/hooks/guard-secrets/hook.js +44 -0
  166. package/hooks/load-session-context/HOOK.md +20 -0
  167. package/hooks/load-session-context/hook.js +56 -0
  168. package/hooks/protect-files/HOOK.md +24 -0
  169. package/hooks/protect-files/cases.json +27 -0
  170. package/hooks/protect-files/hook.js +39 -0
  171. package/hooks/run.js +132 -0
  172. package/mcp/atlassian.json +11 -0
  173. package/mcp/chrome-devtools.json +18 -0
  174. package/mcp/cloudflare.json +11 -0
  175. package/mcp/context7.json +11 -0
  176. package/mcp/fetch.json +17 -0
  177. package/mcp/figma.json +11 -0
  178. package/mcp/git.json +17 -0
  179. package/mcp/github.json +11 -0
  180. package/mcp/linear.json +11 -0
  181. package/mcp/memory.json +18 -0
  182. package/mcp/notion.json +11 -0
  183. package/mcp/playwright.json +18 -0
  184. package/mcp/sentry.json +11 -0
  185. package/mcp/stripe.json +11 -0
  186. package/mcp/supabase.json +11 -0
  187. package/mcp/time.json +17 -0
  188. package/package.json +59 -4
  189. package/profiles.json +165 -0
  190. package/rules/common.md +21 -0
  191. package/rules/cpp.md +29 -0
  192. package/rules/csharp.md +25 -0
  193. package/rules/dart.md +29 -0
  194. package/rules/fsharp.md +28 -0
  195. package/rules/git.md +26 -0
  196. package/rules/go.md +29 -0
  197. package/rules/java.md +29 -0
  198. package/rules/kotlin.md +27 -0
  199. package/rules/perl.md +26 -0
  200. package/rules/php.md +28 -0
  201. package/rules/python.md +30 -0
  202. package/rules/ruby.md +27 -0
  203. package/rules/rust.md +26 -0
  204. package/rules/security.md +29 -0
  205. package/rules/swift.md +28 -0
  206. package/rules/testing.md +25 -0
  207. package/rules/typescript.md +29 -0
  208. package/schemas/skill-frontmatter.schema.json +52 -0
  209. package/scripts/lib/audit.js +96 -0
  210. package/scripts/lib/frontmatter.js +65 -0
  211. package/scripts/lib/hooks-install.js +292 -0
  212. package/scripts/lib/i18n.js +51 -0
  213. package/scripts/lib/inventory.js +85 -0
  214. package/scripts/lib/lint.js +158 -0
  215. package/scripts/lib/mcp-install.js +284 -0
  216. package/scripts/lib/profiles.js +128 -0
  217. package/scripts/lib/render.js +86 -0
  218. package/scripts/lib/rules-install.js +118 -0
  219. package/scripts/lib/skills.js +86 -0
  220. package/scripts/lib/targets.js +113 -0
  221. package/skills/accounting-api-integration/SKILL.md +81 -0
  222. package/skills/accounting-api-integration/evals/triggers.json +17 -0
  223. package/skills/accounting-api-integration/references/quickbooks.md +48 -0
  224. package/skills/accounting-api-integration/references/xero.md +45 -0
  225. package/skills/agent-harness-design/SKILL.md +125 -0
  226. package/skills/agent-harness-design/evals/triggers.json +21 -0
  227. package/skills/ai-media-generation/SKILL.md +89 -0
  228. package/skills/ai-media-generation/evals/triggers.json +16 -0
  229. package/skills/ai-media-generation/references/job-pipeline.md +76 -0
  230. package/skills/angular-patterns/SKILL.md +122 -0
  231. package/skills/angular-patterns/evals/triggers.json +16 -0
  232. package/skills/api-design/SKILL.md +96 -0
  233. package/skills/api-design/evals/triggers.json +18 -0
  234. package/skills/api-design/references/conventions.md +133 -0
  235. package/skills/architecture-decision-records/SKILL.md +98 -0
  236. package/skills/architecture-decision-records/evals/triggers.json +17 -0
  237. package/skills/article-writing/SKILL.md +108 -0
  238. package/skills/article-writing/evals/triggers.json +16 -0
  239. package/skills/aspnet-core-patterns/SKILL.md +149 -0
  240. package/skills/aspnet-core-patterns/evals/triggers.json +16 -0
  241. package/skills/auth-patterns/SKILL.md +104 -0
  242. package/skills/auth-patterns/evals/triggers.json +17 -0
  243. package/skills/auth-patterns/references/oauth-oidc.md +64 -0
  244. package/skills/autonomous-loops/SKILL.md +99 -0
  245. package/skills/autonomous-loops/evals/triggers.json +14 -0
  246. package/skills/aws-patterns/SKILL.md +91 -0
  247. package/skills/aws-patterns/evals/triggers.json +16 -0
  248. package/skills/azure-patterns/SKILL.md +86 -0
  249. package/skills/azure-patterns/evals/triggers.json +16 -0
  250. package/skills/benchmark-methodology/SKILL.md +88 -0
  251. package/skills/benchmark-methodology/evals/triggers.json +16 -0
  252. package/skills/benchmark-methodology/references/language-harnesses.md +130 -0
  253. package/skills/bgp-diagnostics/SKILL.md +84 -0
  254. package/skills/bgp-diagnostics/evals/triggers.json +18 -0
  255. package/skills/bgp-diagnostics/references/bgp-reference.md +81 -0
  256. package/skills/bioinformatics-workflows/SKILL.md +108 -0
  257. package/skills/bioinformatics-workflows/evals/triggers.json +16 -0
  258. package/skills/bioinformatics-workflows/references/commands.md +71 -0
  259. package/skills/bioinformatics-workflows/references/formats.md +24 -0
  260. package/skills/bioinformatics-workflows/references/workflow-managers.md +107 -0
  261. package/skills/brand-voice/SKILL.md +112 -0
  262. package/skills/brand-voice/evals/triggers.json +16 -0
  263. package/skills/browser-qa/SKILL.md +99 -0
  264. package/skills/browser-qa/evals/triggers.json +16 -0
  265. package/skills/bun-runtime/SKILL.md +93 -0
  266. package/skills/bun-runtime/evals/triggers.json +16 -0
  267. package/skills/cisco-ios-config/SKILL.md +101 -0
  268. package/skills/cisco-ios-config/evals/triggers.json +18 -0
  269. package/skills/cisco-ios-config/references/verification.md +63 -0
  270. package/skills/clickhouse-patterns/SKILL.md +101 -0
  271. package/skills/clickhouse-patterns/evals/triggers.json +18 -0
  272. package/skills/clickhouse-patterns/references/engines-and-views.md +138 -0
  273. package/skills/clinical-decision-support/SKILL.md +90 -0
  274. package/skills/clinical-decision-support/evals/triggers.json +16 -0
  275. package/skills/clinical-decision-support/references/cds-hooks.md +76 -0
  276. package/skills/clinical-decision-support/references/regulatory-boundaries.md +37 -0
  277. package/skills/code-tour/SKILL.md +97 -0
  278. package/skills/code-tour/evals/triggers.json +14 -0
  279. package/skills/codebase-onboarding/SKILL.md +112 -0
  280. package/skills/codebase-onboarding/evals/triggers.json +14 -0
  281. package/skills/cold-outreach-sequences/SKILL.md +90 -0
  282. package/skills/cold-outreach-sequences/evals/triggers.json +16 -0
  283. package/skills/content-repurposing/SKILL.md +82 -0
  284. package/skills/content-repurposing/evals/triggers.json +16 -0
  285. package/skills/context-budget/SKILL.md +84 -0
  286. package/skills/context-budget/evals/triggers.json +14 -0
  287. package/skills/conventional-commits/SKILL.md +144 -0
  288. package/skills/conventional-commits/evals/triggers.json +16 -0
  289. package/skills/cpp-patterns/SKILL.md +129 -0
  290. package/skills/cpp-patterns/evals/triggers.json +16 -0
  291. package/skills/cpp-patterns/references/cmake-and-tooling.md +88 -0
  292. package/skills/cpp-patterns/references/undefined-behaviour.md +75 -0
  293. package/skills/cpp-testing/SKILL.md +131 -0
  294. package/skills/cpp-testing/evals/triggers.json +16 -0
  295. package/skills/csharp-patterns/SKILL.md +110 -0
  296. package/skills/csharp-patterns/evals/triggers.json +17 -0
  297. package/skills/csharp-patterns/references/analyzers.md +59 -0
  298. package/skills/csharp-testing/SKILL.md +85 -0
  299. package/skills/csharp-testing/evals/triggers.json +17 -0
  300. package/skills/csharp-testing/references/integration-tests.md +77 -0
  301. package/skills/css-architecture/SKILL.md +143 -0
  302. package/skills/css-architecture/evals/triggers.json +16 -0
  303. package/skills/customs-trade-compliance/SKILL.md +95 -0
  304. package/skills/customs-trade-compliance/evals/triggers.json +16 -0
  305. package/skills/customs-trade-compliance/references/incoterms-2020.md +42 -0
  306. package/skills/dart-patterns/SKILL.md +157 -0
  307. package/skills/dart-patterns/evals/triggers.json +18 -0
  308. package/skills/dart-testing/SKILL.md +164 -0
  309. package/skills/dart-testing/evals/triggers.json +18 -0
  310. package/skills/data-analysis-notebooks/SKILL.md +113 -0
  311. package/skills/data-analysis-notebooks/evals/triggers.json +16 -0
  312. package/skills/data-analysis-notebooks/references/dataframe-pitfalls.md +49 -0
  313. package/skills/data-analysis-notebooks/references/statistics-pitfalls.md +24 -0
  314. package/skills/data-pipelines/SKILL.md +90 -0
  315. package/skills/data-pipelines/evals/triggers.json +16 -0
  316. package/skills/data-pipelines/references/orchestrators.md +64 -0
  317. package/skills/database-migrations/SKILL.md +102 -0
  318. package/skills/database-migrations/evals/triggers.json +16 -0
  319. package/skills/database-migrations/references/recipes.md +98 -0
  320. package/skills/database-migrations/references/tools.md +21 -0
  321. package/skills/dbt-patterns/SKILL.md +96 -0
  322. package/skills/dbt-patterns/evals/triggers.json +16 -0
  323. package/skills/dbt-patterns/references/yaml-examples.md +114 -0
  324. package/skills/deep-research/SKILL.md +107 -0
  325. package/skills/deep-research/evals/triggers.json +14 -0
  326. package/skills/dependency-audit/SKILL.md +103 -0
  327. package/skills/dependency-audit/evals/triggers.json +16 -0
  328. package/skills/dependency-audit/references/tools.md +124 -0
  329. package/skills/deployment-strategies/SKILL.md +108 -0
  330. package/skills/deployment-strategies/evals/triggers.json +16 -0
  331. package/skills/django-patterns/SKILL.md +123 -0
  332. package/skills/django-patterns/evals/triggers.json +16 -0
  333. package/skills/docker-patterns/SKILL.md +132 -0
  334. package/skills/docker-patterns/evals/triggers.json +16 -0
  335. package/skills/docker-patterns/references/dockerfiles.md +105 -0
  336. package/skills/e2e-testing-playwright/SKILL.md +94 -0
  337. package/skills/e2e-testing-playwright/evals/triggers.json +16 -0
  338. package/skills/e2e-testing-playwright/references/config-and-ci.md +129 -0
  339. package/skills/ef-core-patterns/SKILL.md +117 -0
  340. package/skills/ef-core-patterns/evals/triggers.json +16 -0
  341. package/skills/email-deliverability/SKILL.md +99 -0
  342. package/skills/email-deliverability/evals/triggers.json +17 -0
  343. package/skills/email-deliverability/references/dns-records.md +85 -0
  344. package/skills/error-handling-patterns/SKILL.md +112 -0
  345. package/skills/error-handling-patterns/evals/triggers.json +18 -0
  346. package/skills/error-handling-patterns/references/language-idioms.md +49 -0
  347. package/skills/estimation-and-scoping/SKILL.md +97 -0
  348. package/skills/estimation-and-scoping/evals/triggers.json +14 -0
  349. package/skills/evm-dapp-integration/SKILL.md +73 -0
  350. package/skills/evm-dapp-integration/evals/triggers.json +16 -0
  351. package/skills/fastapi-patterns/SKILL.md +127 -0
  352. package/skills/fastapi-patterns/evals/triggers.json +16 -0
  353. package/skills/ffmpeg-media-processing/SKILL.md +94 -0
  354. package/skills/ffmpeg-media-processing/evals/triggers.json +16 -0
  355. package/skills/ffmpeg-media-processing/references/recipes.md +112 -0
  356. package/skills/fhir-integration/SKILL.md +81 -0
  357. package/skills/fhir-integration/evals/triggers.json +16 -0
  358. package/skills/fhir-integration/references/search-and-bundles.md +73 -0
  359. package/skills/fhir-integration/references/smart-on-fhir.md +50 -0
  360. package/skills/flask-patterns/SKILL.md +132 -0
  361. package/skills/flask-patterns/evals/triggers.json +16 -0
  362. package/skills/flutter-patterns/SKILL.md +99 -0
  363. package/skills/flutter-patterns/evals/triggers.json +16 -0
  364. package/skills/flutterwave-integration/SKILL.md +75 -0
  365. package/skills/flutterwave-integration/evals/triggers.json +16 -0
  366. package/skills/flutterwave-integration/references/api.md +73 -0
  367. package/skills/flutterwave-integration/references/webhooks.md +49 -0
  368. package/skills/fsharp-patterns/SKILL.md +133 -0
  369. package/skills/fsharp-patterns/evals/triggers.json +16 -0
  370. package/skills/fsharp-testing/SKILL.md +136 -0
  371. package/skills/fsharp-testing/evals/triggers.json +16 -0
  372. package/skills/gcp-patterns/SKILL.md +86 -0
  373. package/skills/gcp-patterns/evals/triggers.json +16 -0
  374. package/skills/git-workflow/SKILL.md +114 -0
  375. package/skills/git-workflow/evals/triggers.json +16 -0
  376. package/skills/github-actions-ci/SKILL.md +117 -0
  377. package/skills/github-actions-ci/evals/triggers.json +16 -0
  378. package/skills/github-api-automation/SKILL.md +101 -0
  379. package/skills/github-api-automation/evals/triggers.json +17 -0
  380. package/skills/go-patterns/SKILL.md +118 -0
  381. package/skills/go-patterns/evals/triggers.json +17 -0
  382. package/skills/go-patterns/references/concurrency.md +162 -0
  383. package/skills/go-testing/SKILL.md +154 -0
  384. package/skills/go-testing/evals/triggers.json +17 -0
  385. package/skills/hexagonal-architecture/SKILL.md +89 -0
  386. package/skills/hexagonal-architecture/evals/triggers.json +17 -0
  387. package/skills/hipaa-compliance/SKILL.md +91 -0
  388. package/skills/hipaa-compliance/evals/triggers.json +18 -0
  389. package/skills/hipaa-compliance/references/safeguards.md +68 -0
  390. package/skills/hl7v2-integration/SKILL.md +69 -0
  391. package/skills/hl7v2-integration/evals/triggers.json +16 -0
  392. package/skills/hl7v2-integration/references/messages-and-ack.md +78 -0
  393. package/skills/homelab-network-setup/SKILL.md +125 -0
  394. package/skills/homelab-network-setup/evals/triggers.json +18 -0
  395. package/skills/homelab-network-setup/references/firewall-and-dns.md +45 -0
  396. package/skills/homelab-network-setup/references/wireguard.md +72 -0
  397. package/skills/hubtel-integration/SKILL.md +77 -0
  398. package/skills/hubtel-integration/evals/triggers.json +16 -0
  399. package/skills/hubtel-integration/references/api.md +92 -0
  400. package/skills/i18n-localization/SKILL.md +114 -0
  401. package/skills/i18n-localization/evals/triggers.json +16 -0
  402. package/skills/i18n-localization/references/libraries.md +52 -0
  403. package/skills/incident-postmortem/SKILL.md +118 -0
  404. package/skills/incident-postmortem/evals/triggers.json +14 -0
  405. package/skills/inventory-demand-planning/SKILL.md +89 -0
  406. package/skills/inventory-demand-planning/evals/triggers.json +16 -0
  407. package/skills/inventory-demand-planning/references/formulas.md +62 -0
  408. package/skills/investor-materials/SKILL.md +127 -0
  409. package/skills/investor-materials/evals/triggers.json +16 -0
  410. package/skills/investor-materials/references/templates.md +74 -0
  411. package/skills/invoicing-and-tax/SKILL.md +84 -0
  412. package/skills/invoicing-and-tax/evals/triggers.json +17 -0
  413. package/skills/invoicing-and-tax/references/e-invoicing.md +24 -0
  414. package/skills/invoicing-and-tax/references/invoice-fields.md +38 -0
  415. package/skills/invoicing-and-tax/references/rounding.md +26 -0
  416. package/skills/java-patterns/SKILL.md +141 -0
  417. package/skills/java-patterns/evals/triggers.json +17 -0
  418. package/skills/java-testing/SKILL.md +142 -0
  419. package/skills/java-testing/evals/triggers.json +16 -0
  420. package/skills/jetpack-compose-patterns/SKILL.md +88 -0
  421. package/skills/jetpack-compose-patterns/evals/triggers.json +16 -0
  422. package/skills/jira-integration/SKILL.md +92 -0
  423. package/skills/jira-integration/evals/triggers.json +17 -0
  424. package/skills/jpa-hibernate/SKILL.md +92 -0
  425. package/skills/jpa-hibernate/evals/triggers.json +18 -0
  426. package/skills/jpa-hibernate/references/mapping.md +99 -0
  427. package/skills/kotlin-multiplatform/SKILL.md +97 -0
  428. package/skills/kotlin-multiplatform/evals/triggers.json +16 -0
  429. package/skills/kotlin-patterns/SKILL.md +128 -0
  430. package/skills/kotlin-patterns/evals/triggers.json +16 -0
  431. package/skills/kotlin-testing/SKILL.md +117 -0
  432. package/skills/kotlin-testing/evals/triggers.json +16 -0
  433. package/skills/ktor-patterns/SKILL.md +135 -0
  434. package/skills/ktor-patterns/evals/triggers.json +18 -0
  435. package/skills/kubernetes-patterns/SKILL.md +106 -0
  436. package/skills/kubernetes-patterns/evals/triggers.json +16 -0
  437. package/skills/kubernetes-patterns/references/manifests.md +115 -0
  438. package/skills/laravel-patterns/SKILL.md +136 -0
  439. package/skills/laravel-patterns/evals/triggers.json +16 -0
  440. package/skills/linear-integration/SKILL.md +98 -0
  441. package/skills/linear-integration/evals/triggers.json +17 -0
  442. package/skills/literature-review/SKILL.md +109 -0
  443. package/skills/literature-review/evals/triggers.json +16 -0
  444. package/skills/literature-review/references/appraisal.md +41 -0
  445. package/skills/literature-review/references/search-sources.md +39 -0
  446. package/skills/llm-app-patterns/SKILL.md +97 -0
  447. package/skills/llm-app-patterns/evals/triggers.json +17 -0
  448. package/skills/llm-evals/SKILL.md +98 -0
  449. package/skills/llm-evals/evals/triggers.json +16 -0
  450. package/skills/llm-evals/references/graders.md +66 -0
  451. package/skills/logistics-exception-management/SKILL.md +90 -0
  452. package/skills/logistics-exception-management/evals/triggers.json +16 -0
  453. package/skills/manim-animations/SKILL.md +106 -0
  454. package/skills/manim-animations/evals/triggers.json +16 -0
  455. package/skills/market-research/SKILL.md +117 -0
  456. package/skills/market-research/evals/triggers.json +16 -0
  457. package/skills/marketing-campaign/SKILL.md +111 -0
  458. package/skills/marketing-campaign/evals/triggers.json +16 -0
  459. package/skills/mcp-server-patterns/SKILL.md +127 -0
  460. package/skills/mcp-server-patterns/evals/triggers.json +18 -0
  461. package/skills/mcp-server-patterns/references/protocol-notes.md +68 -0
  462. package/skills/metrics-dashboards/SKILL.md +113 -0
  463. package/skills/metrics-dashboards/evals/triggers.json +16 -0
  464. package/skills/ml-experiment-workflow/SKILL.md +125 -0
  465. package/skills/ml-experiment-workflow/evals/triggers.json +16 -0
  466. package/skills/mongodb-patterns/SKILL.md +115 -0
  467. package/skills/mongodb-patterns/evals/triggers.json +18 -0
  468. package/skills/mongodb-patterns/references/indexes-and-aggregation.md +94 -0
  469. package/skills/mpesa-daraja-integration/SKILL.md +70 -0
  470. package/skills/mpesa-daraja-integration/evals/triggers.json +16 -0
  471. package/skills/mpesa-daraja-integration/references/api.md +103 -0
  472. package/skills/mpesa-daraja-integration/references/callbacks.md +74 -0
  473. package/skills/mtn-momo-integration/SKILL.md +66 -0
  474. package/skills/mtn-momo-integration/evals/triggers.json +16 -0
  475. package/skills/mtn-momo-integration/references/api.md +153 -0
  476. package/skills/mtn-momo-integration/references/callbacks.md +92 -0
  477. package/skills/mtn-momo-integration/references/sandbox-and-go-live.md +51 -0
  478. package/skills/mtn-momo-integration/scripts/sandbox-setup.js +79 -0
  479. package/skills/mysql-patterns/SKILL.md +96 -0
  480. package/skills/mysql-patterns/evals/triggers.json +16 -0
  481. package/skills/mysql-patterns/references/explain.md +34 -0
  482. package/skills/mysql-patterns/references/online-ddl.md +41 -0
  483. package/skills/nestjs-patterns/SKILL.md +114 -0
  484. package/skills/nestjs-patterns/evals/triggers.json +16 -0
  485. package/skills/nestjs-patterns/references/testing.md +68 -0
  486. package/skills/network-automation/SKILL.md +107 -0
  487. package/skills/network-automation/evals/triggers.json +18 -0
  488. package/skills/network-automation/references/tool-snippets.md +153 -0
  489. package/skills/network-troubleshooting/SKILL.md +152 -0
  490. package/skills/network-troubleshooting/evals/triggers.json +18 -0
  491. package/skills/network-troubleshooting/references/commands.md +33 -0
  492. package/skills/nextjs-patterns/SKILL.md +150 -0
  493. package/skills/nextjs-patterns/evals/triggers.json +18 -0
  494. package/skills/nextjs-patterns/references/caching.md +87 -0
  495. package/skills/node-backend-patterns/SKILL.md +103 -0
  496. package/skills/node-backend-patterns/evals/triggers.json +16 -0
  497. package/skills/node-backend-patterns/references/templates.md +122 -0
  498. package/skills/nuxt-patterns/SKILL.md +103 -0
  499. package/skills/nuxt-patterns/evals/triggers.json +16 -0
  500. package/skills/parallel-agent-orchestration/SKILL.md +106 -0
  501. package/skills/parallel-agent-orchestration/evals/triggers.json +14 -0
  502. package/skills/paystack-integration/SKILL.md +59 -0
  503. package/skills/paystack-integration/evals/triggers.json +14 -0
  504. package/skills/paystack-integration/references/api.md +73 -0
  505. package/skills/paystack-integration/references/mobile-money.md +50 -0
  506. package/skills/paystack-integration/references/webhooks.md +80 -0
  507. package/skills/pci-dss-scope/SKILL.md +103 -0
  508. package/skills/pci-dss-scope/evals/triggers.json +18 -0
  509. package/skills/pci-dss-scope/references/saq-and-data.md +36 -0
  510. package/skills/perl-patterns/SKILL.md +135 -0
  511. package/skills/perl-patterns/evals/triggers.json +18 -0
  512. package/skills/perl-testing/SKILL.md +126 -0
  513. package/skills/perl-testing/evals/triggers.json +17 -0
  514. package/skills/php-patterns/SKILL.md +116 -0
  515. package/skills/php-patterns/evals/triggers.json +16 -0
  516. package/skills/php-testing/SKILL.md +123 -0
  517. package/skills/php-testing/evals/triggers.json +16 -0
  518. package/skills/postgres-patterns/SKILL.md +103 -0
  519. package/skills/postgres-patterns/evals/triggers.json +17 -0
  520. package/skills/postgres-patterns/references/explain.md +59 -0
  521. package/skills/postgres-patterns/references/locks.md +53 -0
  522. package/skills/prd-writing/SKILL.md +124 -0
  523. package/skills/prd-writing/evals/triggers.json +15 -0
  524. package/skills/prisma-patterns/SKILL.md +83 -0
  525. package/skills/prisma-patterns/evals/triggers.json +18 -0
  526. package/skills/prisma-patterns/references/prisma-8.md +46 -0
  527. package/skills/prisma-patterns/references/workflow.md +50 -0
  528. package/skills/privacy-compliance/SKILL.md +121 -0
  529. package/skills/privacy-compliance/evals/triggers.json +18 -0
  530. package/skills/privacy-compliance/references/jurisdictions.md +51 -0
  531. package/skills/production-scheduling/SKILL.md +98 -0
  532. package/skills/production-scheduling/evals/triggers.json +16 -0
  533. package/skills/prompt-engineering/SKILL.md +92 -0
  534. package/skills/prompt-engineering/evals/triggers.json +16 -0
  535. package/skills/python-patterns/SKILL.md +107 -0
  536. package/skills/python-patterns/evals/triggers.json +16 -0
  537. package/skills/python-patterns/references/tooling.md +101 -0
  538. package/skills/python-testing/SKILL.md +126 -0
  539. package/skills/python-testing/evals/triggers.json +16 -0
  540. package/skills/python-testing/references/mocking.md +71 -0
  541. package/skills/pytorch-patterns/SKILL.md +139 -0
  542. package/skills/pytorch-patterns/evals/triggers.json +16 -0
  543. package/skills/pytorch-patterns/references/debugging.md +39 -0
  544. package/skills/quarkus-patterns/SKILL.md +93 -0
  545. package/skills/quarkus-patterns/evals/triggers.json +18 -0
  546. package/skills/rag-pipeline-patterns/SKILL.md +117 -0
  547. package/skills/rag-pipeline-patterns/evals/triggers.json +18 -0
  548. package/skills/rag-pipeline-patterns/references/evaluation.md +37 -0
  549. package/skills/rag-pipeline-patterns/references/retrieval-recipes.md +78 -0
  550. package/skills/rails-patterns/SKILL.md +132 -0
  551. package/skills/rails-patterns/evals/triggers.json +16 -0
  552. package/skills/react-native-patterns/SKILL.md +101 -0
  553. package/skills/react-native-patterns/evals/triggers.json +16 -0
  554. package/skills/react-patterns/SKILL.md +140 -0
  555. package/skills/react-patterns/evals/triggers.json +18 -0
  556. package/skills/react-performance/SKILL.md +107 -0
  557. package/skills/react-performance/evals/triggers.json +18 -0
  558. package/skills/redis-patterns/SKILL.md +109 -0
  559. package/skills/redis-patterns/evals/triggers.json +18 -0
  560. package/skills/redis-patterns/references/operations.md +61 -0
  561. package/skills/refactoring-safely/SKILL.md +107 -0
  562. package/skills/refactoring-safely/evals/triggers.json +17 -0
  563. package/skills/release-management/SKILL.md +141 -0
  564. package/skills/release-management/evals/triggers.json +16 -0
  565. package/skills/remotion-video/SKILL.md +91 -0
  566. package/skills/remotion-video/evals/triggers.json +16 -0
  567. package/skills/remotion-video/references/lambda.md +66 -0
  568. package/skills/returns-reverse-logistics/SKILL.md +97 -0
  569. package/skills/returns-reverse-logistics/evals/triggers.json +16 -0
  570. package/skills/ruby-patterns/SKILL.md +127 -0
  571. package/skills/ruby-patterns/evals/triggers.json +18 -0
  572. package/skills/ruby-testing/SKILL.md +113 -0
  573. package/skills/ruby-testing/evals/triggers.json +18 -0
  574. package/skills/runbook-writing/SKILL.md +101 -0
  575. package/skills/runbook-writing/evals/triggers.json +14 -0
  576. package/skills/rust-patterns/SKILL.md +118 -0
  577. package/skills/rust-patterns/evals/triggers.json +16 -0
  578. package/skills/rust-patterns/references/cargo-and-clippy.md +105 -0
  579. package/skills/rust-patterns/references/errors-and-traits.md +97 -0
  580. package/skills/rust-testing/SKILL.md +148 -0
  581. package/skills/rust-testing/evals/triggers.json +16 -0
  582. package/skills/rust-testing/references/fakes-proptest-async.md +113 -0
  583. package/skills/search-first/SKILL.md +73 -0
  584. package/skills/search-first/evals/triggers.json +14 -0
  585. package/skills/security-review/SKILL.md +58 -0
  586. package/skills/security-review/evals/triggers.json +14 -0
  587. package/skills/security-review/references/checklist.md +54 -0
  588. package/skills/security-review/scripts/scan-secrets.js +79 -0
  589. package/skills/seo-audit/SKILL.md +111 -0
  590. package/skills/seo-audit/evals/triggers.json +16 -0
  591. package/skills/seo-audit/references/checks.md +65 -0
  592. package/skills/session-handoff/SKILL.md +101 -0
  593. package/skills/session-handoff/evals/triggers.json +14 -0
  594. package/skills/skill-authoring/SKILL.md +87 -0
  595. package/skills/skill-authoring/evals/triggers.json +14 -0
  596. package/skills/skill-authoring/references/frontmatter.md +40 -0
  597. package/skills/slack-app-integration/SKILL.md +108 -0
  598. package/skills/slack-app-integration/evals/triggers.json +17 -0
  599. package/skills/smart-contract-security/SKILL.md +110 -0
  600. package/skills/smart-contract-security/evals/triggers.json +16 -0
  601. package/skills/smart-contract-security/references/vulnerability-checklist.md +79 -0
  602. package/skills/social-media-publishing/SKILL.md +84 -0
  603. package/skills/social-media-publishing/evals/triggers.json +17 -0
  604. package/skills/social-media-publishing/references/platform-apis.md +116 -0
  605. package/skills/solidity-patterns/SKILL.md +95 -0
  606. package/skills/solidity-patterns/evals/triggers.json +16 -0
  607. package/skills/spring-boot-patterns/SKILL.md +128 -0
  608. package/skills/spring-boot-patterns/evals/triggers.json +18 -0
  609. package/skills/spring-boot-patterns/references/testing.md +72 -0
  610. package/skills/stripe-integration/SKILL.md +69 -0
  611. package/skills/stripe-integration/evals/triggers.json +16 -0
  612. package/skills/stripe-integration/references/api.md +71 -0
  613. package/skills/stripe-integration/references/billing.md +58 -0
  614. package/skills/stripe-integration/references/webhooks.md +76 -0
  615. package/skills/subscription-billing-ops/SKILL.md +118 -0
  616. package/skills/subscription-billing-ops/evals/triggers.json +17 -0
  617. package/skills/subscription-billing-ops/references/proration.md +47 -0
  618. package/skills/subscription-billing-ops/references/revenue-metrics.md +38 -0
  619. package/skills/svelte-patterns/SKILL.md +122 -0
  620. package/skills/svelte-patterns/evals/triggers.json +16 -0
  621. package/skills/swift-patterns/SKILL.md +113 -0
  622. package/skills/swift-patterns/evals/triggers.json +16 -0
  623. package/skills/swift-patterns/references/concurrency-migration.md +40 -0
  624. package/skills/swift-testing/SKILL.md +121 -0
  625. package/skills/swift-testing/evals/triggers.json +16 -0
  626. package/skills/swift-testing/references/swift-testing-cheatsheet.md +81 -0
  627. package/skills/swiftui-patterns/SKILL.md +102 -0
  628. package/skills/swiftui-patterns/evals/triggers.json +16 -0
  629. package/skills/tdd-workflow/SKILL.md +67 -0
  630. package/skills/tdd-workflow/evals/triggers.json +14 -0
  631. package/skills/technical-writing/SKILL.md +95 -0
  632. package/skills/technical-writing/evals/triggers.json +14 -0
  633. package/skills/terraform-patterns/SKILL.md +122 -0
  634. package/skills/terraform-patterns/evals/triggers.json +16 -0
  635. package/skills/terraform-patterns/references/backends.md +67 -0
  636. package/skills/test-coverage-improvement/SKILL.md +107 -0
  637. package/skills/test-coverage-improvement/evals/triggers.json +16 -0
  638. package/skills/threat-modeling/SKILL.md +113 -0
  639. package/skills/threat-modeling/evals/triggers.json +16 -0
  640. package/skills/typescript-patterns/SKILL.md +122 -0
  641. package/skills/typescript-patterns/evals/triggers.json +16 -0
  642. package/skills/typescript-testing/SKILL.md +101 -0
  643. package/skills/typescript-testing/evals/triggers.json +16 -0
  644. package/skills/verification-loop/SKILL.md +70 -0
  645. package/skills/verification-loop/evals/triggers.json +14 -0
  646. package/skills/verification-loop/scripts/detect-checks.js +102 -0
  647. package/skills/vite-patterns/SKILL.md +117 -0
  648. package/skills/vite-patterns/evals/triggers.json +16 -0
  649. package/skills/vue-patterns/SKILL.md +104 -0
  650. package/skills/vue-patterns/evals/triggers.json +16 -0
  651. package/skills/web-accessibility/SKILL.md +119 -0
  652. package/skills/web-accessibility/evals/triggers.json +16 -0
  653. package/skills/web-performance/SKILL.md +107 -0
  654. package/skills/web-performance/evals/triggers.json +16 -0
  655. package/skills/web-scraping/SKILL.md +80 -0
  656. package/skills/web-scraping/evals/triggers.json +16 -0
@@ -0,0 +1,162 @@
1
+ # Go concurrency patterns
2
+
3
+ Each pattern stops cleanly when the context is cancelled and waits for every goroutine it starts.
4
+
5
+ ## Fan-out with errgroup and a concurrency limit
6
+
7
+ ```go
8
+ import "golang.org/x/sync/errgroup"
9
+
10
+ func fetchAll(ctx context.Context, ids []string) ([]Item, error) {
11
+ items := make([]Item, len(ids)) // each goroutine writes its own index: no lock needed
12
+ g, ctx := errgroup.WithContext(ctx)
13
+ g.SetLimit(8)
14
+ for i, id := range ids {
15
+ g.Go(func() error {
16
+ it, err := fetch(ctx, id)
17
+ if err != nil {
18
+ return fmt.Errorf("fetch %s: %w", id, err)
19
+ }
20
+ items[i] = it
21
+ return nil
22
+ })
23
+ }
24
+ if err := g.Wait(); err != nil {
25
+ return nil, err
26
+ }
27
+ return items, nil
28
+ }
29
+ ```
30
+
31
+ Since Go 1.22 each loop iteration has its own `i` and `id`, so capturing them is safe. On a module whose `go` directive is older than 1.22, copy them first (`i, id := i, id`).
32
+
33
+ ## Worker pool over a channel
34
+
35
+ ```go
36
+ func process(ctx context.Context, jobs []Job, workers int) error {
37
+ in := make(chan Job)
38
+ g, ctx := errgroup.WithContext(ctx)
39
+
40
+ g.Go(func() error { // producer owns and closes in
41
+ defer close(in)
42
+ for _, j := range jobs {
43
+ select {
44
+ case in <- j:
45
+ case <-ctx.Done():
46
+ return ctx.Err()
47
+ }
48
+ }
49
+ return nil
50
+ })
51
+
52
+ for range workers {
53
+ g.Go(func() error {
54
+ for j := range in {
55
+ if err := handle(ctx, j); err != nil {
56
+ return err
57
+ }
58
+ }
59
+ return nil
60
+ })
61
+ }
62
+ return g.Wait()
63
+ }
64
+ ```
65
+
66
+ `for range workers` (ranging over an int) needs Go 1.22+; use `for i := 0; i < workers; i++` on older modules.
67
+
68
+ ## Pipeline stage that cannot leak
69
+
70
+ ```go
71
+ func squares(ctx context.Context, in <-chan int) <-chan int {
72
+ out := make(chan int)
73
+ go func() {
74
+ defer close(out)
75
+ for v := range in {
76
+ select {
77
+ case out <- v * v:
78
+ case <-ctx.Done():
79
+ return
80
+ }
81
+ }
82
+ }()
83
+ return out
84
+ }
85
+ ```
86
+
87
+ The `select` on `ctx.Done()` is what prevents the leak: without it the goroutine blocks forever on `out <-` once the consumer stops reading.
88
+
89
+ ## First result wins (with no leak)
90
+
91
+ ```go
92
+ func first(ctx context.Context, replicas []string) (Result, error) {
93
+ ctx, cancel := context.WithCancel(ctx)
94
+ defer cancel()
95
+ ch := make(chan Result, len(replicas)) // buffered: losers never block
96
+ for _, r := range replicas {
97
+ go func() {
98
+ if res, err := query(ctx, r); err == nil {
99
+ ch <- res
100
+ }
101
+ }()
102
+ }
103
+ select {
104
+ case res := <-ch:
105
+ return res, nil
106
+ case <-ctx.Done():
107
+ return Result{}, ctx.Err()
108
+ }
109
+ }
110
+ ```
111
+
112
+ If every replica fails this waits for the parent context; add a timeout or count failures if that is not acceptable.
113
+
114
+ ## Mutex-guarded state
115
+
116
+ ```go
117
+ type Counter struct {
118
+ mu sync.Mutex
119
+ n map[string]int // guarded by mu
120
+ }
121
+
122
+ func (c *Counter) Inc(k string) {
123
+ c.mu.Lock()
124
+ defer c.mu.Unlock()
125
+ if c.n == nil {
126
+ c.n = make(map[string]int)
127
+ }
128
+ c.n[k]++
129
+ }
130
+ ```
131
+
132
+ Methods use a pointer receiver so the mutex is never copied. `go vet` (copylocks) flags copies.
133
+
134
+ ## Graceful HTTP shutdown
135
+
136
+ ```go
137
+ func run(ctx context.Context) error {
138
+ ctx, stop := signal.NotifyContext(ctx, os.Interrupt, syscall.SIGTERM)
139
+ defer stop()
140
+
141
+ srv := &http.Server{Addr: ":8080", Handler: routes(), ReadHeaderTimeout: 5 * time.Second}
142
+ errCh := make(chan error, 1)
143
+ go func() { errCh <- srv.ListenAndServe() }()
144
+
145
+ select {
146
+ case err := <-errCh:
147
+ return err
148
+ case <-ctx.Done():
149
+ }
150
+ shutdownCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
151
+ defer cancel()
152
+ return srv.Shutdown(shutdownCtx)
153
+ }
154
+ ```
155
+
156
+ `ListenAndServe` returns `http.ErrServerClosed` after `Shutdown`; treat that as success if you read `errCh` afterwards. The shutdown context is deliberately new: the signal context is already cancelled.
157
+
158
+ ## Detecting leaks and races
159
+
160
+ - `go test -race ./...` on every change that touches goroutines or shared state.
161
+ - `go.uber.org/goleak` (`defer goleak.VerifyNone(t)` or `goleak.VerifyTestMain(m)`) catches goroutines still running at test end, if the project accepts the dependency.
162
+ - A goroutine dump (`SIGQUIT`, or `net/http/pprof` at `/debug/pprof/goroutine?debug=2`) shows where leaked goroutines are blocked.
@@ -0,0 +1,154 @@
1
+ ---
2
+ name: go-testing
3
+ description: Writes and fixes Go tests with the standard testing package, including table-driven tests with t.Run subtests, t.Helper and t.Cleanup, httptest servers and recorders, hand-written fakes instead of mock frameworks, the race detector, native fuzzing, benchmarks and golden files. Use when adding or repairing _test.go files, making flaky Go tests deterministic, testing an HTTP handler or client in Go, or writing a Go fuzz target or benchmark.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Needs the go toolchain.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: testing
9
+ kete-loom/risk: runs-commands
10
+ kete-loom/requires: "go"
11
+ kete-loom/owner: "Kete-org"
12
+ ---
13
+
14
+ # Go testing
15
+
16
+ Use the standard `testing` package and the project's existing test style. Add an assertion library only if the project already uses one.
17
+
18
+ ## 0. Before you write
19
+
20
+ 1. Find the test command (Makefile, CI workflow, README). Default: `go test ./...`.
21
+ 2. Run the package's tests once and record the result. If they already fail, **stop and tell the user** which ones before changing anything.
22
+ 3. Read the `go` directive in `go.mod`; do not use testing APIs newer than it.
23
+ 4. Look at a neighbouring `_test.go` file for naming, helpers, fixtures and whether tests are in `package foo` (white-box) or `package foo_test` (black-box). Prefer `foo_test` for testing the public API.
24
+
25
+ ## 1. Table-driven tests with subtests
26
+
27
+ ```go
28
+ func TestParseDuration(t *testing.T) {
29
+ tests := []struct {
30
+ name string
31
+ in string
32
+ want time.Duration
33
+ wantErr bool
34
+ }{
35
+ {name: "minutes", in: "5m", want: 5 * time.Minute},
36
+ {name: "empty", in: "", wantErr: true},
37
+ {name: "negative", in: "-1s", wantErr: true},
38
+ }
39
+ for _, tt := range tests {
40
+ t.Run(tt.name, func(t *testing.T) {
41
+ got, err := ParseDuration(tt.in)
42
+ if (err != nil) != tt.wantErr {
43
+ t.Fatalf("ParseDuration(%q) error = %v, wantErr %v", tt.in, err, tt.wantErr)
44
+ }
45
+ if got != tt.want {
46
+ t.Errorf("ParseDuration(%q) = %v, want %v", tt.in, got, tt.want)
47
+ }
48
+ })
49
+ }
50
+ }
51
+ ```
52
+
53
+ Rules:
54
+ - Every case has a `name`; run one with `go test -run 'TestParseDuration/negative' ./pkg`.
55
+ - Failure messages say `Func(input) = got, want want`. Use `t.Errorf` to keep going, `t.Fatalf` only when later checks would be meaningless.
56
+ - Compare structs and slices with `github.com/google/go-cmp/cmp` (`cmp.Diff(want, got)`) if available, otherwise `reflect.DeepEqual`. Check errors with `errors.Is`, not string equality.
57
+ - `t.Parallel()` only when cases share no mutable state. On modules with a `go` directive before 1.22, copy the loop variable (`tt := tt`) before a parallel subtest.
58
+
59
+ ## 2. Helpers and cleanup
60
+
61
+ - Call `t.Helper()` first in every helper that calls `t.Fatal`/`t.Error`, so failures point at the caller.
62
+ - Helpers take `t *testing.T` (or `testing.TB` to share with benchmarks) and fail directly instead of returning errors.
63
+ - Use `t.Context()` (Go 1.24+, cancelled just before cleanup runs) instead of `context.Background()` in tests where available.
64
+ - Use `t.Cleanup(fn)` for teardown, `t.TempDir()` for files, `t.Setenv` for environment variables (it cannot be combined with `t.Parallel`).
65
+ - Put fixture files in `testdata/`; the go tool ignores that directory when building.
66
+
67
+ ## 3. Fakes over mocks
68
+
69
+ - Depend on a small interface at the consumer, then write a fake by hand in the test file: a struct with fields recording calls and returning canned results.
70
+ - Prefer real implementations when they are cheap: `bytes.Buffer` for `io.Writer`, `fstest.MapFS` for `fs.FS`, `httptest` for HTTP, an in-memory store.
71
+ - Do not add a mock generator to a project that does not already use one. Never mock the unit under test.
72
+ - Inject time and randomness (`now func() time.Time`, a seeded `*rand.Rand`) instead of sleeping or relying on wall time.
73
+
74
+ ## 4. HTTP
75
+
76
+ - Handlers: `rec := httptest.NewRecorder(); req := httptest.NewRequest(http.MethodGet, "/items/1", nil); h.ServeHTTP(rec, req)`, then check `rec.Code`, headers and `rec.Body`.
77
+ - Clients: `srv := httptest.NewServer(http.HandlerFunc(...)); defer srv.Close()` and point the client at `srv.URL`. Use `httptest.NewTLSServer` with `srv.Client()` for TLS.
78
+ - Assert the request the fake server received (method, path, body) as well as the client's result.
79
+ - No real network calls in unit tests.
80
+
81
+ ## 5. Concurrency and the race detector
82
+
83
+ - Run `go test -race ./...` for any package with goroutines or shared state. A race report is a bug to fix, not a flake.
84
+ - Never use `time.Sleep` to wait for a goroutine. Wait on a channel, a `sync.WaitGroup`, or poll a condition with a deadline.
85
+ - For code built on timers and goroutines, the `testing/synctest` package (`synctest.Test`, Go 1.25+) runs the test in a bubble with a fake clock; use it if the module's Go version allows.
86
+ - Find flakes with `go test -race -count=50 -run TestName ./pkg`. Use `-shuffle=on` to expose order dependence.
87
+
88
+ ## 6. Fuzzing
89
+
90
+ ```go
91
+ func FuzzParseDuration(f *testing.F) {
92
+ for _, s := range []string{"5m", "", "1h30m", "-1s"} {
93
+ f.Add(s)
94
+ }
95
+ f.Fuzz(func(t *testing.T, s string) {
96
+ d, err := ParseDuration(s)
97
+ if err != nil {
98
+ return
99
+ }
100
+ if again, err := ParseDuration(d.String()); err != nil || again != d {
101
+ t.Fatalf("round trip %q -> %v -> %v, %v", s, d, again, err)
102
+ }
103
+ })
104
+ }
105
+ ```
106
+
107
+ - Run with `go test -fuzz=FuzzParseDuration -fuzztime=30s ./pkg`. Only one fuzz target per package per run.
108
+ - Assert properties (round trip, no panic, invariants), not exact outputs.
109
+ - Failing inputs are written to `testdata/fuzz/FuzzName/`. Commit them: they become regression cases run by a plain `go test`.
110
+
111
+ ## 7. Benchmarks
112
+
113
+ - Name `BenchmarkXxx(b *testing.B)`. On Go 1.24+ write the loop as `for b.Loop() { ... }`; setup before the loop is excluded automatically. On older versions use `for i := 0; i < b.N; i++` with `b.ResetTimer()` after setup.
114
+ - Run with `go test -run '^$' -bench BenchmarkName -benchmem -count=10 ./pkg`.
115
+ - Compare before and after with `golang.org/x/perf/cmd/benchstat old.txt new.txt`. Never claim a speed-up from a single run.
116
+
117
+ ## 8. Golden files
118
+
119
+ ```go
120
+ var update = flag.Bool("update", false, "rewrite golden files")
121
+
122
+ func TestRender(t *testing.T) {
123
+ got := Render(input)
124
+ golden := filepath.Join("testdata", t.Name()+".golden")
125
+ if *update {
126
+ if err := os.WriteFile(golden, got, 0o644); err != nil {
127
+ t.Fatal(err)
128
+ }
129
+ }
130
+ want, err := os.ReadFile(golden)
131
+ if err != nil {
132
+ t.Fatal(err)
133
+ }
134
+ if diff := cmp.Diff(string(want), string(got)); diff != "" {
135
+ t.Errorf("Render mismatch (-want +got):\n%s", diff)
136
+ }
137
+ }
138
+ ```
139
+
140
+ Regenerate with `go test ./pkg -run TestRender -update`, then **read the diff** before committing. Subtest names contain `/`; sanitise or create directories when using `t.Name()` in a path.
141
+
142
+ ## 9. Coverage
143
+
144
+ `go test -coverprofile=cover.out ./... && go tool cover -func=cover.out`. Cover the error paths and boundaries the user cares about; do not chase a percentage.
145
+
146
+ ## Never
147
+
148
+ - Delete, skip (`t.Skip`) or weaken an existing test to get green without the user's agreement.
149
+ - Sleep to synchronise, hit the real network, or depend on test execution order.
150
+ - Leave goroutines running after a test returns.
151
+
152
+ ## Report back
153
+
154
+ End with: tests added or changed (names), the exact commands run (including `-race`), pass/fail counts, and anything left untested.
@@ -0,0 +1,17 @@
1
+ {
2
+ "should_trigger": [
3
+ "Write table-driven tests with subtests for my Go ParseAmount function",
4
+ "This Go test is flaky under -race and uses time.Sleep, make it deterministic",
5
+ "Test my Go HTTP handler for POST /orders using httptest without a real server",
6
+ "Add a fuzz target for the Go URL normaliser and commit any crashing inputs",
7
+ "Benchmark these two Go JSON encoders properly and compare them with benchstat",
8
+ "Replace the gomock mocks in this _test.go file with a simple hand-written fake"
9
+ ],
10
+ "should_not_trigger": [
11
+ "How should I structure packages and interfaces in my new Go service?",
12
+ "Review this Go diff for data races and context misuse before I merge",
13
+ "go vet reports 'copylocks: call of foo copies lock value', fix the build",
14
+ "Write pytest fixtures and parametrized tests for my Flask app",
15
+ "Add Playwright end-to-end tests for the signup page"
16
+ ]
17
+ }
@@ -0,0 +1,89 @@
1
+ ---
2
+ name: hexagonal-architecture
3
+ description: Applies ports and adapters (hexagonal, clean or onion architecture) pragmatically, keeping domain rules and use cases free of framework, database and HTTP imports, pointing dependencies inward, and untangling an existing codebase one seam at a time. Use when business logic is mixed into controllers or ORM models, when a core module must be testable without a database, when deciding whether layering is worth it for a project, or when carving a use case out of legacy code.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Language neutral; needs the project's test command to verify each step.
6
+ metadata:
7
+ kete-loom/version: "0.1.0"
8
+ kete-loom/category: coding
9
+ kete-loom/risk: writes-files
10
+ kete-loom/owner: "Kete-org"
11
+ ---
12
+
13
+ # Hexagonal architecture (ports and adapters)
14
+
15
+ One rule matters: **source code dependencies point inward.** The domain knows nothing about HTTP, the database, queues or the framework. Everything else is detail.
16
+
17
+ ## Is it worth it here?
18
+
19
+ Decide before you add a single interface.
20
+
21
+ | Signal | Verdict |
22
+ |---|---|
23
+ | Real business rules (pricing, eligibility, state machines) that change often | Worth it for that module |
24
+ | Two or more delivery mechanisms (HTTP + queue + CLI) for the same logic | Worth it |
25
+ | Need to swap or fake an external system (payments, email, a vendor API) | Worth it at that boundary only |
26
+ | CRUD over a table with validation, nothing else | Overkill. Use the framework directly |
27
+ | Prototype, script, or a service you expect to throw away | Overkill |
28
+ | Team unfamiliar with it and no rule above applies | Overkill |
29
+
30
+ Apply it **per module**, not per repo. A CRUD admin area and a ports-and-adapters billing core can live side by side. If the verdict is unclear, **stop and ask the user** what they want to be able to test or swap.
31
+
32
+ ## The shape
33
+
34
+ ```
35
+ adapters (driving) core adapters (driven)
36
+ HTTP controller ─┐ ┌───────────────────────────┐ ┌─ PostgresOrderRepository
37
+ CLI command ────┼──▶│ use case (application) │──▶├─ StripePaymentGateway
38
+ queue consumer ──┘ │ uses domain + ports │ └─ SmtpMailer
39
+ │ domain (entities, rules) │
40
+ └───────────────────────────┘
41
+ ```
42
+
43
+ - **Domain**: entities, value objects, domain rules. Pure code. No I/O, no framework, no ORM annotations if you can avoid them.
44
+ - **Use cases (application services)**: one per user intention (`PlaceOrder`, `CancelSubscription`). Orchestrate domain objects and call ports. Own the transaction boundary.
45
+ - **Ports**: interfaces the core defines, in core terms. Driven ports: `OrderRepository`, `PaymentGateway`, `Clock`. Driving ports: the use case's input/output types.
46
+ - **Adapters**: implement driven ports (Postgres, Stripe, SMTP) or call driving ports (HTTP, CLI, consumers). All framework code lives here.
47
+ - **Composition root**: one place (main, DI container config) wires adapters into use cases.
48
+
49
+ ## Rules
50
+
51
+ 1. The core imports only the language standard library and its own code. Enforce it with a check (an import-lint rule, an architecture test such as ArchUnit, dependency-cruiser or import-linter, or package visibility), not with good intentions.
52
+ 2. Ports are named for what the core needs (`PaymentGateway.charge(amount, customer)`), not for the technology (`StripeClient`). Vendor DTOs never cross into the core; adapters translate.
53
+ 3. One port per real external dependency. Don't wrap things you'll never replace or fake (the standard library, pure utility libraries).
54
+ 4. Use cases take and return plain data or domain types, never HTTP request objects or ORM entities.
55
+ 5. Validation of input shape happens in the driving adapter; business invariants live in the domain.
56
+ 6. Tests: domain and use cases are unit-tested with in-memory fakes for ports; each adapter has its own integration test against the real thing (test database, sandbox API). Few end-to-end tests on top.
57
+ 7. Don't create a folder per layer per entity with one-line pass-through classes. If a use case only forwards to a repository, the module is probably CRUD; see the table above.
58
+
59
+ ## Migrating a tangled codebase
60
+
61
+ Never do a big-bang rewrite. Move one use case at a time, keeping the suite green after each step.
62
+
63
+ 1. **Pick the seam**: the use case with the most business logic and the most pain (bugs, hard to test). Read every caller.
64
+ 2. **Pin behaviour**: add characterisation tests at the current entry point (HTTP or function level) before moving anything. If you can't test it, stop and tell the user what blocks it.
65
+ 3. **Extract the use case**: move the logic out of the controller/model into a use-case function or class that takes its dependencies as parameters. Keep calling the same database code for now.
66
+ 4. **Introduce ports**: replace each direct infrastructure call in the use case with an interface defined next to the use case. The existing code becomes the first adapter.
67
+ 5. **Move domain rules** out of ORM models or services into domain types, one rule at a time.
68
+ 6. **Thin the controller**: it parses input, calls the use case, maps the result to a response. Nothing more.
69
+ 7. **Add the dependency check** so the extracted module can't regress.
70
+ 8. Run the test command after every step. Commit each step separately.
71
+
72
+ Stop and ask the user before: changing a public API or database schema as part of the move, introducing a DI framework, or moving more than one use case in one change.
73
+
74
+ ## Never
75
+
76
+ - Leak ORM entities, HTTP requests or vendor SDK types into the domain.
77
+ - Add an interface with exactly one implementation and no fake "for flexibility" outside a real boundary.
78
+ - Let the domain call the database "just this once."
79
+ - Restructure the whole repo into layers before a single use case benefits.
80
+
81
+ ## Report back
82
+
83
+ ```
84
+ Verdict: apply | partial (modules) | skip, and why
85
+ Core modules: paths, and the dependency check that guards them
86
+ Ports added: name → adapter(s)
87
+ Steps done: list, each with test command result
88
+ Next seam: the next use case worth extracting
89
+ ```
@@ -0,0 +1,17 @@
1
+ {
2
+ "should_trigger": [
3
+ "All our pricing logic lives inside the Django views, how do I pull it out so I can test it without a database?",
4
+ "Set up ports and adapters for the billing module so we can swap Stripe for Paystack later",
5
+ "Is clean architecture overkill for our small CRUD admin service?",
6
+ "Our domain classes import the ORM everywhere. Help me fix the dependency direction step by step",
7
+ "Carve the order placement use case out of this 2000-line legacy service without a rewrite"
8
+ ],
9
+ "should_not_trigger": [
10
+ "Design the REST endpoints and error format for the new orders API",
11
+ "Rename this long method and split it into smaller functions, keeping behaviour",
12
+ "Compare a monolith versus microservices for our new platform and recommend one",
13
+ "Write an ADR documenting that we adopted hexagonal architecture",
14
+ "Implement the Stripe webhook handler for subscription renewals",
15
+ "Delete the dead code and unused exports in the utils folder"
16
+ ]
17
+ }
@@ -0,0 +1,91 @@
1
+ ---
2
+ name: hipaa-compliance
3
+ description: Engineering rules for US HIPAA work on protected health information (PHI and ePHI), covering whether HIPAA applies, Security Rule safeguards such as role-based access, audit trails, encryption and automatic logoff, business associate agreements with cloud, email, SMS and AI vendors, the minimum necessary standard, de-identification, PHI-free logging, and breach readiness, with a clear not-legal-advice line. Use when building or reviewing a health, telehealth, clinic, pharmacy or insurance system in the US, choosing a vendor that will touch patient data, or scrubbing PHI from logs and analytics.
4
+ license: MIT
5
+ compatibility: Any Agent Skills host. Works on any codebase; no CLI needed. Rule detail lives in references/safeguards.md and must be checked against current HHS guidance.
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
+ # HIPAA compliance
14
+
15
+ Engineer a system that protects electronic protected health information (ePHI) by default: only the right people see it, every access is recorded, it never leaks into logs or vendors without a contract, and a breach can be scoped quickly.
16
+
17
+ ## Boundary: this is not legal advice
18
+
19
+ - You help design and build safeguards. You do not decide whether the organisation is a covered entity or business associate, whether an incident is a reportable breach, or whether a vendor contract is adequate. The privacy officer, security officer or counsel decides.
20
+ - Say so once, plainly, when the user asks a legal question, and continue with the engineering.
21
+ - No code or vendor can make a system "HIPAA compliant" on its own. Never write that claim in code, docs or marketing copy.
22
+
23
+ ## Step 1: does HIPAA apply, and to what data?
24
+
25
+ Ask the user, and **stop and ask** if the answer is unclear:
26
+
27
+ 1. Is the organisation a covered entity (health plan, health care clearinghouse, or a provider that conducts standard electronic transactions such as claims), or a business associate (a vendor that creates, receives, keeps or sends PHI for one)? A consumer wellness app that patients use on their own, with no covered entity involved, is often outside HIPAA but may fall under other laws (for example the FTC Health Breach Notification Rule or state health privacy laws). Flag this to the user; do not decide it.
28
+ 2. Which data is PHI: individually identifiable health information (past, present or future health, care, or payment for care) that is linked to an identifier. Names, dates (except year) tied to a person, phone, email, addresses below state level, record and account numbers, device ids, IPs, full-face photos and biometrics are all identifiers. `references/safeguards.md` lists the 18 Safe Harbor identifiers.
29
+ 3. Data that has been de-identified by Safe Harbor or expert determination is not PHI. Treat it as PHI until someone has done that properly.
30
+
31
+ ## Step 2: map where ePHI lives and flows
32
+
33
+ Search the codebase and infrastructure for ePHI: database tables, file storage, message queues, caches, search indexes, logs, error trackers, analytics, email and SMS, backups, exports, BI tools, support tooling and AI or LLM calls. Record each in a table:
34
+
35
+ | System | ePHI fields | Who can access | Encrypted at rest | Vendor | BAA in place |
36
+ |---|---|---|---|---|---|
37
+
38
+ This map feeds the organisation's risk analysis, which the Security Rule requires and which OCR most often finds missing.
39
+
40
+ ## Step 3: vendors and business associate agreements
41
+
42
+ 1. Every vendor that stores, processes or transmits ePHI for you needs a signed BAA before any ePHI reaches it. That includes cloud hosting, databases, email, SMS, video, error tracking, logging, analytics, support desks and AI APIs.
43
+ 2. A vendor's BAA often covers only listed services or a specific plan. Check that the exact service and configuration you use is in scope.
44
+ 3. If there is no BAA, **stop**: keep ePHI away from that vendor (strip it, or pick another vendor). Tell the user which integration is blocked and why.
45
+ 4. Typical traps: client-side analytics or session replay on logged-in pages, crash reporters capturing request bodies, marketing pixels on appointment pages, and support tools that receive screenshots.
46
+
47
+ ## Step 4: technical safeguards to build
48
+
49
+ Follow `references/safeguards.md` for the rule mapping. In code:
50
+
51
+ - **Access control**: unique user ids (no shared accounts), role-based access scoped to the patient relationship, an emergency ("break glass") access path that is logged and reviewed, automatic session timeout, and MFA for workforce and admin access.
52
+ - **Minimum necessary**: APIs return only the fields the role and task need. Lists show summaries; full records load on purpose. Internal tools mask identifiers by default.
53
+ - **Audit controls**: an append-only audit log of every create, read, update, delete and export of ePHI: actor id, patient or record id, action, timestamp, source IP, and reason for break-glass access. Store it apart from the app database, protect it from edits, and keep it for the retention period counsel sets (HIPAA documentation is kept six years; confirm what applies to logs).
54
+ - **Integrity**: validate input, use database constraints, and keep versions or history for clinical records instead of overwriting.
55
+ - **Transmission security**: TLS for every connection, including internal service calls and database connections. No ePHI in email or SMS bodies unless the organisation's policy allows it; send a "you have a new message" link instead.
56
+ - **Encryption at rest**: encrypt databases, volumes, object storage and backups, with keys in a managed key service and access to keys logged. Encryption is "addressable" under the current rule, but encrypted data is what lets a lost laptop or leaked bucket fall outside breach notification, so treat it as required.
57
+
58
+ ## Step 5: logging and telemetry without PHI
59
+
60
+ - Log record ids and request ids, never names, dates of birth, diagnoses, notes, medications, insurance ids or free-text fields.
61
+ - Add a redaction layer to the logger, the error tracker (scrub request bodies, headers, query strings) and the APM agent. Test it with a fixture that contains fake PHI.
62
+ - URLs and analytics event names must not contain PHI (no `/patients/jane-doe/hiv-results`). Use opaque ids.
63
+ - Never paste real patient data into tickets, chat, prompts or test fixtures. Use synthetic data in every non-production environment.
64
+
65
+ ## Step 6: breach readiness
66
+
67
+ - The Breach Notification Rule sets deadlines measured from discovery; see `references/safeguards.md`. Engineering must be able to answer quickly: what was accessed, whose records, from when to when.
68
+ - Keep audit logs queryable by patient and by actor, and keep a way to produce an affected-patient list with contact details.
69
+ - On a suspected incident: contain, preserve logs and snapshots, record the discovery time, and escalate to the security or privacy officer. Do not notify patients, regulators or the press yourself, and do not delete evidence.
70
+
71
+ ## Never
72
+
73
+ - Never send ePHI to a vendor without a BAA, including "just for debugging".
74
+ - Never put ePHI in logs, URLs, analytics, push notification text or email subjects.
75
+ - Never use real patient data in development, testing, demos or AI prompts.
76
+ - Never weaken access checks for convenience (shared admin logins, disabled timeouts, wildcard roles).
77
+ - Never state that the system or a vendor "is HIPAA compliant" or "HIPAA certified" (there is no official certification).
78
+
79
+ ## Report format
80
+
81
+ ```
82
+ HIPAA engineering review: <system or feature>
83
+ Applies because: <covered entity / business associate, as stated by the user>
84
+ ePHI map: <path or inline table>
85
+ Findings (highest risk first):
86
+ 1. [High|Medium|Low] <safeguard> at <file:line or system>: <gap> -> <fix>
87
+ Vendors without a confirmed BAA: <list>
88
+ Questions for the privacy or security officer: <list>
89
+ Not checked: <systems you could not see>
90
+ This is engineering guidance, not legal advice.
91
+ ```
@@ -0,0 +1,18 @@
1
+ {
2
+ "should_trigger": [
3
+ "We're building a telehealth app for US clinics, what HIPAA safeguards do we need in the backend?",
4
+ "Can we use Sentry and Twilio in our patient portal or do we need a BAA first?",
5
+ "Our logs are full of patient names and diagnoses, help me scrub PHI out of them",
6
+ "Design an audit log for who viewed or exported each patient record in our EHR",
7
+ "Is a hashed email plus visit date still PHI if we send it to our analytics vendor?",
8
+ "Review our pharmacy refill service for HIPAA minimum necessary and access control gaps"
9
+ ],
10
+ "should_not_trigger": [
11
+ "Our EU users want their data deleted under GDPR, build the erasure flow",
12
+ "Which SAQ do we need if we use Stripe Checkout for payments?",
13
+ "Write unit tests for the appointment booking service",
14
+ "Do a security review of our new password reset endpoint",
15
+ "Set up role-based access control with OAuth scopes in our NestJS API",
16
+ "Build a PyTorch model that predicts hospital readmission from tabular data"
17
+ ]
18
+ }
@@ -0,0 +1,68 @@
1
+ # HIPAA rule map for engineers
2
+
3
+ Engineering summary only, not legal advice. Check HHS (hhs.gov/hipaa) and the regulation text (45 CFR Parts 160 and 164) before relying on any detail, and have the privacy or security officer confirm.
4
+
5
+ ## Status of the Security Rule
6
+
7
+ - HHS published a proposed overhaul of the Security Rule in January 2025. It would remove the "required" versus "addressable" split and make controls such as encryption and MFA mandatory. It is still a proposal: in July 2026 the federal regulatory agenda moved its final action date to July 2027 and listed it under long-term actions. The current Security Rule stays in force until a final rule takes effect; check HHS for its status.
8
+ - Build to the stricter proposed bar anyway (encrypt everything, MFA everywhere, asset inventory, network map), because it is cheap to do in new systems and expensive to retrofit.
9
+
10
+ ## Security Rule safeguards (45 CFR 164.308 to 164.312)
11
+
12
+ | Safeguard | Section | What engineering builds |
13
+ |---|---|---|
14
+ | Risk analysis and risk management | 164.308(a)(1) | ePHI map, threat list, tracked remediation |
15
+ | Workforce access management | 164.308(a)(4) | Role definitions, joiner/mover/leaver process, access reviews |
16
+ | Security incident procedures | 164.308(a)(6) | Incident runbook, alerting, evidence preservation |
17
+ | Contingency plan | 164.308(a)(7) | Encrypted backups, tested restores, disaster recovery plan |
18
+ | Business associate contracts | 164.308(b), 164.314(a) | BAA register per vendor and service |
19
+ | Device and media controls | 164.310(d) | Disk encryption, secure wipe, no ePHI on unmanaged devices |
20
+ | Access control | 164.312(a) | Unique user ids, emergency access, automatic logoff, encryption (addressable) |
21
+ | Audit controls | 164.312(b) | Tamper-resistant audit log of ePHI activity |
22
+ | Integrity | 164.312(c) | Controls against improper alteration or destruction |
23
+ | Person or entity authentication | 164.312(d) | Strong authentication, MFA |
24
+ | Transmission security | 164.312(e) | TLS everywhere, integrity checks, encryption (addressable) |
25
+
26
+ "Addressable" does not mean optional: implement it, or document why an equivalent measure is reasonable.
27
+
28
+ Documentation of policies and actions is kept for six years from creation or last effective date (164.316(b)(2)).
29
+
30
+ ## Privacy Rule points that shape code
31
+
32
+ - **Minimum necessary** (164.502(b), 164.514(d)): limit uses, disclosures and requests to the minimum needed. Does not apply to disclosures to the patient or for treatment between providers.
33
+ - **Business associates** (164.502(e), 164.504(e)): a BAA must be in place before a business associate handles PHI, and subcontractors of business associates need one too.
34
+ - **Patient right of access** (164.524): patients can get copies of their records, electronically if held electronically. Build an export.
35
+
36
+ ## De-identification (164.514(b))
37
+
38
+ Two methods: expert determination, or Safe Harbor. Safe Harbor removes these 18 identifiers of the individual and of relatives, employers and household members, and the entity has no actual knowledge that the rest could identify the person:
39
+
40
+ 1. Names
41
+ 2. Geographic subdivisions smaller than a state (street, city, county, ZIP; the first three ZIP digits may stay if that area has more than 20,000 people)
42
+ 3. All elements of dates (except year) related to the person, and all ages over 89
43
+ 4. Telephone numbers
44
+ 5. Fax numbers
45
+ 6. Email addresses
46
+ 7. Social Security numbers
47
+ 8. Medical record numbers
48
+ 9. Health plan beneficiary numbers
49
+ 10. Account numbers
50
+ 11. Certificate or license numbers
51
+ 12. Vehicle identifiers and serial numbers, including license plates
52
+ 13. Device identifiers and serial numbers
53
+ 14. Web URLs
54
+ 15. IP addresses
55
+ 16. Biometric identifiers, including finger and voice prints
56
+ 17. Full-face photographs and comparable images
57
+ 18. Any other unique identifying number, characteristic or code
58
+
59
+ Hashing an identifier is not de-identification by itself.
60
+
61
+ ## Breach Notification Rule (164.400 to 164.414)
62
+
63
+ - Applies to unsecured PHI. PHI encrypted to HHS guidance, with the key not compromised, is "secured".
64
+ - Individuals: without unreasonable delay and no later than 60 calendar days after discovery.
65
+ - HHS: for 500 or more individuals, at the same time as individual notice; for fewer than 500, in an annual log submitted within 60 days after the end of the calendar year.
66
+ - Media: when more than 500 residents of a state or jurisdiction are affected.
67
+ - Business associates notify the covered entity without unreasonable delay and no later than 60 days after discovery.
68
+ - Whether an incident is a reportable breach is a legal decision based on a risk assessment. Engineering provides the facts.