@getarbiter/cli 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +713 -0
- package/LICENSE +202 -0
- package/NOTICE +31 -0
- package/PRIVACY.md +111 -0
- package/README.md +237 -0
- package/THIRD_PARTY_LICENSES.md +472 -0
- package/dist/.src-manifest.json +1 -0
- package/dist/capabilities/host-probe.js +3 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +87 -0
- package/dist/commands/adopt-policy.js +3 -0
- package/dist/commands/configure-interactive.js +3 -0
- package/dist/commands/configure.js +5 -0
- package/dist/commands/cross-model-review.js +3 -0
- package/dist/commands/diff.js +20 -0
- package/dist/commands/doc-set.js +3 -0
- package/dist/commands/doctor/clean.js +2 -0
- package/dist/commands/doctor/fail-open-census.js +12 -0
- package/dist/commands/doctor/health.js +11 -0
- package/dist/commands/doctor/prove-gates.js +13 -0
- package/dist/commands/doctor/recover-lock.js +12 -0
- package/dist/commands/doctor/repair-state.js +6 -0
- package/dist/commands/doctor/tool-pin-extract.js +4 -0
- package/dist/commands/doctor/tool-pins.js +9 -0
- package/dist/commands/doctor-interactive.js +2 -0
- package/dist/commands/doctor.js +2 -0
- package/dist/commands/explain.js +19 -0
- package/dist/commands/gate-exec.js +4 -0
- package/dist/commands/gold-audit.js +14 -0
- package/dist/commands/graph.js +5 -0
- package/dist/commands/init/build-arbiter-config.js +1 -0
- package/dist/commands/init/generate.js +42 -0
- package/dist/commands/init/github-setup.js +5 -0
- package/dist/commands/init/maturity-gates.js +10 -0
- package/dist/commands/init/resolve-config.js +3 -0
- package/dist/commands/init/toolchain.js +10 -0
- package/dist/commands/init/types.js +1 -0
- package/dist/commands/init.js +17 -0
- package/dist/commands/method-interactive.js +4 -0
- package/dist/commands/method.js +11 -0
- package/dist/commands/obsidian.js +2 -0
- package/dist/commands/plugin.js +8 -0
- package/dist/commands/pr-merged.js +2 -0
- package/dist/commands/retire-policy.js +3 -0
- package/dist/commands/review-diff.js +3 -0
- package/dist/commands/settings.js +7 -0
- package/dist/commands/ship-config.js +2 -0
- package/dist/commands/ship-profile.js +2 -0
- package/dist/commands/ship-review.js +1 -0
- package/dist/commands/ship-tier.js +2 -0
- package/dist/commands/ship-train.js +2 -0
- package/dist/commands/task-mark.js +2 -0
- package/dist/commands/task-note.js +3 -0
- package/dist/commands/task-record-red.js +2 -0
- package/dist/commands/task-record-tech-debt.js +4 -0
- package/dist/commands/task-ship.js +3 -0
- package/dist/commands/task-state.js +6 -0
- package/dist/commands/task.js +59 -0
- package/dist/commands/update.js +60 -0
- package/dist/commands/upgrade-level-interactive.js +2 -0
- package/dist/commands/upgrade-level.js +7 -0
- package/dist/commands/verify-plan.js +8 -0
- package/dist/commands/verify-tdd.js +2 -0
- package/dist/commands/verify.js +7 -0
- package/dist/commands/wizard/coherence.js +1 -0
- package/dist/commands/worktree-prune.js +4 -0
- package/dist/commands/worktree.js +39 -0
- package/dist/compatibility/cross-language-matrix.json +540 -0
- package/dist/compatibility/index.d.ts +4 -0
- package/dist/compatibility/index.js +2 -0
- package/dist/compatibility/matcher.js +1 -0
- package/dist/compatibility/matrix.json +27 -0
- package/dist/compatibility/parsers.d.ts +38 -0
- package/dist/compatibility/parsers.js +1 -0
- package/dist/compatibility/probe.d.ts +41 -0
- package/dist/compatibility/probe.js +4 -0
- package/dist/compatibility/report.js +2 -0
- package/dist/compatibility/schema.d.ts +80 -0
- package/dist/compatibility/schema.js +1 -0
- package/dist/compatibility/skills-matrix.json +98 -0
- package/dist/compatibility/skills-validator.d.ts +30 -0
- package/dist/compatibility/skills-validator.js +4 -0
- package/dist/compatibility/tooling-proposals.json +5 -0
- package/dist/config/arbiter-ignore.js +3 -0
- package/dist/config/collaboration-mode-defaults.js +1 -0
- package/dist/config/diff.js +1 -0
- package/dist/config/env-overrides.js +3 -0
- package/dist/config/env-registry.js +2 -0
- package/dist/config/levels.js +1 -0
- package/dist/config/migrations/index.js +2 -0
- package/dist/config/migrations/v0-to-v1.js +2 -0
- package/dist/config/migrations/v1-to-v2.js +2 -0
- package/dist/config/migrations/v2-to-v3.js +2 -0
- package/dist/config/migrations/v3-to-v4.js +2 -0
- package/dist/config/override-resolver.js +2 -0
- package/dist/config/resolve-project-config.js +2 -0
- package/dist/config/resolve-project-name.js +2 -0
- package/dist/config/schema.d.ts +480 -0
- package/dist/config/schema.js +1 -0
- package/dist/config/test-pyramid-profiles.js +1 -0
- package/dist/config/thresholds.js +2 -0
- package/dist/conformance/dimensions.js +3 -0
- package/dist/conformance/engine.js +7 -0
- package/dist/conformance/gate-proofs.js +4 -0
- package/dist/conformance/shared.js +2 -0
- package/dist/detectors/axis.js +1 -0
- package/dist/detectors/build.js +2 -0
- package/dist/detectors/existing.js +2 -0
- package/dist/detectors/external-model.js +2 -0
- package/dist/detectors/framework.js +2 -0
- package/dist/detectors/git.js +11 -0
- package/dist/detectors/github.js +2 -0
- package/dist/detectors/lanes.js +5 -0
- package/dist/detectors/language-hooks.js +117 -0
- package/dist/detectors/language.js +2 -0
- package/dist/detectors/package-manager.js +2 -0
- package/dist/detectors/package.js +2 -0
- package/dist/detectors/scaffold-wiring.js +2 -0
- package/dist/detectors/workflow-collision.js +4 -0
- package/dist/evidence/gate-binding.js +4 -0
- package/dist/evidence/git-checks.js +3 -0
- package/dist/evidence/load.js +2 -0
- package/dist/evidence/provenance.js +2 -0
- package/dist/evidence/summary.js +2 -0
- package/dist/evidence/tdd-reexecute.js +2 -0
- package/dist/evidence/tdd.js +4 -0
- package/dist/experimental/index.js +2 -0
- package/dist/experimental/parse-argv.js +2 -0
- package/dist/experimental/registry.js +2 -0
- package/dist/generators/agents-claude.js +2 -0
- package/dist/generators/agents-md.js +2 -0
- package/dist/generators/anti-drift-validators.js +3 -0
- package/dist/generators/anti-proforma.js +2 -0
- package/dist/generators/api-e2e.js +2 -0
- package/dist/generators/api-middleware.js +2 -0
- package/dist/generators/archunit.js +2 -0
- package/dist/generators/audit-toolchain.js +2 -0
- package/dist/generators/auth.js +2 -0
- package/dist/generators/behavioral-tests.js +2 -0
- package/dist/generators/boundaries.js +2 -0
- package/dist/generators/check-all.js +2 -0
- package/dist/generators/check-stack-conformity.js +2 -0
- package/dist/generators/ci-five-lane.js +2 -0
- package/dist/generators/ci-tier.js +2 -0
- package/dist/generators/claude.js +3 -0
- package/dist/generators/codex-hooks.js +2 -0
- package/dist/generators/codex-known-limitations.js +2 -0
- package/dist/generators/codex.js +15 -0
- package/dist/generators/commit-footer.js +2 -0
- package/dist/generators/compliance-menu.js +2 -0
- package/dist/generators/compliance.js +2 -0
- package/dist/generators/conformance.js +2 -0
- package/dist/generators/contract-testing.js +2 -0
- package/dist/generators/coverage.js +2 -0
- package/dist/generators/debt-gates.js +24 -0
- package/dist/generators/debt-ratchet.js +2 -0
- package/dist/generators/derived-class.js +2 -0
- package/dist/generators/doc-set.js +4 -0
- package/dist/generators/docs.js +2 -0
- package/dist/generators/duplication.js +2 -0
- package/dist/generators/e2e-constitution.js +2 -0
- package/dist/generators/env-template.js +2 -0
- package/dist/generators/evidence-retention.js +2 -0
- package/dist/generators/feature-matrix.js +2 -0
- package/dist/generators/frontend-governance.js +2 -0
- package/dist/generators/frontend-quality.js +2 -0
- package/dist/generators/gap.js +2 -0
- package/dist/generators/gdpr.js +2 -0
- package/dist/generators/githooks.js +2 -0
- package/dist/generators/github-setup.js +2 -0
- package/dist/generators/github.js +2 -0
- package/dist/generators/gitignore.js +2 -0
- package/dist/generators/global-invariants.js +3 -0
- package/dist/generators/go-boundaries.js +2 -0
- package/dist/generators/gold-kit.js +2 -0
- package/dist/generators/infra.js +2 -0
- package/dist/generators/integration-testing.js +7 -0
- package/dist/generators/iso27001.js +2 -0
- package/dist/generators/iso9001.js +2 -0
- package/dist/generators/labels.js +2 -0
- package/dist/generators/local-wrapper.js +2 -0
- package/dist/generators/modulith.js +2 -0
- package/dist/generators/mutation.js +2 -0
- package/dist/generators/observability.js +2 -0
- package/dist/generators/operations.js +2 -0
- package/dist/generators/perf-k6.js +2 -0
- package/dist/generators/pharma.js +2 -0
- package/dist/generators/playwright-python.js +2 -0
- package/dist/generators/playwright-ts.js +2 -0
- package/dist/generators/pr-tooling.js +2 -0
- package/dist/generators/python-boundaries.js +2 -0
- package/dist/generators/quality.js +2 -0
- package/dist/generators/registry.js +2 -0
- package/dist/generators/regulated.js +2 -0
- package/dist/generators/resilience.js +2 -0
- package/dist/generators/risk-register.js +2 -0
- package/dist/generators/root.js +2 -0
- package/dist/generators/rust-boundaries.js +2 -0
- package/dist/generators/safety-class.js +2 -0
- package/dist/generators/security.js +2 -0
- package/dist/generators/seed.js +2 -0
- package/dist/generators/self-validation.js +2 -0
- package/dist/generators/ship-driver.js +2 -0
- package/dist/generators/skill-names.json +17 -0
- package/dist/generators/skills.js +2 -0
- package/dist/generators/smoke-journeys.js +2 -0
- package/dist/generators/solo-exception.js +2 -0
- package/dist/generators/ssot.js +2 -0
- package/dist/generators/stride-enforcement.js +2 -0
- package/dist/generators/suppressions.js +2 -0
- package/dist/generators/test-pyramid-manifest.js +3 -0
- package/dist/generators/test-taxonomy.js +2 -0
- package/dist/generators/wiki.js +2 -0
- package/dist/github/branch-protection.js +2 -0
- package/dist/github/classify-gh-error.js +2 -0
- package/dist/github/labels.js +2 -0
- package/dist/github/project-board.js +2 -0
- package/dist/graph/builders/adr.js +4 -0
- package/dist/graph/builders/ast.js +3 -0
- package/dist/graph/builders/canon.js +2 -0
- package/dist/graph/builders/evidence.js +2 -0
- package/dist/graph/builders/inv.js +1 -0
- package/dist/graph/builders/req.js +3 -0
- package/dist/graph/builders/test-nodes.js +3 -0
- package/dist/graph/builders/utils.js +2 -0
- package/dist/graph/load.js +2 -0
- package/dist/graph/model.js +2 -0
- package/dist/graph/query.js +3 -0
- package/dist/graph/store.js +1 -0
- package/dist/i18n/en.json +293 -0
- package/dist/i18n/index.js +4 -0
- package/dist/i18n/types.js +2 -0
- package/dist/integrations/companions.js +2 -0
- package/dist/integrations/external-review.js +10 -0
- package/dist/integrations/plugin-schema.js +2 -0
- package/dist/integrations/skill-detector.js +7 -0
- package/dist/integrations/skills-matrix.js +2 -0
- package/dist/integrations/types.d.ts +23 -0
- package/dist/integrations/types.js +2 -0
- package/dist/internal/cli-deprecation-registry.js +2 -0
- package/dist/internal/deprecate.js +3 -0
- package/dist/internal/experimental-warn.js +3 -0
- package/dist/invariants/catalog.d.ts +2 -0
- package/dist/invariants/catalog.js +1 -0
- package/dist/invariants/filter.d.ts +28 -0
- package/dist/invariants/filter.js +1 -0
- package/dist/invariants/index.d.ts +4 -0
- package/dist/invariants/index.js +2 -0
- package/dist/invariants/tiers.js +1 -0
- package/dist/invariants/types.d.ts +1 -0
- package/dist/invariants/types.js +1 -0
- package/dist/kit/applicability.js +3 -0
- package/dist/kit/audit-report.js +3 -0
- package/dist/kit/brownfield-detect.js +4 -0
- package/dist/kit/canonical-mapping.json +1 -0
- package/dist/kit/catalog.js +2 -0
- package/dist/kit/catalog.json +1 -0
- package/dist/kit/derived.json +1 -0
- package/dist/kit/emit-issues.js +8 -0
- package/dist/kit/measure.js +5 -0
- package/dist/kit/redaction.js +3 -0
- package/dist/kit/schema.js +2 -0
- package/dist/kit/taxonomy.js +2 -0
- package/dist/kit/thresholds.d.ts +12 -0
- package/dist/kit/thresholds.js +2 -0
- package/dist/kit/wave-engine.js +1 -0
- package/dist/recipes/loader.js +6 -0
- package/dist/recipes/schema.js +2 -0
- package/dist/risk/classifier.js +2 -0
- package/dist/risk/sha-check.js +2 -0
- package/dist/state/backups.js +2 -0
- package/dist/state/envelope.js +2 -0
- package/dist/state/generated-manifest.js +3 -0
- package/dist/state/manifest-key.js +2 -0
- package/dist/state/migrations/index.js +1 -0
- package/dist/state/migrations/v0-to-v1.js +2 -0
- package/dist/state/retired-renders.js +2 -0
- package/dist/templates/.nvmrc.ejs +1 -0
- package/dist/templates/HANDOFF.template.md +45 -0
- package/dist/templates/__tests__/contract/error-shape.contract.test.ts.ejs +47 -0
- package/dist/templates/agents-md/AGENTS.md.ejs +517 -0
- package/dist/templates/api-e2e/README.md.ejs +33 -0
- package/dist/templates/api-e2e/go-httptest.go.ejs +43 -0
- package/dist/templates/api-e2e/java-restassured.java.ejs +28 -0
- package/dist/templates/api-e2e/kotlin-restassured.kt.ejs +30 -0
- package/dist/templates/api-e2e/manifest.json.ejs +8 -0
- package/dist/templates/api-e2e/postman.collection.json.ejs +30 -0
- package/dist/templates/api-e2e/python-httpx.py.ejs +17 -0
- package/dist/templates/api-e2e/run.sh.ejs +61 -0
- package/dist/templates/api-e2e/ts-supertest.test.ts.ejs +18 -0
- package/dist/templates/archunit/AntiCyclicTest.java.ejs +29 -0
- package/dist/templates/archunit/AntiProformaExempt.java.ejs +35 -0
- package/dist/templates/archunit/AntiProformaTest.java.ejs +104 -0
- package/dist/templates/archunit/ArchitectureTest.java.ejs +87 -0
- package/dist/templates/archunit/DependencyFlowTest.java.ejs +55 -0
- package/dist/templates/archunit/DomainPurityTest.java.ejs +47 -0
- package/dist/templates/archunit/NamingConventionsTest.java.ejs +54 -0
- package/dist/templates/archunit/NoH2ArchTest.java.ejs +30 -0
- package/dist/templates/archunit/NoMockMvcTest.java.ejs +71 -0
- package/dist/templates/archunit/PortsIndependenceTest.java.ejs +55 -0
- package/dist/templates/archunit/RestAssuredArchTest.java.ejs +32 -0
- package/dist/templates/archunit/RestAssuredBaseIT.java.ejs +66 -0
- package/dist/templates/archunit/TestCoverageArchTest.java.ejs +29 -0
- package/dist/templates/archunit/arch-test-deps-maven.md.ejs +42 -0
- package/dist/templates/archunit/arch-test-deps.gradle.ejs +14 -0
- package/dist/templates/audit/gdpr/check-gdpr-controls.mjs.ejs +102 -0
- package/dist/templates/audit/gdpr/controls-to-gates.md.ejs +42 -0
- package/dist/templates/audit/gdpr/data-flow-map.md.ejs +30 -0
- package/dist/templates/audit/gdpr/dpia.md.ejs +45 -0
- package/dist/templates/audit/generic/audit-gate-rules.md.ejs +24 -0
- package/dist/templates/audit/generic/audit-trail-policy.md.ejs +38 -0
- package/dist/templates/audit/iso27001/iso27001-controls-gate-map.md.ejs +60 -0
- package/dist/templates/auth/setup.md.ejs +661 -0
- package/dist/templates/behavioral-tests/ExampleBehavioralTest.java.ejs +67 -0
- package/dist/templates/behavioral-tests/TESTING_POLICY.md.ejs +116 -0
- package/dist/templates/behavioral-tests/bdd/ExampleBddIT.java.ejs +19 -0
- package/dist/templates/behavioral-tests/bdd/ExampleSteps.java.ejs +61 -0
- package/dist/templates/behavioral-tests/bdd/example.feature.ejs +14 -0
- package/dist/templates/behavioral-tests/bdd/example.steps.ts.ejs +37 -0
- package/dist/templates/behavioral-tests/bdd/example_bdd_test.rs.ejs +64 -0
- package/dist/templates/behavioral-tests/bdd/example_test.go.ejs +80 -0
- package/dist/templates/behavioral-tests/bdd/test_example_bdd.py.ejs +47 -0
- package/dist/templates/behavioral-tests/eslint-playwright.json.ejs +10 -0
- package/dist/templates/behavioral-tests/eslint.config.playwright.mjs.ejs +29 -0
- package/dist/templates/behavioral-tests/example.behavioral.test.ts.ejs +47 -0
- package/dist/templates/behavioral-tests/example_behavioral_test.go.ejs +51 -0
- package/dist/templates/behavioral-tests/example_behavioral_test.rs.ejs +47 -0
- package/dist/templates/behavioral-tests/test_example_behavioral.py.ejs +40 -0
- package/dist/templates/boundaries/.eslintrc-boundaries.cjs.ejs +81 -0
- package/dist/templates/boundaries/.eslintrc-frontend-spa.cjs.ejs +79 -0
- package/dist/templates/boundaries/.importlinter.ejs +48 -0
- package/dist/templates/boundaries/check-boundaries-go.mjs.ejs +94 -0
- package/dist/templates/boundaries/check-boundaries-python.mjs.ejs +118 -0
- package/dist/templates/boundaries/check-boundaries-rust.mjs.ejs +111 -0
- package/dist/templates/boundaries/check-boundaries.mjs.ejs +34 -0
- package/dist/templates/boundaries/clippy.toml.ejs +50 -0
- package/dist/templates/boundaries/deny.toml.ejs +56 -0
- package/dist/templates/boundaries/eslint.config.boundaries.mjs.ejs +112 -0
- package/dist/templates/boundaries/eslint.config.frontend-spa.mjs.ejs +93 -0
- package/dist/templates/boundaries/golangci-boundaries.yml.ejs +70 -0
- package/dist/templates/boundaries/ruff-boundaries.toml.ejs +32 -0
- package/dist/templates/claude/CLAUDE.md.ejs +78 -0
- package/dist/templates/claude/agents/agent-write-classes.json +30 -0
- package/dist/templates/claude/agents/bridge-reviewer.md.ejs +68 -0
- package/dist/templates/claude/agents/codebase-scanner.md.ejs +69 -0
- package/dist/templates/claude/agents/context-checker.md.ejs +73 -0
- package/dist/templates/claude/agents/red-team.md.ejs +134 -0
- package/dist/templates/claude/commands/close-gold-gap.md.ejs +43 -0
- package/dist/templates/claude/commands/drain.md.ejs +81 -0
- package/dist/templates/claude/commands/gold-audit.md.ejs +43 -0
- package/dist/templates/claude/commands/impact.md.ejs +39 -0
- package/dist/templates/claude/commands/levelup.md.ejs +61 -0
- package/dist/templates/claude/commands/ship.md.ejs +902 -0
- package/dist/templates/claude/commands/tabletop.md.ejs +46 -0
- package/dist/templates/claude/commands/task.md.ejs +87 -0
- package/dist/templates/claude/commands/wt-close.md.ejs +58 -0
- package/dist/templates/claude/commands/wt-list.md.ejs +48 -0
- package/dist/templates/claude/commands/wt-open.md.ejs +61 -0
- package/dist/templates/claude/commands/wt-prune.md.ejs +38 -0
- package/dist/templates/claude/hooks/check-circular-deps.mjs.ejs +56 -0
- package/dist/templates/claude/hooks/check-no-orphan-todo.mjs.ejs +45 -0
- package/dist/templates/claude/hooks/check-no-pii.mjs.ejs +121 -0
- package/dist/templates/claude/hooks/check-no-placeholders.mjs.ejs +71 -0
- package/dist/templates/claude/hooks/check-no-skipped-tests.mjs +80 -0
- package/dist/templates/claude/hooks/check-no-unused-exports.mjs +62 -0
- package/dist/templates/claude/hooks/closer-mode-guard.mjs.ejs +102 -0
- package/dist/templates/claude/hooks/debug-state-on-failure.mjs.ejs +98 -0
- package/dist/templates/claude/hooks/enforce-gate-before-pr.mjs +142 -0
- package/dist/templates/claude/hooks/enforce-read-only.mjs +28 -0
- package/dist/templates/claude/hooks/exitplanmode-banner.mjs.ejs +43 -0
- package/dist/templates/claude/hooks/guard-done-evidence.mjs.ejs +85 -0
- package/dist/templates/claude/hooks/guard-task-completion.mjs.ejs +56 -0
- package/dist/templates/claude/hooks/hooks.mjs.ejs +127 -0
- package/dist/templates/claude/hooks/lib.mjs.ejs +523 -0
- package/dist/templates/claude/hooks/post-brainstorm-stop.mjs +48 -0
- package/dist/templates/claude/hooks/post-commit-check.mjs.ejs +65 -0
- package/dist/templates/claude/hooks/post-commit-checklists/go/backend.ejs +4 -0
- package/dist/templates/claude/hooks/post-commit-checklists/go/docs.ejs +4 -0
- package/dist/templates/claude/hooks/post-commit-checklists/go/frontend.ejs +4 -0
- package/dist/templates/claude/hooks/post-commit-checklists/java/backend.ejs +4 -0
- package/dist/templates/claude/hooks/post-commit-checklists/java/docs.ejs +4 -0
- package/dist/templates/claude/hooks/post-commit-checklists/java/frontend.ejs +4 -0
- package/dist/templates/claude/hooks/post-commit-checklists/python/backend.ejs +4 -0
- package/dist/templates/claude/hooks/post-commit-checklists/python/docs.ejs +4 -0
- package/dist/templates/claude/hooks/post-commit-checklists/python/frontend.ejs +4 -0
- package/dist/templates/claude/hooks/post-commit-checklists/rust/backend.ejs +5 -0
- package/dist/templates/claude/hooks/post-commit-checklists/rust/docs.ejs +4 -0
- package/dist/templates/claude/hooks/post-commit-checklists/rust/frontend.ejs +4 -0
- package/dist/templates/claude/hooks/post-commit-checklists/ts/backend.ejs +4 -0
- package/dist/templates/claude/hooks/post-commit-checklists/ts/docs.ejs +4 -0
- package/dist/templates/claude/hooks/post-commit-checklists/ts/frontend.ejs +5 -0
- package/dist/templates/claude/hooks/post-edit-dispatch.mjs.ejs +73 -0
- package/dist/templates/claude/hooks/post-subagent-release.mjs +80 -0
- package/dist/templates/claude/hooks/pre-compact.mjs.ejs +79 -0
- package/dist/templates/claude/hooks/pre-edit-plan-anchor.mjs.ejs +225 -0
- package/dist/templates/claude/hooks/pre-edit-ssot-guard.mjs +204 -0
- package/dist/templates/claude/hooks/pre-spawn-worktree-guard.mjs +129 -0
- package/dist/templates/claude/hooks/skill-forced-eval.mjs.ejs +281 -0
- package/dist/templates/claude/hooks/stop-dangerous.mjs +86 -0
- package/dist/templates/claude/hooks/stop-evidence-guard.mjs.ejs +245 -0
- package/dist/templates/claude/hooks/stop-finding-loss.mjs.ejs +168 -0
- package/dist/templates/claude/hooks/wiki-on-commit.mjs.ejs +38 -0
- package/dist/templates/claude/knowledge-map.json.ejs +26 -0
- package/dist/templates/claude/rules/05-agent-lifecycle.md +7 -0
- package/dist/templates/claude/rules/25-todo-folder-policy.md +5 -0
- package/dist/templates/claude/rules/40-context-economy.md +32 -0
- package/dist/templates/claude/rules/45-mcp-fallback.md +25 -0
- package/dist/templates/claude/rules/50-batch-execution.md +75 -0
- package/dist/templates/claude/rules/55-brainstorm-terminal-state.md +44 -0
- package/dist/templates/claude/rules/60-incidental-capture.md +43 -0
- package/dist/templates/claude/rules/75-impact-vault-reading.md +43 -0
- package/dist/templates/claude/rules/90-exec-protocol.md.ejs +40 -0
- package/dist/templates/claude/rules/95-closer-mode.md +45 -0
- package/dist/templates/claude/settings.json.ejs +165 -0
- package/dist/templates/claude/skills/architect-review/SKILL.md.ejs +82 -0
- package/dist/templates/claude/skills/brainstorming/SKILL.md.ejs +86 -0
- package/dist/templates/claude/skills/clean-code/SKILL.md.ejs +39 -0
- package/dist/templates/claude/skills/close-gold-gap/SKILL.md.ejs +58 -0
- package/dist/templates/claude/skills/codebase-audit/SKILL.md.ejs +88 -0
- package/dist/templates/claude/skills/configure/SKILL.md.ejs +72 -0
- package/dist/templates/claude/skills/epic-decompose/SKILL.md.ejs +86 -0
- package/dist/templates/claude/skills/gold-audit/SKILL.md.ejs +91 -0
- package/dist/templates/claude/skills/impact/SKILL.md.ejs +104 -0
- package/dist/templates/claude/skills/levelup/SKILL.md.ejs +146 -0
- package/dist/templates/claude/skills/tabletop/SKILL.md.ejs +118 -0
- package/dist/templates/claude/skills/tdd/SKILL.md.ejs +157 -0
- package/dist/templates/claude/skills/understand-code/SKILL.md.ejs +93 -0
- package/dist/templates/claude/skills/verification/SKILL.md.ejs +68 -0
- package/dist/templates/claude/skills/wave-drain/SKILL.md.ejs +491 -0
- package/dist/templates/codex/CODEX.md.ejs +140 -0
- package/dist/templates/codex/codex-adapter.mjs +132 -0
- package/dist/templates/codex/config.toml.ejs +189 -0
- package/dist/templates/compliance/compliance-mapping.md.ejs +124 -0
- package/dist/templates/compliance/compliance-menu.md.ejs +89 -0
- package/dist/templates/contract-testing/CONTRACTS_POLICY.md.ejs +30 -0
- package/dist/templates/contract-testing/api-snapshots/config-keys-baseline.json.ejs +1 -0
- package/dist/templates/contract-testing/api-snapshots/config-response-baseline.json.ejs +1 -0
- package/dist/templates/contract-testing/api-snapshots/enum-values-baseline.json.ejs +1 -0
- package/dist/templates/contract-testing/api-snapshots/error-shape-baseline.json.ejs +6 -0
- package/dist/templates/contract-testing/api-snapshots/openapi-baseline.json.ejs +12 -0
- package/dist/templates/contract-testing/api-snapshots/openapi-content-types-baseline.json.ejs +3 -0
- package/dist/templates/contract-testing/api-snapshots/openapi-paths-baseline.json.ejs +1 -0
- package/dist/templates/contract-testing/api-snapshots/openapi-required-fields-baseline.json.ejs +1 -0
- package/dist/templates/contract-testing/api-snapshots/openapi-response-status-baseline.json.ejs +3 -0
- package/dist/templates/contract-testing/api-snapshots/test-snapshot.json.ejs +4 -0
- package/dist/templates/contract-testing/env/.env.pact.ejs +4 -0
- package/dist/templates/contract-testing/graphql/GraphqlSchemaTest.java.ejs +29 -0
- package/dist/templates/contract-testing/graphql/graphql-inspector.test.ts.ejs +20 -0
- package/dist/templates/contract-testing/graphql/graphql_schema_test.go.ejs +27 -0
- package/dist/templates/contract-testing/graphql/graphql_schema_test.rs.ejs +27 -0
- package/dist/templates/contract-testing/graphql/test_graphql_schema.py.ejs +21 -0
- package/dist/templates/contract-testing/grpc/GrpcContractTest.java.ejs +23 -0
- package/dist/templates/contract-testing/grpc/buf-breaking.yml.ejs +6 -0
- package/dist/templates/contract-testing/grpc/buf.yaml.ejs +11 -0
- package/dist/templates/contract-testing/grpc/grpc-contract.test.ts.ejs +16 -0
- package/dist/templates/contract-testing/grpc/grpc_contract_test.go.ejs +22 -0
- package/dist/templates/contract-testing/grpc/grpc_contract_test.rs.ejs +22 -0
- package/dist/templates/contract-testing/grpc/test_grpc_contract.py.ejs +18 -0
- package/dist/templates/contract-testing/message-queue/SchemaRegistryCheckIT.java.ejs +44 -0
- package/dist/templates/contract-testing/message-queue/schema-registry-check.ts.ejs +42 -0
- package/dist/templates/contract-testing/message-queue/schema_registry_test.go.ejs +71 -0
- package/dist/templates/contract-testing/message-queue/schema_registry_test.rs.ejs +61 -0
- package/dist/templates/contract-testing/message-queue/test_schema_registry.py.ejs +31 -0
- package/dist/templates/contract-testing/pact-samples/assignment-response.json.ejs +7 -0
- package/dist/templates/contract-testing/pact-samples/availability-response.json.ejs +13 -0
- package/dist/templates/contract-testing/pact-samples/availability-rule-response.json.ejs +8 -0
- package/dist/templates/contract-testing/pact-samples/capacity-response.json.ejs +11 -0
- package/dist/templates/contract-testing/pact-samples/fully-booked-response.json.ejs +6 -0
- package/dist/templates/contract-testing/pact-samples/schedule-override-response.json.ejs +7 -0
- package/dist/templates/contract-testing/rest-owned/PactVerificationIT.java.ejs +31 -0
- package/dist/templates/contract-testing/rest-owned/pact-consumer.test.ts.ejs +36 -0
- package/dist/templates/contract-testing/rest-owned/pact-deps.gradle.ejs +15 -0
- package/dist/templates/contract-testing/rest-owned/pact_consumer_test.go.ejs +48 -0
- package/dist/templates/contract-testing/rest-owned/pact_consumer_test.rs.ejs +23 -0
- package/dist/templates/contract-testing/rest-owned/test_pact_consumer.py.ejs +35 -0
- package/dist/templates/contract-testing/rest-public/OpenApiDiffIT.java.ejs +44 -0
- package/dist/templates/contract-testing/rest-public/export-openapi-java.gradle.ejs +13 -0
- package/dist/templates/contract-testing/rest-public/export-openapi.mjs.ejs +21 -0
- package/dist/templates/contract-testing/rest-public/export_openapi.go.ejs +30 -0
- package/dist/templates/contract-testing/rest-public/export_openapi.py.ejs +27 -0
- package/dist/templates/contract-testing/rest-public/export_openapi.rs.ejs +32 -0
- package/dist/templates/contract-testing/rest-public/openapi-diff.ts.ejs +42 -0
- package/dist/templates/contract-testing/rest-public/openapi_diff_test.go.ejs +35 -0
- package/dist/templates/contract-testing/rest-public/openapi_diff_test.rs.ejs +36 -0
- package/dist/templates/contract-testing/rest-public/test_openapi_diff.py.ejs +32 -0
- package/dist/templates/coverage/.coveragerc.ejs +26 -0
- package/dist/templates/coverage/.tarpaulin.toml.ejs +30 -0
- package/dist/templates/coverage/Cargo.toml.profile.release.ejs +24 -0
- package/dist/templates/coverage/jacoco-maven-setup.md.ejs +72 -0
- package/dist/templates/coverage/jacoco.gradle.ejs +49 -0
- package/dist/templates/coverage/kover.gradle.ejs +35 -0
- package/dist/templates/coverage/vitest.browser.config.ts.ejs +47 -0
- package/dist/templates/coverage/vitest.config.ts.ejs +47 -0
- package/dist/templates/docs/CODING_STANDARDS.md.ejs +81 -0
- package/dist/templates/docs/FEATURE_MATRIX.md.ejs +84 -0
- package/dist/templates/docs/GAP.md.ejs +58 -0
- package/dist/templates/docs/ISO27001_ANNEX_A.md.ejs +144 -0
- package/dist/templates/docs/MASTER_TEST_PLAN.md.ejs +52 -0
- package/dist/templates/docs/POST_MERGE_REVIEW_TEMPLATE.md.ejs +63 -0
- package/dist/templates/docs/SECURE_CODING_CHECKLIST.md.ejs +61 -0
- package/dist/templates/docs/adr/ADR-000_template.md.ejs +28 -0
- package/dist/templates/docs/bugs/bug-analysis.md.ejs +47 -0
- package/dist/templates/docs/bugs/bug-report.md.ejs +51 -0
- package/dist/templates/docs/bugs/bug-verification.md.ejs +42 -0
- package/dist/templates/docs/runbooks/deployment.md.ejs +119 -0
- package/dist/templates/docs/runbooks/prod-checklist.md.ejs +90 -0
- package/dist/templates/docs/runbooks/rollback.md.ejs +124 -0
- package/dist/templates/docs/runbooks/troubleshooting.md.ejs +130 -0
- package/dist/templates/docs/skeletons/arc42-canvas.md.ejs +46 -0
- package/dist/templates/docs/skeletons/arc42-full.md.ejs +59 -0
- package/dist/templates/docs/skeletons/decision-registry.md.ejs +38 -0
- package/dist/templates/docs/skeletons/er-model.md.ejs +19 -0
- package/dist/templates/docs/skeletons/glossary.md.ejs +8 -0
- package/dist/templates/docs/skeletons/governance.md.ejs +13 -0
- package/dist/templates/docs/skeletons/slo.md.ejs +21 -0
- package/dist/templates/docs/skeletons/technical-debt.md.ejs +8 -0
- package/dist/templates/docs/skeletons/test-strategy.md.ejs +14 -0
- package/dist/templates/docs/skeletons/threat-model-4q.md.ejs +20 -0
- package/dist/templates/docs/skeletons/threat-model-stride.md.ejs +22 -0
- package/dist/templates/docs/specs/atomic-task-list.md.ejs +57 -0
- package/dist/templates/docs/steering/product.md.ejs +44 -0
- package/dist/templates/docs/steering/structure.md.ejs +49 -0
- package/dist/templates/docs/steering/tech.md.ejs +53 -0
- package/dist/templates/documentation/cli-catalog.md.ejs +21 -0
- package/dist/templates/e2e/E2E_CONSTITUTION.md.ejs +77 -0
- package/dist/templates/e2e/playwright-python/conftest.py.ejs +22 -0
- package/dist/templates/e2e/playwright-python/run_axe.py.ejs +99 -0
- package/dist/templates/e2e/playwright-python/test_a11y.py.ejs +38 -0
- package/dist/templates/e2e/playwright-python/test_smoke.py.ejs +28 -0
- package/dist/templates/e2e/playwright-ts/a11y.spec.ts.ejs +20 -0
- package/dist/templates/e2e/playwright-ts/render-smoke.spec.ts.ejs +90 -0
- package/dist/templates/e2e/playwright-ts/run-axe.ts.ejs +74 -0
- package/dist/templates/e2e/smoke-journeys/journeys.spec.ts.ejs +53 -0
- package/dist/templates/evidence-files.json.ejs +13 -0
- package/dist/templates/frontend/FE_DESIGN_PRINCIPLES.md.ejs +115 -0
- package/dist/templates/frontend/FRONTEND_CONSTITUTION.md.ejs +170 -0
- package/dist/templates/frontend/design-tokens.json.ejs +107 -0
- package/dist/templates/frontend/vrt-setup.md.ejs +83 -0
- package/dist/templates/githooks/commit-msg.ejs +60 -0
- package/dist/templates/githooks/pre-commit.ejs +95 -0
- package/dist/templates/githooks/pre-push.ejs +251 -0
- package/dist/templates/githooks/setup-hooks.sh.ejs +8 -0
- package/dist/templates/github/PULL_REQUEST_TEMPLATE.md +37 -0
- package/dist/templates/github/PULL_REQUEST_TEMPLATE.md.ejs +52 -0
- package/dist/templates/github/actions/build-cache/action.yml.ejs +84 -0
- package/dist/templates/github/actions/nas-ssh/action.yml.ejs +53 -0
- package/dist/templates/github/actions/setup-java-maven/action.yml.ejs +53 -0
- package/dist/templates/github/actions/setup-node-pnpm/action.yml.ejs +39 -0
- package/dist/templates/github/actions/sign-and-attest/action.yml.ejs +53 -0
- package/dist/templates/github/dependabot.yml.ejs +66 -0
- package/dist/templates/github/extended-ci-paths.txt.ejs +38 -0
- package/dist/templates/github/issue-templates/bug-report.yml +72 -0
- package/dist/templates/github/issue-templates/compliance-item.yml.ejs +75 -0
- package/dist/templates/github/issue-templates/config.yml +2 -0
- package/dist/templates/github/issue-templates/epic.yml +66 -0
- package/dist/templates/github/issue-templates/feature-request.yml +24 -0
- package/dist/templates/github/issue-templates/task-brief.yml.ejs +125 -0
- package/dist/templates/github/labels.yml.ejs +161 -0
- package/dist/templates/github/scripts/sticky-failure-issue.sh.ejs +61 -0
- package/dist/templates/github/workflows/01-pr-fast.yml.ejs +1089 -0
- package/dist/templates/github/workflows/02-pr-extended.yml.ejs +512 -0
- package/dist/templates/github/workflows/03-human-approval.yml.ejs +76 -0
- package/dist/templates/github/workflows/04-deploy-test.yml.ejs +425 -0
- package/dist/templates/github/workflows/05-release.yml.ejs +813 -0
- package/dist/templates/github/workflows/06-nightly-lite.yml.ejs +125 -0
- package/dist/templates/github/workflows/06-nightly.yml.ejs +25 -0
- package/dist/templates/github/workflows/07-weekly-lite.yml.ejs +221 -0
- package/dist/templates/github/workflows/07-weekly.yml.ejs +23 -0
- package/dist/templates/github/workflows/08-monthly.yml.ejs +23 -0
- package/dist/templates/github/workflows/09-heartbeat.yml.ejs +268 -0
- package/dist/templates/github/workflows/10-deploy-prod.yml.ejs +144 -0
- package/dist/templates/github/workflows/11-k6-on-demand.yml.ejs +43 -0
- package/dist/templates/github/workflows/12-mutation-scheduled.yml.ejs +100 -0
- package/dist/templates/github/workflows/13-archunit-extended.yml.ejs +33 -0
- package/dist/templates/github/workflows/14-license-scan.yml.ejs +45 -0
- package/dist/templates/github/workflows/15-codeql.yml.ejs +117 -0
- package/dist/templates/github/workflows/16-frontend-quality.yml.ejs +154 -0
- package/dist/templates/github/workflows/17-ossf-scorecard.yml.ejs +46 -0
- package/dist/templates/github/workflows/18-frontend-lane.yml.ejs +50 -0
- package/dist/templates/github/workflows/_ai-draft-check.yml.ejs +44 -0
- package/dist/templates/github/workflows/_contract-postman.yml.ejs +93 -0
- package/dist/templates/github/workflows/_cosign-copy/aws-ecs.ejs +90 -0
- package/dist/templates/github/workflows/_cosign-copy/azure-container-app.ejs +97 -0
- package/dist/templates/github/workflows/_cosign-copy/gcp-cloud-run.ejs +102 -0
- package/dist/templates/github/workflows/_cosign-copy/ghcr.ejs +76 -0
- package/dist/templates/github/workflows/_cosign-copy/nas-compose.ejs +69 -0
- package/dist/templates/github/workflows/_deploy/aws-ecs.ejs +78 -0
- package/dist/templates/github/workflows/_deploy/azure-container-app.ejs +59 -0
- package/dist/templates/github/workflows/_deploy/gcp-cloud-run.ejs +71 -0
- package/dist/templates/github/workflows/_deploy/ghcr.ejs +19 -0
- package/dist/templates/github/workflows/_deploy/nas-compose.ejs +45 -0
- package/dist/templates/github/workflows/_k6-runner.yml.ejs +107 -0
- package/dist/templates/github/workflows/_label-on-approve.yml.ejs +44 -0
- package/dist/templates/github/workflows/_label-sync.yml.ejs +58 -0
- package/dist/templates/github/workflows/_monthly.yml.ejs +343 -0
- package/dist/templates/github/workflows/_nightly.yml.ejs +826 -0
- package/dist/templates/github/workflows/_notify.yml.ejs +96 -0
- package/dist/templates/github/workflows/_partials/macos-keychain-bypass.ejs +6 -0
- package/dist/templates/github/workflows/_partials/macos-keychain-restore.ejs +6 -0
- package/dist/templates/github/workflows/_partials/scheduled-heavy-jobs.ejs +117 -0
- package/dist/templates/github/workflows/_partials/sigstore-preflight.ejs +8 -0
- package/dist/templates/github/workflows/_partials/trivy-fs-java.ejs +27 -0
- package/dist/templates/github/workflows/_post-merge-notify.yml.ejs +228 -0
- package/dist/templates/github/workflows/_pr-staleness.yml.ejs +85 -0
- package/dist/templates/github/workflows/_shared-security.yml.ejs +132 -0
- package/dist/templates/github/workflows/_sigstore-retry-sign.yml.ejs +102 -0
- package/dist/templates/github/workflows/_weekly.yml.ejs +313 -0
- package/dist/templates/github/workflows/drift-shadow.yml.ejs +51 -0
- package/dist/templates/github/workflows/five-lane/ci.yml.ejs +54 -0
- package/dist/templates/github/workflows/five-lane/nightly.yml.ejs +70 -0
- package/dist/templates/github/workflows/five-lane/release.yml.ejs +53 -0
- package/dist/templates/github/workflows/five-lane/weekly.yml.ejs +72 -0
- package/dist/templates/github/workflows/issue-state.yml.ejs +93 -0
- package/dist/templates/global-invariants/GLOBAL_INVARIANTS.md.ejs +34 -0
- package/dist/templates/governance/RACI.md.ejs +21 -0
- package/dist/templates/governance/ci-mental-model.md.ejs +268 -0
- package/dist/templates/governance/contract-integrity-policy.md.ejs +116 -0
- package/dist/templates/governance/enterprise-compliance-baseline.md.ejs +111 -0
- package/dist/templates/governance/evidence-retention.md.ejs +43 -0
- package/dist/templates/governance/gdpr-erasure-runbook.md.ejs +165 -0
- package/dist/templates/governance/qa-audit-phases.md.ejs +129 -0
- package/dist/templates/governance/risk-assessment-template.md.ejs +105 -0
- package/dist/templates/governance/risk-register.md.ejs +76 -0
- package/dist/templates/governance/solo-dev-exception.md.ejs +96 -0
- package/dist/templates/governance/validation-evidence.md.ejs +131 -0
- package/dist/templates/infra/azure/containerapp.tpl.yaml.ejs +74 -0
- package/dist/templates/infra/nas-compose/deploy.sh.ejs +114 -0
- package/dist/templates/integration-testing/AbstractIntegrationTest.java.ejs +36 -0
- package/dist/templates/integration-testing/NoH2ArchTest.java.ejs +24 -0
- package/dist/templates/integration-testing/conftest.py.ejs +20 -0
- package/dist/templates/integration-testing/db_fixture.rs.ejs +48 -0
- package/dist/templates/integration-testing/eslint-no-fake-db.json.ejs +19 -0
- package/dist/templates/integration-testing/eslint.config.no-fake-db.mjs.ejs +46 -0
- package/dist/templates/integration-testing/main_test.go.ejs +53 -0
- package/dist/templates/integration-testing/main_test_sqlite.go.ejs +37 -0
- package/dist/templates/integration-testing/test-setup.ts.ejs +26 -0
- package/dist/templates/integration-testing/testcontainers-deps.gradle.ejs +9 -0
- package/dist/templates/java/DeprecationInterceptor.java.ejs +50 -0
- package/dist/templates/java/archunit-hexagonal.ejs +69 -0
- package/dist/templates/java/modulith/ApplicationModulesTest.java.ejs +21 -0
- package/dist/templates/java/modulith/modulith-deps.gradle.ejs +13 -0
- package/dist/templates/java/modulith/modulith-maven-setup.md.ejs +21 -0
- package/dist/templates/java/pharma/AuditEvent.java.ejs +138 -0
- package/dist/templates/java/pharma/AuditMapper.java.ejs +60 -0
- package/dist/templates/java/pharma/archunit-pharma.ejs +128 -0
- package/dist/templates/kit/GLOBAL_KIT.md.ejs +11 -0
- package/dist/templates/kit/dim.md.ejs +33 -0
- package/dist/templates/llms-txt.config.json.ejs +22 -0
- package/dist/templates/local-wrapper/.env.example.ejs +15 -0
- package/dist/templates/local-wrapper/Makefile.ejs +44 -0
- package/dist/templates/local-wrapper/run.sh.ejs +5 -0
- package/dist/templates/middleware/410-gone-handler.ts.ejs +41 -0
- package/dist/templates/middleware/correlation-id.ts.ejs +32 -0
- package/dist/templates/middleware/deprecation.ts.ejs +45 -0
- package/dist/templates/middleware/error-handler.ts.ejs +73 -0
- package/dist/templates/middleware/payload-size-limit.ts.ejs +51 -0
- package/dist/templates/mutation/README.md.ejs +67 -0
- package/dist/templates/mutation/cargo-mutants.toml.ejs +9 -0
- package/dist/templates/mutation/mutmut-config.toml.ejs +7 -0
- package/dist/templates/mutation/parse-mutants.mjs.ejs +44 -0
- package/dist/templates/mutation/parse-mutmut.py.ejs +44 -0
- package/dist/templates/mutation/pitest-l2-setup.md.ejs +66 -0
- package/dist/templates/mutation/pitest-maven-setup.md.ejs +64 -0
- package/dist/templates/mutation/pitest.gradle.ejs +23 -0
- package/dist/templates/mutation/stryker.conf.json.ejs +17 -0
- package/dist/templates/observability/setup.md.ejs +495 -0
- package/dist/templates/operations/handbook.md.ejs +217 -0
- package/dist/templates/perf/bundle-budget.json.ejs +29 -0
- package/dist/templates/perf/k6/reports/csv-report.py.ejs +91 -0
- package/dist/templates/perf/k6/reports/html-report.py.ejs +114 -0
- package/dist/templates/perf/k6/reports/json-report.py.ejs +74 -0
- package/dist/templates/perf/k6/scenarios/breakpoint.js.ejs +26 -0
- package/dist/templates/perf/k6/scenarios/burst.js.ejs +43 -0
- package/dist/templates/perf/k6/scenarios/endurance.js.ejs +36 -0
- package/dist/templates/perf/k6/scenarios/load.js.ejs +26 -0
- package/dist/templates/perf/k6/scenarios/ramp-down.js.ejs +29 -0
- package/dist/templates/perf/k6/scenarios/ramp-up.js.ejs +32 -0
- package/dist/templates/perf/k6/scenarios/smoke.js.ejs +23 -0
- package/dist/templates/perf/k6/scenarios/soak.js.ejs +26 -0
- package/dist/templates/perf/k6/scenarios/spike.js.ejs +29 -0
- package/dist/templates/perf/k6/scenarios/steady-state.js.ejs +31 -0
- package/dist/templates/perf/k6/scenarios/stress.js.ejs +29 -0
- package/dist/templates/perf/k6/scenarios/volume.js.ejs +36 -0
- package/dist/templates/perf/k6/seed/test-data.sql.ejs +59 -0
- package/dist/templates/perf/lighthouserc.json.ejs +41 -0
- package/dist/templates/quality/iso9001/CAPA_LOG.md.ejs +36 -0
- package/dist/templates/quality/iso9001/DOCUMENT_CONTROL.md.ejs +36 -0
- package/dist/templates/quality/iso9001/REQUIREMENTS_TRACEABILITY.md.ejs +61 -0
- package/dist/templates/regulated/overlay.json.ejs +26 -0
- package/dist/templates/regulated/regulated-overlay.md.ejs +40 -0
- package/dist/templates/resilience/RESILIENCE.md.ejs +310 -0
- package/dist/templates/root/.gitignore.ejs +85 -0
- package/dist/templates/root/CODEOWNERS.ejs +18 -0
- package/dist/templates/root/CONTRIBUTING.md.ejs +62 -0
- package/dist/templates/root/SECURITY.md.ejs +19 -0
- package/dist/templates/root/TEST_TAXONOMY.md.ejs +100 -0
- package/dist/templates/root/commitlint.config.js.ejs +4 -0
- package/dist/templates/root/docs/METHOD/CANONICAL_PATHS.md.ejs +24 -0
- package/dist/templates/root/docs/METHOD/ENGINEERING_DEFAULTS.md.ejs +136 -0
- package/dist/templates/root/docs/METHOD/KNOWLEDGE_MAP.md.ejs +90 -0
- package/dist/templates/root/docs/METHOD/PATTERNS_CATALOG.md.ejs +51 -0
- package/dist/templates/root/docs/METHOD/REUSE_REGISTRY.md.ejs +26 -0
- package/dist/templates/root/docs/METHOD/REUSE_REGISTRY_SPEC.md.ejs +80 -0
- package/dist/templates/root/docs/METHOD/SSOT_CORE_SET.md.ejs +62 -0
- package/dist/templates/root/docs/METHOD/TRACK_ROUTER.md.ejs +39 -0
- package/dist/templates/root/docs/SYSTEM/CANON.md.ejs +359 -0
- package/dist/templates/root/docs/SYSTEM/FAIL_CLOSED.md.ejs +171 -0
- package/dist/templates/root/editorconfig.ejs +39 -0
- package/dist/templates/root/tsconfig.json.ejs +21 -0
- package/dist/templates/rust/clippy.toml.ejs +14 -0
- package/dist/templates/schemas/milestone.schema.json.ejs +164 -0
- package/dist/templates/schemas/rtm-verdict.schema.json.ejs +52 -0
- package/dist/templates/schemas/source-record.schema.json.ejs +91 -0
- package/dist/templates/schemas/tabletop-evidence.schema.json.ejs +53 -0
- package/dist/templates/schemas/use-case.schema.json.ejs +59 -0
- package/dist/templates/scripts/apply-branch-protection.mjs.ejs +70 -0
- package/dist/templates/scripts/audit-toolchain.mjs.ejs +112 -0
- package/dist/templates/scripts/bg-run.sh.ejs +59 -0
- package/dist/templates/scripts/capacity-probe.mjs.ejs +147 -0
- package/dist/templates/scripts/capture-debt-baseline.mjs.ejs +99 -0
- package/dist/templates/scripts/check-acceptance.mjs.ejs +298 -0
- package/dist/templates/scripts/check-action-pins.mjs.ejs +215 -0
- package/dist/templates/scripts/check-agent-return.mjs.ejs +177 -0
- package/dist/templates/scripts/check-all.mjs.ejs +1746 -0
- package/dist/templates/scripts/check-anti-fake-green.mjs.ejs +80 -0
- package/dist/templates/scripts/check-anti-proforma.mjs.ejs +547 -0
- package/dist/templates/scripts/check-api-e2e.mjs.ejs +106 -0
- package/dist/templates/scripts/check-arc42-slots.mjs.ejs +25 -0
- package/dist/templates/scripts/check-assertion-delta.mjs.ejs +287 -0
- package/dist/templates/scripts/check-audit-dry-pass.mjs.ejs +176 -0
- package/dist/templates/scripts/check-bundle-size.mjs.ejs +151 -0
- package/dist/templates/scripts/check-canonical-paths.mjs.ejs +39 -0
- package/dist/templates/scripts/check-ci-tiers.mjs.ejs +111 -0
- package/dist/templates/scripts/check-claude-md-lint.mjs.ejs +142 -0
- package/dist/templates/scripts/check-collab-mode-wired.mjs.ejs +60 -0
- package/dist/templates/scripts/check-commit-footer-rationale.mjs.ejs +170 -0
- package/dist/templates/scripts/check-constraint-scan.mjs.ejs +681 -0
- package/dist/templates/scripts/check-consumer-audit.mjs.ejs +414 -0
- package/dist/templates/scripts/check-continue-on-error.mjs.ejs +227 -0
- package/dist/templates/scripts/check-cross-model-review.mjs.ejs +458 -0
- package/dist/templates/scripts/check-decision-registry.mjs.ejs +101 -0
- package/dist/templates/scripts/check-doc-freshness.mjs.ejs +17 -0
- package/dist/templates/scripts/check-doc-links.mjs.ejs +98 -0
- package/dist/templates/scripts/check-doc-set.mjs.ejs +18 -0
- package/dist/templates/scripts/check-docs.mjs.ejs +71 -0
- package/dist/templates/scripts/check-domain-api-surface.mjs.ejs +80 -0
- package/dist/templates/scripts/check-drift.mjs.ejs +167 -0
- package/dist/templates/scripts/check-duplication.mjs.ejs +45 -0
- package/dist/templates/scripts/check-e2e-escalation.mjs.ejs +199 -0
- package/dist/templates/scripts/check-e2e-quarantine.mjs.ejs +68 -0
- package/dist/templates/scripts/check-emission-parity.mjs.ejs +91 -0
- package/dist/templates/scripts/check-exit-code-contract.mjs.ejs +138 -0
- package/dist/templates/scripts/check-fail-closed-audit.mjs.ejs +389 -0
- package/dist/templates/scripts/check-fe-boundaries.mjs.ejs +184 -0
- package/dist/templates/scripts/check-feature-matrix.mjs.ejs +835 -0
- package/dist/templates/scripts/check-frontend-lane.mjs.ejs +73 -0
- package/dist/templates/scripts/check-grace-window.mjs.ejs +102 -0
- package/dist/templates/scripts/check-handoff-doc.mjs.ejs +192 -0
- package/dist/templates/scripts/check-hook-routing.mjs.ejs +224 -0
- package/dist/templates/scripts/check-image-pins.mjs.ejs +90 -0
- package/dist/templates/scripts/check-inline-suppressions.mjs.ejs +153 -0
- package/dist/templates/scripts/check-iso9001.mjs.ejs +146 -0
- package/dist/templates/scripts/check-knowledge-map.mjs.ejs +49 -0
- package/dist/templates/scripts/check-local-ci-parity.mjs.ejs +382 -0
- package/dist/templates/scripts/check-m16-handoff.mjs.ejs +112 -0
- package/dist/templates/scripts/check-merge-method.mjs.ejs +92 -0
- package/dist/templates/scripts/check-milestones.mjs.ejs +678 -0
- package/dist/templates/scripts/check-min-test-execution.mjs.ejs +225 -0
- package/dist/templates/scripts/check-muted-test.mjs.ejs +270 -0
- package/dist/templates/scripts/check-no-stub-redirects.mjs.ejs +154 -0
- package/dist/templates/scripts/check-no-tracked-artifacts.mjs.ejs +134 -0
- package/dist/templates/scripts/check-oracle-discrimination.mjs.ejs +244 -0
- package/dist/templates/scripts/check-pii-scan.mjs.ejs +67 -0
- package/dist/templates/scripts/check-pipe-tee-hazard.mjs.ejs +85 -0
- package/dist/templates/scripts/check-pr-size-gate.mjs.ejs +85 -0
- package/dist/templates/scripts/check-refutation-verdicts.mjs.ejs +256 -0
- package/dist/templates/scripts/check-regulated-overlay.mjs.ejs +158 -0
- package/dist/templates/scripts/check-render-smoke.mjs.ejs +100 -0
- package/dist/templates/scripts/check-reuse-registry.mjs.ejs +44 -0
- package/dist/templates/scripts/check-review-completion.mjs.ejs +708 -0
- package/dist/templates/scripts/check-safety-adopt-ratchet.mjs.ejs +142 -0
- package/dist/templates/scripts/check-secret-presence.mjs.ejs +191 -0
- package/dist/templates/scripts/check-secret-scan.mjs.ejs +82 -0
- package/dist/templates/scripts/check-skip-critical-e2e.mjs.ejs +142 -0
- package/dist/templates/scripts/check-smoke-journeys.mjs.ejs +272 -0
- package/dist/templates/scripts/check-solo-reactivation.mjs.ejs +102 -0
- package/dist/templates/scripts/check-sources.mjs.ejs +245 -0
- package/dist/templates/scripts/check-ssot-core.mjs.ejs +45 -0
- package/dist/templates/scripts/check-stack-conformity.mjs.ejs +160 -0
- package/dist/templates/scripts/check-stride-traceability.mjs.ejs +101 -0
- package/dist/templates/scripts/check-suppression-expiry.mjs.ejs +79 -0
- package/dist/templates/scripts/check-suppression-rationale.mjs.ejs +76 -0
- package/dist/templates/scripts/check-suppressions.mjs.ejs +150 -0
- package/dist/templates/scripts/check-tabletop-evidence.mjs.ejs +499 -0
- package/dist/templates/scripts/check-tdd-evidence.mjs.ejs +381 -0
- package/dist/templates/scripts/check-test-naming.mjs.ejs +151 -0
- package/dist/templates/scripts/check-test-pyramid.mjs.ejs +170 -0
- package/dist/templates/scripts/check-test-scope-tier.mjs.ejs +208 -0
- package/dist/templates/scripts/check-tier-coverage.mjs.ejs +71 -0
- package/dist/templates/scripts/check-todo-max-age.mjs.ejs +205 -0
- package/dist/templates/scripts/check-touched-vs-manifest.mjs.ejs +179 -0
- package/dist/templates/scripts/check-unwired-guards.mjs.ejs +367 -0
- package/dist/templates/scripts/check-use-cases.mjs.ejs +345 -0
- package/dist/templates/scripts/check-validator-helptext.mjs.ejs +80 -0
- package/dist/templates/scripts/check-wiki-lint.mjs.ejs +162 -0
- package/dist/templates/scripts/check-workflow-docs-sync.mjs.ejs +91 -0
- package/dist/templates/scripts/check-workflow-job-naming.mjs.ejs +102 -0
- package/dist/templates/scripts/check-workflow-perms.mjs.ejs +54 -0
- package/dist/templates/scripts/check-workflow-runners.mjs.ejs +87 -0
- package/dist/templates/scripts/check-workflow-sha-pinning.mjs.ejs +89 -0
- package/dist/templates/scripts/check-workflow-test-integrity.mjs.ejs +235 -0
- package/dist/templates/scripts/checks/check-rust-no-unsafe.mjs.ejs +58 -0
- package/dist/templates/scripts/checks/check-rust-no-unwrap.mjs.ejs +61 -0
- package/dist/templates/scripts/ci-classify-changes.mjs.ejs +119 -0
- package/dist/templates/scripts/conformance.mjs.ejs +37 -0
- package/dist/templates/scripts/constraint-map.json.ejs +25 -0
- package/dist/templates/scripts/debt-lib.mjs.ejs +1015 -0
- package/dist/templates/scripts/debt-report.mjs.ejs +199 -0
- package/dist/templates/scripts/domain-api-surface.json.ejs +23 -0
- package/dist/templates/scripts/done-evidence.mjs.ejs +359 -0
- package/dist/templates/scripts/evidence-collect.mjs.ejs +264 -0
- package/dist/templates/scripts/evidence-prune.mjs.ejs +96 -0
- package/dist/templates/scripts/evidence-rotate.mjs.ejs +53 -0
- package/dist/templates/scripts/evidence-writer.sh.ejs +220 -0
- package/dist/templates/scripts/gate-registry.yml.ejs +286 -0
- package/dist/templates/scripts/gen-doc-index.mjs.ejs +19 -0
- package/dist/templates/scripts/gen-gap.mjs.ejs +153 -0
- package/dist/templates/scripts/gen-llms-txt.mjs.ejs +18 -0
- package/dist/templates/scripts/gen-wiki.mjs.ejs +196 -0
- package/dist/templates/scripts/gh-cleanup-expired-artifacts.mjs.ejs +134 -0
- package/dist/templates/scripts/gold-audit.mjs.ejs +19 -0
- package/dist/templates/scripts/i18n-literal-scanner.mjs.ejs +175 -0
- package/dist/templates/scripts/ingest-zap-report.mjs.ejs +107 -0
- package/dist/templates/scripts/inject-pact-samples.sh.ejs +96 -0
- package/dist/templates/scripts/issue-readiness.mjs.ejs +84 -0
- package/dist/templates/scripts/knowledge-map-update.mjs.ejs +32 -0
- package/dist/templates/scripts/lib/acceptance-criteria.mjs.ejs +213 -0
- package/dist/templates/scripts/lib/agent-return-validate.mjs.ejs +481 -0
- package/dist/templates/scripts/lib/coverage-gate.mjs.ejs +54 -0
- package/dist/templates/scripts/lib/e2e-reliability.mjs.ejs +207 -0
- package/dist/templates/scripts/lib/ephemeral-server.mjs.ejs +148 -0
- package/dist/templates/scripts/lib/evidence-binding.mjs.ejs +140 -0
- package/dist/templates/scripts/lib/exact-sha-policy.mjs.ejs +233 -0
- package/dist/templates/scripts/lib/gate-args.mjs.ejs +20 -0
- package/dist/templates/scripts/lib/gate-evidence.mjs.ejs +622 -0
- package/dist/templates/scripts/lib/gate-mutex.mjs.ejs +340 -0
- package/dist/templates/scripts/lib/glob-walk.mjs.ejs +148 -0
- package/dist/templates/scripts/lib/run-helpers.mjs.ejs +416 -0
- package/dist/templates/scripts/lib/seed-common.sh.ejs +105 -0
- package/dist/templates/scripts/lib/waiter-count.mjs.ejs +62 -0
- package/dist/templates/scripts/muted-tests-baseline.json.ejs +4 -0
- package/dist/templates/scripts/optional-emissions.json.ejs +117 -0
- package/dist/templates/scripts/oracle-discrimination-baseline.json.ejs +6 -0
- package/dist/templates/scripts/pid-watch.sh.ejs +78 -0
- package/dist/templates/scripts/pii-scan.mjs.ejs +125 -0
- package/dist/templates/scripts/pr-merge-watch.mjs.ejs +445 -0
- package/dist/templates/scripts/record-agent-return.mjs.ejs +279 -0
- package/dist/templates/scripts/record-journey-evidence.mjs.ejs +69 -0
- package/dist/templates/scripts/rework-log.mjs.ejs +172 -0
- package/dist/templates/scripts/run-postman-tests.sh.ejs +112 -0
- package/dist/templates/scripts/schemas/agent-return-external.schema.json +74 -0
- package/dist/templates/scripts/schemas/agent-return.schema.json.ejs +181 -0
- package/dist/templates/scripts/schemas/cross-model-dispatch.schema.json +95 -0
- package/dist/templates/scripts/seed-test-data.sh.ejs +99 -0
- package/dist/templates/scripts/self-validation.mjs.ejs +126 -0
- package/dist/templates/scripts/setup-repo.sh.ejs +78 -0
- package/dist/templates/scripts/spotbugs-baseline.json.ejs +4 -0
- package/dist/templates/scripts/test-gate-layering.mjs.ejs +92 -0
- package/dist/templates/scripts/validate-api-snapshots.mjs.ejs +86 -0
- package/dist/templates/scripts/validate-k6-scenarios.mjs.ejs +96 -0
- package/dist/templates/scripts/validate-openapi-field-types.mjs.ejs +124 -0
- package/dist/templates/scripts/validate-postman-collection.mjs.ejs +159 -0
- package/dist/templates/scripts/verify-fe-coverage.mjs.ejs +138 -0
- package/dist/templates/scripts/verify-i18n-parity.mjs.ejs +114 -0
- package/dist/templates/scripts/verify-module-coverage.mjs.ejs +207 -0
- package/dist/templates/scripts/verify-mutation-baseline.mjs.ejs +209 -0
- package/dist/templates/scripts/verify-spotbugs.mjs.ejs +216 -0
- package/dist/templates/scripts/verify-tokens.mjs.ejs +177 -0
- package/dist/templates/security/RISK_ASSESSMENT.md.ejs +35 -0
- package/dist/templates/security/STRIDE.md.ejs +24 -0
- package/dist/templates/security/gitleaks.toml.ejs +21 -0
- package/dist/templates/security/zap/baseline-auth.context.ejs +58 -0
- package/dist/templates/security/zap/rules.tsv.ejs +100 -0
- package/dist/templates/ship/TICK_PROMPT.md.ejs +55 -0
- package/dist/templates/ship/supervisor.sh.ejs +46 -0
- package/dist/templates/smoke-journeys/manifest.json.ejs +1 -0
- package/dist/templates/sonar-project.properties.ejs +25 -0
- package/dist/templates/standards/doc-profile.ejs +27 -0
- package/dist/templates/standards/gold-doc-set.yml.ejs +528 -0
- package/dist/templates/standards/gold-registry.java.yml.ejs +266 -0
- package/dist/templates/standards/gold-registry.typescript.yml.ejs +104 -0
- package/dist/templates/standards/gold-registry.yml.ejs +119 -0
- package/dist/templates/standards/thresholds.yml.ejs +86 -0
- package/dist/templates/static-analysis/.dependency-cruiser.cjs.ejs +78 -0
- package/dist/templates/static-analysis/.golangci.yml.ejs +70 -0
- package/dist/templates/static-analysis/.shellcheckrc.ejs +13 -0
- package/dist/templates/static-analysis/.yamllint.yml.ejs +41 -0
- package/dist/templates/static-analysis/checkstyle.xml.ejs +83 -0
- package/dist/templates/static-analysis/detekt.yml.ejs +26 -0
- package/dist/templates/static-analysis/eslint.config.mjs.ejs +54 -0
- package/dist/templates/static-analysis/eslint.config.static.mjs.ejs +38 -0
- package/dist/templates/static-analysis/eslintrc-static.json.ejs +30 -0
- package/dist/templates/static-analysis/jscpd.json.ejs +25 -0
- package/dist/templates/static-analysis/knip.json.ejs +26 -0
- package/dist/templates/static-analysis/pmd-ruleset.xml.ejs +92 -0
- package/dist/templates/static-analysis/prettierignore.ejs +59 -0
- package/dist/templates/static-analysis/prettierrc.json.ejs +10 -0
- package/dist/templates/static-analysis/requirements-dev.txt.ejs +11 -0
- package/dist/templates/static-analysis/ruff.toml.ejs +40 -0
- package/dist/templates/static-analysis/rustfmt.toml.ejs +3 -0
- package/dist/templates/static-analysis/spotbugs-exclude.xml.ejs +120 -0
- package/dist/templates/static-analysis/spotbugs.gradle.ejs +18 -0
- package/dist/templates/static-analysis/spotless.gradle.ejs +38 -0
- package/dist/templates/static-analysis/stylelintrc.json.ejs +16 -0
- package/dist/templates/suppressions/archunit-baseline.json.ejs +1 -0
- package/dist/templates/suppressions/consumer-audit-allowlist.json.ejs +1 -0
- package/dist/templates/suppressions/gitleaksignore.ejs +20 -0
- package/dist/templates/suppressions/pii-allowlist.json.ejs +1 -0
- package/dist/templates/suppressions/suppressions-schema.json.ejs +39 -0
- package/dist/templates/suppressions/trivyignore.ejs +17 -0
- package/dist/templates/testing/test-taxonomy.md.ejs +120 -0
- package/dist/test/example.behavioral.test.js +2 -0
- package/dist/types/memory.d.ts +19 -0
- package/dist/types/memory.js +1 -0
- package/dist/types/plan.d.ts +102 -0
- package/dist/types/plan.js +2 -0
- package/dist/types/plugin.d.ts +45 -0
- package/dist/types/plugin.js +1 -0
- package/dist/utils/canon-loader.js +2 -0
- package/dist/utils/channel.js +1 -0
- package/dist/utils/config.d.ts +79 -0
- package/dist/utils/config.js +5 -0
- package/dist/utils/confirm-downgrade.js +5 -0
- package/dist/utils/env.js +2 -0
- package/dist/utils/error-catalog.js +2 -0
- package/dist/utils/errors.js +2 -0
- package/dist/utils/evidence-log.js +3 -0
- package/dist/utils/file-lock.js +2 -0
- package/dist/utils/first-run.js +8 -0
- package/dist/utils/fs.js +3 -0
- package/dist/utils/github-issue-helper.js +4 -0
- package/dist/utils/gradle.js +21 -0
- package/dist/utils/json-output.js +2 -0
- package/dist/utils/logger-config.js +4 -0
- package/dist/utils/logger.js +3 -0
- package/dist/utils/maturity-check.js +2 -0
- package/dist/utils/pkg.js +3 -0
- package/dist/utils/platform.js +2 -0
- package/dist/utils/plugin-loader.js +2 -0
- package/dist/utils/plugin-worker.js +2 -0
- package/dist/utils/prettier-format.js +2 -0
- package/dist/utils/profiler.js +2 -0
- package/dist/utils/render.js +2 -0
- package/dist/utils/replay.js +3 -0
- package/dist/utils/run-cli.js +6 -0
- package/dist/utils/run-id.js +3 -0
- package/dist/utils/safe-read.js +2 -0
- package/dist/utils/task-id.js +2 -0
- package/dist/utils/today.js +2 -0
- package/dist/utils/tty.js +2 -0
- package/dist/utils/walk-dir.js +2 -0
- package/dist/verify/rules/drive-by-scope.js +1 -0
- package/dist/verify/rules/orphan-todos.js +1 -0
- package/dist/verify/rules/registry.js +1 -0
- package/dist/verify/rules/skip-patterns.js +1 -0
- package/dist/verify/rules/types.d.ts +15 -0
- package/dist/verify/rules/types.js +1 -0
- package/dist/verify/rules/ui-language.js +1 -0
- package/dist/verify/run.js +3 -0
- package/dist/wizard/archetype-defaults.js +1 -0
- package/dist/wizard/presets.js +1 -0
- package/dist/wizard/prompts.js +44 -0
- package/dist/wizard/types.d.ts +637 -0
- package/dist/wizard/types.js +1 -0
- package/dist/worktree/harvest.js +2 -0
- package/dist/worktree/links.js +2 -0
- package/dist/worktree/paths.js +2 -0
- package/dist/worktree/validate.js +3 -0
- package/package.json +124 -0
- package/scripts/check-arc42-slots.mjs +738 -0
- package/scripts/check-doc-freshness.mjs +236 -0
- package/scripts/check-doc-set.mjs +243 -0
- package/scripts/check-doc-style.mjs +228 -0
- package/scripts/gold-audit.mjs +319 -0
- package/scripts/lib/doc-gate-allowlist.mjs +123 -0
- package/scripts/lib/doc-set-resolve.mjs +274 -0
- package/scripts/lib/glob-walk.mjs +148 -0
- package/scripts/lib/gold-audit-lib.mjs +1260 -0
- package/scripts/lib/run-helpers.mjs +413 -0
|
@@ -0,0 +1,491 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: wave-drain
|
|
3
|
+
description: Use when draining the open backlog at maximum throughput. Batch up to ~10 workable issues into a WAVE, plan and review the wave once cumulatively, dispatch parallel TDD agents in isolated worktrees, then integrate into a SINGLE wave PR merged GREEN. Issues that cannot proceed become needs-human with a blocker report. The orchestrator directs parallel agents — it never implements.
|
|
4
|
+
argument-hint: '[--wave-size N] [--max-parallel N]'
|
|
5
|
+
title: 'Wave Drain'
|
|
6
|
+
doc_version: '2.0.0'
|
|
7
|
+
status: active
|
|
8
|
+
last_review: '2026-07-10'
|
|
9
|
+
owner: ''
|
|
10
|
+
canonical_id: ''
|
|
11
|
+
tags: ['audience/agent', 'audience/dev', 'kind/internal', 'kind/orchestration']
|
|
12
|
+
related: ['epic-decompose', 'understand-code', 'tdd', 'verification', 'ssot-navigation']
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Wave Drain
|
|
16
|
+
|
|
17
|
+
**Goal:** Drain the open backlog at maximum throughput. Every workable issue ends either
|
|
18
|
+
**merged** (inside a wave PR merged GREEN) or **needs-human** with a blocker report.
|
|
19
|
+
|
|
20
|
+
**Mental model:** You are the Claude Code **orchestrator**. You do **not** implement — you
|
|
21
|
+
**direct parallel agents**. Tokens are saved by running the heavy ceremony **once per wave**
|
|
22
|
+
(one cumulative plan, one plan review, one code review, one full gate, one PR), never by
|
|
23
|
+
skipping phases.
|
|
24
|
+
|
|
25
|
+
> `/ship` drives **one issue → one PR**. Wave Drain is its multi-issue sibling: **N issues →
|
|
26
|
+
> one wave PR**, reusing the same engine and the same gates.
|
|
27
|
+
|
|
28
|
+
**Legality (ADR-103):** parallel write-agents are in-contract ONLY under the rule-50
|
|
29
|
+
carve-out — every agent in a **dedicated worktree** (`/wt-open`), on a **distinct branch**,
|
|
30
|
+
with **plan-manifest-disjoint file-sets**. Dependency changes (`package.json`/lockfiles),
|
|
31
|
+
main-tree edits and tags stay serial-only. **Convergence model (owner-ratified
|
|
32
|
+
2026-07-10):** on arbiter-governed repos every wave converges into **ONE wave PR** — the
|
|
33
|
+
parallelism is in HOW the wave is built, never in N PRs racing to `main`. For repos
|
|
34
|
+
WITHOUT arbiter governance, see the **cross-repo appendix** at the end (N-PR +
|
|
35
|
+
merge-train).
|
|
36
|
+
|
|
37
|
+
## Primitives
|
|
38
|
+
|
|
39
|
+
| Primitive | Role here |
|
|
40
|
+
| ---------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
|
|
41
|
+
| `/ship` | Pipeline reference for the per-issue phase contract (plan → red-team → TDD → review → verify → merge) |
|
|
42
|
+
| `arbiter task init / advance / record-red / recover / get` | The state engine each agent anchors its work to |
|
|
43
|
+
| `/wt-open`, `/wt-close`, `/wt-prune`, `/wt-list` | Isolated git worktrees, one per group |
|
|
44
|
+
| `arbiter gate-exec -- <cmd>` | Per-repo gate mutex (flock(1)): serializes expensive gates across parallel agents (ADR-103) |
|
|
45
|
+
| `arbiter worktree prune --stale [h]` | Zombie reaper: merged/inactive clean worktrees, dry-run default (ADR-103) |
|
|
46
|
+
| Skill `epic-decompose` | Only if an entangled issue must be split before batching |
|
|
47
|
+
| Skill `understand-code` | Per-agent code comprehension before editing |
|
|
48
|
+
| Skill `tdd` | The red → green → refactor loop every agent runs per unit |
|
|
49
|
+
| Skill `verification` | Claim-based verification on the cumulative branch before the gate |
|
|
50
|
+
| Skill `ssot-navigation` | Locate invariants / SSOT before touching guarded files |
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Phase 0 — Triage + Wave composition
|
|
55
|
+
|
|
56
|
+
1. `gh issue list --state open` (this repo). **Exclude** anything labelled `blocked`,
|
|
57
|
+
`needs-human`, `epic`, or `needs-clarification`.
|
|
58
|
+
1b. **Readiness gate (INV-138)** — for each issue that survives the label filter AND is
|
|
59
|
+
about to be selected into the wave (never a mass sweep of the whole backlog), run:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
gh issue view <n> --json body -q .body > /tmp/issue-<n>.md
|
|
63
|
+
node scripts/issue-readiness.mjs --body-file /tmp/issue-<n>.md --emit-comment
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Exit 1 (not ready — missing explicit `AC-N:` acceptance criteria, non-goals, or
|
|
67
|
+
files/contracts touched) ⇒ label it `needs-clarification`, post the emitted comment
|
|
68
|
+
(skip the comment when the label is already present), and **exclude it from the wave**.
|
|
69
|
+
Underspecification is paid here, as a prompt before dispatch — not after review as a
|
|
70
|
+
thrown-away PR. Exit 2 (gh/network error) ⇒ treat the issue as not composable this wave.
|
|
71
|
+
If `scripts/issue-readiness.mjs` does not exist in this repo (Track-B emission is a
|
|
72
|
+
tracked follow-up, ADR-110), a `Cannot find module` failure is never a "not ready"
|
|
73
|
+
verdict — record `readiness: script absent — skipped` in the wave roster and move on.
|
|
74
|
+
The skip is declared, never silent: an unrecorded skip is indistinguishable from a
|
|
75
|
+
forgotten step.
|
|
76
|
+
|
|
77
|
+
2. Compose a **WAVE**: up to **10 issues**, partitioned into **groups** of **≤5 issues** each,
|
|
78
|
+
grouped by module / dependency. Independent groups are parallelizable. Entangled issues
|
|
79
|
+
(shared modules, or a declared `conflicts-with:#N`) go in the **same group** or get
|
|
80
|
+
**split** first via `epic-decompose`.
|
|
81
|
+
3. Record the wave roster: for each group list its issues, target modules, and the
|
|
82
|
+
conflict-risk ordering you will use at integration.
|
|
83
|
+
|
|
84
|
+
A group is the unit of parallelism. Keep groups module-coherent so two agents never edit the
|
|
85
|
+
same file concurrently (see `.claude/rules/50-batch-execution.md` — the ADR-103 carve-out is
|
|
86
|
+
what makes parallel write-agents legal, and its disjoint-file-set condition is satisfied
|
|
87
|
+
HERE, at composition time).
|
|
88
|
+
|
|
89
|
+
**Declared conflicts:** an issue labelled/marked `conflicts-with:#N` goes in the **same
|
|
90
|
+
group as #N** (serial lane, same worktree, sequential) — never in a parallel group. This is
|
|
91
|
+
declarative and cheap; the integration merge + single gate remain the safety net for
|
|
92
|
+
conflicts nobody declared.
|
|
93
|
+
|
|
94
|
+
## Phase 0.5 — Harvest the finding spool (#1404)
|
|
95
|
+
|
|
96
|
+
Before composing the wave's work, **drain the incidental-finding spool into tracked issues** so
|
|
97
|
+
findings noticed in prior waves become first-class backlog candidates instead of rotting in
|
|
98
|
+
`.arbiter/findings/`:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
# arbiter findings promote/list was removed in the B-prune (#1817 B2) — no CLI
|
|
102
|
+
# automation ships for this step anymore. Inspect the spool directly:
|
|
103
|
+
cat .arbiter/findings/*.jsonl 2>/dev/null | jq -s '.'
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Each shard entry is a finding recorded via `arbiter note` (fingerprinted by file+kind+text, line
|
|
107
|
+
excluded). Triage manually: drop entries whose file/graph-node no longer exists at HEAD, skip
|
|
108
|
+
anything already tracked by an open issue, and `gh issue create` the survivors yourself
|
|
109
|
+
(`finding`+`tech-debt`+`priority/Pn` labels). The spool being absent/empty is a clean no-op.
|
|
110
|
+
|
|
111
|
+
**Newly-triaged `severity: low` findings are candidate issues for THIS wave** — fold them into the
|
|
112
|
+
Phase 0 triage roster (subject to the same workability filter). Higher-severity findings enter
|
|
113
|
+
the backlog like any other issue.
|
|
114
|
+
|
|
115
|
+
### Transactional claim (#1378)
|
|
116
|
+
|
|
117
|
+
**Check-ALL-then-claim-ALL** to avoid race conditions when multiple drain runs overlap:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
# 1. Verify ALL selected issues are still open and unassigned
|
|
121
|
+
for issue in $WAVE_ISSUES; do
|
|
122
|
+
state=$(gh issue view "$issue" --json state,assignees --jq '{state:.state,assignees:(.assignees|length)}')
|
|
123
|
+
echo "$state" | jq -e '.state == "OPEN" and .assignees == 0' > /dev/null || { echo "Issue #$issue not claimable"; exit 1; }
|
|
124
|
+
done
|
|
125
|
+
|
|
126
|
+
# 2. Claim ALL atomically
|
|
127
|
+
claimed=()
|
|
128
|
+
for issue in $WAVE_ISSUES; do
|
|
129
|
+
if gh issue edit "$issue" --assignees @me; then
|
|
130
|
+
claimed+=("$issue")
|
|
131
|
+
else
|
|
132
|
+
for c in "${claimed[@]}"; do gh issue edit "$c" --remove-assignee @me; done
|
|
133
|
+
echo "Claim failed for #$issue — rolled back all assignments"; exit 1
|
|
134
|
+
fi
|
|
135
|
+
done
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
**Rules:**
|
|
139
|
+
|
|
140
|
+
- Never claim before verifying. A closed or already-assigned issue must be excluded.
|
|
141
|
+
- Never swallow `gh issue edit` errors — propagate them and trigger rollback.
|
|
142
|
+
- On partial failure, release all already-claimed issues before aborting.
|
|
143
|
+
- If rollback itself fails, log the orphaned claims explicitly for manual cleanup.
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## Phase 1 — One cumulative plan (session model — plan synthesis is a judgment stage)
|
|
148
|
+
|
|
149
|
+
Write **a single cumulative plan** for the whole wave to `.claude/plans/wave-N.md`. For each
|
|
150
|
+
group include a **manifest**:
|
|
151
|
+
|
|
152
|
+
- **Files** the group will touch — file-sets must be disjoint across parallel groups
|
|
153
|
+
(ADR-103 carve-out condition; overlap → same group, serial)
|
|
154
|
+
- **Read-set** — files/globs the group is expected to READ beyond its write set (M6 #1943;
|
|
155
|
+
reads bounded socially, writes mechanically)
|
|
156
|
+
- **Invariants** in scope (from `GLOBAL_INVARIANTS.md` + `AGENTS.md` — cite INV-IDs)
|
|
157
|
+
- **Acceptance-criteria anchor (INV-138)** — per issue, copy the issue's criteria
|
|
158
|
+
**verbatim** into a `## Acceptance Criteria` block (plus `## Non-Goals`) under the
|
|
159
|
+
group's section, **namespacing each id per issue**: issue #123's `AC-1` becomes
|
|
160
|
+
`AC-123.1` in the wave plan (duplicate bare ids across issues are a gate error).
|
|
161
|
+
Tests and review cite these frozen ids, never a re-reading of the issue: the anchor —
|
|
162
|
+
not the implementing agent's interpretation — is the DoD.
|
|
163
|
+
- **TDD units** (the red → green slices) — each unit names the `AC-N` id(s) it proves
|
|
164
|
+
- **Conflict risks** vs other groups (which files / interfaces overlap)
|
|
165
|
+
|
|
166
|
+
This manifest is the group's **merge contract** (INV-138): acceptance criteria + repo
|
|
167
|
+
policy + required tests + CI expectations + review/security surfaces + dependencies,
|
|
168
|
+
derived BEFORE writing. Code and tests are born against it — adversarial review judges
|
|
169
|
+
the diff against it before integration, which is what kills accordion PRs.
|
|
170
|
+
|
|
171
|
+
Every implementation agent will **anchor its `arbiter task` to its group's section** of this
|
|
172
|
+
plan (CANON-16, enforced by the `pre-edit-plan-anchor` hook). No per-issue plans.
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Phase 2 — One plan review
|
|
177
|
+
|
|
178
|
+
Run the plan gate **once** on the cumulative plan: dispatch the plan-review agents against
|
|
179
|
+
`.claude/plans/wave-N.md` and record their verdict in
|
|
180
|
+
`.arbiter/evidence/plan-review/<id>/latest.json` (the review-dispatch CLI was removed in #1817 —
|
|
181
|
+
the gate now reads that evidence file, it is not a single command).
|
|
182
|
+
|
|
183
|
+
In parallel, dispatch a **tier-Standard red-team** (3 agents) against the cumulative plan.
|
|
184
|
+
|
|
185
|
+
- **CRITICAL** → rework the plan (**max 2 cycles**, then escalate to a human).
|
|
186
|
+
- **PASS** = **GO for the entire wave**.
|
|
187
|
+
|
|
188
|
+
## Phase 2.5 — Per-issue 3-hop plan gate (default-on)
|
|
189
|
+
|
|
190
|
+
Every issue in the wave gets a **per-issue 3-hop plan trail as issue comments before any
|
|
191
|
+
code**:
|
|
192
|
+
|
|
193
|
+
1. **hop 1/3** — draft plan (comment headed `## Piano hop 1/3` or `## Plan hop 1/3`)
|
|
194
|
+
2. **hop 2/3** — adversarial red-team: every finding with `file:line` evidence and a verdict
|
|
195
|
+
3. **hop 3/3** — final plan incorporating every finding (or refuting it with evidence)
|
|
196
|
+
|
|
197
|
+
The orchestrator verifies the trail **deterministically via `gh`**: three hop-header
|
|
198
|
+
comments, each carrying at least one `file:line` evidence marker and a non-trivial body.
|
|
199
|
+
The quality of the hops is model-side — this check catches absence, not proforma.
|
|
200
|
+
|
|
201
|
+
The gate is default-on and unconditional: a plan discovered wrong at integration costs the
|
|
202
|
+
whole group's rework, which is far more than the gate's explicit up-front cost. That cost
|
|
203
|
+
scales with the tier, not with enthusiasm — hop 2's adversarial pass runs with the tier's
|
|
204
|
+
`refutation_skeptics` count from `.claude/agent-dispatch-matrix.json` (XS/S = 1 skeptic,
|
|
205
|
+
Standard = 3). The `needs-plan` label no longer switches the gate on (it is always on); it
|
|
206
|
+
raises hop 2 to the Standard floor (3 skeptics) for architectural or ambiguous-scope
|
|
207
|
+
issues regardless of tier.
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## Phase 3 — Parallel execution (scale out)
|
|
212
|
+
|
|
213
|
+
Spawn **one agent per group** in an **isolated worktree** (`/wt-open`, a branch per group).
|
|
214
|
+
`--max-parallel` defaults to **<%= maxParallelWorktrees %>** from
|
|
215
|
+
`automation.maxParallelWorktrees` (or the collaboration-mode default when absent).
|
|
216
|
+
Effective cap: **`min(--max-parallel, nproc - 2, wave size)`** — the mutex serializes the
|
|
217
|
+
GATE, not the workers' implicit builds, so leave the box headroom.
|
|
218
|
+
|
|
219
|
+
**Worktree discipline (speed):** inside a worktree run **only light checks** — targeted
|
|
220
|
+
`vitest` + the lint from `post-edit-dispatch`. The **full gate is forbidden in worktrees**; it
|
|
221
|
+
runs **once**, on integration.
|
|
222
|
+
|
|
223
|
+
**Gate mutex (ADR-103):** any expensive gate that could run concurrently with another
|
|
224
|
+
agent's gate on the same repo (parallel waves, ship agents, overnight batches) goes through
|
|
225
|
+
`arbiter gate-exec -- <gate-cmd>`. The wait is kernel-side (`flock(1)`, blocking) and the
|
|
226
|
+
lock releases if the gate-exec supervisor is SIGKILL/OOM-killed; killing the Arbiter Node
|
|
227
|
+
PID alone leaves that supervisor holding — no 1h stale stall, no poll loop. Linux tracks ordinary
|
|
228
|
+
process-group escapes by an inherited sentinel; a payload that deliberately closes it before
|
|
229
|
+
escaping is outside the guarantee and can outlive mutex release.
|
|
230
|
+
Where `flock(1)` does not exist (macOS base system, Windows) `gate-exec` fails closed:
|
|
231
|
+
degrade the wave to serial (`--max-parallel 1`).
|
|
232
|
+
|
|
233
|
+
**Cache isolation:** `arbiter worktree open` links `node_modules` with the
|
|
234
|
+
`symlink-children` strategy — `.vite`/`.cache` stay per-worktree, so parallel builds cannot
|
|
235
|
+
corrupt one shared cache into spurious reds. Belt-and-braces in each worker brief:
|
|
236
|
+
`export VITE_CACHE_DIR="$PWD/.cache/vite"`.
|
|
237
|
+
|
|
238
|
+
**M16 handoff-contract: subagents never own waits** — worker briefs end at commit + launch + structured handoff
|
|
239
|
+
{SHA, worktree, PID, exit-file, log} with an explicit END-TURN; ALL watches belong to the
|
|
240
|
+
coordinator (`bg-run.sh` + `pid-watch.sh`, #2103).
|
|
241
|
+
|
|
242
|
+
**Anti-stall (two DIFFERENT problems — never conflate them):**
|
|
243
|
+
|
|
244
|
+
- **Gate-wait** is deterministic: `gate-exec` blocks in the foreground — issue **ONE** wait
|
|
245
|
+
and let the kernel queue you. Never poll for the lock, never close a turn "checking back
|
|
246
|
+
later" on a mutex.
|
|
247
|
+
- **Turn-stall** (an agent idling mid-task) is only **bounded**, never prevented, by the
|
|
248
|
+
**watchdog sweep**: at every orchestrator turn boundary, reconcile REAL state — `gh pr
|
|
249
|
+
checks`, `gh issue view`, `arbiter worktree list`, DONE reports — and re-dispatch, mark
|
|
250
|
+
`needs-human`, or reap what stalled beyond its budget. Never rely on memory of what
|
|
251
|
+
agents "should" be doing; never close an orchestrator turn passively waiting on a PR —
|
|
252
|
+
arm auto-merge and let the NEXT sweep observe it.
|
|
253
|
+
|
|
254
|
+
Each agent's loop:
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
arbiter task init --plan <wave-N.md#group-anchor> # anchor to the group's plan section
|
|
258
|
+
# invoke the tdd skill per unit: red → verify-red → green → verify-green → refactor
|
|
259
|
+
# targeted tests green
|
|
260
|
+
git commit # format enforced by post-commit-check
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
Every worker brief names the `tdd` skill explicitly — a worker that starts from
|
|
264
|
+
implementation code has skipped the red step, and the pre-push tdd-evidence check will fail
|
|
265
|
+
its branch structurally (see Iron Law below).
|
|
266
|
+
|
|
267
|
+
Then emit a **DONE report**: files touched, tests added, commits, and `findings[]`.
|
|
268
|
+
|
|
269
|
+
#### Canonical finding shape (#1404)
|
|
270
|
+
|
|
271
|
+
The DONE-report `findings[]` use the **same `FindingEntry` shape as `arbiter note`** — the SSOT is
|
|
272
|
+
`src/commands/task-note.ts` (interface `FindingEntry`). This is what lets a finding flow straight
|
|
273
|
+
into the `.arbiter/findings` spool and get triaged manually (see "Phase 0.5 — Harvest the finding
|
|
274
|
+
spool" above) in the next wave, with fingerprint dedup using the SAME material as `task-note.ts`
|
|
275
|
+
`computeFingerprint` (so a finding is never double-filed). Do **not** invent a parallel free-prose
|
|
276
|
+
shape.
|
|
277
|
+
|
|
278
|
+
Each finding is one object with these fields (`graphNode` and `auditorHint` are optional; every
|
|
279
|
+
other field is required):
|
|
280
|
+
|
|
281
|
+
```json
|
|
282
|
+
{
|
|
283
|
+
"ts": "2026-06-16T00:00:00.000Z",
|
|
284
|
+
"note": "duplicated retry helper — extract a shared utility",
|
|
285
|
+
"kind": "dup",
|
|
286
|
+
"severity": "low",
|
|
287
|
+
"foundDuring": "#1404",
|
|
288
|
+
"file": "src/commands/findings-promote.ts",
|
|
289
|
+
"line": 120,
|
|
290
|
+
"sha": "deadbeefcafef00d",
|
|
291
|
+
"graphNode": "src/commands/findings-promote.ts#revalidate",
|
|
292
|
+
"fingerprint": "<sha1 of kind+normalizedPath+symbol+normalizedNote>",
|
|
293
|
+
"auditorHint": "code-quality"
|
|
294
|
+
}
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
- `kind` — finding class: `dup` | `smell` | `risk` | `debt` | `note`.
|
|
298
|
+
- `severity` — `low` | `med` | `high` | `info` (drives the promoted issue's `priority/Pn` label).
|
|
299
|
+
- `line` — number or `null`; it is **excluded** from the fingerprint.
|
|
300
|
+
- `graphNode` — optional graph-node id; **omitted** (not a key) when absent.
|
|
301
|
+
- `auditorHint` — optional; the `auditor-routing.json` auditor whose remit covers the finding.
|
|
302
|
+
|
|
303
|
+
The cheapest way to honour this shape is to capture findings in-band with `arbiter note` (which
|
|
304
|
+
writes exactly this entry); the DONE report then just mirrors what is already in the spool.
|
|
305
|
+
|
|
306
|
+
**A blocked agent → mark its issue `needs-human` and STOP that agent. It does NOT block the
|
|
307
|
+
wave.** The rest of the wave proceeds.
|
|
308
|
+
|
|
309
|
+
---
|
|
310
|
+
|
|
311
|
+
## Phase 4 — Local integration (one PR per wave)
|
|
312
|
+
|
|
313
|
+
1. Create a local integration branch `wave-N-integration` **from `main`** (never commit to
|
|
314
|
+
`main`).
|
|
315
|
+
2. **Merge the DONE worktrees sequentially**, minimum-overlap first, with the order computed
|
|
316
|
+
from the REAL branches — `git diff --name-only main...<branch>` per branch, fewest shared
|
|
317
|
+
files first — not from the plan's estimates. Conflicts → hand to a dedicated conflict
|
|
318
|
+
agent with the relevant DONE reports.
|
|
319
|
+
3. **On the cumulative branch, once only — multiagent code review:**
|
|
320
|
+
- Route auditors:
|
|
321
|
+
`[ -f scripts/route-auditors.mjs ] && node scripts/route-auditors.mjs --size-floor Standard || echo "route-auditors: script absent — skipped"`
|
|
322
|
+
(arbiter's own wave-routing helper; a generated project does not receive it. The skip
|
|
323
|
+
is declared, never silent — record it in the wave roster and route the auditors by hand.)
|
|
324
|
+
- Self-review pass + **Adversarial Verifier**: trace each feature end-to-end, hunt dead
|
|
325
|
+
code and unwired options.
|
|
326
|
+
- **FIT rubric (INV-138):** the review judges fit against the frozen anchor, not just
|
|
327
|
+
code quality — for **each** `AC-N` in each group's `## Acceptance Criteria` block,
|
|
328
|
+
cite the diff/test line that proves it; any criterion without cited evidence ⇒
|
|
329
|
+
REJECT for that group. Non-goals violated ⇒ scope-creep finding. Record the
|
|
330
|
+
per-criterion verdicts in `.arbiter/evidence/ac-fit/wave-N.json` (schema
|
|
331
|
+
`arbiter-ac-fit-v1`), then run the deterministic check — anchor AND all-PASS fit:
|
|
332
|
+
`[ -f scripts/check-acceptance.mjs ] && node scripts/check-acceptance.mjs --plan .claude/plans/wave-N.md --ac-fit .arbiter/evidence/ac-fit/wave-N.json || echo "check-acceptance: script absent — skipped"`
|
|
333
|
+
(arbiter's own AC-fit verifier; a generated project does not receive it. When it is
|
|
334
|
+
absent the per-criterion verdicts above are still MANDATORY — record
|
|
335
|
+
`ac-fit: script absent — verdicts reviewed by hand` so the skip stays visible.)
|
|
336
|
+
- Write the **evidence file** (fail-closed, INV-114).
|
|
337
|
+
- Any still-unresolved `redTeamFindings` cap their mapped auditor's score (`[RT-xx UNRESOLVED]`).
|
|
338
|
+
- **CRITICAL / MAJOR** → dispatch a fixer agent.
|
|
339
|
+
4. **Commit the cumulative candidate and all review/evidence artifacts.** This is the final
|
|
340
|
+
pre-gate commit. The working tree must be clean; nothing may be committed after L2 because
|
|
341
|
+
`gate-pass.json` is bound to the exact HEAD and tree hash.
|
|
342
|
+
5. **Verify, then gate:**
|
|
343
|
+
|
|
344
|
+
Run the `verification` skill on the cumulative branch first (claim-based pass: every
|
|
345
|
+
claim in the DONE reports gets checked against the tree, not trusted), then the gate:
|
|
346
|
+
|
|
347
|
+
```bash
|
|
348
|
+
# skill: verification — claim-based pass on the cumulative branch first
|
|
349
|
+
# FULL GATE → writes gate-pass.json; under the per-repo mutex (ADR-103) so a
|
|
350
|
+
# concurrent agent's gate never interleaves with this one:
|
|
351
|
+
arbiter gate-exec -- node scripts/check-all.mjs L2
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
`gate-pass.json` is required by the `enforce-gate-before-pr` hook.
|
|
355
|
+
|
|
356
|
+
6. **RED → root-cause structural fix** (never `--no-verify`, never skip). If the culprit is
|
|
357
|
+
one group, **revert that group's merge** → mark its issues `needs-human` → the wave
|
|
358
|
+
continues with the rest. **Any reverted/redone group and any FIT REJECT is rework
|
|
359
|
+
data**: append the why × where-caught before proceeding —
|
|
360
|
+
`node scripts/rework-log.mjs add --issue <n> --reason <r> --caught review` (taxonomy in
|
|
361
|
+
the script; `report` mode shows which issue-template section is leaking).
|
|
362
|
+
7. **One PR per wave.** Body: a table mapping each issue → its commit, and **one `Closes #N`
|
|
363
|
+
line per issue** — never a comma-separated list (`Closes #N1, #N2, ...`); GitHub's
|
|
364
|
+
closing-keyword parser only reliably auto-closes the first issue in such a list on
|
|
365
|
+
admin/rebase-merge (#1766). Merge **only with checks GREEN**:
|
|
366
|
+
|
|
367
|
+
```bash
|
|
368
|
+
gh pr create --title "wave(N): <summary>" --body "<issue→commit table>
|
|
369
|
+
|
|
370
|
+
Closes #N1
|
|
371
|
+
Closes #N2
|
|
372
|
+
..."
|
|
373
|
+
<%_ const _waveCollaborationMode = typeof collaborationMode === 'string' ? collaborationMode : ''; const _waveMergeMode = typeof mergeMode === 'string' ? mergeMode : (typeof solo !== 'undefined' && solo !== null && typeof solo.mergeMode === 'string' ? solo.mergeMode : 'direct'); if (_waveCollaborationMode === 'trunk-solo' && _waveMergeMode === 'pr-ff') { _%>
|
|
374
|
+
node scripts/pr-merge-watch.mjs \
|
|
375
|
+
"$(gh repo view --json nameWithOwner -q .nameWithOwner)" \
|
|
376
|
+
"$(gh pr view --json number -q .number)"
|
|
377
|
+
<%_ } else { _%>
|
|
378
|
+
gh pr checks --watch
|
|
379
|
+
gh pr merge --merge # only when CI is GREEN
|
|
380
|
+
<%_ } _%>
|
|
381
|
+
# post-merge: confirm every ref closed, close stragglers. arbiter's own helper —
|
|
382
|
+
# absent in a generated project, where the skip is declared and the refs checked by hand.
|
|
383
|
+
[ -f scripts/verify-pr-closes.mjs ] && node scripts/verify-pr-closes.mjs <PR#> \
|
|
384
|
+
|| echo "verify-pr-closes: script absent — skipped"
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
CI red → root-cause fix → re-gate (PRs are owned until merged green).
|
|
388
|
+
|
|
389
|
+
8. `/wt-close` (harvest) + `arbiter worktree prune --stale 24` (review the dry-run report,
|
|
390
|
+
then re-run with `--execute`) → `/clear` → **next wave**, until the backlog is empty. The
|
|
391
|
+
reaper also runs inside the watchdog sweep, so a crashed worker's zombie worktree never
|
|
392
|
+
outlives the wave (dirty trees are never touched — INV-96).
|
|
393
|
+
|
|
394
|
+
**M6 touched-vs-manifest GO condition (#1943):** before merging each group's branch, run
|
|
395
|
+
`node scripts/check-touched-vs-manifest.mjs --plan .claude/plans/wave-N.md --group <G>
|
|
396
|
+
--base main --branch <group-branch>` — this verifies touched(G) ⊆ declared(G) for one group;
|
|
397
|
+
it does not prove cross-group pairwise disjointness. Non-zero ⇒ the group is not clear to
|
|
398
|
+
merge (root-cause: either the manifest was under-declared or the agent scope-crept). A
|
|
399
|
+
read-set row absent from the manifest fails the check for that group the same way: an
|
|
400
|
+
omitted row must not be able to disarm the check it feeds — fix the plan's manifest, then
|
|
401
|
+
re-run.
|
|
402
|
+
|
|
403
|
+
---
|
|
404
|
+
|
|
405
|
+
## Iron Law
|
|
406
|
+
|
|
407
|
+
- **No group enters integration** without TDD + targeted tests **green**.
|
|
408
|
+
- **Nothing reaches `main`** without: red-team on the plan, multiagent review + adversarial
|
|
409
|
+
verify, and a **full gate GREEN** on the wave PR.
|
|
410
|
+
- The ceremony is **per-wave, not per-issue** — that is where the tokens are saved, **not by
|
|
411
|
+
skipping it**.
|
|
412
|
+
- **Iff-closure contract (field-validated 2026-08-09):** an issue closes ⟺ (E2E evidence ∧
|
|
413
|
+
doc evidence) — real-binary proof (bake/fixture/consumer/live-CI, never unit-only) AND
|
|
414
|
+
doc gates green with content updated. The PR body carries a per-issue evidence table; an
|
|
415
|
+
issue missing either half gets NO `Closes` line — it stays open with a comment naming
|
|
416
|
+
the missing half. Post-merge-only evidence (a live nightly, a consumer run) closes the
|
|
417
|
+
issue AFTER that run is green, not at merge.
|
|
418
|
+
- **RED-first branch construction:** the pre-push tdd-evidence check RE-RUNS the RED at its
|
|
419
|
+
pinned `test_commit_sha` — order every branch test(RED)→fix→evidence-pinned-to-the-test-
|
|
420
|
+
commit, `observed_failure` matching the re-run format exactly. Fix-before-test ordering
|
|
421
|
+
fails verification structurally, not stylistically.
|
|
422
|
+
- **Leads run composed L1 before the DONE report:** the worktree pre-commit skips L1
|
|
423
|
+
(#1695) — sub-check spot-checks miss bake goldens, examples drift, docs-gate, format.
|
|
424
|
+
Full `check-all.mjs L1` in the worktree is part of every lead brief's exit criteria.
|
|
425
|
+
- **Snapshot conflicts: regenerate, never hand-resolve.** Generated artifacts (bake
|
|
426
|
+
goldens, examples/**, manifests) conflicting at merge: take either side, then rebuild +
|
|
427
|
+
regenerate on the MERGED tree and audit the diff (hash-only expected, file-list moves
|
|
428
|
+
explained, nothing disappears).
|
|
429
|
+
- **Runner contention is not a test failure:** `status: null`/exit 137 on the single-slot
|
|
430
|
+
runner = SIGKILL from parallel-workflow racing. Re-run after the queue drains; never
|
|
431
|
+
patch the test.
|
|
432
|
+
- **Premise falsification with line-drift awareness:** locate issue-body claims BY
|
|
433
|
+
CONTENT, never by cited line numbers (audits go stale in days); re-verify every premise
|
|
434
|
+
on the CURRENT tree before implementing.
|
|
435
|
+
|
|
436
|
+
## Stop conditions (fail-closed)
|
|
437
|
+
|
|
438
|
+
STOP, write a blocker report, mark the issue `needs-human`, and **move on** when you hit:
|
|
439
|
+
|
|
440
|
+
- An invariant violation → **cite the INV-ID**.
|
|
441
|
+
- An unauthorized edit to an SSOT or read-only file.
|
|
442
|
+
- An orphan TODO (no task ID).
|
|
443
|
+
- An `any` type / placeholder left in edited code.
|
|
444
|
+
- **2 failed plan-review cycles.**
|
|
445
|
+
|
|
446
|
+
A stop never halts the whole wave — it removes one group/issue and the wave proceeds.
|
|
447
|
+
|
|
448
|
+
## Completion
|
|
449
|
+
|
|
450
|
+
Done **only when the backlog is empty** — every issue is either **merged** or **needs-human
|
|
451
|
+
with a stated reason**. Emit a final report: **issue → outcome + PR**.
|
|
452
|
+
|
|
453
|
+
---
|
|
454
|
+
|
|
455
|
+
## Appendix — Cross-repo manual protocol (repos WITHOUT arbiter governance)
|
|
456
|
+
|
|
457
|
+
On a repo with no `arbiter.json` (no `/drain`, no engine) the wave technique still applies,
|
|
458
|
+
but the convergence model flips: **N PRs + auto-merge armed + merge-train** (this is where
|
|
459
|
+
the train is native — PRs are the only integration unit). Field-proven 2026-07-09/10.
|
|
460
|
+
|
|
461
|
+
1. **Worktrees + branches:** one `git worktree add` per issue, one branch per agent, disjoint
|
|
462
|
+
file-sets — the ADR-103 conditions apply verbatim even without the engine.
|
|
463
|
+
2. **Gate mutex (one-liner):** no `arbiter gate-exec` here — use flock directly,
|
|
464
|
+
parameterized on the repo's own gate:
|
|
465
|
+
|
|
466
|
+
```bash
|
|
467
|
+
flock /tmp/<repo>-gate.lock -c '<gate-cmd>' # e.g. 'make gate' or './run.sh ci'
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
Same semantics: kernel wait, kernel release when the direct flock process is
|
|
471
|
+
SIGKILL/OOM-killed, one foreground wait.
|
|
472
|
+
|
|
473
|
+
3. **Per-PR convergence:** each finished issue → its own PR with auto-merge armed. Never
|
|
474
|
+
watch-loop a PR; the sweep observes.
|
|
475
|
+
4. **Merge-train (integration net):** when **≥3 PRs** are green-and-armed, build a local
|
|
476
|
+
train branch from `main`, merge the PR branches sequentially (minimum-overlap order from
|
|
477
|
+
the REAL `git diff --name-only`), run the full gate ONCE on the train under the flock
|
|
478
|
+
one-liner, and only then let the train land. The train catches integration defects that
|
|
479
|
+
are invisible to each green PR alone.
|
|
480
|
+
|
|
481
|
+
**Caveats (explicit — these are the failure modes the governed wave-PR model eliminates
|
|
482
|
+
structurally):**
|
|
483
|
+
|
|
484
|
+
- **Crash mid-train (#4):** recovery is stateless — recompute from `gh pr list` +
|
|
485
|
+
`git branch`/`worktree list`; never from memory. Do not close issues/PRs until the train
|
|
486
|
+
itself is merged.
|
|
487
|
+
- **Branch protection (#6):** verify the target repo's required checks BEFORE relying on
|
|
488
|
+
train-only CI — if required checks are per-PR, each PR still needs its own green CI.
|
|
489
|
+
- **Exclusion instability (#7):** when a branch is EXCLUDED from the train (conflict/red),
|
|
490
|
+
recompute the train order from scratch and re-examine branches that assumed the excluded
|
|
491
|
+
content — the minimum-overlap order is NOT stable under exclusions.
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# <%= projectName %> — Codex Configuration
|
|
2
|
+
|
|
3
|
+
> **Governance rules are in `AGENTS.md` (canonical, AAIF standard).**
|
|
4
|
+
> This file adds OpenAI Codex-specific configuration only.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Quick Reference
|
|
9
|
+
|
|
10
|
+
| Fact | Value |
|
|
11
|
+
|------|-------|
|
|
12
|
+
| **Project** | <%= projectName %> |
|
|
13
|
+
| **Test** | `<%= testCommand %>` |
|
|
14
|
+
| **Gate** | `node scripts/check-all.mjs` |
|
|
15
|
+
| **Full governance** | `../AGENTS.md` |
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Startup Protocol (Read First)
|
|
20
|
+
|
|
21
|
+
1. Read `AGENTS.md` — this contains ALL governance rules and invariants
|
|
22
|
+
2. Read `docs/architecture/ARCHITECTURE.md` if it exists
|
|
23
|
+
3. Check current branch: must be `task/#NNN-description` (not `main`)
|
|
24
|
+
4. If no task branch exists, create one before any edits
|
|
25
|
+
|
|
26
|
+
## Execution Model
|
|
27
|
+
|
|
28
|
+
Codex operates via explicit plans. Before any implementation:
|
|
29
|
+
|
|
30
|
+
1. Create a plan in `.agents/plan/PLAN.json`
|
|
31
|
+
2. List all files to modify with their operations
|
|
32
|
+
3. Identify invariants that apply
|
|
33
|
+
4. Await GO from the user
|
|
34
|
+
|
|
35
|
+
## Plan Schema
|
|
36
|
+
|
|
37
|
+
The plan is validated by `arbiter verify plan` against the `PlanJsonV1` schema
|
|
38
|
+
(the contract). Unknown fields are stripped, so only the fields below are
|
|
39
|
+
honoured.
|
|
40
|
+
|
|
41
|
+
```json
|
|
42
|
+
{
|
|
43
|
+
"task_id": "#NNN",
|
|
44
|
+
"scope": {
|
|
45
|
+
"track": "A",
|
|
46
|
+
"paths": ["src/feature.ts"]
|
|
47
|
+
},
|
|
48
|
+
"files": [
|
|
49
|
+
{
|
|
50
|
+
"path": "src/feature.ts",
|
|
51
|
+
"operation": "modify"
|
|
52
|
+
}
|
|
53
|
+
],
|
|
54
|
+
"invariants": {
|
|
55
|
+
"ui_language": "EN",
|
|
56
|
+
"no_skips": true
|
|
57
|
+
},
|
|
58
|
+
"invariant_ids": ["INV-01", "INV-22"],
|
|
59
|
+
"review_bridge": { "enabled": true, "reviewer": "bridge-reviewer", "fail_on_warn": false }
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
- `task_id` matches `#<issue-number>`.
|
|
64
|
+
- `scope.track` is the evidence track (`A|B|C|D`).
|
|
65
|
+
- `files[].operation` is `create|modify|delete`.
|
|
66
|
+
- `invariants` is a **policy object** (`ui_language:"EN"` asserts the change
|
|
67
|
+
adds no non-EN UI strings; `no_skips:true` asserts no skipped tests) — it is
|
|
68
|
+
NOT a list of invariant IDs.
|
|
69
|
+
- `invariant_ids` lists the SSOT invariants (`INV-NN`) the plan intends to
|
|
70
|
+
honour — this is where invariant IDs belong, not in `invariants`.
|
|
71
|
+
- `review_bridge` is required (`run_id` is generated by `arbiter verify plan`
|
|
72
|
+
into the review output, not supplied in the plan).
|
|
73
|
+
|
|
74
|
+
## Task Workflow
|
|
75
|
+
|
|
76
|
+
Follow this lifecycle for every task:
|
|
77
|
+
|
|
78
|
+
1. **Start**: Read GitHub issue → read `AGENTS.md` → create `task/#NNN-description` branch
|
|
79
|
+
2. **Plan**: Create `.agents/plan/PLAN.json` with file manifest and invariants
|
|
80
|
+
3. **Implement**: Write tests first, then implementation. Run `<%= testCommand %>` after each unit
|
|
81
|
+
4. **Gate**: `node scripts/check-all.mjs L1` before commit, `node scripts/check-all.mjs L2` before push
|
|
82
|
+
5. **Finalize**: Commit → push → PR → verify CI → merge
|
|
83
|
+
|
|
84
|
+
## Command Translation
|
|
85
|
+
|
|
86
|
+
| Claude Code | Codex Equivalent |
|
|
87
|
+
|-------------|-----------------|
|
|
88
|
+
| `/ship #NNN` | **Orchestration entrypoint** — drive an issue to a merged PR |
|
|
89
|
+
| `/task` | Low-level engine/CLI: `arbiter task init/advance/record-red/recover/get` |
|
|
90
|
+
| `<%= testCommand %>` | Run tests for this stack |
|
|
91
|
+
| `node scripts/check-all.mjs L1` | Run before each commit |
|
|
92
|
+
| `node scripts/check-all.mjs L2` | Run before push/PR |
|
|
93
|
+
|
|
94
|
+
## Hard Stops
|
|
95
|
+
|
|
96
|
+
All hard stops from `AGENTS.md` apply. Additionally:
|
|
97
|
+
- Never edit without a plan in `.agents/plan/PLAN.json`
|
|
98
|
+
- Never commit directly to `main`
|
|
99
|
+
- Never skip the gate
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## Known Limitations — Codex Governance Parity
|
|
104
|
+
|
|
105
|
+
Codex has a hook system (`[features] hooks`), but it covers a smaller set of
|
|
106
|
+
events than Claude Code. The table below is **generated from
|
|
107
|
+
the actual Claude-track inventory for this configuration** (ADR-106, arbiter
|
|
108
|
+
#1966) — do not edit it by hand; it is re-derived on every generation and
|
|
109
|
+
checked against the emitted hook inventory by the arbiter parity gate.
|
|
110
|
+
|
|
111
|
+
Hooks marked as *bridged* run in real time on Codex too, via
|
|
112
|
+
`.codex/config.toml` → `codex-adapter.mjs`. Everything else is covered at
|
|
113
|
+
gate time (`node scripts/check-all.mjs`) or is manual discipline, as stated.
|
|
114
|
+
|
|
115
|
+
**A bridged hook only runs once you approve it.** Codex requires a one-time
|
|
116
|
+
trust approval per project hook entry (stored as a `trusted_hash` under
|
|
117
|
+
`[hooks.state]` in `~/.codex/config.toml`); an unapproved entry is skipped
|
|
118
|
+
**silently** — no warning, no exit code, the guard simply does not run, and the
|
|
119
|
+
table above then overstates your real coverage. Approve them once interactively,
|
|
120
|
+
or pass `codex exec --dangerously-bypass-hook-trust` in automation. Editing
|
|
121
|
+
`.codex/config.toml` re-invalidates the approval for the entries it changes.
|
|
122
|
+
|
|
123
|
+
| Claude Code Hook | What it enforces | Codex equivalent |
|
|
124
|
+
|-----------------|-----------------|------------------|
|
|
125
|
+
<% for (const row of knownLimitations.hooks) { -%>
|
|
126
|
+
| `<%= row.name %>` | <%- row.enforces %> | <%- row.codexEquivalent %> |
|
|
127
|
+
<% } -%>
|
|
128
|
+
|
|
129
|
+
Claude-only surfaces with no Codex equivalent (by design, ADR-106 — accurate
|
|
130
|
+
disclosure, not implementation parity):
|
|
131
|
+
|
|
132
|
+
- **Commands** (<%= knownLimitations.commands.length %>): <%- knownLimitations.commands.map((c) => '`/' + c + '`').join(', ') %>
|
|
133
|
+
- **Agents** (<%= knownLimitations.agents.length %>): <%- knownLimitations.agents.map((a) => '`' + a + '`').join(', ') %>
|
|
134
|
+
- **Skills** (<%= knownLimitations.skills.length %>): <%- knownLimitations.skills.map((s) => '`' + s + '`').join(', ') %>
|
|
135
|
+
- **Rules not derived into the Codex track** (<%= knownLimitations.claudeOnlyRules.length %>): <%- knownLimitations.claudeOnlyRules.map((r) => '`' + r + '`').join(', ') %> — each is coupled to a Claude-only mechanism (knowledge-map routing, brainstorm hook, `/impact` skill, CLOSER hook)
|
|
136
|
+
|
|
137
|
+
**Decision:** This gap is intentional. OpenAI Codex has no plugin/hook extension
|
|
138
|
+
point at the time of writing. When Codex adds a hook system, `codex-adapter.mjs`
|
|
139
|
+
should be extended to bridge these checks. Gate-level enforcement catches all
|
|
140
|
+
critical violations before merge.
|