@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.
Files changed (989) hide show
  1. package/CHANGELOG.md +713 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +31 -0
  4. package/PRIVACY.md +111 -0
  5. package/README.md +237 -0
  6. package/THIRD_PARTY_LICENSES.md +472 -0
  7. package/dist/.src-manifest.json +1 -0
  8. package/dist/capabilities/host-probe.js +3 -0
  9. package/dist/cli.d.ts +2 -0
  10. package/dist/cli.js +87 -0
  11. package/dist/commands/adopt-policy.js +3 -0
  12. package/dist/commands/configure-interactive.js +3 -0
  13. package/dist/commands/configure.js +5 -0
  14. package/dist/commands/cross-model-review.js +3 -0
  15. package/dist/commands/diff.js +20 -0
  16. package/dist/commands/doc-set.js +3 -0
  17. package/dist/commands/doctor/clean.js +2 -0
  18. package/dist/commands/doctor/fail-open-census.js +12 -0
  19. package/dist/commands/doctor/health.js +11 -0
  20. package/dist/commands/doctor/prove-gates.js +13 -0
  21. package/dist/commands/doctor/recover-lock.js +12 -0
  22. package/dist/commands/doctor/repair-state.js +6 -0
  23. package/dist/commands/doctor/tool-pin-extract.js +4 -0
  24. package/dist/commands/doctor/tool-pins.js +9 -0
  25. package/dist/commands/doctor-interactive.js +2 -0
  26. package/dist/commands/doctor.js +2 -0
  27. package/dist/commands/explain.js +19 -0
  28. package/dist/commands/gate-exec.js +4 -0
  29. package/dist/commands/gold-audit.js +14 -0
  30. package/dist/commands/graph.js +5 -0
  31. package/dist/commands/init/build-arbiter-config.js +1 -0
  32. package/dist/commands/init/generate.js +42 -0
  33. package/dist/commands/init/github-setup.js +5 -0
  34. package/dist/commands/init/maturity-gates.js +10 -0
  35. package/dist/commands/init/resolve-config.js +3 -0
  36. package/dist/commands/init/toolchain.js +10 -0
  37. package/dist/commands/init/types.js +1 -0
  38. package/dist/commands/init.js +17 -0
  39. package/dist/commands/method-interactive.js +4 -0
  40. package/dist/commands/method.js +11 -0
  41. package/dist/commands/obsidian.js +2 -0
  42. package/dist/commands/plugin.js +8 -0
  43. package/dist/commands/pr-merged.js +2 -0
  44. package/dist/commands/retire-policy.js +3 -0
  45. package/dist/commands/review-diff.js +3 -0
  46. package/dist/commands/settings.js +7 -0
  47. package/dist/commands/ship-config.js +2 -0
  48. package/dist/commands/ship-profile.js +2 -0
  49. package/dist/commands/ship-review.js +1 -0
  50. package/dist/commands/ship-tier.js +2 -0
  51. package/dist/commands/ship-train.js +2 -0
  52. package/dist/commands/task-mark.js +2 -0
  53. package/dist/commands/task-note.js +3 -0
  54. package/dist/commands/task-record-red.js +2 -0
  55. package/dist/commands/task-record-tech-debt.js +4 -0
  56. package/dist/commands/task-ship.js +3 -0
  57. package/dist/commands/task-state.js +6 -0
  58. package/dist/commands/task.js +59 -0
  59. package/dist/commands/update.js +60 -0
  60. package/dist/commands/upgrade-level-interactive.js +2 -0
  61. package/dist/commands/upgrade-level.js +7 -0
  62. package/dist/commands/verify-plan.js +8 -0
  63. package/dist/commands/verify-tdd.js +2 -0
  64. package/dist/commands/verify.js +7 -0
  65. package/dist/commands/wizard/coherence.js +1 -0
  66. package/dist/commands/worktree-prune.js +4 -0
  67. package/dist/commands/worktree.js +39 -0
  68. package/dist/compatibility/cross-language-matrix.json +540 -0
  69. package/dist/compatibility/index.d.ts +4 -0
  70. package/dist/compatibility/index.js +2 -0
  71. package/dist/compatibility/matcher.js +1 -0
  72. package/dist/compatibility/matrix.json +27 -0
  73. package/dist/compatibility/parsers.d.ts +38 -0
  74. package/dist/compatibility/parsers.js +1 -0
  75. package/dist/compatibility/probe.d.ts +41 -0
  76. package/dist/compatibility/probe.js +4 -0
  77. package/dist/compatibility/report.js +2 -0
  78. package/dist/compatibility/schema.d.ts +80 -0
  79. package/dist/compatibility/schema.js +1 -0
  80. package/dist/compatibility/skills-matrix.json +98 -0
  81. package/dist/compatibility/skills-validator.d.ts +30 -0
  82. package/dist/compatibility/skills-validator.js +4 -0
  83. package/dist/compatibility/tooling-proposals.json +5 -0
  84. package/dist/config/arbiter-ignore.js +3 -0
  85. package/dist/config/collaboration-mode-defaults.js +1 -0
  86. package/dist/config/diff.js +1 -0
  87. package/dist/config/env-overrides.js +3 -0
  88. package/dist/config/env-registry.js +2 -0
  89. package/dist/config/levels.js +1 -0
  90. package/dist/config/migrations/index.js +2 -0
  91. package/dist/config/migrations/v0-to-v1.js +2 -0
  92. package/dist/config/migrations/v1-to-v2.js +2 -0
  93. package/dist/config/migrations/v2-to-v3.js +2 -0
  94. package/dist/config/migrations/v3-to-v4.js +2 -0
  95. package/dist/config/override-resolver.js +2 -0
  96. package/dist/config/resolve-project-config.js +2 -0
  97. package/dist/config/resolve-project-name.js +2 -0
  98. package/dist/config/schema.d.ts +480 -0
  99. package/dist/config/schema.js +1 -0
  100. package/dist/config/test-pyramid-profiles.js +1 -0
  101. package/dist/config/thresholds.js +2 -0
  102. package/dist/conformance/dimensions.js +3 -0
  103. package/dist/conformance/engine.js +7 -0
  104. package/dist/conformance/gate-proofs.js +4 -0
  105. package/dist/conformance/shared.js +2 -0
  106. package/dist/detectors/axis.js +1 -0
  107. package/dist/detectors/build.js +2 -0
  108. package/dist/detectors/existing.js +2 -0
  109. package/dist/detectors/external-model.js +2 -0
  110. package/dist/detectors/framework.js +2 -0
  111. package/dist/detectors/git.js +11 -0
  112. package/dist/detectors/github.js +2 -0
  113. package/dist/detectors/lanes.js +5 -0
  114. package/dist/detectors/language-hooks.js +117 -0
  115. package/dist/detectors/language.js +2 -0
  116. package/dist/detectors/package-manager.js +2 -0
  117. package/dist/detectors/package.js +2 -0
  118. package/dist/detectors/scaffold-wiring.js +2 -0
  119. package/dist/detectors/workflow-collision.js +4 -0
  120. package/dist/evidence/gate-binding.js +4 -0
  121. package/dist/evidence/git-checks.js +3 -0
  122. package/dist/evidence/load.js +2 -0
  123. package/dist/evidence/provenance.js +2 -0
  124. package/dist/evidence/summary.js +2 -0
  125. package/dist/evidence/tdd-reexecute.js +2 -0
  126. package/dist/evidence/tdd.js +4 -0
  127. package/dist/experimental/index.js +2 -0
  128. package/dist/experimental/parse-argv.js +2 -0
  129. package/dist/experimental/registry.js +2 -0
  130. package/dist/generators/agents-claude.js +2 -0
  131. package/dist/generators/agents-md.js +2 -0
  132. package/dist/generators/anti-drift-validators.js +3 -0
  133. package/dist/generators/anti-proforma.js +2 -0
  134. package/dist/generators/api-e2e.js +2 -0
  135. package/dist/generators/api-middleware.js +2 -0
  136. package/dist/generators/archunit.js +2 -0
  137. package/dist/generators/audit-toolchain.js +2 -0
  138. package/dist/generators/auth.js +2 -0
  139. package/dist/generators/behavioral-tests.js +2 -0
  140. package/dist/generators/boundaries.js +2 -0
  141. package/dist/generators/check-all.js +2 -0
  142. package/dist/generators/check-stack-conformity.js +2 -0
  143. package/dist/generators/ci-five-lane.js +2 -0
  144. package/dist/generators/ci-tier.js +2 -0
  145. package/dist/generators/claude.js +3 -0
  146. package/dist/generators/codex-hooks.js +2 -0
  147. package/dist/generators/codex-known-limitations.js +2 -0
  148. package/dist/generators/codex.js +15 -0
  149. package/dist/generators/commit-footer.js +2 -0
  150. package/dist/generators/compliance-menu.js +2 -0
  151. package/dist/generators/compliance.js +2 -0
  152. package/dist/generators/conformance.js +2 -0
  153. package/dist/generators/contract-testing.js +2 -0
  154. package/dist/generators/coverage.js +2 -0
  155. package/dist/generators/debt-gates.js +24 -0
  156. package/dist/generators/debt-ratchet.js +2 -0
  157. package/dist/generators/derived-class.js +2 -0
  158. package/dist/generators/doc-set.js +4 -0
  159. package/dist/generators/docs.js +2 -0
  160. package/dist/generators/duplication.js +2 -0
  161. package/dist/generators/e2e-constitution.js +2 -0
  162. package/dist/generators/env-template.js +2 -0
  163. package/dist/generators/evidence-retention.js +2 -0
  164. package/dist/generators/feature-matrix.js +2 -0
  165. package/dist/generators/frontend-governance.js +2 -0
  166. package/dist/generators/frontend-quality.js +2 -0
  167. package/dist/generators/gap.js +2 -0
  168. package/dist/generators/gdpr.js +2 -0
  169. package/dist/generators/githooks.js +2 -0
  170. package/dist/generators/github-setup.js +2 -0
  171. package/dist/generators/github.js +2 -0
  172. package/dist/generators/gitignore.js +2 -0
  173. package/dist/generators/global-invariants.js +3 -0
  174. package/dist/generators/go-boundaries.js +2 -0
  175. package/dist/generators/gold-kit.js +2 -0
  176. package/dist/generators/infra.js +2 -0
  177. package/dist/generators/integration-testing.js +7 -0
  178. package/dist/generators/iso27001.js +2 -0
  179. package/dist/generators/iso9001.js +2 -0
  180. package/dist/generators/labels.js +2 -0
  181. package/dist/generators/local-wrapper.js +2 -0
  182. package/dist/generators/modulith.js +2 -0
  183. package/dist/generators/mutation.js +2 -0
  184. package/dist/generators/observability.js +2 -0
  185. package/dist/generators/operations.js +2 -0
  186. package/dist/generators/perf-k6.js +2 -0
  187. package/dist/generators/pharma.js +2 -0
  188. package/dist/generators/playwright-python.js +2 -0
  189. package/dist/generators/playwright-ts.js +2 -0
  190. package/dist/generators/pr-tooling.js +2 -0
  191. package/dist/generators/python-boundaries.js +2 -0
  192. package/dist/generators/quality.js +2 -0
  193. package/dist/generators/registry.js +2 -0
  194. package/dist/generators/regulated.js +2 -0
  195. package/dist/generators/resilience.js +2 -0
  196. package/dist/generators/risk-register.js +2 -0
  197. package/dist/generators/root.js +2 -0
  198. package/dist/generators/rust-boundaries.js +2 -0
  199. package/dist/generators/safety-class.js +2 -0
  200. package/dist/generators/security.js +2 -0
  201. package/dist/generators/seed.js +2 -0
  202. package/dist/generators/self-validation.js +2 -0
  203. package/dist/generators/ship-driver.js +2 -0
  204. package/dist/generators/skill-names.json +17 -0
  205. package/dist/generators/skills.js +2 -0
  206. package/dist/generators/smoke-journeys.js +2 -0
  207. package/dist/generators/solo-exception.js +2 -0
  208. package/dist/generators/ssot.js +2 -0
  209. package/dist/generators/stride-enforcement.js +2 -0
  210. package/dist/generators/suppressions.js +2 -0
  211. package/dist/generators/test-pyramid-manifest.js +3 -0
  212. package/dist/generators/test-taxonomy.js +2 -0
  213. package/dist/generators/wiki.js +2 -0
  214. package/dist/github/branch-protection.js +2 -0
  215. package/dist/github/classify-gh-error.js +2 -0
  216. package/dist/github/labels.js +2 -0
  217. package/dist/github/project-board.js +2 -0
  218. package/dist/graph/builders/adr.js +4 -0
  219. package/dist/graph/builders/ast.js +3 -0
  220. package/dist/graph/builders/canon.js +2 -0
  221. package/dist/graph/builders/evidence.js +2 -0
  222. package/dist/graph/builders/inv.js +1 -0
  223. package/dist/graph/builders/req.js +3 -0
  224. package/dist/graph/builders/test-nodes.js +3 -0
  225. package/dist/graph/builders/utils.js +2 -0
  226. package/dist/graph/load.js +2 -0
  227. package/dist/graph/model.js +2 -0
  228. package/dist/graph/query.js +3 -0
  229. package/dist/graph/store.js +1 -0
  230. package/dist/i18n/en.json +293 -0
  231. package/dist/i18n/index.js +4 -0
  232. package/dist/i18n/types.js +2 -0
  233. package/dist/integrations/companions.js +2 -0
  234. package/dist/integrations/external-review.js +10 -0
  235. package/dist/integrations/plugin-schema.js +2 -0
  236. package/dist/integrations/skill-detector.js +7 -0
  237. package/dist/integrations/skills-matrix.js +2 -0
  238. package/dist/integrations/types.d.ts +23 -0
  239. package/dist/integrations/types.js +2 -0
  240. package/dist/internal/cli-deprecation-registry.js +2 -0
  241. package/dist/internal/deprecate.js +3 -0
  242. package/dist/internal/experimental-warn.js +3 -0
  243. package/dist/invariants/catalog.d.ts +2 -0
  244. package/dist/invariants/catalog.js +1 -0
  245. package/dist/invariants/filter.d.ts +28 -0
  246. package/dist/invariants/filter.js +1 -0
  247. package/dist/invariants/index.d.ts +4 -0
  248. package/dist/invariants/index.js +2 -0
  249. package/dist/invariants/tiers.js +1 -0
  250. package/dist/invariants/types.d.ts +1 -0
  251. package/dist/invariants/types.js +1 -0
  252. package/dist/kit/applicability.js +3 -0
  253. package/dist/kit/audit-report.js +3 -0
  254. package/dist/kit/brownfield-detect.js +4 -0
  255. package/dist/kit/canonical-mapping.json +1 -0
  256. package/dist/kit/catalog.js +2 -0
  257. package/dist/kit/catalog.json +1 -0
  258. package/dist/kit/derived.json +1 -0
  259. package/dist/kit/emit-issues.js +8 -0
  260. package/dist/kit/measure.js +5 -0
  261. package/dist/kit/redaction.js +3 -0
  262. package/dist/kit/schema.js +2 -0
  263. package/dist/kit/taxonomy.js +2 -0
  264. package/dist/kit/thresholds.d.ts +12 -0
  265. package/dist/kit/thresholds.js +2 -0
  266. package/dist/kit/wave-engine.js +1 -0
  267. package/dist/recipes/loader.js +6 -0
  268. package/dist/recipes/schema.js +2 -0
  269. package/dist/risk/classifier.js +2 -0
  270. package/dist/risk/sha-check.js +2 -0
  271. package/dist/state/backups.js +2 -0
  272. package/dist/state/envelope.js +2 -0
  273. package/dist/state/generated-manifest.js +3 -0
  274. package/dist/state/manifest-key.js +2 -0
  275. package/dist/state/migrations/index.js +1 -0
  276. package/dist/state/migrations/v0-to-v1.js +2 -0
  277. package/dist/state/retired-renders.js +2 -0
  278. package/dist/templates/.nvmrc.ejs +1 -0
  279. package/dist/templates/HANDOFF.template.md +45 -0
  280. package/dist/templates/__tests__/contract/error-shape.contract.test.ts.ejs +47 -0
  281. package/dist/templates/agents-md/AGENTS.md.ejs +517 -0
  282. package/dist/templates/api-e2e/README.md.ejs +33 -0
  283. package/dist/templates/api-e2e/go-httptest.go.ejs +43 -0
  284. package/dist/templates/api-e2e/java-restassured.java.ejs +28 -0
  285. package/dist/templates/api-e2e/kotlin-restassured.kt.ejs +30 -0
  286. package/dist/templates/api-e2e/manifest.json.ejs +8 -0
  287. package/dist/templates/api-e2e/postman.collection.json.ejs +30 -0
  288. package/dist/templates/api-e2e/python-httpx.py.ejs +17 -0
  289. package/dist/templates/api-e2e/run.sh.ejs +61 -0
  290. package/dist/templates/api-e2e/ts-supertest.test.ts.ejs +18 -0
  291. package/dist/templates/archunit/AntiCyclicTest.java.ejs +29 -0
  292. package/dist/templates/archunit/AntiProformaExempt.java.ejs +35 -0
  293. package/dist/templates/archunit/AntiProformaTest.java.ejs +104 -0
  294. package/dist/templates/archunit/ArchitectureTest.java.ejs +87 -0
  295. package/dist/templates/archunit/DependencyFlowTest.java.ejs +55 -0
  296. package/dist/templates/archunit/DomainPurityTest.java.ejs +47 -0
  297. package/dist/templates/archunit/NamingConventionsTest.java.ejs +54 -0
  298. package/dist/templates/archunit/NoH2ArchTest.java.ejs +30 -0
  299. package/dist/templates/archunit/NoMockMvcTest.java.ejs +71 -0
  300. package/dist/templates/archunit/PortsIndependenceTest.java.ejs +55 -0
  301. package/dist/templates/archunit/RestAssuredArchTest.java.ejs +32 -0
  302. package/dist/templates/archunit/RestAssuredBaseIT.java.ejs +66 -0
  303. package/dist/templates/archunit/TestCoverageArchTest.java.ejs +29 -0
  304. package/dist/templates/archunit/arch-test-deps-maven.md.ejs +42 -0
  305. package/dist/templates/archunit/arch-test-deps.gradle.ejs +14 -0
  306. package/dist/templates/audit/gdpr/check-gdpr-controls.mjs.ejs +102 -0
  307. package/dist/templates/audit/gdpr/controls-to-gates.md.ejs +42 -0
  308. package/dist/templates/audit/gdpr/data-flow-map.md.ejs +30 -0
  309. package/dist/templates/audit/gdpr/dpia.md.ejs +45 -0
  310. package/dist/templates/audit/generic/audit-gate-rules.md.ejs +24 -0
  311. package/dist/templates/audit/generic/audit-trail-policy.md.ejs +38 -0
  312. package/dist/templates/audit/iso27001/iso27001-controls-gate-map.md.ejs +60 -0
  313. package/dist/templates/auth/setup.md.ejs +661 -0
  314. package/dist/templates/behavioral-tests/ExampleBehavioralTest.java.ejs +67 -0
  315. package/dist/templates/behavioral-tests/TESTING_POLICY.md.ejs +116 -0
  316. package/dist/templates/behavioral-tests/bdd/ExampleBddIT.java.ejs +19 -0
  317. package/dist/templates/behavioral-tests/bdd/ExampleSteps.java.ejs +61 -0
  318. package/dist/templates/behavioral-tests/bdd/example.feature.ejs +14 -0
  319. package/dist/templates/behavioral-tests/bdd/example.steps.ts.ejs +37 -0
  320. package/dist/templates/behavioral-tests/bdd/example_bdd_test.rs.ejs +64 -0
  321. package/dist/templates/behavioral-tests/bdd/example_test.go.ejs +80 -0
  322. package/dist/templates/behavioral-tests/bdd/test_example_bdd.py.ejs +47 -0
  323. package/dist/templates/behavioral-tests/eslint-playwright.json.ejs +10 -0
  324. package/dist/templates/behavioral-tests/eslint.config.playwright.mjs.ejs +29 -0
  325. package/dist/templates/behavioral-tests/example.behavioral.test.ts.ejs +47 -0
  326. package/dist/templates/behavioral-tests/example_behavioral_test.go.ejs +51 -0
  327. package/dist/templates/behavioral-tests/example_behavioral_test.rs.ejs +47 -0
  328. package/dist/templates/behavioral-tests/test_example_behavioral.py.ejs +40 -0
  329. package/dist/templates/boundaries/.eslintrc-boundaries.cjs.ejs +81 -0
  330. package/dist/templates/boundaries/.eslintrc-frontend-spa.cjs.ejs +79 -0
  331. package/dist/templates/boundaries/.importlinter.ejs +48 -0
  332. package/dist/templates/boundaries/check-boundaries-go.mjs.ejs +94 -0
  333. package/dist/templates/boundaries/check-boundaries-python.mjs.ejs +118 -0
  334. package/dist/templates/boundaries/check-boundaries-rust.mjs.ejs +111 -0
  335. package/dist/templates/boundaries/check-boundaries.mjs.ejs +34 -0
  336. package/dist/templates/boundaries/clippy.toml.ejs +50 -0
  337. package/dist/templates/boundaries/deny.toml.ejs +56 -0
  338. package/dist/templates/boundaries/eslint.config.boundaries.mjs.ejs +112 -0
  339. package/dist/templates/boundaries/eslint.config.frontend-spa.mjs.ejs +93 -0
  340. package/dist/templates/boundaries/golangci-boundaries.yml.ejs +70 -0
  341. package/dist/templates/boundaries/ruff-boundaries.toml.ejs +32 -0
  342. package/dist/templates/claude/CLAUDE.md.ejs +78 -0
  343. package/dist/templates/claude/agents/agent-write-classes.json +30 -0
  344. package/dist/templates/claude/agents/bridge-reviewer.md.ejs +68 -0
  345. package/dist/templates/claude/agents/codebase-scanner.md.ejs +69 -0
  346. package/dist/templates/claude/agents/context-checker.md.ejs +73 -0
  347. package/dist/templates/claude/agents/red-team.md.ejs +134 -0
  348. package/dist/templates/claude/commands/close-gold-gap.md.ejs +43 -0
  349. package/dist/templates/claude/commands/drain.md.ejs +81 -0
  350. package/dist/templates/claude/commands/gold-audit.md.ejs +43 -0
  351. package/dist/templates/claude/commands/impact.md.ejs +39 -0
  352. package/dist/templates/claude/commands/levelup.md.ejs +61 -0
  353. package/dist/templates/claude/commands/ship.md.ejs +902 -0
  354. package/dist/templates/claude/commands/tabletop.md.ejs +46 -0
  355. package/dist/templates/claude/commands/task.md.ejs +87 -0
  356. package/dist/templates/claude/commands/wt-close.md.ejs +58 -0
  357. package/dist/templates/claude/commands/wt-list.md.ejs +48 -0
  358. package/dist/templates/claude/commands/wt-open.md.ejs +61 -0
  359. package/dist/templates/claude/commands/wt-prune.md.ejs +38 -0
  360. package/dist/templates/claude/hooks/check-circular-deps.mjs.ejs +56 -0
  361. package/dist/templates/claude/hooks/check-no-orphan-todo.mjs.ejs +45 -0
  362. package/dist/templates/claude/hooks/check-no-pii.mjs.ejs +121 -0
  363. package/dist/templates/claude/hooks/check-no-placeholders.mjs.ejs +71 -0
  364. package/dist/templates/claude/hooks/check-no-skipped-tests.mjs +80 -0
  365. package/dist/templates/claude/hooks/check-no-unused-exports.mjs +62 -0
  366. package/dist/templates/claude/hooks/closer-mode-guard.mjs.ejs +102 -0
  367. package/dist/templates/claude/hooks/debug-state-on-failure.mjs.ejs +98 -0
  368. package/dist/templates/claude/hooks/enforce-gate-before-pr.mjs +142 -0
  369. package/dist/templates/claude/hooks/enforce-read-only.mjs +28 -0
  370. package/dist/templates/claude/hooks/exitplanmode-banner.mjs.ejs +43 -0
  371. package/dist/templates/claude/hooks/guard-done-evidence.mjs.ejs +85 -0
  372. package/dist/templates/claude/hooks/guard-task-completion.mjs.ejs +56 -0
  373. package/dist/templates/claude/hooks/hooks.mjs.ejs +127 -0
  374. package/dist/templates/claude/hooks/lib.mjs.ejs +523 -0
  375. package/dist/templates/claude/hooks/post-brainstorm-stop.mjs +48 -0
  376. package/dist/templates/claude/hooks/post-commit-check.mjs.ejs +65 -0
  377. package/dist/templates/claude/hooks/post-commit-checklists/go/backend.ejs +4 -0
  378. package/dist/templates/claude/hooks/post-commit-checklists/go/docs.ejs +4 -0
  379. package/dist/templates/claude/hooks/post-commit-checklists/go/frontend.ejs +4 -0
  380. package/dist/templates/claude/hooks/post-commit-checklists/java/backend.ejs +4 -0
  381. package/dist/templates/claude/hooks/post-commit-checklists/java/docs.ejs +4 -0
  382. package/dist/templates/claude/hooks/post-commit-checklists/java/frontend.ejs +4 -0
  383. package/dist/templates/claude/hooks/post-commit-checklists/python/backend.ejs +4 -0
  384. package/dist/templates/claude/hooks/post-commit-checklists/python/docs.ejs +4 -0
  385. package/dist/templates/claude/hooks/post-commit-checklists/python/frontend.ejs +4 -0
  386. package/dist/templates/claude/hooks/post-commit-checklists/rust/backend.ejs +5 -0
  387. package/dist/templates/claude/hooks/post-commit-checklists/rust/docs.ejs +4 -0
  388. package/dist/templates/claude/hooks/post-commit-checklists/rust/frontend.ejs +4 -0
  389. package/dist/templates/claude/hooks/post-commit-checklists/ts/backend.ejs +4 -0
  390. package/dist/templates/claude/hooks/post-commit-checklists/ts/docs.ejs +4 -0
  391. package/dist/templates/claude/hooks/post-commit-checklists/ts/frontend.ejs +5 -0
  392. package/dist/templates/claude/hooks/post-edit-dispatch.mjs.ejs +73 -0
  393. package/dist/templates/claude/hooks/post-subagent-release.mjs +80 -0
  394. package/dist/templates/claude/hooks/pre-compact.mjs.ejs +79 -0
  395. package/dist/templates/claude/hooks/pre-edit-plan-anchor.mjs.ejs +225 -0
  396. package/dist/templates/claude/hooks/pre-edit-ssot-guard.mjs +204 -0
  397. package/dist/templates/claude/hooks/pre-spawn-worktree-guard.mjs +129 -0
  398. package/dist/templates/claude/hooks/skill-forced-eval.mjs.ejs +281 -0
  399. package/dist/templates/claude/hooks/stop-dangerous.mjs +86 -0
  400. package/dist/templates/claude/hooks/stop-evidence-guard.mjs.ejs +245 -0
  401. package/dist/templates/claude/hooks/stop-finding-loss.mjs.ejs +168 -0
  402. package/dist/templates/claude/hooks/wiki-on-commit.mjs.ejs +38 -0
  403. package/dist/templates/claude/knowledge-map.json.ejs +26 -0
  404. package/dist/templates/claude/rules/05-agent-lifecycle.md +7 -0
  405. package/dist/templates/claude/rules/25-todo-folder-policy.md +5 -0
  406. package/dist/templates/claude/rules/40-context-economy.md +32 -0
  407. package/dist/templates/claude/rules/45-mcp-fallback.md +25 -0
  408. package/dist/templates/claude/rules/50-batch-execution.md +75 -0
  409. package/dist/templates/claude/rules/55-brainstorm-terminal-state.md +44 -0
  410. package/dist/templates/claude/rules/60-incidental-capture.md +43 -0
  411. package/dist/templates/claude/rules/75-impact-vault-reading.md +43 -0
  412. package/dist/templates/claude/rules/90-exec-protocol.md.ejs +40 -0
  413. package/dist/templates/claude/rules/95-closer-mode.md +45 -0
  414. package/dist/templates/claude/settings.json.ejs +165 -0
  415. package/dist/templates/claude/skills/architect-review/SKILL.md.ejs +82 -0
  416. package/dist/templates/claude/skills/brainstorming/SKILL.md.ejs +86 -0
  417. package/dist/templates/claude/skills/clean-code/SKILL.md.ejs +39 -0
  418. package/dist/templates/claude/skills/close-gold-gap/SKILL.md.ejs +58 -0
  419. package/dist/templates/claude/skills/codebase-audit/SKILL.md.ejs +88 -0
  420. package/dist/templates/claude/skills/configure/SKILL.md.ejs +72 -0
  421. package/dist/templates/claude/skills/epic-decompose/SKILL.md.ejs +86 -0
  422. package/dist/templates/claude/skills/gold-audit/SKILL.md.ejs +91 -0
  423. package/dist/templates/claude/skills/impact/SKILL.md.ejs +104 -0
  424. package/dist/templates/claude/skills/levelup/SKILL.md.ejs +146 -0
  425. package/dist/templates/claude/skills/tabletop/SKILL.md.ejs +118 -0
  426. package/dist/templates/claude/skills/tdd/SKILL.md.ejs +157 -0
  427. package/dist/templates/claude/skills/understand-code/SKILL.md.ejs +93 -0
  428. package/dist/templates/claude/skills/verification/SKILL.md.ejs +68 -0
  429. package/dist/templates/claude/skills/wave-drain/SKILL.md.ejs +491 -0
  430. package/dist/templates/codex/CODEX.md.ejs +140 -0
  431. package/dist/templates/codex/codex-adapter.mjs +132 -0
  432. package/dist/templates/codex/config.toml.ejs +189 -0
  433. package/dist/templates/compliance/compliance-mapping.md.ejs +124 -0
  434. package/dist/templates/compliance/compliance-menu.md.ejs +89 -0
  435. package/dist/templates/contract-testing/CONTRACTS_POLICY.md.ejs +30 -0
  436. package/dist/templates/contract-testing/api-snapshots/config-keys-baseline.json.ejs +1 -0
  437. package/dist/templates/contract-testing/api-snapshots/config-response-baseline.json.ejs +1 -0
  438. package/dist/templates/contract-testing/api-snapshots/enum-values-baseline.json.ejs +1 -0
  439. package/dist/templates/contract-testing/api-snapshots/error-shape-baseline.json.ejs +6 -0
  440. package/dist/templates/contract-testing/api-snapshots/openapi-baseline.json.ejs +12 -0
  441. package/dist/templates/contract-testing/api-snapshots/openapi-content-types-baseline.json.ejs +3 -0
  442. package/dist/templates/contract-testing/api-snapshots/openapi-paths-baseline.json.ejs +1 -0
  443. package/dist/templates/contract-testing/api-snapshots/openapi-required-fields-baseline.json.ejs +1 -0
  444. package/dist/templates/contract-testing/api-snapshots/openapi-response-status-baseline.json.ejs +3 -0
  445. package/dist/templates/contract-testing/api-snapshots/test-snapshot.json.ejs +4 -0
  446. package/dist/templates/contract-testing/env/.env.pact.ejs +4 -0
  447. package/dist/templates/contract-testing/graphql/GraphqlSchemaTest.java.ejs +29 -0
  448. package/dist/templates/contract-testing/graphql/graphql-inspector.test.ts.ejs +20 -0
  449. package/dist/templates/contract-testing/graphql/graphql_schema_test.go.ejs +27 -0
  450. package/dist/templates/contract-testing/graphql/graphql_schema_test.rs.ejs +27 -0
  451. package/dist/templates/contract-testing/graphql/test_graphql_schema.py.ejs +21 -0
  452. package/dist/templates/contract-testing/grpc/GrpcContractTest.java.ejs +23 -0
  453. package/dist/templates/contract-testing/grpc/buf-breaking.yml.ejs +6 -0
  454. package/dist/templates/contract-testing/grpc/buf.yaml.ejs +11 -0
  455. package/dist/templates/contract-testing/grpc/grpc-contract.test.ts.ejs +16 -0
  456. package/dist/templates/contract-testing/grpc/grpc_contract_test.go.ejs +22 -0
  457. package/dist/templates/contract-testing/grpc/grpc_contract_test.rs.ejs +22 -0
  458. package/dist/templates/contract-testing/grpc/test_grpc_contract.py.ejs +18 -0
  459. package/dist/templates/contract-testing/message-queue/SchemaRegistryCheckIT.java.ejs +44 -0
  460. package/dist/templates/contract-testing/message-queue/schema-registry-check.ts.ejs +42 -0
  461. package/dist/templates/contract-testing/message-queue/schema_registry_test.go.ejs +71 -0
  462. package/dist/templates/contract-testing/message-queue/schema_registry_test.rs.ejs +61 -0
  463. package/dist/templates/contract-testing/message-queue/test_schema_registry.py.ejs +31 -0
  464. package/dist/templates/contract-testing/pact-samples/assignment-response.json.ejs +7 -0
  465. package/dist/templates/contract-testing/pact-samples/availability-response.json.ejs +13 -0
  466. package/dist/templates/contract-testing/pact-samples/availability-rule-response.json.ejs +8 -0
  467. package/dist/templates/contract-testing/pact-samples/capacity-response.json.ejs +11 -0
  468. package/dist/templates/contract-testing/pact-samples/fully-booked-response.json.ejs +6 -0
  469. package/dist/templates/contract-testing/pact-samples/schedule-override-response.json.ejs +7 -0
  470. package/dist/templates/contract-testing/rest-owned/PactVerificationIT.java.ejs +31 -0
  471. package/dist/templates/contract-testing/rest-owned/pact-consumer.test.ts.ejs +36 -0
  472. package/dist/templates/contract-testing/rest-owned/pact-deps.gradle.ejs +15 -0
  473. package/dist/templates/contract-testing/rest-owned/pact_consumer_test.go.ejs +48 -0
  474. package/dist/templates/contract-testing/rest-owned/pact_consumer_test.rs.ejs +23 -0
  475. package/dist/templates/contract-testing/rest-owned/test_pact_consumer.py.ejs +35 -0
  476. package/dist/templates/contract-testing/rest-public/OpenApiDiffIT.java.ejs +44 -0
  477. package/dist/templates/contract-testing/rest-public/export-openapi-java.gradle.ejs +13 -0
  478. package/dist/templates/contract-testing/rest-public/export-openapi.mjs.ejs +21 -0
  479. package/dist/templates/contract-testing/rest-public/export_openapi.go.ejs +30 -0
  480. package/dist/templates/contract-testing/rest-public/export_openapi.py.ejs +27 -0
  481. package/dist/templates/contract-testing/rest-public/export_openapi.rs.ejs +32 -0
  482. package/dist/templates/contract-testing/rest-public/openapi-diff.ts.ejs +42 -0
  483. package/dist/templates/contract-testing/rest-public/openapi_diff_test.go.ejs +35 -0
  484. package/dist/templates/contract-testing/rest-public/openapi_diff_test.rs.ejs +36 -0
  485. package/dist/templates/contract-testing/rest-public/test_openapi_diff.py.ejs +32 -0
  486. package/dist/templates/coverage/.coveragerc.ejs +26 -0
  487. package/dist/templates/coverage/.tarpaulin.toml.ejs +30 -0
  488. package/dist/templates/coverage/Cargo.toml.profile.release.ejs +24 -0
  489. package/dist/templates/coverage/jacoco-maven-setup.md.ejs +72 -0
  490. package/dist/templates/coverage/jacoco.gradle.ejs +49 -0
  491. package/dist/templates/coverage/kover.gradle.ejs +35 -0
  492. package/dist/templates/coverage/vitest.browser.config.ts.ejs +47 -0
  493. package/dist/templates/coverage/vitest.config.ts.ejs +47 -0
  494. package/dist/templates/docs/CODING_STANDARDS.md.ejs +81 -0
  495. package/dist/templates/docs/FEATURE_MATRIX.md.ejs +84 -0
  496. package/dist/templates/docs/GAP.md.ejs +58 -0
  497. package/dist/templates/docs/ISO27001_ANNEX_A.md.ejs +144 -0
  498. package/dist/templates/docs/MASTER_TEST_PLAN.md.ejs +52 -0
  499. package/dist/templates/docs/POST_MERGE_REVIEW_TEMPLATE.md.ejs +63 -0
  500. package/dist/templates/docs/SECURE_CODING_CHECKLIST.md.ejs +61 -0
  501. package/dist/templates/docs/adr/ADR-000_template.md.ejs +28 -0
  502. package/dist/templates/docs/bugs/bug-analysis.md.ejs +47 -0
  503. package/dist/templates/docs/bugs/bug-report.md.ejs +51 -0
  504. package/dist/templates/docs/bugs/bug-verification.md.ejs +42 -0
  505. package/dist/templates/docs/runbooks/deployment.md.ejs +119 -0
  506. package/dist/templates/docs/runbooks/prod-checklist.md.ejs +90 -0
  507. package/dist/templates/docs/runbooks/rollback.md.ejs +124 -0
  508. package/dist/templates/docs/runbooks/troubleshooting.md.ejs +130 -0
  509. package/dist/templates/docs/skeletons/arc42-canvas.md.ejs +46 -0
  510. package/dist/templates/docs/skeletons/arc42-full.md.ejs +59 -0
  511. package/dist/templates/docs/skeletons/decision-registry.md.ejs +38 -0
  512. package/dist/templates/docs/skeletons/er-model.md.ejs +19 -0
  513. package/dist/templates/docs/skeletons/glossary.md.ejs +8 -0
  514. package/dist/templates/docs/skeletons/governance.md.ejs +13 -0
  515. package/dist/templates/docs/skeletons/slo.md.ejs +21 -0
  516. package/dist/templates/docs/skeletons/technical-debt.md.ejs +8 -0
  517. package/dist/templates/docs/skeletons/test-strategy.md.ejs +14 -0
  518. package/dist/templates/docs/skeletons/threat-model-4q.md.ejs +20 -0
  519. package/dist/templates/docs/skeletons/threat-model-stride.md.ejs +22 -0
  520. package/dist/templates/docs/specs/atomic-task-list.md.ejs +57 -0
  521. package/dist/templates/docs/steering/product.md.ejs +44 -0
  522. package/dist/templates/docs/steering/structure.md.ejs +49 -0
  523. package/dist/templates/docs/steering/tech.md.ejs +53 -0
  524. package/dist/templates/documentation/cli-catalog.md.ejs +21 -0
  525. package/dist/templates/e2e/E2E_CONSTITUTION.md.ejs +77 -0
  526. package/dist/templates/e2e/playwright-python/conftest.py.ejs +22 -0
  527. package/dist/templates/e2e/playwright-python/run_axe.py.ejs +99 -0
  528. package/dist/templates/e2e/playwright-python/test_a11y.py.ejs +38 -0
  529. package/dist/templates/e2e/playwright-python/test_smoke.py.ejs +28 -0
  530. package/dist/templates/e2e/playwright-ts/a11y.spec.ts.ejs +20 -0
  531. package/dist/templates/e2e/playwright-ts/render-smoke.spec.ts.ejs +90 -0
  532. package/dist/templates/e2e/playwright-ts/run-axe.ts.ejs +74 -0
  533. package/dist/templates/e2e/smoke-journeys/journeys.spec.ts.ejs +53 -0
  534. package/dist/templates/evidence-files.json.ejs +13 -0
  535. package/dist/templates/frontend/FE_DESIGN_PRINCIPLES.md.ejs +115 -0
  536. package/dist/templates/frontend/FRONTEND_CONSTITUTION.md.ejs +170 -0
  537. package/dist/templates/frontend/design-tokens.json.ejs +107 -0
  538. package/dist/templates/frontend/vrt-setup.md.ejs +83 -0
  539. package/dist/templates/githooks/commit-msg.ejs +60 -0
  540. package/dist/templates/githooks/pre-commit.ejs +95 -0
  541. package/dist/templates/githooks/pre-push.ejs +251 -0
  542. package/dist/templates/githooks/setup-hooks.sh.ejs +8 -0
  543. package/dist/templates/github/PULL_REQUEST_TEMPLATE.md +37 -0
  544. package/dist/templates/github/PULL_REQUEST_TEMPLATE.md.ejs +52 -0
  545. package/dist/templates/github/actions/build-cache/action.yml.ejs +84 -0
  546. package/dist/templates/github/actions/nas-ssh/action.yml.ejs +53 -0
  547. package/dist/templates/github/actions/setup-java-maven/action.yml.ejs +53 -0
  548. package/dist/templates/github/actions/setup-node-pnpm/action.yml.ejs +39 -0
  549. package/dist/templates/github/actions/sign-and-attest/action.yml.ejs +53 -0
  550. package/dist/templates/github/dependabot.yml.ejs +66 -0
  551. package/dist/templates/github/extended-ci-paths.txt.ejs +38 -0
  552. package/dist/templates/github/issue-templates/bug-report.yml +72 -0
  553. package/dist/templates/github/issue-templates/compliance-item.yml.ejs +75 -0
  554. package/dist/templates/github/issue-templates/config.yml +2 -0
  555. package/dist/templates/github/issue-templates/epic.yml +66 -0
  556. package/dist/templates/github/issue-templates/feature-request.yml +24 -0
  557. package/dist/templates/github/issue-templates/task-brief.yml.ejs +125 -0
  558. package/dist/templates/github/labels.yml.ejs +161 -0
  559. package/dist/templates/github/scripts/sticky-failure-issue.sh.ejs +61 -0
  560. package/dist/templates/github/workflows/01-pr-fast.yml.ejs +1089 -0
  561. package/dist/templates/github/workflows/02-pr-extended.yml.ejs +512 -0
  562. package/dist/templates/github/workflows/03-human-approval.yml.ejs +76 -0
  563. package/dist/templates/github/workflows/04-deploy-test.yml.ejs +425 -0
  564. package/dist/templates/github/workflows/05-release.yml.ejs +813 -0
  565. package/dist/templates/github/workflows/06-nightly-lite.yml.ejs +125 -0
  566. package/dist/templates/github/workflows/06-nightly.yml.ejs +25 -0
  567. package/dist/templates/github/workflows/07-weekly-lite.yml.ejs +221 -0
  568. package/dist/templates/github/workflows/07-weekly.yml.ejs +23 -0
  569. package/dist/templates/github/workflows/08-monthly.yml.ejs +23 -0
  570. package/dist/templates/github/workflows/09-heartbeat.yml.ejs +268 -0
  571. package/dist/templates/github/workflows/10-deploy-prod.yml.ejs +144 -0
  572. package/dist/templates/github/workflows/11-k6-on-demand.yml.ejs +43 -0
  573. package/dist/templates/github/workflows/12-mutation-scheduled.yml.ejs +100 -0
  574. package/dist/templates/github/workflows/13-archunit-extended.yml.ejs +33 -0
  575. package/dist/templates/github/workflows/14-license-scan.yml.ejs +45 -0
  576. package/dist/templates/github/workflows/15-codeql.yml.ejs +117 -0
  577. package/dist/templates/github/workflows/16-frontend-quality.yml.ejs +154 -0
  578. package/dist/templates/github/workflows/17-ossf-scorecard.yml.ejs +46 -0
  579. package/dist/templates/github/workflows/18-frontend-lane.yml.ejs +50 -0
  580. package/dist/templates/github/workflows/_ai-draft-check.yml.ejs +44 -0
  581. package/dist/templates/github/workflows/_contract-postman.yml.ejs +93 -0
  582. package/dist/templates/github/workflows/_cosign-copy/aws-ecs.ejs +90 -0
  583. package/dist/templates/github/workflows/_cosign-copy/azure-container-app.ejs +97 -0
  584. package/dist/templates/github/workflows/_cosign-copy/gcp-cloud-run.ejs +102 -0
  585. package/dist/templates/github/workflows/_cosign-copy/ghcr.ejs +76 -0
  586. package/dist/templates/github/workflows/_cosign-copy/nas-compose.ejs +69 -0
  587. package/dist/templates/github/workflows/_deploy/aws-ecs.ejs +78 -0
  588. package/dist/templates/github/workflows/_deploy/azure-container-app.ejs +59 -0
  589. package/dist/templates/github/workflows/_deploy/gcp-cloud-run.ejs +71 -0
  590. package/dist/templates/github/workflows/_deploy/ghcr.ejs +19 -0
  591. package/dist/templates/github/workflows/_deploy/nas-compose.ejs +45 -0
  592. package/dist/templates/github/workflows/_k6-runner.yml.ejs +107 -0
  593. package/dist/templates/github/workflows/_label-on-approve.yml.ejs +44 -0
  594. package/dist/templates/github/workflows/_label-sync.yml.ejs +58 -0
  595. package/dist/templates/github/workflows/_monthly.yml.ejs +343 -0
  596. package/dist/templates/github/workflows/_nightly.yml.ejs +826 -0
  597. package/dist/templates/github/workflows/_notify.yml.ejs +96 -0
  598. package/dist/templates/github/workflows/_partials/macos-keychain-bypass.ejs +6 -0
  599. package/dist/templates/github/workflows/_partials/macos-keychain-restore.ejs +6 -0
  600. package/dist/templates/github/workflows/_partials/scheduled-heavy-jobs.ejs +117 -0
  601. package/dist/templates/github/workflows/_partials/sigstore-preflight.ejs +8 -0
  602. package/dist/templates/github/workflows/_partials/trivy-fs-java.ejs +27 -0
  603. package/dist/templates/github/workflows/_post-merge-notify.yml.ejs +228 -0
  604. package/dist/templates/github/workflows/_pr-staleness.yml.ejs +85 -0
  605. package/dist/templates/github/workflows/_shared-security.yml.ejs +132 -0
  606. package/dist/templates/github/workflows/_sigstore-retry-sign.yml.ejs +102 -0
  607. package/dist/templates/github/workflows/_weekly.yml.ejs +313 -0
  608. package/dist/templates/github/workflows/drift-shadow.yml.ejs +51 -0
  609. package/dist/templates/github/workflows/five-lane/ci.yml.ejs +54 -0
  610. package/dist/templates/github/workflows/five-lane/nightly.yml.ejs +70 -0
  611. package/dist/templates/github/workflows/five-lane/release.yml.ejs +53 -0
  612. package/dist/templates/github/workflows/five-lane/weekly.yml.ejs +72 -0
  613. package/dist/templates/github/workflows/issue-state.yml.ejs +93 -0
  614. package/dist/templates/global-invariants/GLOBAL_INVARIANTS.md.ejs +34 -0
  615. package/dist/templates/governance/RACI.md.ejs +21 -0
  616. package/dist/templates/governance/ci-mental-model.md.ejs +268 -0
  617. package/dist/templates/governance/contract-integrity-policy.md.ejs +116 -0
  618. package/dist/templates/governance/enterprise-compliance-baseline.md.ejs +111 -0
  619. package/dist/templates/governance/evidence-retention.md.ejs +43 -0
  620. package/dist/templates/governance/gdpr-erasure-runbook.md.ejs +165 -0
  621. package/dist/templates/governance/qa-audit-phases.md.ejs +129 -0
  622. package/dist/templates/governance/risk-assessment-template.md.ejs +105 -0
  623. package/dist/templates/governance/risk-register.md.ejs +76 -0
  624. package/dist/templates/governance/solo-dev-exception.md.ejs +96 -0
  625. package/dist/templates/governance/validation-evidence.md.ejs +131 -0
  626. package/dist/templates/infra/azure/containerapp.tpl.yaml.ejs +74 -0
  627. package/dist/templates/infra/nas-compose/deploy.sh.ejs +114 -0
  628. package/dist/templates/integration-testing/AbstractIntegrationTest.java.ejs +36 -0
  629. package/dist/templates/integration-testing/NoH2ArchTest.java.ejs +24 -0
  630. package/dist/templates/integration-testing/conftest.py.ejs +20 -0
  631. package/dist/templates/integration-testing/db_fixture.rs.ejs +48 -0
  632. package/dist/templates/integration-testing/eslint-no-fake-db.json.ejs +19 -0
  633. package/dist/templates/integration-testing/eslint.config.no-fake-db.mjs.ejs +46 -0
  634. package/dist/templates/integration-testing/main_test.go.ejs +53 -0
  635. package/dist/templates/integration-testing/main_test_sqlite.go.ejs +37 -0
  636. package/dist/templates/integration-testing/test-setup.ts.ejs +26 -0
  637. package/dist/templates/integration-testing/testcontainers-deps.gradle.ejs +9 -0
  638. package/dist/templates/java/DeprecationInterceptor.java.ejs +50 -0
  639. package/dist/templates/java/archunit-hexagonal.ejs +69 -0
  640. package/dist/templates/java/modulith/ApplicationModulesTest.java.ejs +21 -0
  641. package/dist/templates/java/modulith/modulith-deps.gradle.ejs +13 -0
  642. package/dist/templates/java/modulith/modulith-maven-setup.md.ejs +21 -0
  643. package/dist/templates/java/pharma/AuditEvent.java.ejs +138 -0
  644. package/dist/templates/java/pharma/AuditMapper.java.ejs +60 -0
  645. package/dist/templates/java/pharma/archunit-pharma.ejs +128 -0
  646. package/dist/templates/kit/GLOBAL_KIT.md.ejs +11 -0
  647. package/dist/templates/kit/dim.md.ejs +33 -0
  648. package/dist/templates/llms-txt.config.json.ejs +22 -0
  649. package/dist/templates/local-wrapper/.env.example.ejs +15 -0
  650. package/dist/templates/local-wrapper/Makefile.ejs +44 -0
  651. package/dist/templates/local-wrapper/run.sh.ejs +5 -0
  652. package/dist/templates/middleware/410-gone-handler.ts.ejs +41 -0
  653. package/dist/templates/middleware/correlation-id.ts.ejs +32 -0
  654. package/dist/templates/middleware/deprecation.ts.ejs +45 -0
  655. package/dist/templates/middleware/error-handler.ts.ejs +73 -0
  656. package/dist/templates/middleware/payload-size-limit.ts.ejs +51 -0
  657. package/dist/templates/mutation/README.md.ejs +67 -0
  658. package/dist/templates/mutation/cargo-mutants.toml.ejs +9 -0
  659. package/dist/templates/mutation/mutmut-config.toml.ejs +7 -0
  660. package/dist/templates/mutation/parse-mutants.mjs.ejs +44 -0
  661. package/dist/templates/mutation/parse-mutmut.py.ejs +44 -0
  662. package/dist/templates/mutation/pitest-l2-setup.md.ejs +66 -0
  663. package/dist/templates/mutation/pitest-maven-setup.md.ejs +64 -0
  664. package/dist/templates/mutation/pitest.gradle.ejs +23 -0
  665. package/dist/templates/mutation/stryker.conf.json.ejs +17 -0
  666. package/dist/templates/observability/setup.md.ejs +495 -0
  667. package/dist/templates/operations/handbook.md.ejs +217 -0
  668. package/dist/templates/perf/bundle-budget.json.ejs +29 -0
  669. package/dist/templates/perf/k6/reports/csv-report.py.ejs +91 -0
  670. package/dist/templates/perf/k6/reports/html-report.py.ejs +114 -0
  671. package/dist/templates/perf/k6/reports/json-report.py.ejs +74 -0
  672. package/dist/templates/perf/k6/scenarios/breakpoint.js.ejs +26 -0
  673. package/dist/templates/perf/k6/scenarios/burst.js.ejs +43 -0
  674. package/dist/templates/perf/k6/scenarios/endurance.js.ejs +36 -0
  675. package/dist/templates/perf/k6/scenarios/load.js.ejs +26 -0
  676. package/dist/templates/perf/k6/scenarios/ramp-down.js.ejs +29 -0
  677. package/dist/templates/perf/k6/scenarios/ramp-up.js.ejs +32 -0
  678. package/dist/templates/perf/k6/scenarios/smoke.js.ejs +23 -0
  679. package/dist/templates/perf/k6/scenarios/soak.js.ejs +26 -0
  680. package/dist/templates/perf/k6/scenarios/spike.js.ejs +29 -0
  681. package/dist/templates/perf/k6/scenarios/steady-state.js.ejs +31 -0
  682. package/dist/templates/perf/k6/scenarios/stress.js.ejs +29 -0
  683. package/dist/templates/perf/k6/scenarios/volume.js.ejs +36 -0
  684. package/dist/templates/perf/k6/seed/test-data.sql.ejs +59 -0
  685. package/dist/templates/perf/lighthouserc.json.ejs +41 -0
  686. package/dist/templates/quality/iso9001/CAPA_LOG.md.ejs +36 -0
  687. package/dist/templates/quality/iso9001/DOCUMENT_CONTROL.md.ejs +36 -0
  688. package/dist/templates/quality/iso9001/REQUIREMENTS_TRACEABILITY.md.ejs +61 -0
  689. package/dist/templates/regulated/overlay.json.ejs +26 -0
  690. package/dist/templates/regulated/regulated-overlay.md.ejs +40 -0
  691. package/dist/templates/resilience/RESILIENCE.md.ejs +310 -0
  692. package/dist/templates/root/.gitignore.ejs +85 -0
  693. package/dist/templates/root/CODEOWNERS.ejs +18 -0
  694. package/dist/templates/root/CONTRIBUTING.md.ejs +62 -0
  695. package/dist/templates/root/SECURITY.md.ejs +19 -0
  696. package/dist/templates/root/TEST_TAXONOMY.md.ejs +100 -0
  697. package/dist/templates/root/commitlint.config.js.ejs +4 -0
  698. package/dist/templates/root/docs/METHOD/CANONICAL_PATHS.md.ejs +24 -0
  699. package/dist/templates/root/docs/METHOD/ENGINEERING_DEFAULTS.md.ejs +136 -0
  700. package/dist/templates/root/docs/METHOD/KNOWLEDGE_MAP.md.ejs +90 -0
  701. package/dist/templates/root/docs/METHOD/PATTERNS_CATALOG.md.ejs +51 -0
  702. package/dist/templates/root/docs/METHOD/REUSE_REGISTRY.md.ejs +26 -0
  703. package/dist/templates/root/docs/METHOD/REUSE_REGISTRY_SPEC.md.ejs +80 -0
  704. package/dist/templates/root/docs/METHOD/SSOT_CORE_SET.md.ejs +62 -0
  705. package/dist/templates/root/docs/METHOD/TRACK_ROUTER.md.ejs +39 -0
  706. package/dist/templates/root/docs/SYSTEM/CANON.md.ejs +359 -0
  707. package/dist/templates/root/docs/SYSTEM/FAIL_CLOSED.md.ejs +171 -0
  708. package/dist/templates/root/editorconfig.ejs +39 -0
  709. package/dist/templates/root/tsconfig.json.ejs +21 -0
  710. package/dist/templates/rust/clippy.toml.ejs +14 -0
  711. package/dist/templates/schemas/milestone.schema.json.ejs +164 -0
  712. package/dist/templates/schemas/rtm-verdict.schema.json.ejs +52 -0
  713. package/dist/templates/schemas/source-record.schema.json.ejs +91 -0
  714. package/dist/templates/schemas/tabletop-evidence.schema.json.ejs +53 -0
  715. package/dist/templates/schemas/use-case.schema.json.ejs +59 -0
  716. package/dist/templates/scripts/apply-branch-protection.mjs.ejs +70 -0
  717. package/dist/templates/scripts/audit-toolchain.mjs.ejs +112 -0
  718. package/dist/templates/scripts/bg-run.sh.ejs +59 -0
  719. package/dist/templates/scripts/capacity-probe.mjs.ejs +147 -0
  720. package/dist/templates/scripts/capture-debt-baseline.mjs.ejs +99 -0
  721. package/dist/templates/scripts/check-acceptance.mjs.ejs +298 -0
  722. package/dist/templates/scripts/check-action-pins.mjs.ejs +215 -0
  723. package/dist/templates/scripts/check-agent-return.mjs.ejs +177 -0
  724. package/dist/templates/scripts/check-all.mjs.ejs +1746 -0
  725. package/dist/templates/scripts/check-anti-fake-green.mjs.ejs +80 -0
  726. package/dist/templates/scripts/check-anti-proforma.mjs.ejs +547 -0
  727. package/dist/templates/scripts/check-api-e2e.mjs.ejs +106 -0
  728. package/dist/templates/scripts/check-arc42-slots.mjs.ejs +25 -0
  729. package/dist/templates/scripts/check-assertion-delta.mjs.ejs +287 -0
  730. package/dist/templates/scripts/check-audit-dry-pass.mjs.ejs +176 -0
  731. package/dist/templates/scripts/check-bundle-size.mjs.ejs +151 -0
  732. package/dist/templates/scripts/check-canonical-paths.mjs.ejs +39 -0
  733. package/dist/templates/scripts/check-ci-tiers.mjs.ejs +111 -0
  734. package/dist/templates/scripts/check-claude-md-lint.mjs.ejs +142 -0
  735. package/dist/templates/scripts/check-collab-mode-wired.mjs.ejs +60 -0
  736. package/dist/templates/scripts/check-commit-footer-rationale.mjs.ejs +170 -0
  737. package/dist/templates/scripts/check-constraint-scan.mjs.ejs +681 -0
  738. package/dist/templates/scripts/check-consumer-audit.mjs.ejs +414 -0
  739. package/dist/templates/scripts/check-continue-on-error.mjs.ejs +227 -0
  740. package/dist/templates/scripts/check-cross-model-review.mjs.ejs +458 -0
  741. package/dist/templates/scripts/check-decision-registry.mjs.ejs +101 -0
  742. package/dist/templates/scripts/check-doc-freshness.mjs.ejs +17 -0
  743. package/dist/templates/scripts/check-doc-links.mjs.ejs +98 -0
  744. package/dist/templates/scripts/check-doc-set.mjs.ejs +18 -0
  745. package/dist/templates/scripts/check-docs.mjs.ejs +71 -0
  746. package/dist/templates/scripts/check-domain-api-surface.mjs.ejs +80 -0
  747. package/dist/templates/scripts/check-drift.mjs.ejs +167 -0
  748. package/dist/templates/scripts/check-duplication.mjs.ejs +45 -0
  749. package/dist/templates/scripts/check-e2e-escalation.mjs.ejs +199 -0
  750. package/dist/templates/scripts/check-e2e-quarantine.mjs.ejs +68 -0
  751. package/dist/templates/scripts/check-emission-parity.mjs.ejs +91 -0
  752. package/dist/templates/scripts/check-exit-code-contract.mjs.ejs +138 -0
  753. package/dist/templates/scripts/check-fail-closed-audit.mjs.ejs +389 -0
  754. package/dist/templates/scripts/check-fe-boundaries.mjs.ejs +184 -0
  755. package/dist/templates/scripts/check-feature-matrix.mjs.ejs +835 -0
  756. package/dist/templates/scripts/check-frontend-lane.mjs.ejs +73 -0
  757. package/dist/templates/scripts/check-grace-window.mjs.ejs +102 -0
  758. package/dist/templates/scripts/check-handoff-doc.mjs.ejs +192 -0
  759. package/dist/templates/scripts/check-hook-routing.mjs.ejs +224 -0
  760. package/dist/templates/scripts/check-image-pins.mjs.ejs +90 -0
  761. package/dist/templates/scripts/check-inline-suppressions.mjs.ejs +153 -0
  762. package/dist/templates/scripts/check-iso9001.mjs.ejs +146 -0
  763. package/dist/templates/scripts/check-knowledge-map.mjs.ejs +49 -0
  764. package/dist/templates/scripts/check-local-ci-parity.mjs.ejs +382 -0
  765. package/dist/templates/scripts/check-m16-handoff.mjs.ejs +112 -0
  766. package/dist/templates/scripts/check-merge-method.mjs.ejs +92 -0
  767. package/dist/templates/scripts/check-milestones.mjs.ejs +678 -0
  768. package/dist/templates/scripts/check-min-test-execution.mjs.ejs +225 -0
  769. package/dist/templates/scripts/check-muted-test.mjs.ejs +270 -0
  770. package/dist/templates/scripts/check-no-stub-redirects.mjs.ejs +154 -0
  771. package/dist/templates/scripts/check-no-tracked-artifacts.mjs.ejs +134 -0
  772. package/dist/templates/scripts/check-oracle-discrimination.mjs.ejs +244 -0
  773. package/dist/templates/scripts/check-pii-scan.mjs.ejs +67 -0
  774. package/dist/templates/scripts/check-pipe-tee-hazard.mjs.ejs +85 -0
  775. package/dist/templates/scripts/check-pr-size-gate.mjs.ejs +85 -0
  776. package/dist/templates/scripts/check-refutation-verdicts.mjs.ejs +256 -0
  777. package/dist/templates/scripts/check-regulated-overlay.mjs.ejs +158 -0
  778. package/dist/templates/scripts/check-render-smoke.mjs.ejs +100 -0
  779. package/dist/templates/scripts/check-reuse-registry.mjs.ejs +44 -0
  780. package/dist/templates/scripts/check-review-completion.mjs.ejs +708 -0
  781. package/dist/templates/scripts/check-safety-adopt-ratchet.mjs.ejs +142 -0
  782. package/dist/templates/scripts/check-secret-presence.mjs.ejs +191 -0
  783. package/dist/templates/scripts/check-secret-scan.mjs.ejs +82 -0
  784. package/dist/templates/scripts/check-skip-critical-e2e.mjs.ejs +142 -0
  785. package/dist/templates/scripts/check-smoke-journeys.mjs.ejs +272 -0
  786. package/dist/templates/scripts/check-solo-reactivation.mjs.ejs +102 -0
  787. package/dist/templates/scripts/check-sources.mjs.ejs +245 -0
  788. package/dist/templates/scripts/check-ssot-core.mjs.ejs +45 -0
  789. package/dist/templates/scripts/check-stack-conformity.mjs.ejs +160 -0
  790. package/dist/templates/scripts/check-stride-traceability.mjs.ejs +101 -0
  791. package/dist/templates/scripts/check-suppression-expiry.mjs.ejs +79 -0
  792. package/dist/templates/scripts/check-suppression-rationale.mjs.ejs +76 -0
  793. package/dist/templates/scripts/check-suppressions.mjs.ejs +150 -0
  794. package/dist/templates/scripts/check-tabletop-evidence.mjs.ejs +499 -0
  795. package/dist/templates/scripts/check-tdd-evidence.mjs.ejs +381 -0
  796. package/dist/templates/scripts/check-test-naming.mjs.ejs +151 -0
  797. package/dist/templates/scripts/check-test-pyramid.mjs.ejs +170 -0
  798. package/dist/templates/scripts/check-test-scope-tier.mjs.ejs +208 -0
  799. package/dist/templates/scripts/check-tier-coverage.mjs.ejs +71 -0
  800. package/dist/templates/scripts/check-todo-max-age.mjs.ejs +205 -0
  801. package/dist/templates/scripts/check-touched-vs-manifest.mjs.ejs +179 -0
  802. package/dist/templates/scripts/check-unwired-guards.mjs.ejs +367 -0
  803. package/dist/templates/scripts/check-use-cases.mjs.ejs +345 -0
  804. package/dist/templates/scripts/check-validator-helptext.mjs.ejs +80 -0
  805. package/dist/templates/scripts/check-wiki-lint.mjs.ejs +162 -0
  806. package/dist/templates/scripts/check-workflow-docs-sync.mjs.ejs +91 -0
  807. package/dist/templates/scripts/check-workflow-job-naming.mjs.ejs +102 -0
  808. package/dist/templates/scripts/check-workflow-perms.mjs.ejs +54 -0
  809. package/dist/templates/scripts/check-workflow-runners.mjs.ejs +87 -0
  810. package/dist/templates/scripts/check-workflow-sha-pinning.mjs.ejs +89 -0
  811. package/dist/templates/scripts/check-workflow-test-integrity.mjs.ejs +235 -0
  812. package/dist/templates/scripts/checks/check-rust-no-unsafe.mjs.ejs +58 -0
  813. package/dist/templates/scripts/checks/check-rust-no-unwrap.mjs.ejs +61 -0
  814. package/dist/templates/scripts/ci-classify-changes.mjs.ejs +119 -0
  815. package/dist/templates/scripts/conformance.mjs.ejs +37 -0
  816. package/dist/templates/scripts/constraint-map.json.ejs +25 -0
  817. package/dist/templates/scripts/debt-lib.mjs.ejs +1015 -0
  818. package/dist/templates/scripts/debt-report.mjs.ejs +199 -0
  819. package/dist/templates/scripts/domain-api-surface.json.ejs +23 -0
  820. package/dist/templates/scripts/done-evidence.mjs.ejs +359 -0
  821. package/dist/templates/scripts/evidence-collect.mjs.ejs +264 -0
  822. package/dist/templates/scripts/evidence-prune.mjs.ejs +96 -0
  823. package/dist/templates/scripts/evidence-rotate.mjs.ejs +53 -0
  824. package/dist/templates/scripts/evidence-writer.sh.ejs +220 -0
  825. package/dist/templates/scripts/gate-registry.yml.ejs +286 -0
  826. package/dist/templates/scripts/gen-doc-index.mjs.ejs +19 -0
  827. package/dist/templates/scripts/gen-gap.mjs.ejs +153 -0
  828. package/dist/templates/scripts/gen-llms-txt.mjs.ejs +18 -0
  829. package/dist/templates/scripts/gen-wiki.mjs.ejs +196 -0
  830. package/dist/templates/scripts/gh-cleanup-expired-artifacts.mjs.ejs +134 -0
  831. package/dist/templates/scripts/gold-audit.mjs.ejs +19 -0
  832. package/dist/templates/scripts/i18n-literal-scanner.mjs.ejs +175 -0
  833. package/dist/templates/scripts/ingest-zap-report.mjs.ejs +107 -0
  834. package/dist/templates/scripts/inject-pact-samples.sh.ejs +96 -0
  835. package/dist/templates/scripts/issue-readiness.mjs.ejs +84 -0
  836. package/dist/templates/scripts/knowledge-map-update.mjs.ejs +32 -0
  837. package/dist/templates/scripts/lib/acceptance-criteria.mjs.ejs +213 -0
  838. package/dist/templates/scripts/lib/agent-return-validate.mjs.ejs +481 -0
  839. package/dist/templates/scripts/lib/coverage-gate.mjs.ejs +54 -0
  840. package/dist/templates/scripts/lib/e2e-reliability.mjs.ejs +207 -0
  841. package/dist/templates/scripts/lib/ephemeral-server.mjs.ejs +148 -0
  842. package/dist/templates/scripts/lib/evidence-binding.mjs.ejs +140 -0
  843. package/dist/templates/scripts/lib/exact-sha-policy.mjs.ejs +233 -0
  844. package/dist/templates/scripts/lib/gate-args.mjs.ejs +20 -0
  845. package/dist/templates/scripts/lib/gate-evidence.mjs.ejs +622 -0
  846. package/dist/templates/scripts/lib/gate-mutex.mjs.ejs +340 -0
  847. package/dist/templates/scripts/lib/glob-walk.mjs.ejs +148 -0
  848. package/dist/templates/scripts/lib/run-helpers.mjs.ejs +416 -0
  849. package/dist/templates/scripts/lib/seed-common.sh.ejs +105 -0
  850. package/dist/templates/scripts/lib/waiter-count.mjs.ejs +62 -0
  851. package/dist/templates/scripts/muted-tests-baseline.json.ejs +4 -0
  852. package/dist/templates/scripts/optional-emissions.json.ejs +117 -0
  853. package/dist/templates/scripts/oracle-discrimination-baseline.json.ejs +6 -0
  854. package/dist/templates/scripts/pid-watch.sh.ejs +78 -0
  855. package/dist/templates/scripts/pii-scan.mjs.ejs +125 -0
  856. package/dist/templates/scripts/pr-merge-watch.mjs.ejs +445 -0
  857. package/dist/templates/scripts/record-agent-return.mjs.ejs +279 -0
  858. package/dist/templates/scripts/record-journey-evidence.mjs.ejs +69 -0
  859. package/dist/templates/scripts/rework-log.mjs.ejs +172 -0
  860. package/dist/templates/scripts/run-postman-tests.sh.ejs +112 -0
  861. package/dist/templates/scripts/schemas/agent-return-external.schema.json +74 -0
  862. package/dist/templates/scripts/schemas/agent-return.schema.json.ejs +181 -0
  863. package/dist/templates/scripts/schemas/cross-model-dispatch.schema.json +95 -0
  864. package/dist/templates/scripts/seed-test-data.sh.ejs +99 -0
  865. package/dist/templates/scripts/self-validation.mjs.ejs +126 -0
  866. package/dist/templates/scripts/setup-repo.sh.ejs +78 -0
  867. package/dist/templates/scripts/spotbugs-baseline.json.ejs +4 -0
  868. package/dist/templates/scripts/test-gate-layering.mjs.ejs +92 -0
  869. package/dist/templates/scripts/validate-api-snapshots.mjs.ejs +86 -0
  870. package/dist/templates/scripts/validate-k6-scenarios.mjs.ejs +96 -0
  871. package/dist/templates/scripts/validate-openapi-field-types.mjs.ejs +124 -0
  872. package/dist/templates/scripts/validate-postman-collection.mjs.ejs +159 -0
  873. package/dist/templates/scripts/verify-fe-coverage.mjs.ejs +138 -0
  874. package/dist/templates/scripts/verify-i18n-parity.mjs.ejs +114 -0
  875. package/dist/templates/scripts/verify-module-coverage.mjs.ejs +207 -0
  876. package/dist/templates/scripts/verify-mutation-baseline.mjs.ejs +209 -0
  877. package/dist/templates/scripts/verify-spotbugs.mjs.ejs +216 -0
  878. package/dist/templates/scripts/verify-tokens.mjs.ejs +177 -0
  879. package/dist/templates/security/RISK_ASSESSMENT.md.ejs +35 -0
  880. package/dist/templates/security/STRIDE.md.ejs +24 -0
  881. package/dist/templates/security/gitleaks.toml.ejs +21 -0
  882. package/dist/templates/security/zap/baseline-auth.context.ejs +58 -0
  883. package/dist/templates/security/zap/rules.tsv.ejs +100 -0
  884. package/dist/templates/ship/TICK_PROMPT.md.ejs +55 -0
  885. package/dist/templates/ship/supervisor.sh.ejs +46 -0
  886. package/dist/templates/smoke-journeys/manifest.json.ejs +1 -0
  887. package/dist/templates/sonar-project.properties.ejs +25 -0
  888. package/dist/templates/standards/doc-profile.ejs +27 -0
  889. package/dist/templates/standards/gold-doc-set.yml.ejs +528 -0
  890. package/dist/templates/standards/gold-registry.java.yml.ejs +266 -0
  891. package/dist/templates/standards/gold-registry.typescript.yml.ejs +104 -0
  892. package/dist/templates/standards/gold-registry.yml.ejs +119 -0
  893. package/dist/templates/standards/thresholds.yml.ejs +86 -0
  894. package/dist/templates/static-analysis/.dependency-cruiser.cjs.ejs +78 -0
  895. package/dist/templates/static-analysis/.golangci.yml.ejs +70 -0
  896. package/dist/templates/static-analysis/.shellcheckrc.ejs +13 -0
  897. package/dist/templates/static-analysis/.yamllint.yml.ejs +41 -0
  898. package/dist/templates/static-analysis/checkstyle.xml.ejs +83 -0
  899. package/dist/templates/static-analysis/detekt.yml.ejs +26 -0
  900. package/dist/templates/static-analysis/eslint.config.mjs.ejs +54 -0
  901. package/dist/templates/static-analysis/eslint.config.static.mjs.ejs +38 -0
  902. package/dist/templates/static-analysis/eslintrc-static.json.ejs +30 -0
  903. package/dist/templates/static-analysis/jscpd.json.ejs +25 -0
  904. package/dist/templates/static-analysis/knip.json.ejs +26 -0
  905. package/dist/templates/static-analysis/pmd-ruleset.xml.ejs +92 -0
  906. package/dist/templates/static-analysis/prettierignore.ejs +59 -0
  907. package/dist/templates/static-analysis/prettierrc.json.ejs +10 -0
  908. package/dist/templates/static-analysis/requirements-dev.txt.ejs +11 -0
  909. package/dist/templates/static-analysis/ruff.toml.ejs +40 -0
  910. package/dist/templates/static-analysis/rustfmt.toml.ejs +3 -0
  911. package/dist/templates/static-analysis/spotbugs-exclude.xml.ejs +120 -0
  912. package/dist/templates/static-analysis/spotbugs.gradle.ejs +18 -0
  913. package/dist/templates/static-analysis/spotless.gradle.ejs +38 -0
  914. package/dist/templates/static-analysis/stylelintrc.json.ejs +16 -0
  915. package/dist/templates/suppressions/archunit-baseline.json.ejs +1 -0
  916. package/dist/templates/suppressions/consumer-audit-allowlist.json.ejs +1 -0
  917. package/dist/templates/suppressions/gitleaksignore.ejs +20 -0
  918. package/dist/templates/suppressions/pii-allowlist.json.ejs +1 -0
  919. package/dist/templates/suppressions/suppressions-schema.json.ejs +39 -0
  920. package/dist/templates/suppressions/trivyignore.ejs +17 -0
  921. package/dist/templates/testing/test-taxonomy.md.ejs +120 -0
  922. package/dist/test/example.behavioral.test.js +2 -0
  923. package/dist/types/memory.d.ts +19 -0
  924. package/dist/types/memory.js +1 -0
  925. package/dist/types/plan.d.ts +102 -0
  926. package/dist/types/plan.js +2 -0
  927. package/dist/types/plugin.d.ts +45 -0
  928. package/dist/types/plugin.js +1 -0
  929. package/dist/utils/canon-loader.js +2 -0
  930. package/dist/utils/channel.js +1 -0
  931. package/dist/utils/config.d.ts +79 -0
  932. package/dist/utils/config.js +5 -0
  933. package/dist/utils/confirm-downgrade.js +5 -0
  934. package/dist/utils/env.js +2 -0
  935. package/dist/utils/error-catalog.js +2 -0
  936. package/dist/utils/errors.js +2 -0
  937. package/dist/utils/evidence-log.js +3 -0
  938. package/dist/utils/file-lock.js +2 -0
  939. package/dist/utils/first-run.js +8 -0
  940. package/dist/utils/fs.js +3 -0
  941. package/dist/utils/github-issue-helper.js +4 -0
  942. package/dist/utils/gradle.js +21 -0
  943. package/dist/utils/json-output.js +2 -0
  944. package/dist/utils/logger-config.js +4 -0
  945. package/dist/utils/logger.js +3 -0
  946. package/dist/utils/maturity-check.js +2 -0
  947. package/dist/utils/pkg.js +3 -0
  948. package/dist/utils/platform.js +2 -0
  949. package/dist/utils/plugin-loader.js +2 -0
  950. package/dist/utils/plugin-worker.js +2 -0
  951. package/dist/utils/prettier-format.js +2 -0
  952. package/dist/utils/profiler.js +2 -0
  953. package/dist/utils/render.js +2 -0
  954. package/dist/utils/replay.js +3 -0
  955. package/dist/utils/run-cli.js +6 -0
  956. package/dist/utils/run-id.js +3 -0
  957. package/dist/utils/safe-read.js +2 -0
  958. package/dist/utils/task-id.js +2 -0
  959. package/dist/utils/today.js +2 -0
  960. package/dist/utils/tty.js +2 -0
  961. package/dist/utils/walk-dir.js +2 -0
  962. package/dist/verify/rules/drive-by-scope.js +1 -0
  963. package/dist/verify/rules/orphan-todos.js +1 -0
  964. package/dist/verify/rules/registry.js +1 -0
  965. package/dist/verify/rules/skip-patterns.js +1 -0
  966. package/dist/verify/rules/types.d.ts +15 -0
  967. package/dist/verify/rules/types.js +1 -0
  968. package/dist/verify/rules/ui-language.js +1 -0
  969. package/dist/verify/run.js +3 -0
  970. package/dist/wizard/archetype-defaults.js +1 -0
  971. package/dist/wizard/presets.js +1 -0
  972. package/dist/wizard/prompts.js +44 -0
  973. package/dist/wizard/types.d.ts +637 -0
  974. package/dist/wizard/types.js +1 -0
  975. package/dist/worktree/harvest.js +2 -0
  976. package/dist/worktree/links.js +2 -0
  977. package/dist/worktree/paths.js +2 -0
  978. package/dist/worktree/validate.js +3 -0
  979. package/package.json +124 -0
  980. package/scripts/check-arc42-slots.mjs +738 -0
  981. package/scripts/check-doc-freshness.mjs +236 -0
  982. package/scripts/check-doc-set.mjs +243 -0
  983. package/scripts/check-doc-style.mjs +228 -0
  984. package/scripts/gold-audit.mjs +319 -0
  985. package/scripts/lib/doc-gate-allowlist.mjs +123 -0
  986. package/scripts/lib/doc-set-resolve.mjs +274 -0
  987. package/scripts/lib/glob-walk.mjs +148 -0
  988. package/scripts/lib/gold-audit-lib.mjs +1260 -0
  989. package/scripts/lib/run-helpers.mjs +413 -0
@@ -0,0 +1 @@
1
+ {"$schema":"arbiter-kit-v1","source":"[tools]/KIT_gold-standard_76-dimensions_REDACTED.xlsx","revision":"Rev01 (R-08 remap)","generated_at":"2026-05-19T00:00:00Z","total_dims":78,"tml_alias_note":"tml field uses arbiter canonical M1/M2/M3; tml_source preserves XLSX L1/L2/L3; ADR-045 records the alias","dimensions":[{"id":1,"category":"Architecture","name":"Hexagonal architecture enforcement (ArchUnit)","detail":"L2: >=8 base (R-1..R-8). L3: >=20+ (port completo 39)","tml":"M2","tml_source":"L2","gate_type":"BLOCKING","stack_tag":"java_spring","conditional":"always","planning_evidence_paths":["ArchitectureTests.java"],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F2","disposition":"stack-adapter","framework_realization":{"template":"planned:src/templates/java/architecture/archunit-rules-compile-time.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-001-archunit-rules-compile-time.md"},"planning_notes":"Graduale: 1 regola alla volta, partire da conformi","canonical_id":"N01","import_source":{"import_id":1,"import_name":"ArchUnit rules compile-time"},"origin":"import"},{"id":2,"category":"Architecture","name":"Package dependency rules (no domain→infra leakage)","detail":"","tml":"M2","tml_source":"L2","gate_type":"BLOCKING","stack_tag":"java_spring","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F2","disposition":"stack-adapter","framework_realization":{"template":"planned:src/templates/package-dependency-rules-no-domain-infra-leakage.ejs","generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N02","import_source":null,"origin":"arbiter-native"},{"id":3,"category":"Architecture","name":"Interface + implementation separation rule","detail":"Ogni service: XxxService (interface) + XxxServiceImpl","tml":"M2","tml_source":"L2","gate_type":"BLOCKING","stack_tag":"java_spring","conditional":"always","planning_evidence_paths":["service/*Service.java"],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F2","disposition":"stack-adapter","framework_realization":{"template":"planned:src/templates/java/architecture/interface-impl-pattern-p5.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-002-interface-impl-pattern-p5.md"},"planning_notes":"Instance: 26 service da splittare","canonical_id":"N03","import_source":{"import_id":2,"import_name":"Interface + Impl pattern (P5)"},"origin":"import"},{"id":4,"category":"Architecture","name":"No Spring annotations in domain layer","detail":"","tml":"M2","tml_source":"L2","gate_type":"BLOCKING","stack_tag":"java_spring","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F2","disposition":"stack-adapter","framework_realization":{"template":"planned:src/templates/no-spring-annotations-in-domain-layer.ejs","generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N04","import_source":null,"origin":"arbiter-native"},{"id":5,"category":"Architecture","name":"@Async annotation only in service layer","detail":"AsyncConfig + tenant-aware task decorator in config/. MAI raw Thread","tml":"M2","tml_source":"L2","gate_type":"BLOCKING","stack_tag":"java_spring","conditional":"always","planning_evidence_paths":["config/AsyncConfig.java"],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F2","disposition":"stack-adapter","framework_realization":{"template":"planned:src/templates/java/architecture/-async-tenantawaretaskdecorator-p20.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-008--async-tenantawaretaskdecorator-p20.md"},"planning_notes":"ADR-024 icebox. Audit first, fix later","canonical_id":"N05","import_source":{"import_id":8,"import_name":"@Async + tenant-aware task decorator (P20)"},"origin":"import"},{"id":6,"category":"Architecture","name":"Bean Validation constraints in domain entities only","detail":"@Valid su ogni @RequestBody DTO. JSR-380 annotations","tml":"M2","tml_source":"L2","gate_type":"BLOCKING","stack_tag":"java_spring","conditional":"always","planning_evidence_paths":["controller/*.java + dto/*Request.java"],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F2","disposition":"stack-adapter","framework_realization":{"template":"planned:src/templates/java/architecture/bean-validation-valid-p8.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-003-bean-validation-valid-p8.md"},"planning_notes":"Validazione manuale if/throw -> Bean Validation","canonical_id":"N06","import_source":{"import_id":3,"import_name":"Bean Validation @Valid (P8)"},"origin":"import"},{"id":7,"category":"Architecture","name":"No circular dependencies between modules","detail":"","tml":"M2","tml_source":"L2","gate_type":"BLOCKING","stack_tag":"java_spring","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F2","disposition":"stack-adapter","framework_realization":{"template":"planned:src/templates/no-circular-dependencies-between-modules.ejs","generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N07","import_source":null,"origin":"arbiter-native"},{"id":8,"category":"Architecture","name":"Tamper-evident audit log insert-only rule (R-audit-insert-only)","detail":"Write service -> AuditEventService field. Mapper insert-only. record() call","tml":"M2","tml_source":"L2","gate_type":"BLOCKING","stack_tag":"java_spring","conditional":"always","planning_evidence_paths":["ArchitectureTests.java rules 36-39"],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F2","disposition":"stack-adapter","framework_realization":{"template":"planned:src/templates/audit-trail/archunit-r-36-r-38-r-39.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-075-archunit-r-36-r-38-r-39.md"},"planning_notes":"* Condizionale: se audit_event attivo","canonical_id":"N08","import_source":{"import_id":75,"import_name":"ArchUnit R-36/R-38/R-39"},"origin":"import"},{"id":9,"category":"Static Analysis","name":"Static analysis: linting (checkstyle/eslint/ruff/golangci-lint/clippy)","detail":"","tml":"M1","tml_source":"L1","gate_type":"BLOCKING","stack_tag":"java_spring","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F2","disposition":"stack-adapter","framework_realization":{"template":"planned:src/templates/static-analysis-linting-checkstyle-eslint-ruff-golangci-lint-clippy.ejs","generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N09","import_source":null,"origin":"arbiter-native"},{"id":10,"category":"Static Analysis","name":"Static analysis: formatting (spotless/prettier/black/gofmt/rustfmt)","detail":"Google Java Format AOSP. BLOCKING in CI","tml":"M1","tml_source":"L1","gate_type":"BLOCKING","stack_tag":"java_spring","conditional":"always","planning_evidence_paths":["pom.xml spotless-maven-plugin"],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F2","disposition":"stack-adapter","framework_realization":{"template":"planned:src/templates/java/static-analysis/spotless-formatting.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-010-spotless-formatting.md"},"planning_notes":"Universale, nessun adattamento","canonical_id":"N10","import_source":{"import_id":10,"import_name":"Spotless formatting"},"origin":"import"},{"id":11,"category":"Static Analysis","name":"PMD / Semgrep rules (complexity, security anti-patterns)","detail":"CognitiveComplexity&#8804;15, failOnViolation=true","tml":"M2","tml_source":"L2","gate_type":"ADVISORY","stack_tag":"java_spring","conditional":"always","planning_evidence_paths":["pom.xml + pmd-ruleset.xml"],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F2","disposition":"stack-adapter","framework_realization":{"template":"planned:src/templates/java/static-analysis/pmd-code-quality.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-012-pmd-code-quality.md"},"planning_notes":"Adattare ruleset se troppe violazioni iniziali","canonical_id":"N11","import_source":{"import_id":12,"import_name":"PMD code quality"},"origin":"import"},{"id":12,"category":"Static Analysis","name":"SpotBugs / null-safety analysis","detail":"Effort=Max, Threshold=Medium, baseline diff","tml":"M2","tml_source":"L2","gate_type":"ADVISORY","stack_tag":"java_spring","conditional":"always","planning_evidence_paths":["pom.xml spotbugs-maven-plugin"],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F2","disposition":"stack-adapter","framework_realization":{"template":"planned:src/templates/java/static-analysis/spotbugs-bug-detection.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-011-spotbugs-bug-detection.md"},"planning_notes":"Generare baseline XML prima di attivare gate","canonical_id":"N12","import_source":{"import_id":11,"import_name":"SpotBugs bug detection"},"origin":"import"},{"id":13,"category":"Static Analysis","name":"Cyclomatic complexity gate","detail":"Custom config, CC&#8804;15, failsOnError=true","tml":"M2","tml_source":"L2","gate_type":"ADVISORY","stack_tag":"java_spring","conditional":"always","planning_evidence_paths":["pom.xml + checkstyle.xml"],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F2","disposition":"stack-adapter","framework_realization":{"template":"planned:src/templates/java/static-analysis/checkstyle-style-enforcement.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-013-checkstyle-style-enforcement.md"},"planning_notes":null,"canonical_id":"N13","import_source":{"import_id":13,"import_name":"Checkstyle style enforcement"},"origin":"import"},{"id":14,"category":"Static Analysis","name":"Dead code detection","detail":"","tml":"M3","tml_source":"L2","gate_type":"ADVISORY","stack_tag":"java_spring","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F2","disposition":"stack-adapter","framework_realization":{"template":null,"generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N14","import_source":null,"origin":"arbiter-native"},{"id":15,"category":"Static Analysis","name":"Code duplication ratchet (jscpd / equivalent)","detail":"","tml":"M2","tml_source":"L2","gate_type":"ADVISORY","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":".github/workflows/06-nightly.yml","arbiter_target_kind":"workflow","invariant_id":null,"implementing_wave":"W9","disposition":"adopt-framework","framework_realization":{"template":null,"generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N15","import_source":null,"origin":"arbiter-native"},{"id":16,"category":"Static Analysis","name":"Style token enforcement (design tokens / style guide)","detail":"","tml":"M3","tml_source":"L3","gate_type":"ADVISORY","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":".github/workflows/05-release.yml","arbiter_target_kind":"workflow","invariant_id":null,"implementing_wave":"W9","disposition":"adopt-framework","framework_realization":{"template":null,"generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N16","import_source":null,"origin":"arbiter-native"},{"id":17,"category":"Test Framework","name":"Unit test framework wired (JUnit5/Vitest/pytest/go test/cargo test)","detail":"Framework base. @SpringBootTest con profili","tml":"M1","tml_source":"L1","gate_type":"BLOCKING","stack_tag":"java_spring","conditional":"always","planning_evidence_paths":["pom.xml spring-boot-starter-test"],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F2","disposition":"stack-adapter","framework_realization":{"template":"planned:src/templates/java/test-framework/junit-5-spring-boot-test.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-017-junit-5-spring-boot-test.md"},"planning_notes":">=1 test per proof-of-life a L1","canonical_id":"N17","import_source":{"import_id":17,"import_name":"JUnit 5 + Spring Boot Test"},"origin":"import"},{"id":18,"category":"Test Framework","name":"Code coverage gate (JaCoCo/V8/coverage.py/go cover/cargo-tarpaulin)","detail":"L1: report only. L2: >=20% o new-code >=70%. L3: >=60%","tml":"M2","tml_source":"L2","gate_type":"BLOCKING","stack_tag":"java_spring","conditional":"always","planning_evidence_paths":["pom.xml jacoco-maven-plugin"],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F2","disposition":"stack-adapter","framework_realization":{"template":"planned:src/templates/java/static-analysis/jacoco-coverage-gate.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-009-jacoco-coverage-gate.md"},"planning_notes":"Soglia progressiva: +5%/2sett","canonical_id":"N18","import_source":{"import_id":9,"import_name":"JaCoCo coverage gate"},"origin":"import"},{"id":19,"category":"Test Framework","name":"Coverage trend ratchet (no regression allowed)","detail":"","tml":"M2","tml_source":"L2","gate_type":"BLOCKING","stack_tag":"java_spring","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F2","disposition":"stack-adapter","framework_realization":{"template":"planned:src/templates/coverage-trend-ratchet-no-regression-allowed.ejs","generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N19","import_source":null,"origin":"arbiter-native"},{"id":20,"category":"Test Framework","name":"Mutation testing (pitest/stryker/mutmut/go-mutesting/cargo-mutants)","detail":"STRONGER mutators, target >=50%. Nightly only","tml":"M3","tml_source":"L3","gate_type":"ADVISORY","stack_tag":"java_spring","conditional":"crossdb","planning_evidence_paths":["pom.xml pitest-maven-plugin"],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F2","disposition":"stack-adapter","framework_realization":{"template":"planned:src/templates/java/static-analysis/pitest-mutation-testing.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-014-pitest-mutation-testing.md"},"planning_notes":"Non in PR gate (troppo lento)","canonical_id":"N20","import_source":{"import_id":14,"import_name":"PITest mutation testing"},"origin":"import"},{"id":21,"category":"Test Framework","name":"Test isolation — no shared mutable state between tests","detail":"","tml":"M3","tml_source":"L1","gate_type":"BLOCKING","stack_tag":"java_spring","conditional":"concurrent","planning_evidence_paths":[],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F2","disposition":"stack-adapter","framework_realization":{"template":"planned:src/templates/test-isolation-no-shared-mutable-state-between-tests.ejs","generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N21","import_source":null,"origin":"arbiter-native"},{"id":22,"category":"Test Framework","name":"Test naming convention enforced","detail":"","tml":"M3","tml_source":"L1","gate_type":"BLOCKING","stack_tag":"java_spring","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F2","disposition":"stack-adapter","framework_realization":{"template":"planned:src/templates/test-naming-convention-enforced.ejs","generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N22","import_source":null,"origin":"arbiter-native"},{"id":23,"category":"Test Framework","name":"Test TDD evidence captured (W4 protocol)","detail":"","tml":"M2","tml_source":"L2","gate_type":"ADVISORY","stack_tag":"java_spring","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F2","disposition":"stack-adapter","framework_realization":{"template":null,"generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N23","import_source":null,"origin":"arbiter-native"},{"id":24,"category":"Test Profiles","name":"Fast test profile (L1 unit only, <2 min)","detail":"behavioral, edge-case, contract, full, noauth, noliquibase","tml":"M2","tml_source":"L2","gate_type":"BLOCKING","stack_tag":"java_spring","conditional":"always","planning_evidence_paths":["pom.xml <profiles>"],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F2","disposition":"stack-adapter","framework_realization":{"template":"planned:src/templates/java/build-profiles/surefire-profiles-maven.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-024-surefire-profiles-maven.md"},"planning_notes":"Attivare progressivamente","canonical_id":"N24","import_source":{"import_id":24,"import_name":"Surefire profiles Maven"},"origin":"import"},{"id":25,"category":"Test Profiles","name":"Extended test profile (L2: unit + integration)","detail":"","tml":"M3","tml_source":"L2","gate_type":"BLOCKING","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":"docs/TEST_TAXONOMY.md","arbiter_target_kind":"doc","invariant_id":null,"implementing_wave":"W7","disposition":"adopt-framework","framework_realization":{"template":null,"generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N25","import_source":null,"origin":"arbiter-native"},{"id":26,"category":"Test Profiles","name":"Nightly/weekly test profile (L3: full suite + mutation + security)","detail":"check (~2min) | gate (~8min) | full (~30min). Sub-comandi singoli","tml":"M1","tml_source":"L3","gate_type":"BLOCKING","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":["run.sh"],"arbiter_target_path":"run.sh","arbiter_target_kind":"script","invariant_id":null,"implementing_wave":"W3","disposition":"adopt-self","framework_realization":{"template":null,"generator":null,"validator":"planned:scripts/run-sh-orchestrator.mjs","docs":"docs/REFERENCE/dim-026-run-sh-orchestrator.md"},"planning_notes":"L1: solo check. L2: +gate. L3: +full","canonical_id":"N26","import_source":{"import_id":26,"import_name":"run.sh orchestrator"},"origin":"import"},{"id":27,"category":"Test Types","name":"Integration tests (Spring IT / testcontainers / real-project fixtures)","detail":"Controller test con DB reale. >=60 test file a L3","tml":"M1","tml_source":"L1","gate_type":"BLOCKING","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":["pom.xml rest-assured + BaseIntegrationTest"],"arbiter_target_path":null,"arbiter_target_kind":"doc","invariant_id":null,"implementing_wave":"W7","disposition":"adopt-framework","framework_realization":{"template":"planned:src/templates/java/test-framework/rest-assured-integration-tests.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-018-rest-assured-integration-tests.md"},"planning_notes":"Iniziare dai top 5 endpoint","canonical_id":"N27","import_source":{"import_id":18,"import_name":"REST Assured integration tests"},"origin":"import"},{"id":28,"category":"Test Types","name":"Contract tests (Spring Cloud Contract / Pact)","detail":"Contract test: validazione runtime vs OpenAPI spec","tml":"M3","tml_source":"L2","gate_type":"ADVISORY","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":["pom.xml swagger-request-validator-restassured"],"arbiter_target_path":null,"arbiter_target_kind":"doc","invariant_id":null,"implementing_wave":"W7","disposition":"adopt-framework","framework_realization":{"template":"planned:src/templates/java/test-framework/swagger-request-validator.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-022-swagger-request-validator.md"},"planning_notes":"Richiede OpenAPI spec aggiornata","canonical_id":"N28","import_source":{"import_id":22,"import_name":"Swagger Request Validator"},"origin":"import"},{"id":29,"category":"Test Types","name":"BDD / behavioural tests (Cucumber / pytest-bdd / godog)","detail":"REST Assured end-to-end business flow. >=15 scenarios L3","tml":"M3","tml_source":"L2","gate_type":"ADVISORY","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":["src/test/.../behavior/"],"arbiter_target_path":null,"arbiter_target_kind":"doc","invariant_id":null,"implementing_wave":"W7","disposition":"adopt-framework","framework_realization":{"template":null,"generator":null,"validator":null,"docs":"docs/REFERENCE/dim-028-behavioral-tests-happy-path.md"},"planning_notes":"Flussi P0 business-critical","canonical_id":"N29","import_source":{"import_id":28,"import_name":"Behavioral tests (happy path)"},"origin":"import"},{"id":30,"category":"Test Types","name":"Architectural tests (ArchUnit / structure rules)","detail":"","tml":"M3","tml_source":"L2","gate_type":"BLOCKING","stack_tag":"template","conditional":"contract","planning_evidence_paths":[],"arbiter_target_path":null,"arbiter_target_kind":"template","invariant_id":null,"implementing_wave":"F7","disposition":"adopt-framework","framework_realization":{"template":"planned:src/templates/architectural-tests-archunit-structure-rules.ejs","generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N30","import_source":null,"origin":"arbiter-native"},{"id":31,"category":"Test Types","name":"Fuzz testing (Jazzer / go-fuzz / cargo-fuzz)","detail":"","tml":"M3","tml_source":"L3","gate_type":"ADVISORY","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":null,"arbiter_target_kind":"doc","invariant_id":null,"implementing_wave":"W7","disposition":"adopt-framework","framework_realization":{"template":null,"generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N31","import_source":null,"origin":"arbiter-native"},{"id":32,"category":"Test Types","name":"Property-based testing (QuickCheck / Hypothesis / proptest)","detail":"","tml":"M3","tml_source":"L3","gate_type":"ADVISORY","stack_tag":"java_spring","conditional":"crossdb","planning_evidence_paths":[],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F2","disposition":"stack-adapter","framework_realization":{"template":null,"generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N32","import_source":null,"origin":"arbiter-native"},{"id":33,"category":"Test Types","name":"Snapshot / golden-file tests","detail":"","tml":"M3","tml_source":"L2","gate_type":"ADVISORY","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":null,"arbiter_target_kind":"doc","invariant_id":null,"implementing_wave":"W7","disposition":"adopt-framework","framework_realization":{"template":null,"generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N33","import_source":null,"origin":"arbiter-native"},{"id":34,"category":"CI/CD","name":"Multi-tier CI pipeline (fast → extended → release → nightly → weekly)","detail":"5 stage: lint->build->fast-test->slow-test->ship","tml":"M2","tml_source":"L2","gate_type":"BLOCKING","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":[".github/workflows/build.yml"],"arbiter_target_path":".github/workflows/01-pr-fast.yml","arbiter_target_kind":"workflow","invariant_id":null,"implementing_wave":"W4","disposition":"adopt-framework","framework_realization":{"template":null,"generator":null,"validator":null,"docs":"docs/REFERENCE/dim-034-build-yml-multi-stage.md"},"planning_notes":"L2: 4 stage (no ship). L3: 5 stage","canonical_id":"N34","import_source":{"import_id":34,"import_name":"build.yml multi-stage"},"origin":"import"},{"id":35,"category":"CI/CD","name":"PR fast-feedback gate (<5 min, L1 checks only)","detail":"Primo job: validate-*.sh. Fast fail","tml":"M2","tml_source":"L2","gate_type":"BLOCKING","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":["build.yml quality-gates job"],"arbiter_target_path":".github/workflows/01-pr-fast.yml","arbiter_target_kind":"workflow","invariant_id":null,"implementing_wave":"W4","disposition":"adopt-framework","framework_realization":{"template":null,"generator":null,"validator":null,"docs":"docs/REFERENCE/dim-035-quality-gates-job-bash-scripts.md"},"planning_notes":"Aggiungere script man mano che disponibili","canonical_id":"N35","import_source":{"import_id":35,"import_name":"Quality gates job (bash scripts)"},"origin":"import"},{"id":36,"category":"CI/CD","name":"Release pipeline (tag-triggered, artifact signing)","detail":"Docker build, Trivy CRITICAL fail, {{CONTAINER_REGISTRY}} push, Azure deploy","tml":"M3","tml_source":"L3","gate_type":"BLOCKING","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":["build.yml ship stage"],"arbiter_target_path":".github/workflows/06-nightly.yml","arbiter_target_kind":"workflow","invariant_id":null,"implementing_wave":"W10","disposition":"adopt-framework","framework_realization":{"template":null,"generator":null,"validator":null,"docs":"docs/REFERENCE/dim-037-ship-stage-docker-trivy-container-r.md"},"planning_notes":"Solo servizi con deploy containerizzato","canonical_id":"N36","import_source":{"import_id":37,"import_name":"Ship stage (Docker+Trivy+{{CONTAINER_REGISTRY}}+deploy)"},"origin":"import"},{"id":37,"category":"CI/CD","name":"Nightly extended checks (mutation, DAST, performance baseline)","detail":">=6 jobs: OWASP, PITest, SBOM, ZAP, Toxiproxy, k6","tml":"M3","tml_source":"L3","gate_type":"ADVISORY","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":[".github/workflows/nightly.yml"],"arbiter_target_path":".github/workflows/05-release.yml","arbiter_target_kind":"workflow","invariant_id":null,"implementing_wave":"W9","disposition":"adopt-framework","framework_realization":{"template":null,"generator":null,"validator":null,"docs":"docs/REFERENCE/dim-036-nightly-pipeline.md"},"planning_notes":"Aggiungere job incrementalmente","canonical_id":"N37","import_source":{"import_id":36,"import_name":"Nightly pipeline"},"origin":"import"},{"id":38,"category":"CI/CD","name":"Weekly audit pipeline (dependency audit, license scan, SBOM refresh)","detail":"","tml":"M3","tml_source":"L3","gate_type":"ADVISORY","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":".github/workflows/zz-issue-state.yml","arbiter_target_kind":"workflow","invariant_id":null,"implementing_wave":"W8","disposition":"adopt-framework","framework_realization":{"template":null,"generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N38","import_source":null,"origin":"arbiter-native"},{"id":39,"category":"CI/CD","name":"CI runner label SSOT (no hardcoded runner strings)","detail":"","tml":"M3","tml_source":"L2","gate_type":"BLOCKING","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":".github/workflows/10-k6-on-demand.yml","arbiter_target_kind":"workflow","invariant_id":null,"implementing_wave":"W6","disposition":"adopt-framework","framework_realization":{"template":null,"generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N39","import_source":null,"origin":"arbiter-native"},{"id":40,"category":"CI/CD","name":"Artifact provenance (SLSA / sigstore)","detail":"","tml":"M3","tml_source":"L3","gate_type":"BLOCKING","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":".github/workflows/_newman-runner.yml","arbiter_target_kind":"workflow","invariant_id":null,"implementing_wave":"W7","disposition":"adopt-framework","framework_realization":{"template":null,"generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N40","import_source":null,"origin":"arbiter-native"},{"id":41,"category":"E2E & Perf","name":"E2E API tests (RestAssured / Playwright / pytest-playwright)","detail":">=20 scenari CRUD + business flow. Auth Keycloak-compatible IdP","tml":"M3","tml_source":"L3","gate_type":"BLOCKING","stack_tag":"template","conditional":"always","planning_evidence_paths":["docs/api/{service}.postman_collection.json"],"arbiter_target_path":null,"arbiter_target_kind":"template","invariant_id":null,"implementing_wave":"F7","disposition":"adopt-framework","framework_realization":{"template":"planned:src/templates/test-tooling/newman-postman-e2e-collection.ejs","generator":"planned:src/generators/newman-postman-e2e-collection.ts","validator":null,"docs":"docs/REFERENCE/dim-041-newman-postman-e2e-collection.md"},"planning_notes":"Servizio-specifico","canonical_id":"N41","import_source":{"import_id":41,"import_name":"Newman/Postman E2E collection"},"origin":"import"},{"id":42,"category":"E2E & Perf","name":"Performance / load testing baseline (k6 / Locust / Gatling)","detail":">=5 scenari. Threshold p95<500ms, error<1%","tml":"M3","tml_source":"L3","gate_type":"ADVISORY","stack_tag":"template","conditional":"always","planning_evidence_paths":["tests/load/*.js"],"arbiter_target_path":null,"arbiter_target_kind":"template","invariant_id":null,"implementing_wave":"F6","disposition":"adopt-framework","framework_realization":{"template":"planned:src/templates/test-tooling/k6-load-test-suite.ejs","generator":"planned:src/generators/k6-load-test-suite.ts","validator":null,"docs":"docs/REFERENCE/dim-042-k6-load-test-suite.md"},"planning_notes":"Servizio-specifico","canonical_id":"N42","import_source":{"import_id":42,"import_name":"k6 load test suite"},"origin":"import"},{"id":43,"category":"E2E & Perf","name":"DAST scan (OWASP ZAP / Nuclei)","detail":"OWASP ZAP scan autenticato. Nightly","tml":"M3","tml_source":"L3","gate_type":"ADVISORY","stack_tag":"template","conditional":"always","planning_evidence_paths":["nightly.yml zap-dast job"],"arbiter_target_path":null,"arbiter_target_kind":"template","invariant_id":null,"implementing_wave":"F6","disposition":"adopt-framework","framework_realization":{"template":"planned:src/templates/test-tooling/dast-zap-authenticated.ejs","generator":"planned:src/generators/dast-zap-authenticated.ts","validator":null,"docs":"docs/REFERENCE/dim-044-dast-zap-authenticated.md"},"planning_notes":"Richiede auth config ZAP","canonical_id":"N43","import_source":{"import_id":44,"import_name":"DAST (ZAP authenticated)"},"origin":"import"},{"id":44,"category":"E2E & Perf","name":"Auth flow E2E (Keycloak-compatible IdP integration test)","detail":"","tml":"M3","tml_source":"L3","gate_type":"ADVISORY","stack_tag":"template","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":null,"arbiter_target_kind":"template","invariant_id":null,"implementing_wave":"F8","disposition":"adopt-framework","framework_realization":{"template":null,"generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N44","import_source":null,"origin":"arbiter-native"},{"id":45,"category":"Scripts Validation","name":"Format validation script (check-format.sh equivalent)","detail":"","tml":"M1","tml_source":"L1","gate_type":"BLOCKING","stack_tag":"java_spring","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F2","disposition":"stack-adapter","framework_realization":{"template":"planned:src/templates/format-validation-script-check-format-sh-equivalent.ejs","generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N45","import_source":null,"origin":"arbiter-native"},{"id":46,"category":"Scripts Validation","name":"SPDX license header check","detail":"","tml":"M1","tml_source":"L1","gate_type":"BLOCKING","stack_tag":"java_spring","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F2","disposition":"stack-adapter","framework_realization":{"template":"planned:src/templates/spdx-license-header-check.ejs","generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N46","import_source":null,"origin":"arbiter-native"},{"id":47,"category":"Scripts Validation","name":"Orphan TODO check (no bare TODOs without task IDs)","detail":"","tml":"M2","tml_source":"L1","gate_type":"BLOCKING","stack_tag":"java_spring","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F2","disposition":"stack-adapter","framework_realization":{"template":"planned:src/templates/orphan-todo-check-no-bare-todos-without-task-ids.ejs","generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N47","import_source":null,"origin":"arbiter-native"},{"id":48,"category":"Scripts Validation","name":"Placeholder check (no template placeholders committed)","detail":"","tml":"M3","tml_source":"L1","gate_type":"BLOCKING","stack_tag":"template","conditional":"contract","planning_evidence_paths":[],"arbiter_target_path":null,"arbiter_target_kind":"template","invariant_id":null,"implementing_wave":"F7","disposition":"adopt-framework","framework_realization":{"template":"planned:src/templates/placeholder-check-no-template-placeholders-committed.ejs","generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N48","import_source":null,"origin":"arbiter-native"},{"id":49,"category":"Scripts Validation","name":"Dead link / doc link integrity check","detail":"","tml":"M3","tml_source":"L2","gate_type":"ADVISORY","stack_tag":"template","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":null,"arbiter_target_kind":"template","invariant_id":null,"implementing_wave":"F6","disposition":"adopt-framework","framework_realization":{"template":null,"generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N49","import_source":null,"origin":"arbiter-native"},{"id":50,"category":"Scripts Validation","name":"Bloat ratchet (bundle size / generated artifact size)","detail":"","tml":"M3","tml_source":"L2","gate_type":"ADVISORY","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":"scripts/check-drift.mjs","arbiter_target_kind":"script","invariant_id":null,"implementing_wave":"W6","disposition":"adopt-self","framework_realization":{"template":null,"generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N50","import_source":null,"origin":"arbiter-native"},{"id":51,"category":"Scripts Quality","name":"Debt ratchet (tech-debt score gate)","detail":"","tml":"M2","tml_source":"L1","gate_type":"ADVISORY","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":"scripts/debt-report.mjs","arbiter_target_kind":"script","invariant_id":null,"implementing_wave":"W6","disposition":"adopt-self","framework_realization":{"template":null,"generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N51","import_source":null,"origin":"arbiter-native"},{"id":52,"category":"Scripts Quality","name":"Self-dogfood check (arbiter validates itself)","detail":"","tml":"M2","tml_source":"L1","gate_type":"BLOCKING","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":"scripts/check-self-dogfood.mjs","arbiter_target_kind":"script","invariant_id":null,"implementing_wave":"W6","disposition":"adopt-self","framework_realization":{"template":"planned:src/templates/self-dogfood-check-arbiter-validates-itself.ejs","generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N52","import_source":null,"origin":"arbiter-native"},{"id":53,"category":"Scripts Quality","name":"API snapshot test (no unintended public surface changes)","detail":"","tml":"M2","tml_source":"L2","gate_type":"BLOCKING","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":"scripts/check-api-snapshot.mjs","arbiter_target_kind":"script","invariant_id":null,"implementing_wave":"W6","disposition":"adopt-self","framework_realization":{"template":"planned:src/templates/api-snapshot-test-no-unintended-public-surface-changes.ejs","generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N53","import_source":null,"origin":"arbiter-native"},{"id":54,"category":"Scripts Quality","name":"Circular dependency detection","detail":"","tml":"M1","tml_source":"L1","gate_type":"BLOCKING","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":"scripts/check-pii-scan.mjs","arbiter_target_kind":"script","invariant_id":null,"implementing_wave":"W6","disposition":"adopt-self","framework_realization":{"template":"planned:src/templates/circular-dependency-detection.ejs","generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N54","import_source":null,"origin":"arbiter-native"},{"id":55,"category":"Security","name":"Secret scanning (Gitleaks)","detail":"gitleaks protect --staged. BLOCKING locale","tml":"M1","tml_source":"L1","gate_type":"BLOCKING","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":[".githooks/pre-commit"],"arbiter_target_path":".githooks/pre-commit","arbiter_target_kind":"hook","invariant_id":null,"implementing_wave":"W6","disposition":"adopt-framework","framework_realization":{"template":null,"generator":null,"validator":null,"docs":"docs/REFERENCE/dim-055-gitleaks-pre-commit-hook.md"},"planning_notes":"Universale","canonical_id":"N55","import_source":{"import_id":55,"import_name":"Gitleaks pre-commit hook"},"origin":"import"},{"id":56,"category":"Security","name":"Dependency audit (npm audit / trivy fs / cargo audit)","detail":"failBuildOnCVSS=7.0. Nightly (rate limits NVD)","tml":"M3","tml_source":"L2","gate_type":"BLOCKING","stack_tag":"java_spring","conditional":"always","planning_evidence_paths":["pom.xml dependency-check-maven"],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F2","disposition":"stack-adapter","framework_realization":{"template":"planned:src/templates/dependency-audit-npm-audit-trivy-fs-cargo-audit.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-015-owasp-dependency-check.md"},"planning_notes":"Tollerare rate limits con continue-on-error SOLO su download","canonical_id":"N56","import_source":{"import_id":15,"import_name":"OWASP dependency-check"},"origin":"import"},{"id":57,"category":"Security","name":"Container image scan (Trivy)","detail":"Documented false positive suppressions","tml":"M3","tml_source":"L3","gate_type":"BLOCKING","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":[".trivyignore, .zap/rules.tsv"],"arbiter_target_path":null,"arbiter_target_kind":"template","invariant_id":null,"implementing_wave":"W9","disposition":"adopt-framework","framework_realization":{"template":null,"generator":null,"validator":null,"docs":"docs/REFERENCE/dim-057--trivyignore-zap-rules-tsv.md"},"planning_notes":"Solo se Trivy/ZAP attivi","canonical_id":"N57","import_source":{"import_id":57,"import_name":".trivyignore + .zap/rules.tsv"},"origin":"import"},{"id":58,"category":"Security","name":"License scan (FOSSA / ORT / licensee)","detail":"","tml":"M3","tml_source":"L3","gate_type":"ADVISORY","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":null,"arbiter_target_kind":"template","invariant_id":null,"implementing_wave":"W9","disposition":"adopt-framework","framework_realization":{"template":null,"generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N58","import_source":null,"origin":"arbiter-native"},{"id":59,"category":"Git & GitHub","name":"Commit message format enforced (commitlint)","detail":"pre-commit (Gitleaks), commit-msg (commitlint), pre-push (run.sh)","tml":"M1","tml_source":"L1","gate_type":"BLOCKING","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":[".githooks/ + scripts/setup-hooks.sh"],"arbiter_target_path":null,"arbiter_target_kind":"template","invariant_id":null,"implementing_wave":null,"disposition":"done","framework_realization":{"template":null,"generator":null,"validator":null,"docs":"docs/REFERENCE/dim-059-git-hooks-githooks-3-hooks.md"},"planning_notes":"Opt-in via setup-hooks.sh","canonical_id":"N59","import_source":{"import_id":59,"import_name":"Git hooks (.githooks/ 3 hooks)"},"origin":"import"},{"id":60,"category":"Git & GitHub","name":"Branch naming convention enforced","detail":"","tml":"M1","tml_source":"L1","gate_type":"BLOCKING","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":null,"arbiter_target_kind":"template","invariant_id":null,"implementing_wave":"W4","disposition":"adopt-framework","framework_realization":{"template":null,"generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N60","import_source":null,"origin":"arbiter-native"},{"id":61,"category":"Git & GitHub","name":"PR template (description, test plan, checklist)","detail":"Quality checklist ISO P23/P10/P12","tml":"M1","tml_source":"L1","gate_type":"ADVISORY","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":[".github/pull_request_template.md"],"arbiter_target_path":null,"arbiter_target_kind":"template","invariant_id":null,"implementing_wave":"W8","disposition":"adopt-framework","framework_realization":{"template":null,"generator":null,"validator":null,"docs":"docs/REFERENCE/dim-061-github-pr-template.md"},"planning_notes":"Copiare 1:1","canonical_id":"N61","import_source":{"import_id":61,"import_name":"GitHub PR template"},"origin":"import"},{"id":62,"category":"Git & GitHub","name":"Issue templates (bug, feature, tech-debt)","detail":"bug-report.yml, feature-request.yml, compliance-item.yml + config","tml":"M1","tml_source":"L1","gate_type":"ADVISORY","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":[".github/ISSUE_TEMPLATE/"],"arbiter_target_path":null,"arbiter_target_kind":"template","invariant_id":null,"implementing_wave":"DONE","disposition":"done","framework_realization":{"template":null,"generator":null,"validator":null,"docs":"docs/REFERENCE/dim-060-github-issue-templates-3-types.md"},"planning_notes":"Copiare 1:1","canonical_id":"N62","import_source":{"import_id":60,"import_name":"GitHub issue templates (3 types)"},"origin":"import"},{"id":63,"category":"Documentation","name":"AGENTS.md / CLAUDE.md governance document","detail":"Regole gold standard + contesto servizio","tml":"M2","tml_source":"L2","gate_type":"BLOCKING","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":["CLAUDE.md"],"arbiter_target_path":null,"arbiter_target_kind":"doc","invariant_id":null,"implementing_wave":"DONE","disposition":"done","framework_realization":{"template":null,"generator":null,"validator":null,"docs":"docs/REFERENCE/dim-069-claude-md-with-p1-p28.md"},"planning_notes":"Personalizzare contesto servizio","canonical_id":"N63","import_source":{"import_id":69,"import_name":"CLAUDE.md with P1-P28"},"origin":"import"},{"id":64,"category":"Documentation","name":"CI/CD developer reference card","detail":"Reference card: workflow attivi/passivi, PR lifecycle, run.sh mapping, troubleshooting. Template: TPL_cicd-developer-reference","tml":"M3","tml_source":"L2","gate_type":"ADVISORY","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":["docs/ci/README.md"],"arbiter_target_path":"docs/TEST_TAXONOMY.md","arbiter_target_kind":"doc","invariant_id":null,"implementing_wave":"W7","disposition":"adopt-framework","framework_realization":{"template":null,"generator":null,"validator":null,"docs":"docs/REFERENCE/dim-076-docs-ci-readme-md-ci-cd-developer-r.md"},"planning_notes":null,"canonical_id":"N64","import_source":{"import_id":76,"import_name":"docs/ci/README.md -- CI/CD Developer Reference"},"origin":"import"},{"id":65,"category":"Documentation","name":"Architecture decision records (ADRs)","detail":"Decisioni servizio-specifiche + cross-service refs","tml":"M3","tml_source":"L2","gate_type":"ADVISORY","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":["docs/adr/ADR-*.md"],"arbiter_target_path":null,"arbiter_target_kind":"doc","invariant_id":null,"implementing_wave":"DONE","disposition":"done","framework_realization":{"template":null,"generator":null,"validator":null,"docs":"docs/REFERENCE/dim-065-docs-adr-5-adr.md"},"planning_notes":"Almeno ADR-016/017/018/019","canonical_id":"N65","import_source":{"import_id":65,"import_name":"docs/adr/ (>=5 ADR)"},"origin":"import"},{"id":66,"category":"Documentation","name":"API / OpenAPI specification","detail":"openapi-v1.json + collection + environment","tml":"M3","tml_source":"L3","gate_type":"ADVISORY","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":["docs/api/"],"arbiter_target_path":null,"arbiter_target_kind":"doc","invariant_id":null,"implementing_wave":"DONE","disposition":"done","framework_realization":{"template":null,"generator":null,"validator":null,"docs":"docs/REFERENCE/dim-067-docs-api-openapi-postman-env.md"},"planning_notes":"JSON generato da springdoc-openapi","canonical_id":"N66","import_source":{"import_id":67,"import_name":"docs/api/ (OpenAPI + Postman + env)"},"origin":"import"},{"id":67,"category":"Documentation","name":"Runbook (operational playbook for oncall)","detail":"rollback, troubleshooting, error-codes, faq, known-issues","tml":"M3","tml_source":"L3","gate_type":"ADVISORY","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":["docs/runbooks/, docs/support/"],"arbiter_target_path":null,"arbiter_target_kind":"doc","invariant_id":null,"implementing_wave":"W9","disposition":"adopt-framework","framework_realization":{"template":null,"generator":null,"validator":null,"docs":"docs/REFERENCE/dim-068-runbooks-support-docs.md"},"planning_notes":null,"canonical_id":"N67","import_source":{"import_id":68,"import_name":"Runbooks + support docs"},"origin":"import"},{"id":68,"category":"Documentation","name":"Knowledge map (cross-repo canonical paths and signal sources)","detail":"","tml":"M3","tml_source":"L3","gate_type":"ADVISORY","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":null,"arbiter_target_kind":"doc","invariant_id":null,"implementing_wave":"DONE","disposition":"done","framework_realization":{"template":null,"generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N68","import_source":null,"origin":"arbiter-native"},{"id":69,"category":"Configuration","name":"Runtime version SSOT (node version pinned, .nvmrc aligned)","detail":"","tml":"M1","tml_source":"L1","gate_type":"BLOCKING","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":null,"arbiter_target_kind":"doc","invariant_id":null,"implementing_wave":null,"disposition":"done","framework_realization":{"template":null,"generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N69","import_source":null,"origin":"arbiter-native"},{"id":70,"category":"Configuration","name":"Environment variable safety (.env.example only, no real .env committed)","detail":".env.local.example, .env.{{TEST_ENV}}.local.example","tml":"M3","tml_source":"L1","gate_type":"BLOCKING","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":[".env.*.example"],"arbiter_target_path":"src/templates/env/.env.example.ejs","arbiter_target_kind":"template","invariant_id":null,"implementing_wave":"W3","disposition":"adopt-framework","framework_realization":{"template":null,"generator":"planned:src/generators/-env-example-files.ts","validator":null,"docs":"docs/REFERENCE/dim-070--env-example-files.md"},"planning_notes":"MAI committare .env reali","canonical_id":"N70","import_source":{"import_id":70,"import_name":".env example files"},"origin":"import"},{"id":71,"category":"Configuration","name":"Feature flag / experiment registry (no undocumented flags)","detail":"","tml":"M3","tml_source":"L2","gate_type":"ADVISORY","stack_tag":"java_spring","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F2","disposition":"stack-adapter","framework_realization":{"template":null,"generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N71","import_source":null,"origin":"arbiter-native"},{"id":72,"category":"Configuration","name":"Multi-environment config (dev/staging/prod parity)","detail":"","tml":"M1","tml_source":"L3","gate_type":"ADVISORY","stack_tag":"java_spring","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F2","disposition":"stack-adapter","framework_realization":{"template":null,"generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N72","import_source":null,"origin":"arbiter-native"},{"id":73,"category":"Audit Trail *","name":"Tamper-evident audit log table DDL (security-critical operations)","detail":"Append-only. BEFORE UPDATE/DELETE trigger. Liquibase changeset","tml":"M3","tml_source":"L3","gate_type":"BLOCKING","stack_tag":"java_spring","conditional":"pharma","planning_evidence_paths":["Liquibase changeset + trigger SQL"],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F5","disposition":"stack-adapter","framework_realization":{"template":"planned:src/templates/audit-trail/audit-event-table-db-triggers.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-073-audit-event-table-db-triggers.md"},"planning_notes":"* Solo servizi con write su dati. Raccomandata non-pharma","canonical_id":"N73","import_source":{"import_id":73,"import_name":"audit_event table + DB triggers"},"origin":"import"},{"id":74,"category":"Audit Trail *","name":"Audit trigger presence (DB-level audit trigger enforced)","detail":"","tml":"M3","tml_source":"L3","gate_type":"BLOCKING","stack_tag":"java_spring","conditional":"pharma","planning_evidence_paths":[],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F5","disposition":"stack-adapter","framework_realization":{"template":"planned:src/templates/audit-trigger-presence-db-level-audit-trigger-enforced.ejs","generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N74","import_source":null,"origin":"arbiter-native"},{"id":75,"category":"Audit Trail *","name":"Audit log service interface (AuditEventService / append-only repository pattern)","detail":"record() in ogni write @Transactional. Mapper insert-only","tml":"M3","tml_source":"L3","gate_type":"BLOCKING","stack_tag":"java_spring","conditional":"pharma","planning_evidence_paths":["service/AuditEventServiceImpl.java + mapper"],"arbiter_target_path":null,"arbiter_target_kind":"adapter","invariant_id":null,"implementing_wave":"F5","disposition":"stack-adapter","framework_realization":{"template":"planned:src/templates/audit-trail/auditeventservice-auditeventmapper.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-074-auditeventservice-auditeventmapper.md"},"planning_notes":"* Condizionale: se audit_event attivo","canonical_id":"N75","import_source":{"import_id":74,"import_name":"AuditEventService + AuditEventMapper"},"origin":"import"},{"id":76,"category":"Documentation","name":"Accessibility (a11y) audit (Axe / Lighthouse / pa11y)","detail":"","tml":"M2","tml_source":"L3","gate_type":"ADVISORY","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":[],"arbiter_target_path":"docs/REFERENCE/cicd-developer-reference.md","arbiter_target_kind":"doc","invariant_id":null,"implementing_wave":"W4","disposition":"adopt-framework","framework_realization":{"template":null,"generator":null,"validator":null,"docs":null},"planning_notes":null,"canonical_id":"N76","import_source":null,"origin":"arbiter-native"},{"id":77,"name":"Spring Modulith structural verification (ApplicationModules.verify())","detail":"Emits ApplicationModulesTest.java that calls ApplicationModules.of(...).verify() to detect illegal cross-module dependencies at test time.","tml":"L2","tml_source":"L2","gate_type":"BLOCKING","stack_tag":"java","conditional":"spring-boot","planning_evidence_paths":["src/test/java"],"arbiter_target_path":"src/test/java/{basePackage}/modulith/ApplicationModulesTest.java","arbiter_target_kind":"test","invariant_id":null,"implementing_wave":"W2","disposition":"generated","framework_realization":{"template":"planned:java/modulith/ApplicationModulesTest.java.ejs","generator":"src/generators/modulith.ts","validator":null,"docs":null},"planning_notes":null,"canonical_id":"N77","import_source":null,"origin":"arbiter-native"},{"id":78,"name":"Resilience patterns guide (circuit-breaker/retry/rate-limiter/timeout)","detail":"Emits docs/GOVERNANCE/RESILIENCE.md with circuit-breaker/retry/rate-limiter/timeout defaults and external-call checklist for backend archetypes.","tml":"L2","tml_source":"L2","gate_type":"ADVISORY","stack_tag":"agnostic","conditional":"always","planning_evidence_paths":["docs/GOVERNANCE/RESILIENCE.md"],"arbiter_target_path":"docs/GOVERNANCE/RESILIENCE.md","arbiter_target_kind":"doc","invariant_id":"INV-19","implementing_wave":"W4","disposition":"done","framework_realization":{"template":"planned:resilience/RESILIENCE.md.ejs","generator":"src/generators/resilience.ts","validator":null,"docs":"docs/REFERENCE/RESILIENCE.md"},"planning_notes":null,"canonical_id":"N78","import_source":null,"origin":"arbiter-native"}],"unmapped_import_dims":[{"import_id":4,"import_name":"API versioning /v1/ (P12)","detail":"context-path=/{servizio}, controller=/v1/{risorsa}","planning_evidence_paths":["application.yml + controller"],"framework_realization":{"template":"src/templates/java/architecture/api-versioning-v1-p12.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-004-api-versioning-v1-p12.md"},"planning_notes":"MAI /api come context-path"},{"import_id":5,"import_name":"DTO in package dto/ (P17-P19)","detail":"DTO separati Request/Response, MAI in Commons/model","planning_evidence_paths":["dto/*Request.java, dto/*Response.java"],"framework_realization":{"template":"src/templates/java/architecture/dto-in-package-dto-p17-p19.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-005-dto-in-package-dto-p17-p19.md"},"planning_notes":"Migrazione progressiva da Commons"},{"import_id":6,"import_name":"Constructor injection (P7)","detail":"@RequiredArgsConstructor. MAI @Autowired su campi","planning_evidence_paths":["Tutti i @Service/@Controller"],"framework_realization":{"template":"src/templates/java/architecture/constructor-injection-p7.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-006-constructor-injection-p7.md"},"planning_notes":"Controllare anche @Component"},{"import_id":7,"import_name":"Exception hierarchy RFC 7807 (P15)","detail":"{Service}Exception + ProblemDetail. MAI raw RuntimeException","planning_evidence_paths":["exception/{Service}Exception.java"],"framework_realization":{"template":"src/templates/java/architecture/exception-hierarchy-rfc-7807-p15.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-007-exception-hierarchy-rfc-7807-p15.md"},"planning_notes":"Planning: dedicated exception type extends common base exception"},{"import_id":16,"import_name":"CycloneDX SBOM","detail":"JSON output. Supply chain tracking","planning_evidence_paths":["pom.xml cyclonedx-maven-plugin"],"framework_realization":{"template":null,"generator":null,"validator":null,"docs":"docs/REFERENCE/dim-016-cyclonedx-sbom.md"},"planning_notes":null},{"import_id":19,"import_name":"Testcontainers PostgreSQL","detail":"DB reale in test. Sostituisce H2/mock","planning_evidence_paths":["pom.xml testcontainers + TestcontainersConfig"],"framework_realization":{"template":"src/templates/java/test-framework/testcontainers-postgresql.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-019-testcontainers-postgresql.md"},"planning_notes":null},{"import_id":20,"import_name":"Testcontainers MariaDB + MSSQL","detail":"Cross-DB compatibility. Profili dedicati","planning_evidence_paths":["pom.xml testcontainers + profili"],"framework_realization":{"template":"src/templates/java/test-framework/testcontainers-mariadb-mssql.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-020-testcontainers-mariadb-mssql.md"},"planning_notes":"Solo se servizio supporta multi-DB"},{"import_id":21,"import_name":"Testcontainers Toxiproxy","detail":"Resilience test: DB stall, latency injection","planning_evidence_paths":["DbStallResilienceTest.java"],"framework_realization":{"template":"src/templates/java/test-framework/testcontainers-toxiproxy.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-021-testcontainers-toxiproxy.md"},"planning_notes":"Non tutti i servizi necessitano"},{"import_id":23,"import_name":"Base test infrastructure","detail":"BaseIntegrationTest + TestDataFactory + JwtTestHelper + MockServicesConfig","planning_evidence_paths":["src/test/.../config/, factory/"],"framework_realization":{"template":"src/templates/java/test-framework/base-test-infrastructure.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-023-base-test-infrastructure.md"},"planning_notes":"Domain-specific, non copiare 1:1"},{"import_id":25,"import_name":"@Tag taxonomy (25 tags)","detail":"unit, integration, behavioral, edge-case, contract, etc. ArchUnit enforcement","planning_evidence_paths":["ArchitectureTests.java tag rules"],"framework_realization":{"template":null,"generator":null,"validator":null,"docs":"docs/REFERENCE/dim-025--tag-taxonomy-25-tags.md"},"planning_notes":"Iniziare con 10 tag base a L2"},{"import_id":27,"import_name":"Unit tests","detail":"L1: >=1 test. L2: >=20% coverage. L3: >=60%","planning_evidence_paths":["src/test/.../service/"],"framework_realization":{"template":null,"generator":null,"validator":null,"docs":"docs/REFERENCE/dim-027-unit-tests.md"},"planning_notes":"Coverage-first brownfield: documentare prima"},{"import_id":29,"import_name":"Edge-case tests (boundary)","detail":"Null, overflow, boundary conditions","planning_evidence_paths":["src/test/.../boundary/"],"framework_realization":{"template":null,"generator":null,"validator":null,"docs":"docs/REFERENCE/dim-029-edge-case-tests-boundary.md"},"planning_notes":null},{"import_id":30,"import_name":"Contract tests (OpenAPI)","detail":"Swagger Request Validator runtime. OpenApiRuntimeValidationTest","planning_evidence_paths":["src/test/.../contract/"],"framework_realization":{"template":"src/templates/testing/contract-tests-openapi.ejs","generator":"src/generators/contract-tests-openapi.ts","validator":null,"docs":"docs/REFERENCE/dim-030-contract-tests-openapi.md"},"planning_notes":null},{"import_id":31,"import_name":"Concurrent/stress tests","detail":"Thread safety, race condition, burst. @Tag('concurrency')","planning_evidence_paths":["ConcurrentBookingTest, BatchStressTest"],"framework_realization":{"template":null,"generator":null,"validator":null,"docs":"docs/REFERENCE/dim-031-concurrent-stress-tests.md"},"planning_notes":"Solo servizi con logica concorrente"},{"import_id":32,"import_name":"Migration tests (Liquibase rollback)","detail":"Rollback changeset, cross-DB. >=5 classi","planning_evidence_paths":["src/test/.../migration/"],"framework_realization":{"template":"src/templates/testing/migration-tests-liquibase-rollback.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-032-migration-tests-liquibase-rollback.md"},"planning_notes":"Testcontainers PG+MariaDB+MSSQL"},{"import_id":33,"import_name":"Performance Surefire tests","detail":"@Tag('performance'). Stress unit test. >=2 classi","planning_evidence_paths":["src/test/.../stress/"],"framework_realization":{"template":null,"generator":null,"validator":null,"docs":"docs/REFERENCE/dim-033-performance-surefire-tests.md"},"planning_notes":"Diverso da k6 (Surefire, non HTTP)"},{"import_id":38,"import_name":"issue-state.yml automation","detail":"Lifecycle issue: In Progress->In Review->Staged->Done","planning_evidence_paths":[".github/workflows/issue-state.yml"],"framework_realization":{"template":null,"generator":null,"validator":null,"docs":"docs/REFERENCE/dim-038-issue-state-yml-automation.md"},"planning_notes":"Copiare 1:1 da Planning"},{"import_id":39,"import_name":"Load test workflows","detail":"Manual trigger per singoli k6 test + weekly scheduled","planning_evidence_paths":[".github/workflows/load-*.yml"],"framework_realization":{"template":null,"generator":null,"validator":null,"docs":"docs/REFERENCE/dim-039-load-test-workflows.md"},"planning_notes":"Solo se k6 configurato"},{"import_id":40,"import_name":"Newman CI integration","detail":"Run Postman collection in CI. Gate su assertion","planning_evidence_paths":["build.yml / nightly.yml"],"framework_realization":{"template":null,"generator":null,"validator":null,"docs":"docs/REFERENCE/dim-040-newman-ci-integration.md"},"planning_notes":"Richiede collection Postman"},{"import_id":43,"import_name":"k6 endurance test (30min)","detail":"Memory/thread leak detection. LT-11 pattern","planning_evidence_paths":["tests/load/endurance.js"],"framework_realization":{"template":"src/templates/test-tooling/k6-endurance-test-30min.ejs","generator":"src/generators/k6-endurance-test-30min.ts","validator":null,"docs":"docs/REFERENCE/dim-043-k6-endurance-test-30min.md"},"planning_notes":null},{"import_id":45,"import_name":"validate-mybatis-xml-crud.sh","detail":"#{param} check (no ${param} SQL injection). P16","planning_evidence_paths":["scripts/validate-mybatis-xml-crud.sh"],"framework_realization":{"template":"src/templates/scripts/validators/validate-mybatis-xml-crud-sh.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-045-validate-mybatis-xml-crud-sh.md"},"planning_notes":"Universale"},{"import_id":46,"import_name":"validate-schema-isolation.sh","detail":"No cross-tenant access. P23/ADR-019","planning_evidence_paths":["scripts/validate-schema-isolation.sh"],"framework_realization":{"template":"src/templates/scripts/validators/validate-schema-isolation-sh.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-046-validate-schema-isolation-sh.md"},"planning_notes":"Universale"},{"import_id":47,"import_name":"validate-liquibase-naming.sh + crossdb.sh","detail":"Naming convention + no PG-specific SQL","planning_evidence_paths":["scripts/validate-liquibase-*.sh"],"framework_realization":{"template":"src/templates/scripts/validators/validate-liquibase-naming-sh-crossd.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-047-validate-liquibase-naming-sh-crossd.md"},"planning_notes":"Calibrare naming per servizio"},{"import_id":48,"import_name":"validate-postman-collection.sh","detail":"Integrit&#224; collection Postman","planning_evidence_paths":["scripts/validate-postman-collection.sh"],"framework_realization":{"template":"src/templates/scripts/validators/validate-postman-collection-sh.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-048-validate-postman-collection-sh.md"},"planning_notes":"Solo se Postman collection"},{"import_id":49,"import_name":"validate-nightly-k6.sh + post-run + workflow","detail":"k6 threshold, DB post-assertions, CI integrity","planning_evidence_paths":["scripts/validate-*.sh (5 script)"],"framework_realization":{"template":"src/templates/scripts/validators/validate-nightly-k6-sh-post-run-wor.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-049-validate-nightly-k6-sh-post-run-wor.md"},"planning_notes":"Solo se k6/nightly attivi"},{"import_id":50,"import_name":"check-drift.py","detail":"Configuration drift detection cross-service","planning_evidence_paths":["scripts/check-drift.py"],"framework_realization":{"template":null,"generator":null,"validator":"scripts/check-drift-py.mjs","docs":"docs/REFERENCE/dim-050-check-drift-py.md"},"planning_notes":null},{"import_id":51,"import_name":"quality-check.sh (aggregated)","detail":"Quality gate aggregato: spotless+test+jacoco+spotbugs","planning_evidence_paths":["scripts/quality-check.sh"],"framework_realization":{"template":null,"generator":null,"validator":"scripts/quality-check-sh-aggregated.mjs","docs":"docs/REFERENCE/dim-051-quality-check-sh-aggregated.md"},"planning_notes":"Crescita incrementale"},{"import_id":52,"import_name":"coverage-report.sh + arch-verify.sh","detail":"JaCoCo HTML report + ArchUnit standalone","planning_evidence_paths":["scripts/coverage-report.sh, arch-verify.sh"],"framework_realization":{"template":null,"generator":null,"validator":"scripts/coverage-report-sh-arch-verify-sh.mjs","docs":"docs/REFERENCE/dim-052-coverage-report-sh-arch-verify-sh.md"},"planning_notes":null},{"import_id":53,"import_name":"format-fix.sh + security-scan.sh","detail":"Spotless auto-fix + Gitleaks+OWASP+SpotBugs security","planning_evidence_paths":["scripts/format-fix.sh, security-scan.sh"],"framework_realization":{"template":null,"generator":null,"validator":"scripts/format-fix-sh-security-scan-sh.mjs","docs":"docs/REFERENCE/dim-053-format-fix-sh-security-scan-sh.md"},"planning_notes":null},{"import_id":54,"import_name":"pii-scan.sh","detail":"PII pattern detection (email, phone, SSN, CF, IBAN)","planning_evidence_paths":["scripts/security/pii-scan.sh"],"framework_realization":{"template":null,"generator":null,"validator":"scripts/pii-scan-sh.mjs","docs":"docs/REFERENCE/dim-054-pii-scan-sh.md"},"planning_notes":"Universale"},{"import_id":56,"import_name":"SecurityConfig hardening","detail":"anyRequest().authenticated(), CORS restrictive, CSRF","planning_evidence_paths":["config/SecurityConfig.java"],"framework_realization":{"template":"src/templates/security/securityconfig-hardening.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-056-securityconfig-hardening.md"},"planning_notes":"Servizio-specifico"},{"import_id":58,"import_name":"Docker build-args safety","detail":"No secrets in image history. Multi-stage build","planning_evidence_paths":["Dockerfile"],"framework_realization":{"template":null,"generator":null,"validator":null,"docs":"docs/REFERENCE/dim-058-docker-build-args-safety.md"},"planning_notes":"Solo servizi containerizzati"},{"import_id":62,"import_name":".editorconfig","detail":"Indentation/encoding consistency","planning_evidence_paths":[".editorconfig"],"framework_realization":{"template":null,"generator":null,"validator":null,"docs":"docs/REFERENCE/dim-062--editorconfig.md"},"planning_notes":"Copiare 1:1"},{"import_id":63,"import_name":"docs/coding-standards.md","detail":"Regole codice, naming, pattern. Servizio-specifico","planning_evidence_paths":["docs/coding-standards.md"],"framework_realization":{"template":null,"generator":null,"validator":null,"docs":"docs/REFERENCE/dim-063-docs-coding-standards-md.md"},"planning_notes":"Adattare package names ed esempi"},{"import_id":64,"import_name":"docs/testing/ (3 file)","detail":"master-test-plan, test-taxonomy, rtm","planning_evidence_paths":["docs/testing/*.md"],"framework_realization":{"template":null,"generator":null,"validator":null,"docs":"docs/REFERENCE/dim-064-docs-testing-3-file.md"},"planning_notes":"Domain-specific test mapping"},{"import_id":66,"import_name":"docs/security/ (2 file)","detail":"risk-assessment, stride-threat-model","planning_evidence_paths":["docs/security/*.md"],"framework_realization":{"template":null,"generator":null,"validator":null,"docs":"docs/REFERENCE/dim-066-docs-security-2-file.md"},"planning_notes":"Servizio-specifico, metodologia standard"},{"import_id":71,"import_name":"Seed data scripts","detail":"seed-{service}-k6.sql, seed-test-data.sh","planning_evidence_paths":["scripts/seed-*.sql"],"framework_realization":{"template":"src/templates/bootstrap/seed-data-scripts.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-071-seed-data-scripts.md"},"planning_notes":"Per k6 e E2E test"},{"import_id":72,"import_name":"Spring Boot version alignment","detail":"Tutti i moduli stessa versione parent","planning_evidence_paths":["pom.xml parent version"],"framework_realization":{"template":"src/templates/bootstrap/spring-boot-version-alignment.ejs","generator":null,"validator":null,"docs":"docs/REFERENCE/dim-072-spring-boot-version-alignment.md"},"planning_notes":"Verificare skew tra moduli"}],"import_total":76}
@@ -0,0 +1,2 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ import{dirname,resolve}from"node:path";import{fileURLToPath}from"node:url";import{KitCatalogSchema}from"./schema.js";import{readFileTranslated}from"../utils/fs.js";export function kitDataPath(file){return resolve(dirname(fileURLToPath(import.meta.url)),file)}function loadCatalogFromDisk(){return KitCatalogSchema.parse(JSON.parse(readFileTranslated(kitDataPath("catalog.json"),"utf-8")))}let _catalog=null;export function loadCatalog(){return _catalog||(_catalog=loadCatalogFromDisk()),_catalog}
@@ -0,0 +1 @@
1
+ [{"id":"N01","name":"Hexagonal architecture enforcement (ArchUnit)","tml":"L2","gate":"BLOCKING","categoryRef":"architecture","archetypeGating":{"applies":["hexagonal"],"excludes":[]},"invLink":"INV-22","status":"partial","note":"ArchUnit rules enforced at L2 for Java hexagonal archetype; cross-stack architecture rules vary by paradigm"},{"id":"N02","name":"Package dependency rules (no domain→infra leakage)","tml":"L2","gate":"BLOCKING","categoryRef":"architecture","archetypeGating":{"applies":["hexagonal"],"excludes":[]},"invLink":"INV-22","status":"partial","note":"Hexagonal layering: domain must not import infrastructure packages"},{"id":"N03","name":"Interface + implementation separation rule","tml":"L2","gate":"BLOCKING","categoryRef":"architecture","archetypeGating":{"applies":["hexagonal"],"excludes":[]},"status":"missing","note":"Port/adapter pattern: repository interfaces in domain, implementations in infrastructure"},{"id":"N04","name":"No Spring annotations in domain layer","tml":"L2","gate":"BLOCKING","categoryRef":"architecture","archetypeGating":{"applies":["hexagonal","spring"],"excludes":[]},"status":"missing","note":"Java/Spring-specific: domain classes must not use @Component, @Service, @Repository etc."},{"id":"N05","name":"@Async annotation only in service layer","tml":"L2","gate":"BLOCKING","categoryRef":"architecture","archetypeGating":{"applies":["hexagonal","spring"],"excludes":[]},"status":"missing","note":"Java/Spring-specific: async methods must be in application/service layer, not domain"},{"id":"N06","name":"Bean Validation constraints in domain entities only","tml":"L2","gate":"BLOCKING","categoryRef":"architecture","archetypeGating":{"applies":["hexagonal","spring"],"excludes":[]},"status":"missing","note":"Java/Spring: validation annotations (@NotNull, @Size etc.) confined to domain entities"},{"id":"N07","name":"No circular dependencies between modules","tml":"L2","gate":"BLOCKING","categoryRef":"architecture","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-03","status":"covered","note":"Enforced by madge (TS) / ArchUnit (Java) / cargo check (Rust)"},{"id":"N08","name":"Tamper-evident audit log insert-only rule (R-audit-insert-only)","tml":"L2","gate":"BLOCKING","categoryRef":"audit_trail","archetypeGating":{"applies":[],"excludes":[]},"conditionalFlag":"audit-write-services","requiresDbEngine":["postgresql","mysql","mongodb"],"status":"missing-tracked","followupIssue":862,"note":"Tamper-evident audit log: append-only pattern enforced by architecture rule R-audit-insert-only"},{"id":"N09","name":"Static analysis: linting (checkstyle/eslint/ruff/golangci-lint/clippy)","tml":"L1","gate":"BLOCKING","categoryRef":"static_analysis","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-01","status":"covered","note":"L1 gate enforces per-stack linter with zero-warning policy"},{"id":"N10","name":"Static analysis: formatting (spotless/prettier/black/gofmt/rustfmt)","tml":"L1","gate":"BLOCKING","categoryRef":"static_analysis","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"Format check enforced at L1 gate"},{"id":"N11","name":"PMD / Semgrep rules (complexity, security anti-patterns)","tml":"L2","gate":"ADVISORY","categoryRef":"static_analysis","archetypeGating":{"applies":[],"excludes":[]},"status":"partial","note":"PMD Java-specific; Semgrep applicable cross-stack but not yet enforced"},{"id":"N12","name":"SpotBugs / null-safety analysis","tml":"L2","gate":"ADVISORY","categoryRef":"static_analysis","archetypeGating":{"applies":["java"],"excludes":[]},"status":"partial","note":"SpotBugs Java-specific; TypeScript has strict null checks; Rust/Go enforce at compiler level"},{"id":"N13","name":"Cyclomatic complexity gate","tml":"L2","gate":"ADVISORY","categoryRef":"static_analysis","archetypeGating":{"applies":[],"excludes":[]},"status":"partial","note":"Complexity rules in golangci-lint/ruff/eslint; Java via PMD; threshold enforcement varies by stack"},{"id":"N14","name":"Dead code detection","tml":"L2","gate":"ADVISORY","categoryRef":"static_analysis","archetypeGating":{"applies":[],"excludes":[]},"status":"partial","note":"knip (TS), golangci-lint deadcode (Go), cargo unused (Rust); Java via PMD"},{"id":"N15","name":"Code duplication ratchet (jscpd / equivalent)","tml":"L2","gate":"ADVISORY","categoryRef":"static_analysis","archetypeGating":{"applies":[],"excludes":[]},"status":"partial","note":"jscpd wired for TS at L2 gate; Java uses PMD CPD; other stacks partial"},{"id":"N16","name":"Style token enforcement (design tokens / style guide)","tml":"L3","gate":"ADVISORY","categoryRef":"static_analysis","archetypeGating":{"applies":[],"excludes":[]},"status":"partial","note":"CSS/styling tokens enforced for frontend stacks; backend services use code style only"},{"id":"N17","name":"Unit test framework wired (JUnit5/Vitest/pytest/go test/cargo test)","tml":"L1","gate":"BLOCKING","categoryRef":"test_framework","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"Each stack has a canonical unit test runner wired into L1 gate"},{"id":"N18","name":"Code coverage gate (JaCoCo/V8/coverage.py/go cover/cargo-tarpaulin)","tml":"L2","gate":"BLOCKING","categoryRef":"test_framework","archetypeGating":{"applies":[],"excludes":[]},"kitThreshold":80,"arbiterThreshold":85,"status":"covered","note":"Coverage threshold enforced at L2; arbiter default 85% lines, kit baseline 80%"},{"id":"N19","name":"Coverage trend ratchet (no regression allowed)","tml":"L2","gate":"BLOCKING","categoryRef":"test_framework","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"Coverage baseline ratchet prevents regressions across PRs"},{"id":"N20","name":"Mutation testing (pitest/stryker/mutmut/go-mutesting/cargo-mutants)","tml":"L3","gate":"ADVISORY","categoryRef":"test_framework","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-29","status":"partial","note":"INV-29 enforces mutation score threshold; tooling wired per stack at L3"},{"id":"N21","name":"Test isolation — no shared mutable state between tests","tml":"L1","gate":"BLOCKING","categoryRef":"test_framework","archetypeGating":{"applies":[],"excludes":[]},"status":"partial","note":"Enforced by test framework config (vitest pool isolation, JUnit @DirtiesContext)"},{"id":"N22","name":"Test naming convention enforced","tml":"L1","gate":"BLOCKING","categoryRef":"test_framework","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-06","status":"covered","note":"check-test-naming.mjs enforces naming contract at L1"},{"id":"N23","name":"Test TDD evidence captured (W4 protocol)","tml":"L2","gate":"ADVISORY","categoryRef":"test_framework","archetypeGating":{"applies":[],"excludes":[]},"status":"partial","note":"W4 TDD evidence under .arbiter/evidence/tdd/; enforced by check-tdd-evidence.mjs at L2"},{"id":"N24","name":"Fast test profile (L1 unit only, <2 min)","tml":"L2","gate":"BLOCKING","categoryRef":"test_profiles","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"L1 gate runs unit tests only; integration tests excluded via vitest/gradle profile"},{"id":"N25","name":"Extended test profile (L2: unit + integration)","tml":"L2","gate":"BLOCKING","categoryRef":"test_profiles","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"L2 gate runs full test suite including integration tests"},{"id":"N26","name":"Nightly/weekly test profile (L3: full suite + mutation + security)","tml":"L3","gate":"BLOCKING","categoryRef":"test_profiles","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"T4/T5 nightly+weekly CI tiers run mutation, DAST, fuzz, full security scans"},{"id":"N27","name":"Integration tests (Spring IT / testcontainers / real-project fixtures)","tml":"L1","gate":"BLOCKING","categoryRef":"test_types","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"Real-project fixture tests run per stack; integration tests in L2 profile"},{"id":"N28","name":"Contract tests (Spring Cloud Contract / Pact)","tml":"L2","gate":"ADVISORY","categoryRef":"test_types","archetypeGating":{"applies":[],"excludes":[]},"status":"partial","note":"Contract testing enforced at L2 for service APIs; coverage varies by stack"},{"id":"N29","name":"BDD / behavioural tests (Cucumber / pytest-bdd / godog)","tml":"L2","gate":"ADVISORY","categoryRef":"test_types","archetypeGating":{"applies":[],"excludes":[]},"status":"partial","note":"BDD tooling available cross-stack; enforcement level varies by archetype"},{"id":"N30","name":"Architectural tests (ArchUnit / structure rules)","tml":"L2","gate":"BLOCKING","categoryRef":"test_types","archetypeGating":{"applies":["hexagonal"],"excludes":[]},"status":"partial","note":"Architecture rule tests wired for hexagonal archetype; other archetypes use static analysis"},{"id":"N31","name":"Fuzz testing (Jazzer / go-fuzz / cargo-fuzz)","tml":"L3","gate":"ADVISORY","categoryRef":"test_types","archetypeGating":{"applies":[],"excludes":[]},"status":"partial","note":"Fuzz testing supported at L3 nightly tier; tooling coverage varies by stack"},{"id":"N32","name":"Property-based testing (QuickCheck / Hypothesis / proptest)","tml":"L3","gate":"ADVISORY","categoryRef":"test_types","archetypeGating":{"applies":[],"excludes":[]},"status":"missing","note":"Property-based testing not yet wired into arbiter gate; follow-up opportunity"},{"id":"N33","name":"Snapshot / golden-file tests","tml":"L2","gate":"ADVISORY","categoryRef":"test_types","archetypeGating":{"applies":[],"excludes":[]},"status":"partial","note":"Snapshot tests used in arbiter self-tests (api-snapshot.mjs); pattern available cross-stack"},{"id":"N34","name":"Multi-tier CI pipeline (fast → extended → release → nightly → weekly)","tml":"L2","gate":"BLOCKING","categoryRef":"cicd","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-73","status":"covered","note":"6-tier CI model (T0..T5) enforced by workflow runner checks and ci-alignment gate"},{"id":"N35","name":"PR fast-feedback gate (<5 min, L1 checks only)","tml":"L2","gate":"BLOCKING","categoryRef":"cicd","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-73","status":"covered","note":"T1 (check subcommand) completes in ~2 min; T2 (gate) in ~10 min"},{"id":"N36","name":"Release pipeline (tag-triggered, artifact signing)","tml":"L3","gate":"BLOCKING","categoryRef":"cicd","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-79","status":"covered","note":"Release workflow signs artifacts with cosign; SLSA provenance via attest-build-provenance"},{"id":"N37","name":"Nightly extended checks (mutation, DAST, performance baseline)","tml":"L3","gate":"ADVISORY","categoryRef":"cicd","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-76","status":"covered","note":"T4 nightly tier runs mutation + DAST + fuzz; heartbeat monitor keeps pipeline honest"},{"id":"N38","name":"Weekly audit pipeline (dependency audit, license scan, SBOM refresh)","tml":"L3","gate":"ADVISORY","categoryRef":"cicd","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"T5 weekly tier runs npm audit, license scan, SBOM refresh, gitleaks full scan"},{"id":"N39","name":"CI runner label SSOT (no hardcoded runner strings)","tml":"L2","gate":"BLOCKING","categoryRef":"cicd","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-13","status":"covered","note":"INV-13 enforces CI_BUILD_RUNNER_LABEL repo variable as SSOT; downstream-generated check-workflow-runners gates this in target repos"},{"id":"N40","name":"Artifact provenance (SLSA / sigstore)","tml":"L3","gate":"BLOCKING","categoryRef":"cicd","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-78","status":"covered","note":"SLSA provenance generated via actions/attest-build-provenance for all release artifacts"},{"id":"N41","name":"E2E API tests (RestAssured / Playwright / pytest-playwright)","tml":"L3","gate":"BLOCKING","categoryRef":"e2e_perf","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"E2E tests wired at L3 nightly tier; Playwright for browser stacks, RestAssured for Java APIs"},{"id":"N42","name":"Performance / load testing baseline (k6 / Locust / Gatling)","tml":"L3","gate":"ADVISORY","categoryRef":"e2e_perf","archetypeGating":{"applies":[],"excludes":[]},"status":"missing","note":"Performance testing tooling not yet generated by arbiter; follow-up opportunity"},{"id":"N43","name":"DAST scan (OWASP ZAP / Nuclei)","tml":"L3","gate":"ADVISORY","categoryRef":"e2e_perf","archetypeGating":{"applies":[],"excludes":[]},"status":"partial","note":"DAST wired at T4 nightly tier; ZAP scan against running service"},{"id":"N44","name":"Auth flow E2E (Keycloak-compatible IdP integration test)","tml":"L3","gate":"ADVISORY","categoryRef":"e2e_perf","archetypeGating":{"applies":[],"excludes":[]},"status":"missing","note":"Auth E2E testing against a Keycloak-compatible IdP; not yet generated by arbiter"},{"id":"N45","name":"Format validation script (check-format.sh equivalent)","tml":"L1","gate":"BLOCKING","categoryRef":"scripts_validation","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"Format check is part of L1 gate (prettier/spotless/black/gofmt/rustfmt)"},{"id":"N46","name":"SPDX license header check","tml":"L1","gate":"BLOCKING","categoryRef":"scripts_validation","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-20","status":"covered","note":"check-spdx-headers.mjs enforces Apache-2.0 SPDX headers at L1"},{"id":"N47","name":"Orphan TODO check (no bare TODOs without task IDs)","tml":"L1","gate":"BLOCKING","categoryRef":"scripts_validation","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-06","status":"covered","note":"check-no-orphan-todo.mjs gates orphan TODOs at L1; post-edit hook enforces inline"},{"id":"N48","name":"Placeholder check (no template placeholders committed)","tml":"L1","gate":"BLOCKING","categoryRef":"scripts_validation","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"check-no-placeholders.mjs gates placeholder patterns at L1"},{"id":"N49","name":"Dead link / doc link integrity check","tml":"L2","gate":"ADVISORY","categoryRef":"scripts_validation","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"check-doc-links.mjs validates internal doc links at L1 gate"},{"id":"N50","name":"Bloat ratchet (bundle size / generated artifact size)","tml":"L2","gate":"ADVISORY","categoryRef":"scripts_validation","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"check-bloat-ratchet.mjs enforces size baseline at L1; refuses shrink without --allow-shrink"},{"id":"N51","name":"Debt ratchet (tech-debt score gate)","tml":"L1","gate":"ADVISORY","categoryRef":"scripts_quality","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"debt-report.mjs --gate enforced at L2; debt score cannot increase without explicit override"},{"id":"N52","name":"Self-dogfood check (arbiter validates itself)","tml":"L1","gate":"BLOCKING","categoryRef":"scripts_quality","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-75","status":"covered","note":"INV-75/76: downstream check-action-pins + check-workflow-perms gates run at L1 in target repos; arbiter self-dogfood retired during CI freeze (#862)"},{"id":"N53","name":"API snapshot test (no unintended public surface changes)","tml":"L2","gate":"BLOCKING","categoryRef":"scripts_quality","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"check-api-snapshot.mjs gates API surface at L1; changes require explicit snapshot update"},{"id":"N54","name":"Circular dependency detection","tml":"L1","gate":"BLOCKING","categoryRef":"scripts_quality","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-03","status":"covered","note":"madge --circular at L1 gate; post-edit hook checks after every TS/JS edit"},{"id":"N55","name":"Secret scanning (Gitleaks)","tml":"L1","gate":"BLOCKING","categoryRef":"security","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-24","status":"covered","note":"Gitleaks on staged files (pre-commit hook) + full repo scan at L2 gate"},{"id":"N56","name":"Dependency audit (npm audit / trivy fs / cargo audit)","tml":"L2","gate":"BLOCKING","categoryRef":"security","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"npm audit at L2 gate; cargo audit / pip-audit supported; blocks on HIGH+ severity"},{"id":"N57","name":"Container image scan (Trivy)","tml":"L3","gate":"BLOCKING","categoryRef":"security","archetypeGating":{"applies":[],"excludes":[]},"status":"partial","note":"Trivy container scan at T5 weekly tier; generated for services with Dockerfile"},{"id":"N58","name":"License scan (FOSSA / ORT / licensee)","tml":"L3","gate":"ADVISORY","categoryRef":"security","archetypeGating":{"applies":[],"excludes":[]},"status":"partial","note":"License scan at T5 weekly tier; blocks on GPL/AGPL in permissively-licensed services"},{"id":"N59","name":"Commit message format enforced (commitlint)","tml":"L1","gate":"BLOCKING","categoryRef":"git_github","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"commitlint wired at L1 gate + post-commit hook checks format after every commit"},{"id":"N60","name":"Branch naming convention enforced","tml":"L1","gate":"BLOCKING","categoryRef":"git_github","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"task/* branch convention enforced by execution protocol; pre-commit guard via AGENTS.md"},{"id":"N61","name":"PR template (description, test plan, checklist)","tml":"L1","gate":"ADVISORY","categoryRef":"git_github","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":".github/pull_request_template.md generated for target projects"},{"id":"N62","name":"Issue templates (bug, feature, tech-debt)","tml":"L1","gate":"ADVISORY","categoryRef":"git_github","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"GitHub issue templates generated for target projects"},{"id":"N63","name":"AGENTS.md / CLAUDE.md governance document","tml":"L2","gate":"BLOCKING","categoryRef":"documentation","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"AGENTS.md generated as AAIF-standard governance doc for all arbiter-managed projects"},{"id":"N64","name":"CI/CD developer reference card","tml":"L2","gate":"ADVISORY","categoryRef":"documentation","archetypeGating":{"applies":[],"excludes":[]},"status":"missing","note":"CI developer reference template provided (TPL_cicd-developer-reference); generator deferred to Phase D"},{"id":"N65","name":"Architecture decision records (ADRs)","tml":"L2","gate":"ADVISORY","categoryRef":"documentation","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"docs/SYSTEM/DECISIONS.md generated and maintained as ADR log for arbiter-managed projects"},{"id":"N66","name":"API / OpenAPI specification","tml":"L3","gate":"ADVISORY","categoryRef":"documentation","archetypeGating":{"applies":[],"excludes":[]},"status":"missing","note":"OpenAPI spec generation not yet in arbiter scope; follow-up opportunity"},{"id":"N67","name":"Runbook (operational playbook for oncall)","tml":"L3","gate":"ADVISORY","categoryRef":"documentation","archetypeGating":{"applies":[],"excludes":[]},"status":"missing","note":"Operational runbook template not yet generated; follow-up opportunity"},{"id":"N68","name":"Knowledge map (cross-repo canonical paths and signal sources)","tml":"L3","gate":"ADVISORY","categoryRef":"documentation","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"Canonical signal sources self-documented via .claude/knowledge-map.json track routing + the generated wiki/ (Obsidian viewer); bespoke knowledge-map gate retired in #1244"},{"id":"N69","name":"Runtime version SSOT (node version pinned, .nvmrc aligned)","tml":"L1","gate":"BLOCKING","categoryRef":"configuration","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-14","status":"covered","note":"check-node-version-ssot.mjs enforces single source of truth for node version at L1"},{"id":"N70","name":"Environment variable safety (.env.example only, no real .env committed)","tml":"L1","gate":"BLOCKING","categoryRef":"configuration","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-24","status":"covered","note":"Gitleaks catches .env commits; arbiter generates only .env.*.example templates"},{"id":"N71","name":"Feature flag / experiment registry (no undocumented flags)","tml":"L2","gate":"ADVISORY","categoryRef":"configuration","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"src/experimental/registry.ts enforces known-experiment guard; unknown flag = exit 1"},{"id":"N72","name":"Multi-environment config (dev/staging/prod parity)","tml":"L3","gate":"ADVISORY","categoryRef":"configuration","archetypeGating":{"applies":[],"excludes":[]},"status":"missing","note":"Multi-env config templates not yet generated by arbiter; follow-up opportunity"},{"id":"N73","name":"Tamper-evident audit log table DDL (security-critical operations)","tml":"L3","gate":"BLOCKING","categoryRef":"audit_trail","archetypeGating":{"applies":[],"excludes":[]},"conditionalFlag":"audit-write-services","requiresDbEngine":["postgresql","mysql","mongodb"],"status":"missing-tracked","followupIssue":862,"note":"Tamper-evident audit log for security-critical operations; DDL with insert-only grants and created_at immutability"},{"id":"N74","name":"Audit trigger presence (DB-level audit trigger enforced)","tml":"L3","gate":"BLOCKING","categoryRef":"audit_trail","archetypeGating":{"applies":[],"excludes":[]},"conditionalFlag":"audit-write-services","requiresDbEngine":["postgresql","mysql"],"status":"missing-tracked","followupIssue":862,"note":"Database trigger enforces audit log population for security-critical write operations"},{"id":"N75","name":"Audit log service interface (AuditEventService / append-only repository pattern)","tml":"L3","gate":"BLOCKING","categoryRef":"audit_trail","archetypeGating":{"applies":[],"excludes":[]},"conditionalFlag":"audit-write-services","requiresDbEngine":["postgresql","mysql","mongodb"],"status":"missing-tracked","followupIssue":862,"note":"Append-only repository pattern for audit events; no update/delete operations permitted in service layer"},{"id":"N76","name":"Accessibility (a11y) audit (Axe / Lighthouse / pa11y)","tml":"L3","gate":"ADVISORY","categoryRef":"a11y","archetypeGating":{"applies":["frontend","fullstack"],"excludes":["backend","api"]},"status":"partial","note":"a11y auditing for frontend archetypes; INV-61 enforces a11y gate when frontend present"},{"id":"N77","name":"Spring Modulith structural verification (ApplicationModules.verify())","tml":"L2","gate":"BLOCKING","categoryRef":"module_boundaries","archetypeGating":{"applies":["backend","api","fullstack"],"excludes":["frontend","cli","embedded"]},"conditionalFlag":"spring-boot","status":"covered","note":"Spring Modulith verifies no cyclic module dependencies and no forbidden cross-module access. Requires spring-modulith-test on the classpath."},{"id":"N78","name":"Resilience patterns guide (circuit-breaker/retry/rate-limiter/timeout)","tml":"L2","gate":"ADVISORY","categoryRef":"resilience","archetypeGating":{"applies":["backend","api","fullstack"],"excludes":["frontend","cli","embedded"]},"invLink":"INV-19","status":"covered","note":"Resilience patterns guide emitted for external-call-heavy archetypes. cockatiel (TS) + Resilience4j (Java) concrete blocks. INV-19 governs external-call resilience."}]
@@ -0,0 +1 @@
1
+ [{"id":"N01","name":"Hexagonal architecture enforcement (ArchUnit)","tml":"L2","gate":"BLOCKING","categoryRef":"architecture","archetypeGating":{"applies":["hexagonal"],"excludes":[]},"invLink":"INV-22","status":"partial","note":"ArchUnit rules enforced at L2 for Java hexagonal archetype; cross-stack architecture rules vary by paradigm","perStack":{"java":{"kind":"tool","tool":"ArchUnit","matrixCategory":"architecture"},"typescript":{"kind":"tool","tool":"eslint-plugin-boundaries","matrixCategory":"architecture"},"python":{"kind":"tool","tool":"import-linter + ruff","matrixCategory":"architecture"},"go":{"kind":"tool","tool":"golangci-lint (depguard)","matrixCategory":"architecture"},"rust":{"kind":"tool","tool":"cargo-deny + clippy","matrixCategory":"architecture"}}},{"id":"N02","name":"Package dependency rules (no domain→infra leakage)","tml":"L2","gate":"BLOCKING","categoryRef":"architecture","archetypeGating":{"applies":["hexagonal"],"excludes":[]},"invLink":"INV-22","status":"partial","note":"Hexagonal layering: domain must not import infrastructure packages","perStack":{"java":{"kind":"tool","tool":"ArchUnit","matrixCategory":"architecture"},"typescript":{"kind":"tool","tool":"eslint-plugin-boundaries","matrixCategory":"architecture"},"python":{"kind":"tool","tool":"import-linter + ruff","matrixCategory":"architecture"},"go":{"kind":"tool","tool":"golangci-lint (depguard)","matrixCategory":"architecture"},"rust":{"kind":"tool","tool":"cargo-deny + clippy","matrixCategory":"architecture"}}},{"id":"N03","name":"Interface + implementation separation rule","tml":"L2","gate":"BLOCKING","categoryRef":"architecture","archetypeGating":{"applies":["hexagonal"],"excludes":[]},"status":"missing","note":"Port/adapter pattern: repository interfaces in domain, implementations in infrastructure","perStack":{"java":{"kind":"tool","tool":"ArchUnit","matrixCategory":"architecture"},"typescript":{"kind":"equivalent","arbiterSlot":"static_analysis","reason":"TypeScript interfaces enforce port/adapter separation via type system; no runtime ArchUnit equivalent needed — compiler enforces boundary at build time"},"python":{"kind":"equivalent","arbiterSlot":"static_analysis","reason":"Python abstract base classes (ABC) provide interface/implementation separation; mypy enforces type contracts at analysis time"},"go":{"kind":"equivalent","arbiterSlot":"architecture","reason":"Go implicit interfaces naturally enforce port/adapter pattern; no explicit separation tool needed — compiler guarantees interface satisfaction"},"rust":{"kind":"equivalent","arbiterSlot":"architecture","reason":"Rust traits provide strong interface/implementation separation enforced at compile time; no additional runtime rule needed"}}},{"id":"N04","name":"No Spring annotations in domain layer","tml":"L2","gate":"BLOCKING","categoryRef":"architecture","archetypeGating":{"applies":["hexagonal","spring"],"excludes":[]},"status":"missing","note":"Java/Spring-specific: domain classes must not use @Component, @Service, @Repository etc.","perStack":{"java":{"kind":"tool","tool":"ArchUnit","matrixCategory":"architecture"},"typescript":{"kind":"na-by-paradigm","reason":"Spring annotations are Java/Spring-specific; TypeScript uses decorators differently and has no equivalent Spring container concept to restrict"},"python":{"kind":"na-by-paradigm","reason":"Spring annotations are Java/Spring-specific; Python frameworks use different DI patterns without the Spring component model"},"go":{"kind":"na-by-paradigm","reason":"Spring annotations are Java/Spring-specific; Go uses explicit dependency injection without annotation-based component scanning"},"rust":{"kind":"na-by-paradigm","reason":"Spring annotations are Java/Spring-specific; Rust has no annotation-based IoC container concept"}}},{"id":"N05","name":"@Async annotation only in service layer","tml":"L2","gate":"BLOCKING","categoryRef":"architecture","archetypeGating":{"applies":["hexagonal","spring"],"excludes":[]},"status":"missing","note":"Java/Spring-specific: async methods must be in application/service layer, not domain","perStack":{"java":{"kind":"tool","tool":"ArchUnit","matrixCategory":"architecture"},"typescript":{"kind":"na-by-paradigm","reason":"@Async annotation is Spring-specific; TypeScript uses async/await natively at any layer without constraint enforcement needed"},"python":{"kind":"na-by-paradigm","reason":"@Async annotation is Spring-specific; Python asyncio does not require layer-restricted async placement"},"go":{"kind":"na-by-paradigm","reason":"@Async annotation is Spring-specific; Go goroutines are used without layer restrictions and require no constraint enforcement"},"rust":{"kind":"na-by-paradigm","reason":"@Async annotation is Spring-specific; Rust async/await has no layer constraint by paradigm"}}},{"id":"N06","name":"Bean Validation constraints in domain entities only","tml":"L2","gate":"BLOCKING","categoryRef":"architecture","archetypeGating":{"applies":["hexagonal","spring"],"excludes":[]},"status":"missing","note":"Java/Spring: validation annotations (@NotNull, @Size etc.) confined to domain entities","perStack":{"java":{"kind":"tool","tool":"ArchUnit","matrixCategory":"architecture"},"typescript":{"kind":"equivalent","arbiterSlot":"static_analysis","reason":"TypeScript uses Zod or class-validator for validation; constraint on domain-only placement enforced via linting rules rather than annotation restriction"},"python":{"kind":"equivalent","arbiterSlot":"static_analysis","reason":"Pydantic models in Python serve as domain validation constraint holders; placement enforced by project structure conventions"},"go":{"kind":"na-by-paradigm","reason":"Go validation uses struct tags or explicit validation functions; no Java-style Bean Validation annotation concept exists in Go paradigm"},"rust":{"kind":"na-by-paradigm","reason":"Rust uses type-driven validation (newtype pattern, From/TryFrom traits); no annotation-based validation concept analogous to Bean Validation"}}},{"id":"N07","name":"No circular dependencies between modules","tml":"L2","gate":"BLOCKING","categoryRef":"architecture","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-03","status":"covered","note":"Enforced by madge (TS) / ArchUnit (Java) / cargo check (Rust)","perStack":{"java":{"kind":"tool","tool":"ArchUnit","matrixCategory":"architecture"},"typescript":{"kind":"tool","tool":"eslint-plugin-boundaries","matrixCategory":"architecture"},"python":{"kind":"tool","tool":"import-linter + ruff","matrixCategory":"architecture"},"go":{"kind":"tool","tool":"golangci-lint (depguard)","matrixCategory":"architecture"},"rust":{"kind":"tool","tool":"cargo-deny + clippy","matrixCategory":"architecture"}}},{"id":"N08","name":"Tamper-evident audit log insert-only rule (R-audit-insert-only)","tml":"L2","gate":"BLOCKING","categoryRef":"audit_trail","archetypeGating":{"applies":[],"excludes":[]},"conditionalFlag":"audit-write-services","requiresDbEngine":["postgresql","mysql","mongodb"],"status":"missing-tracked","followupIssue":862,"note":"Tamper-evident audit log: append-only pattern enforced by architecture rule R-audit-insert-only","perStack":{"java":{"kind":"gap"},"typescript":{"kind":"gap","followupIssue":862,"reason":"Tamper-evident audit log architecture rule not yet generated for TypeScript; conditional on audit-write-services flag; Phase G of sibling epic covers per-stack generators"},"python":{"kind":"gap","followupIssue":862,"reason":"Tamper-evident audit log architecture rule not yet generated for Python; conditional on audit-write-services flag; Phase G of sibling epic covers per-stack generators"},"go":{"kind":"gap","followupIssue":862,"reason":"Tamper-evident audit log architecture rule not yet generated for Go; conditional on audit-write-services flag; Phase G of sibling epic covers per-stack generators"},"rust":{"kind":"gap","followupIssue":862,"reason":"Tamper-evident audit log architecture rule not yet generated for Rust; conditional on audit-write-services flag; Phase G of sibling epic covers per-stack generators"}}},{"id":"N09","name":"Static analysis: linting (checkstyle/eslint/ruff/golangci-lint/clippy)","tml":"L1","gate":"BLOCKING","categoryRef":"static_analysis","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-01","status":"covered","note":"L1 gate enforces per-stack linter with zero-warning policy","perStack":{"java":{"kind":"tool","tool":"checkstyle+pmd+spotbugs+spotless","matrixCategory":"static_analysis"},"typescript":{"kind":"tool","tool":"eslint+prettier","matrixCategory":"static_analysis"},"python":{"kind":"tool","tool":"ruff","matrixCategory":"static_analysis"},"go":{"kind":"tool","tool":"golangci-lint","matrixCategory":"static_analysis"},"rust":{"kind":"tool","tool":"clippy","matrixCategory":"static_analysis"}}},{"id":"N10","name":"Static analysis: formatting (spotless/prettier/black/gofmt/rustfmt)","tml":"L1","gate":"BLOCKING","categoryRef":"static_analysis","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"Format check enforced at L1 gate","perStack":{"java":{"kind":"tool","tool":"checkstyle+pmd+spotbugs+spotless","matrixCategory":"static_analysis"},"typescript":{"kind":"tool","tool":"eslint+prettier","matrixCategory":"static_analysis"},"python":{"kind":"tool","tool":"ruff","matrixCategory":"static_analysis"},"go":{"kind":"tool","tool":"golangci-lint","matrixCategory":"static_analysis"},"rust":{"kind":"tool","tool":"clippy","matrixCategory":"static_analysis"}}},{"id":"N11","name":"PMD / Semgrep rules (complexity, security anti-patterns)","tml":"L2","gate":"ADVISORY","categoryRef":"static_analysis","archetypeGating":{"applies":[],"excludes":[]},"status":"partial","note":"PMD Java-specific; Semgrep applicable cross-stack but not yet enforced","perStack":{"java":{"kind":"tool","tool":"checkstyle+pmd+spotbugs+spotless","matrixCategory":"static_analysis"},"typescript":{"kind":"tool","tool":"eslint+prettier","matrixCategory":"static_analysis"},"python":{"kind":"tool","tool":"ruff","matrixCategory":"static_analysis"},"go":{"kind":"tool","tool":"golangci-lint","matrixCategory":"static_analysis"},"rust":{"kind":"tool","tool":"clippy","matrixCategory":"static_analysis"}}},{"id":"N12","name":"SpotBugs / null-safety analysis","tml":"L2","gate":"ADVISORY","categoryRef":"static_analysis","archetypeGating":{"applies":["java"],"excludes":[]},"status":"partial","note":"SpotBugs Java-specific; TypeScript has strict null checks; Rust/Go enforce at compiler level","perStack":{"java":{"kind":"tool","tool":"checkstyle+pmd+spotbugs+spotless","matrixCategory":"static_analysis"},"typescript":{"kind":"equivalent","arbiterSlot":"static_analysis","reason":"TypeScript strict null checks + noUncheckedIndexedAccess enforce null-safety at compile time; equivalent to SpotBugs null analysis for Java"},"python":{"kind":"equivalent","arbiterSlot":"static_analysis","reason":"mypy with strict mode enforces null/None safety for Python; equivalent null analysis to SpotBugs in the Python ecosystem"},"go":{"kind":"na-by-paradigm","reason":"Go eliminates null pointer exceptions via explicit error returns and zero values; SpotBugs-style null analysis is not applicable to the Go paradigm"},"rust":{"kind":"na-by-paradigm","reason":"Rust eliminates null via Option<T> enforced at compile time; SpotBugs-style null analysis has no equivalent role in the Rust paradigm"}}},{"id":"N13","name":"Cyclomatic complexity gate","tml":"L2","gate":"ADVISORY","categoryRef":"static_analysis","archetypeGating":{"applies":[],"excludes":[]},"status":"partial","note":"Complexity rules in golangci-lint/ruff/eslint; Java via PMD; threshold enforcement varies by stack","perStack":{"java":{"kind":"tool","tool":"checkstyle+pmd+spotbugs+spotless","matrixCategory":"static_analysis"},"typescript":{"kind":"tool","tool":"eslint+prettier","matrixCategory":"static_analysis"},"python":{"kind":"tool","tool":"ruff","matrixCategory":"static_analysis"},"go":{"kind":"tool","tool":"golangci-lint","matrixCategory":"static_analysis"},"rust":{"kind":"tool","tool":"clippy","matrixCategory":"static_analysis"}}},{"id":"N14","name":"Dead code detection","tml":"L2","gate":"ADVISORY","categoryRef":"static_analysis","archetypeGating":{"applies":[],"excludes":[]},"status":"partial","note":"knip (TS), golangci-lint deadcode (Go), cargo unused (Rust); Java via PMD","perStack":{"java":{"kind":"tool","tool":"checkstyle+pmd+spotbugs+spotless","matrixCategory":"static_analysis"},"typescript":{"kind":"tool","tool":"eslint+prettier","matrixCategory":"static_analysis"},"python":{"kind":"tool","tool":"ruff","matrixCategory":"static_analysis"},"go":{"kind":"tool","tool":"golangci-lint","matrixCategory":"static_analysis"},"rust":{"kind":"tool","tool":"clippy","matrixCategory":"static_analysis"}}},{"id":"N15","name":"Code duplication ratchet (jscpd / equivalent)","tml":"L2","gate":"ADVISORY","categoryRef":"static_analysis","archetypeGating":{"applies":[],"excludes":[]},"status":"partial","note":"jscpd wired for TS at L2 gate; Java uses PMD CPD; other stacks partial","perStack":{"java":{"kind":"tool","tool":"checkstyle+pmd+spotbugs+spotless","matrixCategory":"static_analysis"},"typescript":{"kind":"tool","tool":"eslint+prettier","matrixCategory":"static_analysis"},"python":{"kind":"tool","tool":"ruff","matrixCategory":"static_analysis"},"go":{"kind":"tool","tool":"golangci-lint","matrixCategory":"static_analysis"},"rust":{"kind":"tool","tool":"clippy","matrixCategory":"static_analysis"}}},{"id":"N16","name":"Style token enforcement (design tokens / style guide)","tml":"L3","gate":"ADVISORY","categoryRef":"static_analysis","archetypeGating":{"applies":[],"excludes":[]},"status":"partial","note":"CSS/styling tokens enforced for frontend stacks; backend services use code style only","perStack":{"java":{"kind":"tool","tool":"checkstyle+pmd+spotbugs+spotless","matrixCategory":"static_analysis"},"typescript":{"kind":"tool","tool":"eslint+prettier","matrixCategory":"static_analysis"},"python":{"kind":"tool","tool":"ruff","matrixCategory":"static_analysis"},"go":{"kind":"tool","tool":"golangci-lint","matrixCategory":"static_analysis"},"rust":{"kind":"tool","tool":"clippy","matrixCategory":"static_analysis"}}},{"id":"N17","name":"Unit test framework wired (JUnit5/Vitest/pytest/go test/cargo test)","tml":"L1","gate":"BLOCKING","categoryRef":"test_framework","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"Each stack has a canonical unit test runner wired into L1 gate","perStack":{"java":{"kind":"tool","tool":"jacoco","matrixCategory":"coverage"},"typescript":{"kind":"tool","tool":"@vitest/coverage-v8","matrixCategory":"coverage"},"python":{"kind":"tool","tool":"pytest-cov","matrixCategory":"coverage"},"go":{"kind":"tool","tool":"go test -cover","matrixCategory":"coverage"},"rust":{"kind":"tool","tool":"cargo-tarpaulin","matrixCategory":"coverage"}}},{"id":"N18","name":"Code coverage gate (JaCoCo/V8/coverage.py/go cover/cargo-tarpaulin)","tml":"L2","gate":"BLOCKING","categoryRef":"test_framework","archetypeGating":{"applies":[],"excludes":[]},"kitThreshold":80,"arbiterThreshold":85,"status":"covered","note":"Coverage threshold enforced at L2; arbiter default 85% lines, kit baseline 80%","perStack":{"java":{"kind":"tool","tool":"jacoco","matrixCategory":"coverage"},"typescript":{"kind":"tool","tool":"@vitest/coverage-v8","matrixCategory":"coverage"},"python":{"kind":"tool","tool":"pytest-cov","matrixCategory":"coverage"},"go":{"kind":"tool","tool":"go test -cover","matrixCategory":"coverage"},"rust":{"kind":"tool","tool":"cargo-tarpaulin","matrixCategory":"coverage"}}},{"id":"N19","name":"Coverage trend ratchet (no regression allowed)","tml":"L2","gate":"BLOCKING","categoryRef":"test_framework","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"Coverage baseline ratchet prevents regressions across PRs","perStack":{"java":{"kind":"tool","tool":"jacoco","matrixCategory":"coverage"},"typescript":{"kind":"tool","tool":"@vitest/coverage-v8","matrixCategory":"coverage"},"python":{"kind":"tool","tool":"pytest-cov","matrixCategory":"coverage"},"go":{"kind":"tool","tool":"go test -cover","matrixCategory":"coverage"},"rust":{"kind":"tool","tool":"cargo-tarpaulin","matrixCategory":"coverage"}}},{"id":"N20","name":"Mutation testing (pitest/stryker/mutmut/go-mutesting/cargo-mutants)","tml":"L3","gate":"ADVISORY","categoryRef":"test_framework","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-29","status":"partial","note":"INV-29 enforces mutation score threshold; tooling wired per stack at L3","perStack":{"java":{"kind":"tool","tool":"jacoco","matrixCategory":"coverage"},"typescript":{"kind":"tool","tool":"@vitest/coverage-v8","matrixCategory":"coverage"},"python":{"kind":"tool","tool":"pytest-cov","matrixCategory":"coverage"},"go":{"kind":"tool","tool":"go test -cover","matrixCategory":"coverage"},"rust":{"kind":"tool","tool":"cargo-tarpaulin","matrixCategory":"coverage"}}},{"id":"N21","name":"Test isolation — no shared mutable state between tests","tml":"L1","gate":"BLOCKING","categoryRef":"test_framework","archetypeGating":{"applies":[],"excludes":[]},"status":"partial","note":"Enforced by test framework config (vitest pool isolation, JUnit @DirtiesContext)","perStack":{"java":{"kind":"tool","tool":"jacoco","matrixCategory":"coverage"},"typescript":{"kind":"tool","tool":"@vitest/coverage-v8","matrixCategory":"coverage"},"python":{"kind":"tool","tool":"pytest-cov","matrixCategory":"coverage"},"go":{"kind":"tool","tool":"go test -cover","matrixCategory":"coverage"},"rust":{"kind":"tool","tool":"cargo-tarpaulin","matrixCategory":"coverage"}}},{"id":"N22","name":"Test naming convention enforced","tml":"L1","gate":"BLOCKING","categoryRef":"test_framework","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-06","status":"covered","note":"check-test-naming.mjs enforces naming contract at L1","perStack":{"java":{"kind":"tool","tool":"jacoco","matrixCategory":"coverage"},"typescript":{"kind":"tool","tool":"@vitest/coverage-v8","matrixCategory":"coverage"},"python":{"kind":"tool","tool":"pytest-cov","matrixCategory":"coverage"},"go":{"kind":"tool","tool":"go test -cover","matrixCategory":"coverage"},"rust":{"kind":"tool","tool":"cargo-tarpaulin","matrixCategory":"coverage"}}},{"id":"N23","name":"Test TDD evidence captured (W4 protocol)","tml":"L2","gate":"ADVISORY","categoryRef":"test_framework","archetypeGating":{"applies":[],"excludes":[]},"status":"partial","note":"W4 TDD evidence under .arbiter/evidence/tdd/; enforced by check-tdd-evidence.mjs at L2","perStack":{"java":{"kind":"tool","tool":"jacoco","matrixCategory":"coverage"},"typescript":{"kind":"tool","tool":"@vitest/coverage-v8","matrixCategory":"coverage"},"python":{"kind":"tool","tool":"pytest-cov","matrixCategory":"coverage"},"go":{"kind":"tool","tool":"go test -cover","matrixCategory":"coverage"},"rust":{"kind":"tool","tool":"cargo-tarpaulin","matrixCategory":"coverage"}}},{"id":"N24","name":"Fast test profile (L1 unit only, <2 min)","tml":"L2","gate":"BLOCKING","categoryRef":"test_profiles","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"L1 gate runs unit tests only; integration tests excluded via vitest/gradle profile","perStack":{"java":{"kind":"gap"},"typescript":{"kind":"gap"},"python":{"kind":"gap"},"go":{"kind":"gap"},"rust":{"kind":"gap"}}},{"id":"N25","name":"Extended test profile (L2: unit + integration)","tml":"L2","gate":"BLOCKING","categoryRef":"test_profiles","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"L2 gate runs full test suite including integration tests","perStack":{"java":{"kind":"gap"},"typescript":{"kind":"gap"},"python":{"kind":"gap"},"go":{"kind":"gap"},"rust":{"kind":"gap"}}},{"id":"N26","name":"Nightly/weekly test profile (L3: full suite + mutation + security)","tml":"L3","gate":"BLOCKING","categoryRef":"test_profiles","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"T4/T5 nightly+weekly CI tiers run mutation, DAST, fuzz, full security scans","perStack":{"java":{"kind":"gap"},"typescript":{"kind":"gap"},"python":{"kind":"gap"},"go":{"kind":"gap"},"rust":{"kind":"gap"}}},{"id":"N27","name":"Integration tests (Spring IT / testcontainers / real-project fixtures)","tml":"L1","gate":"BLOCKING","categoryRef":"test_types","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"Real-project fixture tests run per stack; integration tests in L2 profile","perStack":{"java":{"kind":"tool","tool":"pact-jvm","matrixCategory":"contract"},"typescript":{"kind":"tool","tool":"@pact-foundation/pact","matrixCategory":"contract"},"python":{"kind":"tool","tool":"pact-python","matrixCategory":"contract"},"go":{"kind":"tool","tool":"pact_consumer (Go)","matrixCategory":"contract"},"rust":{"kind":"tool","tool":"pact_consumer","matrixCategory":"contract"}}},{"id":"N28","name":"Contract tests (Spring Cloud Contract / Pact)","tml":"L2","gate":"ADVISORY","categoryRef":"test_types","archetypeGating":{"applies":[],"excludes":[]},"status":"partial","note":"Contract testing enforced at L2 for service APIs; coverage varies by stack","perStack":{"java":{"kind":"tool","tool":"pact-jvm","matrixCategory":"contract"},"typescript":{"kind":"tool","tool":"@pact-foundation/pact","matrixCategory":"contract"},"python":{"kind":"tool","tool":"pact-python","matrixCategory":"contract"},"go":{"kind":"tool","tool":"pact_consumer (Go)","matrixCategory":"contract"},"rust":{"kind":"tool","tool":"pact_consumer","matrixCategory":"contract"}}},{"id":"N29","name":"BDD / behavioural tests (Cucumber / pytest-bdd / godog)","tml":"L2","gate":"ADVISORY","categoryRef":"test_types","archetypeGating":{"applies":[],"excludes":[]},"status":"partial","note":"BDD tooling available cross-stack; enforcement level varies by archetype","perStack":{"java":{"kind":"tool","tool":"pact-jvm","matrixCategory":"contract"},"typescript":{"kind":"tool","tool":"@pact-foundation/pact","matrixCategory":"contract"},"python":{"kind":"tool","tool":"pact-python","matrixCategory":"contract"},"go":{"kind":"tool","tool":"pact_consumer (Go)","matrixCategory":"contract"},"rust":{"kind":"tool","tool":"pact_consumer","matrixCategory":"contract"}}},{"id":"N30","name":"Architectural tests (ArchUnit / structure rules)","tml":"L2","gate":"BLOCKING","categoryRef":"test_types","archetypeGating":{"applies":["hexagonal"],"excludes":[]},"status":"partial","note":"Architecture rule tests wired for hexagonal archetype; other archetypes use static analysis","perStack":{"java":{"kind":"tool","tool":"pact-jvm","matrixCategory":"contract"},"typescript":{"kind":"tool","tool":"@pact-foundation/pact","matrixCategory":"contract"},"python":{"kind":"tool","tool":"pact-python","matrixCategory":"contract"},"go":{"kind":"tool","tool":"pact_consumer (Go)","matrixCategory":"contract"},"rust":{"kind":"tool","tool":"pact_consumer","matrixCategory":"contract"}}},{"id":"N31","name":"Fuzz testing (Jazzer / go-fuzz / cargo-fuzz)","tml":"L3","gate":"ADVISORY","categoryRef":"test_types","archetypeGating":{"applies":[],"excludes":[]},"status":"partial","note":"Fuzz testing supported at L3 nightly tier; tooling coverage varies by stack","perStack":{"java":{"kind":"tool","tool":"pact-jvm","matrixCategory":"contract"},"typescript":{"kind":"tool","tool":"@pact-foundation/pact","matrixCategory":"contract"},"python":{"kind":"tool","tool":"pact-python","matrixCategory":"contract"},"go":{"kind":"tool","tool":"pact_consumer (Go)","matrixCategory":"contract"},"rust":{"kind":"tool","tool":"pact_consumer","matrixCategory":"contract"}}},{"id":"N32","name":"Property-based testing (QuickCheck / Hypothesis / proptest)","tml":"L3","gate":"ADVISORY","categoryRef":"test_types","archetypeGating":{"applies":[],"excludes":[]},"status":"missing","note":"Property-based testing not yet wired into arbiter gate; follow-up opportunity","perStack":{"java":{"kind":"gap","suggestedTool":"junit-quickcheck or jqwik","reason":"Property-based testing for Java not yet wired into arbiter gate; jqwik and junit-quickcheck are established options worth adding to the test types matrix"},"typescript":{"kind":"gap","suggestedTool":"fast-check","reason":"fast-check is the standard property-based testing library for TypeScript/JavaScript; not yet wired into arbiter gate"},"python":{"kind":"gap","suggestedTool":"hypothesis","reason":"Hypothesis is the canonical property-based testing library for Python; mature and widely used; not yet wired into arbiter gate"},"go":{"kind":"gap","suggestedTool":"gopter or rapid","reason":"gopter and rapid provide property-based testing for Go; not yet wired into arbiter gate"},"rust":{"kind":"gap","suggestedTool":"proptest","reason":"proptest is the dominant property-based testing library for Rust; not yet wired into arbiter gate"}}},{"id":"N33","name":"Snapshot / golden-file tests","tml":"L2","gate":"ADVISORY","categoryRef":"test_types","archetypeGating":{"applies":[],"excludes":[]},"status":"partial","note":"Snapshot tests used in arbiter self-tests (api-snapshot.mjs); pattern available cross-stack","perStack":{"java":{"kind":"tool","tool":"pact-jvm","matrixCategory":"contract"},"typescript":{"kind":"tool","tool":"@pact-foundation/pact","matrixCategory":"contract"},"python":{"kind":"tool","tool":"pact-python","matrixCategory":"contract"},"go":{"kind":"tool","tool":"pact_consumer (Go)","matrixCategory":"contract"},"rust":{"kind":"tool","tool":"pact_consumer","matrixCategory":"contract"}}},{"id":"N34","name":"Multi-tier CI pipeline (fast → extended → release → nightly → weekly)","tml":"L2","gate":"BLOCKING","categoryRef":"cicd","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-73","status":"covered","note":"6-tier CI model (T0..T5) enforced by workflow runner checks and ci-alignment gate","perStack":{"java":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"},"typescript":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"},"python":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"},"go":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"},"rust":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"}}},{"id":"N35","name":"PR fast-feedback gate (<5 min, L1 checks only)","tml":"L2","gate":"BLOCKING","categoryRef":"cicd","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-73","status":"covered","note":"T1 (check subcommand) completes in ~2 min; T2 (gate) in ~10 min","perStack":{"java":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"},"typescript":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"},"python":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"},"go":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"},"rust":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"}}},{"id":"N36","name":"Release pipeline (tag-triggered, artifact signing)","tml":"L3","gate":"BLOCKING","categoryRef":"cicd","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-79","status":"covered","note":"Release workflow signs artifacts with cosign; SLSA provenance via attest-build-provenance","perStack":{"java":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"},"typescript":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"},"python":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"},"go":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"},"rust":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"}}},{"id":"N37","name":"Nightly extended checks (mutation, DAST, performance baseline)","tml":"L3","gate":"ADVISORY","categoryRef":"cicd","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-76","status":"covered","note":"T4 nightly tier runs mutation + DAST + fuzz; heartbeat monitor keeps pipeline honest","perStack":{"java":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"},"typescript":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"},"python":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"},"go":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"},"rust":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"}}},{"id":"N38","name":"Weekly audit pipeline (dependency audit, license scan, SBOM refresh)","tml":"L3","gate":"ADVISORY","categoryRef":"cicd","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"T5 weekly tier runs npm audit, license scan, SBOM refresh, gitleaks full scan","perStack":{"java":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"},"typescript":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"},"python":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"},"go":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"},"rust":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"}}},{"id":"N39","name":"CI runner label SSOT (no hardcoded runner strings)","tml":"L2","gate":"BLOCKING","categoryRef":"cicd","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-13","status":"covered","note":"INV-13 enforces CI_BUILD_RUNNER_LABEL repo variable as SSOT; downstream-generated check-workflow-runners gates this in target repos","perStack":{"java":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"},"typescript":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"},"python":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"},"go":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"},"rust":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"}}},{"id":"N40","name":"Artifact provenance (SLSA / sigstore)","tml":"L3","gate":"BLOCKING","categoryRef":"cicd","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-78","status":"covered","note":"SLSA provenance generated via actions/attest-build-provenance for all release artifacts","perStack":{"java":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"},"typescript":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"},"python":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"},"go":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"},"rust":{"kind":"tool","tool":"gitleaks","matrixCategory":"secret_scan"}}},{"id":"N41","name":"E2E API tests (RestAssured / Playwright / pytest-playwright)","tml":"L3","gate":"BLOCKING","categoryRef":"e2e_perf","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"E2E tests wired at L3 nightly tier; Playwright for browser stacks, RestAssured for Java APIs","perStack":{"java":{"kind":"tool","tool":"RestAssured IT","matrixCategory":"e2e"},"typescript":{"kind":"tool","tool":"Playwright","matrixCategory":"e2e"},"python":{"kind":"tool","tool":"Playwright / pytest-playwright","matrixCategory":"e2e"},"go":{"kind":"tool","tool":"owasp-zap","matrixCategory":"dast"},"rust":{"kind":"tool","tool":"owasp-zap","matrixCategory":"dast"}}},{"id":"N42","name":"Performance / load testing baseline (k6 / Locust / Gatling)","tml":"L3","gate":"ADVISORY","categoryRef":"e2e_perf","archetypeGating":{"applies":[],"excludes":[]},"status":"missing","note":"Performance testing tooling not yet generated by arbiter; follow-up opportunity","perStack":{"java":{"kind":"gap","suggestedTool":"Gatling or JMeter","followupIssue":862,"reason":"Performance testing for Java services not yet generated by arbiter; Gatling is preferred for modern JVM services in automated CI pipelines"},"typescript":{"kind":"gap","suggestedTool":"k6","followupIssue":862,"reason":"k6 is the standard load testing tool for TypeScript/Node.js services; not yet generated by arbiter; follow-up in sibling epic"},"python":{"kind":"gap","suggestedTool":"Locust","followupIssue":862,"reason":"Locust is the canonical load testing framework for Python services; not yet generated by arbiter; follow-up in sibling epic"},"go":{"kind":"gap","suggestedTool":"k6 or hey","followupIssue":862,"reason":"k6 or hey for Go service load testing; not yet generated by arbiter; follow-up in sibling epic"},"rust":{"kind":"gap","suggestedTool":"drill or criterion","followupIssue":862,"reason":"drill for HTTP load testing or criterion for micro-benchmarking in Rust; not yet generated by arbiter; follow-up in sibling epic"}}},{"id":"N43","name":"DAST scan (OWASP ZAP / Nuclei)","tml":"L3","gate":"ADVISORY","categoryRef":"e2e_perf","archetypeGating":{"applies":[],"excludes":[]},"status":"partial","note":"DAST wired at T4 nightly tier; ZAP scan against running service","perStack":{"java":{"kind":"tool","tool":"RestAssured IT","matrixCategory":"e2e"},"typescript":{"kind":"tool","tool":"Playwright","matrixCategory":"e2e"},"python":{"kind":"tool","tool":"Playwright / pytest-playwright","matrixCategory":"e2e"},"go":{"kind":"tool","tool":"owasp-zap","matrixCategory":"dast"},"rust":{"kind":"tool","tool":"owasp-zap","matrixCategory":"dast"}}},{"id":"N44","name":"Auth flow E2E (Keycloak-compatible IdP integration test)","tml":"L3","gate":"ADVISORY","categoryRef":"e2e_perf","archetypeGating":{"applies":[],"excludes":[]},"status":"missing","note":"Auth E2E testing against a Keycloak-compatible IdP; not yet generated by arbiter","perStack":{"java":{"kind":"gap","suggestedTool":"WireMock + TestContainers Keycloak-compatible IdP","followupIssue":862,"reason":"Auth E2E testing with a Keycloak-compatible IdP requires TestContainers integration; not yet generated by arbiter; follow-up in sibling epic"},"typescript":{"kind":"gap","suggestedTool":"Playwright + mock OIDC provider","followupIssue":862,"reason":"Auth flow E2E for TypeScript frontend/BFF requires Playwright with a mock Keycloak-compatible IdP; not yet generated by arbiter"},"python":{"kind":"gap","suggestedTool":"pytest + mock OIDC provider","followupIssue":862,"reason":"Auth E2E for Python services requires mock Keycloak-compatible IdP integration; not yet generated by arbiter"},"go":{"kind":"gap","suggestedTool":"httptest + mock OIDC provider","followupIssue":862,"reason":"Auth E2E for Go services requires mock Keycloak-compatible IdP; not yet generated by arbiter; follow-up in sibling epic"},"rust":{"kind":"gap","suggestedTool":"reqwest + mock OIDC provider","followupIssue":862,"reason":"Auth E2E for Rust services requires mock Keycloak-compatible IdP integration; not yet generated by arbiter"}}},{"id":"N45","name":"Format validation script (check-format.sh equivalent)","tml":"L1","gate":"BLOCKING","categoryRef":"scripts_validation","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"Format check is part of L1 gate (prettier/spotless/black/gofmt/rustfmt)","perStack":{"java":{"kind":"gap"},"typescript":{"kind":"gap"},"python":{"kind":"gap"},"go":{"kind":"gap"},"rust":{"kind":"gap"}}},{"id":"N46","name":"SPDX license header check","tml":"L1","gate":"BLOCKING","categoryRef":"scripts_validation","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-20","status":"covered","note":"check-spdx-headers.mjs enforces Apache-2.0 SPDX headers at L1","perStack":{"java":{"kind":"gap"},"typescript":{"kind":"gap"},"python":{"kind":"gap"},"go":{"kind":"gap"},"rust":{"kind":"gap"}}},{"id":"N47","name":"Orphan TODO check (no bare TODOs without task IDs)","tml":"L1","gate":"BLOCKING","categoryRef":"scripts_validation","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-06","status":"covered","note":"check-no-orphan-todo.mjs gates orphan TODOs at L1; post-edit hook enforces inline","perStack":{"java":{"kind":"gap"},"typescript":{"kind":"gap"},"python":{"kind":"gap"},"go":{"kind":"gap"},"rust":{"kind":"gap"}}},{"id":"N48","name":"Placeholder check (no template placeholders committed)","tml":"L1","gate":"BLOCKING","categoryRef":"scripts_validation","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"check-no-placeholders.mjs gates placeholder patterns at L1","perStack":{"java":{"kind":"gap"},"typescript":{"kind":"gap"},"python":{"kind":"gap"},"go":{"kind":"gap"},"rust":{"kind":"gap"}}},{"id":"N49","name":"Dead link / doc link integrity check","tml":"L2","gate":"ADVISORY","categoryRef":"scripts_validation","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"check-doc-links.mjs validates internal doc links at L1 gate","perStack":{"java":{"kind":"gap"},"typescript":{"kind":"gap"},"python":{"kind":"gap"},"go":{"kind":"gap"},"rust":{"kind":"gap"}}},{"id":"N50","name":"Bloat ratchet (bundle size / generated artifact size)","tml":"L2","gate":"ADVISORY","categoryRef":"scripts_validation","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"check-bloat-ratchet.mjs enforces size baseline at L1; refuses shrink without --allow-shrink","perStack":{"java":{"kind":"gap"},"typescript":{"kind":"gap"},"python":{"kind":"gap"},"go":{"kind":"gap"},"rust":{"kind":"gap"}}},{"id":"N51","name":"Debt ratchet (tech-debt score gate)","tml":"L1","gate":"ADVISORY","categoryRef":"scripts_quality","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"debt-report.mjs --gate enforced at L2; debt score cannot increase without explicit override","perStack":{"java":{"kind":"gap"},"typescript":{"kind":"gap"},"python":{"kind":"gap"},"go":{"kind":"gap"},"rust":{"kind":"gap"}}},{"id":"N52","name":"Self-dogfood check (arbiter validates itself)","tml":"L1","gate":"BLOCKING","categoryRef":"scripts_quality","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-75","status":"covered","note":"INV-75/76: downstream check-action-pins + check-workflow-perms gates run at L1 in target repos; arbiter self-dogfood retired during CI freeze (#862)","perStack":{"java":{"kind":"gap"},"typescript":{"kind":"gap"},"python":{"kind":"gap"},"go":{"kind":"gap"},"rust":{"kind":"gap"}}},{"id":"N53","name":"API snapshot test (no unintended public surface changes)","tml":"L2","gate":"BLOCKING","categoryRef":"scripts_quality","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"check-api-snapshot.mjs gates API surface at L1; changes require explicit snapshot update","perStack":{"java":{"kind":"gap"},"typescript":{"kind":"gap"},"python":{"kind":"gap"},"go":{"kind":"gap"},"rust":{"kind":"gap"}}},{"id":"N54","name":"Circular dependency detection","tml":"L1","gate":"BLOCKING","categoryRef":"scripts_quality","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-03","status":"covered","note":"madge --circular at L1 gate; post-edit hook checks after every TS/JS edit","perStack":{"java":{"kind":"gap"},"typescript":{"kind":"gap"},"python":{"kind":"gap"},"go":{"kind":"gap"},"rust":{"kind":"gap"}}},{"id":"N55","name":"Secret scanning (Gitleaks)","tml":"L1","gate":"BLOCKING","categoryRef":"security","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-24","status":"covered","note":"Gitleaks on staged files (pre-commit hook) + full repo scan at L2 gate","perStack":{"java":{"kind":"tool","tool":"trivy fs","matrixCategory":"security"},"typescript":{"kind":"tool","tool":"npm audit","matrixCategory":"security"},"python":{"kind":"tool","tool":"pip-audit","matrixCategory":"security"},"go":{"kind":"tool","tool":"govulncheck","matrixCategory":"security"},"rust":{"kind":"tool","tool":"cargo audit","matrixCategory":"security"}}},{"id":"N56","name":"Dependency audit (npm audit / trivy fs / cargo audit)","tml":"L2","gate":"BLOCKING","categoryRef":"security","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"npm audit at L2 gate; cargo audit / pip-audit supported; blocks on HIGH+ severity","perStack":{"java":{"kind":"tool","tool":"trivy fs","matrixCategory":"security"},"typescript":{"kind":"tool","tool":"npm audit","matrixCategory":"security"},"python":{"kind":"tool","tool":"pip-audit","matrixCategory":"security"},"go":{"kind":"tool","tool":"govulncheck","matrixCategory":"security"},"rust":{"kind":"tool","tool":"cargo audit","matrixCategory":"security"}}},{"id":"N57","name":"Container image scan (Trivy)","tml":"L3","gate":"BLOCKING","categoryRef":"security","archetypeGating":{"applies":[],"excludes":[]},"status":"partial","note":"Trivy container scan at T5 weekly tier; generated for services with Dockerfile","perStack":{"java":{"kind":"tool","tool":"trivy fs","matrixCategory":"security"},"typescript":{"kind":"tool","tool":"npm audit","matrixCategory":"security"},"python":{"kind":"tool","tool":"pip-audit","matrixCategory":"security"},"go":{"kind":"tool","tool":"govulncheck","matrixCategory":"security"},"rust":{"kind":"tool","tool":"cargo audit","matrixCategory":"security"}}},{"id":"N58","name":"License scan (FOSSA / ORT / licensee)","tml":"L3","gate":"ADVISORY","categoryRef":"security","archetypeGating":{"applies":[],"excludes":[]},"status":"partial","note":"License scan at T5 weekly tier; blocks on GPL/AGPL in permissively-licensed services","perStack":{"java":{"kind":"tool","tool":"trivy fs","matrixCategory":"security"},"typescript":{"kind":"tool","tool":"npm audit","matrixCategory":"security"},"python":{"kind":"tool","tool":"pip-audit","matrixCategory":"security"},"go":{"kind":"tool","tool":"govulncheck","matrixCategory":"security"},"rust":{"kind":"tool","tool":"cargo audit","matrixCategory":"security"}}},{"id":"N59","name":"Commit message format enforced (commitlint)","tml":"L1","gate":"BLOCKING","categoryRef":"git_github","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"commitlint wired at L1 gate + post-commit hook checks format after every commit","perStack":{"java":{"kind":"gap"},"typescript":{"kind":"gap"},"python":{"kind":"gap"},"go":{"kind":"gap"},"rust":{"kind":"gap"}}},{"id":"N60","name":"Branch naming convention enforced","tml":"L1","gate":"BLOCKING","categoryRef":"git_github","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"task/* branch convention enforced by execution protocol; pre-commit guard via AGENTS.md","perStack":{"java":{"kind":"gap"},"typescript":{"kind":"gap"},"python":{"kind":"gap"},"go":{"kind":"gap"},"rust":{"kind":"gap"}}},{"id":"N61","name":"PR template (description, test plan, checklist)","tml":"L1","gate":"ADVISORY","categoryRef":"git_github","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":".github/pull_request_template.md generated for target projects","perStack":{"java":{"kind":"gap"},"typescript":{"kind":"gap"},"python":{"kind":"gap"},"go":{"kind":"gap"},"rust":{"kind":"gap"}}},{"id":"N62","name":"Issue templates (bug, feature, tech-debt)","tml":"L1","gate":"ADVISORY","categoryRef":"git_github","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"GitHub issue templates generated for target projects","perStack":{"java":{"kind":"gap"},"typescript":{"kind":"gap"},"python":{"kind":"gap"},"go":{"kind":"gap"},"rust":{"kind":"gap"}}},{"id":"N63","name":"AGENTS.md / CLAUDE.md governance document","tml":"L2","gate":"BLOCKING","categoryRef":"documentation","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"AGENTS.md generated as AAIF-standard governance doc for all arbiter-managed projects","perStack":{"java":{"kind":"gap"},"typescript":{"kind":"gap"},"python":{"kind":"gap"},"go":{"kind":"gap"},"rust":{"kind":"gap"}}},{"id":"N64","name":"CI/CD developer reference card","tml":"L2","gate":"ADVISORY","categoryRef":"documentation","archetypeGating":{"applies":[],"excludes":[]},"status":"missing","note":"CI developer reference template provided (TPL_cicd-developer-reference); generator deferred to Phase D","perStack":{"java":{"kind":"gap","suggestedGenerator":"cicd-developer-reference.ts","followupIssue":862,"reason":"CI/CD developer reference card for Java services requires a generator emitting the parametric template; deferred to Phase D of sibling epic"},"typescript":{"kind":"gap","suggestedGenerator":"cicd-developer-reference.ts","followupIssue":862,"reason":"CI/CD developer reference card for TypeScript services requires a generator emitting the parametric template; deferred to Phase D of sibling epic"},"python":{"kind":"gap","suggestedGenerator":"cicd-developer-reference.ts","followupIssue":862,"reason":"CI/CD developer reference card for Python services requires a generator emitting the parametric template; deferred to Phase D of sibling epic"},"go":{"kind":"gap","suggestedGenerator":"cicd-developer-reference.ts","followupIssue":862,"reason":"CI/CD developer reference card for Go services requires a generator emitting the parametric template; deferred to Phase D of sibling epic"},"rust":{"kind":"gap","suggestedGenerator":"cicd-developer-reference.ts","followupIssue":862,"reason":"CI/CD developer reference card for Rust services requires a generator emitting the parametric template; deferred to Phase D of sibling epic"}}},{"id":"N65","name":"Architecture decision records (ADRs)","tml":"L2","gate":"ADVISORY","categoryRef":"documentation","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"docs/SYSTEM/DECISIONS.md generated and maintained as ADR log for arbiter-managed projects","perStack":{"java":{"kind":"gap"},"typescript":{"kind":"gap"},"python":{"kind":"gap"},"go":{"kind":"gap"},"rust":{"kind":"gap"}}},{"id":"N66","name":"API / OpenAPI specification","tml":"L3","gate":"ADVISORY","categoryRef":"documentation","archetypeGating":{"applies":[],"excludes":[]},"status":"missing","note":"OpenAPI spec generation not yet in arbiter scope; follow-up opportunity","perStack":{"java":{"kind":"gap","suggestedGenerator":"openapi-spec.ts","followupIssue":862,"reason":"OpenAPI specification generation for Java services (SpringDoc/Springfox) not yet in arbiter scope; follow-up opportunity in sibling epic"},"typescript":{"kind":"gap","suggestedGenerator":"openapi-spec.ts","followupIssue":862,"reason":"OpenAPI spec generation for TypeScript services (tsoa/zod-openapi) not yet in arbiter scope; follow-up opportunity in sibling epic"},"python":{"kind":"gap","suggestedGenerator":"openapi-spec.ts","followupIssue":862,"reason":"OpenAPI spec generation for Python services (FastAPI auto-schema) not yet in arbiter scope; follow-up opportunity in sibling epic"},"go":{"kind":"gap","suggestedGenerator":"openapi-spec.ts","followupIssue":862,"reason":"OpenAPI spec generation for Go services (swaggo/swag) not yet in arbiter scope; follow-up opportunity in sibling epic"},"rust":{"kind":"gap","suggestedGenerator":"openapi-spec.ts","followupIssue":862,"reason":"OpenAPI spec generation for Rust services (utoipa/aide) not yet in arbiter scope; follow-up opportunity in sibling epic"}}},{"id":"N67","name":"Runbook (operational playbook for oncall)","tml":"L3","gate":"ADVISORY","categoryRef":"documentation","archetypeGating":{"applies":[],"excludes":[]},"status":"missing","note":"Operational runbook template not yet generated; follow-up opportunity","perStack":{"java":{"kind":"gap","suggestedGenerator":"runbook.ts","followupIssue":862,"reason":"Operational runbook template for Java services not yet generated by arbiter; oncall playbook generation is a high-value follow-up opportunity"},"typescript":{"kind":"gap","suggestedGenerator":"runbook.ts","followupIssue":862,"reason":"Operational runbook template for TypeScript services not yet generated by arbiter; oncall playbook generation deferred to sibling epic"},"python":{"kind":"gap","suggestedGenerator":"runbook.ts","followupIssue":862,"reason":"Operational runbook template for Python services not yet generated by arbiter; oncall playbook generation deferred to sibling epic"},"go":{"kind":"gap","suggestedGenerator":"runbook.ts","followupIssue":862,"reason":"Operational runbook template for Go services not yet generated by arbiter; oncall playbook generation deferred to sibling epic"},"rust":{"kind":"gap","suggestedGenerator":"runbook.ts","followupIssue":862,"reason":"Operational runbook template for Rust services not yet generated by arbiter; oncall playbook generation deferred to sibling epic"}}},{"id":"N68","name":"Knowledge map (cross-repo canonical paths and signal sources)","tml":"L3","gate":"ADVISORY","categoryRef":"documentation","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"Canonical signal sources self-documented via .claude/knowledge-map.json track routing + the generated wiki/ (Obsidian viewer); bespoke knowledge-map gate retired in #1244","perStack":{"java":{"kind":"gap"},"typescript":{"kind":"gap"},"python":{"kind":"gap"},"go":{"kind":"gap"},"rust":{"kind":"gap"}}},{"id":"N69","name":"Runtime version SSOT (node version pinned, .nvmrc aligned)","tml":"L1","gate":"BLOCKING","categoryRef":"configuration","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-14","status":"covered","note":"check-node-version-ssot.mjs enforces single source of truth for node version at L1","perStack":{"java":{"kind":"gap"},"typescript":{"kind":"gap"},"python":{"kind":"gap"},"go":{"kind":"gap"},"rust":{"kind":"gap"}}},{"id":"N70","name":"Environment variable safety (.env.example only, no real .env committed)","tml":"L1","gate":"BLOCKING","categoryRef":"configuration","archetypeGating":{"applies":[],"excludes":[]},"invLink":"INV-24","status":"covered","note":"Gitleaks catches .env commits; arbiter generates only .env.*.example templates","perStack":{"java":{"kind":"gap"},"typescript":{"kind":"gap"},"python":{"kind":"gap"},"go":{"kind":"gap"},"rust":{"kind":"gap"}}},{"id":"N71","name":"Feature flag / experiment registry (no undocumented flags)","tml":"L2","gate":"ADVISORY","categoryRef":"configuration","archetypeGating":{"applies":[],"excludes":[]},"status":"covered","note":"src/experimental/registry.ts enforces known-experiment guard; unknown flag = exit 1","perStack":{"java":{"kind":"gap"},"typescript":{"kind":"gap"},"python":{"kind":"gap"},"go":{"kind":"gap"},"rust":{"kind":"gap"}}},{"id":"N72","name":"Multi-environment config (dev/staging/prod parity)","tml":"L3","gate":"ADVISORY","categoryRef":"configuration","archetypeGating":{"applies":[],"excludes":[]},"status":"missing","note":"Multi-env config templates not yet generated by arbiter; follow-up opportunity","perStack":{"java":{"kind":"gap","suggestedGenerator":"multi-env-config.ts","followupIssue":862,"reason":"Multi-environment config template for Java (Spring profiles dev/staging/prod) not yet generated by arbiter; Spring profile parity enforcement deferred to sibling epic"},"typescript":{"kind":"gap","suggestedGenerator":"multi-env-config.ts","followupIssue":862,"reason":"Multi-environment config template for TypeScript (dotenv-flow or similar) not yet generated by arbiter; env parity enforcement deferred to sibling epic"},"python":{"kind":"gap","suggestedGenerator":"multi-env-config.ts","followupIssue":862,"reason":"Multi-environment config template for Python (pydantic-settings profiles) not yet generated by arbiter; env parity enforcement deferred to sibling epic"},"go":{"kind":"gap","suggestedGenerator":"multi-env-config.ts","followupIssue":862,"reason":"Multi-environment config template for Go (viper profiles) not yet generated by arbiter; env parity enforcement deferred to sibling epic"},"rust":{"kind":"gap","suggestedGenerator":"multi-env-config.ts","followupIssue":862,"reason":"Multi-environment config template for Rust (config crate profiles) not yet generated by arbiter; env parity enforcement deferred to sibling epic"}}},{"id":"N73","name":"Tamper-evident audit log table DDL (security-critical operations)","tml":"L3","gate":"BLOCKING","categoryRef":"audit_trail","archetypeGating":{"applies":[],"excludes":[]},"conditionalFlag":"audit-write-services","requiresDbEngine":["postgresql","mysql","mongodb"],"status":"missing-tracked","followupIssue":862,"note":"Tamper-evident audit log for security-critical operations; DDL with insert-only grants and created_at immutability","perStack":{"java":{"kind":"gap"},"typescript":{"kind":"gap","followupIssue":862,"reason":"Tamper-evident audit log DDL for TypeScript services not yet generated by arbiter; conditional on audit-write-services flag; Phase G of sibling epic covers DB migration generators"},"python":{"kind":"gap","followupIssue":862,"reason":"Tamper-evident audit log DDL for Python services not yet generated by arbiter; conditional on audit-write-services flag; Phase G of sibling epic covers DB migration generators"},"go":{"kind":"gap","followupIssue":862,"reason":"Tamper-evident audit log DDL for Go services not yet generated by arbiter; conditional on audit-write-services flag; Phase G of sibling epic covers DB migration generators"},"rust":{"kind":"gap","followupIssue":862,"reason":"Tamper-evident audit log DDL for Rust services not yet generated by arbiter; conditional on audit-write-services flag; Phase G of sibling epic covers DB migration generators"}}},{"id":"N74","name":"Audit trigger presence (DB-level audit trigger enforced)","tml":"L3","gate":"BLOCKING","categoryRef":"audit_trail","archetypeGating":{"applies":[],"excludes":[]},"conditionalFlag":"audit-write-services","requiresDbEngine":["postgresql","mysql"],"status":"missing-tracked","followupIssue":862,"note":"Database trigger enforces audit log population for security-critical write operations","perStack":{"java":{"kind":"gap"},"typescript":{"kind":"gap","followupIssue":862,"reason":"DB audit trigger for TypeScript services not yet generated by arbiter; conditional on audit-write-services flag; Phase G of sibling epic covers per-engine trigger generators"},"python":{"kind":"gap","followupIssue":862,"reason":"DB audit trigger for Python services not yet generated by arbiter; conditional on audit-write-services flag; Phase G of sibling epic covers per-engine trigger generators"},"go":{"kind":"gap","followupIssue":862,"reason":"DB audit trigger for Go services not yet generated by arbiter; conditional on audit-write-services flag; Phase G of sibling epic covers per-engine trigger generators"},"rust":{"kind":"gap","followupIssue":862,"reason":"DB audit trigger for Rust services not yet generated by arbiter; conditional on audit-write-services flag; Phase G of sibling epic covers per-engine trigger generators"}}},{"id":"N75","name":"Audit log service interface (AuditEventService / append-only repository pattern)","tml":"L3","gate":"BLOCKING","categoryRef":"audit_trail","archetypeGating":{"applies":[],"excludes":[]},"conditionalFlag":"audit-write-services","requiresDbEngine":["postgresql","mysql","mongodb"],"status":"missing-tracked","followupIssue":862,"note":"Append-only repository pattern for audit events; no update/delete operations permitted in service layer","perStack":{"java":{"kind":"gap"},"typescript":{"kind":"gap","followupIssue":862,"reason":"Audit log service interface for TypeScript services not yet generated by arbiter; append-only repository pattern generator deferred to Phase G of sibling epic"},"python":{"kind":"gap","followupIssue":862,"reason":"Audit log service interface for Python services not yet generated by arbiter; append-only repository pattern generator deferred to Phase G of sibling epic"},"go":{"kind":"gap","followupIssue":862,"reason":"Audit log service interface for Go services not yet generated by arbiter; append-only repository pattern generator deferred to Phase G of sibling epic"},"rust":{"kind":"gap","followupIssue":862,"reason":"Audit log service interface for Rust services not yet generated by arbiter; append-only repository pattern generator deferred to Phase G of sibling epic"}}},{"id":"N76","name":"Accessibility (a11y) audit (Axe / Lighthouse / pa11y)","tml":"L3","gate":"ADVISORY","categoryRef":"a11y","archetypeGating":{"applies":["frontend","fullstack"],"excludes":["backend","api"]},"status":"partial","note":"a11y auditing for frontend archetypes; INV-61 enforces a11y gate when frontend present","perStack":{"java":{"kind":"gap"},"typescript":{"kind":"tool","tool":"axe-core/playwright","matrixCategory":"a11y"},"python":{"kind":"tool","tool":"axe-playwright-python","matrixCategory":"a11y"},"go":{"kind":"gap"},"rust":{"kind":"gap"}}},{"id":"N77","name":"Spring Modulith structural verification (ApplicationModules.verify())","tml":"L2","gate":"BLOCKING","categoryRef":"module_boundaries","archetypeGating":{"applies":["backend","api","fullstack"],"excludes":["frontend","cli","embedded"]},"conditionalFlag":"spring-boot","status":"covered","note":"Spring Modulith verifies no cyclic module dependencies and no forbidden cross-module access. Requires spring-modulith-test on the classpath.","perStack":{"java":{"kind":"gap"},"typescript":{"kind":"gap"},"python":{"kind":"gap"},"go":{"kind":"gap"},"rust":{"kind":"gap"}}},{"id":"N78","name":"Resilience patterns guide (circuit-breaker/retry/rate-limiter/timeout)","tml":"L2","gate":"ADVISORY","categoryRef":"resilience","archetypeGating":{"applies":["backend","api","fullstack"],"excludes":["frontend","cli","embedded"]},"invLink":"INV-19","status":"covered","note":"Resilience patterns guide emitted for external-call-heavy archetypes. cockatiel (TS) + Resilience4j (Java) concrete blocks. INV-19 governs external-call resilience.","perStack":{"java":{"kind":"gap"},"typescript":{"kind":"gap"},"python":{"kind":"gap"},"go":{"kind":"gap"},"rust":{"kind":"gap"}}}]
@@ -0,0 +1,8 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ import{runCli}from"../utils/run-cli.js";function issueTitle(dimId){return`kit(#1043): enforce ${dimId}`}function fetchExistingTitles(){try{const{stdout}=runCli("gh",["issue","list","--label","kit","--state","all","--limit","500","--json","title"]),parsed=JSON.parse(stdout);if(!Array.isArray(parsed))return new Set;const titles=new Set;for(const item of parsed){const title=item.title;typeof title=="string"&&titles.add(title)}return titles}catch(err){const reason=err instanceof Error?err.message:String(err);return process.stderr.write(`[emit-issues] could not fetch existing issue titles \u2014 dedup skipped: ${reason}
3
+ `),new Set}}export function emitWaveIssues(plan,dryRun){const w1=plan.waves.find(w=>w.label==="W1")?.dimensions??[];if(dryRun){for(const entry of w1)process.stderr.write(`[dry-run] would create issue: ${issueTitle(entry.dimId)}
4
+ `);return{created:0,skipped:w1.length,failed:0}}if(w1.length===0)return{created:0,skipped:0,failed:0};const existing=fetchExistingTitles();let created=0,skipped=0,failed=0;for(const entry of w1){const title=issueTitle(entry.dimId);if(existing.has(title)){process.stderr.write(`[emit-issues] skip (already exists): ${title}
5
+ `),skipped++;continue}const body=`KIT dimension \`${entry.dimId}\` (category: ${entry.category}) requires enforcement.
6
+
7
+ Generated by: \`arbiter kit install --emit-issues\``;try{runCli("gh",["issue","create","--title",title,"--label","kit","--body",body]),created++,existing.add(title)}catch(err){process.stderr.write(`[emit-issues] FAILED to create "${title}": ${err instanceof Error?err.message:String(err)}
8
+ `),failed++}}return{created,skipped,failed}}