voidmachine 0.0.0 → 5.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 +285 -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 +62 -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 +172 -0
- package/core-assets/contract-history/visual-craft-director/v2.yaml +43 -0
- package/core-assets/data/catalog.v3.json +10527 -0
- package/core-assets/data/certification.json +1826 -0
- package/core-assets/data/identity.json +8 -0
- package/core-assets/data/model.json +4256 -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 +15448 -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 +394 -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 +278 -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 +166 -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 +192 -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-orchestrate/.source +16 -0
- package/core-assets/skills/void-orchestrate/SKILL.md +311 -0
- package/core-assets/skills/void-orchestrate/harness.yaml +10 -0
- package/core-assets/skills/void-plan/.source +15 -0
- package/core-assets/skills/void-plan/SKILL.md +246 -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 +13 -0
- package/core-assets/skills/void-security-guidance/SKILL.md +294 -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 +238 -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 +38 -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 +70173 -0
- package/package.json +68 -4
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: void-autopilot
|
|
3
|
+
description: Use to run the continuous delivery loop, where a curator ranks the backlog, up to four workers each run void-implement to a PR, and a local review verdict gates each merge until drained or stopped.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# autopilot
|
|
7
|
+
|
|
8
|
+
A continuous loop that takes tickets from the tracker to the integration branch without a human
|
|
9
|
+
at each merge. A curator ranks what is worth doing, up to four workers each carry one ticket to
|
|
10
|
+
a pull request, a reviewer reads each one once, and the loop merges the head it passed, through
|
|
11
|
+
GitHub's merge queue when the base has one. A person who says they merge themselves gets every
|
|
12
|
+
reviewed pull request instead. Promotion to the branch that deploys stays human.
|
|
13
|
+
|
|
14
|
+
**Attribution**: see `.source`.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## What this skill does NOT do
|
|
19
|
+
|
|
20
|
+
It owns no ticket cycle. Every worker runs the canonical `void-implement` skill, whole, once per
|
|
21
|
+
ticket, specialist panel included. If you find yourself writing "then the worker runs the tests,
|
|
22
|
+
then reviews..." inside autopilot, stop: that behaviour has one owner, and two copies drift until
|
|
23
|
+
a ticket gets a different standard depending on how it was started.
|
|
24
|
+
|
|
25
|
+
It never merges on a flag. Not on the command line, not because the checks are green, not because
|
|
26
|
+
the diff is small. There is no `--auto-merge` on any path and no merge gate to configure: the loop
|
|
27
|
+
merges into the integration branch only a head a local verdict passed, and never into the branch
|
|
28
|
+
that deploys -- `autopilot.deployBranch`, or the repository's default branch when the programme
|
|
29
|
+
names none. When the person says they merge themselves, run `void-machine autopilot merges
|
|
30
|
+
--by-human`: from the next tick every reviewed pull request goes to them instead (see Who merges).
|
|
31
|
+
Promotion from the integration branch to the one that deploys stays human.
|
|
32
|
+
|
|
33
|
+
It never merges a change to the machinery that judges merges. A pull request touching
|
|
34
|
+
`.github/**`, `scripts/independent-review-check.mjs`, `.void/program.md`, `packages/core/hooks/**`,
|
|
35
|
+
what a judging workflow runs from outside `.github`
|
|
36
|
+
(`scripts/promotion-authority.mjs`, `scripts/auto-merge-contract.mjs`, `scripts/verify.mjs`,
|
|
37
|
+
`packages/core/enforce/**`), what judges a publication (`scripts/prepare-release-artifact.mjs`,
|
|
38
|
+
`scripts/verify-release-publication.mjs` and the two release contracts they read), the loop code that believes a verdict and merges (`loop.ts`,
|
|
39
|
+
`loop-observe.ts`, `branch-identity.ts`, `commands/autopilot-loop.ts`), the local chain of judgment
|
|
40
|
+
(`packages/void-machine/src/**`, `commands/agents.ts`, `program.ts`, `judgments.ts`,
|
|
41
|
+
`merge-hold.ts`, the review command, its parser and the reviewer's definition,
|
|
42
|
+
`footprint-area.ts`), or the
|
|
43
|
+
runtime configuration installed here, which a reviewer running in a worktree of the head loads too
|
|
44
|
+
(`.void/hooks/**`, `.claude/**`, `.mcp.json`, `.codex/**`, `.void/config.json`) goes to a person with the file named (`protected-path`). A rename
|
|
45
|
+
counts by its source and its destination. The programme adds paths through
|
|
46
|
+
`autopilot.protectedPaths`; nothing removes from that floor.
|
|
47
|
+
|
|
48
|
+
It never closes, cancels or deletes a ticket, and it never touches `main` or repository settings.
|
|
49
|
+
Autopilot consent alone never authorizes credential operations: these require separate explicit
|
|
50
|
+
scope under `void-security-guidance`. Role restrictions, including read-only reviewers, remain binding.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Consent and target
|
|
55
|
+
|
|
56
|
+
The run takes no argument. `.void/program.md` names the progress provider, its scope, the base and
|
|
57
|
+
the `autopilot` block, so there is nothing to ask: not which ticket, not which provider.
|
|
58
|
+
|
|
59
|
+
That file is also the consent, and consent is never inferred. An absent `.void/program.md`, a
|
|
60
|
+
`status` other than `executing`, an `autopilot` block that is missing or unreadable, or
|
|
61
|
+
`autopilot.enabled: false` all mean the same thing -- say so and stop. `void-machine autopilot next`
|
|
62
|
+
refuses the same cases; inventing a target claims tickets nobody agreed to hand over. A programme
|
|
63
|
+
still written for the 4.0 merge gate (`autopilot.schemaVersion: 1` with `mergeGate`) is refused
|
|
64
|
+
too, with its migration; a former `mergeGate: human` runs `autopilot merges --by-human` first.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## The cursor between code and model
|
|
69
|
+
|
|
70
|
+
The model renders narrow, typed judgments; the policy stays in the code. Agents keep their whole
|
|
71
|
+
freedom over the work itself -- ranking, implementing, resolving a conflict, reading a diff. At
|
|
72
|
+
each decision point their answer is closed, and the CLI admits it against a schema before anything
|
|
73
|
+
acts. An answer that does not fit is a refusal naming the field, never an interpretation.
|
|
74
|
+
|
|
75
|
+
| Decision point | Judgment the model renders | Policy the code applies |
|
|
76
|
+
|---|---|---|
|
|
77
|
+
| Is a ticket workable | `readiness`: `ready`, `needs-enrichment` or `ambiguous`, with a reason | only `ready` gets a slot |
|
|
78
|
+
| What comes next | `queue`: ordered entries, each with a justification and a footprint | the head takes a free slot unless it collides |
|
|
79
|
+
| A conflict after ejection | `conflict`: the conflicting `headSha`, `mechanical` or `semantic`, with a reason | `semantic` waits for a human |
|
|
80
|
+
| A review | `review`: the `headSha` read, round 1 or 2, `blocking[]` each with location, scenario and correction, `advisory[]` | a blocking finding without a scenario is invalid; no merge without a clean verdict on the exact head; two rounds at most |
|
|
81
|
+
|
|
82
|
+
Slots, collisions, review rounds, stops, resumption and the merge are the kernel's. No agent may
|
|
83
|
+
skip a step, merge, or decide that a refusal does not apply to it.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Four roles, one subject each
|
|
88
|
+
|
|
89
|
+
**Curator.** Decides what is worth doing next. Touches the tracker, never code.
|
|
90
|
+
|
|
91
|
+
**Orchestrator.** Runs the loop. Evaluates no ticket, edits no code, reads no diff.
|
|
92
|
+
|
|
93
|
+
**Workers**, one per slot. Each carries one ticket from claim to an open pull request, in its own
|
|
94
|
+
worktree, by running `void-implement` whole.
|
|
95
|
+
|
|
96
|
+
**Reviewer.** The independent pass of `void-implement`, invoked by ORCH through
|
|
97
|
+
`void-orchestrate` in a fresh read-only context on the exact head SHA. `autopilot review`
|
|
98
|
+
prepares and collects its canonical receipt locally. There is no second review at merge
|
|
99
|
+
time: the merge happens on that head alone.
|
|
100
|
+
|
|
101
|
+
A role that starts doing another's job is the failure this split exists to prevent: an orchestrator
|
|
102
|
+
that "just looks at the diff" becomes a reviewer nobody bounded, and a worker that posts its own
|
|
103
|
+
verdict is a self-review GitHub reads as independent.
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Curator
|
|
108
|
+
|
|
109
|
+
Read the real state of the project before ranking anything: the programme, the specs and plans in
|
|
110
|
+
flight, the code they touch, open pull requests, recent merges, tickets waiting on a human.
|
|
111
|
+
|
|
112
|
+
Walk the tracker in this order: **Todo, then Backlog, then Triage.** Rank by what the project needs
|
|
113
|
+
-- what unblocks other work, what extends the work in flight, what removes a real risk -- not by
|
|
114
|
+
the priority label. The label is somebody's past guess; the ranking is today's reading of the
|
|
115
|
+
project.
|
|
116
|
+
|
|
117
|
+
- **Realign the tracker with the ranking.** Change priority or status so the tracker says what the
|
|
118
|
+
queue says, and leave on every ticket you move a justification of one or two sentences. A move
|
|
119
|
+
without a reason is indistinguishable from a mistake.
|
|
120
|
+
- **Enrich before ready.** A ticket too vague to implement goes through `void-ticket` before it can
|
|
121
|
+
be declared `ready`. One that stays ambiguous after that is `ambiguous`: it is set aside with its
|
|
122
|
+
reason, not guessed at.
|
|
123
|
+
- **Name the ground.** Every queued entry carries a footprint: the paths it will touch, at least
|
|
124
|
+
one. A ticket without one is not admitted; the kernel routes on footprints and cannot protect
|
|
125
|
+
ground nobody named.
|
|
126
|
+
- **Never close, cancel or delete.** Not a duplicate, not an obsolete ticket, not one you are sure
|
|
127
|
+
about. Say so in a comment and leave the decision to a person.
|
|
128
|
+
- **Re-rank after every merge.** A merge changes what is relevant next, so the queue is only valid
|
|
129
|
+
until the next one lands.
|
|
130
|
+
|
|
131
|
+
Return the queue as the typed `queue` judgment, at most sixteen entries. The curator can run in the
|
|
132
|
+
orchestrator's session or as its own agent; either way its output is data the kernel admits, not an
|
|
133
|
+
instruction the orchestrator follows.
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## Orchestrator
|
|
138
|
+
|
|
139
|
+
The loop is one question asked again and again: `void-machine autopilot next --json`, with the
|
|
140
|
+
tracker state on stdin. The command reads the programme, GitHub, the shared git state and the stop
|
|
141
|
+
signal itself; GitHub is the authority on a merge, so no agent reports it.
|
|
142
|
+
|
|
143
|
+
What you pipe in is the tracker as you observed it -- `void-machine autopilot --help` gives the
|
|
144
|
+
shape: `schemaVersion: 1`, the curator's `queue`, every ticket in scope with its provider status,
|
|
145
|
+
`humanWait`, pull request, branch, footprint and the raw `readiness` attached to it, the `recent`
|
|
146
|
+
outcomes of this run, the `liveWorkers` you actually have, and `quota` (`low` once the runtime
|
|
147
|
+
reports its limit is near). Pass judgments through raw; the kernel admits each one where it is
|
|
148
|
+
used, so one malformed answer refuses its own decision and nothing else.
|
|
149
|
+
|
|
150
|
+
Act on each returned action, then ask again:
|
|
151
|
+
|
|
152
|
+
| Action | What you do |
|
|
153
|
+
|---|---|
|
|
154
|
+
| `assign` | claim the ticket (In Progress, assigned), run `autopilot fingerprint --before <ticket>`, create or reuse its worktree, spawn its worker |
|
|
155
|
+
| `wait` | nothing; the reason says who is working |
|
|
156
|
+
| `hand-back-to-worker` | give the ticket back to its worker, alive or respawned in the same worktree, with the reason and the pull request; a respawned worker resumes its mission (see Respawning) |
|
|
157
|
+
| `mark-human-wait` | record it in `recent` with its `reason`, which `recent` requires and the recap repeats, put the decision's `humanWaitLabel` on the ticket, comment the reason and detail, free the slot; keep reporting its pull request and footprint, which hold its ground until that pull request merges or closes |
|
|
158
|
+
| `merge` | `void-machine autopilot merge --ticket <id> --pr <n> --head <headSha>`, on a base with no merge queue: it proves again the hold, the verdict and the target, merges exactly that head with `--match-head-commit`, and arms the native auto-merge on it when the base's policy refuses a direct merge; never `gh pr merge` by hand, never `--admin` |
|
|
159
|
+
| `update-branch` | `void-machine autopilot update-branch --pr <n> --head <headSha>`: GitHub merges the base into the branch if its head is still that one; the new head is reviewed before anything merges it |
|
|
160
|
+
| `enable-auto-merge` | `void-machine autopilot arm --ticket <id> --pr <n> --head <headSha>`, on a base with a merge queue: the same guards, then it records the head, arms on exactly that head and reads GitHub back; never `gh pr merge --auto` by hand, never `--admin` |
|
|
161
|
+
| `disable-auto-merge` | `void-machine autopilot disarm --pr <n>`, before the action that follows it for the same ticket; it turns its auto-merge off, then takes it out of the merge queue, and fails while GitHub still shows either; never `gh pr merge --disable-auto` alone, which leaves a queued pull request in the queue |
|
|
162
|
+
| `review` | `void-machine autopilot review --ticket <id> --pr <n> --head <headSha> --round <round> --mission <canonical-id>`; on awaiting-native-review use `void-orchestrate` for the actual reviewer, record canonical receipts, then repeat to collect. The same attempt keeps its 30 minute deadline; failures retain the existing budget |
|
|
163
|
+
| `requeue` | the same command, to put an ejected head back in the queue; the kernel bounds how often |
|
|
164
|
+
| `drain` | take nothing new; keep acting on the tickets in flight |
|
|
165
|
+
| `freeze` | stop acting, once the disarms before it succeeded |
|
|
166
|
+
| `recap` | write the final recap and end the run |
|
|
167
|
+
|
|
168
|
+
A pull request observed merged has no action: move its ticket to Done, clean its worktree, count it
|
|
169
|
+
in `recent`, and ask the curator to re-rank. `refusals` name judgments the kernel would not admit:
|
|
170
|
+
send each back to the agent that produced it.
|
|
171
|
+
|
|
172
|
+
**Spawning.** Every worker gets its worktree before it starts, at the durable location the
|
|
173
|
+
doctrine's worktree rule names, reused when its branch already has one. A worker never chooses its
|
|
174
|
+
own checkout and never works in the main one. Compose `void-orchestrate` to choose supported
|
|
175
|
+
native delegation, including the session-host selection policy and the Herdr adapter
|
|
176
|
+
with its central files when applicable. Count writers,
|
|
177
|
+
researchers and reviewers against available dispatch capacity; the ticket cap is unchanged.
|
|
178
|
+
An assigned worker executes the unit once, without recursively delegating the complete cycle.
|
|
179
|
+
`liveWorkers` reflects reconciled actual sessions and current evidence, never stale pane hints.
|
|
180
|
+
No permission is widened. Collect results before closure; uncertainty requires reconciliation.
|
|
181
|
+
|
|
182
|
+
**Respawning.** A hand-back goes to the same native session that holds the ticket, with the
|
|
183
|
+
reason and pull request as data. Re-read mission, Git and actual session evidence; consult central
|
|
184
|
+
brief/report and fresh Herdr identities only when that adapter is selected. Never a second run
|
|
185
|
+
beside an existing or uncertain invocation. A missing session is reported; retain its evidence.
|
|
186
|
+
|
|
187
|
+
A respawned worker resumes; it never starts the ticket again. Its code is in its
|
|
188
|
+
worktree and its branch, its progress in its mission journal, `.void/machine/runs/<mission>/events.jsonl`
|
|
189
|
+
under the installation root, which is the main checkout and not the worktree. It finds its mission
|
|
190
|
+
as the open one whose `mission.json` carries the ticket id as its title, runs
|
|
191
|
+
`void-machine mission resume --id <mission> --json` and acts on the recovery decision it prints,
|
|
192
|
+
then goes on with `mission dispatch`. `resume` records itself once per checkpoint; it exits 1 while
|
|
193
|
+
the mission waits and refuses a closed one, and neither is answered by opening a new mission: the
|
|
194
|
+
worker reports it. When the worktree is gone, recreate it from the branch. When the branch the
|
|
195
|
+
tracker names for the ticket is gone too, locally and on the remote, the work is lost: do not
|
|
196
|
+
spawn over it, record `mark-human-wait` yourself with the reason `branch-missing`.
|
|
197
|
+
|
|
198
|
+
**The fingerprint.** A worktree isolates the working tree, the index and `HEAD`, and nothing else:
|
|
199
|
+
the local config and the files it includes, the stash, tags, notes, remotes, the local base and
|
|
200
|
+
deploy branches, replace refs, `hooks/` and `info/` are one set for every worktree. The upstream
|
|
201
|
+
(`remote`, `merge`) of every branch but the bases and the one that deploys is left out, since units
|
|
202
|
+
in flight set it when they create or push their branch and drop it with a merged one; the bases'
|
|
203
|
+
own settings still count. So start each worktree from
|
|
204
|
+
`origin/<base>` and never move a local base branch while units are in flight. The baseline
|
|
205
|
+
recorded at `assign` is written once: a second `--before` for the same ticket is refused, so a unit
|
|
206
|
+
cannot re-record the state it left as the state it found. It is compared by the worker before it
|
|
207
|
+
pushes, with `autopilot fingerprint --after <ticket>`, and again by the kernel before it arms a
|
|
208
|
+
merge. A changed or missing baseline sends the ticket to a human, unpublished; only that person
|
|
209
|
+
deletes the record.
|
|
210
|
+
|
|
211
|
+
**Disarming.** Armed means GitHub merges without anyone acting again: an auto-merge request, or,
|
|
212
|
+
once the checks pass on a base with a merge queue, an entry in that queue and no request at all.
|
|
213
|
+
GitHub keeps an auto-merge armed across a push by anyone with write access, shows
|
|
214
|
+
no armed head, and its required check trusts the status alone. So `arm` records the head it armed,
|
|
215
|
+
and `next` returns `disable-auto-merge` when it can no longer vouch for an armed pull request: its
|
|
216
|
+
head moved since `arm` recorded it (then `hand-back-to-worker`, `head-moved-after-arming`: the new
|
|
217
|
+
head is unreviewed), no clean local verdict holds the armed head (then
|
|
218
|
+
`mark-human-wait`, `armed-verdict-unproven`), nothing recorded the arming (then
|
|
219
|
+
`mark-human-wait`, `arming-unrecorded`), or a person took the merges back (then
|
|
220
|
+
`mark-human-wait`, `human-merge-hold`). An armed merge survives a tick only while the loop vouches
|
|
221
|
+
for its head and hands it to nobody (`wait merging`): a worker at work, any
|
|
222
|
+
hand-back, a human wait and an immediate stop all come with the disarm. Disarm first, always.
|
|
223
|
+
|
|
224
|
+
**The review is local.** `autopilot review` prepares the exact head in a detached worktree,
|
|
225
|
+
checks its `HEAD` before and after collection and refuses any protected path. ORCH invokes the
|
|
226
|
+
native reviewer there. Collection requires the canonical independent receipt and actual matching
|
|
227
|
+
request/start/completion: reviewedCommit, baseCommit, acceptanceCriteriaHash, distinct writer and
|
|
228
|
+
reviewer, read-only scope and authentic native-context or review-artifact provenance. A central
|
|
229
|
+
report marked done proves none of these. The verdict is recorded in
|
|
230
|
+
`.void/machine/autopilot/reviews/<ticket>/<head>.json`; `next` decides on that record alone.
|
|
231
|
+
One attempt runs per head, pending rereads do not reset its deadline, recorded verdicts are
|
|
232
|
+
immutable and rounds are counted from existing records. Legacy in-flight runs retain their own
|
|
233
|
+
collector and journals. A verdict posted on the pull request is a copy for people. Checks,
|
|
234
|
+
protected paths, shared-state fingerprints, human holds and merge permissions are unchanged.
|
|
235
|
+
Remove a review worktree with the ticket's own only after the pull request is observed merged.
|
|
236
|
+
|
|
237
|
+
**Who merges.** The loop, by default. When the person says they merge themselves, run
|
|
238
|
+
`void-machine autopilot merges --by-human`; `--automatic` gives the merges back, and bare
|
|
239
|
+
`merges` prints the state. The hold is a file in the machine's state,
|
|
240
|
+
`.void/machine/autopilot/merge-hold.json`, never the programme, which is protected and versioned:
|
|
241
|
+
it takes effect on the next tick, with no pull request, and every decision reports it in
|
|
242
|
+
`merges`. It hands a pull request over after the review, never before: a head is reviewed, its
|
|
243
|
+
checks settle, then it goes to the person (`mark-human-wait`, `human-merge-hold`), and an armed
|
|
244
|
+
merge is disarmed first. A hold file that cannot be read counts as a hold. Those waits never
|
|
245
|
+
count toward the streak that stops the loop. A hold only takes authority away; removing it
|
|
246
|
+
returns to the default the person already accepted.
|
|
247
|
+
|
|
248
|
+
**No state lives in the session.** Who holds which ticket comes from the tracker (status, assignee,
|
|
249
|
+
pull request link, the human-wait label); the rest comes from GitHub. The label is the one every
|
|
250
|
+
decision names in `humanWaitLabel`: `autopilot.humanWaitLabel` when the programme declares it,
|
|
251
|
+
`void:human-wait` otherwise; report `humanWait` as that label's presence, nothing else. After a restart -- an OS
|
|
252
|
+
update, a cut, a saturated context -- the first `next` rebuilds the slots from those two sources,
|
|
253
|
+
and a ticket already held is resumed, never seated twice. Report each ticket's branch and pull
|
|
254
|
+
request whenever they exist, whatever its status: a ticket still ready but with a branch or a pull
|
|
255
|
+
request is a unit in flight, and the kernel resumes it instead of seating a second worker. A
|
|
256
|
+
ticket whose state is ambiguous goes to a human rather than being relaunched.
|
|
257
|
+
|
|
258
|
+
**Judgments survive a restart.** A worker's conflict class is a comment carrying a machine block:
|
|
259
|
+
two HTML comment markers around a fenced JSON value, the block `void-machine autopilot judgment
|
|
260
|
+
conflict-class` prints for the JSON on its stdin; `next` reads it from GitHub and admits it again.
|
|
261
|
+
The review verdict is the local record above, never a comment. The tracker you pipe in carries
|
|
262
|
+
neither, so a restart loses nothing.
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## Workers
|
|
267
|
+
|
|
268
|
+
Given: one ticket id, its worktree, its branch, the programme's plan and spec. The worker re-fetches
|
|
269
|
+
the complete ticket itself; it never works from a summary.
|
|
270
|
+
|
|
271
|
+
It runs `void-implement` whole in that worktree, and starts its mission with the ticket id as its
|
|
272
|
+
`--title`, which is how a respawn finds it again. Before any context compaction it writes to the
|
|
273
|
+
mission what it has done: each specialist result through `mission specialist-event`, each proof
|
|
274
|
+
through `mission verify`, a committed candidate through `mission writer-event`. The journal accepts
|
|
275
|
+
only these typed events, no free note; what is not yet one of them does not survive a respawn, and
|
|
276
|
+
uncommitted edits survive only in the worktree. When its proofs are green it runs
|
|
277
|
+
`autopilot fingerprint --after <ticket>`, pushes its own branch, opens one pull request towards the
|
|
278
|
+
base, ready for review rather than as a draft, and moves the ticket to In Review. The reviewer the
|
|
279
|
+
orchestrator invokes is that cycle's independent review; it reviews ready pull requests only, so a
|
|
280
|
+
draft waits.
|
|
281
|
+
Blocking findings come back as a hand-back and are corrected as a batch, per `void-implement`.
|
|
282
|
+
|
|
283
|
+
On a hand-back the worker reads the reason: failing checks, blocking findings, a conflict, or a
|
|
284
|
+
base that moved. It updates its branch by merging the base into it,
|
|
285
|
+
never by rewriting pushed history, re-runs its proofs, and pushes again.
|
|
286
|
+
|
|
287
|
+
May: run every `void-implement` pass whose predicate fires, run its own gates, apply a migration in
|
|
288
|
+
dev/local only, push its own branch without force, and open or update its own pull request.
|
|
289
|
+
|
|
290
|
+
May not: enable auto-merge, merge anything, post or record a verdict, run `autopilot review`, move a ticket to Done, close or cancel a ticket, touch another ticket's branch or worktree,
|
|
291
|
+
prune the mission journals, or write the git state the repository shares -- `refs/stash`, tags,
|
|
292
|
+
notes, remotes, the repository config.
|
|
293
|
+
|
|
294
|
+
---
|
|
295
|
+
|
|
296
|
+
## Reviewer
|
|
297
|
+
|
|
298
|
+
`independent-code-reviewer`, collected by `autopilot review` on the head of a ready pull request.
|
|
299
|
+
Its brief carries the diff against the merge base as data, what blocks, and the answer it returns:
|
|
300
|
+
its own completion contract, each finding classified, a blocking one located at `path:line` in the
|
|
301
|
+
head. The kernel binds the answer to the head and the round; a reviewer that could not judge, whose
|
|
302
|
+
verdict contradicts its findings, or whose answer the contract refuses, gives no verdict.
|
|
303
|
+
|
|
304
|
+
**What blocks.** Only what is wrong or dangerous, with a concrete scenario: incorrect behaviour, a
|
|
305
|
+
vulnerability, an unstable or empty proof, a broken consumer. Each blocking finding names its
|
|
306
|
+
location, the scenario and the correction. Everything else is advisory. The number of blocking
|
|
307
|
+
findings measures nothing; a pass that files four advisories and blocks on none is a good pass.
|
|
308
|
+
|
|
309
|
+
**Advisories** of a merged ticket's verdict go into a single Triage issue per ticket, filed by the
|
|
310
|
+
orchestrator, and never come back into the loop.
|
|
311
|
+
|
|
312
|
+
**Rounds.** After a correction, round 2 is handed round 1's blocking findings and checks only those
|
|
313
|
+
against the new diff; it opens no new general reading. Still blocking after round 2, the kernel
|
|
314
|
+
hands the ticket to a human with the finding. The kernel counts rounds from the local records, one
|
|
315
|
+
per head a verdict blocked, not from the round a verdict announces, and a reviewer that failed
|
|
316
|
+
without a verdict is an attempt it delegates again, not a round.
|
|
317
|
+
|
|
318
|
+
---
|
|
319
|
+
|
|
320
|
+
## Conflicts and the merge queue
|
|
321
|
+
|
|
322
|
+
A head merges once a clean local verdict holds it, no check on it fails or is pending (a head no
|
|
323
|
+
check runs on merges on its verdict alone), no protected path is touched and its branch is up to
|
|
324
|
+
date with the base. When the base has a merge queue, GitHub rebuilds the combined commit of every
|
|
325
|
+
pull request ahead and reruns the required checks before it merges. Two tickets green alone and
|
|
326
|
+
broken together cannot reach the base. Required checks a repository adds on the base are one more
|
|
327
|
+
gate GitHub enforces at merge time; the loop needs none.
|
|
328
|
+
|
|
329
|
+
A pull request ejected from the queue whose head still passes its checks and carries a clean
|
|
330
|
+
verdict has nothing for its worker to fix: the kernel answers `requeue`, at most twice for the same
|
|
331
|
+
head, then sends the ticket to a human. An ejected head whose own checks fail goes back to its
|
|
332
|
+
worker as failing checks. A pull request in conflict with the base goes back to its worker. The
|
|
333
|
+
worker classifies the conflict as the typed `conflict` judgment on the conflicting head, posted
|
|
334
|
+
through `autopilot judgment conflict-class`: `mechanical` it resolves, re-runs
|
|
335
|
+
its proofs and pushes; `semantic` -- two intents that disagree -- it leaves alone, and the kernel
|
|
336
|
+
sends the ticket to a human. A worker never picks a side of a semantic conflict to keep the loop
|
|
337
|
+
moving.
|
|
338
|
+
|
|
339
|
+
**Serial fallback.** Without a merge queue, merges run one at a time: the oldest ready pull request
|
|
340
|
+
(or the one already merging) holds the turn. The kernel reads whether the base moved past its head
|
|
341
|
+
itself, since GitHub reports it only under a protection that requires it: a head behind gets
|
|
342
|
+
`update-branch`, its new head is reviewed again, then merged, then the next. `merge` reads it once
|
|
343
|
+
more just before merging. Same guarantee, lower throughput; the residual window is a person
|
|
344
|
+
merging by hand between that read and the merge. The kernel keeps the turn; you do not.
|
|
345
|
+
|
|
346
|
+
---
|
|
347
|
+
|
|
348
|
+
## Stopping
|
|
349
|
+
|
|
350
|
+
**Drain.** Requested by a person (`void-machine autopilot stop --drain`, from any pane) or reached
|
|
351
|
+
on its own: nothing ready or preparable, quota low, or three tickets in a row handed to a human
|
|
352
|
+
(a pull request waiting only because a person holds the merges is not one).
|
|
353
|
+
The loop takes nothing new, carries the tickets in flight to a merge or a human wait, closes its
|
|
354
|
+
agents, cleans the merged worktrees, and writes the recap.
|
|
355
|
+
|
|
356
|
+
**Now.** `void-machine autopilot stop --now`. Everything freezes, a merge GitHub would run on its
|
|
357
|
+
own included: `next` returns a `disable-auto-merge` for every armed pull request, then `freeze`.
|
|
358
|
+
Run the disarms, then stop. When `next` cannot read what is armed, or a disarm fails, it does not
|
|
359
|
+
pretend to have frozen: disarm by hand what it names and tell the person. Nothing is lost: the
|
|
360
|
+
state is in the tracker and GitHub, and a later run resumes from there.
|
|
361
|
+
|
|
362
|
+
The stop file stays until someone deletes it; a new run starts only once it is gone.
|
|
363
|
+
|
|
364
|
+
**The recap.** What merged, what waits and why, the advisory issues created, and the time each
|
|
365
|
+
ticket took. It is the account a person reads when they come back; write it from observed state,
|
|
366
|
+
never from memory of the session.
|
|
367
|
+
|
|
368
|
+
---
|
|
369
|
+
|
|
370
|
+
## Red flags
|
|
371
|
+
|
|
372
|
+
| Rationalization | Reality |
|
|
373
|
+
|---|---|
|
|
374
|
+
| "The checks are green, merge it myself" | Only `merge` or `enable-auto-merge` from the kernel merges, through its command, and only on the SHA it names. |
|
|
375
|
+
| "They said they'd merge, I'll remember that" | Run `autopilot merges --by-human`. The loop reads the file every tick; a session forgets. |
|
|
376
|
+
| "The worker already reviewed its diff" | Self-review is not independent. The reviewer is a separate context on the exact SHA. |
|
|
377
|
+
| "Post the verdict comment by hand, it is quicker" | No comment counts: the loop merges on the local record `autopilot review` writes. A hand-written one is text. |
|
|
378
|
+
| "The reviewer failed, approve it and move on" | A failed review is delegated again once, then a person looks. Nothing approves a head the reviewer did not judge. |
|
|
379
|
+
| "That advisory matters, block on it" | Blocking needs a scenario where it is wrong or dangerous. Otherwise it goes to the Triage issue. |
|
|
380
|
+
| "This duplicate ticket can just be closed" | The curator never closes. Comment, and leave it to a person. |
|
|
381
|
+
| "P1 on the label, so it goes first" | The ranking reads the project, not the label. Justify the move on the ticket. |
|
|
382
|
+
| "Both tickets touch different folders, seat them together" | Different folders, same lockfile is still a collision. The kernel decides. |
|
|
383
|
+
| "The conflict is semantic but I see what they meant" | A semantic conflict waits for a human. |
|
|
384
|
+
| "I remember which worker had which ticket" | Rebuild from the tracker and GitHub. The session is not the state. |
|
|
385
|
+
| "The PR is gone from the list, it must have been merged" | Only a merged pull request observed on GitHub is a merge. |
|
|
386
|
+
|
|
387
|
+
---
|
|
388
|
+
|
|
389
|
+
## Composition
|
|
390
|
+
|
|
391
|
+
Upstream: `void-ticket` authors and enriches the tickets and the programme descriptor. Per ticket:
|
|
392
|
+
`void-implement`, entire, once, in the worker's worktree. The merge into the integration branch
|
|
393
|
+
belongs to the loop, on a local verdict, or to a person who holds the merges; the promotion to the
|
|
394
|
+
branch that deploys always belongs to a person.
|
|
@@ -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: pretooluse
|
|
12
|
+
codex: pretooluse
|
|
13
|
+
hermes: ci-only
|
|
14
|
+
eval_targets: [claude/anthropic/opus]
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
Sources for `void-brainstorm` skill (see `docs/plans/skill-audits/void-brainstorm.md` for full audit):
|
|
2
|
+
|
|
3
|
+
- superpowers/brainstorm — primary source. Hard gate, one-question, multi-choice preferred, 2–3 approaches, spec-write, transition to plan.
|
|
4
|
+
- gstack /office-hours — VENDORED (DEV-386): the YC product diagnostic (six forcing questions, anti-sycophancy, 10x ambition move) distilled into the "Pressure-testing a raw idea" upstream mode. Builder-visual/cross-model/gstack-runtime rejected. Was composed upstream; now absorbed as the gstack teardown removes it.
|
|
5
|
+
- gstack /spec — VENDORED (DEV-388, the precision half): read-code-before-asking (cite path:line, "don't ask what you can read"), the five mandatory "why" questions gate, quantify-everything, and failure-mode thinking as a first-class axis. The executability gate + MVP-cut half went to plan; the single-solution persona was NOT allowed to overwrite this skill's 2-3-approaches divergence.
|
|
6
|
+
- compound-engineering (EveryInc) — plan phase referenced; rejected as primary (no clear gate between explore and implement).
|
|
7
|
+
- Boris Cherny "how Boris uses Claude Code" — discipline of writing the design before code.
|
|
8
|
+
|
|
9
|
+
Strategy: distill. Three deliberate changes from superpowers:
|
|
10
|
+
1. Spec location: docs/specs/YYYY-MM-DD-<topic>.md (consumer convention)
|
|
11
|
+
2. Transition target: plan (vendored equivalent)
|
|
12
|
+
3. No trigger filter on activation (per Section 0bis hedge resolution)
|
|
13
|
+
|
|
14
|
+
No companion hooks; the gate is a process discipline enforced via void-code-review flags downstream.
|