@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,21 @@
1
+ ---
2
+ # concepts: painter, shaders, tests
3
+ paths:
4
+ - "placeholder"
5
+ ---
6
+
7
+ # What the 3D space looks like is proven by golden images
8
+
9
+ <constraints>
10
+ Always do:
11
+ - Render fixed scenes offscreen (fixed seed, fixed time, fixed size) at 1x and 2x scale, with fixed time, fixed seed and dithering off. Read them back in the test harness and compare against stored goldens kept per backend (Metal and Direct3D 12 differ in derivatives and precision). Compare with NVIDIA's ꟻLIP (BSD-3, single-header C++), not PSNR. Pass (house): mean FLIP ≤ 0.01 and 99th percentile ≤ 0.1 per scene; on the same machine and driver, repeat renders are bit-identical.
12
+ - Prove visual changes through the real user-facing path: the standalone with the real editor. Logs or JSON saying "rendered" prove nothing about what the user sees.
13
+ - Update goldens only for an intended visual change, with before and after images shown to the user (`gpu-golden-update` skill).
14
+
15
+ Never do:
16
+ - Mark a visual task done because the code compiles or the logs look right.
17
+ - Regenerate goldens to make a failing test pass.
18
+ </constraints>
19
+
20
+ ## Check
21
+ `gpu-golden-check` skill runs the image-diff tests. They fail over the FLIP thresholds and save the FLIP error heatmap.
@@ -0,0 +1,23 @@
1
+ ---
2
+ # concepts: painter, shaders
3
+ paths:
4
+ - "placeholder"
5
+ ---
6
+
7
+ # Render in linear HDR, tonemap once with PBR Neutral, output sRGB
8
+
9
+ <constraints>
10
+ Always do:
11
+ - Render the space into an `rgba16float` target in linear light.
12
+ - Run one final pass: exposure, then Khronos PBR Neutral (identity below its compression start, so the slot colours stay true; only highlights compress), then write to a `BGRA8Unorm` surface encoded as sRGB.
13
+ - Keep the slot colours (amber, cyan, magenta, green, white) defined once, in linear, in the records.
14
+
15
+ Never do:
16
+ - Use ACES (shifts hues) or AgX (desaturates) on a palette that has to read as exact slot colours.
17
+ - Turn on EDR or wide colour in v1. Dawn currently rejects surface colour management, and very bright output next to a DAW is hostile. Display P3 can come later on Mac through the `CAMetalLayer`'s colour space.
18
+ - Tonemap in more than one place.
19
+ </constraints>
20
+
21
+ ## Check
22
+ - Golden swatch-and-gradient scene: after 8-bit output, Mac and Windows agree within ±1 LSB.
23
+ - Test: PBR Neutral returns its input within 1/255 below 0.76.
@@ -0,0 +1,19 @@
1
+ ---
2
+ # concepts: ui, painter
3
+ paths:
4
+ - "placeholder"
5
+ ---
6
+
7
+ # Hover and drag picking is a CPU ray test against the frame's own transforms
8
+
9
+ <constraints>
10
+ Always do:
11
+ - Pick with a CPU ray against spheres (or capsules for rings and paths), using the planet and moon transforms of the same frame the renderer drew.
12
+ - Resolve hover within the same frame the mouse moved in.
13
+
14
+ Never do:
15
+ - Pick by reading back a GPU ID buffer. The readback lands at least a frame late, adds a stall or copy, and buys nothing for about 50 objects.
16
+ </constraints>
17
+
18
+ ## Check
19
+ Unit tests with a fixed camera and positions: hits are exact at sphere edges ±0.5 px, and hover changes in the same frame.
@@ -0,0 +1,25 @@
1
+ ---
2
+ # concepts: painter, ui
3
+ paths:
4
+ - "placeholder"
5
+ ---
6
+
7
+ # The painter starts after the window exists, renders only while visible, and stops before anything is freed
8
+
9
+ <constraints>
10
+ Always do:
11
+ - Create the native view only once the editor's native peer exists and has bounds: on macOS a child `NSView` backed by a `CAMetalLayer` inside an `NSViewComponent`; on Windows a child `HWND` inside an `HWNDComponent`. Make the Dawn surface from it (`WGPUSurfaceSourceMetalLayer` / `WGPUSurfaceSourceWindowsHWND`).
12
+ - Configure the surface in pixels: logical size × `backingScaleFactor` (or the Windows DPI scale). Set the `CAMetalLayer`'s `contentsScale` yourself, because Dawn doesn't. Reconfigure on every resize and screen change.
13
+ - Handle every `GetCurrentTexture` status explicitly: `Outdated`, `Lost` and `SuccessSuboptimal` mean reconfigure; `Timeout` means skip this frame.
14
+ - Stop rendering (0 Hz) when the editor is closed, hidden, minimised or covered.
15
+ - Tear down in this order: stop the render thread and wait for its last frame, release the surface, then destroy the view.
16
+
17
+ Never do:
18
+ - Create the view in the editor's constructor before the peer exists.
19
+ - Keep rendering with the editor closed. A closed editor costs 0% render CPU.
20
+ - Free the view, layer or surface while the render thread may still present to it.
21
+ </constraints>
22
+
23
+ ## Check
24
+ - `gpu-lifecycle-stress`: open and close the editor 100 times under AddressSanitizer with audio at 96 voices, then 8 copies at once. Pass: no reports, no leaks, render CPU 0 after the last close.
25
+ - Golden test at scale 2.0, plus a test that the surface texture size equals the view bounds × scale.
@@ -0,0 +1,24 @@
1
+ ---
2
+ # concepts: painter, shaders
3
+ paths:
4
+ - "placeholder"
5
+ ---
6
+
7
+ # Text is drawn from a glyph atlas the app builds from the shipped fonts
8
+
9
+ Spec rule 2 allows fonts as files and runtime caches; this is how text uses both.
10
+
11
+ <constraints>
12
+ Always do:
13
+ - Build an MTSDF atlas (multi-channel distance field plus a true distance channel) at runtime from the shipped TTF/OTF files with msdfgen and msdf-atlas-gen (MIT), with FreeType under its FTL licence for loading outlines.
14
+ - For small text (under about 12 px on screen), rasterise a hinted grey atlas per scale factor at runtime (FreeType, or JUCE drawing glyphs into an `Image`). Distance fields look soft at that size.
15
+ - Rebuild the atlas when the scale changes (100–200%), never ship one.
16
+ - Credit FreeType in the docs as its FTL licence requires.
17
+
18
+ Never do:
19
+ - Ship a pre-built atlas image (that's a pre-rendered image; the `no-shipped-images` hook refuses it).
20
+ - Rasterise text on the CPU every frame.
21
+ </constraints>
22
+
23
+ ## Check
24
+ Golden text sheet at 9, 11, 14 and 24 pt × 100, 150 and 200%. Pass (house): FLIP mean below 0.02 against a hinted FreeType reference at small sizes, and no corner rounding visible at 24 pt. Upgrade path if MSDF artefacts show: Slug (patent now public domain, MIT/Apache reference shaders).
@@ -0,0 +1,24 @@
1
+ ---
2
+ # concepts: painter, shaders, world
3
+ paths:
4
+ - "placeholder"
5
+ ---
6
+
7
+ # Travellers are drawn from the world snapshot, never simulated on the GPU
8
+
9
+ Spec §8: the world (on the audio side) decides every position; the painter only shows it.
10
+
11
+ <constraints>
12
+ Always do:
13
+ - Upload the snapshot's traveller list (up to the TRAVELLERS cap of 1024: notes, shatter pieces, sparks) once per tick into one storage buffer.
14
+ - Draw every traveller with one instanced call: billboards with corners generated from `vertex_index`, no vertex buffer.
15
+ - Draw trails from a ring of each traveller's last positions, as instanced ribbon segments.
16
+ - Smooth motion between ticks by interpolating the last two snapshots on the GPU.
17
+
18
+ Never do:
19
+ - Integrate traveller physics in a compute shader or anywhere in the painter. A second copy of the formulas in WGSL drifts from the C++ world, and then the picture lies about the sound.
20
+ - Upload per-traveller data more than once per tick.
21
+ </constraints>
22
+
23
+ ## Check
24
+ Frame bench at 1024 travellers with trails. Pass (house): ≤ 2 draw calls for travellers and trails, upload no more than one snapshot per tick, ≤ 0.3 ms GPU.
@@ -0,0 +1,25 @@
1
+ ---
2
+ # concepts: ui
3
+ paths:
4
+ - "placeholder"
5
+ ---
6
+
7
+ # Everything the pointer can act on says so: a cursor for the interaction and a small effect on the hovered thing
8
+
9
+ <constraints>
10
+ Always do:
11
+ - Give every element the pointer can act on (a control, a point or handle, a tab, a list row, a key, a button, a text field) two things when the pointer is over it: (a) a cursor that names the interaction (drag up-down, drag left-right, drag both ways, press, text) and (b) a small visible effect on that element itself (lift, ring, brighten, glow).
12
+ - Find the hovered item with the same function the press uses (one hit test). The press and the hover share it, so a thing drawn as interactive cannot be missing from the hover; never keep a second list of hoverable things.
13
+ - Draw the effect on the hovered item's own pixels, ease it in and out (a glide of about 0.1 s) on the frame clock, and let it come back to rest when the pointer leaves.
14
+ - Give a new control its hover in the same change that gives it its press, and prove it with the hover walk in the skill `hover-state`: the gate moves the pointer over one item of each template and every one-off, and reads that the cursor and the drawn pixels change.
15
+ - Use the disabled look only for what is truly disabled (it does not respond to a press). A control that responds gets the hover.
16
+
17
+ Never do:
18
+ - Ship a control, handle, tab or row that responds to a press and has no hover (a pointer that does not change and a thing that does not react).
19
+ - Choose one cursor for everything: the cursor names what the interaction is.
20
+ - Let the hover effect spill onto its neighbours (a ring or glow round the item is fine; the items beside it must not change).
21
+ - Wire hover from a separate list, a duplicate of the hit test or a per-control flag that the press does not read.
22
+ </constraints>
23
+
24
+ ## Check
25
+ The project's hover gate (layout.json `gates.hover`): a hover walk over every pressable item, red if any item's cursor or own pixels do not change, or if it does not return to rest. `doctor` is red while UI code exists and no gate is declared.
@@ -0,0 +1,15 @@
1
+ ---
2
+ name: gpu-capture
3
+ description: Use when a planet, glow, traveller or text renders wrong, or GPU time is high and the frame bench alone doesn't show why.
4
+ ---
5
+
6
+ # GPU capture (one job: get a frame capture of one scene)
7
+
8
+ ## Steps
9
+ 1. Build the debug painter with labels on every pipeline and pass (`use_user_defined_labels_in_backend`).
10
+ 2. **Mac:** run with `MTL_CAPTURE_ENABLED=1` and `DAWN_TRACE_FILE_BASE=captures/<scene>-<date>`. Dawn writes a `.gputrace` through `MTLCaptureManager`. Load the named scene and trigger the capture for N frames (default 3).
11
+ 3. **Windows:** run under PIX with `WinPixEventRuntime.dll` next to the executable; Dawn emits PIX begin/end markers from the labels. Dawn's own D3D12 trace isn't implemented, so PIX is the tool.
12
+ 4. Tell the user the capture path, and that it opens in Xcode (Mac) or PIX (Windows).
13
+
14
+ ## Report
15
+ Capture path, scene, frame count, build and backend. Don't analyse the capture in this skill.
@@ -0,0 +1,14 @@
1
+ ---
2
+ name: gpu-frame-bench
3
+ description: Use when the space stutters or feels slow, after painter or shader changes, or before merging GPU work.
4
+ ---
5
+
6
+ # GPU frame bench (one job: is the renderer inside its budget?)
7
+
8
+ ## Steps
9
+ 1. Build Release with the shipping flags, then run the project's `frame-bench` command (CLAUDE.md, Project commands) on the reference scenes, at 1x and 2x scale, with audio running at 96 voices.
10
+ 2. Read its JSON: p99 GPU ms (Dawn timestamp queries, opt-in, resolved and read back a frame or two later; the gpu-frame-budget rule), p99 render-thread CPU ms, draw calls per frame, bytes uploaded per frame, and the validity flag of each counter.
11
+ 3. Compare against `.claude/rules/gpu-frame-budget.md` (judged on the M1 Pro with 4 copies open; house proposal GPU ≤ 8 ms, painter CPU ≤ 2 ms at p99 until the work order sets numbers) and `gpu-frame-work.md` (≤ 50 draw calls).
12
+
13
+ ## Report
14
+ One row per scene with each figure and PASS/FAIL. Read the pattern before guessing a cause: low GPU but high frame time means sync or present pacing, and times bunched at the display interval mean vsync. Treat an invalid counter as a FAIL, never as 0. Don't change code in this skill.
@@ -0,0 +1,13 @@
1
+ ---
2
+ name: gpu-golden-check
3
+ description: Use after any painter, shader or look change, and before calling visual work done.
4
+ ---
5
+
6
+ # Golden image check (one job: did what the user sees change?)
7
+
8
+ ## Steps
9
+ 1. Run the project's `picture-gates` command (CLAUDE.md, Project commands): the golden-image tests (fixed seed, time and size; 1x and 2x; per-platform goldens).
10
+ 2. For each failing scene, open the saved diff image and the rendered image.
11
+
12
+ ## Report
13
+ Each scene with its mean and 99th-percentile FLIP and PASS/FAIL (threshold from `gpu-golden-images.md`), and a one-line description of what visibly changed in each failure. Never update goldens here. If the change was intended, say so and stop; the user runs `gpu-golden-update`.
@@ -0,0 +1,16 @@
1
+ ---
2
+ name: gpu-golden-update
3
+ description: Use only when the user confirms a visual change is intended and asks to update the golden images.
4
+ ---
5
+
6
+ # Golden image update (one job: accept an intended visual change)
7
+
8
+ <constraints>
9
+ Always do:
10
+ - Show the user the old golden, the new render and the diff for every scene that will change, and wait for a yes.
11
+ - Update only the scenes that were approved. Log the change, and why, in the project's changes or bugs file.
12
+
13
+ Never do:
14
+ - Update goldens to make a failing test pass without the user's approval of the images.
15
+ - Update every scene when only some were meant to change.
16
+ </constraints>
@@ -0,0 +1,15 @@
1
+ ---
2
+ name: gpu-lifecycle-stress
3
+ description: Use after changing how the view, surface, device or render thread start or stop.
4
+ ---
5
+
6
+ # GPU lifecycle stress (one job: prove the 3D view starts and stops cleanly)
7
+
8
+ ## Steps
9
+ 1. Build the AddressSanitizer configuration of the standalone with the project's `build` command (and later the plugin, in a test host).
10
+ 2. With audio rendering at 96 voices, open and close the editor 100 times, hide and show it, and change the display scale (1x/2x).
11
+ 3. Run 8 instances at once in the host.
12
+ 4. Record ASan reports, leaks, audio overruns, and render-thread CPU after the last close.
13
+
14
+ ## Report
15
+ Pass only if: no ASan reports, no leaks, zero audio overruns, and render CPU of 0 with the editor closed (`gpu-render-lifecycle.md`). For any failure give the stack and the lifecycle step it happened in. Don't change code in this skill.
@@ -0,0 +1,33 @@
1
+ ---
2
+ name: hover-state
3
+ description: Use when a control, handle, tab, list row, key or button is added or changed in a drawn UI, when a user says something does not react under the mouse, or when a hover gate is written or fails.
4
+ ---
5
+
6
+ # Hover state (one job: every pressable thing answers the pointer, and a gate proves it)
7
+
8
+ The law is the rule `hover-every-pressable`: a cursor naming the interaction, and a small visible effect on the hovered thing itself. The hover follows the press's own hit test.
9
+
10
+ ## Add the hover to a new control
11
+ 1. Find the one function the press uses to find the item under the pointer (the hit test). If there is none, make one and have the press call it.
12
+ 2. Have the mouse-move path call that same function and store the result (the hovered id). Do not keep a second list of hoverable things.
13
+ 3. Pick the cursor from the interaction, not the look: drag up-down, drag left-right, drag both ways (a 2-D point), press (button, tab, row, key), text. Set it from the hovered id.
14
+ 4. Draw the effect on the item's own pixels from the hovered id: a lift, a ring, a brighten. Ease it over about 0.1 s on the frame clock (not the wall clock, or two runs differ). A neighbour must not change.
15
+ 5. Disabled looks are for what is truly disabled. If the press works, the hover shows.
16
+ 6. Add the item to the hover walk (below) in the same change.
17
+
18
+ ## Prove it: the hover walk
19
+ A gate that runs the real window (or the real page) and, for one item of each template and every one-off the pointer can act on (`test-the-template-once`: a template's other instances are proved by a read that they are built from it):
20
+ 1. moves the pointer there through the same function a mouse move calls, and waits the glide on the virtual frame clock;
21
+ 2. reads that the hover model found the item the press finds there (the two lists agree);
22
+ 3. reads that the cursor is the interaction's;
23
+ 4. reads the pixels of the item's box and of a ring round it, hovered against at rest: the box changes by a floor (pixels and share), the ring does not;
24
+ 5. moves away and reads that the box came back to rest.
25
+ Rows a press cannot reach (another control covers every point) are listed, not judged. Run it twice and require one digest (a wall-clock hover differs between runs).
26
+
27
+ Plant its faults so the gate is seen red: hover off altogether, one kind of item with no cursor or effect, one kind drawn interactive but left off the hover list, the wall clock in place of the frame clock. A gate never seen red is not a gate.
28
+
29
+ ## Declare it
30
+ `layout.json`: `"gates": { "hover": "<the command>" }`. `doctor` is red while the project has UI code and no gate is declared, or the declared command names a file that is not there. A project with truly no pointer says `"hover": "none: <reason>"`.
31
+
32
+ ## Worked example
33
+ Stellix: `tools/gates/hover_gate.sh` (the runner and its `--selftest` plants), `lib/app/gates/editor_hoverwalk_read.h` (the walk that hovers every item through the mouse-move path), `tools/gates/hover_judge.py` (the judge: cursor per kind, own pixels change, ring does not, comes back). Read them for the shape; the numbers and names are that project's own.
@@ -0,0 +1,16 @@
1
+ {
2
+ "id": "hook-catch-must-not-allow",
3
+ "why": "A catch that returns 0 turns a crashed guard into a passed call. Only an event that cannot be parsed may be let through.",
4
+ "rule": ".claude/rules/a-refusal-is-exit-2.md",
5
+ "concepts": [
6
+ "hook-files"
7
+ ],
8
+ "globs": [],
9
+ "exclude": [
10
+ "**/node_modules/**",
11
+ "**/*.test.*"
12
+ ],
13
+ "pattern": "(?<!JSON\\.parse\\([^\\n]*)\\bcatch\\b\\s*(?:\\([^)]*\\))?\\s*\\{\\s*(?:return 0\\b|process\\.exit\\(0\\))|\\bexcept\\b[^\\n]*:\\s*\\n\\s*(?:return 0\\b|sys\\.exit\\(0\\))",
14
+ "bad": "try {\n judge(payload);\n} catch (e) {\n return 0;\n}\n",
15
+ "good": "try { payload = JSON.parse(text); } catch { return 0; }\ntry {\n judge(payload);\n} catch (e) {\n process.stderr.write(String(e));\n return 2;\n}\n"
16
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "id": "hook-command-no-pipe",
3
+ "why": "A piped command exits with the pipe's last command, so a hook's exit 2 is lost.",
4
+ "rule": ".claude/rules/a-refusal-is-exit-2.md",
5
+ "concepts": [
6
+ "hook-config"
7
+ ],
8
+ "globs": [],
9
+ "exclude": [
10
+ "**/node_modules/**",
11
+ "**/*.test.*"
12
+ ],
13
+ "pattern": "\"command\":\\s*\"[^\"\\n]*\\.(?:mjs|py|sh|js)[^\"\\n]*\\s\\|\\s",
14
+ "bad": "{ \"command\": \"node .claude/hooks/guard.mjs | tee /tmp/log\" }\n",
15
+ "good": "{ \"command\": \"node .claude/hooks/guard.mjs\" }\n"
16
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "id": "hook-exit-1-does-not-block",
3
+ "why": "Exit 1 is a non-blocking error: the call goes ahead. A refusal is exit 2. Mark a real non-refusal with a `not a refusal` comment on its line.",
4
+ "rule": ".claude/rules/a-refusal-is-exit-2.md",
5
+ "concepts": [
6
+ "hook-files"
7
+ ],
8
+ "globs": [],
9
+ "exclude": [
10
+ "**/node_modules/**",
11
+ "**/*.test.*"
12
+ ],
13
+ "pattern": "^(?![^\\n]*not a refusal)(?:\\s*exit 1\\b|[^\\n]*\\b(?:process|sys)\\.exit\\(1\\))",
14
+ "bad": "if grep -q \"rm -rf\" \"$cmd\"; then\n echo \"BLOCKED\" >&2\n exit 1\nfi\n",
15
+ "good": "if grep -q \"rm -rf\" \"$cmd\"; then\n echo \"BLOCKED\" >&2\n exit 2\nfi\ntest -f x || exit 1 # not a refusal: a usage error\n",
16
+ "flags": "m"
17
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "id": "hook-no-or-true",
3
+ "why": "`|| true` turns any failure into a pass, a guard's included.",
4
+ "rule": ".claude/rules/a-refusal-is-exit-2.md",
5
+ "concepts": [
6
+ "hook-files",
7
+ "hook-config"
8
+ ],
9
+ "globs": [],
10
+ "exclude": [
11
+ "**/node_modules/**",
12
+ "**/*.test.*"
13
+ ],
14
+ "pattern": "\\|\\|\\s*(?:true\\b|exit 0\\b|:(?=\\s|\"|$))",
15
+ "bad": "node guard.mjs || true\n",
16
+ "good": "node guard.mjs\n",
17
+ "flags": "m"
18
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "id": "hook-refusal-on-stderr",
3
+ "why": "On exit 2 only stderr reaches Claude: a reason echoed to stdout is lost, and the refusal reads as nothing.",
4
+ "rule": ".claude/rules/a-refusal-is-exit-2.md",
5
+ "concepts": [
6
+ "hook-files"
7
+ ],
8
+ "globs": [],
9
+ "exclude": [
10
+ "**/node_modules/**",
11
+ "**/*.test.*"
12
+ ],
13
+ "pattern": "^\\s*echo\\b(?![^\\n]*>&2)[^\\n]*\\b(?:BLOCKED|REFUSED|refused|denied)\\b",
14
+ "bad": "echo \"BLOCKED: no force push\"\nexit 2\n",
15
+ "good": "echo \"BLOCKED: no force push\" >&2\nexit 2\n",
16
+ "flags": "m"
17
+ }
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "hook-proof",
3
+ "version": "1.0.0",
4
+ "description": "A hook that should refuse does refuse: exit 2 is the only block, a crash or a swallowed exit lets the call through, and nothing is proved until it is seen red.",
5
+ "type": "stock",
6
+ "author": "claude-packs",
7
+ "license": "MIT",
8
+ "homepage": "https://github.com/TheDecipherist/claude-packs",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/TheDecipherist/claude-packs.git",
12
+ "directory": "packs/hook-proof"
13
+ },
14
+ "keywords": [
15
+ "hooks",
16
+ "exit-codes"
17
+ ],
18
+ "engines": {
19
+ "claude-packs": ">=0.19.0"
20
+ },
21
+ "folders": {},
22
+ "concepts": {
23
+ "hook-files": [
24
+ "**/.claude/hooks/**",
25
+ "**/hooks/**/*.sh",
26
+ "**/hooks/**/*.mjs",
27
+ "**/hooks/**/*.js",
28
+ "**/hooks/**/*.cjs",
29
+ "**/hooks/**/*.py"
30
+ ],
31
+ "hook-config": [
32
+ "**/.claude/settings.json",
33
+ "**/.claude/settings.local.json"
34
+ ]
35
+ },
36
+ "skillsIn": null,
37
+ "hooks": {}
38
+ }
@@ -0,0 +1,28 @@
1
+ ---
2
+ # concepts: hook-files, hook-config
3
+ paths:
4
+ - "placeholder"
5
+ ---
6
+
7
+ # A refusal is exit 2: everything else lets the call through
8
+
9
+ A guard that fails fails silently: the call goes ahead, and nothing says the guard did not judge it.
10
+
11
+ <constraints>
12
+ Always do:
13
+ - Refuse with exit 2, the reason on stderr. Exit 2 is the only code that blocks: exit 1 is a non-blocking error, and a hook killed at its timeout does not block either.
14
+ - Decide what a guard does when it cannot judge: say so, in the code. `doctor` turns a crash into a red check, but the call that crashed already went through.
15
+ - Keep a guard fast and small enough to finish inside its timeout.
16
+ - Prove a new hook with the `prove-a-hook` skill: its bad case seen refused, through the real settings entry.
17
+
18
+ Never do:
19
+ - `exit 1` to refuse (`hook-exit-1-does-not-block`). Mark a real non-refusal with a `not a refusal` comment on its line.
20
+ - A catch that allows (`hook-catch-must-not-allow`): a crashed guard reads as a passed call. An event that cannot be parsed is the one exception.
21
+ - `|| true`, `|| exit 0` or `|| :` on a guard's work (`hook-no-or-true`).
22
+ - Pipe a guard's command in `settings.json` (`hook-command-no-pipe`): the exit code is the pipe's last command's.
23
+ - `echo` a refusal to stdout (`hook-refusal-on-stderr`): on exit 2 only stderr reaches Claude.
24
+ - Leave a hook file that no settings entry runs: it refuses nothing. `doctor` is red for it.
25
+ </constraints>
26
+
27
+ ## Check
28
+ `doctor` is red for a hook that crashed since it last changed (`.claude/hooks.log`) and for one no settings entry runs. It cannot see a hook killed at its timeout: that leaves no line.
@@ -0,0 +1,21 @@
1
+ ---
2
+ name: prove-a-hook
3
+ description: Use when a hook is new or changed, when a hook seems not to fire, or when something a hook should refuse got through.
4
+ ---
5
+
6
+ # Prove a hook refuses (one job: its bad case seen at exit 2)
7
+
8
+ <constraints>
9
+ Always do:
10
+ 1. Check it runs: the hook is in `.claude/settings.json`, on the right event and matcher. `doctor` says so.
11
+ 2. Write the plant: the smallest payload it must refuse, and the nearest one it must allow, as a `--selftest`, with `lib/selftest.mjs` where the kit's helpers are installed.
12
+ 3. Run it as Claude Code runs it: the payload on stdin, `CLAUDE_PROJECT_DIR` set, through the same command as the settings entry.
13
+ 4. Read the exit code, not the output: 2 for the plant, 0 for the good case. Exit 1 means it crashed or refused wrongly, and the call went through.
14
+ 5. See it red: break the hook on purpose, in a scratch copy, and watch the selftest fail. A gate never seen red proves nothing.
15
+ 6. When something got through, look in `.claude/hooks.log` for that call first: no line means the hook never ran or was killed at its timeout; code 1 means it crashed; code 0 means it judged and allowed, so the fault is in its logic.
16
+ 7. Turn what got through into a selftest case before fixing it.
17
+
18
+ Never do:
19
+ - Probe a hook by pasting a payload into a shell command: a guard that reads command text can refuse the probe itself.
20
+ - Fix a hook so its selftest passes while the fault gets through.
21
+ </constraints>
@@ -0,0 +1,27 @@
1
+ {
2
+ "id": "file-path-from-param",
3
+ "why": "A path built from a parameter can leave the folder it was meant for.",
4
+ "rule": ".claude/rules/root-on-other-machines.md",
5
+ "globs": [
6
+ "**/*.ts",
7
+ "**/*.js",
8
+ "**/*.mjs",
9
+ "**/*.cjs",
10
+ "**/*.go"
11
+ ],
12
+ "exclude": [
13
+ "**/tests/**",
14
+ "**/test/**",
15
+ "**/*.test.*",
16
+ "**/*.spec.*",
17
+ "**/e2e/**",
18
+ "**/node_modules/**",
19
+ "**/dist/**",
20
+ "**/build/**",
21
+ "**/.next/**"
22
+ ],
23
+ "pattern": "(?:writeFile|readFile|unlink|rm)\\(\\s*`/[^`\\n]*\\$\\{(?!safe|basename)[^}]+\\}",
24
+ "bad": "await writeFile(`/etc/bind/zones/${zf.name}`, zf.content);",
25
+ "good": "await writeFile(join(ZONES, safeName(zf.name)), zf.content);",
26
+ "kind": "security"
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "id": "integrity-check-optional",
3
+ "why": "An optional check is no check, and this one guards root on customers' hosts.",
4
+ "rule": ".claude/rules/root-on-other-machines.md",
5
+ "globs": [
6
+ "**/*.ts",
7
+ "**/*.js",
8
+ "**/*.mjs",
9
+ "**/*.cjs",
10
+ "**/*.go"
11
+ ],
12
+ "exclude": [
13
+ "**/tests/**",
14
+ "**/test/**",
15
+ "**/*.test.*",
16
+ "**/*.spec.*",
17
+ "**/e2e/**",
18
+ "**/node_modules/**",
19
+ "**/dist/**",
20
+ "**/build/**",
21
+ "**/.next/**"
22
+ ],
23
+ "pattern": "\\bif\\s*\\(\\s*expected\\w*\\s*&&\\s*\\w+\\s*!==\\s*expected",
24
+ "bad": "if (expectedSha256 && actual !== expectedSha256) return fail();",
25
+ "good": "if (!expectedSha256 || actual !== expectedSha256) return fail();",
26
+ "kind": "security"
27
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "id": "quoted-value-into-config",
3
+ "why": "Every output format needs its own escaper, as HTML does: a value with a quote in it rewrites the config around it.",
4
+ "rule": ".claude/rules/root-on-other-machines.md",
5
+ "globs": [
6
+ "**/*.ts",
7
+ "**/*.mjs"
8
+ ],
9
+ "exclude": [
10
+ "**/tests/**",
11
+ "**/test/**",
12
+ "**/*.test.*",
13
+ "**/*.spec.*",
14
+ "**/e2e/**",
15
+ "**/node_modules/**",
16
+ "**/dist/**",
17
+ "**/build/**",
18
+ "**/.next/**"
19
+ ],
20
+ "pattern": "`[^`\\n]*\"\\$\\{(?!esc|quote|validate|sanitize|JSON)[\\w.!\\[\\]]+\\}\"[^`\\n]*;?`",
21
+ "bad": "lines.push(`add_header ${h.name} \"${h.value}\" always;`);",
22
+ "good": "lines.push(`add_header ${token(h.name)} ${quoted(h.value)} always;`);",
23
+ "kind": "security"
24
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "id": "secret-on-argv",
3
+ "why": "A command line is visible to everyone on the box.",
4
+ "rule": ".claude/rules/root-on-other-machines.md",
5
+ "globs": [
6
+ "**/*.ts",
7
+ "**/*.js",
8
+ "**/*.mjs",
9
+ "**/*.cjs",
10
+ "**/*.go"
11
+ ],
12
+ "exclude": [
13
+ "**/tests/**",
14
+ "**/test/**",
15
+ "**/*.test.*",
16
+ "**/*.spec.*",
17
+ "**/e2e/**",
18
+ "**/node_modules/**",
19
+ "**/dist/**",
20
+ "**/build/**",
21
+ "**/.next/**"
22
+ ],
23
+ "pattern": "['\"]-p['\"]\\s*,\\s*\\w*(?:pass|pwd)\\w*|--password[= ]\\$|\\bpwd:\\s*\\\\?\"\\$\\{|PASSWORD '\\$\\{|--api-key\\s+'?\\$\\{",
24
+ "bad": "await exec(id, ['mongosh', '-u', 'admin', '-p', adminPass]);",
25
+ "good": "await exec(id, ['mongosh', '--file', '/run/secrets/init.js']);",
26
+ "flags": "i",
27
+ "kind": "security"
28
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "id": "ssh-verifies-host-key",
3
+ "why": "An SSH connection with no host key check trusts whoever answers.",
4
+ "rule": ".claude/rules/root-on-other-machines.md",
5
+ "globs": [
6
+ "**/*.ts",
7
+ "**/*.js",
8
+ "**/*.mjs",
9
+ "**/*.cjs",
10
+ "**/*.go"
11
+ ],
12
+ "exclude": [
13
+ "**/tests/**",
14
+ "**/test/**",
15
+ "**/*.test.*",
16
+ "**/*.spec.*",
17
+ "**/e2e/**",
18
+ "**/node_modules/**",
19
+ "**/dist/**",
20
+ "**/build/**",
21
+ "**/.next/**"
22
+ ],
23
+ "pattern": "\\.connect\\(\\{\\s*host\\b(?:(?!hostVerifier)[\\s\\S]){0,400}?\\}\\)",
24
+ "bad": "conn.connect({ host, port, username, password });",
25
+ "good": "conn.connect({ host, port, username, password, hostVerifier: pinned(host) });",
26
+ "kind": "security"
27
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "id": "system-file-written-in-place",
3
+ "why": "A crash between two steps must not leave things worse than before: write a temp file, validate, rename.",
4
+ "rule": ".claude/rules/root-on-other-machines.md",
5
+ "globs": [
6
+ "**/*.ts",
7
+ "**/*.js",
8
+ "**/*.mjs",
9
+ "**/*.cjs",
10
+ "**/*.go"
11
+ ],
12
+ "exclude": [
13
+ "**/tests/**",
14
+ "**/test/**",
15
+ "**/*.test.*",
16
+ "**/*.spec.*",
17
+ "**/e2e/**",
18
+ "**/node_modules/**",
19
+ "**/dist/**",
20
+ "**/build/**",
21
+ "**/.next/**"
22
+ ],
23
+ "pattern": "(?:writeFile|writeFileSync)\\(\\s*[`'\"]/etc/|os\\.WriteFile\\(\\s*(?:\"/etc/|filepath\\.Join\\(\"/etc/)",
24
+ "bad": "await writeFile('/etc/bind/named.conf', conf, 'utf-8');",
25
+ "good": "await writeFile(tmp, conf);\nawait rename(tmp, '/etc/bind/named.conf');"
26
+ }