@thedecipherist/claude-packs 0.0.0-stage → 1.0.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 (827) hide show
  1. package/CHANGELOG.md +680 -0
  2. package/LICENSE +21 -0
  3. package/README.md +316 -2
  4. package/bin/claude-packs.mjs +204 -0
  5. package/configurations/base/config.json +85 -0
  6. package/configurations/cpp/config.json +92 -0
  7. package/configurations/full-stack/config.json +152 -0
  8. package/configurations/go/config.json +96 -0
  9. package/configurations/node/config.json +100 -0
  10. package/configurations/python/config.json +97 -0
  11. package/configurations/synth-creator/config.json +148 -0
  12. package/global/hooks/gnu-shell.mjs +131 -0
  13. package/global/hooks/lib/program-read.mjs +196 -0
  14. package/global/hooks/lib/program-writes.mjs +177 -0
  15. package/global/hooks/lib/shell-writes.mjs +293 -0
  16. package/global/hooks/shell-traps.mjs +79 -0
  17. package/global/hooks/version-pin-guard.mjs +280 -0
  18. package/global/skills/latest-versions/SKILL.md +49 -0
  19. package/lib/backup.mjs +34 -0
  20. package/lib/claude-md.mjs +58 -0
  21. package/lib/config-cli.mjs +36 -0
  22. package/lib/configs.mjs +145 -0
  23. package/lib/coverage.mjs +86 -0
  24. package/lib/custom-packs.mjs +93 -0
  25. package/lib/doctor.mjs +115 -0
  26. package/lib/fix-plan.mjs +71 -0
  27. package/lib/git-tokens.mjs +64 -0
  28. package/lib/global.mjs +125 -0
  29. package/lib/hook-proof.mjs +28 -0
  30. package/lib/hook-timing.mjs +42 -0
  31. package/lib/hover-gate.mjs +29 -0
  32. package/lib/kit-lock.mjs +149 -0
  33. package/lib/layout.mjs +75 -0
  34. package/lib/logs.mjs +69 -0
  35. package/lib/manifest.mjs +24 -0
  36. package/lib/new.mjs +49 -0
  37. package/lib/once-only-report.mjs +54 -0
  38. package/lib/pack-manifest.mjs +20 -0
  39. package/lib/packs.mjs +107 -0
  40. package/lib/planner.mjs +59 -0
  41. package/lib/repeats.mjs +65 -0
  42. package/lib/repo-weight.mjs +28 -0
  43. package/lib/rules.mjs +40 -0
  44. package/lib/scan-detect.mjs +94 -0
  45. package/lib/scan.mjs +168 -0
  46. package/lib/selftest-cache.mjs +39 -0
  47. package/lib/settings.mjs +138 -0
  48. package/lib/shape-cli.mjs +76 -0
  49. package/lib/shape.mjs +4 -0
  50. package/lib/suggest.mjs +18 -0
  51. package/lib/switches.mjs +44 -0
  52. package/lib/symmetry-doctor.mjs +26 -0
  53. package/lib/sync.mjs +130 -0
  54. package/package.json +34 -4
  55. package/packs/ai/checks/boundary-computes-its-own-hash.json +30 -0
  56. package/packs/ai/checks/model-call-needs-boundary.json +29 -0
  57. package/packs/ai/checks/model-id-from-config.json +28 -0
  58. package/packs/ai/checks/model-output-validated.json +26 -0
  59. package/packs/ai/pack.json +38 -0
  60. package/packs/ai/rules/ai-input-sha-boundary.md +31 -0
  61. package/packs/ai/rules/llm-pipeline-security.md +26 -0
  62. package/packs/audio-core/checks/denormals-not-in-prepare.json +12 -0
  63. package/packs/audio-core/checks/dsp-without-apvts.json +12 -0
  64. package/packs/audio-core/checks/float-phase-or-rate.json +12 -0
  65. package/packs/audio-core/checks/juce-snap-to-zero-off.json +12 -0
  66. package/packs/audio-core/checks/keep-werror.json +12 -0
  67. package/packs/audio-core/checks/no-fast-math.json +14 -0
  68. package/packs/audio-core/checks/no-locale-change.json +12 -0
  69. package/packs/audio-core/checks/no-march-native.json +14 -0
  70. package/packs/audio-core/clang-tidy +28 -0
  71. package/packs/audio-core/hooks/lib/realtime-checks.mjs +56 -0
  72. package/packs/audio-core/hooks/param-id-lock.mjs +129 -0
  73. package/packs/audio-core/hooks/realtime-guard.mjs +67 -0
  74. package/packs/audio-core/pack.json +187 -0
  75. package/packs/audio-core/rules/audio-thread-realtime-safe.md +27 -0
  76. package/packs/audio-core/rules/audio-ui-thread-handoff.md +21 -0
  77. package/packs/audio-core/rules/boundary-tests-cross-the-boundary.md +16 -0
  78. package/packs/audio-core/rules/build-flags-safe.md +20 -0
  79. package/packs/audio-core/rules/cached-parameter-pointers.md +28 -0
  80. package/packs/audio-core/rules/clang-tidy-core-guidelines.md +21 -0
  81. package/packs/audio-core/rules/control-reaches-every-surface.md +23 -0
  82. package/packs/audio-core/rules/cpu-worst-case-per-block.md +26 -0
  83. package/packs/audio-core/rules/dc-block-after-asymmetry.md +22 -0
  84. package/packs/audio-core/rules/discrete-params-snap.md +19 -0
  85. package/packs/audio-core/rules/double-where-precision-matters.md +20 -0
  86. package/packs/audio-core/rules/filters-stable-under-modulation.md +29 -0
  87. package/packs/audio-core/rules/host-parameters-at-scale.md +24 -0
  88. package/packs/audio-core/rules/house-control-behaviours.md +34 -0
  89. package/packs/audio-core/rules/math-domain-guards.md +19 -0
  90. package/packs/audio-core/rules/modulated-delay-interpolation.md +22 -0
  91. package/packs/audio-core/rules/multiband-phase-coherent.md +22 -0
  92. package/packs/audio-core/rules/nonlinear-stages-antialiased.md +28 -0
  93. package/packs/audio-core/rules/note-ledger-and-pedals.md +22 -0
  94. package/packs/audio-core/rules/one-formula-per-value.md +20 -0
  95. package/packs/audio-core/rules/optimisations-are-null-tested.md +23 -0
  96. package/packs/audio-core/rules/oscillators-bandlimited.md +23 -0
  97. package/packs/audio-core/rules/output-limiter.md +23 -0
  98. package/packs/audio-core/rules/parameter-ids-never-change.md +20 -0
  99. package/packs/audio-core/rules/params-and-state-thread-safe.md +19 -0
  100. package/packs/audio-core/rules/params-snapshot-per-block.md +21 -0
  101. package/packs/audio-core/rules/patch-excludes-performance-controls.md +18 -0
  102. package/packs/audio-core/rules/per-sample-code-inlinable.md +22 -0
  103. package/packs/audio-core/rules/prepare-is-repeatable.md +23 -0
  104. package/packs/audio-core/rules/recursive-state-nan-guard.md +20 -0
  105. package/packs/audio-core/rules/reverb-loop-gain-bounded.md +24 -0
  106. package/packs/audio-core/rules/sample-accurate-midi.md +22 -0
  107. package/packs/audio-core/rules/sample-rate-and-block-size-from-host.md +23 -0
  108. package/packs/audio-core/rules/scoped-no-denormals.md +26 -0
  109. package/packs/audio-core/rules/smooth-continuous-parameters.md +22 -0
  110. package/packs/audio-core/rules/state-load-versioned-and-safe.md +22 -0
  111. package/packs/audio-core/rules/straight-on-and-aligned.md +21 -0
  112. package/packs/audio-core/rules/ui-matches-reference-look.md +21 -0
  113. package/packs/audio-core/rules/undo-one-gesture-one-step.md +21 -0
  114. package/packs/audio-core/rules/voice-steal-fades.md +21 -0
  115. package/packs/audio-core/rules/voice-sum-headroom.md +20 -0
  116. package/packs/audio-core/skills/analyse-reference-look/SKILL.md +21 -0
  117. package/packs/audio-core/skills/copy-and-prove/SKILL.md +98 -0
  118. package/packs/audio-core/skills/juce-realtime-audit/SKILL.md +22 -0
  119. package/packs/audio-core/skills/measure-tone/SKILL.md +20 -0
  120. package/packs/audio-core/skills/new-panel-control/SKILL.md +15 -0
  121. package/packs/audio-core/skills/prove-control/SKILL.md +23 -0
  122. package/packs/audio-core/skills/trace-parameter/SKILL.md +29 -0
  123. package/packs/audio-core/tools/lib/spectrum.mjs +112 -0
  124. package/packs/audio-core/tools/lib/wav.mjs +41 -0
  125. package/packs/audio-core/tools/tone-report.mjs +47 -0
  126. package/packs/base/checks/field-map-over-if-runs.json +25 -0
  127. package/packs/base/checks/lookup-over-if-chains.json +25 -0
  128. package/packs/base/checks/lookup-over-ternary-chains.json +20 -0
  129. package/packs/base/checks/no-code-after-midline-comment.json +12 -0
  130. package/packs/base/checks/one-walk-per-template.json +23 -0
  131. package/packs/base/checks/stub-reports-success.json +31 -0
  132. package/packs/base/checks/test-skip-on-failed-setup.json +17 -0
  133. package/packs/base/hooks/brief-guard.mjs +96 -0
  134. package/packs/base/hooks/code-shape.mjs +95 -0
  135. package/packs/base/hooks/dispatch-once.mjs +87 -0
  136. package/packs/base/hooks/file-size-guard.mjs +61 -0
  137. package/packs/base/hooks/folder-law.mjs +74 -0
  138. package/packs/base/hooks/git-guard.mjs +289 -0
  139. package/packs/base/hooks/lesson-checks.mjs +174 -0
  140. package/packs/base/hooks/lib/apply-edit.mjs +20 -0
  141. package/packs/base/hooks/lib/code-shapes.mjs +137 -0
  142. package/packs/base/hooks/lib/content.mjs +14 -0
  143. package/packs/base/hooks/lib/cpp-scan.mjs +94 -0
  144. package/packs/base/hooks/lib/dup-index.mjs +199 -0
  145. package/packs/base/hooks/lib/dup.mjs +127 -0
  146. package/packs/base/hooks/lib/elements.mjs +87 -0
  147. package/packs/base/hooks/lib/event-log.mjs +67 -0
  148. package/packs/base/hooks/lib/function-shapes.mjs +90 -0
  149. package/packs/base/hooks/lib/git-adds.mjs +20 -0
  150. package/packs/base/hooks/lib/git-guard-selftest.mjs +99 -0
  151. package/packs/base/hooks/lib/glob.mjs +33 -0
  152. package/packs/base/hooks/lib/hook-log.mjs +100 -0
  153. package/packs/base/hooks/lib/house.py +77 -0
  154. package/packs/base/hooks/lib/languages.mjs +66 -0
  155. package/packs/base/hooks/lib/layout.mjs +54 -0
  156. package/packs/base/hooks/lib/making-check-selftest.mjs +109 -0
  157. package/packs/base/hooks/lib/near-copies.mjs +76 -0
  158. package/packs/base/hooks/lib/program-read.mjs +196 -0
  159. package/packs/base/hooks/lib/program-writes.mjs +177 -0
  160. package/packs/base/hooks/lib/project.mjs +81 -0
  161. package/packs/base/hooks/lib/prose.mjs +11 -0
  162. package/packs/base/hooks/lib/pushed.mjs +201 -0
  163. package/packs/base/hooks/lib/repo-index.mjs +52 -0
  164. package/packs/base/hooks/lib/secret-patterns.mjs +18 -0
  165. package/packs/base/hooks/lib/selftest.mjs +45 -0
  166. package/packs/base/hooks/lib/shape-code.mjs +126 -0
  167. package/packs/base/hooks/lib/shape.mjs +294 -0
  168. package/packs/base/hooks/lib/shell-writes-selftest.mjs +65 -0
  169. package/packs/base/hooks/lib/shell-writes.mjs +293 -0
  170. package/packs/base/hooks/lib/turn.mjs +81 -0
  171. package/packs/base/hooks/lib/writes.mjs +71 -0
  172. package/packs/base/hooks/making-check.mjs +243 -0
  173. package/packs/base/hooks/making.mjs +106 -0
  174. package/packs/base/hooks/once-only.mjs +150 -0
  175. package/packs/base/hooks/placement-law.mjs +84 -0
  176. package/packs/base/hooks/repo-litter.mjs +75 -0
  177. package/packs/base/hooks/reuse-hint.mjs +75 -0
  178. package/packs/base/hooks/run-hooks.mjs +132 -0
  179. package/packs/base/hooks/secrets-guard.mjs +99 -0
  180. package/packs/base/hooks/shape-law.mjs +133 -0
  181. package/packs/base/hooks/suite-once.mjs +80 -0
  182. package/packs/base/hooks/template-law.mjs +148 -0
  183. package/packs/base/hooks/untrusted-boundary.mjs +53 -0
  184. package/packs/base/pack.json +214 -0
  185. package/packs/base/rules/a-control-is-seen-to-fire.md +27 -0
  186. package/packs/base/rules/behaviour-lives-with-its-kind.md +51 -0
  187. package/packs/base/rules/bug-fix-starts-red.md +25 -0
  188. package/packs/base/rules/field-map-over-if-runs.md +47 -0
  189. package/packs/base/rules/finished-work-lands.md +17 -0
  190. package/packs/base/rules/git-right-first-time.md +19 -0
  191. package/packs/base/rules/instances-by-index-identities-by-id.md +54 -0
  192. package/packs/base/rules/lookup-over-if-chains.md +49 -0
  193. package/packs/base/rules/making-line-first.md +14 -0
  194. package/packs/base/rules/open-items-tagged.md +17 -0
  195. package/packs/base/rules/plan-and-logs.md +22 -0
  196. package/packs/base/rules/references-use-anchors.md +19 -0
  197. package/packs/base/rules/refusals-are-judged.md +18 -0
  198. package/packs/base/rules/reuse-before-writing.md +15 -0
  199. package/packs/base/rules/secrets-never-committed.md +16 -0
  200. package/packs/base/rules/skill-writing.md +23 -0
  201. package/packs/base/rules/split-before-the-limit.md +14 -0
  202. package/packs/base/rules/subagent-dispatch.md +26 -0
  203. package/packs/base/rules/test-only-what-changed.md +17 -0
  204. package/packs/base/rules/test-the-template-once.md +22 -0
  205. package/packs/base/rules/untrusted-content-boundary.md +15 -0
  206. package/packs/base/skills/add-lesson-check/SKILL.md +26 -0
  207. package/packs/base/skills/fix-from-scan/SKILL.md +25 -0
  208. package/packs/base/skills/land-branch/SKILL.md +24 -0
  209. package/packs/base/skills/make-it-a-template/SKILL.md +23 -0
  210. package/packs/base/skills/pdf-to-md/SKILL.md +25 -0
  211. package/packs/base/skills/pick-tests/SKILL.md +20 -0
  212. package/packs/base/skills/pressure-test-skill/SKILL.md +23 -0
  213. package/packs/base/skills/prove-instances-identical/SKILL.md +37 -0
  214. package/packs/base/tools/shape-symmetry-selftest.mjs +66 -0
  215. package/packs/base/tools/shape-symmetry.mjs +178 -0
  216. package/packs/base/tools/test-verdict.mjs +75 -0
  217. package/packs/ci/checks/ci-permissions-stated.json +18 -0
  218. package/packs/ci/checks/ci-tools-pinned.json +14 -0
  219. package/packs/ci/pack.json +21 -0
  220. package/packs/ci/rules/ci-covers-what-ships.md +20 -0
  221. package/packs/ci/rules/generated-files-have-no-diff.md +15 -0
  222. package/packs/content-site/checks/captcha-is-not-constant.json +27 -0
  223. package/packs/content-site/checks/img-has-size.json +20 -0
  224. package/packs/content-site/checks/page-head-complete.json +26 -0
  225. package/packs/content-site/pack.json +22 -0
  226. package/packs/content-site/rules/content-has-one-source.md +23 -0
  227. package/packs/content-site/rules/media-is-sized.md +24 -0
  228. package/packs/content-site/rules/page-head-is-complete.md +26 -0
  229. package/packs/content-site/rules/public-forms-are-defended.md +27 -0
  230. package/packs/content-site/skills/publish-a-page/SKILL.md +21 -0
  231. package/packs/cpp/checks/cpp-clamp-before-cast.json +16 -0
  232. package/packs/cpp/checks/cpp-find-with-the-library.json +12 -0
  233. package/packs/cpp/checks/cpp-hardened-test-build.json +18 -0
  234. package/packs/cpp/checks/cpp-m-pi-not-standard.json +23 -0
  235. package/packs/cpp/checks/cpp-no-atoi.json +16 -0
  236. package/packs/cpp/checks/cpp-no-const-cast.json +16 -0
  237. package/packs/cpp/checks/cpp-no-float-loop-counter.json +16 -0
  238. package/packs/cpp/checks/cpp-no-getenv-in-product.json +22 -0
  239. package/packs/cpp/checks/cpp-no-mutable-global.json +20 -0
  240. package/packs/cpp/checks/cpp-no-mutable-local-static.json +23 -0
  241. package/packs/cpp/checks/cpp-no-unchecked-fwrite.json +17 -0
  242. package/packs/cpp/checks/cpp-no-using-namespace-in-header.json +19 -0
  243. package/packs/cpp/checks/cpp-no-zero-size-array.json +23 -0
  244. package/packs/cpp/checks/cpp-numbers-pi.json +16 -0
  245. package/packs/cpp/pack.json +22 -0
  246. package/packs/cpp/rules/cpp-absent-and-failed-are-types.md +24 -0
  247. package/packs/cpp/rules/cpp-builds-everywhere.md +26 -0
  248. package/packs/cpp/rules/cpp-faults-only-in-the-test-build.md +21 -0
  249. package/packs/cpp/rules/cpp-find-with-the-library.md +19 -0
  250. package/packs/cpp/rules/cpp-gates-share-one-reader.md +22 -0
  251. package/packs/cpp/rules/cpp-headers-declare.md +22 -0
  252. package/packs/cpp/rules/cpp-numbers-and-casts.md +22 -0
  253. package/packs/cpp/rules/cpp-repeats-become-templates.md +33 -0
  254. package/packs/cpp/rules/cpp-static-analysis-runs.md +22 -0
  255. package/packs/cpp/rules/cpp-thread-contracts-are-code.md +23 -0
  256. package/packs/cpp/skills/cpp-extract-template/SKILL.md +38 -0
  257. package/packs/docker/checks/alpine-with-native-build.json +13 -0
  258. package/packs/docker/checks/compose-db-needs-auth.json +14 -0
  259. package/packs/docker/checks/compose-image-pinned.json +14 -0
  260. package/packs/docker/checks/compose-no-hardcoded-ip.json +12 -0
  261. package/packs/docker/checks/compose-no-host-bind-for-data.json +18 -0
  262. package/packs/docker/checks/compose-no-plaintext-secret.json +13 -0
  263. package/packs/docker/checks/compose-no-swarm-ignored-keys.json +13 -0
  264. package/packs/docker/checks/compose-overlay-not-bridge.json +13 -0
  265. package/packs/docker/checks/compose-service-needs-healthcheck.json +11 -0
  266. package/packs/docker/checks/compose-service-needs-init.json +11 -0
  267. package/packs/docker/checks/copy-needs-chown-with-user.json +17 -0
  268. package/packs/docker/checks/copy-source-before-deps.json +13 -0
  269. package/packs/docker/checks/docker-exec-form.json +16 -0
  270. package/packs/docker/checks/dockerfile-needs-healthcheck.json +17 -0
  271. package/packs/docker/checks/dockerfile-needs-user.json +21 -0
  272. package/packs/docker/checks/dockerignore-has-the-basics.json +21 -0
  273. package/packs/docker/checks/gitattributes-forces-lf.json +17 -0
  274. package/packs/docker/checks/health-checks-nothing.json +25 -0
  275. package/packs/docker/checks/no-crlf-in-scripts.json +15 -0
  276. package/packs/docker/checks/no-latest-base.json +13 -0
  277. package/packs/docker/checks/no-secret-in-image.json +13 -0
  278. package/packs/docker/checks/no-sensitive-file-copy.json +13 -0
  279. package/packs/docker/checks/node-env-before-install.json +13 -0
  280. package/packs/docker/checks/npm-ci-not-install.json +13 -0
  281. package/packs/docker/pack.json +46 -0
  282. package/packs/docker/rules/compose-pinned-and-closed.md +21 -0
  283. package/packs/docker/rules/compose-swarm-safe.md +26 -0
  284. package/packs/docker/rules/docker-exec-form.md +19 -0
  285. package/packs/docker/rules/dockerfile-multistage.md +13 -0
  286. package/packs/docker/rules/dockerfile-production.md +25 -0
  287. package/packs/docker/skills/docker-diagnose/SKILL.md +23 -0
  288. package/packs/dynamic-data/checks/draft-on-the-server.json +27 -0
  289. package/packs/dynamic-data/checks/guard-does-its-job.json +28 -0
  290. package/packs/dynamic-data/checks/key-is-not-a-display-name.json +28 -0
  291. package/packs/dynamic-data/checks/no-code-from-data.json +29 -0
  292. package/packs/dynamic-data/checks/no-collection-from-request.json +27 -0
  293. package/packs/dynamic-data/checks/no-pipeline-from-stored-text.json +27 -0
  294. package/packs/dynamic-data/checks/no-regexp-from-stored-config.json +27 -0
  295. package/packs/dynamic-data/checks/no-template-from-stored-text.json +27 -0
  296. package/packs/dynamic-data/checks/save-takes-named-paths.json +27 -0
  297. package/packs/dynamic-data/pack.json +23 -0
  298. package/packs/dynamic-data/rules/a-list-is-a-saved-query.md +23 -0
  299. package/packs/dynamic-data/rules/definitions-are-validated-data.md +24 -0
  300. package/packs/dynamic-data/rules/every-dynamic-surface-has-a-boundary.md +29 -0
  301. package/packs/dynamic-data/rules/fields-have-owners.md +22 -0
  302. package/packs/dynamic-data/rules/imports-drop-nothing.md +26 -0
  303. package/packs/dynamic-data/rules/one-definition-many-surfaces.md +24 -0
  304. package/packs/dynamic-data/rules/one-fact-one-place.md +28 -0
  305. package/packs/dynamic-data/rules/rules-live-in-the-engine.md +29 -0
  306. package/packs/dynamic-data/rules/saves-are-patches.md +28 -0
  307. package/packs/dynamic-data/rules/tenant-costs-one-document.md +22 -0
  308. package/packs/dynamic-data/skills/design-a-definition/SKILL.md +24 -0
  309. package/packs/fastify/checks/api-routes-versioned.json +28 -0
  310. package/packs/fastify/checks/cookie-host-prefix.json +24 -0
  311. package/packs/fastify/checks/hijack-needs-try.json +28 -0
  312. package/packs/fastify/checks/no-cast-at-route-boundary.json +24 -0
  313. package/packs/fastify/checks/no-db-in-route-file.json +28 -0
  314. package/packs/fastify/checks/no-err-message-to-client.json +24 -0
  315. package/packs/fastify/checks/no-regexp-from-input.json +24 -0
  316. package/packs/fastify/checks/no-trust-proxy-true.json +25 -0
  317. package/packs/fastify/checks/one-error-body.json +26 -0
  318. package/packs/fastify/checks/origin-from-config-not-host.json +31 -0
  319. package/packs/fastify/checks/password-needs-slow-hash.json +30 -0
  320. package/packs/fastify/checks/sec-headers-present.json +28 -0
  321. package/packs/fastify/checks/secrets-compared-constant-time.json +24 -0
  322. package/packs/fastify/checks/sse-needs-error-listener.json +28 -0
  323. package/packs/fastify/checks/user-bytes-need-disposition.json +29 -0
  324. package/packs/fastify/pack.json +41 -0
  325. package/packs/fastify/rules/credentials-and-input.md +23 -0
  326. package/packs/fastify/rules/security-one-switch.md +28 -0
  327. package/packs/fastify/rules/streams-and-hijacks.md +22 -0
  328. package/packs/fastify/rules/tests-use-inject.md +13 -0
  329. package/packs/fastify/rules/three-layers.md +20 -0
  330. package/packs/fastify/rules/trust-config-not-headers.md +24 -0
  331. package/packs/full-stack/checks/no-express-no-vite.json +23 -0
  332. package/packs/full-stack/hooks/stack-guard.mjs +90 -0
  333. package/packs/full-stack/pack.json +76 -0
  334. package/packs/full-stack/rules/stack-is-fastify-and-nextjs.md +20 -0
  335. package/packs/go/checks/go-exec-result-ignored.json +15 -0
  336. package/packs/go/checks/go-unmarshal-error-ignored.json +15 -0
  337. package/packs/go/pack.json +21 -0
  338. package/packs/go/rules/go-errors-are-handled.md +22 -0
  339. package/packs/gpu-painter/checks/dawn-backends-and-validation.json +9 -0
  340. package/packs/gpu-painter/checks/dawn-no-spontaneous.json +10 -0
  341. package/packs/gpu-painter/checks/dawn-present-on-render-thread.json +17 -0
  342. package/packs/gpu-painter/checks/gpu-no-frame-stalls.json +12 -0
  343. package/packs/gpu-painter/checks/no-opengl-link.json +11 -0
  344. package/packs/gpu-painter/checks/no-opengl.json +13 -0
  345. package/packs/gpu-painter/hooks/browser-guard.py +196 -0
  346. package/packs/gpu-painter/pack.json +91 -0
  347. package/packs/gpu-painter/rules/dawn-build-and-shaders.md +27 -0
  348. package/packs/gpu-painter/rules/dawn-device-and-render-thread.md +26 -0
  349. package/packs/gpu-painter/rules/gpu-antialiasing.md +20 -0
  350. package/packs/gpu-painter/rules/gpu-blend-order.md +22 -0
  351. package/packs/gpu-painter/rules/gpu-bloom.md +20 -0
  352. package/packs/gpu-painter/rules/gpu-frame-budget.md +25 -0
  353. package/packs/gpu-painter/rules/gpu-frame-pacing-and-power.md +27 -0
  354. package/packs/gpu-painter/rules/gpu-frame-work.md +30 -0
  355. package/packs/gpu-painter/rules/gpu-golden-images.md +21 -0
  356. package/packs/gpu-painter/rules/gpu-hdr-and-tonemap.md +23 -0
  357. package/packs/gpu-painter/rules/gpu-picking-on-cpu.md +19 -0
  358. package/packs/gpu-painter/rules/gpu-render-lifecycle.md +25 -0
  359. package/packs/gpu-painter/rules/gpu-text-atlas.md +24 -0
  360. package/packs/gpu-painter/rules/gpu-travellers-from-snapshot.md +24 -0
  361. package/packs/gpu-painter/rules/hover-every-pressable.md +25 -0
  362. package/packs/gpu-painter/skills/gpu-capture/SKILL.md +15 -0
  363. package/packs/gpu-painter/skills/gpu-frame-bench/SKILL.md +14 -0
  364. package/packs/gpu-painter/skills/gpu-golden-check/SKILL.md +13 -0
  365. package/packs/gpu-painter/skills/gpu-golden-update/SKILL.md +16 -0
  366. package/packs/gpu-painter/skills/gpu-lifecycle-stress/SKILL.md +15 -0
  367. package/packs/gpu-painter/skills/hover-state/SKILL.md +33 -0
  368. package/packs/hook-proof/checks/hook-catch-must-not-allow.json +16 -0
  369. package/packs/hook-proof/checks/hook-command-no-pipe.json +16 -0
  370. package/packs/hook-proof/checks/hook-exit-1-does-not-block.json +17 -0
  371. package/packs/hook-proof/checks/hook-no-or-true.json +18 -0
  372. package/packs/hook-proof/checks/hook-refusal-on-stderr.json +17 -0
  373. package/packs/hook-proof/pack.json +38 -0
  374. package/packs/hook-proof/rules/a-refusal-is-exit-2.md +28 -0
  375. package/packs/hook-proof/skills/prove-a-hook/SKILL.md +21 -0
  376. package/packs/host-agent/checks/file-path-from-param.json +27 -0
  377. package/packs/host-agent/checks/integrity-check-optional.json +27 -0
  378. package/packs/host-agent/checks/quoted-value-into-config.json +24 -0
  379. package/packs/host-agent/checks/secret-on-argv.json +28 -0
  380. package/packs/host-agent/checks/ssh-verifies-host-key.json +27 -0
  381. package/packs/host-agent/checks/system-file-written-in-place.json +26 -0
  382. package/packs/host-agent/checks/tmp-path-predictable.json +27 -0
  383. package/packs/host-agent/pack.json +22 -0
  384. package/packs/host-agent/rules/root-on-other-machines.md +27 -0
  385. package/packs/html-ui/checks/email-html-escapes.json +25 -0
  386. package/packs/html-ui/checks/external-link-rel.json +21 -0
  387. package/packs/html-ui/checks/no-duplicate-escape.json +26 -0
  388. package/packs/html-ui/checks/no-inline-client-script.json +21 -0
  389. package/packs/html-ui/checks/no-inline-style.json +23 -0
  390. package/packs/html-ui/pack.json +33 -0
  391. package/packs/html-ui/rules/email-html-escapes.md +19 -0
  392. package/packs/html-ui/rules/server-html-escapes-everything.md +22 -0
  393. package/packs/http-api/checks/api-path-versioned.json +31 -0
  394. package/packs/http-api/checks/authz-from-request-body.json +26 -0
  395. package/packs/http-api/checks/client-calls-a-version.json +28 -0
  396. package/packs/http-api/checks/client-ip-not-leftmost-xff.json +28 -0
  397. package/packs/http-api/checks/cors-needs-origin.json +26 -0
  398. package/packs/http-api/checks/csp-not-switched-off.json +28 -0
  399. package/packs/http-api/checks/debug-route-not-shipped.json +26 -0
  400. package/packs/http-api/checks/encrypted-name-plaintext-value.json +26 -0
  401. package/packs/http-api/checks/err-text-stays-server-side.json +27 -0
  402. package/packs/http-api/checks/failure-is-not-empty.json +28 -0
  403. package/packs/http-api/checks/gate-is-not-a-todo.json +27 -0
  404. package/packs/http-api/checks/guard-fails-open.json +28 -0
  405. package/packs/http-api/checks/hmac-over-reserialised-body.json +26 -0
  406. package/packs/http-api/checks/jwt-verify-pins-algorithm.json +26 -0
  407. package/packs/http-api/checks/middleware-skips-without-user.json +26 -0
  408. package/packs/http-api/checks/next-api-route-versioned.json +47 -0
  409. package/packs/http-api/checks/no-security-off-switch.json +28 -0
  410. package/packs/http-api/checks/oauth-state-signed.json +26 -0
  411. package/packs/http-api/checks/one-time-code-compared-raw.json +26 -0
  412. package/packs/http-api/checks/query-cast-is-not-validation.json +28 -0
  413. package/packs/http-api/checks/queue-action-from-client.json +26 -0
  414. package/packs/http-api/checks/rate-limit-one-module.json +28 -0
  415. package/packs/http-api/checks/role-checked-in-one-guard.json +27 -0
  416. package/packs/http-api/checks/route-body-needs-schema.json +31 -0
  417. package/packs/http-api/checks/route-scopes-to-the-caller.json +31 -0
  418. package/packs/http-api/checks/secret-compared-constant-time-any.json +28 -0
  419. package/packs/http-api/checks/secret-in-job-record.json +27 -0
  420. package/packs/http-api/checks/server-fetches-tenant-url.json +30 -0
  421. package/packs/http-api/checks/short-code-needs-limit.json +26 -0
  422. package/packs/http-api/checks/user-url-through-safe-fetch.json +28 -0
  423. package/packs/http-api/checks/webhook-dedupes-event-id.json +30 -0
  424. package/packs/http-api/pack.json +45 -0
  425. package/packs/http-api/rules/adapters-one-db-gateway.md +18 -0
  426. package/packs/http-api/rules/apis-are-versioned.md +27 -0
  427. package/packs/http-api/rules/credentials-handled-safely.md +22 -0
  428. package/packs/http-api/rules/handlers-own-the-work.md +17 -0
  429. package/packs/http-api/rules/health-and-correlation.md +17 -0
  430. package/packs/http-api/rules/one-error-contract.md +17 -0
  431. package/packs/http-api/rules/routes-are-thin.md +17 -0
  432. package/packs/http-api/rules/routes-scope-to-the-caller.md +26 -0
  433. package/packs/http-api/rules/routes-validate-and-answer.md +25 -0
  434. package/packs/http-api/skills/change-an-api/SKILL.md +20 -0
  435. package/packs/http-api/skills/secure-a-route/SKILL.md +21 -0
  436. package/packs/instrument-shell/checks/no-raw-struct-blob.json +23 -0
  437. package/packs/instrument-shell/pack.json +22 -0
  438. package/packs/instrument-shell/rules/fold-keeps-every-route.md +24 -0
  439. package/packs/instrument-shell/rules/quiet-announces-itself.md +22 -0
  440. package/packs/instrument-shell/rules/render-the-extremes.md +25 -0
  441. package/packs/instrument-shell/rules/seams-are-declared.md +27 -0
  442. package/packs/instrument-shell/rules/session-blob-append-only.md +25 -0
  443. package/packs/instrument-shell/skills/gates-from-commit-one/SKILL.md +20 -0
  444. package/packs/instrument-shell/skills/hit-the-painted-control/SKILL.md +18 -0
  445. package/packs/js-ts/checks/async-callback-unguarded.json +26 -0
  446. package/packs/js-ts/checks/background-loop-needs-stop.json +28 -0
  447. package/packs/js-ts/checks/child-process-error-handler.json +28 -0
  448. package/packs/js-ts/checks/entry-registers-shutdown.json +31 -0
  449. package/packs/js-ts/checks/fetch-needs-timeout.json +30 -0
  450. package/packs/js-ts/checks/job-only-in-memory.json +28 -0
  451. package/packs/js-ts/checks/json-only-through-helper.json +29 -0
  452. package/packs/js-ts/checks/line-under-200-chars.json +34 -0
  453. package/packs/js-ts/checks/localhost-default-in-server.json +29 -0
  454. package/packs/js-ts/checks/no-any.json +27 -0
  455. package/packs/js-ts/checks/no-cast-escape-hatches.json +24 -0
  456. package/packs/js-ts/checks/no-console-in-app.json +31 -0
  457. package/packs/js-ts/checks/no-dynamic-import-node-builtin.json +25 -0
  458. package/packs/js-ts/checks/no-inline-binary.json +20 -0
  459. package/packs/js-ts/checks/no-inline-zod-outside-schemas.json +27 -0
  460. package/packs/js-ts/checks/no-local-sleep.json +25 -0
  461. package/packs/js-ts/checks/no-nested-ternary.json +20 -0
  462. package/packs/js-ts/checks/no-secret-in-log.json +24 -0
  463. package/packs/js-ts/checks/no-shell-string-interpolation.json +24 -0
  464. package/packs/js-ts/checks/no-swallowed-errors.json +25 -0
  465. package/packs/js-ts/checks/no-ts-enum.json +20 -0
  466. package/packs/js-ts/checks/process-env-only-in-config.json +31 -0
  467. package/packs/js-ts/checks/race-leaves-work-running.json +23 -0
  468. package/packs/js-ts/checks/reject-as-catch-all-exists.json +24 -0
  469. package/packs/js-ts/checks/secret-has-no-fallback.json +24 -0
  470. package/packs/js-ts/checks/secret-needs-crypto-random.json +24 -0
  471. package/packs/js-ts/checks/server-close-awaited.json +27 -0
  472. package/packs/js-ts/checks/session-user-typed-once.json +24 -0
  473. package/packs/js-ts/checks/switch-is-a-table.json +24 -0
  474. package/packs/js-ts/checks/test-imports-the-source.json +19 -0
  475. package/packs/js-ts/checks/test-name-says-behaviour.json +16 -0
  476. package/packs/js-ts/checks/tsconfig-flags.json +21 -0
  477. package/packs/js-ts/checks/void-needs-catch.json +24 -0
  478. package/packs/js-ts/checks/zod-string-needs-max.json +25 -0
  479. package/packs/js-ts/checks/zod-v4-formats.json +23 -0
  480. package/packs/js-ts/pack.json +84 -0
  481. package/packs/js-ts/rules/await-handled-at-a-boundary.md +66 -0
  482. package/packs/js-ts/rules/env-through-config.md +36 -0
  483. package/packs/js-ts/rules/errors-never-swallowed.md +33 -0
  484. package/packs/js-ts/rules/files-under-300-lines.md +18 -0
  485. package/packs/js-ts/rules/guard-clauses-over-nesting.md +34 -0
  486. package/packs/js-ts/rules/js-repeats-become-templates.md +26 -0
  487. package/packs/js-ts/rules/json-only-through-one-helper.md +62 -0
  488. package/packs/js-ts/rules/named-constants-not-magic-numbers.md +34 -0
  489. package/packs/js-ts/rules/no-any.md +34 -0
  490. package/packs/js-ts/rules/no-console.md +30 -0
  491. package/packs/js-ts/rules/no-floating-promises.md +31 -0
  492. package/packs/js-ts/rules/no-param-mutation.md +28 -0
  493. package/packs/js-ts/rules/no-unsafe-assertions.md +30 -0
  494. package/packs/js-ts/rules/one-logger.md +24 -0
  495. package/packs/js-ts/rules/outbound-calls-have-a-limit.md +20 -0
  496. package/packs/js-ts/rules/parallel-independent-awaits.md +29 -0
  497. package/packs/js-ts/rules/process-lifecycle.md +47 -0
  498. package/packs/js-ts/rules/schema-single-source-of-truth.md +36 -0
  499. package/packs/js-ts/rules/secrets-stay-secret.md +22 -0
  500. package/packs/js-ts/rules/small-functions.md +20 -0
  501. package/packs/js-ts/rules/test-names-describe-behavior.md +28 -0
  502. package/packs/js-ts/rules/tests-can-fail.md +19 -0
  503. package/packs/js-ts/rules/tsconfig-strict.md +32 -0
  504. package/packs/js-ts/rules/typed-exports.md +27 -0
  505. package/packs/js-ts/rules/types-once-at-the-edge.md +18 -0
  506. package/packs/js-ts/rules/unions-over-enums.md +29 -0
  507. package/packs/js-ts/rules/zod-at-route-boundaries.md +40 -0
  508. package/packs/midi/checks/active-sensing-no-pulse.json +24 -0
  509. package/packs/midi/checks/clock-not-at-sample-zero.json +23 -0
  510. package/packs/midi/checks/midi-realtime-first.json +27 -0
  511. package/packs/midi/checks/no-tempo-writeback.json +23 -0
  512. package/packs/midi/checks/position-not-integrated.json +25 -0
  513. package/packs/midi/checks/stub-playhead-advances.json +27 -0
  514. package/packs/midi/checks/sysex-length-literal.json +23 -0
  515. package/packs/midi/checks/sysex-not-on-audio.json +24 -0
  516. package/packs/midi/checks/sysex-survives-realtime.json +27 -0
  517. package/packs/midi/pack.json +22 -0
  518. package/packs/midi/rules/clock-is-a-pulse-stream.md +30 -0
  519. package/packs/midi/rules/imports-count-every-loss.md +25 -0
  520. package/packs/midi/rules/measure-the-clock-in-audio.md +30 -0
  521. package/packs/midi/rules/sync-is-a-mode.md +29 -0
  522. package/packs/midi/rules/sysex-is-a-record.md +29 -0
  523. package/packs/midi/skills/clock-probe/SKILL.md +23 -0
  524. package/packs/midi/skills/clock-probe/clock-law.md +417 -0
  525. package/packs/midi/skills/does-it-sync/SKILL.md +19 -0
  526. package/packs/mongo/checks/bulk-over-many.json +28 -0
  527. package/packs/mongo/checks/created-at-immutable.json +25 -0
  528. package/packs/mongo/checks/driver-outside-gateway.json +24 -0
  529. package/packs/mongo/checks/key-lookup-is-hashed.json +24 -0
  530. package/packs/mongo/checks/mongoclient-cached-and-named.json +34 -0
  531. package/packs/mongo/checks/mongoclient-outside-gateway.json +24 -0
  532. package/packs/mongo/checks/no-count-plus-one-ids.json +25 -0
  533. package/packs/mongo/checks/no-db-write-in-loop.json +25 -0
  534. package/packs/mongo/checks/no-drop-in-code.json +27 -0
  535. package/packs/mongo/checks/no-empty-deletemany.json +26 -0
  536. package/packs/mongo/checks/no-find-reads.json +26 -0
  537. package/packs/mongo/checks/no-input-spread-into-write.json +24 -0
  538. package/packs/mongo/checks/no-mongoose.json +23 -0
  539. package/packs/mongo/checks/no-negation-delete.json +26 -0
  540. package/packs/mongo/checks/no-non-null-after-findone.json +25 -0
  541. package/packs/mongo/checks/objectid-equals.json +26 -0
  542. package/packs/mongo/checks/update-then-reread.json +24 -0
  543. package/packs/mongo/checks/watch-not-poll.json +25 -0
  544. package/packs/mongo/pack.json +52 -0
  545. package/packs/mongo/rules/deletes-name-what-dies.md +21 -0
  546. package/packs/mongo/rules/driver-only-in-gateway.md +26 -0
  547. package/packs/mongo/rules/keys-hashed-input-picked.md +21 -0
  548. package/packs/mongo/rules/one-client-one-pool.md +32 -0
  549. package/packs/mongo/rules/reads-aggregate-writes-bulk.md +25 -0
  550. package/packs/mongo/rules/writes-are-atomic.md +27 -0
  551. package/packs/multi-tenant/checks/role-sees-all-tenants.json +26 -0
  552. package/packs/multi-tenant/checks/tenant-filter-from-url.json +25 -0
  553. package/packs/multi-tenant/pack.json +22 -0
  554. package/packs/multi-tenant/rules/no-role-crosses-a-tenant.md +21 -0
  555. package/packs/multi-tenant/skills/prove-tenant-isolation/SKILL.md +19 -0
  556. package/packs/nginx/checks/modsec-no-blanket-off.json +16 -0
  557. package/packs/nginx/checks/nginx-csp-no-unsafe.json +15 -0
  558. package/packs/nginx/checks/nginx-headers-always.json +15 -0
  559. package/packs/nginx/checks/nginx-keepalive-http11.json +20 -0
  560. package/packs/nginx/checks/nginx-logs-to-stdout.json +15 -0
  561. package/packs/nginx/checks/nginx-no-crlf.json +17 -0
  562. package/packs/nginx/checks/nginx-resolver-ttl.json +19 -0
  563. package/packs/nginx/pack.json +43 -0
  564. package/packs/nginx/rules/modsecurity-tuning.md +22 -0
  565. package/packs/nginx/rules/nginx-production.md +26 -0
  566. package/packs/nginx/skills/waf-rollout/SKILL.md +20 -0
  567. package/packs/python/checks/py-no-bare-except.json +18 -0
  568. package/packs/python/checks/py-no-eval.json +18 -0
  569. package/packs/python/checks/py-no-mutable-default.json +18 -0
  570. package/packs/python/checks/py-no-shell-true.json +18 -0
  571. package/packs/python/checks/py-no-star-import.json +18 -0
  572. package/packs/python/checks/py-no-swallowed-exception.json +18 -0
  573. package/packs/python/checks/py-none-by-is.json +18 -0
  574. package/packs/python/checks/py-open-with-with.json +18 -0
  575. package/packs/python/checks/py-requests-timeout.json +18 -0
  576. package/packs/python/checks/py-subprocess-output-checked.json +18 -0
  577. package/packs/python/checks/py-yaml-safe-load.json +18 -0
  578. package/packs/python/pack.json +26 -0
  579. package/packs/python/rules/python-errors-and-resources.md +26 -0
  580. package/packs/python/rules/python-repeats-become-templates.md +27 -0
  581. package/packs/python/skills/python-extract-template/SKILL.md +35 -0
  582. package/packs/react/checks/dialog-needs-role.json +28 -0
  583. package/packs/react/checks/effect-not-for-derived-state.json +24 -0
  584. package/packs/react/checks/icon-button-needs-name.json +24 -0
  585. package/packs/react/checks/label-needs-a-field.json +24 -0
  586. package/packs/react/checks/ui-failed-fetch-says-so.json +23 -0
  587. package/packs/react/checks/ui-ok-branch-has-an-else.json +23 -0
  588. package/packs/react/pack.json +20 -0
  589. package/packs/react/rules/react-accessible-controls.md +20 -0
  590. package/packs/react/rules/react-state-and-effects.md +23 -0
  591. package/packs/reverse-engineering/checks/ear-constant-tagged.json +23 -0
  592. package/packs/reverse-engineering/checks/no-default-on-distrust.json +24 -0
  593. package/packs/reverse-engineering/checks/no-rom-table-literal.json +29 -0
  594. package/packs/reverse-engineering/checks/prose-never-decides.json +22 -0
  595. package/packs/reverse-engineering/hooks/firmware-out-of-git.mjs +49 -0
  596. package/packs/reverse-engineering/pack.json +35 -0
  597. package/packs/reverse-engineering/rules/a-negative-names-what-was-scanned.md +19 -0
  598. package/packs/reverse-engineering/rules/account-every-term.md +20 -0
  599. package/packs/reverse-engineering/rules/addresses-name-their-space.md +21 -0
  600. package/packs/reverse-engineering/rules/every-law-has-a-source.md +18 -0
  601. package/packs/reverse-engineering/rules/findings-are-withdrawn-in-place.md +17 -0
  602. package/packs/reverse-engineering/rules/firmware-stays-out.md +18 -0
  603. package/packs/reverse-engineering/rules/names-before-code.md +19 -0
  604. package/packs/reverse-engineering/rules/reproduction-or-original.md +18 -0
  605. package/packs/reverse-engineering/rules/two-sources-before-naming.md +21 -0
  606. package/packs/reverse-engineering/skills/bank-census/SKILL.md +18 -0
  607. package/packs/reverse-engineering/skills/gather-sources/SKILL.md +21 -0
  608. package/packs/reverse-engineering/skills/menu-map/SKILL.md +28 -0
  609. package/packs/reverse-engineering/skills/names-first/SKILL.md +41 -0
  610. package/packs/reverse-engineering/skills/re-deliverables/SKILL.md +21 -0
  611. package/packs/reverse-engineering/skills/tripwire-the-law/SKILL.md +19 -0
  612. package/packs/reverse-engineering/tools/lib/unwrap.mjs +115 -0
  613. package/packs/reverse-engineering/tools/names-sweep.mjs +264 -0
  614. package/packs/shell/checks/sh-mktemp.json +18 -0
  615. package/packs/shell/checks/sh-no-backticks.json +18 -0
  616. package/packs/shell/checks/sh-no-eval.json +18 -0
  617. package/packs/shell/checks/sh-no-parse-ls.json +18 -0
  618. package/packs/shell/checks/sh-no-pipe-to-shell.json +18 -0
  619. package/packs/shell/checks/sh-no-program-in-heredoc.json +18 -0
  620. package/packs/shell/checks/sh-quote-arguments.json +18 -0
  621. package/packs/shell/checks/sh-rm-guarded.json +18 -0
  622. package/packs/shell/checks/sh-strict-mode.json +20 -0
  623. package/packs/shell/pack.json +28 -0
  624. package/packs/shell/rules/shell-repeats-become-templates.md +23 -0
  625. package/packs/shell/rules/shell-strict-and-quoted.md +27 -0
  626. package/packs/shell/skills/shell-extract-template/SKILL.md +32 -0
  627. package/packs/shell-hooks/checks/gnu-only-in-shell.json +18 -0
  628. package/packs/shell-hooks/checks/hook-command-anchored.json +12 -0
  629. package/packs/shell-hooks/checks/hook-json-by-tool.json +18 -0
  630. package/packs/shell-hooks/checks/no-bash-c-with-variable.json +20 -0
  631. package/packs/shell-hooks/pack.json +36 -0
  632. package/packs/shell-hooks/rules/hooks-portable-anchored-quoted.md +26 -0
  633. package/packs/sound-design/checks/audio-seed-fixed.json +23 -0
  634. package/packs/sound-design/checks/mix-is-a-crossfade.json +30 -0
  635. package/packs/sound-design/checks/no-hash-in-the-signal.json +30 -0
  636. package/packs/sound-design/checks/no-literal-key-anchor.json +30 -0
  637. package/packs/sound-design/checks/test-compares-a-function-with-itself.json +22 -0
  638. package/packs/sound-design/pack.json +22 -0
  639. package/packs/sound-design/rules/algorithms-are-data.md +26 -0
  640. package/packs/sound-design/rules/meter-before-engine.md +27 -0
  641. package/packs/sound-design/rules/neutral-is-exact.md +26 -0
  642. package/packs/sound-design/rules/test-off-the-easy-point.md +28 -0
  643. package/packs/sound-design/rules/unreachable-is-said.md +25 -0
  644. package/packs/sound-design/rules/waveforms-and-octaves.md +24 -0
  645. package/packs/sound-design/skills/choose-observable/SKILL.md +18 -0
  646. package/packs/sound-design/skills/measure-a-law/SKILL.md +18 -0
  647. package/packs/sound-design/skills/measure-reverb/SKILL.md +19 -0
  648. package/packs/sound-design/skills/spread-probe/SKILL.md +18 -0
  649. package/packs/stellix/checks/no-keyboard-focus.json +12 -0
  650. package/packs/stellix/checks/one-seeded-random.json +16 -0
  651. package/packs/stellix/checks/world-never-includes-painter.json +12 -0
  652. package/packs/stellix/checks/world-no-libm.json +15 -0
  653. package/packs/stellix/checks/world-no-unordered.json +10 -0
  654. package/packs/stellix/hooks/no-shipped-images.mjs +88 -0
  655. package/packs/stellix/pack.json +61 -0
  656. package/packs/stellix/rules/stellix-deterministic-world.md +29 -0
  657. package/packs/stellix/rules/stellix-reset-generated.md +24 -0
  658. package/packs/stellix/rules/stellix-world-snapshot.md +27 -0
  659. package/packs/stellix/rules/world-continuous-collision.md +26 -0
  660. package/packs/stellix/rules/world-fp-determinism.md +28 -0
  661. package/packs/stored-text/checks/no-raw-html-from-data.json +31 -0
  662. package/packs/stored-text/checks/stored-text-libs-only-in-renderer.json +31 -0
  663. package/packs/stored-text/checks/stored-text-renderer-complete.json +24 -0
  664. package/packs/stored-text/checks/stored-text-through-renderer.json +25 -0
  665. package/packs/stored-text/pack.json +41 -0
  666. package/packs/stored-text/rules/stored-text-renders-once.md +26 -0
  667. package/packs/stored-text/skills/render-stored-text/SKILL.md +24 -0
  668. package/packs/synth-creator/checks/timing-from-synthcore.json +24 -0
  669. package/packs/synth-creator/checks/ui-drawn-in-code.json +23 -0
  670. package/packs/synth-creator/hooks/build-guard.mjs +232 -0
  671. package/packs/synth-creator/hooks/build-sweep.mjs +166 -0
  672. package/packs/synth-creator/hooks/frozen-files.mjs +63 -0
  673. package/packs/synth-creator/hooks/idle-wake.mjs +90 -0
  674. package/packs/synth-creator/hooks/protect-vendor.mjs +174 -0
  675. package/packs/synth-creator/hooks/spec-lock.mjs +117 -0
  676. package/packs/synth-creator/hooks/stage-guard.mjs +50 -0
  677. package/packs/synth-creator/hooks/time-guard.mjs +292 -0
  678. package/packs/synth-creator/hooks/user-asks.mjs +165 -0
  679. package/packs/synth-creator/pack.json +136 -0
  680. package/packs/synth-creator/rules/copy-trees-read-only.md +25 -0
  681. package/packs/synth-creator/rules/debug-by-measurement.md +20 -0
  682. package/packs/synth-creator/rules/done-means-fresh-evidence.md +18 -0
  683. package/packs/synth-creator/rules/hooks-and-gates.md +21 -0
  684. package/packs/synth-creator/rules/long-work-in-the-background.md +16 -0
  685. package/packs/synth-creator/rules/timing-from-synthcore.md +16 -0
  686. package/packs/synth-creator/skills/build-step/SKILL.md +125 -0
  687. package/packs/synth-creator/skills/build-through-the-queue/SKILL.md +19 -0
  688. package/packs/synth-creator/tools/freeze.mjs +36 -0
  689. package/packs/tui/checks/tui-entry-restores-terminal.json +27 -0
  690. package/packs/tui/checks/tui-gates-on-tty.json +25 -0
  691. package/packs/tui/checks/tui-no-ris-reset.json +22 -0
  692. package/packs/tui/checks/tui-resize-listener-removed.json +26 -0
  693. package/packs/tui/checks/tui-width-is-state.json +33 -0
  694. package/packs/tui/pack.json +44 -0
  695. package/packs/tui/rules/tui-resize-and-screen.md +25 -0
  696. package/packs/tui/skills/build-tui/SKILL.md +21 -0
  697. package/packs/ui-craft/checks/ui-input-needs-autocomplete.json +23 -0
  698. package/packs/ui-craft/checks/ui-intl-for-dates.json +21 -0
  699. package/packs/ui-craft/checks/ui-no-ai-palette.json +22 -0
  700. package/packs/ui-craft/checks/ui-no-animate-layout.json +22 -0
  701. package/packs/ui-craft/checks/ui-no-assistant-palette.json +23 -0
  702. package/packs/ui-craft/checks/ui-no-bounce-easing.json +22 -0
  703. package/packs/ui-craft/checks/ui-no-custom-cursor.json +22 -0
  704. package/packs/ui-craft/checks/ui-no-emoji-as-ui.json +22 -0
  705. package/packs/ui-craft/checks/ui-no-empty-image.json +21 -0
  706. package/packs/ui-craft/checks/ui-no-eyebrow.json +21 -0
  707. package/packs/ui-craft/checks/ui-no-furniture-text.json +22 -0
  708. package/packs/ui-craft/checks/ui-no-gradient-text.json +22 -0
  709. package/packs/ui-craft/checks/ui-no-index-numbering.json +21 -0
  710. package/packs/ui-craft/checks/ui-no-lorem.json +22 -0
  711. package/packs/ui-craft/checks/ui-no-marketing-buzzword.json +22 -0
  712. package/packs/ui-craft/checks/ui-no-paste-block.json +21 -0
  713. package/packs/ui-craft/checks/ui-no-placeholder-names.json +21 -0
  714. package/packs/ui-craft/checks/ui-no-scroll-hijack.json +21 -0
  715. package/packs/ui-craft/checks/ui-no-side-tab.json +21 -0
  716. package/packs/ui-craft/checks/ui-no-stock-labels.json +22 -0
  717. package/packs/ui-craft/checks/ui-no-transition-all.json +22 -0
  718. package/packs/ui-craft/checks/ui-no-uppercase-table-header.json +21 -0
  719. package/packs/ui-craft/checks/ui-no-zebra-rows.json +22 -0
  720. package/packs/ui-craft/checks/ui-no-zoom-lock.json +21 -0
  721. package/packs/ui-craft/pack.json +43 -0
  722. package/packs/ui-craft/rules/apps-are-not-pages.md +26 -0
  723. package/packs/ui-craft/rules/data-tells-the-truth.md +26 -0
  724. package/packs/ui-craft/rules/dates-and-numbers.md +18 -0
  725. package/packs/ui-craft/rules/forms-never-fight.md +22 -0
  726. package/packs/ui-craft/rules/interface-copy.md +26 -0
  727. package/packs/ui-craft/rules/motion-is-rare.md +31 -0
  728. package/packs/ui-craft/rules/no-generated-look.md +37 -0
  729. package/packs/ui-craft/rules/page-holds-its-frame.md +28 -0
  730. package/packs/ui-craft/rules/page-proved-rendered.md +19 -0
  731. package/packs/ui-craft/rules/pictures-do-a-job.md +25 -0
  732. package/packs/ui-craft/rules/pointer-feedback.md +28 -0
  733. package/packs/ui-craft/rules/screen-answers-one-question.md +24 -0
  734. package/packs/ui-craft/rules/survives-real-data.md +23 -0
  735. package/packs/ui-craft/rules/touch-and-small-screens.md +19 -0
  736. package/packs/ui-craft/rules/type-space-colour.md +26 -0
  737. package/packs/ui-craft/rules/url-holds-the-state.md +19 -0
  738. package/packs/ui-craft/skills/app-screen/SKILL.md +33 -0
  739. package/packs/ui-craft/skills/build-from-reference/SKILL.md +28 -0
  740. package/packs/ui-craft/skills/chart-choice/SKILL.md +34 -0
  741. package/packs/ui-craft/skills/hover-state/SKILL.md +28 -0
  742. package/packs/ui-craft/skills/page-critique/SKILL.md +33 -0
  743. package/packs/ui-craft/skills/prove-page/SKILL.md +23 -0
  744. package/packs/ui-craft/skills/redesign-page/SKILL.md +19 -0
  745. package/packs/ui-craft/skills/ui-code-review/SKILL.md +22 -0
  746. package/packs/ui-craft/skills/write-the-page/SKILL.md +21 -0
  747. package/packs/ui-craft/tools/page-measure.mjs +41 -0
  748. package/packs/web/checks/a11y-img-needs-alt.json +26 -0
  749. package/packs/web/checks/a11y-no-bare-outline-none.json +21 -0
  750. package/packs/web/checks/a11y-no-clickable-div.json +26 -0
  751. package/packs/web/checks/a11y-no-positive-tabindex.json +26 -0
  752. package/packs/web/checks/client-no-api-key.json +29 -0
  753. package/packs/web/checks/client-no-browser-global-at-module-scope.json +28 -0
  754. package/packs/web/checks/client-no-server-import.json +31 -0
  755. package/packs/web/checks/client-no-window-location-nav.json +28 -0
  756. package/packs/web/checks/css-no-inline-style.json +30 -0
  757. package/packs/web/checks/ds-pages-compose-primitives.json +28 -0
  758. package/packs/web/checks/key-from-index.json +23 -0
  759. package/packs/web/checks/prodbuild-no-cdn-runtime-deps.json +21 -0
  760. package/packs/web/checks/prodbuild-no-dev-flags.json +21 -0
  761. package/packs/web/checks/prodbuild-no-remote-fonts.json +22 -0
  762. package/packs/web/checks/rcss-button-cursor.json +30 -0
  763. package/packs/web/checks/rcss-no-100vw.json +21 -0
  764. package/packs/web/checks/rcss-no-fixed-wide-width.json +21 -0
  765. package/packs/web/checks/rcss-viewport-meta.json +28 -0
  766. package/packs/web/checks/secret-not-in-web-storage.json +25 -0
  767. package/packs/web/checks/tw-no-raw-hex-in-markup.json +34 -0
  768. package/packs/web/checks/wp-hero-not-lazy.json +27 -0
  769. package/packs/web/checks/wp-img-needs-dimensions.json +26 -0
  770. package/packs/web/pack.json +73 -0
  771. package/packs/web/rules/accessibility.md +26 -0
  772. package/packs/web/rules/client-boundaries.md +23 -0
  773. package/packs/web/rules/production-build.md +22 -0
  774. package/packs/web/rules/secrets-not-in-the-browser.md +18 -0
  775. package/packs/web/rules/styles-live-in-stylesheets.md +23 -0
  776. package/packs/web/rules/tailwind-v4.md +23 -0
  777. package/packs/web/rules/ui-primitives-one-module.md +30 -0
  778. package/packs/web/rules/web-performance.md +21 -0
  779. package/packs/web/skills/design-direction/SKILL.md +30 -0
  780. package/packs/web/skills/design-review/SKILL.md +28 -0
  781. package/packs/web/skills/pick-rendering-mode/SKILL.md +21 -0
  782. package/packs/web/skills/preflight-build/SKILL.md +23 -0
  783. package/packs/web/skills/seo-audit/SKILL.md +22 -0
  784. package/packs/websocket/checks/no-token-in-query.json +26 -0
  785. package/packs/websocket/checks/stale-socket-deletes-new-entry.json +25 -0
  786. package/packs/websocket/checks/ws-identity-from-message.json +26 -0
  787. package/packs/websocket/pack.json +21 -0
  788. package/packs/websocket/rules/identity-comes-from-the-connection.md +24 -0
  789. package/packs/writing/checks/ascii-no-em-dash.json +17 -0
  790. package/packs/writing/checks/no-copula-dodging.json +18 -0
  791. package/packs/writing/checks/no-dramatic-colon.json +18 -0
  792. package/packs/writing/checks/no-not-x-but-y.json +18 -0
  793. package/packs/writing/checks/no-participial-opener.json +18 -0
  794. package/packs/writing/checks/no-pseudo-wisdom.json +18 -0
  795. package/packs/writing/checks/no-slop-words.json +18 -0
  796. package/packs/writing/checks/no-stock-connectors.json +18 -0
  797. package/packs/writing/checks/no-time-or-date.json +27 -0
  798. package/packs/writing/checks/no-trailing-ing.json +18 -0
  799. package/packs/writing/checks/no-vague-attribution.json +18 -0
  800. package/packs/writing/pack.json +43 -0
  801. package/packs/writing/rules/ascii-no-em-dash.md +21 -0
  802. package/packs/writing/rules/cut-the-padding.md +20 -0
  803. package/packs/writing/rules/direct-voice.md +22 -0
  804. package/packs/writing/rules/no-cargo-cult.md +16 -0
  805. package/packs/writing/rules/no-scaffolding.md +19 -0
  806. package/packs/writing/rules/no-stock-language.md +27 -0
  807. package/packs/writing/rules/no-time-or-date.md +18 -0
  808. package/packs/writing/rules/rhythm-like-talk.md +20 -0
  809. package/packs/writing/rules/write-from-your-own-corner.md +20 -0
  810. package/packs/writing/skills/argument-post/SKILL.md +28 -0
  811. package/packs/writing/skills/humanize/SKILL.md +28 -0
  812. package/packs/writing/skills/launch-post/SKILL.md +38 -0
  813. package/packs/writing/skills/pick-subreddit/SKILL.md +69 -0
  814. package/packs/writing/skills/post-voice/SKILL.md +22 -0
  815. package/packs/writing/skills/reddit-post/SKILL.md +63 -0
  816. package/packs/writing/skills/reddit-title/SKILL.md +23 -0
  817. package/packs/writing/skills/reply-moves/SKILL.md +40 -0
  818. package/packs/writing/skills/reply-stance/SKILL.md +23 -0
  819. package/packs/writing/skills/should-i-reply/SKILL.md +21 -0
  820. package/packs/zod/hooks/schemas-only.mjs +53 -0
  821. package/packs/zod/pack.json +44 -0
  822. package/packs/zod/rules/env-shapes-only.md +14 -0
  823. package/packs/zod/rules/zod-4-schemas.md +14 -0
  824. package/profiles/stellix.layout.json +315 -0
  825. package/profiles/sub37.layout.json +247 -0
  826. package/prompts/scan-review.md +40 -0
  827. package/prompts/survey.md +82 -0
@@ -0,0 +1,54 @@
1
+ ---
2
+ # concepts: cpp, tests, notes, plan
3
+ paths:
4
+ - "placeholder"
5
+ ---
6
+
7
+ # Identical containers by index, different things by ID; never a literal of either in logic
8
+
9
+ Learned on Stellix (2026-10-31, B-175, B-177, B-178, B-200): its four slots are identical containers, yet one slot had its own
10
+ effects chain, its own effect moons, the only multi-core rendering, the only push laws, the only ARP controls in the press map and its own
11
+ set of effect parameters, because the first build played that slot and every later step, test and agent brief named it. The checks were
12
+ scoped to the engine folders, so the world and space code left two slots without their effects (B-200). The owner: "slots are index based.
13
+ it shouldnt matter if you swap one."
14
+
15
+ <constraints>
16
+ Always do:
17
+ - Read the scope from `design/shape.json`, never from a folder list. A concept the manifest calls `many` is judged in every source,
18
+ test, doc, brief and recipe, wherever it is named; a container type with no row there gets its row first (one or many, its
19
+ generator, its selectors, its declared constants, what each instance `owns`, its `symmetry` commands).
20
+ - Treat identical containers (slots, oscillators, layers, lanes, bands, workers) as instances of one type: one code path serves every
21
+ instance, addressed only by an index variable named for its type (`slot`, `osc`, `layer`, `lane`, `band`, `worker`, or with `Ix`,
22
+ `Index`). Counts are named constants (`kSlots`), never a bare 4.
23
+ - Address different things by IDs that never change. Frozen parameter IDs never change (parameter-ids-never-change). An instance's ID
24
+ is made from its index by the manifest's generator, `slotId(i, "reverb.mix")`, and must produce exactly today's frozen string; a field
25
+ one instance lacks is appended at the end of the record, never inserted. A test checks that the generated IDs equal the frozen lock,
26
+ for every instance.
27
+ - Give every instance's record the same fields: the same parameters, the same press-map rows, the same effects, the same moons.
28
+ - A literal instance is one of three, never bare: an example (on a `seen in:` or `example:` line), a selection rule (a selector listed
29
+ in the manifest), or a declared constant (a named row in the manifest, read by name).
30
+ - Prove a change to a container on every instance with the generated gate `shape_symmetry` (the `prove-instances-identical` skill):
31
+ every instance has the same members, and every pair swaps the same.
32
+ - Write tests, probes, planted faults and agent briefs with the instance as a parameter. Behaviour is tested once on the template (`test-the-template-once`); `shape_symmetry` is the cheap proof the rest are that template, so a behaviour test never loops over every instance of hundreds.
33
+
34
+ Never do:
35
+ - Scope a check, a gate or a review to folders ("the engine"): a many concept is many everywhere.
36
+ - Write an instance index or an instance ID as a literal in logic: `slot == 1`, `slotIx != 1`, `osc == 0`, `layers[3]`, `"slot2."`,
37
+ `"osc1_"`, `{ a[0], a[1], 0, 0 }`. Literals belong only in the data tables, generated tables and the parameter record.
38
+ - Give one instance a path, a chain, a buffer, a table row or a field the others lack.
39
+ - Treat one instance as the good one in a planted fault (`plantX && slot != 1`), or name a fixed instance in a brief.
40
+ </constraints>
41
+
42
+ ## Check
43
+ - `design/shape.json` says which concepts are MANY (their count, generator, selectors and declared constants); every check reads it.
44
+ - The `shape-law` hook (0.9.0, KWB-1) refuses, at write time, in every folder (only the manifest's `exclude` left out), an instance
45
+ index compared with or an instance array indexed by a number, an instance ID written out (`"slot2."`), a hand-listed set, a role
46
+ name for an instance, a test that drives one instance, an unlisted selector and an instance type with no manifest row. It replaces
47
+ the engine-scoped `no-instance-index-literal` and `no-instance-id-literal` checks, which let the world and the space code through.
48
+ `buffer[1]`, `channel == 1` and `pos[0]` are not instances and never fire.
49
+ - The `brief-guard` hook refuses a brief, spec or recipe that names an instance outside a `seen in:` or `example:` line.
50
+ - `npx --no-install @thedecipherist/claude-packs shape scan` lists every instance literal already in the repo.
51
+ - `shape_symmetry` (generated at configure time by `npx --no-install @thedecipherist/claude-packs symmetry gen`, run by `.claude/tools/shape-symmetry.mjs`): for each many
52
+ concept, the members of every instance are the same set, and every one of the N·(N-1)/2 pairs swaps the same. Its selftest plants a
53
+ missing member and a swap difference.
54
+ - The project's own tests: the generated IDs equal the frozen lock for every instance.
@@ -0,0 +1,49 @@
1
+ ---
2
+ # concepts: cpp, js
3
+ paths:
4
+ - "placeholder"
5
+ ---
6
+
7
+ # Three branches on the same value: a lookup, not an if/else chain
8
+
9
+ <constraints>
10
+ Always do:
11
+ - When code branches **3 or more times on the same value** (one variable, one member, one enum or string), replace the chain with a lookup:
12
+ - **JS/TS:** an object or `Map` from key to value or function, typed `satisfies Record<Union, T>` so a missing case is a compile error, defined at module scope. Handle the missing key explicitly (`?? fallback` or throw). Use `Object.hasOwn` or a `Map` when the key comes from input.
13
+ - **C++:** an object per kind (an interface and a factory, or `std::variant` + `std::visit`), or a `constexpr std::array` indexed by the enum for pure data (labels, ranges, coefficients). See `behaviour-lives-with-its-kind`.
14
+ - **Inside a hot inner loop only** (an audio callback, a per-pixel loop): one exhaustive `switch` on an `enum class` (no `default:`, so `-Wswitch` under `-Werror` catches a missing case), inside the kind's owner and nowhere else. Never `std::map`, `std::unordered_map` or `std::function` tables there (audio-core: `audio-thread-realtime-safe`).
15
+
16
+ Never do:
17
+ - Write `if (x == A) … else if (x == B) … else if (x == C) …` on one value, or the same as a ternary chain.
18
+ - Rebuild the lookup table inside the function on every call.
19
+
20
+ `if` is still right for:
21
+ - ranges and comparisons (`score > 90`);
22
+ - conditions on several variables (`isAdmin && plan == Pro`);
23
+ - first-match-wins across different tests;
24
+ - two branches or fewer;
25
+ - guard clauses.
26
+ </constraints>
27
+
28
+ ```cpp
29
+ // NO
30
+ if (mode == Mode::line) return drawLine (ctx);
31
+ else if (mode == Mode::fill) return drawFill (ctx);
32
+ else if (mode == Mode::text) return drawText (ctx);
33
+
34
+ // YES in a hot inner loop only: exhaustive, inlinable, inside the kind's owner (elsewhere: an object per kind)
35
+ switch (mode) {
36
+ case Mode::line: return drawLine (ctx);
37
+ case Mode::fill: return drawFill (ctx);
38
+ case Mode::text: return drawText (ctx);
39
+ }
40
+ ```
41
+
42
+ ```ts
43
+ // YES
44
+ const builders = { create: buildCreate, update: buildUpdate, delete: buildDelete } satisfies Record<Action, Builder>;
45
+ return (builders[action] ?? buildDefault)(p);
46
+ ```
47
+
48
+ ## Check
49
+ `.claude/checks/lookup-over-if-chains.json` refuses an edit that **adds** three `==`/`===` branches on the same value, and `lookup-over-ternary-chains` three `?` in one chain. Existing chains are only judged when an edit touches them. If a chain ever slips through in a new shape, tighten the check rather than fixing the one case.
@@ -0,0 +1,14 @@
1
+ ---
2
+ # hook: making-check.mjs
3
+ ---
4
+ # Write the making line before the first write
5
+
6
+ <constraints>
7
+ Always do:
8
+ - Before the first write of a step, put its entry under `## In progress` in `build.md`, with the branch name and one line: `making: <what>; concepts: <each, with its shape>; reuse: <function, where it lives>`.
9
+ - Have `design/shape.json` first. A new concept gets its row before the code; a project with none declares `{"concepts": {}}`.
10
+ - Update the line when the step changes. A new step gets its own line.
11
+
12
+ Never do:
13
+ - Leave the line for the end of the turn: `making-check` sends the turn back at Stop, and each send-back costs a whole turn.
14
+ </constraints>
@@ -0,0 +1,17 @@
1
+ ---
2
+ # concepts: notes
3
+ paths:
4
+ - "placeholder"
5
+ ---
6
+
7
+ # Every open item says whether someone decided it
8
+
9
+ <constraints>
10
+ Always do:
11
+ - Tag every open bug, known issue or leftover with `[deferred]` (someone decided not to do it now: say who and why in one line) or `[gap]` (found and real, nobody has decided anything yet).
12
+ - When closing an item, write where it was fixed (`file:line` or commit) and the test that now guards it.
13
+
14
+ Never do:
15
+ - Leave an untagged open item. Untagged reads as `[gap]`.
16
+ - Delete an open item to make a list look clean. Close it with its fix, or keep it.
17
+ </constraints>
@@ -0,0 +1,22 @@
1
+ ---
2
+ # concepts: plan, notes
3
+ paths:
4
+ - "placeholder"
5
+ ---
6
+
7
+ # The plan and the logs: true, dated, never rewritten
8
+
9
+ <constraints>
10
+ Always do:
11
+ - Tick a step in `build.md` only when its "done when" was measured, or seen in the opened app. Every step's start and finish time goes in the log (the project's step tool writes them).
12
+ - Strike a step that is dropped through, with the reason and the date. A reopened step keeps its line, marked REOPENED.
13
+ - Log a bug in `bugs.md` the moment it is found, before it is fixed. A fixed bug moves to Fixed with its cause, the fix, the date and the gate that now catches it.
14
+ - Record in `docs/laws.md` every house law the project leaves, with the user's yes. Put a row in `docs/licences.md` before any file is copied in, with its source, commit and licence.
15
+ - Send a question the spec leaves open to the user as a `d-n`, with the spec's recommendation. Never decide it by guessing.
16
+ - Write internal docs plainly. The `humanize` skill is for public writing only, not for specs, logs or briefs.
17
+
18
+ Never do:
19
+ - Edit the spec (`docs/*-spec.md`). It is the user's.
20
+ - Delete a step, a bug or a log line to make a list look clean.
21
+ - Tick from memory of an earlier session. Measure again.
22
+ </constraints>
@@ -0,0 +1,19 @@
1
+ ---
2
+ # concepts: notes, docs-folder
3
+ paths:
4
+ - "placeholder"
5
+ ---
6
+
7
+ # Point at documents by anchor, never by line number
8
+
9
+ One added line in Stellix's spec moved 189 references in its seed.
10
+
11
+ <constraints>
12
+ Always do:
13
+ - Cite a rule or decision in a document by a fixed anchor (`{#strike-law}`, `{#d-61}`), and code by symbol name.
14
+ - Give every rule and decision that anything cites its own anchor, and keep it through every edition.
15
+ - Gate it: every reference resolves to an existing anchor, and a new edition that drops a cited anchor is refused.
16
+
17
+ Never do:
18
+ - Write `spec.md:412` or "line 412" into data, checks, docs or build.md.
19
+ - Rename or drop an anchor something still cites.
@@ -0,0 +1,18 @@
1
+ ---
2
+ # loads: at launch.
3
+ ---
4
+
5
+ # Every refusal is judged: right or wrong, with why
6
+
7
+ A project cannot tell which hooks earn their place from what people complained about. Bug logs recorded a handful of one hook's false refusals; it had refused 89 times.
8
+
9
+ <constraints>
10
+ Always do:
11
+ - Mark a refusal you met, once you know: `npx --no-install @thedecipherist/claude-packs logs mark <id> right|wrong "<why>"`. `logs refusals --open` lists them.
12
+ - Mark it wrong when correct work was refused, and report the hook.
13
+ - Read `logs` before changing or retiring a hook.
14
+
15
+ Never do:
16
+ - Delete or edit a log. Logs rotate, and `.claude/logs/` keeps them all.
17
+ - Mark a refusal right or wrong without reading what it refused.
18
+ </constraints>
@@ -0,0 +1,15 @@
1
+ ---
2
+ # hook: once-only.mjs
3
+ ---
4
+ # Look for the code before writing it
5
+
6
+ <constraints>
7
+ Always do:
8
+ - Before writing a helper, a test header or a hook's main loop, look for the shared one and call it: the project's test helper module, the hooks' `lib/`.
9
+ - When two places need the same code, extract one function, parameterized over what differs, and call it from both.
10
+ - To move code, take the old copy out first, as its own step, then write the new one. `once-only` judges a command before it runs, so an `rm` in the same command does not count.
11
+
12
+ Never do:
13
+ - Change names or reorder lines so a copy passes. A copy with one line changed is still a copy.
14
+ - Leave a staging copy of incoming code in the repo while adopting it: every adopted file reads as a duplicate of it.
15
+ </constraints>
@@ -0,0 +1,16 @@
1
+ ---
2
+ # hook: secrets-guard.mjs
3
+ ---
4
+ # A secret never lands in git: it lives in an ignored .env and is read by name
5
+
6
+ <constraints>
7
+ Always do:
8
+ - Keep every secret (a token, a key, a password, a connection string with its password) in an ignored `.env` or the machine's own store, and read it at run time by name (`process.env.X`, `os.environ["X"]`).
9
+ - Commit a `.env.example` with the names and no values, and add `.env` to `.gitignore` before the first `.env` is written.
10
+ - Shape the environment in one place (an `env.ts`, or the language's equal): the names, their types and which are required, never a value.
11
+ - Name a token on the command that uses it (`$PERSONAL_GITHUB_TOKEN`), never its value.
12
+
13
+ Never do:
14
+ - Stage or commit a `.env`, a key file (`*.pem`, `*.key`, `id_rsa`) or `credentials.json`; `secrets-guard` refuses it, and `git add -A` while one is not ignored.
15
+ - Write a literal token, key, private key block or connection-string password into source, tests, docs or config; `secrets-guard` refuses the write.
16
+ </constraints>
@@ -0,0 +1,23 @@
1
+ ---
2
+ # concepts: claude
3
+ paths:
4
+ - "placeholder"
5
+ ---
6
+
7
+ # Skills, rules and agents: one job, triggers in the description, short
8
+
9
+ <constraints>
10
+ Always do:
11
+ - One job per skill, so its use can be counted and an unused one retired.
12
+ - Start the description with "Use when", and list only the situations that trigger it.
13
+ - Keep SKILL.md under 8,000 characters. After compaction, Claude Code re-attaches an invoked skill cut at 20,000, and anything past the cut is gone.
14
+ - Put long references in files the step itself re-reads at the moment it needs them.
15
+ - Make anything a regex or a script can check into a hook or lesson check, not a sentence.
16
+ - Write a rule that runs only when its condition applies (a path, a changed file type, a flag). A lesson from one failure must not become a step every task pays for.
17
+ - Before trusting a new skill, run it once without the skill and once with it (`pressure-test-skill`).
18
+
19
+ Never do:
20
+ - Summarize the skill's steps in its description. Claude follows the summary and skips the body, and the usage count lies.
21
+ - Write a router skill that loads every mode.
22
+ - Ask Claude to update status bars, logs or checklists by hand inside a loop. A hook can see every tool call for free; each manual call is a full turn.
23
+ </constraints>
@@ -0,0 +1,14 @@
1
+ ---
2
+ # hook: file-size-guard.mjs
3
+ ---
4
+ # Split a file as it nears the line limit, not at it
5
+
6
+ <constraints>
7
+ Always do:
8
+ - Check a source file's length before adding to it. Past about 250 lines of the 300 limit (`layout.maxFileLines`), put the new code in its own file, and move what belongs with it.
9
+ - Split by what the code does, so each file has one job and a name that says so.
10
+
11
+ Never do:
12
+ - Squeeze lines together, drop comments or shorten names to fit under the limit.
13
+ - Put new code into an unrelated file to get past the refusal.
14
+ </constraints>
@@ -0,0 +1,26 @@
1
+ ---
2
+ # concepts: claude
3
+ paths:
4
+ - "placeholder"
5
+ ---
6
+
7
+ # Dispatching subagents: name the model, pass files, demand a status
8
+
9
+ <constraints>
10
+ Always do:
11
+ - Set `model` on every agent and dispatch. An omitted model inherits the session's most expensive one.
12
+ - Hand work over as files: the brief, the diff and the report path. Don't paste them into the prompt.
13
+ - Require the agent to end with exactly one status line, `DONE`, `DONE_WITH_CONCERNS`, `BLOCKED` or `NEEDS_CONTEXT`, plus the path of its report.
14
+ - Give read-only agents read-only tools, and give writing agents the exact list of files they may write.
15
+ - Review an agent's work as unverified claims: read the diff, re-run the verdict. A stated reason never lowers a finding's severity.
16
+ - Pass the instance under test as a parameter: behaviour is proved once on the template, and the generated gate proves the instances are that template (`prove-instances-identical`).
17
+ - Quote the `design/shape.json` row of every concept the brief touches, word for word: its shape,
18
+ its generator, its selectors and constants. Name the shape and the generator; an instance appears only on a `seen in:` or
19
+ `example:` line (`brief-guard` refuses any other, KWB-1).
20
+
21
+ Never do:
22
+ - Let a worker agent spawn its own reviewer. It doubles the cost and its approval counts for nothing.
23
+ - Start an agent for something one script call or one Read can answer.
24
+ - Never name a fixed instance in a brief ("drive slot 2", "the PAD slot"): a brief that names one instance gets work proved on that
25
+ instance only (Stellix B-178: every step proved on slot 2, the other three slots left behind).
26
+ </constraints>
@@ -0,0 +1,17 @@
1
+ ---
2
+ # hook: suite-once.mjs
3
+ ---
4
+ # Tests run for what changed; the whole suite runs once, as the gate before landing
5
+
6
+ <constraints>
7
+ Always do:
8
+ - While working, run only the tests the change reaches (the `pick-tests` skill).
9
+ - Commit, then run the whole suite once, as the last step before landing. Fix what it finds, and run again only the tests that failed.
10
+ - Let a run that has started finish. Read its output before starting another.
11
+ - Keep the output of a long run in a file, so one failure never costs a second run.
12
+
13
+ Never do:
14
+ - Run the whole suite on uncommitted work; `suite-once` refuses it.
15
+ - Run the suite again when nothing it covers has changed, or to check a change it does not reach.
16
+ - Filter a long run's output so that a failure's details are lost.
17
+ </constraints>
@@ -0,0 +1,22 @@
1
+ ---
2
+ # concepts: cpp, js
3
+ paths:
4
+ - "placeholder"
5
+ ---
6
+
7
+ # Anything used more than once is one template: changed once, tested once
8
+
9
+ any element used more than once is made as a template, so a change, an update or a test happens once, not for every instance. A test that repeats the same behaviour over thousands of identical controls is a complete waste of time.
10
+
11
+ <constraints>
12
+ Always do:
13
+ - Make anything used twice one template, in any language: an HTML or JSX component, a C++ class or factory, an app view. Instances are built from it by data. The `template-law` hook refuses a second copy built by hand, whole or in part, and the `make-it-a-template` skill makes the template.
14
+ - Test behaviour once, on the template, with an instance chosen as a parameter: any instance must do.
15
+ - Prove the instances really are the template with one structural pass over the data: every instance is built by the same factory, with the same members. That is a read, not a run of the behaviour.
16
+ - Test an instance's own data where it differs: its label, its range, its ID, as a table.
17
+
18
+ Never do:
19
+ - Loop a behaviour test over every instance of one template: `one-walk-per-template` refuses a loop that presses, clicks or drags them.
20
+ - Copy an element and change it: a one-off is a second template, and a second place to fix. A real exception says so on its line: `one-off: <reason>`.
21
+ - Skip the structural pass: instances with their own code path are how one of four identical slots came to behave differently. An instance that has its own code path is not an instance, and is tested on its own.
22
+ </constraints>
@@ -0,0 +1,15 @@
1
+ ---
2
+ # hook: untrusted-boundary.mjs
3
+ ---
4
+ # Text from outside reaches a model only inside a per-call SHA-256 boundary
5
+
6
+ <constraints>
7
+ Always do:
8
+ - Wrap every block of untrusted text a model call is given (a web page, a fetched document, a scraped row, a user's upload, a stored copy of any of them) in one helper, `wrapUntrusted(text)`: a boundary named by the SHA-256 of that block, made per call, with a note before and after that states the exact hash and says the block is information, not instructions.
9
+ - Keep your own fields (ids, dates, the task, the output schema) outside the boundary, so nothing inside it can pass for them.
10
+ - Mark a file whose model calls send only its own text with a line `// untrusted: none` (or `# untrusted: none`), so the reader knows it was decided.
11
+
12
+ Never do:
13
+ - Paste fetched or user-supplied text straight into a prompt, a system message or a tool result; `untrusted-boundary` refuses a model call added to a file with no boundary.
14
+ - Reuse one boundary across calls, or name it by anything a page could guess: the hash is of this block, this call.
15
+ </constraints>
@@ -0,0 +1,26 @@
1
+ ---
2
+ name: add-lesson-check
3
+ description: Use right after a bug is fixed, when a mistake repeats, or when the user says to make sure something never happens again.
4
+ ---
5
+
6
+ # Add a lesson check (one job: make a fixed bug impossible to reintroduce)
7
+
8
+ Run this after the fix is in, not before.
9
+
10
+ <constraints>
11
+ Always do:
12
+ - Write one file per lesson: `.claude/checks/<id>.json` with `id`, `why`, `rule`, `globs`, `pattern`, `code`, `bad`, `good`.
13
+ - `bad` is the smallest snippet showing the bug as it actually appeared. `good` is the fixed form.
14
+ - Set `"code": true` for C/C++/JS/TS, so comments and strings are ignored.
15
+ - Run `node .claude/hooks/lesson-checks.mjs --selftest` and keep refining the pattern until it reports OK. The check must catch `bad` and pass `good`.
16
+ - If the lesson is a *law* (it applies beyond this one pattern), also add or extend the matching `.claude/rules/*.md` file, and point `rule` at it.
17
+ - Log the bug and the new check in the project's bugs file.
18
+
19
+ Never do:
20
+ - Write a check that a regex can't express reliably. Say so instead, and propose a unit test or render test as the check.
21
+ - Widen a pattern until it flags correct code in the repo. Run the selftest, then grep the repo for false positives.
22
+ - Put the lesson only in memory or CLAUDE.md. A lesson without a check is a note, not a fix.
23
+ </constraints>
24
+
25
+ ## Output
26
+ State the check id, what it blocks, and the selftest result in one or two lines.
@@ -0,0 +1,25 @@
1
+ ---
2
+ name: fix-from-scan
3
+ description: Use when a scan has finished and its findings are to be fixed, or when asked to fix everything the kit found in a project.
4
+ ---
5
+
6
+ # Work a scan's fix plan (one job: every finding is fixed, or has its reason written down)
7
+
8
+ <constraints>
9
+ Always do:
10
+ 1. Make the plan: `npx --no-install @thedecipherist/claude-packs fix`. It writes `.claude/fix-plan.md` from the last scan, and scans first if there is none.
11
+ 2. Install the kit first, as its section 0 says, so every fix is held to the laws it is fixing.
12
+ 3. Work top to bottom, a section at a time, on its own work branch, pushed from its first commit.
13
+ 4. Read the code behind each box before changing it. A finding is a candidate. Not real: tick it and write why on its line, and say which check misfired so it can be tightened.
14
+ 5. Fix one law everywhere at once: every box under one check, then commit, by name.
15
+ 6. A bug starts with a failing test (`bug-fix-starts-red`). Copies go through `make-it-a-template`.
16
+ 7. Tick the box when the fix is committed, and commit the plan with it, so the work can be picked up by anyone.
17
+ 8. Run only the tests a change reaches (`pick-tests`). At the end of a section run the whole suite once, then land it (`land-branch`).
18
+ 9. When every box is ticked, scan again. What is new goes in the plan.
19
+
20
+ Never do:
21
+ - Tick a box without reading the code, or for a fix that is not committed.
22
+ - Change what users see to quiet a finding: ask first.
23
+ - Rotate or print a secret's value. Name its file and line; the owner rotates it.
24
+ - Mark a finding `one-off:` or disable a check to clear the list.
25
+ </constraints>
@@ -0,0 +1,24 @@
1
+ ---
2
+ name: land-branch
3
+ description: Use when a work branch is finished, when its gate went green, or when asked to merge, land or ship a branch.
4
+ ---
5
+
6
+ # Land a finished branch on the trunk (one job: the trunk has the work, and the remote agrees)
7
+
8
+ <constraints>
9
+ Always do:
10
+ 1. Check it is finished: everything committed and pushed, the "done when" measured, the whole suite green on committed work.
11
+ 2. Fetch, and see whether the trunk moved: `git rev-list --count HEAD..origin/<trunk>`.
12
+ 3. The trunk has not moved: go to step 5.
13
+ 4. The trunk moved: merge it into the branch, never rebase. Resolve conflicts keeping both sides' work: both CHANGELOG entries, the higher version. Run only the tests the merge reaches, commit, push the branch.
14
+ 5. If the project's CLAUDE.md says the trunk needs a yes, ask now, once. Nothing before this step ever needs one.
15
+ 6. Switch to the trunk as its own step, then `git merge --ff-only origin/<trunk>` and `git merge --ff-only <branch>`.
16
+ 7. Push the trunk. A push that times out has not happened until the remote says so.
17
+ 8. Prove it: `git ls-remote origin refs/heads/<trunk>` equals `git rev-parse HEAD`.
18
+ 9. Release the project's lock if it has one, and log the landing in `build.md`.
19
+
20
+ Never do:
21
+ - Force a push, or rebase what is pushed.
22
+ - Report it landed before step 8.
23
+ - Delete the branch: branches are the record of the build.
24
+ </constraints>
@@ -0,0 +1,23 @@
1
+ ---
2
+ name: make-it-a-template
3
+ description: Use when template-law refuses a write, when scan lists repeated code, or when about to write something the project already has in another shape.
4
+ ---
5
+
6
+ # Make a repeat one template (one job: the thing exists once, and its instances are data)
7
+
8
+ <constraints>
9
+ Always do:
10
+ 1. List the copies. The refusal names them; `npx --no-install @thedecipherist/claude-packs scan` lists them all, with what each becomes.
11
+ 2. Read what differs. The refusal's "differs only in" list is the template's parameters. No differences: it moves as it is.
12
+ 3. Pick the form the refusal names: a component (markup), a factory (an object filled in), a function (a run of statements), a table and a loop (one call repeated). In C++, `cpp-extract-template` has the forms.
13
+ 4. Find the place every copy can already reach. Name the template for what it builds.
14
+ 5. Take the copies out first, each replaced by a call to the template, then write the template. `template-law` refuses the template while a copy stands, and `once-only` judges a command before it runs.
15
+ 6. Test the template once, with an instance as a parameter (`test-the-template-once`), and prove the instances with one read of the table.
16
+ 7. Run the tests the change reaches (`pick-tests`), then search for the copies by name: none is left.
17
+
18
+ Never do:
19
+ - Mark a repeat `one-off:` to get past the refusal. It is for something that truly differs, with its reason.
20
+ - Rename things so a copy passes. The law strips names.
21
+ - Leave some copies behind "for later": half a template is one more copy.
22
+ - Add a flag to merge two things with different behaviour: they are two kinds (`behaviour-lives-with-its-kind`).
23
+ </constraints>
@@ -0,0 +1,25 @@
1
+ ---
2
+ name: pdf-to-md
3
+ description: Use when a PDF has to be read or searched, when converting a PDF to Markdown, or when a manual, datasheet or spec arrives as a PDF.
4
+ ---
5
+
6
+ # Convert a PDF to Markdown with docling (one job: a PDF becomes text you can read, grep and cite)
7
+
8
+ Use docling, not `pdftotext`, a Python PDF library or a hand-written extractor. It keeps tables as tables, and a manual's tables are usually what you came for.
9
+
10
+ <constraints>
11
+ Always do:
12
+ 1. Check it is there: `docling --version`. If not, `pipx install docling` or `uv tool install docling`, and say the PDF is unread until that is done.
13
+ 2. Check the file is a PDF: `file manual.pdf`. A download can be an HTML error page with a `.pdf` name.
14
+ 3. Convert with images left out, into a folder of its own:
15
+ `docling manual.pdf --to md --no-ocr --image-export-mode placeholder --output out/`
16
+ On an 87-page manual this took 37 seconds and gave 79 KB. The default embeds every image, and took three times as long for 2.2 MB.
17
+ 4. Judge the result. Compare the text with the page count: pages with almost no text mean a scan.
18
+ 5. For a scan, run it again with `--ocr`, or `--force-ocr` when the text layer is bad, and treat the result as a lead: OCR drops symbols and shuffles columns.
19
+ 6. Read a table that matters from the page itself, and cite the printed page number. When the table is a picture, docling leaves an image placeholder there: render that page.
20
+ 7. Keep the Markdown out of git unless the project wants it there: a vendor's manual is not yours to publish.
21
+
22
+ Never do:
23
+ - Read a large PDF's Markdown whole. Grep its headings, then read the section.
24
+ - Treat an empty search as absence before step 4: the text may not have converted.
25
+ </constraints>
@@ -0,0 +1,20 @@
1
+ ---
2
+ name: pick-tests
3
+ description: Use when a change is ready to check, before running any test, or when a test run is about to take minutes.
4
+ ---
5
+
6
+ # Pick the tests this change reaches (one job: run no test the change cannot affect)
7
+
8
+ <constraints>
9
+ Always do:
10
+ 1. List what changed: `git diff --name-only <base>` and the new files.
11
+ 2. Use the project's own command when `.claude/layout.json` `commands` has one (`test-changed`, `test-one`): it knows the map.
12
+ 3. Without one, choose by reach: the test beside the file, the tests that import it, the tests that name it. A shared helper reaches its callers' tests.
13
+ 4. Run those, by name. Keep the output in a file.
14
+ 5. When one fails, fix it and run that one again, not the set.
15
+ 6. Say which tests ran and why, and what was not run.
16
+
17
+ Never do:
18
+ - Run the whole suite to check a change: it runs once, committed, before landing (`test-only-what-changed`).
19
+ - Count a run as proof of a change it does not reach.
20
+ </constraints>
@@ -0,0 +1,23 @@
1
+ ---
2
+ name: pressure-test-skill
3
+ description: Use when a skill, rule or agent is new, was just rewritten, or keeps being ignored or misfiring.
4
+ ---
5
+
6
+ # Pressure-test one skill, rule or agent
7
+
8
+ ## Steps
9
+ 1. Write one realistic scenario that tempts the wrong move, combining pressure (time, sunk cost, the user insisting) with a clear choice, for example: "the null test fails by −90 dB, the user wants it shipped today, regenerate the golden?" Save it to `.claude/state/pressure/<name>.md`.
10
+ 2. **Baseline:** dispatch a subagent (name the model) with the scenario and without the skill or rule. Record its choice and its reasons word for word.
11
+ 3. **With it:** dispatch a fresh subagent with the scenario plus the skill or rule. Record the same things.
12
+ 4. Repeat each side 3 times. One run proves nothing.
13
+ 5. Compare the two sides:
14
+ - If the baseline already does the right thing, the skill or rule adds nothing: say so.
15
+ - If it fails both ways, find which excuse won.
16
+ 6. Propose the smallest fix, in this order of preference:
17
+ 1. a hook or lesson check (if a pattern can catch it);
18
+ 2. a required slot in the skill's output format;
19
+ 3. one excuse-and-answer row in the skill;
20
+ 4. sharper trigger wording in the description.
21
+
22
+ ## Report
23
+ A table with the columns Run, With or without, Choice, Key reason. Then the verdict (adds value, adds nothing, or still fails) and the proposed fix. Change the skill only after the user agrees.
@@ -0,0 +1,37 @@
1
+ ---
2
+ name: prove-instances-identical
3
+ description: Use when a container type (slot, oscillator, layer, lane, band, worker) is added or changed, when a step touched one instance, or before calling such a step done.
4
+ ---
5
+
6
+ # Prove the instances identical (one job: the generated gate shape_symmetry for a many concept)
7
+
8
+ Identical containers are one code path addressed by an index (`instances-by-index-identities-by-id`). Which concepts are many is
9
+ written in `design/shape.json`, never guessed from folders. The proof is the gate the kit generates from that manifest,
10
+ `shape_symmetry.<concept>`: every instance has the same members, and a swap between every pair changes nothing but the index.
11
+
12
+ <constraints>
13
+ Always do:
14
+ - Give the concept its row in `design/shape.json` first (`"shape": "many"`, `count`, `generator`, `owns`), with a `symmetry` block of two
15
+ commands the project provides; the kit never writes the project's test:
16
+ - `members`: prints instance `{i}`'s members, one per line: every parameter ID, effect, planet, moon, press-map row it owns;
17
+ - `swap`: exits 0 when instances `{i}` and `{j}` swap the same: load a state, swap the two instances' contents, run the same input,
18
+ compare with the indices swapped back: the output bit for bit (effects and tails included), the world, the picture, the state
19
+ (every parameter by generated ID) and the bindings (press map, host parameters, undo).
20
+ - `first` (default 0) when instances are counted from 1; `instances` (a command printing N) for a many concept with no fixed count.
21
+ - Generate the tests at configure time, never by hand. CMake:
22
+ `execute_process(COMMAND node ${CMAKE_SOURCE_DIR}/.claude/tools/shape-symmetry.mjs gen --dir ${CMAKE_SOURCE_DIR} --cmake ${CMAKE_BINARY_DIR}/shape_symmetry.cmake COMMAND_ERROR_IS_FATAL ANY)`
23
+ then `include(${CMAKE_BINARY_DIR}/shape_symmetry.cmake)`. Any other build system: `npx --no-install @thedecipherist/claude-packs symmetry gen --list` prints one
24
+ `<name><TAB><command>` line per many concept.
25
+ - Run it: `ctest -R shape_symmetry` or `npx --no-install @thedecipherist/claude-packs symmetry run <concept>`. Read every line: it names what instance i has that j
26
+ lacks, and prints every pair it checked (6 for N = 4).
27
+ - Plant the faults the gate exists for and see it red: one instance missing a member, one pair that swaps differently.
28
+ - Check the IDs: the generator produces exactly the frozen lock's string for every instance and field.
29
+ - Report each difference by where it lives: a code path, a record field, a wiring.
30
+ - Keep it structural and cheap: this gate proves instances are one template. Behaviour is tested once on the template (`test-the-template-once`), never per instance. With many instances `members` runs on all and `swap` on a sample: the tool picks it.
31
+
32
+ Never do:
33
+ - Prove a change on one instance and call it done.
34
+ - Accept "the instances are the same code" without the gate's readings.
35
+ - Scope the proof to a folder ("the engine"): the world, the painter, the bank and the tests hold instances too.
36
+ - Write a hand-made swap test per concept in place of the generated one.
37
+ </constraints>