@thedecipherist/claude-packs 0.0.0-stage → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +754 -0
- package/LICENSE +21 -0
- package/README.md +573 -2
- package/bin/claude-packs.mjs +212 -0
- package/configurations/base/config.json +85 -0
- package/configurations/cpp/config.json +93 -0
- package/configurations/full-stack/config.json +153 -0
- package/configurations/go/config.json +98 -0
- package/configurations/node/config.json +102 -0
- package/configurations/python/config.json +99 -0
- package/configurations/rust/config.json +106 -0
- package/configurations/synth-creator/config.json +148 -0
- package/global/hooks/gnu-shell.mjs +131 -0
- package/global/hooks/lib/shell-writes.mjs +2 -0
- package/global/hooks/shell-traps.mjs +79 -0
- package/global/hooks/version-pin-guard.mjs +280 -0
- package/global/skills/latest-versions/SKILL.md +49 -0
- package/lib/backup.mjs +34 -0
- package/lib/build-queue.mjs +22 -0
- package/lib/claude-md.mjs +60 -0
- package/lib/config-cli.mjs +36 -0
- package/lib/configs.mjs +145 -0
- package/lib/coverage.mjs +94 -0
- package/lib/custom-packs.mjs +93 -0
- package/lib/doctor.mjs +126 -0
- package/lib/fix-plan.mjs +72 -0
- package/lib/found-folders.mjs +25 -0
- package/lib/git-tokens.mjs +64 -0
- package/lib/global.mjs +125 -0
- package/lib/hook-proof.mjs +45 -0
- package/lib/hook-timing.mjs +42 -0
- package/lib/hover-gate.mjs +29 -0
- package/lib/kit-command.mjs +14 -0
- package/lib/kit-lock.mjs +149 -0
- package/lib/layout.mjs +99 -0
- package/lib/logs.mjs +109 -0
- package/lib/manifest.mjs +24 -0
- package/lib/new.mjs +49 -0
- package/lib/once-only-report.mjs +54 -0
- package/lib/pack-manifest.mjs +20 -0
- package/lib/packs.mjs +109 -0
- package/lib/planner.mjs +59 -0
- package/lib/repeats.mjs +65 -0
- package/lib/repo-weight.mjs +28 -0
- package/lib/rule-tests.mjs +42 -0
- package/lib/rules.mjs +40 -0
- package/lib/scan-detect.mjs +130 -0
- package/lib/scan.mjs +171 -0
- package/lib/selftest-cache.mjs +39 -0
- package/lib/settings.mjs +138 -0
- package/lib/shape-cli.mjs +76 -0
- package/lib/shape.mjs +4 -0
- package/lib/suggest.mjs +31 -0
- package/lib/switches.mjs +44 -0
- package/lib/symmetry-doctor.mjs +26 -0
- package/lib/sync.mjs +133 -0
- package/lib/workorder.mjs +26 -0
- package/package.json +34 -4
- package/packs/ai/checks/boundary-computes-its-own-hash.json +30 -0
- package/packs/ai/checks/model-call-needs-boundary.json +29 -0
- package/packs/ai/checks/model-id-from-config.json +28 -0
- package/packs/ai/checks/model-output-validated.json +26 -0
- package/packs/ai/pack.json +38 -0
- package/packs/ai/rules/ai-input-sha-boundary.md +31 -0
- package/packs/ai/rules/llm-pipeline-security.md +26 -0
- package/packs/audio-core/checks/denormals-not-in-prepare.json +12 -0
- package/packs/audio-core/checks/dsp-without-apvts.json +12 -0
- package/packs/audio-core/checks/float-phase-or-rate.json +12 -0
- package/packs/audio-core/checks/juce-snap-to-zero-off.json +12 -0
- package/packs/audio-core/checks/keep-werror.json +12 -0
- package/packs/audio-core/checks/no-fast-math.json +14 -0
- package/packs/audio-core/checks/no-locale-change.json +12 -0
- package/packs/audio-core/checks/no-march-native.json +14 -0
- package/packs/audio-core/clang-tidy +28 -0
- package/packs/audio-core/hooks/lib/realtime-checks.mjs +56 -0
- package/packs/audio-core/hooks/param-id-lock.mjs +172 -0
- package/packs/audio-core/hooks/realtime-guard.mjs +67 -0
- package/packs/audio-core/pack.json +192 -0
- package/packs/audio-core/rules/a-control-is-proved-through-its-input.md +26 -0
- package/packs/audio-core/rules/audio-thread-realtime-safe.md +27 -0
- package/packs/audio-core/rules/audio-ui-thread-handoff.md +21 -0
- package/packs/audio-core/rules/boundary-tests-cross-the-boundary.md +16 -0
- package/packs/audio-core/rules/build-flags-safe.md +20 -0
- package/packs/audio-core/rules/cached-parameter-pointers.md +28 -0
- package/packs/audio-core/rules/clang-tidy-core-guidelines.md +21 -0
- package/packs/audio-core/rules/control-reaches-every-surface.md +23 -0
- package/packs/audio-core/rules/cpu-worst-case-per-block.md +28 -0
- package/packs/audio-core/rules/dc-block-after-asymmetry.md +22 -0
- package/packs/audio-core/rules/discrete-params-snap.md +19 -0
- package/packs/audio-core/rules/double-where-precision-matters.md +20 -0
- package/packs/audio-core/rules/filters-stable-under-modulation.md +29 -0
- package/packs/audio-core/rules/host-parameters-at-scale.md +24 -0
- package/packs/audio-core/rules/house-control-behaviours.md +34 -0
- package/packs/audio-core/rules/math-domain-guards.md +19 -0
- package/packs/audio-core/rules/modulated-delay-interpolation.md +22 -0
- package/packs/audio-core/rules/multiband-phase-coherent.md +22 -0
- package/packs/audio-core/rules/nonlinear-stages-antialiased.md +28 -0
- package/packs/audio-core/rules/note-ledger-and-pedals.md +22 -0
- package/packs/audio-core/rules/one-formula-per-value.md +20 -0
- package/packs/audio-core/rules/optimisations-are-null-tested.md +23 -0
- package/packs/audio-core/rules/oscillators-bandlimited.md +23 -0
- package/packs/audio-core/rules/output-limiter.md +23 -0
- package/packs/audio-core/rules/parameter-ids-never-change.md +20 -0
- package/packs/audio-core/rules/params-and-state-thread-safe.md +19 -0
- package/packs/audio-core/rules/params-snapshot-per-block.md +21 -0
- package/packs/audio-core/rules/patch-excludes-performance-controls.md +18 -0
- package/packs/audio-core/rules/per-sample-code-inlinable.md +22 -0
- package/packs/audio-core/rules/prepare-is-repeatable.md +23 -0
- package/packs/audio-core/rules/recursive-state-nan-guard.md +20 -0
- package/packs/audio-core/rules/reverb-loop-gain-bounded.md +24 -0
- package/packs/audio-core/rules/sample-accurate-midi.md +22 -0
- package/packs/audio-core/rules/sample-rate-and-block-size-from-host.md +23 -0
- package/packs/audio-core/rules/scoped-no-denormals.md +26 -0
- package/packs/audio-core/rules/smooth-continuous-parameters.md +22 -0
- package/packs/audio-core/rules/state-load-versioned-and-safe.md +22 -0
- package/packs/audio-core/rules/straight-on-and-aligned.md +21 -0
- package/packs/audio-core/rules/ui-matches-reference-look.md +23 -0
- package/packs/audio-core/rules/undo-one-gesture-one-step.md +21 -0
- package/packs/audio-core/rules/voice-steal-fades.md +21 -0
- package/packs/audio-core/rules/voice-sum-headroom.md +20 -0
- package/packs/audio-core/skills/analyse-reference-look/SKILL.md +35 -0
- package/packs/audio-core/skills/copy-and-prove/SKILL.md +98 -0
- package/packs/audio-core/skills/juce-realtime-audit/SKILL.md +22 -0
- package/packs/audio-core/skills/measure-tone/SKILL.md +20 -0
- package/packs/audio-core/skills/new-panel-control/SKILL.md +15 -0
- package/packs/audio-core/skills/prove-control/SKILL.md +25 -0
- package/packs/audio-core/skills/trace-parameter/SKILL.md +29 -0
- package/packs/audio-core/tools/lib/spectrum.mjs +112 -0
- package/packs/audio-core/tools/lib/wav.mjs +41 -0
- package/packs/audio-core/tools/tone-report.mjs +47 -0
- package/packs/base/checks/field-map-over-if-runs.json +25 -0
- package/packs/base/checks/lookup-over-if-chains.json +25 -0
- package/packs/base/checks/lookup-over-ternary-chains.json +20 -0
- package/packs/base/checks/no-code-after-midline-comment.json +12 -0
- package/packs/base/checks/one-walk-per-template.json +23 -0
- package/packs/base/checks/stub-reports-success.json +31 -0
- package/packs/base/checks/test-skip-on-failed-setup.json +17 -0
- package/packs/base/hooks/brief-guard.mjs +96 -0
- package/packs/base/hooks/code-shape.mjs +99 -0
- package/packs/base/hooks/dispatch-once.mjs +124 -0
- package/packs/base/hooks/file-size-guard.mjs +61 -0
- package/packs/base/hooks/folder-law.mjs +77 -0
- package/packs/base/hooks/git-guard.mjs +202 -0
- package/packs/base/hooks/lesson-checks.mjs +182 -0
- package/packs/base/hooks/lib/apply-edit.mjs +20 -0
- package/packs/base/hooks/lib/code-shapes.mjs +142 -0
- package/packs/base/hooks/lib/content.mjs +14 -0
- package/packs/base/hooks/lib/cpp-scan.mjs +94 -0
- package/packs/base/hooks/lib/crash-policy.mjs +47 -0
- package/packs/base/hooks/lib/dup-index.mjs +204 -0
- package/packs/base/hooks/lib/dup.mjs +127 -0
- package/packs/base/hooks/lib/elements.mjs +87 -0
- package/packs/base/hooks/lib/event-log.mjs +68 -0
- package/packs/base/hooks/lib/function-shapes.mjs +90 -0
- package/packs/base/hooks/lib/git-adds.mjs +21 -0
- package/packs/base/hooks/lib/git-auth.mjs +44 -0
- package/packs/base/hooks/lib/git-guard-selftest.mjs +192 -0
- package/packs/base/hooks/lib/glob.mjs +33 -0
- package/packs/base/hooks/lib/hook-log.mjs +100 -0
- package/packs/base/hooks/lib/house.py +77 -0
- package/packs/base/hooks/lib/languages.mjs +69 -0
- package/packs/base/hooks/lib/layout.mjs +58 -0
- package/packs/base/hooks/lib/making-check-selftest.mjs +112 -0
- package/packs/base/hooks/lib/near-copies.mjs +76 -0
- package/packs/base/hooks/lib/program-read.mjs +199 -0
- package/packs/base/hooks/lib/program-writes.mjs +177 -0
- package/packs/base/hooks/lib/project.mjs +81 -0
- package/packs/base/hooks/lib/prose.mjs +11 -0
- package/packs/base/hooks/lib/pushed.mjs +201 -0
- package/packs/base/hooks/lib/repo-index.mjs +52 -0
- package/packs/base/hooks/lib/rust-scan.mjs +139 -0
- package/packs/base/hooks/lib/secret-patterns.mjs +18 -0
- package/packs/base/hooks/lib/selftest.mjs +45 -0
- package/packs/base/hooks/lib/shape-code.mjs +126 -0
- package/packs/base/hooks/lib/shape-lists.mjs +31 -0
- package/packs/base/hooks/lib/shape-prose.mjs +78 -0
- package/packs/base/hooks/lib/shape.mjs +273 -0
- package/packs/base/hooks/lib/shell-writes-selftest.mjs +65 -0
- package/packs/base/hooks/lib/shell-writes.mjs +293 -0
- package/packs/base/hooks/lib/turn.mjs +86 -0
- package/packs/base/hooks/lib/unread-writes.mjs +24 -0
- package/packs/base/hooks/lib/writes.mjs +71 -0
- package/packs/base/hooks/making-check.mjs +248 -0
- package/packs/base/hooks/making.mjs +106 -0
- package/packs/base/hooks/once-only.mjs +150 -0
- package/packs/base/hooks/placement-law.mjs +84 -0
- package/packs/base/hooks/repo-litter.mjs +75 -0
- package/packs/base/hooks/reuse-hint.mjs +75 -0
- package/packs/base/hooks/run-hooks.mjs +140 -0
- package/packs/base/hooks/secrets-guard.mjs +99 -0
- package/packs/base/hooks/shape-law.mjs +140 -0
- package/packs/base/hooks/suite-once.mjs +96 -0
- package/packs/base/hooks/template-law.mjs +148 -0
- package/packs/base/hooks/untrusted-boundary.mjs +53 -0
- package/packs/base/pack.json +214 -0
- package/packs/base/rules/a-control-is-seen-to-fire.md +27 -0
- package/packs/base/rules/behaviour-lives-with-its-kind.md +51 -0
- package/packs/base/rules/bug-fix-starts-red.md +25 -0
- package/packs/base/rules/field-map-over-if-runs.md +47 -0
- package/packs/base/rules/finished-work-lands.md +17 -0
- package/packs/base/rules/git-right-first-time.md +19 -0
- package/packs/base/rules/instances-by-index-identities-by-id.md +54 -0
- package/packs/base/rules/lookup-over-if-chains.md +49 -0
- package/packs/base/rules/making-line-first.md +14 -0
- package/packs/base/rules/open-items-tagged.md +17 -0
- package/packs/base/rules/plan-and-logs.md +22 -0
- package/packs/base/rules/references-use-anchors.md +19 -0
- package/packs/base/rules/refusals-are-judged.md +19 -0
- package/packs/base/rules/reuse-before-writing.md +15 -0
- package/packs/base/rules/secrets-never-committed.md +16 -0
- package/packs/base/rules/skill-writing.md +23 -0
- package/packs/base/rules/split-before-the-limit.md +14 -0
- package/packs/base/rules/subagent-dispatch.md +26 -0
- package/packs/base/rules/test-only-what-changed.md +17 -0
- package/packs/base/rules/test-the-template-once.md +23 -0
- package/packs/base/rules/unattended-runs.md +15 -0
- package/packs/base/rules/untrusted-content-boundary.md +15 -0
- package/packs/base/skills/add-lesson-check/SKILL.md +26 -0
- package/packs/base/skills/fix-from-scan/SKILL.md +25 -0
- package/packs/base/skills/land-branch/SKILL.md +24 -0
- package/packs/base/skills/make-it-a-template/SKILL.md +23 -0
- package/packs/base/skills/new-project/SKILL.md +23 -0
- package/packs/base/skills/pdf-to-md/SKILL.md +25 -0
- package/packs/base/skills/pick-tests/SKILL.md +20 -0
- package/packs/base/skills/pressure-test-skill/SKILL.md +23 -0
- package/packs/base/skills/prove-instances-identical/SKILL.md +37 -0
- package/packs/base/skills/write-a-workorder/SKILL.md +41 -0
- package/packs/base/tools/shape-symmetry-selftest.mjs +66 -0
- package/packs/base/tools/shape-symmetry.mjs +178 -0
- package/packs/base/tools/test-verdict.mjs +75 -0
- package/packs/ci/checks/ci-permissions-stated.json +18 -0
- package/packs/ci/checks/ci-tools-pinned.json +14 -0
- package/packs/ci/pack.json +21 -0
- package/packs/ci/rules/ci-covers-what-ships.md +20 -0
- package/packs/ci/rules/generated-files-have-no-diff.md +15 -0
- package/packs/content-site/checks/captcha-is-not-constant.json +27 -0
- package/packs/content-site/checks/img-has-size.json +20 -0
- package/packs/content-site/checks/page-head-complete.json +26 -0
- package/packs/content-site/pack.json +22 -0
- package/packs/content-site/rules/content-has-one-source.md +23 -0
- package/packs/content-site/rules/media-is-sized.md +24 -0
- package/packs/content-site/rules/page-head-is-complete.md +26 -0
- package/packs/content-site/rules/public-forms-are-defended.md +27 -0
- package/packs/content-site/skills/publish-a-page/SKILL.md +21 -0
- package/packs/cpp/checks/cpp-clamp-before-cast.json +16 -0
- package/packs/cpp/checks/cpp-find-with-the-library.json +12 -0
- package/packs/cpp/checks/cpp-hardened-test-build.json +18 -0
- package/packs/cpp/checks/cpp-m-pi-not-standard.json +23 -0
- package/packs/cpp/checks/cpp-no-atoi.json +16 -0
- package/packs/cpp/checks/cpp-no-const-cast.json +16 -0
- package/packs/cpp/checks/cpp-no-float-loop-counter.json +16 -0
- package/packs/cpp/checks/cpp-no-getenv-in-product.json +22 -0
- package/packs/cpp/checks/cpp-no-mutable-global.json +20 -0
- package/packs/cpp/checks/cpp-no-mutable-local-static.json +23 -0
- package/packs/cpp/checks/cpp-no-unchecked-fwrite.json +17 -0
- package/packs/cpp/checks/cpp-no-using-namespace-in-header.json +19 -0
- package/packs/cpp/checks/cpp-no-zero-size-array.json +23 -0
- package/packs/cpp/checks/cpp-numbers-pi.json +16 -0
- package/packs/cpp/pack.json +22 -0
- package/packs/cpp/rules/cpp-absent-and-failed-are-types.md +24 -0
- package/packs/cpp/rules/cpp-builds-everywhere.md +26 -0
- package/packs/cpp/rules/cpp-faults-only-in-the-test-build.md +21 -0
- package/packs/cpp/rules/cpp-find-with-the-library.md +19 -0
- package/packs/cpp/rules/cpp-gates-share-one-reader.md +22 -0
- package/packs/cpp/rules/cpp-headers-declare.md +22 -0
- package/packs/cpp/rules/cpp-numbers-and-casts.md +22 -0
- package/packs/cpp/rules/cpp-repeats-become-templates.md +33 -0
- package/packs/cpp/rules/cpp-static-analysis-runs.md +22 -0
- package/packs/cpp/rules/cpp-thread-contracts-are-code.md +23 -0
- package/packs/cpp/skills/cpp-extract-template/SKILL.md +38 -0
- package/packs/docker/checks/alpine-with-native-build.json +13 -0
- package/packs/docker/checks/compose-db-needs-auth.json +14 -0
- package/packs/docker/checks/compose-image-pinned.json +14 -0
- package/packs/docker/checks/compose-no-hardcoded-ip.json +12 -0
- package/packs/docker/checks/compose-no-host-bind-for-data.json +18 -0
- package/packs/docker/checks/compose-no-plaintext-secret.json +13 -0
- package/packs/docker/checks/compose-no-swarm-ignored-keys.json +13 -0
- package/packs/docker/checks/compose-overlay-not-bridge.json +13 -0
- package/packs/docker/checks/compose-service-needs-healthcheck.json +11 -0
- package/packs/docker/checks/compose-service-needs-init.json +11 -0
- package/packs/docker/checks/copy-needs-chown-with-user.json +17 -0
- package/packs/docker/checks/copy-source-before-deps.json +13 -0
- package/packs/docker/checks/docker-exec-form.json +16 -0
- package/packs/docker/checks/dockerfile-needs-healthcheck.json +17 -0
- package/packs/docker/checks/dockerfile-needs-user.json +21 -0
- package/packs/docker/checks/dockerignore-has-the-basics.json +21 -0
- package/packs/docker/checks/gitattributes-forces-lf.json +17 -0
- package/packs/docker/checks/health-checks-nothing.json +25 -0
- package/packs/docker/checks/no-crlf-in-scripts.json +15 -0
- package/packs/docker/checks/no-latest-base.json +13 -0
- package/packs/docker/checks/no-secret-in-image.json +13 -0
- package/packs/docker/checks/no-sensitive-file-copy.json +13 -0
- package/packs/docker/checks/node-env-before-install.json +13 -0
- package/packs/docker/checks/npm-ci-not-install.json +13 -0
- package/packs/docker/pack.json +46 -0
- package/packs/docker/rules/compose-pinned-and-closed.md +21 -0
- package/packs/docker/rules/compose-swarm-safe.md +26 -0
- package/packs/docker/rules/docker-exec-form.md +19 -0
- package/packs/docker/rules/dockerfile-multistage.md +13 -0
- package/packs/docker/rules/dockerfile-production.md +25 -0
- package/packs/docker/skills/docker-diagnose/SKILL.md +23 -0
- package/packs/dynamic-data/checks/draft-on-the-server.json +27 -0
- package/packs/dynamic-data/checks/guard-does-its-job.json +28 -0
- package/packs/dynamic-data/checks/key-is-not-a-display-name.json +28 -0
- package/packs/dynamic-data/checks/no-code-from-data.json +29 -0
- package/packs/dynamic-data/checks/no-collection-from-request.json +27 -0
- package/packs/dynamic-data/checks/no-pipeline-from-stored-text.json +27 -0
- package/packs/dynamic-data/checks/no-regexp-from-stored-config.json +27 -0
- package/packs/dynamic-data/checks/no-template-from-stored-text.json +27 -0
- package/packs/dynamic-data/checks/save-takes-named-paths.json +27 -0
- package/packs/dynamic-data/pack.json +23 -0
- package/packs/dynamic-data/rules/a-list-is-a-saved-query.md +23 -0
- package/packs/dynamic-data/rules/definitions-are-validated-data.md +24 -0
- package/packs/dynamic-data/rules/every-dynamic-surface-has-a-boundary.md +29 -0
- package/packs/dynamic-data/rules/fields-have-owners.md +22 -0
- package/packs/dynamic-data/rules/imports-drop-nothing.md +26 -0
- package/packs/dynamic-data/rules/one-definition-many-surfaces.md +24 -0
- package/packs/dynamic-data/rules/one-fact-one-place.md +28 -0
- package/packs/dynamic-data/rules/rules-live-in-the-engine.md +29 -0
- package/packs/dynamic-data/rules/saves-are-patches.md +28 -0
- package/packs/dynamic-data/rules/tenant-costs-one-document.md +22 -0
- package/packs/dynamic-data/skills/design-a-definition/SKILL.md +24 -0
- package/packs/fastify/checks/api-routes-versioned.json +28 -0
- package/packs/fastify/checks/cookie-host-prefix.json +24 -0
- package/packs/fastify/checks/hijack-needs-try.json +28 -0
- package/packs/fastify/checks/no-cast-at-route-boundary.json +24 -0
- package/packs/fastify/checks/no-db-in-route-file.json +28 -0
- package/packs/fastify/checks/no-err-message-to-client.json +24 -0
- package/packs/fastify/checks/no-regexp-from-input.json +24 -0
- package/packs/fastify/checks/no-trust-proxy-true.json +25 -0
- package/packs/fastify/checks/one-error-body.json +26 -0
- package/packs/fastify/checks/origin-from-config-not-host.json +31 -0
- package/packs/fastify/checks/password-needs-slow-hash.json +30 -0
- package/packs/fastify/checks/sec-headers-present.json +28 -0
- package/packs/fastify/checks/secrets-compared-constant-time.json +24 -0
- package/packs/fastify/checks/sse-needs-error-listener.json +28 -0
- package/packs/fastify/checks/user-bytes-need-disposition.json +29 -0
- package/packs/fastify/pack.json +41 -0
- package/packs/fastify/rules/credentials-and-input.md +23 -0
- package/packs/fastify/rules/security-one-switch.md +28 -0
- package/packs/fastify/rules/streams-and-hijacks.md +22 -0
- package/packs/fastify/rules/tests-use-inject.md +13 -0
- package/packs/fastify/rules/three-layers.md +20 -0
- package/packs/fastify/rules/trust-config-not-headers.md +24 -0
- package/packs/full-stack/checks/no-express-no-vite.json +23 -0
- package/packs/full-stack/hooks/stack-guard.mjs +90 -0
- package/packs/full-stack/pack.json +76 -0
- package/packs/full-stack/rules/stack-is-fastify-and-nextjs.md +20 -0
- package/packs/go/checks/go-exec-result-ignored.json +15 -0
- package/packs/go/checks/go-unmarshal-error-ignored.json +15 -0
- package/packs/go/pack.json +26 -0
- package/packs/go/rules/go-errors-are-handled.md +22 -0
- package/packs/gpu-painter/checks/dawn-backends-and-validation.json +9 -0
- package/packs/gpu-painter/checks/dawn-no-spontaneous.json +10 -0
- package/packs/gpu-painter/checks/dawn-present-on-render-thread.json +17 -0
- package/packs/gpu-painter/checks/gpu-no-frame-stalls.json +12 -0
- package/packs/gpu-painter/checks/no-opengl-link.json +11 -0
- package/packs/gpu-painter/checks/no-opengl.json +13 -0
- package/packs/gpu-painter/hooks/browser-guard.py +196 -0
- package/packs/gpu-painter/pack.json +91 -0
- package/packs/gpu-painter/rules/dawn-build-and-shaders.md +27 -0
- package/packs/gpu-painter/rules/dawn-device-and-render-thread.md +26 -0
- package/packs/gpu-painter/rules/gpu-antialiasing.md +20 -0
- package/packs/gpu-painter/rules/gpu-blend-order.md +22 -0
- package/packs/gpu-painter/rules/gpu-bloom.md +20 -0
- package/packs/gpu-painter/rules/gpu-frame-budget.md +25 -0
- package/packs/gpu-painter/rules/gpu-frame-pacing-and-power.md +27 -0
- package/packs/gpu-painter/rules/gpu-frame-work.md +30 -0
- package/packs/gpu-painter/rules/gpu-golden-images.md +21 -0
- package/packs/gpu-painter/rules/gpu-hdr-and-tonemap.md +23 -0
- package/packs/gpu-painter/rules/gpu-picking-on-cpu.md +19 -0
- package/packs/gpu-painter/rules/gpu-render-lifecycle.md +25 -0
- package/packs/gpu-painter/rules/gpu-text-atlas.md +24 -0
- package/packs/gpu-painter/rules/gpu-travellers-from-snapshot.md +24 -0
- package/packs/gpu-painter/rules/hover-every-pressable.md +25 -0
- package/packs/gpu-painter/skills/gpu-capture/SKILL.md +15 -0
- package/packs/gpu-painter/skills/gpu-frame-bench/SKILL.md +14 -0
- package/packs/gpu-painter/skills/gpu-golden-check/SKILL.md +13 -0
- package/packs/gpu-painter/skills/gpu-golden-update/SKILL.md +16 -0
- package/packs/gpu-painter/skills/gpu-lifecycle-stress/SKILL.md +15 -0
- package/packs/gpu-painter/skills/hover-state/SKILL.md +33 -0
- package/packs/hook-proof/checks/hook-catch-must-not-allow.json +16 -0
- package/packs/hook-proof/checks/hook-command-no-pipe.json +16 -0
- package/packs/hook-proof/checks/hook-exit-1-does-not-block.json +17 -0
- package/packs/hook-proof/checks/hook-no-or-true.json +18 -0
- package/packs/hook-proof/checks/hook-refusal-on-stderr.json +17 -0
- package/packs/hook-proof/pack.json +38 -0
- package/packs/hook-proof/rules/a-refusal-is-exit-2.md +28 -0
- package/packs/hook-proof/skills/prove-a-hook/SKILL.md +21 -0
- package/packs/host-agent/checks/file-path-from-param.json +27 -0
- package/packs/host-agent/checks/integrity-check-optional.json +27 -0
- package/packs/host-agent/checks/quoted-value-into-config.json +24 -0
- package/packs/host-agent/checks/secret-on-argv.json +28 -0
- package/packs/host-agent/checks/ssh-verifies-host-key.json +27 -0
- package/packs/host-agent/checks/system-file-written-in-place.json +26 -0
- package/packs/host-agent/checks/tmp-path-predictable.json +27 -0
- package/packs/host-agent/pack.json +22 -0
- package/packs/host-agent/rules/root-on-other-machines.md +27 -0
- package/packs/html-ui/checks/email-html-escapes.json +25 -0
- package/packs/html-ui/checks/external-link-rel.json +21 -0
- package/packs/html-ui/checks/no-duplicate-escape.json +26 -0
- package/packs/html-ui/checks/no-inline-client-script.json +21 -0
- package/packs/html-ui/checks/no-inline-style.json +23 -0
- package/packs/html-ui/pack.json +33 -0
- package/packs/html-ui/rules/email-html-escapes.md +19 -0
- package/packs/html-ui/rules/server-html-escapes-everything.md +22 -0
- package/packs/http-api/checks/api-path-versioned.json +31 -0
- package/packs/http-api/checks/authz-from-request-body.json +26 -0
- package/packs/http-api/checks/client-calls-a-version.json +28 -0
- package/packs/http-api/checks/client-ip-not-leftmost-xff.json +28 -0
- package/packs/http-api/checks/cors-needs-origin.json +26 -0
- package/packs/http-api/checks/csp-not-switched-off.json +28 -0
- package/packs/http-api/checks/debug-route-not-shipped.json +26 -0
- package/packs/http-api/checks/encrypted-name-plaintext-value.json +26 -0
- package/packs/http-api/checks/err-text-stays-server-side.json +27 -0
- package/packs/http-api/checks/failure-is-not-empty.json +28 -0
- package/packs/http-api/checks/gate-is-not-a-todo.json +27 -0
- package/packs/http-api/checks/guard-fails-open.json +28 -0
- package/packs/http-api/checks/hmac-over-reserialised-body.json +26 -0
- package/packs/http-api/checks/jwt-verify-pins-algorithm.json +26 -0
- package/packs/http-api/checks/middleware-skips-without-user.json +26 -0
- package/packs/http-api/checks/next-api-route-versioned.json +47 -0
- package/packs/http-api/checks/no-security-off-switch.json +28 -0
- package/packs/http-api/checks/oauth-state-signed.json +26 -0
- package/packs/http-api/checks/one-time-code-compared-raw.json +26 -0
- package/packs/http-api/checks/query-cast-is-not-validation.json +28 -0
- package/packs/http-api/checks/queue-action-from-client.json +26 -0
- package/packs/http-api/checks/rate-limit-one-module.json +28 -0
- package/packs/http-api/checks/role-checked-in-one-guard.json +27 -0
- package/packs/http-api/checks/route-body-needs-schema.json +31 -0
- package/packs/http-api/checks/route-scopes-to-the-caller.json +31 -0
- package/packs/http-api/checks/secret-compared-constant-time-any.json +28 -0
- package/packs/http-api/checks/secret-in-job-record.json +27 -0
- package/packs/http-api/checks/server-fetches-tenant-url.json +30 -0
- package/packs/http-api/checks/short-code-needs-limit.json +26 -0
- package/packs/http-api/checks/user-url-through-safe-fetch.json +28 -0
- package/packs/http-api/checks/webhook-dedupes-event-id.json +30 -0
- package/packs/http-api/pack.json +45 -0
- package/packs/http-api/rules/adapters-one-db-gateway.md +18 -0
- package/packs/http-api/rules/apis-are-versioned.md +27 -0
- package/packs/http-api/rules/credentials-handled-safely.md +22 -0
- package/packs/http-api/rules/handlers-own-the-work.md +17 -0
- package/packs/http-api/rules/health-and-correlation.md +17 -0
- package/packs/http-api/rules/one-error-contract.md +17 -0
- package/packs/http-api/rules/routes-are-thin.md +17 -0
- package/packs/http-api/rules/routes-scope-to-the-caller.md +26 -0
- package/packs/http-api/rules/routes-validate-and-answer.md +25 -0
- package/packs/http-api/skills/change-an-api/SKILL.md +20 -0
- package/packs/http-api/skills/secure-a-route/SKILL.md +21 -0
- package/packs/instrument-shell/checks/no-raw-struct-blob.json +23 -0
- package/packs/instrument-shell/pack.json +22 -0
- package/packs/instrument-shell/rules/fold-keeps-every-route.md +24 -0
- package/packs/instrument-shell/rules/quiet-announces-itself.md +22 -0
- package/packs/instrument-shell/rules/render-the-extremes.md +25 -0
- package/packs/instrument-shell/rules/seams-are-declared.md +27 -0
- package/packs/instrument-shell/rules/session-blob-append-only.md +25 -0
- package/packs/instrument-shell/skills/gates-from-commit-one/SKILL.md +20 -0
- package/packs/instrument-shell/skills/hit-the-painted-control/SKILL.md +18 -0
- package/packs/js-ts/checks/async-callback-unguarded.json +26 -0
- package/packs/js-ts/checks/background-loop-needs-stop.json +28 -0
- package/packs/js-ts/checks/child-process-error-handler.json +28 -0
- package/packs/js-ts/checks/entry-registers-shutdown.json +31 -0
- package/packs/js-ts/checks/fetch-needs-timeout.json +30 -0
- package/packs/js-ts/checks/job-only-in-memory.json +28 -0
- package/packs/js-ts/checks/json-only-through-helper.json +29 -0
- package/packs/js-ts/checks/line-under-200-chars.json +34 -0
- package/packs/js-ts/checks/localhost-default-in-server.json +29 -0
- package/packs/js-ts/checks/no-any.json +27 -0
- package/packs/js-ts/checks/no-cast-escape-hatches.json +24 -0
- package/packs/js-ts/checks/no-console-in-app.json +31 -0
- package/packs/js-ts/checks/no-dynamic-import-node-builtin.json +25 -0
- package/packs/js-ts/checks/no-inline-binary.json +20 -0
- package/packs/js-ts/checks/no-inline-zod-outside-schemas.json +27 -0
- package/packs/js-ts/checks/no-local-sleep.json +25 -0
- package/packs/js-ts/checks/no-nested-ternary.json +20 -0
- package/packs/js-ts/checks/no-secret-in-log.json +24 -0
- package/packs/js-ts/checks/no-shell-string-interpolation.json +24 -0
- package/packs/js-ts/checks/no-swallowed-errors.json +25 -0
- package/packs/js-ts/checks/no-ts-enum.json +20 -0
- package/packs/js-ts/checks/process-env-only-in-config.json +31 -0
- package/packs/js-ts/checks/race-leaves-work-running.json +23 -0
- package/packs/js-ts/checks/reject-as-catch-all-exists.json +24 -0
- package/packs/js-ts/checks/secret-has-no-fallback.json +24 -0
- package/packs/js-ts/checks/secret-needs-crypto-random.json +24 -0
- package/packs/js-ts/checks/server-close-awaited.json +27 -0
- package/packs/js-ts/checks/session-user-typed-once.json +24 -0
- package/packs/js-ts/checks/switch-is-a-table.json +24 -0
- package/packs/js-ts/checks/test-imports-the-source.json +19 -0
- package/packs/js-ts/checks/test-name-says-behaviour.json +16 -0
- package/packs/js-ts/checks/tsconfig-flags.json +21 -0
- package/packs/js-ts/checks/void-needs-catch.json +24 -0
- package/packs/js-ts/checks/zod-string-needs-max.json +25 -0
- package/packs/js-ts/checks/zod-v4-formats.json +23 -0
- package/packs/js-ts/pack.json +84 -0
- package/packs/js-ts/rules/await-handled-at-a-boundary.md +66 -0
- package/packs/js-ts/rules/env-through-config.md +36 -0
- package/packs/js-ts/rules/errors-never-swallowed.md +33 -0
- package/packs/js-ts/rules/files-under-300-lines.md +18 -0
- package/packs/js-ts/rules/guard-clauses-over-nesting.md +34 -0
- package/packs/js-ts/rules/js-repeats-become-templates.md +26 -0
- package/packs/js-ts/rules/json-only-through-one-helper.md +62 -0
- package/packs/js-ts/rules/named-constants-not-magic-numbers.md +34 -0
- package/packs/js-ts/rules/no-any.md +34 -0
- package/packs/js-ts/rules/no-console.md +30 -0
- package/packs/js-ts/rules/no-floating-promises.md +31 -0
- package/packs/js-ts/rules/no-param-mutation.md +28 -0
- package/packs/js-ts/rules/no-unsafe-assertions.md +30 -0
- package/packs/js-ts/rules/one-logger.md +24 -0
- package/packs/js-ts/rules/outbound-calls-have-a-limit.md +20 -0
- package/packs/js-ts/rules/parallel-independent-awaits.md +29 -0
- package/packs/js-ts/rules/process-lifecycle.md +47 -0
- package/packs/js-ts/rules/schema-single-source-of-truth.md +36 -0
- package/packs/js-ts/rules/secrets-stay-secret.md +22 -0
- package/packs/js-ts/rules/small-functions.md +20 -0
- package/packs/js-ts/rules/test-names-describe-behavior.md +28 -0
- package/packs/js-ts/rules/tests-can-fail.md +19 -0
- package/packs/js-ts/rules/tsconfig-strict.md +32 -0
- package/packs/js-ts/rules/typed-exports.md +27 -0
- package/packs/js-ts/rules/types-once-at-the-edge.md +18 -0
- package/packs/js-ts/rules/unions-over-enums.md +29 -0
- package/packs/js-ts/rules/zod-at-route-boundaries.md +40 -0
- package/packs/midi/checks/active-sensing-no-pulse.json +24 -0
- package/packs/midi/checks/clock-not-at-sample-zero.json +23 -0
- package/packs/midi/checks/midi-realtime-first.json +27 -0
- package/packs/midi/checks/no-tempo-writeback.json +23 -0
- package/packs/midi/checks/position-not-integrated.json +29 -0
- package/packs/midi/checks/stub-playhead-advances.json +27 -0
- package/packs/midi/checks/sysex-length-literal.json +23 -0
- package/packs/midi/checks/sysex-not-on-audio.json +24 -0
- package/packs/midi/checks/sysex-survives-realtime.json +27 -0
- package/packs/midi/pack.json +22 -0
- package/packs/midi/rules/clock-is-a-pulse-stream.md +30 -0
- package/packs/midi/rules/imports-count-every-loss.md +25 -0
- package/packs/midi/rules/measure-the-clock-in-audio.md +30 -0
- package/packs/midi/rules/sync-is-a-mode.md +29 -0
- package/packs/midi/rules/sysex-is-a-record.md +29 -0
- package/packs/midi/skills/clock-probe/SKILL.md +23 -0
- package/packs/midi/skills/clock-probe/clock-law.md +417 -0
- package/packs/midi/skills/does-it-sync/SKILL.md +19 -0
- package/packs/mongo/checks/bulk-over-many.json +28 -0
- package/packs/mongo/checks/created-at-immutable.json +25 -0
- package/packs/mongo/checks/driver-outside-gateway.json +24 -0
- package/packs/mongo/checks/key-lookup-is-hashed.json +24 -0
- package/packs/mongo/checks/mongoclient-cached-and-named.json +34 -0
- package/packs/mongo/checks/mongoclient-outside-gateway.json +24 -0
- package/packs/mongo/checks/no-count-plus-one-ids.json +25 -0
- package/packs/mongo/checks/no-db-write-in-loop.json +25 -0
- package/packs/mongo/checks/no-drop-in-code.json +27 -0
- package/packs/mongo/checks/no-empty-deletemany.json +26 -0
- package/packs/mongo/checks/no-find-reads.json +26 -0
- package/packs/mongo/checks/no-input-spread-into-write.json +24 -0
- package/packs/mongo/checks/no-mongoose.json +23 -0
- package/packs/mongo/checks/no-negation-delete.json +26 -0
- package/packs/mongo/checks/no-non-null-after-findone.json +25 -0
- package/packs/mongo/checks/objectid-equals.json +26 -0
- package/packs/mongo/checks/update-then-reread.json +24 -0
- package/packs/mongo/checks/watch-not-poll.json +25 -0
- package/packs/mongo/pack.json +52 -0
- package/packs/mongo/rules/deletes-name-what-dies.md +21 -0
- package/packs/mongo/rules/driver-only-in-gateway.md +26 -0
- package/packs/mongo/rules/keys-hashed-input-picked.md +21 -0
- package/packs/mongo/rules/one-client-one-pool.md +32 -0
- package/packs/mongo/rules/reads-aggregate-writes-bulk.md +25 -0
- package/packs/mongo/rules/writes-are-atomic.md +27 -0
- package/packs/multi-tenant/checks/role-sees-all-tenants.json +26 -0
- package/packs/multi-tenant/checks/tenant-filter-from-url.json +25 -0
- package/packs/multi-tenant/pack.json +22 -0
- package/packs/multi-tenant/rules/no-role-crosses-a-tenant.md +21 -0
- package/packs/multi-tenant/skills/prove-tenant-isolation/SKILL.md +19 -0
- package/packs/nginx/checks/modsec-no-blanket-off.json +16 -0
- package/packs/nginx/checks/nginx-csp-no-unsafe.json +15 -0
- package/packs/nginx/checks/nginx-headers-always.json +15 -0
- package/packs/nginx/checks/nginx-keepalive-http11.json +20 -0
- package/packs/nginx/checks/nginx-logs-to-stdout.json +15 -0
- package/packs/nginx/checks/nginx-no-crlf.json +17 -0
- package/packs/nginx/checks/nginx-resolver-ttl.json +19 -0
- package/packs/nginx/pack.json +43 -0
- package/packs/nginx/rules/modsecurity-tuning.md +22 -0
- package/packs/nginx/rules/nginx-production.md +26 -0
- package/packs/nginx/skills/waf-rollout/SKILL.md +20 -0
- package/packs/postgres/checks/pg-bind-values.json +33 -0
- package/packs/postgres/checks/pg-concurrently-in-txn.json +18 -0
- package/packs/postgres/checks/pg-fk-not-valid.json +18 -0
- package/packs/postgres/checks/pg-index-concurrently.json +18 -0
- package/packs/postgres/checks/pg-no-float-money.json +19 -0
- package/packs/postgres/checks/pg-no-money.json +18 -0
- package/packs/postgres/checks/pg-no-required-column.json +18 -0
- package/packs/postgres/checks/pg-no-volatile-default.json +18 -0
- package/packs/postgres/checks/pg-not-exists.json +18 -0
- package/packs/postgres/checks/pg-timestamptz.json +18 -0
- package/packs/postgres/hooks/db-wipe-guard.mjs +95 -0
- package/packs/postgres/pack.json +48 -0
- package/packs/postgres/rules/postgres-migrations-never-stop-traffic.md +28 -0
- package/packs/postgres/rules/postgres-one-pool-per-process.md +21 -0
- package/packs/postgres/rules/postgres-queries-are-null-safe-and-bounded.md +26 -0
- package/packs/postgres/rules/postgres-types-say-what-they-hold.md +22 -0
- package/packs/postgres/rules/postgres-values-are-bound.md +130 -0
- package/packs/postgres/skills/postgres-safe-migration/SKILL.md +45 -0
- package/packs/python/checks/py-no-bare-except.json +18 -0
- package/packs/python/checks/py-no-eval.json +18 -0
- package/packs/python/checks/py-no-mutable-default.json +18 -0
- package/packs/python/checks/py-no-shell-true.json +18 -0
- package/packs/python/checks/py-no-star-import.json +18 -0
- package/packs/python/checks/py-no-swallowed-exception.json +18 -0
- package/packs/python/checks/py-none-by-is.json +18 -0
- package/packs/python/checks/py-open-with-with.json +18 -0
- package/packs/python/checks/py-requests-timeout.json +18 -0
- package/packs/python/checks/py-subprocess-output-checked.json +18 -0
- package/packs/python/checks/py-yaml-safe-load.json +18 -0
- package/packs/python/pack.json +26 -0
- package/packs/python/rules/python-errors-and-resources.md +26 -0
- package/packs/python/rules/python-repeats-become-templates.md +27 -0
- package/packs/python/skills/python-extract-template/SKILL.md +35 -0
- package/packs/react/checks/dialog-needs-role.json +28 -0
- package/packs/react/checks/effect-not-for-derived-state.json +24 -0
- package/packs/react/checks/icon-button-needs-name.json +24 -0
- package/packs/react/checks/label-needs-a-field.json +24 -0
- package/packs/react/checks/ui-failed-fetch-says-so.json +23 -0
- package/packs/react/checks/ui-ok-branch-has-an-else.json +23 -0
- package/packs/react/pack.json +20 -0
- package/packs/react/rules/react-accessible-controls.md +20 -0
- package/packs/react/rules/react-state-and-effects.md +23 -0
- package/packs/reverse-engineering/checks/ear-constant-tagged.json +23 -0
- package/packs/reverse-engineering/checks/no-default-on-distrust.json +24 -0
- package/packs/reverse-engineering/checks/no-rom-table-literal.json +29 -0
- package/packs/reverse-engineering/checks/prose-never-decides.json +22 -0
- package/packs/reverse-engineering/hooks/firmware-out-of-git.mjs +49 -0
- package/packs/reverse-engineering/pack.json +35 -0
- package/packs/reverse-engineering/rules/a-negative-names-what-was-scanned.md +19 -0
- package/packs/reverse-engineering/rules/account-every-term.md +20 -0
- package/packs/reverse-engineering/rules/addresses-name-their-space.md +22 -0
- package/packs/reverse-engineering/rules/every-law-has-a-source.md +18 -0
- package/packs/reverse-engineering/rules/findings-are-withdrawn-in-place.md +17 -0
- package/packs/reverse-engineering/rules/firmware-stays-out.md +18 -0
- package/packs/reverse-engineering/rules/names-before-code.md +19 -0
- package/packs/reverse-engineering/rules/reproduction-or-original.md +18 -0
- package/packs/reverse-engineering/rules/two-sources-before-naming.md +21 -0
- package/packs/reverse-engineering/skills/bank-census/SKILL.md +18 -0
- package/packs/reverse-engineering/skills/gather-sources/SKILL.md +22 -0
- package/packs/reverse-engineering/skills/menu-map/SKILL.md +28 -0
- package/packs/reverse-engineering/skills/names-first/SKILL.md +41 -0
- package/packs/reverse-engineering/skills/re-deliverables/SKILL.md +21 -0
- package/packs/reverse-engineering/skills/tripwire-the-law/SKILL.md +19 -0
- package/packs/reverse-engineering/tools/lib/unwrap.mjs +115 -0
- package/packs/reverse-engineering/tools/names-sweep.mjs +264 -0
- package/packs/rust/checks/rust-allow-needs-reason.json +16 -0
- package/packs/rust/checks/rust-blocking-in-async.json +32 -0
- package/packs/rust/checks/rust-if-chain-is-a-match.json +32 -0
- package/packs/rust/checks/rust-static-mut.json +32 -0
- package/packs/rust/checks/rust-string-as-error.json +34 -0
- package/packs/rust/checks/rust-stub-left-in.json +32 -0
- package/packs/rust/checks/rust-unsafe-needs-safety.json +31 -0
- package/packs/rust/checks/rust-unwrap-in-library.json +34 -0
- package/packs/rust/checks/rust-wildcard-dependency.json +16 -0
- package/packs/rust/clippy.toml +5 -0
- package/packs/rust/pack.json +27 -0
- package/packs/rust/rules/rust-async-never-blocks.md +20 -0
- package/packs/rust/rules/rust-borrow-before-you-clone.md +19 -0
- package/packs/rust/rules/rust-errors-are-returned.md +22 -0
- package/packs/rust/rules/rust-lints-are-the-gate.md +23 -0
- package/packs/rust/rules/rust-repeats-become-templates.md +28 -0
- package/packs/rust/rules/rust-unsafe-is-proved.md +21 -0
- package/packs/rust/skills/rust-extract-template/SKILL.md +50 -0
- package/packs/rust/skills/rust-port/SKILL.md +22 -0
- package/packs/rust/skills/rust-review/SKILL.md +24 -0
- package/packs/rust/tools/rust-lints.toml +19 -0
- package/packs/shell/checks/sh-mktemp.json +18 -0
- package/packs/shell/checks/sh-no-backticks.json +18 -0
- package/packs/shell/checks/sh-no-eval.json +18 -0
- package/packs/shell/checks/sh-no-parse-ls.json +18 -0
- package/packs/shell/checks/sh-no-pipe-to-shell.json +18 -0
- package/packs/shell/checks/sh-no-program-in-heredoc.json +18 -0
- package/packs/shell/checks/sh-quote-arguments.json +18 -0
- package/packs/shell/checks/sh-rm-guarded.json +18 -0
- package/packs/shell/checks/sh-strict-mode.json +20 -0
- package/packs/shell/pack.json +28 -0
- package/packs/shell/rules/shell-repeats-become-templates.md +23 -0
- package/packs/shell/rules/shell-strict-and-quoted.md +27 -0
- package/packs/shell/skills/shell-extract-template/SKILL.md +32 -0
- package/packs/shell-hooks/checks/gnu-only-in-shell.json +18 -0
- package/packs/shell-hooks/checks/hook-command-anchored.json +12 -0
- package/packs/shell-hooks/checks/hook-json-by-tool.json +18 -0
- package/packs/shell-hooks/checks/no-bash-c-with-variable.json +20 -0
- package/packs/shell-hooks/pack.json +36 -0
- package/packs/shell-hooks/rules/hooks-portable-anchored-quoted.md +26 -0
- package/packs/sound-design/checks/audio-seed-fixed.json +23 -0
- package/packs/sound-design/checks/mix-is-a-crossfade.json +30 -0
- package/packs/sound-design/checks/no-hash-in-the-signal.json +30 -0
- package/packs/sound-design/checks/no-literal-key-anchor.json +30 -0
- package/packs/sound-design/checks/test-compares-a-function-with-itself.json +22 -0
- package/packs/sound-design/pack.json +22 -0
- package/packs/sound-design/rules/algorithms-are-data.md +26 -0
- package/packs/sound-design/rules/meter-before-engine.md +27 -0
- package/packs/sound-design/rules/neutral-is-exact.md +26 -0
- package/packs/sound-design/rules/test-off-the-easy-point.md +28 -0
- package/packs/sound-design/rules/unreachable-is-said.md +25 -0
- package/packs/sound-design/rules/waveforms-and-octaves.md +24 -0
- package/packs/sound-design/skills/bounce-a-plugin/SKILL.md +40 -0
- package/packs/sound-design/skills/choose-observable/SKILL.md +18 -0
- package/packs/sound-design/skills/measure-a-law/SKILL.md +18 -0
- package/packs/sound-design/skills/measure-reverb/SKILL.md +19 -0
- package/packs/sound-design/skills/spread-probe/SKILL.md +18 -0
- package/packs/sound-design/tools/vst3host/build.sh +73 -0
- package/packs/sound-design/tools/vst3host/host_events.h +101 -0
- package/packs/sound-design/tools/vst3host/options.h +172 -0
- package/packs/sound-design/tools/vst3host/render.cpp +245 -0
- package/packs/sound-design/tools/vst3host/session.h +241 -0
- package/packs/stellix/checks/no-keyboard-focus.json +12 -0
- package/packs/stellix/checks/one-seeded-random.json +16 -0
- package/packs/stellix/checks/world-never-includes-painter.json +12 -0
- package/packs/stellix/checks/world-no-libm.json +15 -0
- package/packs/stellix/checks/world-no-unordered.json +10 -0
- package/packs/stellix/hooks/no-shipped-images.mjs +88 -0
- package/packs/stellix/pack.json +61 -0
- package/packs/stellix/rules/stellix-deterministic-world.md +29 -0
- package/packs/stellix/rules/stellix-reset-generated.md +24 -0
- package/packs/stellix/rules/stellix-world-snapshot.md +27 -0
- package/packs/stellix/rules/world-continuous-collision.md +26 -0
- package/packs/stellix/rules/world-fp-determinism.md +28 -0
- package/packs/stored-text/checks/no-raw-html-from-data.json +31 -0
- package/packs/stored-text/checks/stored-text-libs-only-in-renderer.json +31 -0
- package/packs/stored-text/checks/stored-text-renderer-complete.json +24 -0
- package/packs/stored-text/checks/stored-text-through-renderer.json +25 -0
- package/packs/stored-text/pack.json +41 -0
- package/packs/stored-text/rules/stored-text-renders-once.md +26 -0
- package/packs/stored-text/skills/render-stored-text/SKILL.md +24 -0
- package/packs/synth-creator/checks/timing-from-synthcore.json +24 -0
- package/packs/synth-creator/checks/ui-drawn-in-code.json +23 -0
- package/packs/synth-creator/hooks/build-guard.mjs +232 -0
- package/packs/synth-creator/hooks/build-sweep.mjs +166 -0
- package/packs/synth-creator/hooks/frozen-files.mjs +63 -0
- package/packs/synth-creator/hooks/idle-wake.mjs +90 -0
- package/packs/synth-creator/hooks/protect-vendor.mjs +175 -0
- package/packs/synth-creator/hooks/spec-lock.mjs +117 -0
- package/packs/synth-creator/hooks/stage-guard.mjs +50 -0
- package/packs/synth-creator/hooks/time-guard.mjs +292 -0
- package/packs/synth-creator/hooks/user-asks.mjs +165 -0
- package/packs/synth-creator/pack.json +136 -0
- package/packs/synth-creator/rules/copy-trees-read-only.md +25 -0
- package/packs/synth-creator/rules/debug-by-measurement.md +20 -0
- package/packs/synth-creator/rules/done-means-fresh-evidence.md +18 -0
- package/packs/synth-creator/rules/hooks-and-gates.md +21 -0
- package/packs/synth-creator/rules/long-work-in-the-background.md +16 -0
- package/packs/synth-creator/rules/timing-from-synthcore.md +16 -0
- package/packs/synth-creator/skills/build-step/SKILL.md +125 -0
- package/packs/synth-creator/skills/build-through-the-queue/SKILL.md +21 -0
- package/packs/synth-creator/tools/buildq.mjs +74 -0
- package/packs/synth-creator/tools/freeze.mjs +36 -0
- package/packs/tui/checks/tui-entry-restores-terminal.json +27 -0
- package/packs/tui/checks/tui-gates-on-tty.json +25 -0
- package/packs/tui/checks/tui-no-ris-reset.json +22 -0
- package/packs/tui/checks/tui-resize-listener-removed.json +26 -0
- package/packs/tui/checks/tui-width-is-state.json +33 -0
- package/packs/tui/pack.json +44 -0
- package/packs/tui/rules/tui-resize-and-screen.md +25 -0
- package/packs/tui/skills/build-tui/SKILL.md +21 -0
- package/packs/ui-craft/checks/ui-input-needs-autocomplete.json +23 -0
- package/packs/ui-craft/checks/ui-intl-for-dates.json +21 -0
- package/packs/ui-craft/checks/ui-no-ai-palette.json +22 -0
- package/packs/ui-craft/checks/ui-no-animate-layout.json +22 -0
- package/packs/ui-craft/checks/ui-no-assistant-palette.json +23 -0
- package/packs/ui-craft/checks/ui-no-bounce-easing.json +22 -0
- package/packs/ui-craft/checks/ui-no-custom-cursor.json +22 -0
- package/packs/ui-craft/checks/ui-no-emoji-as-ui.json +22 -0
- package/packs/ui-craft/checks/ui-no-empty-image.json +21 -0
- package/packs/ui-craft/checks/ui-no-eyebrow.json +21 -0
- package/packs/ui-craft/checks/ui-no-furniture-text.json +22 -0
- package/packs/ui-craft/checks/ui-no-gradient-text.json +22 -0
- package/packs/ui-craft/checks/ui-no-index-numbering.json +21 -0
- package/packs/ui-craft/checks/ui-no-lorem.json +22 -0
- package/packs/ui-craft/checks/ui-no-marketing-buzzword.json +22 -0
- package/packs/ui-craft/checks/ui-no-paste-block.json +21 -0
- package/packs/ui-craft/checks/ui-no-placeholder-names.json +21 -0
- package/packs/ui-craft/checks/ui-no-scroll-hijack.json +21 -0
- package/packs/ui-craft/checks/ui-no-side-tab.json +21 -0
- package/packs/ui-craft/checks/ui-no-stock-labels.json +22 -0
- package/packs/ui-craft/checks/ui-no-transition-all.json +22 -0
- package/packs/ui-craft/checks/ui-no-uppercase-table-header.json +21 -0
- package/packs/ui-craft/checks/ui-no-zebra-rows.json +22 -0
- package/packs/ui-craft/checks/ui-no-zoom-lock.json +21 -0
- package/packs/ui-craft/pack.json +43 -0
- package/packs/ui-craft/rules/apps-are-not-pages.md +26 -0
- package/packs/ui-craft/rules/data-tells-the-truth.md +26 -0
- package/packs/ui-craft/rules/dates-and-numbers.md +18 -0
- package/packs/ui-craft/rules/forms-never-fight.md +22 -0
- package/packs/ui-craft/rules/interface-copy.md +26 -0
- package/packs/ui-craft/rules/motion-is-rare.md +31 -0
- package/packs/ui-craft/rules/no-generated-look.md +37 -0
- package/packs/ui-craft/rules/page-holds-its-frame.md +28 -0
- package/packs/ui-craft/rules/page-proved-rendered.md +19 -0
- package/packs/ui-craft/rules/pictures-do-a-job.md +25 -0
- package/packs/ui-craft/rules/pointer-feedback.md +28 -0
- package/packs/ui-craft/rules/screen-answers-one-question.md +24 -0
- package/packs/ui-craft/rules/survives-real-data.md +23 -0
- package/packs/ui-craft/rules/touch-and-small-screens.md +19 -0
- package/packs/ui-craft/rules/type-space-colour.md +26 -0
- package/packs/ui-craft/rules/url-holds-the-state.md +19 -0
- package/packs/ui-craft/skills/app-screen/SKILL.md +33 -0
- package/packs/ui-craft/skills/build-from-reference/SKILL.md +28 -0
- package/packs/ui-craft/skills/chart-choice/SKILL.md +34 -0
- package/packs/ui-craft/skills/hover-state/SKILL.md +28 -0
- package/packs/ui-craft/skills/page-critique/SKILL.md +33 -0
- package/packs/ui-craft/skills/prove-page/SKILL.md +23 -0
- package/packs/ui-craft/skills/redesign-page/SKILL.md +19 -0
- package/packs/ui-craft/skills/ui-code-review/SKILL.md +22 -0
- package/packs/ui-craft/skills/write-the-page/SKILL.md +21 -0
- package/packs/ui-craft/tools/page-measure.mjs +41 -0
- package/packs/web/checks/a11y-img-needs-alt.json +26 -0
- package/packs/web/checks/a11y-no-bare-outline-none.json +21 -0
- package/packs/web/checks/a11y-no-clickable-div.json +26 -0
- package/packs/web/checks/a11y-no-positive-tabindex.json +26 -0
- package/packs/web/checks/client-no-api-key.json +29 -0
- package/packs/web/checks/client-no-browser-global-at-module-scope.json +28 -0
- package/packs/web/checks/client-no-server-import.json +31 -0
- package/packs/web/checks/client-no-window-location-nav.json +28 -0
- package/packs/web/checks/css-no-inline-style.json +30 -0
- package/packs/web/checks/ds-pages-compose-primitives.json +28 -0
- package/packs/web/checks/key-from-index.json +23 -0
- package/packs/web/checks/prodbuild-no-cdn-runtime-deps.json +21 -0
- package/packs/web/checks/prodbuild-no-dev-flags.json +21 -0
- package/packs/web/checks/prodbuild-no-remote-fonts.json +22 -0
- package/packs/web/checks/rcss-button-cursor.json +30 -0
- package/packs/web/checks/rcss-no-100vw.json +21 -0
- package/packs/web/checks/rcss-no-fixed-wide-width.json +21 -0
- package/packs/web/checks/rcss-viewport-meta.json +28 -0
- package/packs/web/checks/secret-not-in-web-storage.json +25 -0
- package/packs/web/checks/tw-no-raw-hex-in-markup.json +34 -0
- package/packs/web/checks/wp-hero-not-lazy.json +27 -0
- package/packs/web/checks/wp-img-needs-dimensions.json +26 -0
- package/packs/web/pack.json +73 -0
- package/packs/web/rules/accessibility.md +26 -0
- package/packs/web/rules/client-boundaries.md +23 -0
- package/packs/web/rules/production-build.md +22 -0
- package/packs/web/rules/secrets-not-in-the-browser.md +18 -0
- package/packs/web/rules/styles-live-in-stylesheets.md +23 -0
- package/packs/web/rules/tailwind-v4.md +23 -0
- package/packs/web/rules/ui-primitives-one-module.md +30 -0
- package/packs/web/rules/web-performance.md +21 -0
- package/packs/web/skills/design-direction/SKILL.md +30 -0
- package/packs/web/skills/design-review/SKILL.md +28 -0
- package/packs/web/skills/pick-rendering-mode/SKILL.md +21 -0
- package/packs/web/skills/preflight-build/SKILL.md +23 -0
- package/packs/web/skills/seo-audit/SKILL.md +22 -0
- package/packs/websocket/checks/no-token-in-query.json +26 -0
- package/packs/websocket/checks/stale-socket-deletes-new-entry.json +25 -0
- package/packs/websocket/checks/ws-identity-from-message.json +26 -0
- package/packs/websocket/pack.json +21 -0
- package/packs/websocket/rules/identity-comes-from-the-connection.md +24 -0
- package/packs/writing/checks/ascii-no-em-dash.json +17 -0
- package/packs/writing/checks/no-copula-dodging.json +18 -0
- package/packs/writing/checks/no-dramatic-colon.json +18 -0
- package/packs/writing/checks/no-not-x-but-y.json +18 -0
- package/packs/writing/checks/no-participial-opener.json +18 -0
- package/packs/writing/checks/no-pseudo-wisdom.json +18 -0
- package/packs/writing/checks/no-slop-words.json +18 -0
- package/packs/writing/checks/no-stock-connectors.json +18 -0
- package/packs/writing/checks/no-time-or-date.json +27 -0
- package/packs/writing/checks/no-trailing-ing.json +18 -0
- package/packs/writing/checks/no-vague-attribution.json +18 -0
- package/packs/writing/pack.json +43 -0
- package/packs/writing/rules/ascii-no-em-dash.md +21 -0
- package/packs/writing/rules/cut-the-padding.md +20 -0
- package/packs/writing/rules/direct-voice.md +22 -0
- package/packs/writing/rules/no-cargo-cult.md +16 -0
- package/packs/writing/rules/no-scaffolding.md +19 -0
- package/packs/writing/rules/no-stock-language.md +27 -0
- package/packs/writing/rules/no-time-or-date.md +18 -0
- package/packs/writing/rules/rhythm-like-talk.md +20 -0
- package/packs/writing/rules/write-from-your-own-corner.md +20 -0
- package/packs/writing/skills/argument-post/SKILL.md +28 -0
- package/packs/writing/skills/humanize/SKILL.md +28 -0
- package/packs/writing/skills/launch-post/SKILL.md +38 -0
- package/packs/writing/skills/pick-subreddit/SKILL.md +69 -0
- package/packs/writing/skills/post-voice/SKILL.md +22 -0
- package/packs/writing/skills/reddit-post/SKILL.md +63 -0
- package/packs/writing/skills/reddit-title/SKILL.md +23 -0
- package/packs/writing/skills/reply-moves/SKILL.md +40 -0
- package/packs/writing/skills/reply-stance/SKILL.md +23 -0
- package/packs/writing/skills/should-i-reply/SKILL.md +21 -0
- package/packs/zod/hooks/schemas-only.mjs +53 -0
- package/packs/zod/pack.json +44 -0
- package/packs/zod/rules/env-shapes-only.md +14 -0
- package/packs/zod/rules/zod-4-schemas.md +14 -0
- package/profiles/stellix.layout.json +315 -0
- package/profiles/sub37.layout.json +247 -0
- package/prompts/scan-review.md +40 -0
- package/prompts/survey.md +82 -0
- package/prompts/workorder/PROMPT.md +53 -0
- package/prompts/workorder/run.sh +36 -0
- package/prompts/workorder/workorder.md +59 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
# concepts: shell
|
|
3
|
+
paths:
|
|
4
|
+
- "placeholder"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Shell fails loudly and quotes everything
|
|
8
|
+
|
|
9
|
+
<constraints>
|
|
10
|
+
Always do:
|
|
11
|
+
- Start a script with `set -euo pipefail`. A file that is only sourced leaves that to its caller.
|
|
12
|
+
- Quote every expansion: `"$file"`, `"${list[@]}"`.
|
|
13
|
+
- Use `$(...)`, never backticks.
|
|
14
|
+
- Guard a variable in a delete: `rm -rf "${dir:?}/build"`.
|
|
15
|
+
- Make a temp file with `mktemp`, and remove it with `trap`.
|
|
16
|
+
- Stop what you start: after `child &`, `trap 'kill "$pid" 2>/dev/null' EXIT INT TERM`.
|
|
17
|
+
- Keep a program in its own file: a script that needs Python or Node calls a file, which can be linted and tested.
|
|
18
|
+
- Run `shellcheck` where the project has it.
|
|
19
|
+
|
|
20
|
+
Never do:
|
|
21
|
+
- Use `eval`, or pipe a download into a shell.
|
|
22
|
+
- Parse `ls`: use a glob.
|
|
23
|
+
- Write to a fixed path in `/tmp`.
|
|
24
|
+
</constraints>
|
|
25
|
+
|
|
26
|
+
## Check
|
|
27
|
+
`sh-strict-mode`, `sh-no-backticks`, `sh-no-eval`, `sh-no-parse-ls`, `sh-rm-guarded`, `sh-quote-arguments`, `sh-no-pipe-to-shell`, `sh-mktemp`, `sh-no-program-in-heredoc`.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: shell-extract-template
|
|
3
|
+
description: Use when template-law refuses shell code, when scan lists repeated shell, or when copying a script to start another.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Extract a shell repeat into one template (one job: pick the shell form, and move every copy to it)
|
|
7
|
+
|
|
8
|
+
Follow `make-it-a-template`. This skill is its shell forms.
|
|
9
|
+
|
|
10
|
+
<constraints>
|
|
11
|
+
Always do:
|
|
12
|
+
1. A repeated block: one function in the shared file, what differs as its arguments, read into named locals.
|
|
13
|
+
```bash
|
|
14
|
+
wait_for_file() {
|
|
15
|
+
local file="$1" what="$2"
|
|
16
|
+
wingate_wait "$pid" "[ -s '$file' ]" || exit 1
|
|
17
|
+
[ -s "$file" ] || { echo "FAIL no $what" >&2; exit 1; }
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
2. One command with other arguments: a table and one loop.
|
|
21
|
+
```bash
|
|
22
|
+
rows=("a silent slot|PLANT_SILENT" "a dead key|PLANT_DEAD")
|
|
23
|
+
for row in "${rows[@]}"; do expect_fail "${row%%|*}" env "${row##*|}=1" "$gate"; done
|
|
24
|
+
```
|
|
25
|
+
3. Source the shared file by its own location, so it works from any folder: `. "$(dirname "$0")/lib.sh"`.
|
|
26
|
+
4. A program pasted into a heredoc: move it to its own file and call it.
|
|
27
|
+
5. Run the scripts the change reaches. Then search for the old block: none is left.
|
|
28
|
+
|
|
29
|
+
Never do:
|
|
30
|
+
- Pass values through globals when an argument will do.
|
|
31
|
+
- Use `eval` to make a function general.
|
|
32
|
+
</constraints>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "gnu-only-in-shell",
|
|
3
|
+
"why": "GNU-only: on macOS `date +%N` prints the literal N, sha1sum/stat -c/readlink -f do not exist, and the hook exits non-zero, which blocks every tool call. Use node -e for time, hashes and file stats.",
|
|
4
|
+
"rule": ".claude/rules/hooks-portable-anchored-quoted.md",
|
|
5
|
+
"concepts": [
|
|
6
|
+
"shell-hooks"
|
|
7
|
+
],
|
|
8
|
+
"globs": [
|
|
9
|
+
"**/*.sh"
|
|
10
|
+
],
|
|
11
|
+
"exclude": [
|
|
12
|
+
"**/node_modules/**"
|
|
13
|
+
],
|
|
14
|
+
"code": false,
|
|
15
|
+
"pattern": "\\bdate\\s+\\+\\S*%\\d*N|\\b(?:sha1|sha256|md5)sum\\b|\\bstat\\s+-c\\b|\\breadlink\\s+-f\\b|\\bsed\\s+-i\\s+(?!'')(?!\\\")[^\\s]",
|
|
16
|
+
"bad": "NOW=$(date +%s%3N)",
|
|
17
|
+
"good": "NOW=$(node -e 'console.log(Date.now())')\nH=$(node -e 'const c=require(\"node:crypto\");console.log(c.createHash(\"sha1\").update(process.argv[1]).digest(\"hex\").slice(0,12))' \"$DIR\")"
|
|
18
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "hook-command-anchored",
|
|
3
|
+
"why": "A relative hook command resolves only when Claude Code starts in one directory; from a subfolder or /cd it silently never runs. Anchor on $CLAUDE_PROJECT_DIR or an absolute path.",
|
|
4
|
+
"rule": ".claude/rules/hooks-portable-anchored-quoted.md",
|
|
5
|
+
"concepts": [
|
|
6
|
+
"hook-settings"
|
|
7
|
+
],
|
|
8
|
+
"code": false,
|
|
9
|
+
"pattern": "\\\"command\\\"\\s*:\\s*\\\"(?!(?:node|bash|sh|python3?|npx)\\s+\\\\?\\\"?(?:\\$CLAUDE_PROJECT_DIR|\\$HOME|~|/))(?!\\$CLAUDE_PROJECT_DIR|/|~)",
|
|
10
|
+
"bad": "\"command\": \"bash packages/channel/hooks/check-signal.sh\"",
|
|
11
|
+
"good": "\"command\": \"node \\\"$CLAUDE_PROJECT_DIR/.claude/hooks/check-signal.mjs\\\"\""
|
|
12
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "hook-json-by-tool",
|
|
3
|
+
"why": "printf-built JSON breaks on the first quote or backslash in a value and the consumer drops the line silently. Produce JSON with node -e or jq.",
|
|
4
|
+
"rule": ".claude/rules/hooks-portable-anchored-quoted.md",
|
|
5
|
+
"concepts": [
|
|
6
|
+
"shell-hooks"
|
|
7
|
+
],
|
|
8
|
+
"globs": [
|
|
9
|
+
"**/*.sh"
|
|
10
|
+
],
|
|
11
|
+
"exclude": [
|
|
12
|
+
"**/node_modules/**"
|
|
13
|
+
],
|
|
14
|
+
"code": false,
|
|
15
|
+
"pattern": "\\b(?:printf|echo)\\s+(?:-e\\s+)?['\\\"]\\s*\\{[^'\\\"]*\\\\?\\\"\\w+\\\\?\\\"\\s*:",
|
|
16
|
+
"bad": "printf '{\"decision\":\"block\",\"reason\":\"%s\"}' \"$1\"",
|
|
17
|
+
"good": "node -e 'console.log(JSON.stringify({ decision: \"block\", reason: process.argv[1] }))' \"$1\""
|
|
18
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "no-bash-c-with-variable",
|
|
3
|
+
"why": "bash -c with a string the project can edit runs whatever that file says; a gate command rewritten to `true` turns red green. Hash-pin the config or pass an argv array.",
|
|
4
|
+
"rule": ".claude/rules/hooks-portable-anchored-quoted.md",
|
|
5
|
+
"globs": [
|
|
6
|
+
"**/*.ts",
|
|
7
|
+
"**/*.js",
|
|
8
|
+
"**/*.mjs"
|
|
9
|
+
],
|
|
10
|
+
"exclude": [
|
|
11
|
+
"**/node_modules/**",
|
|
12
|
+
"**/dist/**",
|
|
13
|
+
"**/*.test.*",
|
|
14
|
+
"**/test/**"
|
|
15
|
+
],
|
|
16
|
+
"code": false,
|
|
17
|
+
"pattern": "\\bspawn(?:Sync)?\\s*\\(\\s*['\\\"](?:bash|sh|zsh)['\\\"]\\s*,\\s*\\[\\s*['\\\"]-c['\\\"]\\s*,\\s*(?!['\\\"`])[\\w.]+",
|
|
18
|
+
"bad": "const child = spawn('bash', ['-c', command], { cwd });",
|
|
19
|
+
"good": "const child = spawn(argv[0], argv.slice(1), { cwd });"
|
|
20
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "shell-hooks",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Shell and Node hooks for Claude Code: portable, anchored, quoted, one prelude, JSON by a tool.",
|
|
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/shell-hooks"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"hooks",
|
|
16
|
+
"shell"
|
|
17
|
+
],
|
|
18
|
+
"engines": {
|
|
19
|
+
"claude-packs": ">=0.19.0"
|
|
20
|
+
},
|
|
21
|
+
"folders": {},
|
|
22
|
+
"concepts": {
|
|
23
|
+
"shell-hooks": [
|
|
24
|
+
"**/hooks/**/*.sh",
|
|
25
|
+
"**/hooks/**/*.mjs",
|
|
26
|
+
"**/hooks/**/*.js",
|
|
27
|
+
"**/hooks/**/*.cjs"
|
|
28
|
+
],
|
|
29
|
+
"hook-settings": [
|
|
30
|
+
"**/.claude/settings.json",
|
|
31
|
+
"**/.claude/settings.local.json"
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
"skillsIn": null,
|
|
35
|
+
"hooks": {}
|
|
36
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
# concepts: shell-hooks, hook-settings
|
|
3
|
+
paths:
|
|
4
|
+
- "placeholder"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# A hook is portable, anchored, quoted, and fails open on its own bugs only
|
|
8
|
+
|
|
9
|
+
A PreToolUse hook that errors blocks **every** tool call. `date +%s%3N` prints the literal `3N` on macOS and the arithmetic that follows exits non-zero: one GNU-ism blocks the whole session on a Mac.
|
|
10
|
+
|
|
11
|
+
<constraints>
|
|
12
|
+
Always do:
|
|
13
|
+
- Time, hashes and JSON in a hook come from `node -e` (or the `.mjs` hook itself), never GNU-only binaries: no `date +%N`, `sha1sum`, `stat -c`, `readlink -f`, `sed -i` without a suffix (`gnu-only-in-shell`). Prefer `.mjs` hooks over `.sh` for anything beyond ten lines.
|
|
14
|
+
- JSON is produced by `node -e`/`jq`, never by `printf '{"a":"%s"}'` (`hook-json-by-tool`): an unescaped quote or backslash corrupts the line and the consumer drops it silently.
|
|
15
|
+
- Hook commands in `settings.json` are anchored: `node "$CLAUDE_PROJECT_DIR/.claude/hooks/x.mjs"`. A relative `bash packages/x/hooks/y.sh` resolves only from one cwd (`hook-command-anchored`).
|
|
16
|
+
- Shared logic (read stdin, find the marker, freshness test) lives in **one** `lib/` file that every hook imports or sources; a change to the marker format is one edit.
|
|
17
|
+
- Anything a hook spools to disk is written with mode 0600 and masked **before** it hits disk; the terminal prompt may contain a pasted token.
|
|
18
|
+
- Credentials come from one documented env var; a hook never searches `~/.claude.json`, a repo `.env` and the environment in turn.
|
|
19
|
+
- `--selftest` in every hook; the project test suite runs each hook's selftest and fires every hook at a sibling project path, which must never block (`never block other projects`).
|
|
20
|
+
- A hook that fails open says so in one comment at the top, and names what is unenforced during an outage.
|
|
21
|
+
|
|
22
|
+
Never do:
|
|
23
|
+
- `bash -c "${command}"` with a string the project (the executor) can edit; gates run from a hash-pinned config or argv arrays.
|
|
24
|
+
- Parse JSON with `grep -o '"key":"value"'` that depends on `JSON.stringify` key order; use `node -e` with `JSON.parse`.
|
|
25
|
+
- Rewrite `settings.local.json` on server boot; installers are explicit commands with a dry run.
|
|
26
|
+
</constraints>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "audio-seed-fixed",
|
|
3
|
+
"why": "An unseeded source makes two renders differ, and every measurement then carries noise.",
|
|
4
|
+
"rule": ".claude/rules/meter-before-engine.md",
|
|
5
|
+
"globs": [
|
|
6
|
+
"**/*.cpp",
|
|
7
|
+
"**/*.cc",
|
|
8
|
+
"**/*.h",
|
|
9
|
+
"**/*.hpp",
|
|
10
|
+
"**/*.mm"
|
|
11
|
+
],
|
|
12
|
+
"exclude": [
|
|
13
|
+
"**/build/**",
|
|
14
|
+
"**/out/**",
|
|
15
|
+
"**/_deps/**",
|
|
16
|
+
"**/JUCE/**",
|
|
17
|
+
"**/node_modules/**"
|
|
18
|
+
],
|
|
19
|
+
"pattern": "\\bstd::random_device\\b|\\bsrand\\s*\\(\\s*(?:std::)?time\\s*\\(|\\bjuce::Random::getSystemRandom\\s*\\(|\\bjuce::Random\\s+\\w+\\s*;",
|
|
20
|
+
"bad": "std::mt19937 rng{std::random_device{}()};",
|
|
21
|
+
"good": "std::mt19937 rng{kNoiseSeed};",
|
|
22
|
+
"code": true
|
|
23
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "mix-is-a-crossfade",
|
|
3
|
+
"why": "A mix that scales only the wet path is silent at 0%. It is a crossfade.",
|
|
4
|
+
"rule": ".claude/rules/neutral-is-exact.md",
|
|
5
|
+
"globs": [
|
|
6
|
+
"**/*.cpp",
|
|
7
|
+
"**/*.cc",
|
|
8
|
+
"**/*.h",
|
|
9
|
+
"**/*.hpp",
|
|
10
|
+
"**/*.mm"
|
|
11
|
+
],
|
|
12
|
+
"exclude": [
|
|
13
|
+
"**/build/**",
|
|
14
|
+
"**/out/**",
|
|
15
|
+
"**/_deps/**",
|
|
16
|
+
"**/JUCE/**",
|
|
17
|
+
"**/node_modules/**",
|
|
18
|
+
"**/tests/**",
|
|
19
|
+
"**/test/**",
|
|
20
|
+
"**/probes/**",
|
|
21
|
+
"**/gates/**",
|
|
22
|
+
"**/*_test.*",
|
|
23
|
+
"**/*.test.*"
|
|
24
|
+
],
|
|
25
|
+
"pattern": "=\\s*\\w*wet\\w*\\s*\\*\\s*\\w*mix\\w*\\s*;",
|
|
26
|
+
"bad": "out = wet * mix;",
|
|
27
|
+
"good": "out = dry * c + wet * s;",
|
|
28
|
+
"flags": "i",
|
|
29
|
+
"code": true
|
|
30
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "no-hash-in-the-signal",
|
|
3
|
+
"why": "A hash in the signal path invents a difference the machine does not have, and hides a missing law.",
|
|
4
|
+
"rule": ".claude/rules/neutral-is-exact.md",
|
|
5
|
+
"globs": [
|
|
6
|
+
"**/*.cpp",
|
|
7
|
+
"**/*.cc",
|
|
8
|
+
"**/*.h",
|
|
9
|
+
"**/*.hpp",
|
|
10
|
+
"**/*.mm"
|
|
11
|
+
],
|
|
12
|
+
"exclude": [
|
|
13
|
+
"**/build/**",
|
|
14
|
+
"**/out/**",
|
|
15
|
+
"**/_deps/**",
|
|
16
|
+
"**/JUCE/**",
|
|
17
|
+
"**/node_modules/**",
|
|
18
|
+
"**/tests/**",
|
|
19
|
+
"**/test/**",
|
|
20
|
+
"**/probes/**",
|
|
21
|
+
"**/gates/**",
|
|
22
|
+
"**/*_test.*",
|
|
23
|
+
"**/*.test.*"
|
|
24
|
+
],
|
|
25
|
+
"pattern": "(?:cut|res|gain|level|filter)\\w*\\s*[*+]?=[^;\\n]*\\bhash\\w*\\s*\\(",
|
|
26
|
+
"bad": "cutoff *= 0.7f + 0.6f * hash01 (id);",
|
|
27
|
+
"good": "cutoff *= zone.trim;",
|
|
28
|
+
"flags": "i",
|
|
29
|
+
"code": true
|
|
30
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "no-literal-key-anchor",
|
|
3
|
+
"why": "A hard-coded key anchor is zero exactly where everyone auditions, so a wrong law passes by ear. Name it, with its source.",
|
|
4
|
+
"rule": ".claude/rules/test-off-the-easy-point.md",
|
|
5
|
+
"globs": [
|
|
6
|
+
"**/*.cpp",
|
|
7
|
+
"**/*.cc",
|
|
8
|
+
"**/*.h",
|
|
9
|
+
"**/*.hpp",
|
|
10
|
+
"**/*.mm"
|
|
11
|
+
],
|
|
12
|
+
"exclude": [
|
|
13
|
+
"**/build/**",
|
|
14
|
+
"**/out/**",
|
|
15
|
+
"**/_deps/**",
|
|
16
|
+
"**/JUCE/**",
|
|
17
|
+
"**/node_modules/**",
|
|
18
|
+
"**/tests/**",
|
|
19
|
+
"**/test/**",
|
|
20
|
+
"**/probes/**",
|
|
21
|
+
"**/gates/**",
|
|
22
|
+
"**/*_test.*",
|
|
23
|
+
"**/*.test.*"
|
|
24
|
+
],
|
|
25
|
+
"pattern": "(?:cut|filter|key)\\w*[^;\\n]*\\(\\s*\\w*note\\w*\\s*-\\s*60(?:\\.0*f?)?\\s*\\)",
|
|
26
|
+
"bad": "cut += kt * (note - 60) / 12.0;",
|
|
27
|
+
"good": "cut += kt * (note - kKeyAnchor) / 12.0;",
|
|
28
|
+
"flags": "i",
|
|
29
|
+
"code": true
|
|
30
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "test-compares-a-function-with-itself",
|
|
3
|
+
"why": "A test that compares a function with itself passes by construction. Assert the printed value.",
|
|
4
|
+
"rule": ".claude/rules/test-off-the-easy-point.md",
|
|
5
|
+
"globs": [
|
|
6
|
+
"**/*.cpp",
|
|
7
|
+
"**/*.cc",
|
|
8
|
+
"**/*.h",
|
|
9
|
+
"**/*.hpp",
|
|
10
|
+
"**/*.mm"
|
|
11
|
+
],
|
|
12
|
+
"exclude": [
|
|
13
|
+
"**/build/**",
|
|
14
|
+
"**/out/**",
|
|
15
|
+
"**/_deps/**",
|
|
16
|
+
"**/JUCE/**",
|
|
17
|
+
"**/node_modules/**"
|
|
18
|
+
],
|
|
19
|
+
"pattern": "\\b(?:EXPECT_(?:EQ|NEAR|DOUBLE_EQ|FLOAT_EQ)|ASSERT_(?:EQ|NEAR)|expectWithinAbsoluteError|expectEquals)\\s*\\(\\s*([\\w:.]+)\\s*\\([^()]*\\)\\s*,\\s*\\1\\s*\\(",
|
|
20
|
+
"bad": "EXPECT_NEAR(cutoffHz(v), cutoffHz(v), 0.01);",
|
|
21
|
+
"good": "EXPECT_NEAR(cutoffHz(74), 987.8, 0.1);"
|
|
22
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "sound-design",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Sound that is proved by measuring audio: algorithms are data, neutral is exact, the meter is suspected before the engine, and tests sit off the easy point.",
|
|
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/sound-design"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"audio",
|
|
16
|
+
"dsp",
|
|
17
|
+
"sound-design"
|
|
18
|
+
],
|
|
19
|
+
"engines": {
|
|
20
|
+
"claude-packs": ">=0.28.0"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.cpp"
|
|
4
|
+
- "**/*.cc"
|
|
5
|
+
- "**/*.h"
|
|
6
|
+
- "**/*.hpp"
|
|
7
|
+
- "**/*.mm"
|
|
8
|
+
- "**/*.py"
|
|
9
|
+
- "**/*.ts"
|
|
10
|
+
- "**/*.js"
|
|
11
|
+
- "**/*.mjs"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# A machine's algorithm list is real only if each one is the right kind of effect
|
|
15
|
+
|
|
16
|
+
<constraints>
|
|
17
|
+
Always do:
|
|
18
|
+
- Make each algorithm a block graph, as data, run by one loop.
|
|
19
|
+
- Prove the kind by measuring: a delay delays, a comb combs, a filtered delay is filtered.
|
|
20
|
+
- Report spread per algorithm and across the bank, as medians, over 8 seconds or more, with log-spaced frames.
|
|
21
|
+
- Use the machine's own numbers: its stage count, its interval, its delay memory.
|
|
22
|
+
|
|
23
|
+
Never do:
|
|
24
|
+
- Pass a table test as proof. One unit had 15 algorithms on 1 DSP path, and another had 13 of 23 that were a wire.
|
|
25
|
+
- Build a family of effects on a single generic engine and call the list done.
|
|
26
|
+
</constraints>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.cpp"
|
|
4
|
+
- "**/*.cc"
|
|
5
|
+
- "**/*.h"
|
|
6
|
+
- "**/*.hpp"
|
|
7
|
+
- "**/*.mm"
|
|
8
|
+
- "**/*.py"
|
|
9
|
+
- "**/*.ts"
|
|
10
|
+
- "**/*.js"
|
|
11
|
+
- "**/*.mjs"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Suspect the meter before the engine, and make the render repeat
|
|
15
|
+
|
|
16
|
+
<constraints>
|
|
17
|
+
Always do:
|
|
18
|
+
- Make a probe's first assertion that the render reproduces. Reset every phase, ramp and seed on prepare, in its own commit.
|
|
19
|
+
- Read a constant ratio or an exact multiple as a meter fault first. Fix it, re-fit what was tuned against it, and grep for the same code.
|
|
20
|
+
- Assert against an absolute expected value. A meter wrong by a steady percentage passes every comparison of measurements.
|
|
21
|
+
- Flush between programs, and silence earlier voices.
|
|
22
|
+
- Use an RMS window longer than the oscillator's period, and RMS over whole periods for a rate.
|
|
23
|
+
|
|
24
|
+
Never do:
|
|
25
|
+
- Believe a factor of two: filter resonance puts two level peaks in every LFO cycle.
|
|
26
|
+
- Leave a meter bug in place because it flatters the score.
|
|
27
|
+
</constraints>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.cpp"
|
|
4
|
+
- "**/*.cc"
|
|
5
|
+
- "**/*.h"
|
|
6
|
+
- "**/*.hpp"
|
|
7
|
+
- "**/*.mm"
|
|
8
|
+
- "**/*.py"
|
|
9
|
+
- "**/*.ts"
|
|
10
|
+
- "**/*.js"
|
|
11
|
+
- "**/*.mjs"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# A control at its neutral computes exactly nothing
|
|
15
|
+
|
|
16
|
+
<constraints>
|
|
17
|
+
Always do:
|
|
18
|
+
- Make a control at its documented neutral compute exactly 1.0, or exactly 0.
|
|
19
|
+
- Make 0% wet come out dry, never silent: a mix is a crossfade.
|
|
20
|
+
- Start blank programs at neutral. A modulation byte of 0 can mean full negative depth.
|
|
21
|
+
- Fail on a blank extraction row: clamping it to zero rendered 66 presets silent.
|
|
22
|
+
|
|
23
|
+
Never do:
|
|
24
|
+
- Leave a default that colours every preset: this is how a bank ends up "all sounding the same".
|
|
25
|
+
- Hash a value into the signal path to make voices differ.
|
|
26
|
+
</constraints>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.cpp"
|
|
4
|
+
- "**/*.cc"
|
|
5
|
+
- "**/*.h"
|
|
6
|
+
- "**/*.hpp"
|
|
7
|
+
- "**/*.mm"
|
|
8
|
+
- "**/*.py"
|
|
9
|
+
- "**/*.ts"
|
|
10
|
+
- "**/*.js"
|
|
11
|
+
- "**/*.mjs"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Test where a wrong answer cannot pass
|
|
15
|
+
|
|
16
|
+
<constraints>
|
|
17
|
+
Always do:
|
|
18
|
+
- Vary the thing the error lives in, all the way down: low, middle and high notes; the tempo, not the division; two points for "A follows B"; phase apart from rate.
|
|
19
|
+
- Take expected values from the printed source, not the code.
|
|
20
|
+
- Trace where a term acts: velocity on depth is not velocity on output.
|
|
21
|
+
- Excite what you test. A click hid 100x of preset difference.
|
|
22
|
+
- Use two anchors to fix a law: one fits any curve.
|
|
23
|
+
|
|
24
|
+
Never do:
|
|
25
|
+
- Use one point that is zero exactly where everyone auditions: `note - 60` passes at middle C.
|
|
26
|
+
- Compare a function with itself.
|
|
27
|
+
- Invent a term. It is worse than a missing one.
|
|
28
|
+
</constraints>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.cpp"
|
|
4
|
+
- "**/*.cc"
|
|
5
|
+
- "**/*.h"
|
|
6
|
+
- "**/*.hpp"
|
|
7
|
+
- "**/*.mm"
|
|
8
|
+
- "**/*.py"
|
|
9
|
+
- "**/*.ts"
|
|
10
|
+
- "**/*.js"
|
|
11
|
+
- "**/*.mjs"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# What cannot be reached is said, never clamped
|
|
15
|
+
|
|
16
|
+
<constraints>
|
|
17
|
+
Always do:
|
|
18
|
+
- Silence and count an out-of-range target.
|
|
19
|
+
- Grey what a destination cannot reach, and say why.
|
|
20
|
+
- Find the real control rate, not the timer period: a scheduler serving 16 voices in turn scales every envelope by 16.
|
|
21
|
+
- Read both signs of a law before linearising it, and suspect the fixed-point format when a constant lands near a real number.
|
|
22
|
+
|
|
23
|
+
Never do:
|
|
24
|
+
- Clamp in silence, or let an array bound thin a pattern.
|
|
25
|
+
</constraints>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "**/*.cpp"
|
|
4
|
+
- "**/*.cc"
|
|
5
|
+
- "**/*.h"
|
|
6
|
+
- "**/*.hpp"
|
|
7
|
+
- "**/*.mm"
|
|
8
|
+
- "**/*.py"
|
|
9
|
+
- "**/*.ts"
|
|
10
|
+
- "**/*.js"
|
|
11
|
+
- "**/*.mjs"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# A waveform can be data, an oscillator or a generator; an octave can be locked or free
|
|
15
|
+
|
|
16
|
+
<constraints>
|
|
17
|
+
Always do:
|
|
18
|
+
- Decide what a waveform is: data read from a table, what the oscillator itself is, or a generator beside it. If two cannot coexist on the original, they are modes.
|
|
19
|
+
- Derive a locked sub from its parent's increment.
|
|
20
|
+
- Treat a free layer as a whole voice.
|
|
21
|
+
|
|
22
|
+
Never do:
|
|
23
|
+
- Dedupe pitches in the allocator: two layers on one note is the sound.
|
|
24
|
+
</constraints>
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bounce-a-plugin
|
|
3
|
+
description: Use when audio has to be rendered from a VST3 with no DAW, when comparing an engine with another plugin or an emulator, when fitting a law against a plugin, or when a plugin will not load in a JUCE host or plays silence.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Bounce a plugin (one job: a known input through a plugin, and the audio out, repeatable)
|
|
7
|
+
|
|
8
|
+
`.claude/tools/vst3host/` is an offline VST3 renderer: no DAW, no audio device, no window, faster than real time. It does not link JUCE, on purpose: a JUCE host cannot load every JUCE plugin.
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
bash .claude/tools/vst3host/build.sh # once, after the project's first configure; macOS and Linux
|
|
12
|
+
R=out/vst3host/render
|
|
13
|
+
$R --vst3 <plugin> --list # every parameter, with its id
|
|
14
|
+
$R --vst3 <plugin> --out a.wav --note 60 --vel 100 --hold 1.5 --tail 0.6
|
|
15
|
+
$R --vst3 <plugin> --param 12=0.75 --sweep 38:9 --dir out/ # one note per value of 38, 12 frozen
|
|
16
|
+
$R --vst3 <plugin> --program 5 --bank 0:1 --out a.wav # the same factory patch a machine was recorded on
|
|
17
|
+
$R --vst3 <plugin> --sysex patch.syx --dump-params # send a patch, and read whether it was taken
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
The WAV is 32-bit float, so a plugin that peaks over 1.0 is measured, never clipped. For a Roland machine, `--dt1-head "41 10 00 06" --dt1-base 1004000` sends DT1: `--dt1 OFF=VAL` pins a value, `--sweep-dt1 OFF:STEPS[:MAX]` and a repeated `--axis` sweep, `--probe LO-HI[:V1,V2]` finds which offset is a control, and `--map LO-HI[:VAL]` asks the plugin which parameter an offset is.
|
|
21
|
+
|
|
22
|
+
<constraints>
|
|
23
|
+
Always do:
|
|
24
|
+
1. Run `--list` first. `--param` and `--sweep` take the id, never the row number. A wrong id is ignored, and the sweep renders the same sound with no complaint.
|
|
25
|
+
2. Prove the bounce before you trust it. Render twice: same bytes means the plugin is repeatable, and you can compare exactly. If it is not (a free-running oscillator, modelled drift), compare averages of several bounces, and say so.
|
|
26
|
+
3. Prove a control reaches the audio: sweep it, and measure that the audio moves. Two renders that match byte for byte mean the control did nothing.
|
|
27
|
+
4. Render one note per value. Move a control between notes, never under one.
|
|
28
|
+
5. Give a firmware emulator its boot: `--boot 12`. The emulated processor needs real samples before it answers a note, and a short boot reads as a silent plugin.
|
|
29
|
+
6. When parameters do nothing, try sysex. A firmware emulator may ignore host automation and answer only the machine's own messages. The renderer sets both the controller and the processor's queue, and if the audio is still byte-identical, sysex is the way in.
|
|
30
|
+
7. Ask whether a dump was taken: `--dump-params` before and after. A rejected dump and an accepted one that sounds alike cannot be told apart in a WAV. Identical output means the patches never arrived, whatever the spectra look like.
|
|
31
|
+
8. Fix everything else: patch, note, velocity, sample rate, effects off. To fit one control, move only that control. A factory-patch recording cannot fit a law, since a performance has its chorus on.
|
|
32
|
+
9. To compare two engines, render both with the same patch and the same notes, and name in the report what the other engine is. An emulation is a reference, not the machine: tag it as what it is, and record where it disagrees with the schematic rather than choosing quietly.
|
|
33
|
+
|
|
34
|
+
Never do:
|
|
35
|
+
- Open an audio device, or route through a loopback, to capture a plugin. On macOS a permission denial returns silence, not an error.
|
|
36
|
+
- Load a plugin in a JUCE host to measure it and trust a crash as the plugin's fault: an allocator clash across the boundary aborts inside the plugin's own loader.
|
|
37
|
+
- Read one output bus as all of them. The renderer gives every bus a buffer and keeps bus 0: a plugin with several may send a part elsewhere.
|
|
38
|
+
- Commit a render: it is a build output, and a plugin's sound may be someone else's. Keep the numbers.
|
|
39
|
+
- Run a cracked or unlicensed plugin. Use the maker's trial.
|
|
40
|
+
</constraints>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: choose-observable
|
|
3
|
+
description: Use when writing a probe, when a measurement is noisy, or when deciding what audio can prove a behaviour.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Choose the observable (one job: measure the signal that can prove it)
|
|
7
|
+
|
|
8
|
+
<constraints>
|
|
9
|
+
Always do:
|
|
10
|
+
1. Check preconditions: renders bit-identical, start state checked, stale frames drained, the program found by name.
|
|
11
|
+
2. Take the best rung: a pure gain (exact), pulse width, a stereo difference with a hard zero, pitch through the phase null, a filter, a comb's energy.
|
|
12
|
+
3. On pitch, keep the depth tiny: the law is exponential, and the error accumulates.
|
|
13
|
+
4. On a sampler, take the median of consecutive gaps.
|
|
14
|
+
5. If it cannot see phase, say so. Assert the offset does not move, and log the open item.
|
|
15
|
+
|
|
16
|
+
Never do:
|
|
17
|
+
- Measure phase through a comb, or trust a filter's lowest point as its vertex.
|
|
18
|
+
</constraints>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: measure-a-law
|
|
3
|
+
description: Use when fitting or checking a law against a machine or a reference recording.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Measure a law (one job: a fit you can defend)
|
|
7
|
+
|
|
8
|
+
<constraints>
|
|
9
|
+
Always do:
|
|
10
|
+
1. Use a sine at the frequency you read. A filter slope read on a saw was off by 2.3 dB per octave.
|
|
11
|
+
2. Write a filter's law in the units its procedure uses.
|
|
12
|
+
3. Fix it with two anchors.
|
|
13
|
+
4. Keep fitted constants scripted, tagged, and rerunnable.
|
|
14
|
+
5. Write disproofs down.
|
|
15
|
+
|
|
16
|
+
Never do:
|
|
17
|
+
- Fit a single point.
|
|
18
|
+
</constraints>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: measure-reverb
|
|
3
|
+
description: Use when measuring or calibrating a reverb or a decay time.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Measure a reverb (one job: a decay time you can trust)
|
|
7
|
+
|
|
8
|
+
<constraints>
|
|
9
|
+
Always do:
|
|
10
|
+
1. Mute dry and early reflections, and zero the pre-delay.
|
|
11
|
+
2. Use Schroeder T30, or a least-squares fit of the tail.
|
|
12
|
+
3. Measure over a long enough render for the longest setting.
|
|
13
|
+
4. Read the law in the units its procedure uses.
|
|
14
|
+
5. Compare with the printed figure.
|
|
15
|
+
|
|
16
|
+
Never do:
|
|
17
|
+
- Read a time off the peak level.
|
|
18
|
+
- Inherit a sibling machine's law: reverb times were once 20 to 45% short that way.
|
|
19
|
+
</constraints>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: spread-probe
|
|
3
|
+
description: Use when presets sound alike, when a bank is finished, or when an algorithm list is built.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Measure the spread (one job: the programs really differ)
|
|
7
|
+
|
|
8
|
+
<constraints>
|
|
9
|
+
Always do:
|
|
10
|
+
1. Render every program with the same excitations, chosen to excite what differs.
|
|
11
|
+
2. Measure the difference between programs, per algorithm and across the bank, as medians.
|
|
12
|
+
3. Count the effectively distinct sounds, and report it next to the total.
|
|
13
|
+
4. Check the upstream causes first: an invented global, programs loading defaults, an algorithm with min equal to max.
|
|
14
|
+
5. Share one probe across units, so a number means the same on every machine.
|
|
15
|
+
|
|
16
|
+
Never do:
|
|
17
|
+
- Accept "they all sound the same" as an opinion. It is a testable report: 625 presets once measured as 146.
|
|
18
|
+
</constraints>
|