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,276 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: void-hexagonal-architecture
|
|
3
|
+
description: Ports + adapters. Domain owns interfaces, adapters at the edge, function-parameter injection only, no DI / CQRS / mediator. Use when placing code or crossing module boundaries.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# hexagonal-architecture — voidcorp craftsman edition
|
|
7
|
+
|
|
8
|
+
The domain decides; the world translates. Ports are interfaces the domain owns. Adapters wire ports to concrete technologies at the edge. Components do not touch the DB; services do not touch the framework router; use-cases orchestrate ports with no I/O of their own. The boundary makes the domain testable in isolation and replaceable infrastructure cheap.
|
|
9
|
+
|
|
10
|
+
**Attribution**: see `.source` in this directory. Foundation: Cockburn 2005, Graca "Explicit Architecture," Bernhardt "Functional Core, Imperative Shell."
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Core terms
|
|
15
|
+
|
|
16
|
+
| Term | Definition |
|
|
17
|
+
|---|---|
|
|
18
|
+
| **Domain** | The pure code that knows the business. Entities, aggregates, value objects, domain services. No I/O. |
|
|
19
|
+
| **Port** | An interface owned by the domain that describes what the domain needs from the outside. Named by behavior (`OrdersPort.save`), not technology (`PostgresOrders` is an adapter). |
|
|
20
|
+
| **Adapter** | An implementation of a port at the edge. Translates domain types to/from the external API. Thin. |
|
|
21
|
+
| **Use-case** (application layer) | A thin function orchestrating ports for a specific user goal. Pure-by-default (no I/O), side effects via injected ports. Lives in `services/` (per `pack-monorepo` convention). |
|
|
22
|
+
| **In-memory adapter** | A port adapter that runs in memory, owned by the domain test fixtures. Used by unit tests. Composes with `void-testing` skill's nullable infrastructure pattern. |
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Dependency direction
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
domain → ports ← adapters
|
|
30
|
+
↓
|
|
31
|
+
infrastructure (Drizzle, fetch, Resend SDK, ...)
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Read it: the domain depends on its own port interfaces. Adapters depend on the port interfaces and on infrastructure. **Infrastructure NEVER depends on the domain.** Reversing this direction is a Red Flag.
|
|
35
|
+
|
|
36
|
+
The companion hook `boundary-direction-check` enforces this on every commit.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Function-parameter injection (no DI container)
|
|
41
|
+
|
|
42
|
+
The use-case takes its dependencies as a `deps` parameter:
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
export interface CheckoutDeps {
|
|
46
|
+
readonly orders: OrdersPort;
|
|
47
|
+
readonly payment: PaymentPort;
|
|
48
|
+
readonly events: EventBusPort;
|
|
49
|
+
readonly clock: ClockPort;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export async function checkoutCart(
|
|
53
|
+
deps: CheckoutDeps,
|
|
54
|
+
input: { cartId: CartId; userId: UserId },
|
|
55
|
+
): Promise<Result<OrderConfirmation, CheckoutError>> {
|
|
56
|
+
const cart = await deps.orders.findCartById(input.cartId);
|
|
57
|
+
if (!cart.ok) return cart;
|
|
58
|
+
// ... pure orchestration ...
|
|
59
|
+
return ok({ orderId: cart.value.id, confirmedAt: deps.clock.now() });
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Composition at the call site:
|
|
64
|
+
|
|
65
|
+
```typescript
|
|
66
|
+
// in the framework boundary (Next.js Server Action, etc.)
|
|
67
|
+
const deps: CheckoutDeps = {
|
|
68
|
+
orders: createDrizzleOrdersAdapter(db),
|
|
69
|
+
payment: createStripePaymentAdapter(stripe),
|
|
70
|
+
events: createPgOutboxEventBusAdapter(db),
|
|
71
|
+
clock: createSystemClockAdapter(),
|
|
72
|
+
};
|
|
73
|
+
const result = await checkoutCart(deps, { cartId, userId });
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Tests use in-memory adapters with the same shape — see `void-testing` skill nullable infrastructure pattern.
|
|
77
|
+
|
|
78
|
+
### No DI containers (tsyringe, awilix, inversify)
|
|
79
|
+
|
|
80
|
+
Rejected per `.void/installed/PHILOSOPHY.md` Wing Chun. Function-parameter injection is the same logical pattern with zero runtime cost, zero magic, zero learning curve.
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Use-cases (the application layer)
|
|
85
|
+
|
|
86
|
+
A use-case is a function for a specific user goal. It:
|
|
87
|
+
|
|
88
|
+
- Takes `deps` (injected ports) and `input` (parsed, validated)
|
|
89
|
+
- Returns `Result<Output, Error>` (composes with `void-functional`)
|
|
90
|
+
- Orchestrates ports — no `fetch`, no `Date.now()`, no `console.log` inside
|
|
91
|
+
- Lives in `services/<context>/<use-case>.ts`
|
|
92
|
+
|
|
93
|
+
### Smell: use-case with > 5 `deps` fields
|
|
94
|
+
|
|
95
|
+
The use-case is doing too much. Split into multiple use-cases, or extract a sub-flow.
|
|
96
|
+
|
|
97
|
+
### Smell: use-case with `if (deps.featureFlag)` branches
|
|
98
|
+
|
|
99
|
+
The use-case is encoding multiple flows. Split into two use-cases, the boundary picks which to call.
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## Adapters — thin, one job
|
|
104
|
+
|
|
105
|
+
An adapter does ONE thing: translate domain types to/from the external API.
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
export function createDrizzleOrdersAdapter(db: Database): OrdersPort {
|
|
109
|
+
return {
|
|
110
|
+
async findById(id) {
|
|
111
|
+
const row = await db.select().from(orders).where(eq(orders.id, id)).get();
|
|
112
|
+
if (!row) return err({ kind: 'not_found', id });
|
|
113
|
+
return ok(rowToDomain(row)); // <-- translation, nothing else
|
|
114
|
+
},
|
|
115
|
+
async save(order) {
|
|
116
|
+
await db.insert(orders).values(domainToRow(order)).onConflictDoUpdate(...);
|
|
117
|
+
return ok(undefined);
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Banned in adapters
|
|
124
|
+
|
|
125
|
+
- Business decisions ("if order total > $1000, set priority")
|
|
126
|
+
- Cross-port coordination ("save to DB AND emit event in one method")
|
|
127
|
+
- Validation beyond type translation (Zod for trust-boundary input lives in use-cases or boundary, not in adapters)
|
|
128
|
+
|
|
129
|
+
### The "fat port" smell
|
|
130
|
+
|
|
131
|
+
A `PaymentPort` that grew to handle refunds + disputes + billing reports has too many concerns. Split: `PaymentChargesPort`, `PaymentRefundsPort`, `PaymentReportingPort`. Composes with `void-domain-driven-design` (each port aligns with one bounded-context capability).
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Layered convention (`pack-monorepo` provides)
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
src/
|
|
139
|
+
├── domain/ # entities, aggregates, value objects, domain events
|
|
140
|
+
├── services/ # use-cases (application layer) — orchestrate ports
|
|
141
|
+
│ └── <context>/
|
|
142
|
+
├── adapters/ # all adapters (port implementations)
|
|
143
|
+
│ ├── repositories/ # persistence adapters (DB)
|
|
144
|
+
│ └── external/ # third-party APIs (Stripe, Resend, ...)
|
|
145
|
+
└── infrastructure/ # raw infra (Drizzle config, Stripe SDK instances)
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
The `pack-monorepo` enforces import direction via tsconfig `paths`:
|
|
149
|
+
|
|
150
|
+
- `domain/` cannot import from `services/`, `adapters/`, `infrastructure/`
|
|
151
|
+
- `services/` can import from `domain/` only
|
|
152
|
+
- `adapters/` can import from `domain/`, `services/` (for port interfaces), `infrastructure/`
|
|
153
|
+
|
|
154
|
+
The companion hook `boundary-direction-check` greps cross-layer violations as a belt-and-suspenders.
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## In-memory adapter pattern
|
|
159
|
+
|
|
160
|
+
Every port has an in-memory adapter co-located in production code (`adapters/in-memory/`):
|
|
161
|
+
|
|
162
|
+
```typescript
|
|
163
|
+
export function createInMemoryOrdersAdapter(
|
|
164
|
+
seed: { orders?: Order[] } = {},
|
|
165
|
+
): OrdersPort {
|
|
166
|
+
const store = new Map<OrderId, Order>(
|
|
167
|
+
(seed.orders ?? []).map((o) => [o.id, o]),
|
|
168
|
+
);
|
|
169
|
+
return {
|
|
170
|
+
async findById(id) {
|
|
171
|
+
const o = store.get(id);
|
|
172
|
+
return o ? ok(o) : err({ kind: 'not_found', id });
|
|
173
|
+
},
|
|
174
|
+
async save(o) { store.set(o.id, o); return ok(undefined); },
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
Tests use it directly:
|
|
180
|
+
|
|
181
|
+
```typescript
|
|
182
|
+
test('checkout confirms the cart', async () => {
|
|
183
|
+
const deps = {
|
|
184
|
+
orders: createInMemoryOrdersAdapter({ orders: [makeCart({ id: cartId })] }),
|
|
185
|
+
payment: createInMemoryPaymentAdapter({ alwaysSucceed: true }),
|
|
186
|
+
events: createInMemoryEventBusAdapter(),
|
|
187
|
+
clock: createFakeClockAdapter('2026-01-01T00:00:00Z'),
|
|
188
|
+
};
|
|
189
|
+
const result = await checkoutCart(deps, { cartId, userId });
|
|
190
|
+
expect(result.ok).toBe(true);
|
|
191
|
+
});
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
No mocking framework. The shape of in-memory matches the shape of production. Composes with `void-testing` skill's nullable infrastructure pattern.
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## Composition with other skills
|
|
199
|
+
|
|
200
|
+
- **`void-domain-driven-design`**: decides bounded contexts, aggregates, ubiquitous language. This skill decides where the boundaries sit physically. Repository ports per aggregate.
|
|
201
|
+
- **`void-functional`**: ports return `Result<T, E>`. Use-cases are pure functions. Functional core / imperative shell IS the hex boundary, viewed through a different lens.
|
|
202
|
+
- **`void-tdd`**: hex makes the domain testable in isolation; RED writes a use-case test with in-memory adapters; GREEN implements.
|
|
203
|
+
- **`void-testing`**: nullable infrastructure pattern (Shore) IS the in-memory-adapter pattern at the port level. Co-evolved.
|
|
204
|
+
- **`void-security-guidance`**: trust boundary = adapter ingress. Zod validation of external input happens at the adapter.
|
|
205
|
+
- **`void-typescript-strict`**: port interfaces use branded types for domain primitives. Types travel across boundaries via Zod schemas.
|
|
206
|
+
- **`void-refactor`**: cross-boundary moves (Move from `services/` to `adapters/`, or vice versa) — this skill decides target placement; refactor executes the move.
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## Banned
|
|
211
|
+
|
|
212
|
+
### DI containers (tsyringe, awilix, inversify)
|
|
213
|
+
|
|
214
|
+
Per `.void/installed/PHILOSOPHY.md` Wing Chun. Function-parameter injection covers the same need with zero cost.
|
|
215
|
+
|
|
216
|
+
### CQRS as default
|
|
217
|
+
|
|
218
|
+
Split read / write models only when read scale or read shape diverges enough to justify duplication. Most domains do not. Re-introducing CQRS is an ADR, written through the `void-decide` skill.
|
|
219
|
+
|
|
220
|
+
### Mediator pattern (MediatR-style dispatch)
|
|
221
|
+
|
|
222
|
+
Use-cases called directly. The call graph stays visible.
|
|
223
|
+
|
|
224
|
+
### Generic `Repository<T>` base class
|
|
225
|
+
|
|
226
|
+
Each port is named by what it does, with specific methods. A generic CRUD repository exposes too much and hides invariants.
|
|
227
|
+
|
|
228
|
+
### Event sourcing as default
|
|
229
|
+
|
|
230
|
+
Replayable event log is an audit / temporal tool, not a default persistence strategy. Re-introducing is an ADR.
|
|
231
|
+
|
|
232
|
+
### Domain → infrastructure imports
|
|
233
|
+
|
|
234
|
+
The companion hook blocks. There is no legitimate exception.
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## Companion hooks
|
|
239
|
+
|
|
240
|
+
- **`boundary-direction-check`** (pre-commit) — greps cross-layer imports forbidden by the architecture (domain → infrastructure / adapters). See `../../hooks/`.
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## Anti-rules
|
|
245
|
+
|
|
246
|
+
- MUST NOT decide which framework, queue technology, cache technology — those are pack concerns.
|
|
247
|
+
- MUST NOT decide DB schema — `void-domain-driven-design` picks aggregates; `void-migrations` handles mechanics.
|
|
248
|
+
- MUST NOT impose DI containers, CQRS, mediator, event sourcing — all rejected at the architecture level.
|
|
249
|
+
- MUST NOT silently allow domain → infrastructure imports.
|
|
250
|
+
|
|
251
|
+
---
|
|
252
|
+
|
|
253
|
+
## When you are stuck
|
|
254
|
+
|
|
255
|
+
| Problem | Solution |
|
|
256
|
+
|---|---|
|
|
257
|
+
| Where does this code go? | Ask: pure decision = `domain/` or `services/`. I/O = `adapters/`. Infra detail = `infrastructure/`. |
|
|
258
|
+
| Adapter is growing logic | Adapter is too fat. Move logic to a use-case in `services/`. |
|
|
259
|
+
| Use-case has too many deps | Use-case is doing too much. Split. |
|
|
260
|
+
| Need to test a use-case with side effects | Inject ports. Use in-memory adapters in tests. |
|
|
261
|
+
| Need to swap DB / SDK | Adapter only. Domain unchanged. |
|
|
262
|
+
| Need cross-cutting concern (transaction, trace) | Higher-order wrapper `withTransaction(useCase)` composes at the call site. |
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## Final rule
|
|
267
|
+
|
|
268
|
+
```
|
|
269
|
+
Domain → pure decisions.
|
|
270
|
+
Adapters → translation at the edge.
|
|
271
|
+
Use-cases → orchestrate ports with no I/O of their own.
|
|
272
|
+
Infrastructure NEVER depends on the domain.
|
|
273
|
+
Otherwise → it is not voidcorp hexagonal.
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
The architecture is the seam between what the business cares about and what the technology happens to be. Make the seam clean.
|
|
@@ -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,39 @@
|
|
|
1
|
+
Sources for `void-implement` skill (see `docs/plans/skill-audits/void-implement.md` for full audit):
|
|
2
|
+
|
|
3
|
+
- Original void-machine composition skill. No single external source: it is the
|
|
4
|
+
canonical "execute one ticket end-to-end" conductor that the harness lacked.
|
|
5
|
+
- The former backlog-autopilot skill, retired at the 2026-07-30 cutover, carried
|
|
6
|
+
an INLINE per-ticket cycle (plan -> TDD -> static UX/UI pass -> ...). That
|
|
7
|
+
cycle was extracted here so there is one definition, and its successor
|
|
8
|
+
autopilot delegates per ticket. Removes responsibility overlap. Named
|
|
9
|
+
in prose rather than with the routing prefix, which means "go here" and must
|
|
10
|
+
never point at a skill that no longer exists.
|
|
11
|
+
- Composes (does not reimplement): tdd, testing,
|
|
12
|
+
hexagonal-architecture, domain-driven-design,
|
|
13
|
+
frontend-design, accessibility, security-guidance,
|
|
14
|
+
code-review, verify,
|
|
15
|
+
commit-discipline, security-audit, ui-review; agents
|
|
16
|
+
type-design-analyzer, doctrine-critic, silent-failure-hunter; gstack /qa
|
|
17
|
+
(browser QA until Vague 4). The impeccable audit methodology is now vendored as
|
|
18
|
+
ui-review (DEV-389), not an external dependency.
|
|
19
|
+
|
|
20
|
+
- gstack /ship — VENDORED (DEV-388, cycle-level disciplines only): Test-Failure-Ownership triage (in-branch vs pre-existing), the independent fresh-context adversarial review pass (FIXABLE/INVESTIGATE + name-the-most-exploitable-finding), and bisectable commit ordering. Rejected: the Review-Army roster/gating machinery (release-gate apparatus, over-engineered for one ticket) and the VERSION/CHANGELOG/release-please steps (deployment runtime). The plan-completion-audit half of /ship went to verify.
|
|
21
|
+
|
|
22
|
+
- Claude Code subagents (official): https://code.claude.com/docs/en/sub-agents — fresh context,
|
|
23
|
+
project agent discovery, permission inheritance, and native agent invocation. Adapted to require
|
|
24
|
+
one completion event per accepted structured result and to fail closed when isolation is weak.
|
|
25
|
+
- Claude Code non-interactive mode (official): https://code.claude.com/docs/en/headless — `-p`,
|
|
26
|
+
structured JSON output, JSON Schema, and explicit tool/permission bounds for eval adapters.
|
|
27
|
+
- Codex subagents (official): https://learn.chatgpt.com/docs/agent-configuration/subagents — project
|
|
28
|
+
custom agents, fresh spawned sessions, read-only sandbox declaration, and parent-override limit.
|
|
29
|
+
- Codex non-interactive mode (official): https://learn.chatgpt.com/docs/non-interactive-mode —
|
|
30
|
+
`codex exec --json`, `--output-schema`, `--ephemeral`, and explicit read-only sandboxing.
|
|
31
|
+
|
|
32
|
+
DEV-441 adaptation: prose remains the user-facing conductor, but execution truth moves to the pure
|
|
33
|
+
Mission Engine controller and canonical events. Rejected: sequential self-review in the writer
|
|
34
|
+
context, reviewer writes, majority voting, unbounded correction, and timeout-as-success.
|
|
35
|
+
|
|
36
|
+
Strategy: author. The load-bearing idea is the predicate-keyed triage: speed
|
|
37
|
+
comes from skipping passes whose trigger is false, never from skipping an
|
|
38
|
+
ALWAYS pass. This is the "an expert team would cover all of it" guarantee made
|
|
39
|
+
operational, and the anti-loophole against "go fast" pressure.
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: void-implement
|
|
3
|
+
description: Use when taking a single ticket from ready through shipped at expert-team quality. Triggers on starting a ticket, taking an issue, or picking up a backlog item to execute.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# implement
|
|
7
|
+
|
|
8
|
+
One ticket, taken from ready to shipped, with the coverage a senior expert team would give it: architecture, tests, end-to-end, UX, security, review. This is the single canonical definition of "execute one ticket well." Both interactive work and `void-autopilot` delegate here, so the cycle is defined once and improving it improves both.
|
|
9
|
+
|
|
10
|
+
**Core principle:** Speed comes from skipping ceremony on trivial work, never from skipping a pass whose trigger fired. The triage is keyed to observable predicates (does it touch a boundary, a UI, a trust edge), not to a feeling that the change "looks simple."
|
|
11
|
+
|
|
12
|
+
**Attribution**: see `.source`.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Canonical team orchestration
|
|
17
|
+
|
|
18
|
+
When the caller supplies `panel.provider: orchestrator`, the orchestrator owns specialist
|
|
19
|
+
dispatch. The worker consumes the supplied verdicts, corrects in its own context, and returns the
|
|
20
|
+
panel record; it does not start `mode team`, spawn specialists, or report a missing primitive as
|
|
21
|
+
`DEGRADED`. Interactive work may use the native provider when the runtime exposes fresh contexts.
|
|
22
|
+
|
|
23
|
+
For `team` missions, the prose below is not the routing authority. Load the canonical mission plan
|
|
24
|
+
before invoking an agent. The pure Mission Engine controller owns state and verdict; the CLI
|
|
25
|
+
materializes its runtime-neutral specialist envelopes from the current plan.
|
|
26
|
+
|
|
27
|
+
1. Keep one `leadWriterId` for implementation and every correction. The implementer owns
|
|
28
|
+
the worktree and code; specialists and the independent reviewer never edit.
|
|
29
|
+
2. Start with `mission start --ticket <ticket>` and follow `mission dispatch --id <mission>
|
|
30
|
+
--json`. The frozen task and controller own routing, state and correction budget. Before
|
|
31
|
+
implementation, invoke only the risk-relevant preparation specialists returned by dispatch.
|
|
32
|
+
Supply their exact envelopes and context packs; collect each result without inventing a
|
|
33
|
+
completion. Record each actual start and completion with `mission specialist-event --id <mission>`.
|
|
34
|
+
A missing response calls for resumption, not another correction cycle.
|
|
35
|
+
3. The implementer implements and verifies, then commits the candidate. Record the pending
|
|
36
|
+
writer receipt with `mission writer-event --id <mission>`. Review must bind an exact
|
|
37
|
+
`reviewedCommit`, `baseCommit` and `acceptanceCriteriaHash`; a mutable worktree is insufficient.
|
|
38
|
+
Prefer a dedicated worktree pinned to that commit, with native read-only permissions.
|
|
39
|
+
4. Dispatch one independent general review. Use the runtime's native separate reviewer context
|
|
40
|
+
and preserve its actual result. Submit the canonical completion and minimal review receipt:
|
|
41
|
+
task, reviewer and writer identities, exact subject, conclusions, proofs and resolutions.
|
|
42
|
+
Native context identity supplements provenance; missing or refused identity alone does not
|
|
43
|
+
invalidate an executed, traceable independent review. Use the supported artifact provenance
|
|
44
|
+
path and state its precise limitation. Never invent an identity, independence or review.
|
|
45
|
+
Malformed, mismatched, stale or forged evidence still refuses; self-review is not independent.
|
|
46
|
+
5. Only a concrete blocking defect requests correction: name the violated criterion, consequence,
|
|
47
|
+
evidence and resolution condition. Advisory findings never block, consume a correction cycle
|
|
48
|
+
or trigger another review. The implementer corrects or records a reasoned disagreement.
|
|
49
|
+
6. Submit corrections as a coherent batch, commit and record the writer event. Verification is
|
|
50
|
+
targeted to the original findings and affected behavior, never a new general panel. Retain
|
|
51
|
+
unaffected conclusions and proofs; invalidate only affected evidence. A new targeted blocker
|
|
52
|
+
must demonstrate a regression from the correction or a defect within the original scope.
|
|
53
|
+
Carry unresolved blockers until an explicit, evidenced resolution; silence is not resolution.
|
|
54
|
+
7. Maximum two correction batches after the initial general review. A batch is submitted
|
|
55
|
+
corrections awaiting targeted verification. Agent restart, incomplete review, transport repair
|
|
56
|
+
and mission resumption neither consume a batch nor reset the budget. At the limit, stop
|
|
57
|
+
automatic corrective dispatch, retain history and expose a cause, owner and next action.
|
|
58
|
+
Never declare completion with an unresolved blocking defect. The orchestrator may obtain
|
|
59
|
+
one independent opinion on a disputed point and retain it as proof for targeted verification;
|
|
60
|
+
this is not an automatic arbitration command or a permission override. It never reopens
|
|
61
|
+
general review or resets the budget.
|
|
62
|
+
8. Use `mission verify` for required verification evidence. Future implementation proofs do not
|
|
63
|
+
block preparation prematurely. Escalate to the human only a decision beyond the mandate.
|
|
64
|
+
A turn ending does not end the task. Resume through supported mission commands, preserving
|
|
65
|
+
prior reviews, resolutions, budgets and effects. Existing attestation-only stops need explicit
|
|
66
|
+
validation of the original review's subject, available provenance and result before recovery;
|
|
67
|
+
never promote a degraded historical result automatically or recreate the mission to bypass it.
|
|
68
|
+
9. Collect the final result before closing an orchestrator-owned agent panel. Keep worktrees,
|
|
69
|
+
branches and useful proofs on their distinct lifecycle. Panel closure never deletes them.
|
|
70
|
+
|
|
71
|
+
The CLI and existing Mission Engine implement this bounded cycle. A runtime certification is
|
|
72
|
+
not an additional delivery gate. Concrete independence, permission, isolation, evidence and
|
|
73
|
+
acceptance failures remain enforceable; an unavailable reviewer is reported, never fabricated.
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## When to invoke
|
|
78
|
+
|
|
79
|
+
- Starting any single ticket or issue you intend to implement and ship.
|
|
80
|
+
- Once per ticket by `void-autopilot` (the per-ticket cycle IS this skill, run inside a worktree subagent).
|
|
81
|
+
- After `void-ticket` produced the ticket: its declared passes are an accelerator HINT. You ALWAYS evaluate the predicates yourself; a declaration may only ADD a pass, never cancel one whose predicate fired.
|
|
82
|
+
|
|
83
|
+
Do NOT use this to plan several tickets (that is `void-plan`) or to author the ticket itself (`void-ticket`).
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## The cycle
|
|
88
|
+
|
|
89
|
+
Run in order. Each pass names the skill it composes and the predicate that fires it. `ALWAYS` passes never skip; conditional passes skip only when their predicate is false. You ALWAYS evaluate every predicate yourself against the actual change: a ticket declaration may ADD a pass, never cancel one whose predicate fired.
|
|
90
|
+
|
|
91
|
+
1. **Ingest + completeness gate** (ALWAYS). Fetch the complete ticket, including native relations: scope, AC, DoD, edge cases, declared passes, blockers. If `.void/program.md` scopes the unit, also read its global plan and spec. Confirm the unit is ready and nothing is missing or ambiguous. If a gap or uncovered angle exists, loop back to `void-ticket` to complete it before coding, do not paper over it. For a provider-backed unit, move it to the declared started state and assign it to the current maintainer before the first implementation edit. Load or compile the canonical mission plan and verify its hash before any specialist invocation; missing or conflicting plan data is degraded, not guessed.
|
|
92
|
+
2. **Architecture pass** (IF it touches structure, a module boundary, the data model, or public types). Compose `void-hexagonal-architecture`, `void-domain-driven-design`, agents `type-design-analyzer` + `doctrine-critic`. Confirm the applicable ADR is honored.
|
|
93
|
+
3. **Source grounding** (ALWAYS; the source depends on what the change touches). Read the relevant sources before the first line, per the Anti-rustine section of `PHILOSOPHY.md`. For a third-party configuration, schema or call signature, compose `void-source-driven-development`: official documentation **of the installed version**, never an upgrade by default. For internal code, read the owning contract, types, source and project docs of what you are about to change. Assumed semantics produce bugs that cost hours to find, and the assumption is invisible in the diff — which is why this runs before the writing rather than at review. Cite a source briefly when it helps understand or record a choice; a missing citation never blocks on its own.
|
|
94
|
+
4. **Migration safety** (IF it changes a DB schema or ships a migration). Compose `void-migrations` (and `void-drizzle-migration-safe` on a Drizzle/Postgres stack): zero-downtime, two-phase, batched backfill, locking analysis. **Once the migration is generated and safety-reviewed, apply it to the dev/local database before the TDD and E2E passes run** — otherwise those tests execute against a stale schema and prove nothing about the new shape. **This cycle only ever applies to dev/local; production migrations run through CI / GitHub Actions on merge, never from a worker or this session** (see the `void-migrations` anti-rule). A schema change must never reach the rest of the cycle without this pass.
|
|
95
|
+
5. **Convene the panel** (ALWAYS once, in `team` mode). Call `mission dispatch --json` and act on what it returns. In `team` mode its first action is `invoke-specialists` at `stage: 'pre-implementation'`: the panel speaks **before** the first line is written, which is the whole reason it exists. Invoke each returned envelope's exact `agentName` in a fresh context and paste that envelope's `contextPack` into the prompt verbatim -- the diff, the touched paths, the artifacts, and `omitted` naming what the budget refused. Do not point a specialist at a file to read and do not send it exploring: its turns are few, and a specialist that spends them looking returns nothing. Record `started`, then `completed` or `failed`, for every envelope. Findings from this pass are the brief the writer implements against; a `blocked` verdict stops the cycle here rather than after the code exists. Later dispatches follow the controller's current stage and never replay this preparation pass.
|
|
96
|
+
6. **TDD implementation** (ALWAYS). The single lead writer composes `void-tdd` + `void-testing`. Red, green, refactor. Unit tests for the behavior, green before moving on. Review specialists remain read-only.
|
|
97
|
+
7. **Async + idempotency** (IF it sends email, calls an external side-effecting API, enqueues a job, or mints a single-use token). Compose `void-async-safety`: idempotency keys, replay/dedup window, bounded retries, single-use enforcement.
|
|
98
|
+
8. **End-to-end tests** (IF it touches a user-facing flow). Write/extend the E2E suite (Playwright). The path a user actually walks, not just the unit.
|
|
99
|
+
9. **UX/UI pass** (IF it touches a UI surface). The interface is held to production craft, not just "it renders". Compose `void-frontend-design` (build-time craft) + `void-ui-review` (the audit/critique ceiling: AI-slop test, squint test, interaction-state coverage, technical audit) + `void-accessibility`, across the baseline (BACK+FRONT parity, mobile and desktop, and the states a user actually hits — loading / error / empty). Browser-verified QA (live screenshots) runs via `void-qa` (the claude-in-chrome MCP). A UI ticket is not shippable until this pass is **verified, not assumed**.
|
|
100
|
+
10. **Security pass** (ALWAYS a quick scan; DEEP if it touches a trust boundary: external input, auth, RLS/tenancy, untrusted content, secrets, or a side-effecting action). Compose `void-security-guidance` + `void-security-audit`.
|
|
101
|
+
11. **Review** (ALWAYS). Run the single independent general review in the bounded cycle above. Compose `void-code-review` for that pass. Relevant preparation specialists advise before implementation; they are not a mandatory repeated post-implementation panel. After corrections, inspect only the affected findings and behavior. Findings are judged by demonstrated consequence, not reviewer majority.
|
|
102
|
+
**Judge the change against the economy-of-means section of `PHILOSOPHY.md`**: a judgment, not a score, explained briefly only when that helps record a choice. It blocks only on a demonstrated defect (security, broken behavior, or a boundary or contract violated with a real consequence); anything else is advisory.
|
|
103
|
+
**Review the draft against the anti-patch rule.** The review is real; no verbal ritual is required. The first implementation that comes to mind is often a patch at the wrong level of abstraction: tokenising a string where the API takes a typed schema, mocking a field the real adapter never returns, disabling a flag instead of understanding what it blocks. A V0 mock mirrors the real adapter's signature, never a convenience one. It is judged **here**, on the first draft, because before the writing there is nothing to judge — and it does not belong to the Architecture pass, since a patch slips in precisely through the changes that touch no structure at all.
|
|
104
|
+
12. **Verification before completion** (ALWAYS). Compose `void-verify`: typecheck, tests, hooks, both viewports, all observed not assumed. **A red suite is adjudicated before proceeding** (from gstack `/ship`): each failure is *in-branch* (you touched the test/code, or it traces to the diff → it is yours, fix it) or *pre-existing* (neither touched → offer fix / TODO / skip); ambiguous defaults to in-branch. Test on the **merged base**, not the stale branch. Completion requires the independent review, resolution of blocking defects, and fresh applicable verification proofs; native runtime attestation alone is not a delivery prerequisite.
|
|
105
|
+
13. **Dogfood the shipped surface** (IF the ticket adds or changes a CLI command, a hook, an executable skill, or any output a person will read). Run the thing, on the **real repository**, and quote what came back in the evidence.
|
|
106
|
+
This exists because the passes above have a measured hit rate of zero on a whole class of defect. Six shipped on 2026-08-06 with typecheck, lint, 2,700 tests and five CI checks green: five were caught by using the thing on the real tree, one by the harness itself, none by CI and none by the human merge gate. One of them reported "5 path(s) not extracted" about files it had read, parsed and indexed — the exact lie the feature existed to prevent — and it surfaced by running the command on the repo, after merge. Under autopilot nobody comes back to the previous ticket, so a defect found that way is a defect not found at all.
|
|
107
|
+
**A fixture is not a dogfood.** The fixture is the shortcut that would have missed every one of the six: the two oversized generated artifacts that exposed the false count existed only in the real tree. **And "the command did not crash" is not an observation** — the output has to be read, and quoted rather than summarised as "works". A surface that genuinely cannot run here (a deploy, a remote service) has its limitation named, never worked around in silence. Keep the run read-only or reversible.
|
|
108
|
+
14. **Dispose of what you found** (ALWAYS). A cycle surfaces defects that are not this ticket: an incoherent skill, a stale doc, a contract that lies. Do not file them on their merits. Compare each against the unit you are building, judged against the program objective: it either blocks this unit and is fixed here, or it beats this unit and becomes the next one, or it is **dropped**. Write one recap line per finding naming what it lost to. Record only evidence that cannot be reconstructed — a failure seen once, a measurement — with the command that replays it. The admission rules are `void-ticket`'s; this pass is where they fire.
|
|
109
|
+
15. **Ship** (ALWAYS). Compose `void-commit-discipline`, open the PR, attach the PR and verification evidence, then move a tracker-backed ticket to **In Review**. Move it to **Done** only after merge and final verification of the merged state. Commits are **bisectable** — one logical change each, dependency-ordered (infra → domain + tests → edge/UI + tests), each independently valid. Under `void-autopilot` the worker pushes its own branch and opens the PR, but never enables auto-merge, merges, posts the review status or moves the ticket to Done; the loop's reviewer performs the independent review of step 11 on the PR head SHA.
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Tracker lifecycle
|
|
114
|
+
|
|
115
|
+
For every tracker-backed ticket, the tracker is part of execution, not an after-the-fact mirror:
|
|
116
|
+
|
|
117
|
+
- **Claim before edits**: re-fetch status and relations, verify blockers are complete, then set `In Progress` and assign the current maintainer.
|
|
118
|
+
- **Keep it truthful**: maintain native blockers and add a concise comment when a material blocker, scope decision, or external dependency changes the contract.
|
|
119
|
+
- **Leave a bounded handoff**: when a session ends unfinished, keep `In Progress` and comment with branch/worktree, last verified result, remaining work, blocker, and exact next action.
|
|
120
|
+
- **Review before done**: after ticket gates pass, attach PR/evidence and use `In Review`; use `Done` only after merge and final verification.
|
|
121
|
+
- **Respect human gates**: collect evidence and request approval, but never complete a gate or merge without the declared human action.
|
|
122
|
+
- **Fail closed**: when `.void/program.md` requires provider-backed execution and the declared adapter cannot perform a required read or write, stop that action. Do not select another unit or maintain a competing local current/next-unit pointer.
|
|
123
|
+
|
|
124
|
+
Never place secrets, full prompts, full model responses, or private source in tracker comments.
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## Triage: what "fast" means
|
|
129
|
+
|
|
130
|
+
Evaluate every predicate against the actual change. Never let an upstream declaration suppress a pass whose predicate is true.
|
|
131
|
+
|
|
132
|
+
| Pass | Fires when | Skippable |
|
|
133
|
+
|------|-----------|-----------|
|
|
134
|
+
| Ingest + completeness | always | no |
|
|
135
|
+
| Architecture | structure / boundary / data model / public type | yes |
|
|
136
|
+
| Source grounding | always (official docs if third-party, project contracts if internal) | no (source varies) |
|
|
137
|
+
| Migration safety | DB schema change or migration | yes |
|
|
138
|
+
| TDD implementation | always | no |
|
|
139
|
+
| Async + idempotency | email / external side effect / job / single-use token | yes |
|
|
140
|
+
| End-to-end tests | user-facing flow touched | yes |
|
|
141
|
+
| UX/UI | UI surface touched | yes |
|
|
142
|
+
| Security | always (deep if trust boundary) | no (depth varies) |
|
|
143
|
+
| Review | always | no |
|
|
144
|
+
| Verification | always | no |
|
|
145
|
+
| Dogfood | CLI command / hook / executable skill / output a person reads | yes |
|
|
146
|
+
| Ship | always | no |
|
|
147
|
+
|
|
148
|
+
"Fast" = skip the passes whose predicate is false. It never means skipping an `ALWAYS` pass, or one whose predicate fired, to save time.
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## Red flags: STOP, you are skipping a triggered pass
|
|
153
|
+
|
|
154
|
+
| Rationalization | Reality |
|
|
155
|
+
|-----------------|---------|
|
|
156
|
+
| "One-line change, skip the review" | Review is ALWAYS. One-liners ship the worst regressions. |
|
|
157
|
+
| "No UI here, skip security" | Security quick-scan is ALWAYS; a backend input is a bigger injection surface than a button. |
|
|
158
|
+
| "Tests after, ship now, it works" | TDD is ALWAYS. Tests written after green prove nothing about intent. |
|
|
159
|
+
| "It hits a trust boundary but it is internal" | Internal still gets the DEEP security pass. Tenancy leaks are internal. |
|
|
160
|
+
| "Going fast means skipping E2E" | Fast skips passes whose PREDICATE is false, not the ones that fired. |
|
|
161
|
+
| "The ticket looked complete, skip the gate" | The gate is one read. A missing edge case found now is hours saved later. |
|
|
162
|
+
| "It works, I'll clean it up after" / "I'll mock that field to unblock the test" | That IS the patch, and it sits at the wrong level. The test going green is not the evidence — refactor the approach, do not paper over it. |
|
|
163
|
+
| "I know how this library works, no need to open the docs" | Assumed semantics are the expensive bug: invisible in the diff, found hours later. Source grounding reads the docs of the INSTALLED version, which is not the one memory holds. |
|
|
164
|
+
| "The tests are green, no need to run it" | Green tests and a working surface are different claims. Six defects shipped past 2,700 of them; what caught five was running the thing. The Dogfood pass fires on a surface, not on a doubt. |
|
|
165
|
+
| "I dogfooded it on the fixture" | The fixture is the shortcut. It holds what you thought to put there, which is never the artifact that breaks the count. Real repository or it did not happen. |
|
|
166
|
+
| "It renders, ship the UI" | Rendering is not craft. The UX/UI pass runs `void-frontend-design` + `void-ui-review` (audit) — hierarchy, motion, states, mobile, anti-slop, not just "it appears". |
|
|
167
|
+
|
|
168
|
+
Violating the letter of the triage is violating its spirit: the predicate decides, not the vibe.
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## Model tier by pass (frugality, no quality loss)
|
|
173
|
+
|
|
174
|
+
Tokens follow stakes: mechanical work runs cheap, judgment runs at full strength. This never cheapens a judgment pass — the predicate that fires a pass also sets its tier.
|
|
175
|
+
|
|
176
|
+
- **Mechanical (may run a cheaper model)**: the ingest read, artifact/mirror regeneration, a trivial edit whose predicate fired nothing else.
|
|
177
|
+
- **Judgment (stay top-tier)**: architecture, DEEP security, the review adversarial pass, verification adjudication of a red suite, and any brainstorm/design step.
|
|
178
|
+
- **Subagents carry their own tier**: `doctrine-critic` / `silent-failure-hunter` / `code-explorer` run sonnet; `type-design-analyzer` runs sonnet, `migration-planner` opus (see the agent frontmatter). This skill composes them; it does not override their tier.
|
|
179
|
+
- **Interactive vs worker**: run interactively, the cycle uses the session model (the human's choice); the tiering above is realized when the cycle runs as a `void-autopilot` **worker**, where the worker's model is set from the ticket's stakes (`workerTier`, top-tier by default). A light ticket's whole cycle runs cheaper; a high-stakes one stays full-strength.
|
|
180
|
+
|
|
181
|
+
## Composition
|
|
182
|
+
|
|
183
|
+
Upstream: `void-ticket` produces the ticket and declares its conditional passes. Caller: `void-autopilot` runs this once per ticket in parallel worktrees, whole and once. Neither restates a pass of this cycle: it has one owner so a ticket gets the same standard however it was started. The skill conducts; the Mission Engine controller decides state, invalidation, and verdict; native specialists own their bounded reviews.
|
|
@@ -0,0 +1,14 @@
|
|
|
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
|
+
owner: folpe
|
|
7
|
+
runtimes: [claude, codex]
|
|
8
|
+
enforcement:
|
|
9
|
+
floor: ci
|
|
10
|
+
inline:
|
|
11
|
+
claude: active
|
|
12
|
+
codex: active
|
|
13
|
+
hermes: ci-only
|
|
14
|
+
eval_targets: [claude/anthropic/opus]
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Sources for `void-learn` skill (see `docs/plans/skill-audits/void-learn.md` for the full audit).
|
|
2
|
+
|
|
3
|
+
This skill is the 2026-07-09 fusion of three former skills (issue #75) — it inherits their attributions:
|
|
4
|
+
|
|
5
|
+
- compounding — EveryInc/compound-engineering-plugin (https://github.com/EveryInc/compound-engineering-plugin): "each unit of work should make the next easier". Contributed the end-of-cycle extraction ritual (Branch C).
|
|
6
|
+
- capture-rule — original to void-machine; inspiration Boris Cherny "how Boris uses Claude Code" + Kieran Klaassen (EveryInc). Contributed the HITL project-rule capture into .void/PROJECT-DOCTRINE.md (Branch A). Design constraint: NO auto-write into doctrine, ever.
|
|
7
|
+
- harness-evolution — citypaul/.dotfiles self-evolution discipline + the compound-engineering loop, adapted with an HITL gate. Contributed the inbound-feedback-as-GitHub-issue flow and the obsolescence audit (Branch B). See issue #35 / DECISIONS.md (2026-06-26) for why the .void/harness-feedback/proposed/ queue + `feedback push` were dropped.
|
|
8
|
+
|
|
9
|
+
Strategy: fuse + distill. Three doors to one action ("capture a lesson") separated by ~200 lines of mutual boundary-policing collapsed into one skill whose first step is the routing decision. All three behaviors preserved verbatim in intent, each keeping its own HITL gate; the inter-skill delimitation prose was removed (no boundary to police once they are one skill).
|
|
10
|
+
|
|
11
|
+
What we reject:
|
|
12
|
+
- A Stop nudge hook to auto-remind at cycle close — evaluated and rejected: a Stop payload carries no session-start reference or merge signal, so "cycle closed" cannot be detected reliably, and a false-firing nudge erodes trust more than it helps. Auto-discovery via the broad description + triggers is the primary mechanism. See the audit note.
|
|
13
|
+
- The obsolescence-audit machinery as prose — it lives in the CLI (`void-machine audit`, #70/#72); the skill interprets the report, it does not reimplement it.
|