@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,310 @@
|
|
|
1
|
+
# Resilience Patterns
|
|
2
|
+
|
|
3
|
+
> **Advisory** — This document is generated by arbiter for `backend-web-db` projects at L2+.
|
|
4
|
+
> It prescribes the recommended defaults. Override where your service's SLA/SLO demands differ.
|
|
5
|
+
|
|
6
|
+
## Defaults at a glance
|
|
7
|
+
|
|
8
|
+
| Pattern | Default |
|
|
9
|
+
|---------|---------|
|
|
10
|
+
| Retry attempts | 3 (including initial) |
|
|
11
|
+
| Initial backoff | 1 s |
|
|
12
|
+
| Max backoff cap | 30 s |
|
|
13
|
+
| Backoff multiplier | 2× |
|
|
14
|
+
| Jitter | 50 % randomised |
|
|
15
|
+
| Retry on | 5xx + connection/timeout only — **never 4xx** |
|
|
16
|
+
| Circuit-breaker threshold | 50 % failure rate |
|
|
17
|
+
| Circuit-breaker min-calls | 10 |
|
|
18
|
+
| CB decorator order | CB wraps retry (CB sees final outcome) |
|
|
19
|
+
| Per-attempt timeout | 5 s |
|
|
20
|
+
| Rate-limiter (token bucket) | 100 req/s sustained, burst 20, per-client key |
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Circuit Breaker
|
|
25
|
+
|
|
26
|
+
A circuit breaker prevents cascading failures by opening (stopping calls) once failures exceed
|
|
27
|
+
a threshold, then allowing a probe call in half-open state before closing again.
|
|
28
|
+
|
|
29
|
+
**Critical ordering:** place the circuit breaker as the **outer** decorator wrapping retry.
|
|
30
|
+
The CB observes the final result of the whole retry sequence — not each individual attempt.
|
|
31
|
+
|
|
32
|
+
<% if (language === 'typescript' || language === 'multi') { %>
|
|
33
|
+
### TypeScript — cockatiel
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
import {
|
|
37
|
+
ExponentialBackoff,
|
|
38
|
+
SamplingBreaker,
|
|
39
|
+
circuitBreaker,
|
|
40
|
+
handleWhen,
|
|
41
|
+
retry,
|
|
42
|
+
wrap,
|
|
43
|
+
} from 'cockatiel'
|
|
44
|
+
import type { IPolicy } from 'cockatiel'
|
|
45
|
+
|
|
46
|
+
/** Error thrown for HTTP 4xx responses — must NOT be retried. */
|
|
47
|
+
export class ClientError extends Error {
|
|
48
|
+
constructor(
|
|
49
|
+
public readonly status: number,
|
|
50
|
+
message: string,
|
|
51
|
+
) {
|
|
52
|
+
super(message)
|
|
53
|
+
this.name = 'ClientError'
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** Error thrown for HTTP 5xx / connectivity failures — eligible for retry. */
|
|
58
|
+
export class ServerError extends Error {
|
|
59
|
+
constructor(
|
|
60
|
+
public readonly status: number,
|
|
61
|
+
message: string,
|
|
62
|
+
) {
|
|
63
|
+
super(message)
|
|
64
|
+
this.name = 'ServerError'
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Build a resilience policy: circuit-breaker (outer) wrapping retry (inner).
|
|
70
|
+
* The CB observes the final outcome of the whole retry sequence.
|
|
71
|
+
*
|
|
72
|
+
* IMPORTANT: use handleWhen, not handleAll. handleAll retries every error
|
|
73
|
+
* including 4xx (ClientError). handleWhen lets us exclude 4xx explicitly.
|
|
74
|
+
*/
|
|
75
|
+
export function buildResiliencePolicy(): IPolicy {
|
|
76
|
+
// Retry only on ServerError and network errors — never ClientError (4xx).
|
|
77
|
+
const retryPolicy = retry(handleWhen((err) => !(err instanceof ClientError)), {
|
|
78
|
+
maxAttempts: 3,
|
|
79
|
+
backoff: new ExponentialBackoff({
|
|
80
|
+
initialDelay: 1_000, // 1 s
|
|
81
|
+
maxDelay: 30_000, // 30 s cap
|
|
82
|
+
exponent: 2,
|
|
83
|
+
random: true, // 50 % jitter
|
|
84
|
+
}),
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
// CB observes the final result of the whole retry sequence.
|
|
88
|
+
const cbPolicy = circuitBreaker(handleWhen((err) => !(err instanceof ClientError)), {
|
|
89
|
+
halfOpenAfter: 5_000,
|
|
90
|
+
breaker: new SamplingBreaker({
|
|
91
|
+
threshold: 0.5, // open at 50 % failure rate
|
|
92
|
+
duration: 30_000, // 30 s sampling window
|
|
93
|
+
minimumRps: 10, // minimum calls before evaluating
|
|
94
|
+
}),
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
// CB outer, retry inner
|
|
98
|
+
return wrap(cbPolicy, retryPolicy)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** Call an external service with the resilience policy applied. */
|
|
102
|
+
const policy = buildResiliencePolicy()
|
|
103
|
+
|
|
104
|
+
export function callWithResilience<T>(fn: () => Promise<T>): Promise<T> {
|
|
105
|
+
return policy.execute(fn)
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Usage:
|
|
109
|
+
// const data = await callWithResilience(async () => {
|
|
110
|
+
// const response = await fetch(url, { signal: AbortSignal.timeout(5_000) })
|
|
111
|
+
// if (response.status >= 400 && response.status < 500) {
|
|
112
|
+
// throw new ClientError(response.status, `Client error: ${response.status}`)
|
|
113
|
+
// }
|
|
114
|
+
// if (!response.ok) {
|
|
115
|
+
// throw new ServerError(response.status, `Server error: ${response.status}`)
|
|
116
|
+
// }
|
|
117
|
+
// return response.json() as Promise<T>
|
|
118
|
+
// })
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
<% } %>
|
|
122
|
+
<% if (language === 'java' || language === 'multi') { %>
|
|
123
|
+
### Java — Resilience4j
|
|
124
|
+
|
|
125
|
+
```xml
|
|
126
|
+
<!-- pom.xml -->
|
|
127
|
+
<dependency>
|
|
128
|
+
<groupId>io.github.resilience4j</groupId>
|
|
129
|
+
<artifactId>resilience4j-spring-boot3</artifactId>
|
|
130
|
+
</dependency>
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
```yaml
|
|
134
|
+
# application.yml
|
|
135
|
+
resilience4j:
|
|
136
|
+
circuitbreaker:
|
|
137
|
+
instances:
|
|
138
|
+
default:
|
|
139
|
+
failure-rate-threshold: 50 # open at 50 % failure rate
|
|
140
|
+
minimum-number-of-calls: 10 # min calls before evaluating
|
|
141
|
+
wait-duration-in-open-state: 10s
|
|
142
|
+
permitted-number-of-calls-in-half-open-state: 3
|
|
143
|
+
sliding-window-type: COUNT_BASED
|
|
144
|
+
sliding-window-size: 20
|
|
145
|
+
retry:
|
|
146
|
+
instances:
|
|
147
|
+
default:
|
|
148
|
+
max-attempts: 3
|
|
149
|
+
wait-duration: 1s
|
|
150
|
+
enable-exponential-backoff: true
|
|
151
|
+
exponential-backoff-multiplier: 2
|
|
152
|
+
exponential-max-wait-duration: 30s # 30 s cap
|
|
153
|
+
retry-exception-predicate: com.example.resilience.ServerErrorPredicate
|
|
154
|
+
ignore-exceptions:
|
|
155
|
+
- com.example.resilience.ClientErrorException # never retry 4xx
|
|
156
|
+
timelimiter:
|
|
157
|
+
instances:
|
|
158
|
+
default:
|
|
159
|
+
timeout-duration: 5s # per-attempt timeout
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
```java
|
|
163
|
+
// ServerErrorPredicate.java
|
|
164
|
+
package com.example.resilience;
|
|
165
|
+
|
|
166
|
+
import java.util.function.Predicate;
|
|
167
|
+
|
|
168
|
+
/** Retry only on server errors and connectivity failures — never 4xx. */
|
|
169
|
+
public class ServerErrorPredicate implements Predicate<Throwable> {
|
|
170
|
+
@Override
|
|
171
|
+
public boolean test(Throwable t) {
|
|
172
|
+
if (t instanceof ClientErrorException) return false; // 4xx — never retry
|
|
173
|
+
if (t instanceof ServerErrorException) return true; // 5xx — retry
|
|
174
|
+
if (t instanceof java.net.ConnectException) return true;
|
|
175
|
+
if (t instanceof java.net.SocketTimeoutException) return true;
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**Critical:** annotate your service method with CB outer, retry inner:
|
|
182
|
+
|
|
183
|
+
```java
|
|
184
|
+
@CircuitBreaker(name = "default", fallbackMethod = "fallback")
|
|
185
|
+
@Retry(name = "default")
|
|
186
|
+
@TimeLimiter(name = "default")
|
|
187
|
+
public CompletableFuture<Response> callExternalService(Request request) {
|
|
188
|
+
// ...
|
|
189
|
+
}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
<% } %>
|
|
193
|
+
<% if (language !== 'typescript' && language !== 'java' && language !== 'multi') { %>
|
|
194
|
+
### Your stack — <%= language %>
|
|
195
|
+
|
|
196
|
+
Language-specific circuit-breaker and retry libraries are not prescribed here for `<%= language %>`.
|
|
197
|
+
Consult your stack's resilience library (e.g. tenacity for Python, go-resiliency for Go, or
|
|
198
|
+
a service-mesh policy). Apply the same defaults: 3 attempts, 1 s→30 s exponential+jitter,
|
|
199
|
+
never retry 4xx, CB at 50 % over 10 calls, CB outer-wraps-retry.
|
|
200
|
+
|
|
201
|
+
<% } %>
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## Retry / Backoff
|
|
206
|
+
|
|
207
|
+
**Rule:** retry `5xx` and connectivity failures only. **Never retry 4xx** — the client must fix
|
|
208
|
+
the request. Retrying 4xx amplifies load without any chance of success.
|
|
209
|
+
|
|
210
|
+
| Parameter | Value | Notes |
|
|
211
|
+
|-----------|-------|-------|
|
|
212
|
+
| Max attempts | 3 | Includes the initial attempt |
|
|
213
|
+
| Initial interval | 1 s | |
|
|
214
|
+
| Max interval | 30 s | Cap prevents unbounded wait |
|
|
215
|
+
| Multiplier | 2× | Exponential backoff |
|
|
216
|
+
| Jitter | 50 % | Prevents thundering-herd on simultaneous failures |
|
|
217
|
+
| Retryable | `5xx`, `ConnectException`, `SocketTimeoutException` | |
|
|
218
|
+
| Non-retryable | `4xx` | Surface immediately; do not retry |
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## Timeout Budget
|
|
223
|
+
|
|
224
|
+
**5 s per attempt** — not for the whole retry sequence. Total worst-case: `5 s × 3 = 15 s`,
|
|
225
|
+
plus backoff between retries (`1 s + 2 s = 3 s`), so ≈18 s maximum. Set your caller's timeout
|
|
226
|
+
to accommodate this if the call is synchronous and user-facing.
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## Rate Limiter
|
|
231
|
+
|
|
232
|
+
Token-bucket defaults: **100 req/s sustained, burst 20, keyed per client/tenant**.
|
|
233
|
+
|
|
234
|
+
Apply upstream (at the entry point, not the outbound adapter) to protect your service from
|
|
235
|
+
overload. If you are calling a third-party API, apply the rate limiter at the outbound adapter
|
|
236
|
+
keyed on the external service to stay within their quota.
|
|
237
|
+
|
|
238
|
+
<% if (language === 'typescript' || language === 'multi') { %>
|
|
239
|
+
```typescript
|
|
240
|
+
import { RateLimiterMemory } from 'rate-limiter-flexible'
|
|
241
|
+
|
|
242
|
+
const rateLimiter = new RateLimiterMemory({
|
|
243
|
+
points: 100, // 100 tokens
|
|
244
|
+
duration: 1, // per second
|
|
245
|
+
})
|
|
246
|
+
|
|
247
|
+
// Burst: allow 20 extra
|
|
248
|
+
const burstLimiter = new RateLimiterMemory({
|
|
249
|
+
points: 20,
|
|
250
|
+
duration: 1,
|
|
251
|
+
blockDuration: 0,
|
|
252
|
+
})
|
|
253
|
+
```
|
|
254
|
+
<% } %>
|
|
255
|
+
<% if (language === 'java' || language === 'multi') { %>
|
|
256
|
+
```yaml
|
|
257
|
+
# application.yml
|
|
258
|
+
resilience4j:
|
|
259
|
+
ratelimiter:
|
|
260
|
+
instances:
|
|
261
|
+
default:
|
|
262
|
+
limit-for-period: 100 # 100 req/s sustained
|
|
263
|
+
limit-refresh-period: 1s
|
|
264
|
+
timeout-duration: 0 # fail fast on exceed
|
|
265
|
+
```
|
|
266
|
+
<% } %>
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## External-call / Adapter Checklist
|
|
271
|
+
|
|
272
|
+
When adding a new external call or adapter, verify each item:
|
|
273
|
+
|
|
274
|
+
- [ ] **Isolated CB+retry instance per target** — one per external service/tenant, lazily created
|
|
275
|
+
and cached by key. Shared instances amplify blast radius across unrelated targets.
|
|
276
|
+
- [ ] **Config at instance creation** — values read once at construction time. Explicit cache
|
|
277
|
+
invalidation (restart or reload) required to pick up changes.
|
|
278
|
+
- [ ] **Test seam** — inject a configurable interval/delay function so integration tests can
|
|
279
|
+
use fast (0 ms) intervals without touching production configuration.
|
|
280
|
+
- [ ] **Graceful degradation** — invalid or missing config falls back to the defaults above,
|
|
281
|
+
not to an error or panic.
|
|
282
|
+
- [ ] **SSRF allowlist** — validate outbound URLs at dispatch time: require HTTPS, block
|
|
283
|
+
private RFC-1918 ranges, loopback (127.x, ::1), and link-local (169.254.x).
|
|
284
|
+
- [ ] **No secrets in logs** — sanitize URLs (strip query tokens), headers, and response bodies
|
|
285
|
+
before logging. Never log Authorization or X-Api-Key values.
|
|
286
|
+
- [ ] **At-least-once delivery** — retry semantics mean consumers must be idempotent. Document
|
|
287
|
+
this contract in the consumer's integration guide.
|
|
288
|
+
- [ ] **Dead-letter after max attempts** — route undeliverable messages to a DLQ or dead-letter
|
|
289
|
+
topic after exhausting retries. Do not silently drop.
|
|
290
|
+
- [ ] **Retry on 5xx only** — verify the retry predicate excludes 4xx explicitly. A broad
|
|
291
|
+
`catch(Exception)` retry predicate is a bug.
|
|
292
|
+
|
|
293
|
+
<% if (isL3Plus) { %>
|
|
294
|
+
|
|
295
|
+
---
|
|
296
|
+
|
|
297
|
+
## L3/L4 enforcement
|
|
298
|
+
|
|
299
|
+
At governance level `<%= governanceLevel %>` the following are hard requirements in addition to
|
|
300
|
+
the advisory defaults above:
|
|
301
|
+
|
|
302
|
+
- **Circuit-breaker metrics exported** — CB state (open/closed/half-open) + failure rate must
|
|
303
|
+
be observable via the service's metrics endpoint (Prometheus/Micrometer scrape target).
|
|
304
|
+
- **Retry count metric** — instrument retry attempts per target with a labelled counter.
|
|
305
|
+
- **Runbook linked** — each CB instance must have a corresponding runbook entry describing
|
|
306
|
+
the escalation path when it opens and remains open beyond the alert threshold.
|
|
307
|
+
- **Load-test evidence** — the retry+CB policy must be exercised under simulated failure
|
|
308
|
+
conditions (e.g. Toxiproxy/Chaos Monkey) and the CB-open event must appear in traces.
|
|
309
|
+
|
|
310
|
+
<% } %>
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# <%= projectName %> — generated by arbiter (skipIfExists: never overwritten)
|
|
2
|
+
# Add project-specific entries below.
|
|
3
|
+
|
|
4
|
+
# Dependencies
|
|
5
|
+
node_modules/
|
|
6
|
+
vendor/
|
|
7
|
+
|
|
8
|
+
# Build output
|
|
9
|
+
dist/
|
|
10
|
+
build/
|
|
11
|
+
target/
|
|
12
|
+
*.egg-info/
|
|
13
|
+
__pycache__/
|
|
14
|
+
*.pyc
|
|
15
|
+
|
|
16
|
+
# Test / coverage artifacts
|
|
17
|
+
coverage/
|
|
18
|
+
.nyc_output/
|
|
19
|
+
*.lcov
|
|
20
|
+
|
|
21
|
+
# jscpd duplication report (CANON-22 gate byproduct)
|
|
22
|
+
report/
|
|
23
|
+
|
|
24
|
+
# VitePress build temp output
|
|
25
|
+
website/.vitepress/.temp/
|
|
26
|
+
|
|
27
|
+
# Environment / secrets
|
|
28
|
+
.env
|
|
29
|
+
.env.local
|
|
30
|
+
.env.*.local
|
|
31
|
+
|
|
32
|
+
# Editor / OS
|
|
33
|
+
.DS_Store
|
|
34
|
+
Thumbs.db
|
|
35
|
+
*.swp
|
|
36
|
+
*.swo
|
|
37
|
+
|
|
38
|
+
# Arbiter evidence harness (local retention)
|
|
39
|
+
.evidence/
|
|
40
|
+
|
|
41
|
+
# Arbiter local runtime state.
|
|
42
|
+
# `/**` and not `/` (#2313): git cannot re-include a file whose PARENT DIRECTORY
|
|
43
|
+
# stays excluded, so a blanket `.arbiter/` makes every negation below dead text.
|
|
44
|
+
# The TDD evidence files are carved out because the L2 gate reads them from a
|
|
45
|
+
# FRESH CI checkout, and because the produced-here guard in
|
|
46
|
+
# scripts/check-tdd-evidence.mjs (#2307) diffs them against the merge-base — an
|
|
47
|
+
# untracked evidence file makes that guard permanently inert. Everything else
|
|
48
|
+
# under .arbiter/ is machine-local runtime state (plan run history, ship attempt
|
|
49
|
+
# counters, worktrees, private notes) and stays ignored.
|
|
50
|
+
.arbiter/**
|
|
51
|
+
!.arbiter/evidence/
|
|
52
|
+
!.arbiter/evidence/tdd/
|
|
53
|
+
!.arbiter/evidence/tdd/*.json
|
|
54
|
+
!.arbiter/evidence/journey/
|
|
55
|
+
!.arbiter/evidence/journey/*.json
|
|
56
|
+
.agents-dispatched
|
|
57
|
+
.claude/.task-*
|
|
58
|
+
.claude/.task/
|
|
59
|
+
.claude/plans/
|
|
60
|
+
|
|
61
|
+
# Arbiter backup turds (written by runtime; never commit)
|
|
62
|
+
*.arbiter-backup
|
|
63
|
+
.arbiter-generated.json.bak.*
|
|
64
|
+
<% /* #1407: stack-aware entries — GREENFIELD-PREVENTION ONLY.
|
|
65
|
+
generateEvidenceRetention renders this with skipIfExists:true, so an
|
|
66
|
+
EXISTING .gitignore is never rewritten. The extended repo-hygiene GATE
|
|
67
|
+
(scripts/check-no-tracked-artifacts.mjs) is the retroactive catch for
|
|
68
|
+
already-tracked artifacts; brownfield .gitignore-merge-on-update is OUT
|
|
69
|
+
of scope (see ADR-047 / follow-up). language is always present; guard
|
|
70
|
+
databaseEngine because it is optional in ProjectConfig (EJS with(locals)
|
|
71
|
+
would throw on a bare reference to an absent key). */ %>
|
|
72
|
+
<% if (language === 'go') { %>
|
|
73
|
+
# Go compiled binary (module-root, named after the project) (#1407)
|
|
74
|
+
/<%= projectName %>
|
|
75
|
+
<% } %><% if (language === 'rust') { %>
|
|
76
|
+
# Rust build output (#1407)
|
|
77
|
+
/target/
|
|
78
|
+
<% } %><% if (typeof databaseEngine !== 'undefined' && databaseEngine === 'sqlite') { %>
|
|
79
|
+
# SQLite data/state files — must never be committed (#1407, INV-129)
|
|
80
|
+
*.sqlite
|
|
81
|
+
*.sqlite3
|
|
82
|
+
*.db
|
|
83
|
+
*.db-shm
|
|
84
|
+
*.db-wal
|
|
85
|
+
<% } %>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<%# CODEOWNERS — auto-generated by arbiter %>
|
|
2
|
+
* @<%= githubOwner %>
|
|
3
|
+
<%# #1720 (gap 2a/2b): guards were literal === 'L2' || === 'L3' / === 'L3', silently
|
|
4
|
+
excluding L4 — L4 got the WEAKEST CODEOWNERS of all levels. isL2Plus/isL3Plus
|
|
5
|
+
(levelAtLeast SSOT, #1516) keep L4 a strict superset of L3. %>
|
|
6
|
+
<% if (isL2Plus) { %>
|
|
7
|
+
# Security-sensitive paths require owner approval
|
|
8
|
+
.github/workflows/ @<%= githubOwner %>
|
|
9
|
+
.githooks/ @<%= githubOwner %>
|
|
10
|
+
scripts/check-all.mjs @<%= githubOwner %>
|
|
11
|
+
AGENTS.md @<%= githubOwner %>
|
|
12
|
+
<% } %>
|
|
13
|
+
<% if (isL3Plus) { %>
|
|
14
|
+
# Governance and security documentation
|
|
15
|
+
docs/SECURITY/ @<%= githubOwner %>
|
|
16
|
+
docs/GOVERNANCE/ @<%= githubOwner %>
|
|
17
|
+
docs/SECURE_CODING_CHECKLIST.md @<%= githubOwner %>
|
|
18
|
+
<% } %>
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Contributing to <%= projectName %>
|
|
2
|
+
|
|
3
|
+
Thank you for considering contributing to **<%= projectName %>**.
|
|
4
|
+
|
|
5
|
+
## Getting Started
|
|
6
|
+
|
|
7
|
+
1. Fork the repository
|
|
8
|
+
2. Create a task branch: `git checkout -b task/#NNN-short-description`
|
|
9
|
+
3. Make your changes following the guidelines below
|
|
10
|
+
4. Run the quality gate: `<%= testCommand %>`
|
|
11
|
+
5. Commit with the [conventional format](#commit-format)
|
|
12
|
+
6. Open a Pull Request
|
|
13
|
+
|
|
14
|
+
## Branch Naming
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
task/#NNN-short-description
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Where `#NNN` is the GitHub issue number. No direct commits to `main`.
|
|
21
|
+
|
|
22
|
+
## Commit Format
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
type(scope): summary
|
|
26
|
+
|
|
27
|
+
- Detail of what changed
|
|
28
|
+
- Detail of what changed
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**Types:** `feat`, `fix`, `refactor`, `test`, `docs`, `chore`, `ci`
|
|
32
|
+
|
|
33
|
+
## Code Standards
|
|
34
|
+
|
|
35
|
+
See `AGENTS.md` for the full coding standards, invariants, and testing policy.
|
|
36
|
+
|
|
37
|
+
Key rules:
|
|
38
|
+
- All code must pass the quality gate before committing<% if (language === 'typescript') { %>
|
|
39
|
+
- No `any` types — use proper type annotations<% } %><% if (language === 'rust') { %>
|
|
40
|
+
- No `.unwrap()` — use proper error handling<% } %>
|
|
41
|
+
- No orphan TODOs — every `TODO` must reference a task ID (`TODO(#NNN)`)
|
|
42
|
+
- Tests required for new functionality
|
|
43
|
+
|
|
44
|
+
## Quality Gate
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
<%= testCommand %>
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
<% if (lintCommand) { %>**Lint:** `<%= lintCommand %>`
|
|
51
|
+
<% } %><% if (formatCommand) { %>**Format:** `<%= formatCommand %>`
|
|
52
|
+
<% } %>
|
|
53
|
+
## Pull Requests
|
|
54
|
+
|
|
55
|
+
- Fill out the PR template completely
|
|
56
|
+
- Link the related issue
|
|
57
|
+
- Ensure the gate passes in CI
|
|
58
|
+
- Request review from a code owner
|
|
59
|
+
|
|
60
|
+
## Questions?
|
|
61
|
+
|
|
62
|
+
Open a [discussion](https://github.com/<%= githubOwner %>/<%= githubRepo %>/discussions) or reach out to the maintainers.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Reporting a Vulnerability
|
|
4
|
+
|
|
5
|
+
**Do not open a public GitHub issue for security vulnerabilities.**
|
|
6
|
+
|
|
7
|
+
Report security issues privately to the maintainer:
|
|
8
|
+
- Email: (configure your contact email)
|
|
9
|
+
- Or use GitHub's private vulnerability reporting: Settings → Security → Advisories
|
|
10
|
+
|
|
11
|
+
## Scope
|
|
12
|
+
|
|
13
|
+
This policy applies to the `<%= projectName %>` codebase.
|
|
14
|
+
|
|
15
|
+
## Response Timeline
|
|
16
|
+
|
|
17
|
+
- Acknowledgment: within 48 hours
|
|
18
|
+
- Initial assessment: within 7 days
|
|
19
|
+
- Fix timeline: depends on severity (critical: 24-48h, high: 7 days, medium: 30 days)
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# Test Taxonomy — <%= projectName %>
|
|
2
|
+
|
|
3
|
+
<!-- arbiter-managed: test-pyramid-profile (INV-89) -->
|
|
4
|
+
<!-- Archetype: <%= archetype %> -->
|
|
5
|
+
|
|
6
|
+
This document defines the test pyramid for **<%= projectName %>**.
|
|
7
|
+
Each level maps to a CI stage in `ci.yml` and a check in `scripts/check-all.mjs`.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Pyramid Levels
|
|
12
|
+
|
|
13
|
+
| Level | Description | Tools |
|
|
14
|
+
|-------|-------------|-------|
|
|
15
|
+
<% for (const level of levels) { -%>
|
|
16
|
+
| **<%= level.name %>** | <%= level.description %> | `<%= level.tools %>` |
|
|
17
|
+
<% } %>
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Conventions
|
|
22
|
+
|
|
23
|
+
- **L1 tests** run on every commit (pre-commit hook via `scripts/check-all.mjs L1`).
|
|
24
|
+
- **L2+ tests** run on push/PR (`scripts/check-all.mjs L2`).
|
|
25
|
+
- Test files live next to the code they test (co-located) or in a top-level `tests/` directory.
|
|
26
|
+
- Every public function/method must have at least one test.
|
|
27
|
+
<% if (hasContainerIntegration) { %>
|
|
28
|
+
- Testcontainers are the preferred integration harness — no mocked DB connections in integration tests.
|
|
29
|
+
<% } %><% if (hasPropertyTests) { %>
|
|
30
|
+
- Property-based tests must cover all public API inputs. Use `fast-check` / `Hypothesis` / `proptest`.
|
|
31
|
+
<% } %><% if (hasE2ETests) { %>
|
|
32
|
+
- E2E tests run headless in CI (Playwright recommended).
|
|
33
|
+
<% } %>
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Test Type Codes
|
|
38
|
+
|
|
39
|
+
| Code | Name | Description |
|
|
40
|
+
|------|------|-------------|
|
|
41
|
+
| **UT** | Unit Test | Pure function / class isolation — no I/O, no DB (INV-26) |
|
|
42
|
+
| **IT** | Integration Test | Two or more real collaborators (DB, queue, cache) — Testcontainers where applicable |
|
|
43
|
+
| **AU** | API / Contract Unit | HTTP boundary — input validation, error contracts, OpenAPI parity (INV-47) |
|
|
44
|
+
| **ST** | System / E2E Test | Full stack — real infra, real browser (Playwright) where applicable |
|
|
45
|
+
| **SC** | Scenario / BDD Test | Gherkin scenarios — cross-module behavior from the user's perspective |
|
|
46
|
+
| **SN** | Snapshot Test | Golden-file / snapshot regressions — UI, serialisation, report output |
|
|
47
|
+
| **E2E** | End-to-End Test | Alias for ST; used when framing is user-journey centric |
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Universal Quality Dimensions
|
|
52
|
+
|
|
53
|
+
Every test level must address the applicable subset of the 17 universal dimensions below.
|
|
54
|
+
Primary codes indicate which test type most naturally covers each dimension.
|
|
55
|
+
|
|
56
|
+
| # | Dimension | Primary Code | INV Reference |
|
|
57
|
+
|---|-----------|-------------|---------------|
|
|
58
|
+
| 1 | Owner isolation — tenant/user data cannot bleed across boundaries | IT / AU | INV-19 |
|
|
59
|
+
| 2 | RBAC — role permissions enforced at every endpoint and query | AU / IT | INV-19 |
|
|
60
|
+
| 3 | Input validation — all public inputs validated; invalid inputs rejected with correct status | AU / UT | INV-47 |
|
|
61
|
+
| 4 | Error contracts — error codes, messages, and HTTP status are stable and documented | AU | INV-47 |
|
|
62
|
+
| 5 | OpenAPI parity — generated/written spec matches actual handler behaviour | AU | INV-47 |
|
|
63
|
+
| 6 | Pagination — list endpoints honour page/limit/cursor; no unbounded scans | AU / IT | INV-14 |
|
|
64
|
+
| 7 | Idempotency — mutating operations safe to retry (PUT / PATCH / DELETE) | AU / IT | INV-14 |
|
|
65
|
+
| 8 | Migration integrity — DB migrations are reversible and tested in CI | IT | INV-30 |
|
|
66
|
+
| 9 | Observability — structured logs emitted for all error paths; spans created for I/O | UT / IT | INV-17 |
|
|
67
|
+
| 10 | Perf / N+1 — no N+1 queries; latency budgets asserted in integration layer | IT | INV-14 |
|
|
68
|
+
| 11 | Failure recovery — circuit-breakers, retries, and fallbacks exercised | IT / ST | INV-17 |
|
|
69
|
+
| 12 | DTO roundtrip — serialise → deserialise identity holds for every public DTO | UT / AU | INV-47 |
|
|
70
|
+
| 13 | Entity–schema parity — ORM entity fields match DB column types | IT | INV-30 |
|
|
71
|
+
| 14 | Cross-module ref integrity — FK/ref constraints never violated in test fixtures | IT | INV-30 |
|
|
72
|
+
| 15 | Profile security — user profile data never returned to wrong owner | AU / IT | INV-19 |
|
|
73
|
+
| 16 | Backward compat — existing clients unaffected by new release (schema + API) | AU / ST | INV-47 |
|
|
74
|
+
| 17 | Contract test coverage — published consumer contracts verified per deploy | AU | INV-48 |
|
|
75
|
+
<% const _domainDims = (typeof domainDims !== 'undefined' && Array.isArray(domainDims)) ? domainDims : [] %><% if (_domainDims.length > 0) { %>
|
|
76
|
+
|
|
77
|
+
### Domain-Specific Dimensions
|
|
78
|
+
|
|
79
|
+
The following dimensions are project-specific (sourced from `arbiter.json` `taxonomy.domainDims[]`):
|
|
80
|
+
|
|
81
|
+
<% for (const dim of _domainDims) { %>- `<%= dim %>`
|
|
82
|
+
<% } %>
|
|
83
|
+
<% } %>
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Decision Matrix — Change Type → Required Dimensions
|
|
88
|
+
|
|
89
|
+
| Change Type | Mandatory Dimensions | Recommended Codes |
|
|
90
|
+
|-------------|----------------------|-------------------|
|
|
91
|
+
| New API endpoint | 1–5, 16 | AU + IT |
|
|
92
|
+
| New DB entity / migration | 8, 13, 14 | IT |
|
|
93
|
+
| Auth / permission change | 1, 2, 15 | AU + IT |
|
|
94
|
+
| New list / search endpoint | 6, 10 | AU + IT |
|
|
95
|
+
| Mutating endpoint (create/update/delete) | 7, 14 | AU + IT |
|
|
96
|
+
| New public DTO / schema | 4, 5, 12, 16 | AU + UT |
|
|
97
|
+
| External service integration | 11 | IT + ST |
|
|
98
|
+
| Background job / worker | 9, 11 | IT |
|
|
99
|
+
| UI feature | 3, 4 | SN + ST |
|
|
100
|
+
| Cross-module feature | 14, 15 | IT + SC |
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Canonical Paths — <%= projectName %>
|
|
2
|
+
|
|
3
|
+
**Purpose:** Aliasing registry for documents that have moved. Before reporting a broken link, check this file for the current location of the referenced document.
|
|
4
|
+
**Location:** `docs/METHOD/CANONICAL_PATHS.md`
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Aliases
|
|
9
|
+
|
|
10
|
+
| Old Path | Current Path | Moved Date |
|
|
11
|
+
|----------|--------------|------------|
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
When a document is moved or renamed:
|
|
18
|
+
|
|
19
|
+
1. Add a row to the Aliases table above: old path → new path + ISO date.
|
|
20
|
+
2. Do **not** remove the old entry until all references are updated.
|
|
21
|
+
3. Run `node scripts/check-doc-links.mjs` to verify no broken links remain after the redirect is added.
|
|
22
|
+
4. Run `node scripts/check-canonical-paths.mjs` to confirm the new path exists.
|
|
23
|
+
|
|
24
|
+
> Entries may be purged once all references are updated and the old path no longer appears in any document.
|