@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,116 @@
|
|
|
1
|
+
# Contract Integrity 5-Gate Suite — <%= projectName %>
|
|
2
|
+
|
|
3
|
+
> **Origin:** Policy template ported from `reference-impl/docs/FRAMEWORK/CONTRACT_INTEGRITY/*` (M-08, #716).
|
|
4
|
+
>
|
|
5
|
+
> **Distinct from Pact (M28):** Pact is consumer-driven contracts (the consumer dictates what the producer must satisfy). Contract Integrity is API surface stability + drift detection (the producer asserts its surface and detects when it changes). The two are complementary; use both for L3 surfaces.
|
|
6
|
+
>
|
|
7
|
+
> **Opt-in flags:** all under the `contract_integrity.gates.*` namespace (see §Configuration).
|
|
8
|
+
|
|
9
|
+
## The five gates
|
|
10
|
+
|
|
11
|
+
### Gate A — OpenAPI snapshot
|
|
12
|
+
|
|
13
|
+
**What:** snapshot the rendered OpenAPI document at build time. On every PR, compare the new snapshot against the committed baseline. Any non-additive change (removed endpoint, removed field, narrowed type, added required field) fails the gate.
|
|
14
|
+
|
|
15
|
+
**Why:** rejects accidental breaking changes to the public API surface. Additive changes pass automatically.
|
|
16
|
+
|
|
17
|
+
**Configuration:** `contract_integrity.gates.openapi_snapshot: true`
|
|
18
|
+
|
|
19
|
+
### Gate B — DTO parity
|
|
20
|
+
|
|
21
|
+
**What:** assert structural equivalence between the server's response DTOs and the client's generated types. Run on every PR; the gate fails when the server emits a field that the client cannot deserialise, or the client expects a field the server does not emit.
|
|
22
|
+
|
|
23
|
+
**Why:** prevents the "server-changed-but-client-not-regenerated" class of integration bug.
|
|
24
|
+
|
|
25
|
+
**Configuration:** `contract_integrity.gates.dto_parity: true`
|
|
26
|
+
|
|
27
|
+
### Gate C — Operation smoke (404 / 5xx)
|
|
28
|
+
|
|
29
|
+
**What:** for every declared endpoint, send a probe with intentionally malformed input. Assert the response is a documented error class (404 for missing resource, 422 for validation, 5xx for server error with structured body) — NOT an unhandled stack trace or empty 500.
|
|
30
|
+
|
|
31
|
+
**Why:** catches half-implemented endpoints that respond to the happy path but return undefined-behaviour on error paths.
|
|
32
|
+
|
|
33
|
+
**Configuration:** `contract_integrity.gates.operation_smoke: true`
|
|
34
|
+
|
|
35
|
+
### Gate D — Dead code
|
|
36
|
+
|
|
37
|
+
**What:** detect endpoints declared in the OpenAPI document but never reached by any test or call site in the codebase. Detect handlers in the codebase not referenced by the OpenAPI document. Either direction is a contract leak.
|
|
38
|
+
|
|
39
|
+
**Why:** dead endpoints become security debt (unauthenticated, untested code paths). Undeclared handlers leak surface that consumers cannot rely on.
|
|
40
|
+
|
|
41
|
+
**Configuration:** `contract_integrity.gates.dead_code: true`
|
|
42
|
+
|
|
43
|
+
### Gate E — Test hygiene
|
|
44
|
+
|
|
45
|
+
**What:** for every endpoint in the OpenAPI document, assert at least one test exists. The minimum test must cover the happy path + the documented error class (per gate C). Endpoints without tests fail this gate.
|
|
46
|
+
|
|
47
|
+
**Why:** the OpenAPI document is a contract; an untested contract is a wish.
|
|
48
|
+
|
|
49
|
+
**Configuration:** `contract_integrity.gates.test_hygiene: true`
|
|
50
|
+
|
|
51
|
+
## Configuration
|
|
52
|
+
|
|
53
|
+
```jsonc
|
|
54
|
+
{
|
|
55
|
+
"contract_integrity": {
|
|
56
|
+
"gates": {
|
|
57
|
+
"openapi_snapshot": true,
|
|
58
|
+
"dto_parity": true,
|
|
59
|
+
"operation_smoke": true,
|
|
60
|
+
"dead_code": true,
|
|
61
|
+
"test_hygiene": true,
|
|
62
|
+
},
|
|
63
|
+
"snapshot_path": "tests/fixtures/openapi-baseline.yaml",
|
|
64
|
+
"smoke_probe_timeout_ms": 5000,
|
|
65
|
+
},
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
All gates default to `false`. Enable per-gate as the surface stabilises. The recommended adoption order is **A → D → E → B → C**:
|
|
70
|
+
|
|
71
|
+
1. **A first** — cheapest signal, catches the most regressions
|
|
72
|
+
2. **D second** — surfaces dead code while the codebase is still small enough to clean up
|
|
73
|
+
3. **E third** — requires test infrastructure but produces durable coverage
|
|
74
|
+
4. **B fourth** — requires client-side codegen wiring
|
|
75
|
+
5. **C last** — requires a running server in CI
|
|
76
|
+
|
|
77
|
+
## What each gate does NOT do
|
|
78
|
+
|
|
79
|
+
- **Gate A** does not detect semantic changes (handler-behavior change with same API shape). Use Pact (M28) for consumer-driven semantic contracts.
|
|
80
|
+
- **Gate B** does not detect runtime type mismatches (e.g. server emits a value outside the declared enum). Add a separate runtime-validation step at the client boundary if needed.
|
|
81
|
+
- **Gate C** does not test correctness of error responses, only their existence + shape.
|
|
82
|
+
- **Gate D** has false-positive risk on dynamically-routed endpoints (e.g. dispatched via a switch table). Configure the per-project allowlist if needed.
|
|
83
|
+
- **Gate E** does not assess test quality — a single happy-path assertion satisfies the gate. Pair with mutation testing (M22) for quality signal.
|
|
84
|
+
|
|
85
|
+
## Distinct from Pact (M28)
|
|
86
|
+
|
|
87
|
+
| Property | Contract Integrity (M-08) | Pact (M28) |
|
|
88
|
+
| ----------------------- | ------------------------- | ---------------------------- |
|
|
89
|
+
| Direction | producer asserts surface | consumer dictates surface |
|
|
90
|
+
| Run trigger | every PR | consumer-side first, then broker |
|
|
91
|
+
| Catches | API surface drift | semantic contract drift |
|
|
92
|
+
| Tooling | language-specific schema diff | Pact framework |
|
|
93
|
+
| Output | pass/fail per gate | verification report |
|
|
94
|
+
|
|
95
|
+
**Use both** for L3 surfaces: M-08 catches accidental breaking changes; M28 catches handler-semantics drift.
|
|
96
|
+
|
|
97
|
+
## Per-stack implementation
|
|
98
|
+
|
|
99
|
+
The 5 gates are mechanical and per-stack. Each gate ships as a separate script under `scripts/contract-integrity/` in the consumer project. The detailed implementations are tracked as **follow-up issues** (one per gate), not bundled into this template port.
|
|
100
|
+
|
|
101
|
+
## Source
|
|
102
|
+
|
|
103
|
+
#716 (M-08 — Contract Integrity 5-gate suite).
|
|
104
|
+
|
|
105
|
+
## Follow-up issues
|
|
106
|
+
|
|
107
|
+
The 5 gate scripts and the generator that wires them are tracked separately so each can be reviewed independently:
|
|
108
|
+
|
|
109
|
+
- Gate A implementation
|
|
110
|
+
- Gate B implementation
|
|
111
|
+
- Gate C implementation
|
|
112
|
+
- Gate D implementation
|
|
113
|
+
- Gate E implementation
|
|
114
|
+
- `src/generators/contract-integrity.ts` that emits the per-stack script bundles
|
|
115
|
+
|
|
116
|
+
This template provides the **policy and configuration surface**; the scripts come in subsequent PRs.
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Enterprise Compliance Baseline — <%= projectName %>
|
|
2
|
+
|
|
3
|
+
> **Origin:** Structural skeleton ported from reference-impl/docs/SYSTEM/ENTERPRISE_COMPLIANCE.md (M-03, #711). The reference document is 6308 LOC; this template ports the **structure**, not the content. Fill in each section with project-specific evidence.
|
|
4
|
+
|
|
5
|
+
## How to use this baseline
|
|
6
|
+
|
|
7
|
+
1. This file is generated by `arbiter init` when `compliance.enterprise_baseline: true` is set in `arbiter.json` (see §Opt-in below).
|
|
8
|
+
2. Each section below has a marker `[FILL: ...]` indicating what your team must provide. Empty markers fail the L2 compliance gate.
|
|
9
|
+
3. Update this baseline whenever scope changes (new processing activity, new region, new third-party processor). Diffs are reviewed in the same PR as the change.
|
|
10
|
+
|
|
11
|
+
## Opt-in flag
|
|
12
|
+
|
|
13
|
+
```jsonc
|
|
14
|
+
{
|
|
15
|
+
"compliance": {
|
|
16
|
+
"enterprise_baseline": true,
|
|
17
|
+
},
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 1. Data Protection (GDPR)
|
|
24
|
+
|
|
25
|
+
### 1.1 Legal basis register
|
|
26
|
+
|
|
27
|
+
[FILL: For each processing activity, list the GDPR Art.6 legal basis (consent / contract / legal-obligation / vital-interest / public-task / legitimate-interest). Include the data category and the retention period.]
|
|
28
|
+
|
|
29
|
+
### 1.2 Right to erasure (Art. 17)
|
|
30
|
+
|
|
31
|
+
[FILL: Document the cascade for an erasure request. The cascade must enumerate every system that holds the user's data, including third-party processors. Use the M-05 erasure-runbook template (see governance/gdpr-erasure-runbook.md once #713 lands) for the orchestration detail. Pay special attention to systems where the user record is DISABLED rather than DELETED — those are incomplete Art.17 compliance.]
|
|
32
|
+
|
|
33
|
+
### 1.3 Security of processing (Art. 32)
|
|
34
|
+
|
|
35
|
+
[FILL: For each system in the legal-basis register, document the technical and organisational measures. Minimum surface: encryption at rest + in transit, access logging, key-rotation cadence, incident-response runbook reference, breach-notification path.]
|
|
36
|
+
|
|
37
|
+
### 1.4 Data subject access (Art. 15)
|
|
38
|
+
|
|
39
|
+
[FILL: SLA for access requests + the system that exports the data + format(s) supported. Include the human reviewer step before release.]
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 2. NIS2
|
|
44
|
+
|
|
45
|
+
### 2.1 Supply-chain register
|
|
46
|
+
|
|
47
|
+
[FILL: Every third-party that processes or transmits in-scope data. For each: scope of data, contract reference, last security review date, fallback supplier if any.]
|
|
48
|
+
|
|
49
|
+
### 2.2 Incident classification + reporting timeline
|
|
50
|
+
|
|
51
|
+
[FILL: NIS2 requires initial notification within 24h of a significant incident. Document the classification matrix (severity vs business impact) and the on-call escalation path that produces that notification.]
|
|
52
|
+
|
|
53
|
+
### 2.3 Risk management framework reference
|
|
54
|
+
|
|
55
|
+
[FILL: Point to your project's risk register (template at governance/risk-register.md) and the assessment cadence. NIS2 expects an annual review at minimum.]
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## 3. ISO 27001 (lite mapping)
|
|
60
|
+
|
|
61
|
+
### 3.1 Annex A controls in scope
|
|
62
|
+
|
|
63
|
+
[FILL: List the Annex A controls your project applies. Common in-scope subset for SaaS: A.5.* (information security policies), A.6.* (organisation), A.8.* (asset management), A.9.* (access control), A.12.* (operations), A.14.* (development).]
|
|
64
|
+
|
|
65
|
+
### 3.2 Statement of Applicability
|
|
66
|
+
|
|
67
|
+
[FILL: For each in-scope control, declare implemented / planned / not-applicable. Justify any "not-applicable" — the auditor's first question.]
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## 4. OWASP Top 10 alignment
|
|
72
|
+
|
|
73
|
+
[FILL: For each OWASP Top 10 (current year) category, document the project's mitigation. Use a one-row-per-category table; empty rows fail the L2 compliance gate.]
|
|
74
|
+
|
|
75
|
+
| OWASP | Mitigation |
|
|
76
|
+
| ------- | ------------------------------------------- |
|
|
77
|
+
| A01: Broken access control | [FILL] |
|
|
78
|
+
| A02: Cryptographic failures | [FILL] |
|
|
79
|
+
| A03: Injection | [FILL] |
|
|
80
|
+
| A04: Insecure design | [FILL] |
|
|
81
|
+
| A05: Security misconfiguration | [FILL] |
|
|
82
|
+
| A06: Vulnerable components | [FILL] |
|
|
83
|
+
| A07: Authentication failures | [FILL] |
|
|
84
|
+
| A08: Software/data integrity | [FILL] |
|
|
85
|
+
| A09: Logging + monitoring | [FILL] |
|
|
86
|
+
| A10: SSRF | [FILL] |
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## 5. Review cadence
|
|
91
|
+
|
|
92
|
+
| Trigger | Section(s) to re-review |
|
|
93
|
+
| ------------------------------------------------------ | ----------------------- |
|
|
94
|
+
| New processing activity | 1.1, 1.2 |
|
|
95
|
+
| New third-party processor | 2.1 |
|
|
96
|
+
| New deployment region | 1.3, 2.1 |
|
|
97
|
+
| Annual ISO surveillance audit | 3.* (all) |
|
|
98
|
+
| OWASP Top 10 update (typically every 3 years) | 4 (all) |
|
|
99
|
+
| Quarterly | All sections — sanity check |
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## What this baseline does NOT include
|
|
104
|
+
|
|
105
|
+
- **Vendor lock-in advice.** Per never-import policy, this template avoids prescribing specific vendors (KMS, SIEM, etc.). Reference any-vendor patterns; pick your own.
|
|
106
|
+
- **Country-specific data residency rules.** The reference-impl is EU-centric. If your project ships in additional jurisdictions, extend §1.* with the additional regimes (CCPA, LGPD, etc.) — do not edit this file's structure, append new top-level sections.
|
|
107
|
+
- **Per-control implementation evidence.** Evidence belongs in `.evidence/compliance/` with SHA pins; this baseline is the index, not the artifact store.
|
|
108
|
+
|
|
109
|
+
## Source issue
|
|
110
|
+
|
|
111
|
+
#711 (M-03 — Enterprise compliance baseline template).
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Evidence Retention Policy — <%= projectName %>
|
|
2
|
+
|
|
3
|
+
This document defines how task-completion evidence is stored, rotated, and pruned.
|
|
4
|
+
|
|
5
|
+
## Retention Mode
|
|
6
|
+
|
|
7
|
+
**Mode:** `<%= evidenceRetention.mode %>`
|
|
8
|
+
<% if (evidenceRetention.mode === 'local-last-N') { %>
|
|
9
|
+
Evidence runs are stored under `.evidence/` and the last **<%= evidenceRetention.count ?? 5 %>** runs are kept automatically.
|
|
10
|
+
<% } else if (evidenceRetention.mode === 'external-bucket') { %>
|
|
11
|
+
Evidence runs are uploaded to an external bucket: `<%= evidenceRetention.bucketUrl %>`.
|
|
12
|
+
Local copies are pruned after upload. Ensure bucket credentials are configured.
|
|
13
|
+
<% } %>
|
|
14
|
+
|
|
15
|
+
## Scripts
|
|
16
|
+
|
|
17
|
+
| Script | Purpose | When to run |
|
|
18
|
+
| --- | --- | --- |
|
|
19
|
+
| `scripts/evidence-rotate.mjs` | Rotation — keeps last N runs, removes older ones | Manual tool — run as needed by maintainer, or wire into CI/a hook if you want automatic rotation |
|
|
20
|
+
| `scripts/evidence-prune.mjs` | Manual maintenance — supports --keep-last, --keep-days, --dry-run | Run as needed by maintainer |
|
|
21
|
+
|
|
22
|
+
## Usage
|
|
23
|
+
|
|
24
|
+
```sh
|
|
25
|
+
# Dry-run: see what would be removed without deleting
|
|
26
|
+
node scripts/evidence-prune.mjs --dry-run --keep-last=10
|
|
27
|
+
|
|
28
|
+
# Prune runs older than 30 days, skip ACK prompt
|
|
29
|
+
node scripts/evidence-prune.mjs --keep-days=30 --yes
|
|
30
|
+
|
|
31
|
+
# Keep only last 3 runs
|
|
32
|
+
node scripts/evidence-prune.mjs --keep-last=3 --yes
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Location
|
|
36
|
+
|
|
37
|
+
Evidence runs are stored in `.evidence/run-NNNN/` directories (gitignored).
|
|
38
|
+
Each run directory contains the SHA-pinned output files listed in `evidence-files.json`.
|
|
39
|
+
|
|
40
|
+
## Governance
|
|
41
|
+
|
|
42
|
+
This policy is enforced by the done-evidence harness (`scripts/done-evidence.mjs`).
|
|
43
|
+
Runs without valid SHA pins fail the L2 gate.
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# GDPR Art.17 Erasure Cascade Runbook — <%= projectName %>
|
|
2
|
+
|
|
3
|
+
> **Origin:** Ported from reference-impl `docs/SYSTEM/PRIVACY_MODEL.md:86-120` (M-05, #713). Includes the Keycloak DELETE fix discovered during the reference-impl audit (the reference implementation only DISABLED the Keycloak record — incomplete Art.17 compliance).
|
|
4
|
+
>
|
|
5
|
+
> **Opt-in flag:** `compliance.gdpr_erasure`
|
|
6
|
+
|
|
7
|
+
## When this runbook fires
|
|
8
|
+
|
|
9
|
+
Trigger: a verified GDPR Art.17 erasure request reaches the data-controller team for the data subject identified by `<subject_id>`.
|
|
10
|
+
|
|
11
|
+
**Verification step (pre-runbook):** identity proof + scope confirmation (which data subjects + which processing activities). This runbook does NOT include the identity-verification step — that belongs in your access-control SOP, not in the cascade.
|
|
12
|
+
|
|
13
|
+
## 14-step cascade
|
|
14
|
+
|
|
15
|
+
Run **in order**. Each step has an exit assertion that must pass before the next runs. If any assertion fails, escalate to data-protection officer + halt the cascade.
|
|
16
|
+
|
|
17
|
+
### 1. Lock subject record
|
|
18
|
+
|
|
19
|
+
- Set `users.locked_for_erasure_at = NOW()` on the primary user table.
|
|
20
|
+
- **Assertion:** no new writes to any subject-owned row after this timestamp.
|
|
21
|
+
|
|
22
|
+
### 2. Snapshot audit trail
|
|
23
|
+
|
|
24
|
+
- Export the subject's audit log to `.evidence/erasure/<subject_id>/<request_id>/audit.jsonl` for retention purposes (Art.17 §3(b) allows retention for legal claims; the evidence is the legal basis for retention).
|
|
25
|
+
- **Assertion:** snapshot file exists, SHA pinned in evidence manifest.
|
|
26
|
+
|
|
27
|
+
### 3. Anonymise application database
|
|
28
|
+
|
|
29
|
+
- For each table with subject-owned rows: replace PII fields with deterministic-anonymised tokens.
|
|
30
|
+
- **Assertion:** `SELECT COUNT(*) FROM <table> WHERE <pii_column> LIKE '%<subject_email_pattern>%'` returns 0 across all tables.
|
|
31
|
+
|
|
32
|
+
### 4. Anonymise read replicas
|
|
33
|
+
|
|
34
|
+
- Wait for replication lag → 0 OR force-replicate the anonymisation transaction.
|
|
35
|
+
- **Assertion:** same query as step 3 across each replica returns 0.
|
|
36
|
+
|
|
37
|
+
### 5. Delete cached artifacts
|
|
38
|
+
|
|
39
|
+
- Purge cached responses, generated PDFs, exported CSVs, profile thumbnails.
|
|
40
|
+
- **Assertion:** cache-key search for `subject_id` returns no entries.
|
|
41
|
+
|
|
42
|
+
### 6. Delete object-storage artifacts
|
|
43
|
+
|
|
44
|
+
- For each object-storage bucket: list objects tagged with `subject_id`, delete each.
|
|
45
|
+
- **Assertion:** `aws s3 ls --recursive s3://<bucket>/<subject_prefix>` (or equivalent) returns empty.
|
|
46
|
+
|
|
47
|
+
### 7. Invalidate active sessions
|
|
48
|
+
|
|
49
|
+
- Revoke refresh tokens + invalidate session cookies.
|
|
50
|
+
- **Assertion:** sessions table has no rows where `user_id = <subject_id>` AND `expires_at > NOW()`.
|
|
51
|
+
|
|
52
|
+
### 8. Delete from analytics warehouse
|
|
53
|
+
|
|
54
|
+
- Run anonymisation/deletion DAG on the warehouse.
|
|
55
|
+
- **Assertion:** warehouse query for `subject_id` returns 0 rows in the next nightly recompute.
|
|
56
|
+
|
|
57
|
+
### 9. Delete from search index
|
|
58
|
+
|
|
59
|
+
- Issue index-level delete for `subject_id`.
|
|
60
|
+
- **Assertion:** search-by-PII-fragment returns no hits.
|
|
61
|
+
|
|
62
|
+
### 10. Notify third-party processors
|
|
63
|
+
|
|
64
|
+
- For each processor in `compliance.third_party_processors[]`: issue the processor-specific erasure call (API, support ticket, secure email).
|
|
65
|
+
- **Assertion:** acknowledgement received from each processor (SLA: 14 days).
|
|
66
|
+
|
|
67
|
+
### 11. Delete from email provider
|
|
68
|
+
|
|
69
|
+
- Issue contact-delete via email-provider API.
|
|
70
|
+
- **Assertion:** API response confirms deletion.
|
|
71
|
+
|
|
72
|
+
### 12. **DELETE Keycloak record (NOT disable) — M-05 audit fix**
|
|
73
|
+
|
|
74
|
+
- Issue `DELETE /admin/realms/<realm>/users/<keycloak_id>` to fully remove the identity-provider record.
|
|
75
|
+
- **Assertion:** GET of the same path returns 404.
|
|
76
|
+
- **Why this step exists:** The reference-impl audit discovered Keycloak users were only DISABLED (`enabled=false`). A disabled user still exists in the directory, which is incomplete Art.17 compliance — the user's identifier is still recoverable. DELETE is the correct primitive.
|
|
77
|
+
|
|
78
|
+
### 13. Delete from backup retention
|
|
79
|
+
|
|
80
|
+
- Backups containing the subject's data CANNOT be re-anonymised retroactively. Document the backup retention window in the user-facing erasure confirmation: "Your data will be fully removed from backups by `<NOW + retention_window>`".
|
|
81
|
+
- **Assertion:** the dated promise appears in the user-facing confirmation email; the deletion-from-backup is scheduled in your backup-rotation job.
|
|
82
|
+
|
|
83
|
+
### 14. Final user-facing confirmation
|
|
84
|
+
|
|
85
|
+
- Send a signed confirmation to the subject containing: request ID, completion timestamp, backup-purge date, list of third-party processors notified, evidence-manifest reference (or instructions to request it).
|
|
86
|
+
- **Assertion:** confirmation send is logged in `.evidence/erasure/<subject_id>/<request_id>/confirmation.json` with a delivery receipt.
|
|
87
|
+
|
|
88
|
+
## Multi-stack hook stubs
|
|
89
|
+
|
|
90
|
+
The cascade above is the **policy**. The mechanical execution is per-stack. Below are the recommended hook stubs to wire into each stack's data-mutation layer:
|
|
91
|
+
|
|
92
|
+
### TS / Express
|
|
93
|
+
|
|
94
|
+
```ts
|
|
95
|
+
// src/erasure/cascade.ts
|
|
96
|
+
import { lockSubjectRecord } from './step1.js'
|
|
97
|
+
import { snapshotAuditTrail } from './step2.js'
|
|
98
|
+
// … 12 more imports
|
|
99
|
+
|
|
100
|
+
export async function runErasureCascade(subjectId: string, requestId: string): Promise<void> {
|
|
101
|
+
await lockSubjectRecord(subjectId)
|
|
102
|
+
await snapshotAuditTrail(subjectId, requestId)
|
|
103
|
+
// … step 3-14
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Java / Spring
|
|
108
|
+
|
|
109
|
+
```java
|
|
110
|
+
// src/main/java/com/example/erasure/CascadeService.java
|
|
111
|
+
@Service
|
|
112
|
+
public class CascadeService {
|
|
113
|
+
public void run(String subjectId, String requestId) {
|
|
114
|
+
lockSubjectRecord(subjectId);
|
|
115
|
+
snapshotAuditTrail(subjectId, requestId);
|
|
116
|
+
// … step 3-14
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Go / chi
|
|
122
|
+
|
|
123
|
+
```go
|
|
124
|
+
// internal/erasure/cascade.go
|
|
125
|
+
package erasure
|
|
126
|
+
|
|
127
|
+
func RunCascade(ctx context.Context, subjectID string, requestID string) error {
|
|
128
|
+
if err := lockSubjectRecord(ctx, subjectID); err != nil { return err }
|
|
129
|
+
if err := snapshotAuditTrail(ctx, subjectID, requestID); err != nil { return err }
|
|
130
|
+
// … step 3-14
|
|
131
|
+
return nil
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Anti-patterns (do NOT do)
|
|
136
|
+
|
|
137
|
+
- **Soft-delete-only.** A `deleted_at` timestamp is NOT erasure. The PII must be physically replaced or removed.
|
|
138
|
+
- **Disable instead of delete.** This is the Keycloak fix above. Applies anywhere an identity provider has both verbs.
|
|
139
|
+
- **Skip backups.** Backups containing PII are still controlled by Art.17. You cannot anonymise retroactively, but you MUST document the retention window and honor it.
|
|
140
|
+
- **Skip third-party processors.** Your DPA with the processor is itself the legal basis for Art.17 transmission; failing to forward the erasure breaks both.
|
|
141
|
+
- **Treat erasure as a one-step DB delete.** A multi-system data-architecture needs a multi-step cascade, sequenced with exit assertions.
|
|
142
|
+
|
|
143
|
+
## Evidence
|
|
144
|
+
|
|
145
|
+
Every cascade run produces an evidence bundle at `.evidence/erasure/<subject_id>/<request_id>/`:
|
|
146
|
+
|
|
147
|
+
| File | Content |
|
|
148
|
+
| ----------------------- | ------------------------------------------------------------- |
|
|
149
|
+
| `audit.jsonl` | Pre-erasure audit-trail snapshot (step 2) |
|
|
150
|
+
| `cascade-log.jsonl` | One entry per step: step number, started_at, completed_at, assertion result |
|
|
151
|
+
| `confirmation.json` | User-facing confirmation send result (step 14) |
|
|
152
|
+
| `processor-acks/` | Acknowledgements from each third-party processor (step 10) |
|
|
153
|
+
| `backup-purge-date.txt` | Date by which the subject's data will be purged from backups |
|
|
154
|
+
|
|
155
|
+
The bundle is retained for the legal claims window (typically 6 years EU, 10 years some jurisdictions). Configure via `compliance.erasure_evidence_retention_years`.
|
|
156
|
+
|
|
157
|
+
## What this runbook does NOT cover
|
|
158
|
+
|
|
159
|
+
- **Right to object (Art.21)** — different request, different flow. Track separately.
|
|
160
|
+
- **Right to data portability (Art.20)** — export, not delete.
|
|
161
|
+
- **Cross-controller orchestration** — if your project is a co-controller, the orchestration with the other controller is contract-specific.
|
|
162
|
+
|
|
163
|
+
## Source
|
|
164
|
+
|
|
165
|
+
#713 (M-05 — GDPR Art.17 erasure cascade runbook).
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# QA-Audit Phases — <%= projectName %>
|
|
2
|
+
|
|
3
|
+
> **Origin:** Format ported from `reference-impl/qa-audit/PHASE*.md` (15 narrative reports, 4951 LOC). The reference reports are CERIMONIA — one-shot, no rerun. **M-A1 ports the FORMAT, not the content.** Each phase is defined as a JSON schema + rerun command. The MD report is the OUTPUT of a rerun, not the audit itself.
|
|
4
|
+
>
|
|
5
|
+
> **Opt-in flag:** `governance.qa_audit_phases`
|
|
6
|
+
|
|
7
|
+
## Philosophy
|
|
8
|
+
|
|
9
|
+
Audits that cannot be rerun become ceremony. The reference-impl QA audit produced 15 narrative reports dated 2026-02-12 — readable, useful, but **frozen in time**. Three weeks later, the codebase had drifted and the reports were stale. A month later, they were lies.
|
|
10
|
+
|
|
11
|
+
This template ports the **format** of those reports as a schema + rerun command per phase. The output MD is the artifact of the most recent rerun; the audit is reproducible at any point.
|
|
12
|
+
|
|
13
|
+
## Phase schema
|
|
14
|
+
|
|
15
|
+
Each phase is defined by a JSON document at `.arbiter/qa-audit/phase-<NN>.json`:
|
|
16
|
+
|
|
17
|
+
```jsonc
|
|
18
|
+
{
|
|
19
|
+
"phase": "01",
|
|
20
|
+
"title": "Static analysis baseline",
|
|
21
|
+
"rerun": "node scripts/qa-audit/phase-01.mjs",
|
|
22
|
+
"owner": "core-team",
|
|
23
|
+
"cadence": "weekly",
|
|
24
|
+
"output_path": "docs/QA_AUDIT/phase-01-latest.md",
|
|
25
|
+
"schema_version": 1,
|
|
26
|
+
"checks": [
|
|
27
|
+
{
|
|
28
|
+
"id": "lint-clean",
|
|
29
|
+
"command": "npm run lint",
|
|
30
|
+
"expect_exit_code": 0,
|
|
31
|
+
"rationale": "no lint warnings on main",
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"id": "no-circular-deps",
|
|
35
|
+
"command": "npx madge --circular --extensions ts,tsx,js,jsx src/",
|
|
36
|
+
"expect_exit_code": 0,
|
|
37
|
+
"rationale": "circular deps regress maintainability",
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
"severity_thresholds": {
|
|
41
|
+
"errors_max": 0,
|
|
42
|
+
"warnings_max": 10,
|
|
43
|
+
},
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Default phases
|
|
48
|
+
|
|
49
|
+
The template ships **6 default phases**. Each is opt-in via `governance.qa_audit_phases.phases[]` and can be customised per project. Use these as starting scaffolding.
|
|
50
|
+
|
|
51
|
+
### Phase 01 — Static analysis baseline
|
|
52
|
+
|
|
53
|
+
Lint clean, no circular deps, type-checks pass. Weekly cadence.
|
|
54
|
+
|
|
55
|
+
### Phase 02 — Test coverage + quality
|
|
56
|
+
|
|
57
|
+
Coverage thresholds met, mutation score ≥ 60%, no `.skip`/`.only` left in committed tests. Weekly cadence.
|
|
58
|
+
|
|
59
|
+
### Phase 03 — Architecture conformance
|
|
60
|
+
|
|
61
|
+
Module boundaries respected (depcruiser rules), public-API surface bounded by ratchet, no new ADR-violations. Bi-weekly cadence.
|
|
62
|
+
|
|
63
|
+
### Phase 04 — Security baseline
|
|
64
|
+
|
|
65
|
+
Dependency audit clean (or all surviving CVEs documented in suppressions with expiry), secrets-scan clean, IAM least-privilege spot-check. Weekly cadence.
|
|
66
|
+
|
|
67
|
+
### Phase 05 — Performance + resource baseline
|
|
68
|
+
|
|
69
|
+
Bundle size within budget, p95 latency on smoke benchmark within baseline, no memory regression on long-running test. Monthly cadence.
|
|
70
|
+
|
|
71
|
+
### Phase 06 — Documentation freshness
|
|
72
|
+
|
|
73
|
+
Public APIs documented (JSDoc/TSDoc coverage), changelog up-to-date, ADR index complete (no orphan ADRs), README install steps still work. Monthly cadence.
|
|
74
|
+
|
|
75
|
+
## Rerun command
|
|
76
|
+
|
|
77
|
+
```sh
|
|
78
|
+
arbiter audit run [--phase NN] [--all] [--json]
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
- `--phase 03` reruns one phase
|
|
82
|
+
- `--all` reruns every defined phase in order
|
|
83
|
+
- `--json` emits machine-readable output instead of the rendered MD
|
|
84
|
+
|
|
85
|
+
Each rerun:
|
|
86
|
+
|
|
87
|
+
1. Loads the phase JSON
|
|
88
|
+
2. Runs each `checks[].command`, captures exit code + stdout + stderr
|
|
89
|
+
3. Compares against `severity_thresholds`
|
|
90
|
+
4. Writes the rendered MD report to `output_path`
|
|
91
|
+
5. Exits 0 on PASS, 1 on threshold breach, 2 on schema error
|
|
92
|
+
|
|
93
|
+
The rendered MD is meant to be committed (so historical reports are findable). The schema JSON is the source of truth — when audit logic changes, edit the schema, not the rendered MD.
|
|
94
|
+
|
|
95
|
+
## Cadence enforcement
|
|
96
|
+
|
|
97
|
+
A separate CI job (cron schedule) reruns each phase at its declared cadence. If the latest output MD is older than the cadence window, the cadence job fails. This catches the failure mode where audits are defined but never rerun.
|
|
98
|
+
|
|
99
|
+
Suggested cron mapping:
|
|
100
|
+
|
|
101
|
+
| Cadence | Cron schedule (UTC) |
|
|
102
|
+
| ---------- | ------------------- |
|
|
103
|
+
| daily | `0 3 * * *` |
|
|
104
|
+
| weekly | `0 4 * * 1` |
|
|
105
|
+
| bi-weekly | `0 4 1,15 * *` |
|
|
106
|
+
| monthly | `0 5 1 * *` |
|
|
107
|
+
|
|
108
|
+
## Anti-patterns (NI-4 — never-import: ceremony)
|
|
109
|
+
|
|
110
|
+
- **Phase whose rerun is "ask team X"** — that is ceremony, not audit. Every phase must have a mechanical rerun.
|
|
111
|
+
- **Phase that always passes** — either the thresholds are wrong or the phase is decorative. Tune thresholds quarterly.
|
|
112
|
+
- **Phase whose output is never read** — pair each phase with a documented escalation path on failure. If failure is consequence-free, the audit is theatre.
|
|
113
|
+
- **Ad-hoc phases that aren't in the schema** — out-of-band audits don't get cadence enforcement. Promote them to schema-defined phases or accept they're one-offs.
|
|
114
|
+
|
|
115
|
+
## What this template does NOT include
|
|
116
|
+
|
|
117
|
+
- **CI cron job templates per cadence.** Generated per stack in the corresponding `.github/workflows/qa-audit-*.yml` files. Wired by the (forthcoming) `src/generators/qa-audit.ts` generator.
|
|
118
|
+
- **The arbiter audit run CLI command itself (planned, not yet shipped).** Stubbed in this PR's audit doc; full implementation tracked as a follow-up.
|
|
119
|
+
- **Default phase content beyond the 6 scaffolds above.** Project-specific phases live in your project's `.arbiter/qa-audit/phase-NN.json` files.
|
|
120
|
+
|
|
121
|
+
## Source
|
|
122
|
+
|
|
123
|
+
#727 (M-A1 — Audit-as-Code).
|
|
124
|
+
|
|
125
|
+
## See also
|
|
126
|
+
|
|
127
|
+
- `docs/SYSTEM/CANON.md` — process rules
|
|
128
|
+
- `docs/audits/` — already-rerun audits using this format (the audit docs in this repo)
|
|
129
|
+
- NI-4 (never-import: ceremony) — the rule this template enforces
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Risk Assessment Template — <%= projectName %>
|
|
2
|
+
|
|
3
|
+
<!-- arbiter-managed: risk-assessment-template (#712) -->
|
|
4
|
+
|
|
5
|
+
> Use this template for each new risk before adding a row to `RISK_REGISTER.md`.
|
|
6
|
+
> ISO 27001:2022 §6.1.2 — P×I (Probability × Impact) scoring.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Risk Identification
|
|
11
|
+
|
|
12
|
+
| Field | Value |
|
|
13
|
+
| -------------- | ------------------------------------------ |
|
|
14
|
+
| **Risk ID** | R-XXX _(assign next sequential ID)_ |
|
|
15
|
+
| **Date** | YYYY-MM-DD |
|
|
16
|
+
| **Author** | _Name / team_ |
|
|
17
|
+
| **Category** | Confidentiality / Integrity / Availability |
|
|
18
|
+
|
|
19
|
+
### Threat description
|
|
20
|
+
|
|
21
|
+
_Describe the threat: what could go wrong, who/what is the threat actor?_
|
|
22
|
+
|
|
23
|
+
### Asset at risk
|
|
24
|
+
|
|
25
|
+
_Which data, system, or process is affected?_
|
|
26
|
+
|
|
27
|
+
### Vulnerability / root cause
|
|
28
|
+
|
|
29
|
+
_What weakness makes this threat exploitable?_
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## P×I Scoring
|
|
34
|
+
|
|
35
|
+
### Probability (1–4)
|
|
36
|
+
|
|
37
|
+
| Score | Label | Criteria |
|
|
38
|
+
| ----- | --------------- | ----------------------------------------------- |
|
|
39
|
+
| 1 | Unlikely | Rare; requires exceptional circumstances |
|
|
40
|
+
| 2 | Possible | Could occur; has happened in similar contexts |
|
|
41
|
+
| 3 | Likely | Expected to occur at some point |
|
|
42
|
+
| 4 | Almost Certain | Will occur; seen frequently in this domain |
|
|
43
|
+
|
|
44
|
+
**Selected Probability:** \_\_ / Rationale: _..._
|
|
45
|
+
|
|
46
|
+
### Impact (1–4)
|
|
47
|
+
|
|
48
|
+
| Score | Label | Criteria |
|
|
49
|
+
| ----- | -------- | ---------------------------------------------------------------- |
|
|
50
|
+
| 1 | Low | Minimal disruption; no data exposure; quickly recoverable |
|
|
51
|
+
| 2 | Medium | Partial service disruption; limited data exposure |
|
|
52
|
+
| 3 | High | Significant outage; potential regulatory impact or data breach |
|
|
53
|
+
| 4 | Critical | Full service down; major data breach; legal / reputational damage |
|
|
54
|
+
|
|
55
|
+
**Selected Impact:** \_\_ / Rationale: _..._
|
|
56
|
+
|
|
57
|
+
### Score
|
|
58
|
+
|
|
59
|
+
**Score = Probability × Impact = \_\_ × \_\_ = \_\_**
|
|
60
|
+
|
|
61
|
+
| Score | Tier | Response SLA |
|
|
62
|
+
| ----- | -------- | --------------------------------------------- |
|
|
63
|
+
| ≤ 4 | Low | Monitor; review at next quarterly cycle |
|
|
64
|
+
| 5–8 | Medium | Mitigate within 90 days; add to backlog |
|
|
65
|
+
| 9–12 | High | Mitigate within 30 days; notify security lead |
|
|
66
|
+
| > 12 | Critical | Immediate action; escalate to management |
|
|
67
|
+
|
|
68
|
+
**Tier:** \_\_
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Mitigation
|
|
73
|
+
|
|
74
|
+
### Treatment option
|
|
75
|
+
|
|
76
|
+
- [ ] **Mitigate** — implement controls to reduce probability or impact
|
|
77
|
+
- [ ] **Accept** — formally accept residual risk (document business justification)
|
|
78
|
+
- [ ] **Transfer** — shift risk to third party (insurance, contract)
|
|
79
|
+
- [ ] **Avoid** — change design or process to eliminate the risk
|
|
80
|
+
|
|
81
|
+
### Mitigation plan
|
|
82
|
+
|
|
83
|
+
_Describe the specific controls or changes to implement._
|
|
84
|
+
|
|
85
|
+
| Control | Type (preventive / detective / corrective) | Owner | Due date | Status |
|
|
86
|
+
| --------------------- | ------------------------------------------ | ----- | -------- | ------ |
|
|
87
|
+
| _Control 1_ | _Type_ | TBD | TBD | Open |
|
|
88
|
+
|
|
89
|
+
### Residual risk (post-mitigation)
|
|
90
|
+
|
|
91
|
+
| Field | Value |
|
|
92
|
+
| ------------------------ | ----- |
|
|
93
|
+
| Residual Probability | \_\_ |
|
|
94
|
+
| Residual Impact | \_\_ |
|
|
95
|
+
| **Residual Score** | \_\_ |
|
|
96
|
+
| **Residual Tier** | \_\_ |
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Approval
|
|
101
|
+
|
|
102
|
+
| Role | Name | Date | Signature |
|
|
103
|
+
| ---------------- | ---- | ---- | --------- |
|
|
104
|
+
| Risk owner | TBD | TBD | — |
|
|
105
|
+
| Security lead | TBD | TBD | — |
|