voidmachine 0.0.0 → 4.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.
- package/LICENSE +21 -0
- package/README.md +123 -4
- package/bin/void-harness.mjs +12 -0
- package/bin/void-machine.mjs +12 -0
- package/core-assets/.claude-plugin/plugin.json +253 -0
- package/core-assets/.gitkeep +0 -0
- package/core-assets/PHILOSOPHY.md +218 -0
- package/core-assets/PROJECT-DOCTRINE.template.md +14 -0
- package/core-assets/adapters/security/manifest.yaml +96 -0
- package/core-assets/agents/.gitkeep +0 -0
- package/core-assets/agents/accessibility-specialist.md +59 -0
- package/core-assets/agents/api-integration-engineer.md +59 -0
- package/core-assets/agents/code-explorer.md +94 -0
- package/core-assets/agents/code-explorer.source +7 -0
- package/core-assets/agents/data-migration-engineer.md +59 -0
- package/core-assets/agents/devex-docs-engineer.md +57 -0
- package/core-assets/agents/doctrine-critic.md +91 -0
- package/core-assets/agents/doctrine-critic.source +11 -0
- package/core-assets/agents/domain-architect.md +56 -0
- package/core-assets/agents/experience-designer.md +59 -0
- package/core-assets/agents/frontend-engineer.md +60 -0
- package/core-assets/agents/independent-code-reviewer.md +61 -0
- package/core-assets/agents/migration-planner.md +97 -0
- package/core-assets/agents/migration-planner.source +7 -0
- package/core-assets/agents/observability-sre-engineer.md +59 -0
- package/core-assets/agents/pdf-specialist.md +58 -0
- package/core-assets/agents/performance-engineer.md +58 -0
- package/core-assets/agents/product-challenger.md +55 -0
- package/core-assets/agents/security-engineer.md +66 -0
- package/core-assets/agents/silent-failure-hunter.md +94 -0
- package/core-assets/agents/silent-failure-hunter.source +8 -0
- package/core-assets/agents/solution-architect.md +57 -0
- package/core-assets/agents/test-qa-engineer.md +60 -0
- package/core-assets/agents/type-design-analyzer.md +93 -0
- package/core-assets/agents/type-design-analyzer.source +8 -0
- package/core-assets/agents/visual-craft-director.md +62 -0
- package/core-assets/codex/hooks.json +157 -0
- package/core-assets/contract-history/visual-craft-director/v2.yaml +43 -0
- package/core-assets/data/catalog.v3.json +10479 -0
- package/core-assets/data/certification.json +1800 -0
- package/core-assets/data/identity.json +8 -0
- package/core-assets/data/model.json +4226 -0
- package/core-assets/enforce/ci-enforce.sh +183 -0
- package/core-assets/hooks/_checks.sh +145 -0
- package/core-assets/hooks/_hooklib.sh +163 -0
- package/core-assets/hooks/_syntax-worker.cjs +503 -0
- package/core-assets/hooks/_void-hook.mjs +5459 -0
- package/core-assets/hooks/activation-meter.sh +13 -0
- package/core-assets/hooks/anti-ai-slop-grep.sh +38 -0
- package/core-assets/hooks/auto-format.sh +9 -0
- package/core-assets/hooks/axe-precommit.sh +35 -0
- package/core-assets/hooks/block-dangerous-bash.sh +10 -0
- package/core-assets/hooks/block-protected-push.sh +81 -0
- package/core-assets/hooks/boundary-direction-check.sh +10 -0
- package/core-assets/hooks/control-character-grep.sh +10 -0
- package/core-assets/hooks/fowler-refactors.txt +71 -0
- package/core-assets/hooks/large-cl-grep.sh +9 -0
- package/core-assets/hooks/llm-cost-precommit.sh +55 -0
- package/core-assets/hooks/migration-lint.sh +58 -0
- package/core-assets/hooks/migration-pr-template.sh +55 -0
- package/core-assets/hooks/no-ai-design-slop.sh +10 -0
- package/core-assets/hooks/no-any-grep.sh +10 -0
- package/core-assets/hooks/no-as-cast-grep.sh +10 -0
- package/core-assets/hooks/no-console-log-grep.sh +10 -0
- package/core-assets/hooks/no-null-grep.sh +10 -0
- package/core-assets/hooks/no-only-no-skip.sh +10 -0
- package/core-assets/hooks/outcome-meter.sh +13 -0
- package/core-assets/hooks/pre-PR-review-evidence.sh +47 -0
- package/core-assets/hooks/protect-sensitive-files.sh +10 -0
- package/core-assets/hooks/refactor-named-grep.sh +49 -0
- package/core-assets/hooks/secret-in-content.sh +10 -0
- package/core-assets/hooks/sessionstart-context.sh +9 -0
- package/core-assets/hooks/stop-typecheck.sh +9 -0
- package/core-assets/hooks/tdd-guard.md +90 -0
- package/core-assets/hooks/tdd-guard.sh +10 -0
- package/core-assets/hooks/test-name-lint.sh +10 -0
- package/core-assets/hooks/tidying-commit-prefix.sh +37 -0
- package/core-assets/hooks/trim-large-output.sh +9 -0
- package/core-assets/hooks/tsc-noemit-precommit.sh +22 -0
- package/core-assets/hooks/ubiquitous-language-lint.sh +58 -0
- package/core-assets/hooks/viewport-screenshot-gate.sh +48 -0
- package/core-assets/modules/.gitkeep +0 -0
- package/core-assets/packs/pack-mobile/skills/void-eas-build-profile/.source +7 -0
- package/core-assets/packs/pack-mobile/skills/void-eas-build-profile/SKILL.md +164 -0
- package/core-assets/packs/pack-mobile/skills/void-eas-build-profile/harness.yaml +14 -0
- package/core-assets/packs/pack-mobile/skills/void-expo-config-plugins/.source +7 -0
- package/core-assets/packs/pack-mobile/skills/void-expo-config-plugins/SKILL.md +178 -0
- package/core-assets/packs/pack-mobile/skills/void-expo-config-plugins/harness.yaml +14 -0
- package/core-assets/packs/pack-mobile/skills/void-expo-router-pattern/.source +8 -0
- package/core-assets/packs/pack-mobile/skills/void-expo-router-pattern/SKILL.md +209 -0
- package/core-assets/packs/pack-mobile/skills/void-expo-router-pattern/harness.yaml +14 -0
- package/core-assets/packs/pack-mobile/skills/void-ota-update-strategy/.source +7 -0
- package/core-assets/packs/pack-mobile/skills/void-ota-update-strategy/SKILL.md +194 -0
- package/core-assets/packs/pack-mobile/skills/void-ota-update-strategy/harness.yaml +14 -0
- package/core-assets/packs/pack-monorepo/skills/void-dependency-direction/.source +5 -0
- package/core-assets/packs/pack-monorepo/skills/void-dependency-direction/SKILL.md +160 -0
- package/core-assets/packs/pack-monorepo/skills/void-dependency-direction/harness.yaml +14 -0
- package/core-assets/packs/pack-monorepo/skills/void-package-extraction/.source +5 -0
- package/core-assets/packs/pack-monorepo/skills/void-package-extraction/SKILL.md +70 -0
- package/core-assets/packs/pack-monorepo/skills/void-package-extraction/harness.yaml +14 -0
- package/core-assets/packs/pack-monorepo/skills/void-service-package/.source +5 -0
- package/core-assets/packs/pack-monorepo/skills/void-service-package/SKILL.md +122 -0
- package/core-assets/packs/pack-monorepo/skills/void-service-package/harness.yaml +14 -0
- package/core-assets/packs/pack-monorepo/skills/void-turbo-pipeline-tuning/.source +7 -0
- package/core-assets/packs/pack-monorepo/skills/void-turbo-pipeline-tuning/SKILL.md +116 -0
- package/core-assets/packs/pack-monorepo/skills/void-turbo-pipeline-tuning/harness.yaml +14 -0
- package/core-assets/packs/pack-nextjs/skills/void-cache-component-pattern/.source +5 -0
- package/core-assets/packs/pack-nextjs/skills/void-cache-component-pattern/SKILL.md +162 -0
- package/core-assets/packs/pack-nextjs/skills/void-cache-component-pattern/harness.yaml +14 -0
- package/core-assets/packs/pack-nextjs/skills/void-instrumentation-setup/.source +5 -0
- package/core-assets/packs/pack-nextjs/skills/void-instrumentation-setup/SKILL.md +161 -0
- package/core-assets/packs/pack-nextjs/skills/void-instrumentation-setup/harness.yaml +14 -0
- package/core-assets/packs/pack-nextjs/skills/void-loading-error-boundaries/.source +5 -0
- package/core-assets/packs/pack-nextjs/skills/void-loading-error-boundaries/SKILL.md +176 -0
- package/core-assets/packs/pack-nextjs/skills/void-loading-error-boundaries/harness.yaml +14 -0
- package/core-assets/packs/pack-nextjs/skills/void-parallel-routes-slots/.source +5 -0
- package/core-assets/packs/pack-nextjs/skills/void-parallel-routes-slots/SKILL.md +129 -0
- package/core-assets/packs/pack-nextjs/skills/void-parallel-routes-slots/harness.yaml +14 -0
- package/core-assets/packs/pack-nextjs/skills/void-route-group-decision/.source +5 -0
- package/core-assets/packs/pack-nextjs/skills/void-route-group-decision/SKILL.md +107 -0
- package/core-assets/packs/pack-nextjs/skills/void-route-group-decision/harness.yaml +14 -0
- package/core-assets/packs/pack-pwa/skills/void-install-prompt-ux/.source +5 -0
- package/core-assets/packs/pack-pwa/skills/void-install-prompt-ux/SKILL.md +153 -0
- package/core-assets/packs/pack-pwa/skills/void-install-prompt-ux/harness.yaml +14 -0
- package/core-assets/packs/pack-pwa/skills/void-manifest-checklist/.source +5 -0
- package/core-assets/packs/pack-pwa/skills/void-manifest-checklist/SKILL.md +204 -0
- package/core-assets/packs/pack-pwa/skills/void-manifest-checklist/harness.yaml +14 -0
- package/core-assets/packs/pack-pwa/skills/void-offline-first-mutation/.source +8 -0
- package/core-assets/packs/pack-pwa/skills/void-offline-first-mutation/SKILL.md +266 -0
- package/core-assets/packs/pack-pwa/skills/void-offline-first-mutation/harness.yaml +14 -0
- package/core-assets/packs/pack-pwa/skills/void-service-worker-strategy/.source +5 -0
- package/core-assets/packs/pack-pwa/skills/void-service-worker-strategy/SKILL.md +178 -0
- package/core-assets/packs/pack-pwa/skills/void-service-worker-strategy/harness.yaml +14 -0
- package/core-assets/packs/pack-react/skills/void-accessibility-check/.source +8 -0
- package/core-assets/packs/pack-react/skills/void-accessibility-check/SKILL.md +136 -0
- package/core-assets/packs/pack-react/skills/void-accessibility-check/harness.yaml +14 -0
- package/core-assets/packs/pack-react/skills/void-client-vs-server-component/.source +5 -0
- package/core-assets/packs/pack-react/skills/void-client-vs-server-component/SKILL.md +116 -0
- package/core-assets/packs/pack-react/skills/void-client-vs-server-component/harness.yaml +14 -0
- package/core-assets/packs/pack-react/skills/void-form-pattern/.source +7 -0
- package/core-assets/packs/pack-react/skills/void-form-pattern/SKILL.md +157 -0
- package/core-assets/packs/pack-react/skills/void-form-pattern/harness.yaml +14 -0
- package/core-assets/packs/pack-react/skills/void-state-architecture/.source +5 -0
- package/core-assets/packs/pack-react/skills/void-state-architecture/SKILL.md +160 -0
- package/core-assets/packs/pack-react/skills/void-state-architecture/harness.yaml +14 -0
- package/core-assets/packs/pack-server/skills/void-background-job-pattern/.source +6 -0
- package/core-assets/packs/pack-server/skills/void-background-job-pattern/SKILL.md +214 -0
- package/core-assets/packs/pack-server/skills/void-background-job-pattern/harness.yaml +14 -0
- package/core-assets/packs/pack-server/skills/void-drizzle-migration-safe/.source +6 -0
- package/core-assets/packs/pack-server/skills/void-drizzle-migration-safe/SKILL.md +168 -0
- package/core-assets/packs/pack-server/skills/void-drizzle-migration-safe/harness.yaml +14 -0
- package/core-assets/packs/pack-server/skills/void-env-validation/.source +6 -0
- package/core-assets/packs/pack-server/skills/void-env-validation/SKILL.md +131 -0
- package/core-assets/packs/pack-server/skills/void-env-validation/harness.yaml +14 -0
- package/core-assets/packs/pack-server/skills/void-rate-limit-strategy/.source +6 -0
- package/core-assets/packs/pack-server/skills/void-rate-limit-strategy/SKILL.md +149 -0
- package/core-assets/packs/pack-server/skills/void-rate-limit-strategy/harness.yaml +14 -0
- package/core-assets/packs/pack-server/skills/void-server-action/.source +7 -0
- package/core-assets/packs/pack-server/skills/void-server-action/SKILL.md +181 -0
- package/core-assets/packs/pack-server/skills/void-server-action/harness.yaml +14 -0
- package/core-assets/packs/pack-server/skills/void-testing-server-modules/.source +7 -0
- package/core-assets/packs/pack-server/skills/void-testing-server-modules/SKILL.md +73 -0
- package/core-assets/packs/pack-server/skills/void-testing-server-modules/harness.yaml +14 -0
- package/core-assets/packs/pack-server/skills/void-webhook-handler-pattern/.source +7 -0
- package/core-assets/packs/pack-server/skills/void-webhook-handler-pattern/SKILL.md +205 -0
- package/core-assets/packs/pack-server/skills/void-webhook-handler-pattern/harness.yaml +14 -0
- package/core-assets/policies/core.yaml +95 -0
- package/core-assets/policies/ui.yaml +23 -0
- package/core-assets/profiles/base.yaml +29 -0
- package/core-assets/profiles/expo-config.yaml +36 -0
- package/core-assets/profiles/expo.yaml +35 -0
- package/core-assets/profiles/monorepo.yaml +33 -0
- package/core-assets/profiles/nextjs-config.yaml +31 -0
- package/core-assets/profiles/nextjs.yaml +31 -0
- package/core-assets/profiles/node-server.yaml +31 -0
- package/core-assets/profiles/pwa.yaml +33 -0
- package/core-assets/profiles/react.yaml +39 -0
- package/core-assets/profiles/sql.yaml +39 -0
- package/core-assets/profiles/typescript.yaml +39 -0
- package/core-assets/skills/.gitkeep +0 -0
- package/core-assets/skills/void-accessibility/.source +15 -0
- package/core-assets/skills/void-accessibility/SKILL.md +275 -0
- package/core-assets/skills/void-accessibility/harness.yaml +17 -0
- package/core-assets/skills/void-api-and-interface-design/.source +13 -0
- package/core-assets/skills/void-api-and-interface-design/SKILL.md +231 -0
- package/core-assets/skills/void-api-and-interface-design/harness.yaml +16 -0
- package/core-assets/skills/void-async-safety/.source +13 -0
- package/core-assets/skills/void-async-safety/SKILL.md +287 -0
- package/core-assets/skills/void-async-safety/harness.yaml +16 -0
- package/core-assets/skills/void-audit/.source +15 -0
- package/core-assets/skills/void-audit/SKILL.md +83 -0
- package/core-assets/skills/void-audit/harness.yaml +14 -0
- package/core-assets/skills/void-autopilot/.source +21 -0
- package/core-assets/skills/void-autopilot/SKILL.md +358 -0
- package/core-assets/skills/void-autopilot/harness.yaml +14 -0
- package/core-assets/skills/void-brainstorm/.source +14 -0
- package/core-assets/skills/void-brainstorm/SKILL.md +271 -0
- package/core-assets/skills/void-brainstorm/harness.yaml +14 -0
- package/core-assets/skills/void-checkpoint/.source +39 -0
- package/core-assets/skills/void-checkpoint/SKILL.md +227 -0
- package/core-assets/skills/void-checkpoint/harness.yaml +14 -0
- package/core-assets/skills/void-claude-md/.source +15 -0
- package/core-assets/skills/void-claude-md/SKILL.md +180 -0
- package/core-assets/skills/void-claude-md/harness.yaml +14 -0
- package/core-assets/skills/void-code-review/.source +14 -0
- package/core-assets/skills/void-code-review/SKILL.md +232 -0
- package/core-assets/skills/void-code-review/harness.yaml +15 -0
- package/core-assets/skills/void-commit-discipline/.source +9 -0
- package/core-assets/skills/void-commit-discipline/SKILL.md +211 -0
- package/core-assets/skills/void-commit-discipline/harness.yaml +15 -0
- package/core-assets/skills/void-context/.source +15 -0
- package/core-assets/skills/void-context/SKILL.md +167 -0
- package/core-assets/skills/void-context/harness.yaml +14 -0
- package/core-assets/skills/void-debug/.source +11 -0
- package/core-assets/skills/void-debug/SKILL.md +211 -0
- package/core-assets/skills/void-debug/harness.yaml +14 -0
- package/core-assets/skills/void-decide/.source +9 -0
- package/core-assets/skills/void-decide/SKILL.md +147 -0
- package/core-assets/skills/void-decide/harness.yaml +14 -0
- package/core-assets/skills/void-devex-audit/.source +8 -0
- package/core-assets/skills/void-devex-audit/SKILL.md +113 -0
- package/core-assets/skills/void-devex-audit/harness.yaml +15 -0
- package/core-assets/skills/void-doctor/.source +15 -0
- package/core-assets/skills/void-doctor/SKILL.md +83 -0
- package/core-assets/skills/void-doctor/harness.yaml +14 -0
- package/core-assets/skills/void-domain-driven-design/.source +13 -0
- package/core-assets/skills/void-domain-driven-design/SKILL.md +292 -0
- package/core-assets/skills/void-domain-driven-design/harness.yaml +15 -0
- package/core-assets/skills/void-frontend-design/.source +19 -0
- package/core-assets/skills/void-frontend-design/SKILL.md +274 -0
- package/core-assets/skills/void-frontend-design/harness.yaml +17 -0
- package/core-assets/skills/void-functional/.source +14 -0
- package/core-assets/skills/void-functional/SKILL.md +312 -0
- package/core-assets/skills/void-functional/harness.yaml +15 -0
- package/core-assets/skills/void-graph/.source +15 -0
- package/core-assets/skills/void-graph/SKILL.md +80 -0
- package/core-assets/skills/void-graph/harness.yaml +14 -0
- package/core-assets/skills/void-hexagonal-architecture/.source +12 -0
- package/core-assets/skills/void-hexagonal-architecture/SKILL.md +276 -0
- package/core-assets/skills/void-hexagonal-architecture/harness.yaml +15 -0
- package/core-assets/skills/void-implement/.source +39 -0
- package/core-assets/skills/void-implement/SKILL.md +183 -0
- package/core-assets/skills/void-implement/harness.yaml +14 -0
- package/core-assets/skills/void-learn/.source +13 -0
- package/core-assets/skills/void-learn/SKILL.md +226 -0
- package/core-assets/skills/void-learn/harness.yaml +14 -0
- package/core-assets/skills/void-llm-cost-discipline/.source +13 -0
- package/core-assets/skills/void-llm-cost-discipline/SKILL.md +299 -0
- package/core-assets/skills/void-llm-cost-discipline/harness.yaml +15 -0
- package/core-assets/skills/void-make-pdf/.source +9 -0
- package/core-assets/skills/void-make-pdf/SKILL.md +52 -0
- package/core-assets/skills/void-make-pdf/harness.yaml +15 -0
- package/core-assets/skills/void-merge/.source +8 -0
- package/core-assets/skills/void-merge/SKILL.md +111 -0
- package/core-assets/skills/void-merge/harness.yaml +14 -0
- package/core-assets/skills/void-migrations/.source +13 -0
- package/core-assets/skills/void-migrations/SKILL.md +264 -0
- package/core-assets/skills/void-migrations/harness.yaml +17 -0
- package/core-assets/skills/void-observability/.source +12 -0
- package/core-assets/skills/void-observability/SKILL.md +245 -0
- package/core-assets/skills/void-observability/harness.yaml +15 -0
- package/core-assets/skills/void-plan/.source +15 -0
- package/core-assets/skills/void-plan/SKILL.md +239 -0
- package/core-assets/skills/void-plan/harness.yaml +14 -0
- package/core-assets/skills/void-plan-review/.source +12 -0
- package/core-assets/skills/void-plan-review/SKILL.md +128 -0
- package/core-assets/skills/void-plan-review/harness.yaml +15 -0
- package/core-assets/skills/void-qa/.source +15 -0
- package/core-assets/skills/void-qa/SKILL.md +103 -0
- package/core-assets/skills/void-qa/harness.yaml +15 -0
- package/core-assets/skills/void-refactor/.source +9 -0
- package/core-assets/skills/void-refactor/SKILL.md +220 -0
- package/core-assets/skills/void-refactor/harness.yaml +15 -0
- package/core-assets/skills/void-retrospective/.source +9 -0
- package/core-assets/skills/void-retrospective/SKILL.md +71 -0
- package/core-assets/skills/void-retrospective/harness.yaml +15 -0
- package/core-assets/skills/void-security-audit/.source +12 -0
- package/core-assets/skills/void-security-audit/SKILL.md +138 -0
- package/core-assets/skills/void-security-audit/harness.yaml +15 -0
- package/core-assets/skills/void-security-guidance/.source +12 -0
- package/core-assets/skills/void-security-guidance/SKILL.md +255 -0
- package/core-assets/skills/void-security-guidance/harness.yaml +15 -0
- package/core-assets/skills/void-source-driven-development/.source +12 -0
- package/core-assets/skills/void-source-driven-development/SKILL.md +158 -0
- package/core-assets/skills/void-source-driven-development/harness.yaml +15 -0
- package/core-assets/skills/void-tdd/.source +15 -0
- package/core-assets/skills/void-tdd/SKILL.md +394 -0
- package/core-assets/skills/void-tdd/harness.yaml +15 -0
- package/core-assets/skills/void-testing/.source +19 -0
- package/core-assets/skills/void-testing/SKILL.md +301 -0
- package/core-assets/skills/void-testing/harness.yaml +17 -0
- package/core-assets/skills/void-ticket/.source +18 -0
- package/core-assets/skills/void-ticket/SKILL.md +239 -0
- package/core-assets/skills/void-ticket/harness.yaml +14 -0
- package/core-assets/skills/void-typescript-strict/.source +10 -0
- package/core-assets/skills/void-typescript-strict/SKILL.md +294 -0
- package/core-assets/skills/void-typescript-strict/harness.yaml +17 -0
- package/core-assets/skills/void-ui-review/.source +12 -0
- package/core-assets/skills/void-ui-review/SKILL.md +97 -0
- package/core-assets/skills/void-ui-review/harness.yaml +15 -0
- package/core-assets/skills/void-verify/.source +12 -0
- package/core-assets/skills/void-verify/SKILL.md +184 -0
- package/core-assets/skills/void-verify/harness.yaml +15 -0
- package/core-assets/specialists/accessibility-specialist.source +11 -0
- package/core-assets/specialists/accessibility-specialist.yaml +30 -0
- package/core-assets/specialists/api-integration-engineer.source +11 -0
- package/core-assets/specialists/api-integration-engineer.yaml +30 -0
- package/core-assets/specialists/data-migration-engineer.source +11 -0
- package/core-assets/specialists/data-migration-engineer.yaml +30 -0
- package/core-assets/specialists/devex-docs-engineer.source +11 -0
- package/core-assets/specialists/devex-docs-engineer.yaml +29 -0
- package/core-assets/specialists/domain-architect.source +11 -0
- package/core-assets/specialists/domain-architect.yaml +28 -0
- package/core-assets/specialists/experience-designer.source +15 -0
- package/core-assets/specialists/experience-designer.yaml +38 -0
- package/core-assets/specialists/frontend-engineer.source +11 -0
- package/core-assets/specialists/frontend-engineer.yaml +32 -0
- package/core-assets/specialists/independent-code-reviewer.source +10 -0
- package/core-assets/specialists/independent-code-reviewer.yaml +37 -0
- package/core-assets/specialists/migrations.json +15 -0
- package/core-assets/specialists/observability-sre-engineer.source +11 -0
- package/core-assets/specialists/observability-sre-engineer.yaml +30 -0
- package/core-assets/specialists/pdf-specialist.source +11 -0
- package/core-assets/specialists/pdf-specialist.yaml +29 -0
- package/core-assets/specialists/performance-engineer.source +11 -0
- package/core-assets/specialists/performance-engineer.yaml +29 -0
- package/core-assets/specialists/product-challenger.source +10 -0
- package/core-assets/specialists/product-challenger.yaml +27 -0
- package/core-assets/specialists/security-engineer.source +13 -0
- package/core-assets/specialists/security-engineer.yaml +41 -0
- package/core-assets/specialists/solution-architect.source +13 -0
- package/core-assets/specialists/solution-architect.yaml +32 -0
- package/core-assets/specialists/test-qa-engineer.source +14 -0
- package/core-assets/specialists/test-qa-engineer.yaml +35 -0
- package/core-assets/specialists/visual-craft-director.source +17 -0
- package/core-assets/specialists/visual-craft-director.yaml +60 -0
- package/core-assets/templates/github/dependency-audit.mjs +54 -0
- package/core-assets/templates/github/void-dependency-audit.yml +35 -0
- package/core-assets/templates/github/void-security.yml +85 -0
- package/dist/main.js +57001 -0
- package/package.json +66 -4
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: void-security-guidance
|
|
3
|
+
description: Default-secure at trust boundaries. Zod at every input, secrets via env, SQL parameterized, Better-Auth, LLM I/O untrusted. Escalate to security-audit for deep audits. Use on trust-boundary code.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# security-guidance — voidcorp craftsman edition
|
|
7
|
+
|
|
8
|
+
Security is not "I will think about it later." It is the defaults applied at every trust boundary. This skill codifies the everyday discipline: validate at the boundary, never log secrets, never hand-roll auth, treat LLM I/O as untrusted. Full audit work is delegated to `void-security-audit`. This skill is the daily floor; `void-security-audit` is the periodic ceiling.
|
|
9
|
+
|
|
10
|
+
**Attribution**: see `.source`. Distilled from citypaul + OWASP cheat sheets; the deep-audit ceiling lives in `void-security-audit`.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Trust boundaries — the unit of discipline
|
|
15
|
+
|
|
16
|
+
A trust boundary is a place where data crosses from untrusted to trusted (or vice versa). Examples:
|
|
17
|
+
|
|
18
|
+
- HTTP request → Server Action (untrusted body → typed command)
|
|
19
|
+
- Webhook → handler (untrusted signed payload → typed event)
|
|
20
|
+
- Form input → service (untrusted form → typed input)
|
|
21
|
+
- Third-party SDK response → adapter (untrusted external data → domain type)
|
|
22
|
+
- LLM response → consumer (untrusted text → typed output)
|
|
23
|
+
- File upload → storage (untrusted bytes → validated content)
|
|
24
|
+
|
|
25
|
+
At every trust boundary, validate. With Zod. Without exception.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Input validation — Zod at every boundary
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
const CheckoutInputSchema = z.object({
|
|
33
|
+
cartId: CartIdSchema,
|
|
34
|
+
paymentMethod: z.enum(['card', 'bank_transfer']),
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
export async function checkoutAction(formData: FormData) {
|
|
38
|
+
const raw = Object.fromEntries(formData);
|
|
39
|
+
const parsed = CheckoutInputSchema.safeParse(raw);
|
|
40
|
+
if (!parsed.success) return err({ kind: 'invalid_input', issues: parsed.error.issues });
|
|
41
|
+
return checkoutCart(deps, parsed.data);
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Banned
|
|
46
|
+
|
|
47
|
+
- `JSON.parse(req.body)` without schema validation
|
|
48
|
+
- `req.body as MyType` type assertions
|
|
49
|
+
- "Validation happens later in the service" — by the time the service runs, the boundary was crossed
|
|
50
|
+
|
|
51
|
+
### Composes with `void-typescript-strict`
|
|
52
|
+
|
|
53
|
+
The validated output is a typed value (often a branded type). No `as` cast required after `safeParse`.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Secrets — env vars only, validated, never logged
|
|
58
|
+
|
|
59
|
+
### Allowed
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
// in @repo/core/env (or pack-monorepo provided env module)
|
|
63
|
+
const env = createEnv({
|
|
64
|
+
server: {
|
|
65
|
+
STRIPE_SECRET_KEY: z.string().min(1),
|
|
66
|
+
DATABASE_URL: z.string().url(),
|
|
67
|
+
},
|
|
68
|
+
// ...
|
|
69
|
+
});
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Banned
|
|
73
|
+
|
|
74
|
+
- `process.env.STRIPE_SECRET_KEY` directly in business code (use `env.STRIPE_SECRET_KEY` instead)
|
|
75
|
+
- Hardcoded secrets, even in fixtures
|
|
76
|
+
- Secrets in commit messages, in logs, in error messages, in Sentry breadcrumbs
|
|
77
|
+
- Secrets in `.env.local` files committed to git
|
|
78
|
+
|
|
79
|
+
### Exception — customer-provided credentials (BYO key)
|
|
80
|
+
|
|
81
|
+
"Secrets via env" governs the application's OWN secrets (its Anthropic key, its master encryption key, its data-source keys). A credential supplied by a customer (a BYO API key, e.g. a per-tenant data-source key) is application **data**, not the app's infra secret. Env does not fit: it holds one value, not one-per-tenant, and a multi-tenant app cannot scale a customer key into env.
|
|
82
|
+
|
|
83
|
+
Store a customer-provided credential as data:
|
|
84
|
+
|
|
85
|
+
- **Encrypted at rest in the DB, scoped per tenant** (AES-256-GCM), never plaintext — a DB dump must not leak every customer's credential.
|
|
86
|
+
- **The master encryption key stays in env** (validated `@repo/core/env`). The per-tenant ciphertext lives in the DB.
|
|
87
|
+
- **Never returned to a client surface** — expose a masked last-four only, never the full value.
|
|
88
|
+
|
|
89
|
+
This narrows the rule; it does not weaken it. The app's own secrets still go in env, never the DB.
|
|
90
|
+
|
|
91
|
+
### Composes with
|
|
92
|
+
|
|
93
|
+
- `void-observability` — secrets MUST NOT appear in logs. The logger config redacts known-secret keys.
|
|
94
|
+
- `pack-monorepo` — provides the `env` module + `gitleaks` pre-commit hook.
|
|
95
|
+
|
|
96
|
+
Companion hooks (in `pack-monorepo`):
|
|
97
|
+
|
|
98
|
+
- `gitleaks-precommit` — already in void-starter
|
|
99
|
+
- `no-process-env-grep` — fails if `process.env.` appears outside `env.mjs`
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## SQL / DB — parameterized via Drizzle, no string concat
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
// allowed
|
|
107
|
+
const user = await db.select().from(users).where(eq(users.id, userId)).get();
|
|
108
|
+
|
|
109
|
+
// banned
|
|
110
|
+
const user = await db.execute(sql.raw(`SELECT * FROM users WHERE id = '${userId}'`));
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Composes with `void-migrations` for schema changes.
|
|
114
|
+
|
|
115
|
+
### Raw queries
|
|
116
|
+
|
|
117
|
+
Allowed only with explicit boundary review (a `BLOCKER:` review comment must be addressed). When unavoidable, parameterize:
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
const result = await db.execute(sql`SELECT * FROM users WHERE id = ${userId}`); // sql template literal — parameterized
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## Auth — Better-Auth (or Clerk opt-in), never hand-rolled
|
|
126
|
+
|
|
127
|
+
Better-Auth is the default in `void-starter`. Clerk is the alternative (opt-in). Both handle:
|
|
128
|
+
|
|
129
|
+
- Password hashing (argon2 / bcrypt)
|
|
130
|
+
- Session token generation
|
|
131
|
+
- CSRF protection
|
|
132
|
+
- Cookie security (`HttpOnly`, `Secure`, `SameSite`)
|
|
133
|
+
- Account lockout / rate limiting
|
|
134
|
+
|
|
135
|
+
### Banned
|
|
136
|
+
|
|
137
|
+
- Hand-rolled password hashing
|
|
138
|
+
- Custom session token generation
|
|
139
|
+
- Custom CSRF handling
|
|
140
|
+
- "I just need a quick login for the demo" — use the real auth even for demos
|
|
141
|
+
|
|
142
|
+
If a feature requires auth-related behavior that Better-Auth does not provide, that is a `void-brainstorm` discussion + an ADR — not a workaround.
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## Cookies — defaults from pack-nextjs
|
|
147
|
+
|
|
148
|
+
`HttpOnly`, `Secure`, `SameSite=Lax` (or `Strict` for sensitive cookies). Never set a cookie directly without these defaults — the helper in `pack-nextjs` enforces.
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## LLM input is untrusted. LLM output is untrusted.
|
|
153
|
+
|
|
154
|
+
### Input — prompt injection
|
|
155
|
+
|
|
156
|
+
User-controlled text inside an LLM prompt is an attack vector. Treat it as data, not instructions.
|
|
157
|
+
|
|
158
|
+
- Separate the system prompt from user input clearly.
|
|
159
|
+
- Sanitize where appropriate (markdown stripping, URL blocking).
|
|
160
|
+
- Defense in depth: if the LLM has tools, every tool invocation re-validates inputs at its boundary (do NOT trust because "the LLM checked").
|
|
161
|
+
|
|
162
|
+
### Output — LLM hallucination as untrusted
|
|
163
|
+
|
|
164
|
+
LLM responses are untrusted output. Validate with Zod if you parse structured data. Never `eval()` LLM output. Never pass LLM output directly into `dangerouslySetInnerHTML`, `innerHTML`, SQL, shell commands.
|
|
165
|
+
|
|
166
|
+
### Composes with
|
|
167
|
+
|
|
168
|
+
- `void-llm-cost-discipline` — cost rules and security rules co-evolve at LLM call sites
|
|
169
|
+
- `pack-nextjs` — Server Actions wrapping LLM responses validate before returning
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## Banned constructs
|
|
174
|
+
|
|
175
|
+
- `eval()`, `new Function(...)`, `setTimeout(string, ...)`, `setInterval(string, ...)`
|
|
176
|
+
- `dangerouslySetInnerHTML` (with allowlist for sanitized markdown rendering — explicit review)
|
|
177
|
+
- `child_process.exec` with user-controlled input (use `execFile` with arg array)
|
|
178
|
+
- `fs.readFileSync(userPath)` without path validation
|
|
179
|
+
- `fetch(userUrl)` from server-side without URL allowlist (SSRF)
|
|
180
|
+
|
|
181
|
+
The companion hook `no-eval-fn-grep` blocks `eval(`, `new Function(` in staged code.
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## Logs — no PII, no secrets, ever
|
|
186
|
+
|
|
187
|
+
```typescript
|
|
188
|
+
// banned
|
|
189
|
+
logger.info(`user ${user.email} signed in with password ${password}`);
|
|
190
|
+
|
|
191
|
+
// allowed
|
|
192
|
+
logger.info({ userId: user.id, event: 'sign_in_success' });
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
Composes with `void-observability` (structured logs only, never string interpolation).
|
|
196
|
+
|
|
197
|
+
Logger config (in `pack-monorepo`) redacts known-secret keys (`password`, `apiKey`, `secret`, `token`) at the serialization layer as defense in depth.
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## When to escalate to `void-security-audit`
|
|
202
|
+
|
|
203
|
+
This skill is the daily floor. Escalate to `void-security-audit` for:
|
|
204
|
+
|
|
205
|
+
- Periodic deep audit (monthly): OWASP Top 10 walkthrough, dependency supply chain scan, threat model review, CI/CD pipeline security
|
|
206
|
+
- High-stakes feature: payment surface, auth changes, PII handling
|
|
207
|
+
- Pre-launch security gate
|
|
208
|
+
- Incident response
|
|
209
|
+
|
|
210
|
+
The `doctrine-critic` agent (in void-machine) flags trust-boundary code in a diff and routes the security pass to `void-security-audit`; `void-security-audit` runs the phase-driven deep audit.
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## Composition with other skills
|
|
215
|
+
|
|
216
|
+
- **With `void-hexagonal-architecture`**: trust boundary = adapter ingress. Zod validation happens at the adapter.
|
|
217
|
+
- **With `void-typescript-strict`**: validated input is a typed value (branded type for primitives). No `as` cast.
|
|
218
|
+
- **With `void-observability`**: structured logs, no PII / secrets, breadcrumbs scoped with anonymized user ID.
|
|
219
|
+
- **With `void-async-safety`**: webhook signature verification, replay protection.
|
|
220
|
+
- **With `void-llm-cost-discipline`**: cost rules and security rules co-evolve at LLM call sites.
|
|
221
|
+
- **With `void-code-review`**: dimension `security` is delegated. `doctrine-critic` flags boundaries and `void-security-audit` does the deep pass.
|
|
222
|
+
- **With `void-security-audit`**: full audit on demand. This skill is the daily floor; `void-security-audit` is the periodic ceiling.
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## Companion hooks (in `pack-monorepo` per-stack)
|
|
227
|
+
|
|
228
|
+
- `gitleaks-precommit` — secrets in staged diff
|
|
229
|
+
- `no-process-env-grep` — `process.env.*` outside `env.mjs`
|
|
230
|
+
- `no-eval-fn-grep` — `eval(`, `new Function(` in staged code
|
|
231
|
+
|
|
232
|
+
(These live in `pack-monorepo` rather than `core/claude/hooks/` because they depend on the consumer having gitleaks installed and a specific `env.mjs` convention.)
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## Anti-rules
|
|
237
|
+
|
|
238
|
+
- MUST NOT replace `void-security-audit` full-audit mode (different scope).
|
|
239
|
+
- MUST NOT decide threat model boundaries (escalates to `void-security-audit`).
|
|
240
|
+
- MUST NOT pretend LLM input/output is trusted.
|
|
241
|
+
- MUST NOT hand-roll auth, sessions, password hashing.
|
|
242
|
+
- MUST NOT bypass Zod validation at trust boundaries "for performance."
|
|
243
|
+
- MUST NOT log PII or secrets, ever.
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## Final rule
|
|
248
|
+
|
|
249
|
+
```
|
|
250
|
+
Trust boundary → Zod validation. Secrets → env. SQL → parameterized. Auth → Better-Auth.
|
|
251
|
+
LLM I/O → untrusted. Logs → no PII no secrets.
|
|
252
|
+
Otherwise → it is not voidcorp security-guidance.
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
Security defaults are like seat belts: uncomfortable at first, unimaginable to drive without.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Harness metadata for this skill. Not part of the Agent Skills
|
|
2
|
+
# specification, and never copied into a consumer project: the SKILL.md
|
|
3
|
+
# beside it stays portable and validates against the official six fields.
|
|
4
|
+
# Read by this repository's graph, and by the installer for `runtimes`.
|
|
5
|
+
kind: standard
|
|
6
|
+
activation: always
|
|
7
|
+
owner: folpe
|
|
8
|
+
runtimes: [claude, codex]
|
|
9
|
+
enforcement:
|
|
10
|
+
floor: ci
|
|
11
|
+
inline:
|
|
12
|
+
claude: pretooluse
|
|
13
|
+
codex: pretooluse
|
|
14
|
+
hermes: ci-only
|
|
15
|
+
eval_targets: [claude/anthropic/opus]
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
Sources for `void-source-driven-development` skill (see `docs/plans/skill-audits/void-source-driven-development.md` for full audit):
|
|
2
|
+
|
|
3
|
+
- void-machine CLAUDE.md / AGENTS.md hard rule — "Read the official documentation of any third-party tool BEFORE writing its config." This skill encodes that rule and makes it enforceable.
|
|
4
|
+
- Anthropic Claude Code best practices — guidance to give the model current, authoritative context (point it at official docs / fetch real references) rather than relying on training recall, which drifts across versions. https://www.anthropic.com/engineering/claude-code-best-practices
|
|
5
|
+
- "Ground decisions in the official, versioned docs" principle observed from the Claude Code team's own working style — verify the installed version, read its docs, distrust dated third-party tutorials. (practice / methodology, no single canonical URL)
|
|
6
|
+
- gstack /defuddle — composed for clean-markdown reads of official documentation (strips nav/ads to load-bearing prose), preferred over raw WebFetch for doc pages. (gstack skill)
|
|
7
|
+
|
|
8
|
+
Strategy: distill. The repo already states the rule in one line; this skill distills the load-bearing principles (version-match the docs, docs beat memory, official beats third party, cite the reference) and adds the harness-standard Rationalizations + Verification gate. No verbatim vendoring.
|
|
9
|
+
|
|
10
|
+
Composition: upstream of plan (stack decisions grounded in current docs); with commit-discipline (the "why" carries the source citation); with decide (alternatives cite official docs). Contrast with memory-driven config.
|
|
11
|
+
|
|
12
|
+
Companion hooks: none in v1 (citation is prose-level discipline; a future post-commit grep for an unsourced config diff is an open question in the audit note).
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: void-source-driven-development
|
|
3
|
+
description: Ground every third-party config or API usage in the official docs for the installed version, not training memory. Verify the version; cite the reference when it helps. Use before writing any tool config.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# source-driven-development
|
|
7
|
+
|
|
8
|
+
Training memory drifts. It blends three minor versions of a framework into one plausible-looking config that compiles, runs, and is subtly wrong: a renamed option, a removed flag, a default that flipped between majors. This skill makes the official documentation of the **installed version** the source of truth for any third-party tool. The read is mandatory; the citation is not. Where a choice is not obvious, a brief reference in the commit lets the "why" outlive the session.
|
|
9
|
+
|
|
10
|
+
This encodes the repo hard rule: *read the official documentation of any third-party tool before writing its config.*
|
|
11
|
+
|
|
12
|
+
**Attribution**: see `.source` in this directory.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## The rule
|
|
17
|
+
|
|
18
|
+
When you configure or call a third-party tool (framework, library, CLI, API, build tool):
|
|
19
|
+
|
|
20
|
+
1. **Find the installed version.** Read the lockfile (`pnpm-lock.yaml`, `package-lock.json`, `Cargo.lock`) or the resolved entry, not just the `^x` range in `package.json`. Options change between majors; the range lies about what is actually resolved.
|
|
21
|
+
2. **Read the docs for that version.** Pin the docs to the resolved major/minor. Latest-docs for an older installed version is a silent mismatch.
|
|
22
|
+
3. **Prefer a clean read.** Use the `defuddle` skill (or WebFetch) on the official docs. Strip nav and ads to the load-bearing prose. Distrust third-party tutorials, blog posts, and Stack Overflow answers: they are dated by construction and rarely say which version they target.
|
|
23
|
+
4. **Cite when it helps.** For a non-obvious choice, put the URL + section (or doc path) in the commit body, the PR, or a comment next to the config, so the next reader can re-derive it. A missing citation never blocks on its own.
|
|
24
|
+
|
|
25
|
+
Memory proposes; docs dispose.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Conflict resolution
|
|
30
|
+
|
|
31
|
+
| Conflict | Winner | Why |
|
|
32
|
+
|---|---|---|
|
|
33
|
+
| Memory vs official docs | Docs | Memory is a lossy average of many versions; docs describe one. |
|
|
34
|
+
| Two sources disagree | Official + version-matched | Vendor docs for the installed version beat any third party. |
|
|
35
|
+
| Docs vs a stale tutorial | Docs | Tutorials freeze a moment; the tool moved on. |
|
|
36
|
+
| Latest docs vs installed-version docs | Installed-version docs | You ship what is installed, not what is newest. |
|
|
37
|
+
|
|
38
|
+
When the docs and a working example genuinely conflict and you cannot resolve it, that uncertainty is a finding: surface it, do not paper over it with a guess.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## What "cite the reference" looks like
|
|
43
|
+
|
|
44
|
+
In a commit (composes with `void-commit-discipline` — the "why" carries the source):
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
chore(build): set vite `build.target` to es2022
|
|
48
|
+
|
|
49
|
+
Vite 7 dropped the old `esbuild.target` shorthand; the documented field
|
|
50
|
+
is now build.target. Ref: vitejs.dev/config/build-options#build-target
|
|
51
|
+
(v7 docs, matches pnpm-lock resolved 7.0.x).
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Next to non-obvious config:
|
|
55
|
+
|
|
56
|
+
```ts
|
|
57
|
+
// retries default changed to 0 in playwright 1.45; opt back in explicitly.
|
|
58
|
+
// ref: playwright.dev/docs/test-retries (v1.45 docs)
|
|
59
|
+
retries: 2,
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
What verifies a config line is the read of the version-matched docs, not the presence of a citation. A reviewer who doubts an option checks it against those docs; a concrete mismatch is a defect, a missing reference is not.
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## When this applies
|
|
67
|
+
|
|
68
|
+
- Writing or changing any tool config (bundler, test runner, linter, ORM, CI, framework).
|
|
69
|
+
- Calling a third-party API or SDK where parameter names, defaults, or auth flow matter.
|
|
70
|
+
- Choosing options that differ across major versions.
|
|
71
|
+
- Upgrading a dependency across a major (re-read; do not assume the old config carries).
|
|
72
|
+
|
|
73
|
+
## When this does NOT apply
|
|
74
|
+
|
|
75
|
+
- First-party code in this repo (you own it; read the source, not "docs").
|
|
76
|
+
- Stable, well-internalized language built-ins where no version ambiguity exists.
|
|
77
|
+
- Throwaway exploration you will delete (but the moment it lands, the rule applies).
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Offline / no-network
|
|
82
|
+
|
|
83
|
+
Some runs have no egress: a sandboxed autonomous worker, an air-gapped CI step. You still must not write config from memory. Two moves keep the rule intact without opening the network:
|
|
84
|
+
|
|
85
|
+
1. **Inject the doc, do not fetch it.** Treat the version-matched reference as an *input*, not a side effect: pass the doc text (or a curated, version-pinned excerpt committed to the repo) into the decision as a parameter — a port — and validate its shape at the boundary with Zod before you trust it (e.g. assert the option you are about to set actually appears in the supplied reference). This is functional core / imperative shell: fetching is an adapter concern, the choice logic takes the doc as data. It composes with `void-hexagonal-architecture` and `void-security-guidance` (untrusted input is validated at the edge).
|
|
86
|
+
|
|
87
|
+
2. **If no version-matched doc is reachable and the semantics you are writing are genuinely uncertain, incur a `source-debt`.** A missing citation is not a source-debt. A `source-debt` is a short, honest note, in the commit body or the PR, naming exactly which `tool@version` option was authored offline and what remains uncertain about it. It is the alternative to guessing silently, not a mandatory field: a label or checkbox may carry it if the project uses one, but neither is the authority.
|
|
88
|
+
|
|
89
|
+
What matters is the verification itself: the real uncertainty is resolved against the version-matched official docs before the change ships. Once that read is done, a note, label or checkbox not yet updated never blocks on its own. The offline bypass is for *authoring* without egress, never for *shipping* config whose semantics remain unverified.
|
|
90
|
+
|
|
91
|
+
This widens egress by **zero** (decision A3): offline work defers the verification behind an explicit, reviewable IOU; it never reaches for the network it was denied.
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Composition
|
|
96
|
+
|
|
97
|
+
- **Upstream of `void-plan`** — stack decisions in a plan must be grounded in current official docs, not remembered defaults. A plan step that pins a library cites the doc that justifies the choice.
|
|
98
|
+
- **With `void-commit-discipline`** — the mandatory "why" in the commit body is where the source citation lives. The git log becomes the audit trail of *why this config*, traceable to a versioned doc.
|
|
99
|
+
- **With `void-decide`** (pack-monorepo) — a structural tool choice becomes an ADR whose "Alternatives considered" cites the official docs of each option, not folklore.
|
|
100
|
+
- **Contrast with memory-driven work** — the failure mode this skill replaces is writing config from training recall and only checking docs when it breaks. Invert that order.
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Rationalizations
|
|
105
|
+
|
|
106
|
+
| Rationalization | Reality |
|
|
107
|
+
|---|---|
|
|
108
|
+
| "I know this API, I've used it many times" | You know an average of several versions. The installed one has its own truths. |
|
|
109
|
+
| "The docs will just say what I already think" | Then the read costs seconds and confirms it. When they don't, you just dodged a bug. |
|
|
110
|
+
| "It compiled / it ran, so it's right" | Wrong defaults compile fine. Deprecated-but-still-working options run fine. Until they don't. |
|
|
111
|
+
| "This tutorial does exactly this" | Tutorials rarely state their version and rot silently. Match the vendor docs to your lockfile. |
|
|
112
|
+
| "Checking the version is overkill for a config tweak" | The tweak that broke prod was a flag renamed between minors. The check is cheap. |
|
|
113
|
+
| "I'll read the docs later" | Later never comes. The read happens before the line; a citation, when useful, lands in the same commit. |
|
|
114
|
+
| "Latest docs are close enough" | "Close enough" between majors is how a removed option ships to prod. |
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Verification
|
|
119
|
+
|
|
120
|
+
The work is not done until the source check is done. Before marking any third-party config or usage complete:
|
|
121
|
+
|
|
122
|
+
- [ ] Installed version identified from the lockfile (not the `package.json` range).
|
|
123
|
+
- [ ] Official docs for **that** version read (via `/defuddle` / WebFetch, not memory or a tutorial).
|
|
124
|
+
- [ ] Every non-obvious option checked against that doc; cited briefly where it helps the next reader (never blocking on its own).
|
|
125
|
+
- [ ] Any memory-vs-docs conflict resolved in favor of the docs, or surfaced as an open question if irresolvable.
|
|
126
|
+
|
|
127
|
+
If the version check or the read is missing, the config is written from memory. That is the state this skill exists to prevent.
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Anti-rules
|
|
132
|
+
|
|
133
|
+
- MUST NOT write tool config from training memory alone — read the version-matched docs first.
|
|
134
|
+
- MUST NOT skip the installed-version check — the `^` range is not the resolved version.
|
|
135
|
+
- MUST NOT cite a third-party tutorial as authoritative — the official, versioned doc is the source.
|
|
136
|
+
- MUST NOT land config whose semantics were not checked against the version-matched docs. A missing citation alone is not that failure.
|
|
137
|
+
- MUST NOT silently pick a side when sources genuinely conflict — surface the divergence.
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## When you are stuck
|
|
142
|
+
|
|
143
|
+
| Problem | Solution |
|
|
144
|
+
|---|---|
|
|
145
|
+
| Cannot find the official docs | Start from the package homepage / repo README, follow to the versioned docs site. Avoid SEO tutorials. |
|
|
146
|
+
| Docs only cover "latest" | Check the changelog / migration guide for your installed major; or read the versioned docs branch / tag. |
|
|
147
|
+
| Docs and a working snippet conflict | Trust the versioned official docs. If still unresolved, surface it as an open question, do not guess. |
|
|
148
|
+
| The option I remember doesn't exist | It was renamed or removed. Read the migration guide for your major. |
|
|
149
|
+
| No time to read everything | Read the one section governing the option you are setting. Targeted, not exhaustive. |
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Final rule
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
Third-party config → installed version found, version-matched official docs read, source cited when it helps.
|
|
157
|
+
Otherwise → it was written from memory, and memory is not a source.
|
|
158
|
+
```
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Harness metadata for this skill. Not part of the Agent Skills
|
|
2
|
+
# specification, and never copied into a consumer project: the SKILL.md
|
|
3
|
+
# beside it stays portable and validates against the official six fields.
|
|
4
|
+
# Read by this repository's graph, and by the installer for `runtimes`.
|
|
5
|
+
kind: standard
|
|
6
|
+
activation: always
|
|
7
|
+
owner: folpe
|
|
8
|
+
runtimes: [claude, codex]
|
|
9
|
+
enforcement:
|
|
10
|
+
floor: ci
|
|
11
|
+
inline:
|
|
12
|
+
claude: active
|
|
13
|
+
codex: active
|
|
14
|
+
hermes: ci-only
|
|
15
|
+
eval_targets: [claude/anthropic/opus]
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
Sources for `void-tdd` skill (see `docs/plans/skill-audits/void-tdd.md` for full audit):
|
|
2
|
+
|
|
3
|
+
- DECLIK port — /Users/folpe/Developer/DECLIK/.claude/skills/tdd/SKILL.md (377 LOC, top-5%, distills the below)
|
|
4
|
+
- superpowers/test-driven-development — Iron Law + Red Flags + Common Rationalizations
|
|
5
|
+
- citypaul/.dotfiles tdd — TDD Evidence in commit history pattern
|
|
6
|
+
- nizos/tdd-guard — https://github.com/nizos/tdd-guard — companion hook (PreToolUse Edit/Write, 10 bypasses)
|
|
7
|
+
- Kent Beck "Test-Driven Development: By Example" (2002) — foundation
|
|
8
|
+
- morodomi/tdd-skills — reviewed, rejected as primary (too rigid phase-by-phase commit gates)
|
|
9
|
+
|
|
10
|
+
Strategy: port-DECLIK with three minimal stack-agnostic adaptations (paths/commands read from voidcorp.config.json, DECLIK-specific refs moved to pack-monorepo).
|
|
11
|
+
|
|
12
|
+
Companion hook: packages/core/claude/hooks/tdd-guard.sh (94 LOC, all 10 bypasses).
|
|
13
|
+
|
|
14
|
+
DEV-444 adaptation: frontend RED now targets component/hook/store/a11y/state behavior, requires a
|
|
15
|
+
keyboard regression before E2E for interactive controls, and binds proof to the current diff.
|