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,294 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: void-typescript-strict
|
|
3
|
+
description: TS strict baseline. Zero any budget, branded types for domain primitives, discriminated unions over enums, exhaustive switches via never, satisfies over as. Use when editing TypeScript code.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# typescript-strict — voidcorp craftsman edition
|
|
7
|
+
|
|
8
|
+
Types describe truth. The compiler runs first. `any` is banned. `as` is rejected outside narrow exceptions. Domain primitives wear branded types. Discriminated unions model state. Exhaustive switches are verified by `never`. This skill is the language baseline — every other skill composes on top of it.
|
|
9
|
+
|
|
10
|
+
**Attribution**: see `.source` in this directory.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## tsconfig baseline (mandatory)
|
|
15
|
+
|
|
16
|
+
Every consumer's `tsconfig.json` extends the void-machine strict baseline, shipped as `tsconfig.strict.json` inside the `@voidcorp/pack-monorepo` pack. The `@voidcorp/*` packs are workspace packages, not yet published to npm — the `extends` below resolves once the pack is installed in the workspace (do not assume a bare npm install resolves it):
|
|
17
|
+
|
|
18
|
+
```json
|
|
19
|
+
{
|
|
20
|
+
"compilerOptions": {
|
|
21
|
+
"strict": true,
|
|
22
|
+
"noUncheckedIndexedAccess": true,
|
|
23
|
+
"exactOptionalPropertyTypes": true,
|
|
24
|
+
"noImplicitOverride": true,
|
|
25
|
+
"noFallthroughCasesInSwitch": true,
|
|
26
|
+
"useUnknownInCatchVariables": true,
|
|
27
|
+
"verbatimModuleSyntax": true
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
If a consumer disables any flag, they record the reason through the `void-decide` skill - that is a deliberate ADR, not a casual config tweak.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Zero `any` budget
|
|
37
|
+
|
|
38
|
+
`any` is forbidden in committed code. There is no "just this once."
|
|
39
|
+
|
|
40
|
+
When you need an escape valve, use `unknown` and narrow:
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
function parsePayload(raw: unknown): UserCommand {
|
|
44
|
+
return userCommandSchema.parse(raw); // Zod narrows + returns the typed value
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
`unknown` forces narrowing before use. `any` silently propagates everywhere.
|
|
49
|
+
|
|
50
|
+
The companion hook `no-any-grep` blocks commits that introduce `: any` or `as any` outside whitelisted paths (`**/__fixtures__/**`, `**/__tests__/**`). See `../../hooks/no-any-grep.sh`.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## `as` cast — rejected by default
|
|
55
|
+
|
|
56
|
+
The `as` cast tells the compiler to trust you. Trust is the bug.
|
|
57
|
+
|
|
58
|
+
Allowed forms (the only ones):
|
|
59
|
+
|
|
60
|
+
- **`as const`** — pin a literal type. Always allowed.
|
|
61
|
+
- **`as unknown`** as a stepping stone to a deliberate narrowing chain. Use sparingly.
|
|
62
|
+
- **`as <Type>` after Zod schema validation** — preferred form: do not need `as` because `schema.parse()` returns the typed value. Use `parse`, not `as`.
|
|
63
|
+
|
|
64
|
+
Banned forms:
|
|
65
|
+
|
|
66
|
+
- `as <Type>` to "fix" a type error
|
|
67
|
+
- `as any` to escape narrowing
|
|
68
|
+
- Chained `as unknown as <Type>` to bypass exhaustive checks
|
|
69
|
+
|
|
70
|
+
The companion hook `no-as-cast-grep` warns (not blocks) on `as <Type>` outside the allowed set — false positives are common, the user confirms.
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Prefer `satisfies` over annotation, prefer `parse` over `as`
|
|
75
|
+
|
|
76
|
+
```typescript
|
|
77
|
+
// preferred: satisfies preserves the literal type AND checks against the constraint
|
|
78
|
+
const config = {
|
|
79
|
+
retries: 3,
|
|
80
|
+
backoffMs: 100,
|
|
81
|
+
} satisfies RetryConfig;
|
|
82
|
+
|
|
83
|
+
// acceptable: annotation widens to the constraint type
|
|
84
|
+
const config: RetryConfig = { retries: 3, backoffMs: 100 };
|
|
85
|
+
|
|
86
|
+
// rejected: as lies if the structure is wrong
|
|
87
|
+
const config = { retries: 3 } as RetryConfig; // BAD — missing field, compiler silent
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
For validated input, use the schema:
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
// preferred
|
|
94
|
+
const cmd = userCommandSchema.parse(req.body);
|
|
95
|
+
|
|
96
|
+
// rejected
|
|
97
|
+
const cmd = req.body as UserCommand; // BAD — no runtime guarantee
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Discriminated unions over enums + boolean flags
|
|
103
|
+
|
|
104
|
+
State with N values = discriminated union. Not a flag bag.
|
|
105
|
+
|
|
106
|
+
<Good>
|
|
107
|
+
```typescript
|
|
108
|
+
type FetchState<T> =
|
|
109
|
+
| { kind: 'idle' }
|
|
110
|
+
| { kind: 'loading' }
|
|
111
|
+
| { kind: 'success'; data: T }
|
|
112
|
+
| { kind: 'error'; error: Error };
|
|
113
|
+
```
|
|
114
|
+
</Good>
|
|
115
|
+
|
|
116
|
+
<Bad>
|
|
117
|
+
```typescript
|
|
118
|
+
type FetchState<T> = {
|
|
119
|
+
status: 'idle' | 'loading' | 'success' | 'error';
|
|
120
|
+
data?: T;
|
|
121
|
+
error?: Error;
|
|
122
|
+
}; // BAD — every consumer must check status AND handle optional fields, invariants invisible
|
|
123
|
+
```
|
|
124
|
+
</Bad>
|
|
125
|
+
|
|
126
|
+
The discriminated form makes invalid states unrepresentable. The compiler narrows automatically inside `if (state.kind === 'success')` blocks.
|
|
127
|
+
|
|
128
|
+
### No `enum` keyword
|
|
129
|
+
|
|
130
|
+
TypeScript `enum` has known footguns: numeric enums are loose, declaration order matters, runtime emit unlike type aliases. Use `as const` objects + derived union type:
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
const Status = {
|
|
134
|
+
Pending: 'pending',
|
|
135
|
+
Approved: 'approved',
|
|
136
|
+
Rejected: 'rejected',
|
|
137
|
+
} as const;
|
|
138
|
+
type Status = (typeof Status)[keyof typeof Status];
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
ESLint rule `@typescript-eslint/no-enum` (configured in `pack-monorepo`) blocks `enum` usage.
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## Exhaustive switches via `never`
|
|
146
|
+
|
|
147
|
+
Every `switch` over a discriminated union has a `default` branch that proves exhaustiveness:
|
|
148
|
+
|
|
149
|
+
```typescript
|
|
150
|
+
function render(state: FetchState<User>): JSX.Element {
|
|
151
|
+
switch (state.kind) {
|
|
152
|
+
case 'idle': return <Idle />;
|
|
153
|
+
case 'loading': return <Spinner />;
|
|
154
|
+
case 'success': return <UserCard user={state.data} />;
|
|
155
|
+
case 'error': return <ErrorView error={state.error} />;
|
|
156
|
+
default: {
|
|
157
|
+
const _exhaustive: never = state;
|
|
158
|
+
throw new Error(`Unhandled state: ${JSON.stringify(_exhaustive)}`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
If you later add `{ kind: 'cancelled' }`, the compiler flags the switch — no production drift.
|
|
165
|
+
|
|
166
|
+
ESLint rule `@typescript-eslint/switch-exhaustiveness-check` (configured in `pack-monorepo`) enforces this.
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## Branded types for domain primitives
|
|
171
|
+
|
|
172
|
+
Raw `string` for things with semantics is the #1 source of "passed the wrong ID" bugs. Brand it.
|
|
173
|
+
|
|
174
|
+
```typescript
|
|
175
|
+
// in @voidcorp/core/branded
|
|
176
|
+
export type Brand<T, B extends string> = T & { readonly __brand: B };
|
|
177
|
+
|
|
178
|
+
// in your domain
|
|
179
|
+
type UserId = Brand<string, 'UserId'>;
|
|
180
|
+
type OrgId = Brand<string, 'OrgId'>;
|
|
181
|
+
type Email = Brand<string, 'Email'>;
|
|
182
|
+
|
|
183
|
+
// smart constructor
|
|
184
|
+
function createUserId(raw: string): UserId {
|
|
185
|
+
if (!raw.startsWith('usr_')) throw new ValidationError('invalid UserId');
|
|
186
|
+
return raw as UserId; // <-- only allowed `as`: post-validation in the constructor
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
A function taking `UserId` cannot accept a raw `string`. The compiler refuses. Same shape, different identity.
|
|
191
|
+
|
|
192
|
+
Apply to:
|
|
193
|
+
|
|
194
|
+
- IDs (`UserId`, `OrgId`, `OrderId`, ...)
|
|
195
|
+
- Email, PhoneNumber, IsoDate, IsoDuration
|
|
196
|
+
- Money (`{ amount: number; currency: CurrencyCode }`, with `CurrencyCode` itself branded)
|
|
197
|
+
- Anything that "looks like a string but is not interchangeable"
|
|
198
|
+
|
|
199
|
+
Composes with `void-domain-driven-design` (value objects in DDD terms) and `void-functional` (smart constructors return `Result<UserId, ValidationError>`).
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## Optional vs undefined — pick the right tool
|
|
204
|
+
|
|
205
|
+
With `exactOptionalPropertyTypes: true`:
|
|
206
|
+
|
|
207
|
+
- `{ name?: string }` means the property may be **absent**, but if present, it is a `string` (not `string | undefined`).
|
|
208
|
+
- `{ name: string | undefined }` means the property is **always present**, possibly `undefined`.
|
|
209
|
+
|
|
210
|
+
These are different. For domain models, prefer present-but-nullable (`name: string | null`) — explicit, no ambiguity between "missing" and "present-but-empty." For DTOs and external schemas, optional is fine.
|
|
211
|
+
|
|
212
|
+
Banned: spreading `{ ...maybeObj }` where `maybeObj` has `undefined` values — `exactOptionalPropertyTypes` complains. Build the object literal explicitly.
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## `Result<T, E>` for error-as-value (composes with `void-functional`)
|
|
217
|
+
|
|
218
|
+
The `void-functional` skill owns the full rationale. From a types perspective:
|
|
219
|
+
|
|
220
|
+
```typescript
|
|
221
|
+
type Result<T, E> =
|
|
222
|
+
| { ok: true; value: T }
|
|
223
|
+
| { ok: false; error: E };
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
This is a discriminated union. The compiler narrows inside `if (result.ok)`. Errors are values, not exceptions for expected failure modes. Exceptions remain for truly unexpected bugs.
|
|
227
|
+
|
|
228
|
+
A function signature `parse(raw: unknown): Result<UserCommand, ValidationError>` tells the caller everything: input is untrusted, output is either a typed command or a typed error. No try/catch hidden semantics.
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
## Hard rules summary
|
|
233
|
+
|
|
234
|
+
- `tsconfig.json` extends `@voidcorp/pack-monorepo/tsconfig.strict.json`
|
|
235
|
+
- Zero `any` in committed code. Use `unknown` and narrow.
|
|
236
|
+
- No `as <Type>` outside the allowed set (`as const`, post-Zod, smart constructors)
|
|
237
|
+
- No `enum` keyword. Use `as const` objects + derived union.
|
|
238
|
+
- Every switch over a union has a `default: never` exhaustiveness check
|
|
239
|
+
- Branded types for IDs / Email / Money / IsoDate / any semantic primitive
|
|
240
|
+
- Prefer `satisfies` over annotation; prefer `schema.parse()` over `as`
|
|
241
|
+
- Respect `exactOptionalPropertyTypes` semantics
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## Companion hooks
|
|
246
|
+
|
|
247
|
+
- **`tsc-noemit-precommit`** — `tsc --noEmit` must pass before commit. Composed with `pre-commit typecheck+test`.
|
|
248
|
+
- **`no-any-grep`** — blocks `: any` and `as any` in staged diff outside fixtures/tests whitelist.
|
|
249
|
+
- **`no-as-cast-grep`** — warns (not blocks) on `as <Type>` outside the allowed set.
|
|
250
|
+
|
|
251
|
+
See `../../hooks/`.
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
## Composition with other skills
|
|
256
|
+
|
|
257
|
+
- **With `void-functional`**: this skill provides the type machinery (discriminated unions, `Result`, branded primitives); `void-functional` decides WHEN to model with sum types vs records, when to return `Result` vs throw.
|
|
258
|
+
- **With `void-domain-driven-design`**: this skill enforces branded types for domain primitives; DDD decides which entities are aggregates and which are value objects.
|
|
259
|
+
- **With `void-hexagonal-architecture`**: ports are typed interfaces; types travel across boundaries via Zod schemas.
|
|
260
|
+
- **With `void-tdd`**: a RED test using a branded type forces the production code to surface a smart constructor.
|
|
261
|
+
- **With `void-code-review`**: review skill flags untyped IDs, `any` slips, missing `satisfies`.
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## Anti-rules
|
|
266
|
+
|
|
267
|
+
- MUST NOT decide business logic. Types describe; behavior is elsewhere.
|
|
268
|
+
- MUST NOT decide test strategy. `void-testing` and `void-tdd` own that.
|
|
269
|
+
- MUST NOT decide architecture boundaries. `void-hexagonal-architecture` owns that.
|
|
270
|
+
- MUST NOT decide style. Biome / Prettier owns that.
|
|
271
|
+
- MUST NOT silently allow `any` "just this once."
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## When you are stuck
|
|
276
|
+
|
|
277
|
+
| Problem | Solution |
|
|
278
|
+
|---|---|
|
|
279
|
+
| Cannot express the type | Use `unknown` + narrow. If still stuck, the design is leaking. |
|
|
280
|
+
| Library has wrong types | Wrap with a typed adapter at the boundary (do not patch with `as`). |
|
|
281
|
+
| Generic too complex | Split. Type-level computation > 3 nesting levels is a smell. |
|
|
282
|
+
| `exactOptionalPropertyTypes` complains on spread | Build the literal explicitly without `undefined` properties. |
|
|
283
|
+
| Need to bypass for a fixture | Use the `**/__fixtures__/**` whitelist + explain in fixture file header. |
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## Final rule
|
|
288
|
+
|
|
289
|
+
```
|
|
290
|
+
Every TypeScript file → no any, no rogue as, exhaustive switches, branded domain primitives.
|
|
291
|
+
Otherwise → this is not voidcorp typescript-strict.
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
The compiler is the first reviewer. If it does not flag a category of bug, this skill exists to make sure you do.
|
|
@@ -0,0 +1,17 @@
|
|
|
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
|
+
triggers:
|
|
8
|
+
extensions: ["ts", "tsx"]
|
|
9
|
+
owner: folpe
|
|
10
|
+
runtimes: [claude, codex]
|
|
11
|
+
enforcement:
|
|
12
|
+
floor: ci
|
|
13
|
+
inline:
|
|
14
|
+
claude: pretooluse
|
|
15
|
+
codex: pretooluse
|
|
16
|
+
hermes: ci-only
|
|
17
|
+
eval_targets: [claude/anthropic/opus]
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
Sources for `void-ui-review` skill (see `docs/plans/skill-audits/void-ui-review.md` for the full distribution matrix):
|
|
2
|
+
|
|
3
|
+
- impeccable (standalone skill, ~/.claude/skills/impeccable/, v3.8.0) — VENDORED (DEV-389): the audit/critique/refine methodology (the AI-slop two-altitude category-reflex test, the register split brand-vs-product, the refine-mode menu polish/bolder/quieter/distill/harden/clarify/layout/typeset). Per Folpe's directive "tout dans le harnais", impeccable's prose value is internalised so the harness does not depend on an external skill. Rejected: its browser-driven command runtime (scripts/, reference/*.md command files, `live` mode, comparison board) — deferred to Vague 4.
|
|
4
|
+
- gstack /design-review (1953 LOC) — VENDORED: the designer's-eye QA (first-impression, squint/blur test, interaction-state coverage, emotional arc). Its live-screenshot driver + atomic-fix loop are deferred to Vague 4; its 80-item audit rubric + A-F slop scoring + slop blacklist went to forge:critique / SLOP-REGISTRY (issues).
|
|
5
|
+
- gstack /design-consultation (1188 LOC) — the DESIGN.md file contract is KEPT (already a harness contract, consumed by frontend-design + pack-nextjs; produced by `impeccable document`/`init` or by hand); its consultation runtime + design-vocabulary rosters went to forge:design-prompt (issues). No consultation skill needed.
|
|
6
|
+
- gstack /design-shotgun (1331 LOC) — the multi-variant + anti-convergence method went to forge:design-prompt (issues); its comparison board is Vague 4.
|
|
7
|
+
- Steve Krug "Don't Make Me Think" — the reading model (scan/satisfice/muddle) went to frontend-design; cited, not pasted.
|
|
8
|
+
|
|
9
|
+
Strategy: distill + split. Build-time craft → frontend-design (enriched, DEV-389); audit-time methodology → this new skill (the ceiling). Mirrors security-guidance/security-audit and plan/plan-review. Browser capture is composed through `void-qa`; the comparison board and .void/SLOP-REGISTRY remain outside this skill.
|
|
10
|
+
|
|
11
|
+
DEV-444 adaptation: the rubric now feeds a fresh-context Visual Craft Director with a six-dimension
|
|
12
|
+
8/10 floor. Browser/current-diff evidence stays owned by qa; LLM-only certification is rejected.
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: void-ui-review
|
|
3
|
+
description: "Audit and polish an EXISTING UI: the AI-slop test, heuristic critique, technical audit (contrast/a11y/responsive/perf), refine modes. The audit ceiling to frontend-design's build floor."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# ui-review — voidcorp craftsman edition
|
|
7
|
+
|
|
8
|
+
`void-frontend-design` is the build-time floor: the discipline applied while writing UI. This skill is the audit-time ceiling: a deliberate pass over an *existing* interface to find what makes it read as generated, score it, and drive a refine. Invoke it to critique, audit, or polish a UI that already renders.
|
|
9
|
+
|
|
10
|
+
It proposes findings and edits at the component level; it does not rewrite the brand (`DESIGN.md` owns that) and it does not re-teach the build rules (`void-frontend-design` owns those — this skill assumes them and checks against them).
|
|
11
|
+
|
|
12
|
+
**Attribution**: see `.source`. Vendored from `impeccable` (the audit/critique/refine methodology) + gstack `/design-review` (designer's-eye QA) + gstack `/design-consultation`/`/design-shotgun` (the pieces that stayed here; recon/design-prompt went to `forge`). Live browser operation is delegated to `void-qa`.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Classify the register first
|
|
17
|
+
|
|
18
|
+
Judgment differs by register — apply the matching bar:
|
|
19
|
+
|
|
20
|
+
- **Brand** — marketing, landing, campaign, portfolio: *design IS the product*. Boldness, distinctiveness, and a memorable moment are the bar.
|
|
21
|
+
- **Product** — app UI, admin, dashboard, tool: *design SERVES the product*. Clarity, density, and low cognitive load are the bar.
|
|
22
|
+
|
|
23
|
+
Pick by task cue first ("landing page" vs "dashboard"), then the surface in focus, then the `register` field in `PRODUCT.md`/`DESIGN.md`.
|
|
24
|
+
|
|
25
|
+
## The AI-slop test (the core pass)
|
|
26
|
+
|
|
27
|
+
If someone could look at this and say "AI made that" without doubt, it has failed. Run the **category-reflex check at two altitudes** — the second catches what the first misses:
|
|
28
|
+
|
|
29
|
+
- **First-order** — could someone guess the theme + palette from the *category alone*? (SaaS → blue/violet; fintech → navy/gold; AI tool → cream/sand.) If yes, it is the first training-data reflex. Rework the color strategy and the physical-scene sentence until the answer is not obvious from the domain.
|
|
30
|
+
- **Second-order** — could someone guess the aesthetic family from *category-plus-anti-reference*? ("AI tool that's not SaaS-cream → editorial-typographic"; "fintech that's not navy → terminal dark".) The first reflex was dodged; the second wasn't. Rework until neither answer is obvious.
|
|
31
|
+
|
|
32
|
+
Cross-register slop (the absolute bans — side-stripe, gradient text, glassmorphism, hero-metric, eyebrow-on-every-section, cream/sand body, text overflow) is owned by `void-frontend-design`; flag any that survived into the shipped UI as findings here.
|
|
33
|
+
|
|
34
|
+
## Critique pass (designer's eye, heuristic)
|
|
35
|
+
|
|
36
|
+
- **First impression** — look for 3 seconds, then look away. What did you retain? Run the **squint test**: blur the screen — does the hierarchy still read, does the primary action still dominate? If everything is equally loud, there is no hierarchy.
|
|
37
|
+
- **Information architecture** — is the primary action singular and the most prominent? Is supporting context recessed, and noise cut?
|
|
38
|
+
- **Interaction-state coverage** — every state the user hits, described as what they *see*: loading, empty, error, success, partial. A missing state is a finding, not a detail.
|
|
39
|
+
- **Emotional arc** — the 5-second / 5-minute / 5-year read: does the first glance earn the second, and does it hold up on the hundredth visit?
|
|
40
|
+
- Score each dimension `N/10 → target`, write the fix, and re-rate. "Design-complete" when every dimension clears the bar for its register.
|
|
41
|
+
|
|
42
|
+
## Technical audit pass
|
|
43
|
+
|
|
44
|
+
- **Contrast** — body ≥ 4.5:1, large text ≥ 3:1, placeholders held to 4.5:1 (not the muted-gray default). The commonest failure: muted gray on tinted near-white.
|
|
45
|
+
- **Accessibility** — keyboard path, focus order, ARIA, 44px targets (composes with `void-accessibility`).
|
|
46
|
+
- **Responsive** — per-viewport intent; test heading copy at every breakpoint for overflow; mobile-first dual-quality (composes with `void-frontend-design`).
|
|
47
|
+
- **Performance** — LCP budget, no layout-thrash animation, image sizing (composes with the perf tooling).
|
|
48
|
+
|
|
49
|
+
## Independent post-build verdict
|
|
50
|
+
|
|
51
|
+
For a changed UI, `void-qa` supplies current-diff screenshots and behavioral proof, then
|
|
52
|
+
`core:visual-craft-director` reviews them in a fresh context distinct from the builder and pre-build
|
|
53
|
+
designer. It scores hierarchy, information architecture, interaction states, responsive intent,
|
|
54
|
+
distinctiveness, and accessibility; every dimension must reach 8/10. Missing browser access,
|
|
55
|
+
mobile/desktop or applicable-state captures, current-diff binding, or test proof blocks approval.
|
|
56
|
+
Model judgment alone is never visual certification.
|
|
57
|
+
|
|
58
|
+
## Refine modes
|
|
59
|
+
|
|
60
|
+
Once findings exist, drive a focused refine rather than a vague "make it better":
|
|
61
|
+
|
|
62
|
+
- `polish` — final pre-ship quality pass · `harden` — errors, i18n, edge/empty states · `distill` — strip to essence.
|
|
63
|
+
- `bolder` — amplify a bland/safe design (brand register) · `quieter` — tone down an overstimulating one · `colorize` — strategic color into a flat UI.
|
|
64
|
+
- `clarify` — UX copy, labels, error messages · `layout` — spacing, rhythm, hierarchy · `typeset` — type hierarchy and fonts.
|
|
65
|
+
|
|
66
|
+
Each is a scoped edit driven by the critique/audit findings, not a rewrite.
|
|
67
|
+
|
|
68
|
+
## Live browser audit — via `void-qa`
|
|
69
|
+
|
|
70
|
+
The live layer — screenshotting the running UI, driving interactions, checking states in a real browser — is not in this prose skill; the browser home for it is `void-qa` (the claude-in-chrome MCP re-point, DEV-390). When a check needs a running browser, compose `void-qa` (its visual pass invokes this skill's methodology against the live screenshots) rather than reviewing from code alone. The multi-variant comparison board remains out of scope (forge).
|
|
71
|
+
|
|
72
|
+
## Composition & boundaries
|
|
73
|
+
|
|
74
|
+
- **With `void-frontend-design`** — the build-time floor to this audit ceiling; the bans and build specifics live there, this skill checks against them and does not restate them (no > 30% overlap).
|
|
75
|
+
- **With `core:visual-craft-director`** — this skill supplies the rubric; the specialist supplies the independent post-build verdict over evidence captured by `void-qa`.
|
|
76
|
+
- **With `void-accessibility`** — the a11y audit dimension composes with it.
|
|
77
|
+
- **Not `void-plan-review`'s Design lens** — that judges a *written plan* before any code exists (does the plan name the states, the responsive intent?); this judges the *shipped UI*. Different artifact, different lifecycle stage.
|
|
78
|
+
- **Not `void-devex-audit`** — that audits a shipped dev-facing surface (the API/CLI/SDK/docs journey: naming, errors, TTHW); this audits the visual/interaction UI. Sibling audit skills, different subject.
|
|
79
|
+
- **With `forge`** (voidcorp plugin) — market recon, the 12-dimension scored critique, multi-variant design prompts, and the slop-registry live there; bridged by the `docs/specs/` `source: forge` artifact contract.
|
|
80
|
+
- **Supersedes** the external `impeccable` skill's prose methodology (now harness-native) and gstack `/design-review`/`/design-consultation`/`/design-shotgun`.
|
|
81
|
+
|
|
82
|
+
## Anti-rules
|
|
83
|
+
|
|
84
|
+
- MUST NOT decide brand identity — `DESIGN.md` owns palette/type/motion.
|
|
85
|
+
- MUST NOT restate `void-frontend-design`'s build rules — assume and check against them.
|
|
86
|
+
- MUST NOT drive a browser or make live requests — compose `void-qa` and review its current-diff evidence.
|
|
87
|
+
- MUST NOT rewrite a UI wholesale under a refine mode — a refine is a scoped, finding-driven edit.
|
|
88
|
+
- MUST NOT vendor the gstack/impeccable runtime (scripts, reference command files, comparison board).
|
|
89
|
+
|
|
90
|
+
## Final rule
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
Existing UI → classify register → AI-slop test → critique (squint + states) → technical audit → scoped refine.
|
|
94
|
+
Otherwise → it is not voidcorp ui-review.
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Anyone can generate a UI. This skill is what makes ours stop looking generated after it already shipped.
|
|
@@ -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: action
|
|
6
|
+
activation: on-demand
|
|
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,12 @@
|
|
|
1
|
+
Sources for `void-verify` skill (see `docs/plans/skill-audits/void-verify.md` for full audit):
|
|
2
|
+
|
|
3
|
+
- superpowers/verify — primary (checklist + observation discipline).
|
|
4
|
+
- citypaul/.dotfiles completion checklists — TS-strict checklist items.
|
|
5
|
+
- Atul Gawande "The Checklist Manifesto" — principle that checklists prevent omissions even for experts.
|
|
6
|
+
- NASA Power of Ten (informal "if it cannot fail, document why").
|
|
7
|
+
|
|
8
|
+
- gstack /ship — VENDORED (DEV-388): the Plan-Completion Audit (item-by-item DONE/PARTIAL/NOT-DONE/CHANGED/UNVERIFIABLE, the honesty rule "handling a deliverable is not the deliverable", per-item confirmation for UNVERIFIABLE, scope-drift) + the named-excuse rationalization list. The 12-item checklist verifies the build; this verifies you built what was specified.
|
|
9
|
+
|
|
10
|
+
Strategy: distill. Slim skill. Adapted for void-machine's specific signal set (12 items, each mapped to a skill or hook).
|
|
11
|
+
|
|
12
|
+
No new hooks (composes with all existing).
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: void-verify
|
|
3
|
+
description: Final pre-flight checklist. Twelve items observed (not assumed) — typecheck, tests, hooks, mobile+desktop, commit why, review evidence. Skipping requires reason. Use at end of every task.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# verify — voidcorp craftsman edition
|
|
7
|
+
|
|
8
|
+
"Task complete" claims diverge from reality when they are based on belief, not observation. Tests "passed earlier." Lint "should be clean." The mobile view "is probably fine." This skill is the final pre-flight: a twelve-item checklist, read at the end, each item OBSERVED, skipping documented.
|
|
9
|
+
|
|
10
|
+
**Attribution**: see `.source`. Primary source: superpowers/verify + citypaul completion checklists.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## When to run
|
|
15
|
+
|
|
16
|
+
At the end of EVERY task before reporting "done." Even tasks that feel trivial. The checklist for a one-line fix is short; the discipline is the same.
|
|
17
|
+
|
|
18
|
+
If you find yourself wanting to skip the checklist "because it's a small change," that is the signal: run it anyway, the small ones are where it pays the most.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## The checklist
|
|
23
|
+
|
|
24
|
+
Read item by item. Do not run from memory. Each item is OBSERVED, not assumed.
|
|
25
|
+
|
|
26
|
+
| # | Item | Composed with |
|
|
27
|
+
|---|---|---|
|
|
28
|
+
| 1 | Typecheck passes (`tsc --noEmit`) | `void-typescript-strict` + `tsc-noemit-precommit` hook |
|
|
29
|
+
| 2 | Tests pass — **observed after last code change** | `void-tdd` + `void-testing` |
|
|
30
|
+
| 3 | Lint passes (Biome) | `pack-monorepo` config |
|
|
31
|
+
| 4 | Coverage acceptable (per `void-tdd` mode strict / souple / exploratory) | `void-tdd` |
|
|
32
|
+
| 5 | Hooks pass (pre-commit dry-run on staged set) | All hooks (`tdd-guard`, `tigerstyle-check`, `no-any-grep`, ...) |
|
|
33
|
+
| 6 | UI changes verified in BOTH mobile and desktop viewports | `void-frontend-design` + `void-accessibility` (mobile-first dual-quality) |
|
|
34
|
+
| 7 | Observability hooks present for new business logic | `void-observability` |
|
|
35
|
+
| 8 | Security review check for any boundary / auth / secret change | `void-security-guidance` + `void-security-audit` |
|
|
36
|
+
| 9 | Documentation updated if any convention changed | `void-commit-discipline` "always say why" |
|
|
37
|
+
| 10 | Commit message includes the why (not just what) | `void-commit-discipline` |
|
|
38
|
+
| 11 | Independent review ran on the final change with no demonstrated blocking defect left open; review evidence block present in PR body (strict mode). A missing citation or explanation alone never fails this item | `void-code-review` |
|
|
39
|
+
| 12 | Spec / plan linked if work derives from one; plan resume point updated | `void-brainstorm` + `void-plan` |
|
|
40
|
+
|
|
41
|
+
Items 6, 7, 8 only fire when the change touches their domain.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Observed, not assumed
|
|
46
|
+
|
|
47
|
+
| Sign | What it means |
|
|
48
|
+
|---|---|
|
|
49
|
+
| "Tests should pass" | NOT observed. Run them again, then check. |
|
|
50
|
+
| "Linting was fine earlier" | Not observed since last change. Re-run. |
|
|
51
|
+
| "Mobile is probably the same" | NOT observed. Screenshot via `void-qa` (claude-in-chrome) on a phone viewport. |
|
|
52
|
+
| "Sentry is set up, so observability is handled" | NOT for this code path. Did you add the breadcrumb? The log? |
|
|
53
|
+
| "The hook ran before, why check" | Did you edit since? If yes, run again. |
|
|
54
|
+
|
|
55
|
+
"Should" and "probably" are the words this skill exists to eliminate. The named excuses (vendored from gstack `/ship`): "should work now" → run it; "I'm confident" → confidence is not evidence; "trivial change" → trivial changes break prod. If code changed since the last run, the last run is stale.
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Plan completion audit (vendored from gstack `/ship`)
|
|
60
|
+
|
|
61
|
+
The 12-item checklist verifies *the build works*. This verifies *you built what was specified*. When the work derives from a plan or ticket, classify **every actionable item** against the diff:
|
|
62
|
+
|
|
63
|
+
- `DONE` / `PARTIAL` / `NOT DONE` / `CHANGED` (deliberately deviated) / `UNVERIFIABLE` (cannot be proven from the diff — cross-repo, external state, runtime-only).
|
|
64
|
+
- **Honesty rule**: code that *handles* a deliverable is not the deliverable. "Added the webhook handler" ≠ "the webhook fires end-to-end."
|
|
65
|
+
- **Per-item confirmation for `UNVERIFIABLE`**: surface each one individually and ask — never a single blanket "all done?" over a list you cannot actually verify.
|
|
66
|
+
- **Scope drift**: did you build exactly what was asked? Name every piece of creep ("while I was in there…") and every missing requirement. **Creep is removed, or it carries one line in the commit saying why the change would be wrong without it.** This check was informational for its whole life and caught nothing: naming a creep and shipping it anyway satisfied it. Measured on 2026-08-31, in the session that hardened this very skill — a marker scaffold no gate had asked for, defensible, and nothing would have made anyone say so. Stop when the requirement is satisfied; the smallest sufficient change is the deliverable, not the floor.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Skipping items
|
|
71
|
+
|
|
72
|
+
Items can be skipped, but ONLY with an explicit stated reason in the completion report.
|
|
73
|
+
|
|
74
|
+
```markdown
|
|
75
|
+
- [x] Item 1: Typecheck passes (observed)
|
|
76
|
+
- [x] Item 2: Tests pass (observed, vitest run, 4/4 passing)
|
|
77
|
+
- [-] Item 6: UI viewports SKIPPED — no UI change in this diff
|
|
78
|
+
- [-] Item 7: Observability SKIPPED — pure refactor (no new business logic)
|
|
79
|
+
- [x] Item 9: Documentation N/A — no convention changed
|
|
80
|
+
- [x] Item 10: Commit message includes why (linked to spec)
|
|
81
|
+
- [x] Item 11: Review evidence block written
|
|
82
|
+
- [x] Item 12: Plan resume point updated (next step: 5)
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Silent skipping is the bug class this skill exists to prevent. Explicit skip with reason is fine; explicit skip without reason is not.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Output format
|
|
90
|
+
|
|
91
|
+
When reporting "done," include the checklist with check / skip status and the reason for any skip. The user sees the signals.
|
|
92
|
+
|
|
93
|
+
For multi-step plans (composes with `void-plan`): update the plan's "Resume point" section with the completed step.
|
|
94
|
+
|
|
95
|
+
For PRs (composes with `void-code-review`): the checklist feeds the Review Evidence block — they are not separate work.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Examples
|
|
100
|
+
|
|
101
|
+
### Small fix
|
|
102
|
+
|
|
103
|
+
```markdown
|
|
104
|
+
Done. Verification:
|
|
105
|
+
|
|
106
|
+
1. ✅ Typecheck (observed)
|
|
107
|
+
2. ✅ Tests pass (vitest run, 1 new test for the bug, all green)
|
|
108
|
+
3. ✅ Lint passes
|
|
109
|
+
4. ✅ Coverage holds (line + branch unchanged)
|
|
110
|
+
5. ✅ Pre-commit hooks (tdd-guard allowed test+fix pair, others green)
|
|
111
|
+
6. — N/A (no UI)
|
|
112
|
+
7. — N/A (no new business logic)
|
|
113
|
+
8. — N/A (no boundary change)
|
|
114
|
+
9. — N/A (no convention change)
|
|
115
|
+
10. ✅ Commit messages: `test: reproduce X` + `fix: <root cause>`
|
|
116
|
+
11. ✅ Review evidence block written (single-blocker resolved, 0 nits)
|
|
117
|
+
12. ✅ Spec linked (plan N/A — bug fix, no plan)
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Plan step
|
|
121
|
+
|
|
122
|
+
```markdown
|
|
123
|
+
Step 4 of plan `2026-06-01-checkout-flow-plan.md` complete. Verification:
|
|
124
|
+
|
|
125
|
+
1. ✅ Typecheck (observed)
|
|
126
|
+
2. ✅ Tests pass (vitest run --filter checkoutCart, 6/6 passing, mutation 96%)
|
|
127
|
+
3. ✅ Lint passes
|
|
128
|
+
4. ✅ Coverage 100% on services/checkout (strict mode)
|
|
129
|
+
5. ✅ Pre-commit hooks all pass
|
|
130
|
+
6. — N/A (use-case layer, not UI)
|
|
131
|
+
7. ✅ Observability: structured logs added at use-case entry/exit
|
|
132
|
+
8. ✅ Security: zod validation at boundary, no secret in commit
|
|
133
|
+
9. ✅ docs/DOMAIN.md updated with "checkout intent" term
|
|
134
|
+
10. ✅ Commits: test:reproduce / feat:implement / refactor:extract per Two-Hat
|
|
135
|
+
11. ✅ Review evidence block prepared (waiting for code-review run)
|
|
136
|
+
12. ✅ Plan resume point updated to Step 5
|
|
137
|
+
|
|
138
|
+
Next: invoke `void-code-review` for the Step 4 commits.
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## Composition with other skills
|
|
144
|
+
|
|
145
|
+
- **Runs LAST**, after every other skill.
|
|
146
|
+
- **With `void-tdd`**: items 2, 4 are tdd-mode-aware.
|
|
147
|
+
- **With `void-testing`**: item 2 includes "pristine output."
|
|
148
|
+
- **With `void-typescript-strict`**: item 1.
|
|
149
|
+
- **With `void-code-review`**: item 11 feeds the Review Evidence block.
|
|
150
|
+
- **With `void-commit-discipline`**: items 9, 10.
|
|
151
|
+
- **With `void-plan`**: item 12 — completion updates the plan resume point.
|
|
152
|
+
- **With `void-frontend-design` + `void-accessibility`**: item 6.
|
|
153
|
+
- **With `void-observability`**: item 7.
|
|
154
|
+
- **With `void-security-guidance`**: item 8.
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## Anti-rules
|
|
159
|
+
|
|
160
|
+
- MUST NOT define what "complete" means functionally — the task defines that.
|
|
161
|
+
- MUST NOT skip items silently.
|
|
162
|
+
- MUST NOT report completion in the middle of work (e.g., "Step 1 done, moving to Step 2" without verifying Step 1).
|
|
163
|
+
- MUST NOT substitute "looks fine" for observed signals.
|
|
164
|
+
- MUST NOT take the user out of the loop — the user sees the signals.
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Final rule
|
|
169
|
+
|
|
170
|
+
```
|
|
171
|
+
Task → all 12 items observed (or skip with stated reason) → user sees the signals → THEN report "done."
|
|
172
|
+
Otherwise → it is not voidcorp completion.
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
Checklists prevent omissions even for experts. The discipline pays for itself the first time it catches the test that "should have" been run.
|
|
176
|
+
|
|
177
|
+
## Bounded review evidence
|
|
178
|
+
|
|
179
|
+
Use the review receipt from `void-implement`: exact commit and base, acceptance criteria,
|
|
180
|
+
independent reviewer, conclusions, proofs and blocking-defect resolutions. A mutable worktree
|
|
181
|
+
alone is insufficient. Reuse unaffected evidence after correction and verify the affected
|
|
182
|
+
behavior only; do not trigger another general panel. Native runtime identity absence or refusal
|
|
183
|
+
is an explicit provenance limitation, not an extra certification gate. Actual independence and
|
|
184
|
+
valid evidence remain required. An unresolved blocking defect prevents completion.
|
|
@@ -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: action
|
|
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,11 @@
|
|
|
1
|
+
Sources:
|
|
2
|
+
- WCAG 2.2: https://www.w3.org/TR/WCAG22/
|
|
3
|
+
- WAI-ARIA Authoring Practices Guide: https://www.w3.org/WAI/ARIA/apg/
|
|
4
|
+
- void-machine accessibility doctrine: packages/core/skills/accessibility/SKILL.md
|
|
5
|
+
|
|
6
|
+
Adapted:
|
|
7
|
+
- Kept WCAG 2.2 AA as the floor plus semantic, keyboard, focus, name, contrast, target, error, motion, and assistive evidence.
|
|
8
|
+
- Requires human-observable interaction evidence where static analysis cannot prove behavior.
|
|
9
|
+
|
|
10
|
+
Rejected:
|
|
11
|
+
- Static-tool-only certification, visual-taste review, product-flow ownership, and implementation authority.
|