@kontourai/flow-agents 4.0.0 → 4.2.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 (507) hide show
  1. package/.github/workflows/ci.yml +8 -0
  2. package/CHANGELOG.md +34 -0
  3. package/CONTEXT.md +5 -0
  4. package/agents/tool-security-reviewer.json +1 -1
  5. package/build/src/cli/init.js +35 -3
  6. package/build/src/cli/kit.js +95 -2
  7. package/build/src/cli/pull-work-provider.js +7 -1
  8. package/build/src/cli/validate-workflow-artifacts.js +53 -0
  9. package/build/src/cli/workflow.js +5 -1
  10. package/build/src/flow-kit/provision.d.ts +23 -0
  11. package/build/src/flow-kit/provision.js +99 -0
  12. package/build/src/flow-kit/validate.d.ts +52 -0
  13. package/build/src/flow-kit/validate.js +214 -9
  14. package/build/src/runtime-adapters.js +1 -1
  15. package/context/contracts/execution-contract.md +30 -1
  16. package/context/contracts/review-contract.md +4 -0
  17. package/context/contracts/trigger-guards.md +73 -0
  18. package/context/scripts/telemetry/lib/config.sh +29 -0
  19. package/context/settings/backlog-provider-settings.json +1 -1
  20. package/context/settings/workspace-backlog-provider-settings.example.json +1 -1
  21. package/dist/base/build/package.json +1 -1
  22. package/dist/base/build/src/cli/init.js +35 -3
  23. package/dist/base/build/src/cli/kit.js +95 -2
  24. package/dist/base/build/src/cli/pull-work-provider.js +7 -1
  25. package/dist/base/build/src/cli/validate-workflow-artifacts.js +53 -0
  26. package/dist/base/build/src/cli/workflow.js +5 -1
  27. package/dist/base/build/src/flow-kit/provision.d.ts +23 -0
  28. package/dist/base/build/src/flow-kit/provision.js +99 -0
  29. package/dist/base/build/src/flow-kit/validate.d.ts +52 -0
  30. package/dist/base/build/src/flow-kit/validate.js +214 -9
  31. package/dist/base/build/src/runtime-adapters.js +1 -1
  32. package/dist/base/context/contracts/execution-contract.md +30 -1
  33. package/dist/base/context/contracts/review-contract.md +4 -0
  34. package/dist/base/context/contracts/trigger-guards.md +73 -0
  35. package/dist/base/context/scripts/telemetry/lib/config.sh +29 -0
  36. package/dist/base/context/settings/backlog-provider-settings.json +1 -1
  37. package/dist/base/context/settings/workspace-backlog-provider-settings.example.json +1 -1
  38. package/dist/base/docs/adr/0023-kit-provisioning.md +47 -0
  39. package/dist/base/docs/adr/index.md +1 -0
  40. package/dist/base/docs/architecture-engine-and-kits.md +17 -0
  41. package/dist/base/docs/context-map.md +3 -0
  42. package/dist/base/docs/decisions/backlog-readiness-source.md +89 -0
  43. package/dist/base/docs/decisions/index.md +1 -0
  44. package/dist/base/docs/developer-architecture.md +3 -3
  45. package/dist/base/docs/flow-kit-repository-contract.md +34 -3
  46. package/dist/base/docs/kit-authoring-guide.md +1 -1
  47. package/dist/base/docs/veritas-integration.md +12 -0
  48. package/dist/base/evals/ci/run-baseline.sh +4 -0
  49. package/dist/base/evals/integration/test_kit_provisioning.sh +112 -0
  50. package/dist/base/evals/integration/test_liveness_console_relay.sh +91 -1
  51. package/dist/base/evals/integration/test_liveness_heartbeat.sh +66 -0
  52. package/dist/base/evals/integration/test_pull_work_provider.sh +18 -0
  53. package/dist/base/evals/integration/test_veritas_governance_kit.sh +256 -0
  54. package/dist/base/evals/integration/test_workflow_artifacts.sh +257 -0
  55. package/dist/base/evals/static/test_package.sh +6 -0
  56. package/dist/base/evals/static/test_workflow_skills.sh +16 -0
  57. package/dist/base/install.sh +1 -1
  58. package/dist/base/kits/builder/flows/publish-learn.flow.json +9 -1
  59. package/dist/base/kits/builder/skills/execute-plan/SKILL.md +4 -3
  60. package/dist/base/kits/builder/skills/pull-work/SKILL.md +12 -0
  61. package/dist/base/kits/builder/skills/review-work/SKILL.md +11 -0
  62. package/dist/base/kits/veritas-governance/adapter/readiness-to-trust-bundle.mjs +19 -20
  63. package/dist/base/kits/veritas-governance/assets/starter-hooks/githooks/post-commit +13 -0
  64. package/dist/base/kits/veritas-governance/assets/starter-hooks/githooks/pre-push +13 -0
  65. package/dist/base/kits/veritas-governance/assets/starter-standards/veritas/GOVERNANCE.md +23 -0
  66. package/dist/base/kits/veritas-governance/assets/starter-standards/veritas/README.md +58 -0
  67. package/dist/base/kits/veritas-governance/assets/starter-standards/veritas/authority/default.authority-settings.json +30 -0
  68. package/dist/base/kits/veritas-governance/assets/starter-standards/veritas/repo-map.json +115 -0
  69. package/dist/base/kits/veritas-governance/assets/starter-standards/veritas/repo-standards/default.repo-standards.json +54 -0
  70. package/dist/base/kits/veritas-governance/assets/starter-standards/veritas.claims.json +179 -0
  71. package/dist/base/kits/veritas-governance/docs/README.md +141 -10
  72. package/dist/base/kits/veritas-governance/fixtures/standards-authoring/approved.trust-bundle.json +74 -0
  73. package/dist/base/kits/veritas-governance/fixtures/standards-authoring/not-approved.trust-bundle.json +74 -0
  74. package/dist/base/kits/veritas-governance/flows/standards-authoring.flow.json +35 -0
  75. package/dist/base/kits/veritas-governance/kit.json +65 -0
  76. package/dist/base/kits/veritas-governance/skills/consult-standards/SKILL.md +73 -0
  77. package/dist/base/kits/veritas-governance/skills/standards-authoring/SKILL.md +87 -0
  78. package/dist/base/schemas/backlog-provider-settings.schema.json +1 -1
  79. package/dist/base/schemas/workflow-waves.schema.json +347 -0
  80. package/dist/base/scripts/check-layer-boundary.mjs +98 -0
  81. package/dist/base/scripts/hooks/claude-telemetry-hook.js +6 -0
  82. package/dist/base/scripts/hooks/lib/liveness-heartbeat.js +42 -1
  83. package/dist/base/scripts/hooks/lib/liveness-write.js +109 -9
  84. package/dist/base/scripts/liveness/relay.sh +23 -11
  85. package/dist/base/scripts/telemetry/lib/config.sh +29 -0
  86. package/dist/catalog.json +2 -0
  87. package/dist/claude-code/.claude/agents/tool-security-reviewer.md +2 -1
  88. package/dist/claude-code/.claude/skills/consult-standards/SKILL.md +73 -0
  89. package/dist/claude-code/.claude/skills/execute-plan/SKILL.md +4 -3
  90. package/dist/claude-code/.claude/skills/pull-work/SKILL.md +12 -0
  91. package/dist/claude-code/.claude/skills/review-work/SKILL.md +11 -0
  92. package/dist/claude-code/.claude/skills/standards-authoring/SKILL.md +87 -0
  93. package/dist/claude-code/build/package.json +1 -1
  94. package/dist/claude-code/build/src/cli/init.js +35 -3
  95. package/dist/claude-code/build/src/cli/kit.js +95 -2
  96. package/dist/claude-code/build/src/cli/pull-work-provider.js +7 -1
  97. package/dist/claude-code/build/src/cli/validate-workflow-artifacts.js +53 -0
  98. package/dist/claude-code/build/src/cli/workflow.js +5 -1
  99. package/dist/claude-code/build/src/flow-kit/provision.d.ts +23 -0
  100. package/dist/claude-code/build/src/flow-kit/provision.js +99 -0
  101. package/dist/claude-code/build/src/flow-kit/validate.d.ts +52 -0
  102. package/dist/claude-code/build/src/flow-kit/validate.js +214 -9
  103. package/dist/claude-code/build/src/runtime-adapters.js +1 -1
  104. package/dist/claude-code/context/contracts/execution-contract.md +30 -1
  105. package/dist/claude-code/context/contracts/review-contract.md +4 -0
  106. package/dist/claude-code/context/contracts/trigger-guards.md +73 -0
  107. package/dist/claude-code/context/scripts/telemetry/lib/config.sh +29 -0
  108. package/dist/claude-code/context/settings/backlog-provider-settings.json +1 -1
  109. package/dist/claude-code/context/settings/workspace-backlog-provider-settings.example.json +1 -1
  110. package/dist/claude-code/docs/adr/0023-kit-provisioning.md +47 -0
  111. package/dist/claude-code/docs/adr/index.md +1 -0
  112. package/dist/claude-code/docs/architecture-engine-and-kits.md +17 -0
  113. package/dist/claude-code/docs/context-map.md +3 -0
  114. package/dist/claude-code/docs/decisions/backlog-readiness-source.md +89 -0
  115. package/dist/claude-code/docs/decisions/index.md +1 -0
  116. package/dist/claude-code/docs/developer-architecture.md +3 -3
  117. package/dist/claude-code/docs/flow-kit-repository-contract.md +34 -3
  118. package/dist/claude-code/docs/kit-authoring-guide.md +1 -1
  119. package/dist/claude-code/docs/veritas-integration.md +12 -0
  120. package/dist/claude-code/evals/ci/run-baseline.sh +4 -0
  121. package/dist/claude-code/evals/integration/test_kit_provisioning.sh +112 -0
  122. package/dist/claude-code/evals/integration/test_liveness_console_relay.sh +91 -1
  123. package/dist/claude-code/evals/integration/test_liveness_heartbeat.sh +66 -0
  124. package/dist/claude-code/evals/integration/test_pull_work_provider.sh +18 -0
  125. package/dist/claude-code/evals/integration/test_veritas_governance_kit.sh +256 -0
  126. package/dist/claude-code/evals/integration/test_workflow_artifacts.sh +257 -0
  127. package/dist/claude-code/evals/static/test_package.sh +6 -0
  128. package/dist/claude-code/evals/static/test_workflow_skills.sh +16 -0
  129. package/dist/claude-code/install.sh +1 -1
  130. package/dist/claude-code/kits/builder/flows/publish-learn.flow.json +9 -1
  131. package/dist/claude-code/kits/builder/skills/execute-plan/SKILL.md +4 -3
  132. package/dist/claude-code/kits/builder/skills/pull-work/SKILL.md +12 -0
  133. package/dist/claude-code/kits/builder/skills/review-work/SKILL.md +11 -0
  134. package/dist/claude-code/kits/veritas-governance/adapter/readiness-to-trust-bundle.mjs +19 -20
  135. package/dist/claude-code/kits/veritas-governance/assets/starter-hooks/githooks/post-commit +13 -0
  136. package/dist/claude-code/kits/veritas-governance/assets/starter-hooks/githooks/pre-push +13 -0
  137. package/dist/claude-code/kits/veritas-governance/assets/starter-standards/veritas/GOVERNANCE.md +23 -0
  138. package/dist/claude-code/kits/veritas-governance/assets/starter-standards/veritas/README.md +58 -0
  139. package/dist/claude-code/kits/veritas-governance/assets/starter-standards/veritas/authority/default.authority-settings.json +30 -0
  140. package/dist/claude-code/kits/veritas-governance/assets/starter-standards/veritas/repo-map.json +115 -0
  141. package/dist/claude-code/kits/veritas-governance/assets/starter-standards/veritas/repo-standards/default.repo-standards.json +54 -0
  142. package/dist/claude-code/kits/veritas-governance/assets/starter-standards/veritas.claims.json +179 -0
  143. package/dist/claude-code/kits/veritas-governance/docs/README.md +141 -10
  144. package/dist/claude-code/kits/veritas-governance/fixtures/standards-authoring/approved.trust-bundle.json +74 -0
  145. package/dist/claude-code/kits/veritas-governance/fixtures/standards-authoring/not-approved.trust-bundle.json +74 -0
  146. package/dist/claude-code/kits/veritas-governance/flows/standards-authoring.flow.json +35 -0
  147. package/dist/claude-code/kits/veritas-governance/kit.json +65 -0
  148. package/dist/claude-code/kits/veritas-governance/skills/consult-standards/SKILL.md +73 -0
  149. package/dist/claude-code/kits/veritas-governance/skills/standards-authoring/SKILL.md +87 -0
  150. package/dist/claude-code/schemas/backlog-provider-settings.schema.json +1 -1
  151. package/dist/claude-code/schemas/workflow-waves.schema.json +347 -0
  152. package/dist/claude-code/scripts/check-layer-boundary.mjs +98 -0
  153. package/dist/claude-code/scripts/hooks/claude-telemetry-hook.js +6 -0
  154. package/dist/claude-code/scripts/hooks/lib/liveness-heartbeat.js +42 -1
  155. package/dist/claude-code/scripts/hooks/lib/liveness-write.js +109 -9
  156. package/dist/claude-code/scripts/liveness/relay.sh +23 -11
  157. package/dist/claude-code/scripts/telemetry/lib/config.sh +29 -0
  158. package/dist/codex/.agents/skills/builder-shape/context/contracts/execution-contract.md +30 -1
  159. package/dist/codex/.agents/skills/consult-standards/SKILL.md +73 -0
  160. package/dist/codex/.agents/skills/deliver/context/contracts/execution-contract.md +30 -1
  161. package/dist/codex/.agents/skills/design-probe/context/contracts/execution-contract.md +30 -1
  162. package/dist/codex/.agents/skills/execute-plan/SKILL.md +4 -3
  163. package/dist/codex/.agents/skills/execute-plan/context/contracts/execution-contract.md +30 -1
  164. package/dist/codex/.agents/skills/fix-bug/context/contracts/execution-contract.md +30 -1
  165. package/dist/codex/.agents/skills/idea-to-backlog/context/contracts/execution-contract.md +30 -1
  166. package/dist/codex/.agents/skills/plan-work/context/contracts/execution-contract.md +30 -1
  167. package/dist/codex/.agents/skills/pull-work/SKILL.md +12 -0
  168. package/dist/codex/.agents/skills/pull-work/context/contracts/execution-contract.md +30 -1
  169. package/dist/codex/.agents/skills/review-work/SKILL.md +11 -0
  170. package/dist/codex/.agents/skills/review-work/context/contracts/execution-contract.md +30 -1
  171. package/dist/codex/.agents/skills/standards-authoring/SKILL.md +87 -0
  172. package/dist/codex/.agents/skills/tdd-workflow/context/contracts/execution-contract.md +30 -1
  173. package/dist/codex/.agents/skills/verify-work/context/contracts/execution-contract.md +30 -1
  174. package/dist/codex/.codex/agents/tool-security-reviewer.toml +1 -1
  175. package/dist/codex/build/package.json +1 -1
  176. package/dist/codex/build/src/cli/init.js +35 -3
  177. package/dist/codex/build/src/cli/kit.js +95 -2
  178. package/dist/codex/build/src/cli/pull-work-provider.js +7 -1
  179. package/dist/codex/build/src/cli/validate-workflow-artifacts.js +53 -0
  180. package/dist/codex/build/src/cli/workflow.js +5 -1
  181. package/dist/codex/build/src/flow-kit/provision.d.ts +23 -0
  182. package/dist/codex/build/src/flow-kit/provision.js +99 -0
  183. package/dist/codex/build/src/flow-kit/validate.d.ts +52 -0
  184. package/dist/codex/build/src/flow-kit/validate.js +214 -9
  185. package/dist/codex/build/src/runtime-adapters.js +1 -1
  186. package/dist/codex/context/contracts/execution-contract.md +30 -1
  187. package/dist/codex/context/contracts/review-contract.md +4 -0
  188. package/dist/codex/context/contracts/trigger-guards.md +73 -0
  189. package/dist/codex/context/scripts/telemetry/lib/config.sh +29 -0
  190. package/dist/codex/context/settings/backlog-provider-settings.json +1 -1
  191. package/dist/codex/context/settings/workspace-backlog-provider-settings.example.json +1 -1
  192. package/dist/codex/docs/adr/0023-kit-provisioning.md +47 -0
  193. package/dist/codex/docs/adr/index.md +1 -0
  194. package/dist/codex/docs/architecture-engine-and-kits.md +17 -0
  195. package/dist/codex/docs/context-map.md +3 -0
  196. package/dist/codex/docs/decisions/backlog-readiness-source.md +89 -0
  197. package/dist/codex/docs/decisions/index.md +1 -0
  198. package/dist/codex/docs/developer-architecture.md +3 -3
  199. package/dist/codex/docs/flow-kit-repository-contract.md +34 -3
  200. package/dist/codex/docs/kit-authoring-guide.md +1 -1
  201. package/dist/codex/docs/veritas-integration.md +12 -0
  202. package/dist/codex/evals/ci/run-baseline.sh +4 -0
  203. package/dist/codex/evals/integration/test_kit_provisioning.sh +112 -0
  204. package/dist/codex/evals/integration/test_liveness_console_relay.sh +91 -1
  205. package/dist/codex/evals/integration/test_liveness_heartbeat.sh +66 -0
  206. package/dist/codex/evals/integration/test_pull_work_provider.sh +18 -0
  207. package/dist/codex/evals/integration/test_veritas_governance_kit.sh +256 -0
  208. package/dist/codex/evals/integration/test_workflow_artifacts.sh +257 -0
  209. package/dist/codex/evals/static/test_package.sh +6 -0
  210. package/dist/codex/evals/static/test_workflow_skills.sh +16 -0
  211. package/dist/codex/install.sh +1 -1
  212. package/dist/codex/kits/builder/flows/publish-learn.flow.json +9 -1
  213. package/dist/codex/kits/builder/skills/execute-plan/SKILL.md +4 -3
  214. package/dist/codex/kits/builder/skills/pull-work/SKILL.md +12 -0
  215. package/dist/codex/kits/builder/skills/review-work/SKILL.md +11 -0
  216. package/dist/codex/kits/veritas-governance/adapter/readiness-to-trust-bundle.mjs +19 -20
  217. package/dist/codex/kits/veritas-governance/assets/starter-hooks/githooks/post-commit +13 -0
  218. package/dist/codex/kits/veritas-governance/assets/starter-hooks/githooks/pre-push +13 -0
  219. package/dist/codex/kits/veritas-governance/assets/starter-standards/veritas/GOVERNANCE.md +23 -0
  220. package/dist/codex/kits/veritas-governance/assets/starter-standards/veritas/README.md +58 -0
  221. package/dist/codex/kits/veritas-governance/assets/starter-standards/veritas/authority/default.authority-settings.json +30 -0
  222. package/dist/codex/kits/veritas-governance/assets/starter-standards/veritas/repo-map.json +115 -0
  223. package/dist/codex/kits/veritas-governance/assets/starter-standards/veritas/repo-standards/default.repo-standards.json +54 -0
  224. package/dist/codex/kits/veritas-governance/assets/starter-standards/veritas.claims.json +179 -0
  225. package/dist/codex/kits/veritas-governance/docs/README.md +141 -10
  226. package/dist/codex/kits/veritas-governance/fixtures/standards-authoring/approved.trust-bundle.json +74 -0
  227. package/dist/codex/kits/veritas-governance/fixtures/standards-authoring/not-approved.trust-bundle.json +74 -0
  228. package/dist/codex/kits/veritas-governance/flows/standards-authoring.flow.json +35 -0
  229. package/dist/codex/kits/veritas-governance/kit.json +65 -0
  230. package/dist/codex/kits/veritas-governance/skills/consult-standards/SKILL.md +73 -0
  231. package/dist/codex/kits/veritas-governance/skills/standards-authoring/SKILL.md +87 -0
  232. package/dist/codex/schemas/backlog-provider-settings.schema.json +1 -1
  233. package/dist/codex/schemas/workflow-waves.schema.json +347 -0
  234. package/dist/codex/scripts/check-layer-boundary.mjs +98 -0
  235. package/dist/codex/scripts/hooks/claude-telemetry-hook.js +6 -0
  236. package/dist/codex/scripts/hooks/lib/liveness-heartbeat.js +42 -1
  237. package/dist/codex/scripts/hooks/lib/liveness-write.js +109 -9
  238. package/dist/codex/scripts/liveness/relay.sh +23 -11
  239. package/dist/codex/scripts/telemetry/lib/config.sh +29 -0
  240. package/dist/kiro/agents/tool-security-reviewer.json +1 -1
  241. package/dist/kiro/build/package.json +1 -1
  242. package/dist/kiro/build/src/cli/init.js +35 -3
  243. package/dist/kiro/build/src/cli/kit.js +95 -2
  244. package/dist/kiro/build/src/cli/pull-work-provider.js +7 -1
  245. package/dist/kiro/build/src/cli/validate-workflow-artifacts.js +53 -0
  246. package/dist/kiro/build/src/cli/workflow.js +5 -1
  247. package/dist/kiro/build/src/flow-kit/provision.d.ts +23 -0
  248. package/dist/kiro/build/src/flow-kit/provision.js +99 -0
  249. package/dist/kiro/build/src/flow-kit/validate.d.ts +52 -0
  250. package/dist/kiro/build/src/flow-kit/validate.js +214 -9
  251. package/dist/kiro/build/src/runtime-adapters.js +1 -1
  252. package/dist/kiro/context/contracts/execution-contract.md +30 -1
  253. package/dist/kiro/context/contracts/review-contract.md +4 -0
  254. package/dist/kiro/context/contracts/trigger-guards.md +73 -0
  255. package/dist/kiro/context/scripts/telemetry/lib/config.sh +29 -0
  256. package/dist/kiro/context/settings/backlog-provider-settings.json +1 -1
  257. package/dist/kiro/context/settings/workspace-backlog-provider-settings.example.json +1 -1
  258. package/dist/kiro/docs/adr/0023-kit-provisioning.md +47 -0
  259. package/dist/kiro/docs/adr/index.md +1 -0
  260. package/dist/kiro/docs/architecture-engine-and-kits.md +17 -0
  261. package/dist/kiro/docs/context-map.md +3 -0
  262. package/dist/kiro/docs/decisions/backlog-readiness-source.md +89 -0
  263. package/dist/kiro/docs/decisions/index.md +1 -0
  264. package/dist/kiro/docs/developer-architecture.md +3 -3
  265. package/dist/kiro/docs/flow-kit-repository-contract.md +34 -3
  266. package/dist/kiro/docs/kit-authoring-guide.md +1 -1
  267. package/dist/kiro/docs/veritas-integration.md +12 -0
  268. package/dist/kiro/evals/ci/run-baseline.sh +4 -0
  269. package/dist/kiro/evals/integration/test_kit_provisioning.sh +112 -0
  270. package/dist/kiro/evals/integration/test_liveness_console_relay.sh +91 -1
  271. package/dist/kiro/evals/integration/test_liveness_heartbeat.sh +66 -0
  272. package/dist/kiro/evals/integration/test_pull_work_provider.sh +18 -0
  273. package/dist/kiro/evals/integration/test_veritas_governance_kit.sh +256 -0
  274. package/dist/kiro/evals/integration/test_workflow_artifacts.sh +257 -0
  275. package/dist/kiro/evals/static/test_package.sh +6 -0
  276. package/dist/kiro/evals/static/test_workflow_skills.sh +16 -0
  277. package/dist/kiro/install.sh +1 -1
  278. package/dist/kiro/kits/builder/flows/publish-learn.flow.json +9 -1
  279. package/dist/kiro/kits/builder/skills/execute-plan/SKILL.md +4 -3
  280. package/dist/kiro/kits/builder/skills/pull-work/SKILL.md +12 -0
  281. package/dist/kiro/kits/builder/skills/review-work/SKILL.md +11 -0
  282. package/dist/kiro/kits/veritas-governance/adapter/readiness-to-trust-bundle.mjs +19 -20
  283. package/dist/kiro/kits/veritas-governance/assets/starter-hooks/githooks/post-commit +13 -0
  284. package/dist/kiro/kits/veritas-governance/assets/starter-hooks/githooks/pre-push +13 -0
  285. package/dist/kiro/kits/veritas-governance/assets/starter-standards/veritas/GOVERNANCE.md +23 -0
  286. package/dist/kiro/kits/veritas-governance/assets/starter-standards/veritas/README.md +58 -0
  287. package/dist/kiro/kits/veritas-governance/assets/starter-standards/veritas/authority/default.authority-settings.json +30 -0
  288. package/dist/kiro/kits/veritas-governance/assets/starter-standards/veritas/repo-map.json +115 -0
  289. package/dist/kiro/kits/veritas-governance/assets/starter-standards/veritas/repo-standards/default.repo-standards.json +54 -0
  290. package/dist/kiro/kits/veritas-governance/assets/starter-standards/veritas.claims.json +179 -0
  291. package/dist/kiro/kits/veritas-governance/docs/README.md +141 -10
  292. package/dist/kiro/kits/veritas-governance/fixtures/standards-authoring/approved.trust-bundle.json +74 -0
  293. package/dist/kiro/kits/veritas-governance/fixtures/standards-authoring/not-approved.trust-bundle.json +74 -0
  294. package/dist/kiro/kits/veritas-governance/flows/standards-authoring.flow.json +35 -0
  295. package/dist/kiro/kits/veritas-governance/kit.json +65 -0
  296. package/dist/kiro/kits/veritas-governance/skills/consult-standards/SKILL.md +73 -0
  297. package/dist/kiro/kits/veritas-governance/skills/standards-authoring/SKILL.md +87 -0
  298. package/dist/kiro/schemas/backlog-provider-settings.schema.json +1 -1
  299. package/dist/kiro/schemas/workflow-waves.schema.json +347 -0
  300. package/dist/kiro/scripts/check-layer-boundary.mjs +98 -0
  301. package/dist/kiro/scripts/hooks/claude-telemetry-hook.js +6 -0
  302. package/dist/kiro/scripts/hooks/lib/liveness-heartbeat.js +42 -1
  303. package/dist/kiro/scripts/hooks/lib/liveness-write.js +109 -9
  304. package/dist/kiro/scripts/liveness/relay.sh +23 -11
  305. package/dist/kiro/scripts/telemetry/lib/config.sh +29 -0
  306. package/dist/opencode/.opencode/agents/tool-security-reviewer.md +2 -1
  307. package/dist/opencode/.opencode/skills/consult-standards/SKILL.md +73 -0
  308. package/dist/opencode/.opencode/skills/execute-plan/SKILL.md +4 -3
  309. package/dist/opencode/.opencode/skills/pull-work/SKILL.md +12 -0
  310. package/dist/opencode/.opencode/skills/review-work/SKILL.md +11 -0
  311. package/dist/opencode/.opencode/skills/standards-authoring/SKILL.md +87 -0
  312. package/dist/opencode/build/package.json +1 -1
  313. package/dist/opencode/build/src/cli/init.js +35 -3
  314. package/dist/opencode/build/src/cli/kit.js +95 -2
  315. package/dist/opencode/build/src/cli/pull-work-provider.js +7 -1
  316. package/dist/opencode/build/src/cli/validate-workflow-artifacts.js +53 -0
  317. package/dist/opencode/build/src/cli/workflow.js +5 -1
  318. package/dist/opencode/build/src/flow-kit/provision.d.ts +23 -0
  319. package/dist/opencode/build/src/flow-kit/provision.js +99 -0
  320. package/dist/opencode/build/src/flow-kit/validate.d.ts +52 -0
  321. package/dist/opencode/build/src/flow-kit/validate.js +214 -9
  322. package/dist/opencode/build/src/runtime-adapters.js +1 -1
  323. package/dist/opencode/context/contracts/execution-contract.md +30 -1
  324. package/dist/opencode/context/contracts/review-contract.md +4 -0
  325. package/dist/opencode/context/contracts/trigger-guards.md +73 -0
  326. package/dist/opencode/context/scripts/telemetry/lib/config.sh +29 -0
  327. package/dist/opencode/context/settings/backlog-provider-settings.json +1 -1
  328. package/dist/opencode/context/settings/workspace-backlog-provider-settings.example.json +1 -1
  329. package/dist/opencode/docs/adr/0023-kit-provisioning.md +47 -0
  330. package/dist/opencode/docs/adr/index.md +1 -0
  331. package/dist/opencode/docs/architecture-engine-and-kits.md +17 -0
  332. package/dist/opencode/docs/context-map.md +3 -0
  333. package/dist/opencode/docs/decisions/backlog-readiness-source.md +89 -0
  334. package/dist/opencode/docs/decisions/index.md +1 -0
  335. package/dist/opencode/docs/developer-architecture.md +3 -3
  336. package/dist/opencode/docs/flow-kit-repository-contract.md +34 -3
  337. package/dist/opencode/docs/kit-authoring-guide.md +1 -1
  338. package/dist/opencode/docs/veritas-integration.md +12 -0
  339. package/dist/opencode/evals/ci/run-baseline.sh +4 -0
  340. package/dist/opencode/evals/integration/test_kit_provisioning.sh +112 -0
  341. package/dist/opencode/evals/integration/test_liveness_console_relay.sh +91 -1
  342. package/dist/opencode/evals/integration/test_liveness_heartbeat.sh +66 -0
  343. package/dist/opencode/evals/integration/test_pull_work_provider.sh +18 -0
  344. package/dist/opencode/evals/integration/test_veritas_governance_kit.sh +256 -0
  345. package/dist/opencode/evals/integration/test_workflow_artifacts.sh +257 -0
  346. package/dist/opencode/evals/static/test_package.sh +6 -0
  347. package/dist/opencode/evals/static/test_workflow_skills.sh +16 -0
  348. package/dist/opencode/install.sh +1 -1
  349. package/dist/opencode/kits/builder/flows/publish-learn.flow.json +9 -1
  350. package/dist/opencode/kits/builder/skills/execute-plan/SKILL.md +4 -3
  351. package/dist/opencode/kits/builder/skills/pull-work/SKILL.md +12 -0
  352. package/dist/opencode/kits/builder/skills/review-work/SKILL.md +11 -0
  353. package/dist/opencode/kits/veritas-governance/adapter/readiness-to-trust-bundle.mjs +19 -20
  354. package/dist/opencode/kits/veritas-governance/assets/starter-hooks/githooks/post-commit +13 -0
  355. package/dist/opencode/kits/veritas-governance/assets/starter-hooks/githooks/pre-push +13 -0
  356. package/dist/opencode/kits/veritas-governance/assets/starter-standards/veritas/GOVERNANCE.md +23 -0
  357. package/dist/opencode/kits/veritas-governance/assets/starter-standards/veritas/README.md +58 -0
  358. package/dist/opencode/kits/veritas-governance/assets/starter-standards/veritas/authority/default.authority-settings.json +30 -0
  359. package/dist/opencode/kits/veritas-governance/assets/starter-standards/veritas/repo-map.json +115 -0
  360. package/dist/opencode/kits/veritas-governance/assets/starter-standards/veritas/repo-standards/default.repo-standards.json +54 -0
  361. package/dist/opencode/kits/veritas-governance/assets/starter-standards/veritas.claims.json +179 -0
  362. package/dist/opencode/kits/veritas-governance/docs/README.md +141 -10
  363. package/dist/opencode/kits/veritas-governance/fixtures/standards-authoring/approved.trust-bundle.json +74 -0
  364. package/dist/opencode/kits/veritas-governance/fixtures/standards-authoring/not-approved.trust-bundle.json +74 -0
  365. package/dist/opencode/kits/veritas-governance/flows/standards-authoring.flow.json +35 -0
  366. package/dist/opencode/kits/veritas-governance/kit.json +65 -0
  367. package/dist/opencode/kits/veritas-governance/skills/consult-standards/SKILL.md +73 -0
  368. package/dist/opencode/kits/veritas-governance/skills/standards-authoring/SKILL.md +87 -0
  369. package/dist/opencode/schemas/backlog-provider-settings.schema.json +1 -1
  370. package/dist/opencode/schemas/workflow-waves.schema.json +347 -0
  371. package/dist/opencode/scripts/check-layer-boundary.mjs +98 -0
  372. package/dist/opencode/scripts/hooks/claude-telemetry-hook.js +6 -0
  373. package/dist/opencode/scripts/hooks/lib/liveness-heartbeat.js +42 -1
  374. package/dist/opencode/scripts/hooks/lib/liveness-write.js +109 -9
  375. package/dist/opencode/scripts/liveness/relay.sh +23 -11
  376. package/dist/opencode/scripts/telemetry/lib/config.sh +29 -0
  377. package/dist/pi/.pi/skills/consult-standards/SKILL.md +73 -0
  378. package/dist/pi/.pi/skills/execute-plan/SKILL.md +4 -3
  379. package/dist/pi/.pi/skills/pull-work/SKILL.md +12 -0
  380. package/dist/pi/.pi/skills/review-work/SKILL.md +11 -0
  381. package/dist/pi/.pi/skills/standards-authoring/SKILL.md +87 -0
  382. package/dist/pi/build/package.json +1 -1
  383. package/dist/pi/build/src/cli/init.js +35 -3
  384. package/dist/pi/build/src/cli/kit.js +95 -2
  385. package/dist/pi/build/src/cli/pull-work-provider.js +7 -1
  386. package/dist/pi/build/src/cli/validate-workflow-artifacts.js +53 -0
  387. package/dist/pi/build/src/cli/workflow.js +5 -1
  388. package/dist/pi/build/src/flow-kit/provision.d.ts +23 -0
  389. package/dist/pi/build/src/flow-kit/provision.js +99 -0
  390. package/dist/pi/build/src/flow-kit/validate.d.ts +52 -0
  391. package/dist/pi/build/src/flow-kit/validate.js +214 -9
  392. package/dist/pi/build/src/runtime-adapters.js +1 -1
  393. package/dist/pi/context/contracts/execution-contract.md +30 -1
  394. package/dist/pi/context/contracts/review-contract.md +4 -0
  395. package/dist/pi/context/contracts/trigger-guards.md +73 -0
  396. package/dist/pi/context/scripts/telemetry/lib/config.sh +29 -0
  397. package/dist/pi/context/settings/backlog-provider-settings.json +1 -1
  398. package/dist/pi/context/settings/workspace-backlog-provider-settings.example.json +1 -1
  399. package/dist/pi/docs/adr/0023-kit-provisioning.md +47 -0
  400. package/dist/pi/docs/adr/index.md +1 -0
  401. package/dist/pi/docs/architecture-engine-and-kits.md +17 -0
  402. package/dist/pi/docs/context-map.md +3 -0
  403. package/dist/pi/docs/decisions/backlog-readiness-source.md +89 -0
  404. package/dist/pi/docs/decisions/index.md +1 -0
  405. package/dist/pi/docs/developer-architecture.md +3 -3
  406. package/dist/pi/docs/flow-kit-repository-contract.md +34 -3
  407. package/dist/pi/docs/kit-authoring-guide.md +1 -1
  408. package/dist/pi/docs/veritas-integration.md +12 -0
  409. package/dist/pi/evals/ci/run-baseline.sh +4 -0
  410. package/dist/pi/evals/integration/test_kit_provisioning.sh +112 -0
  411. package/dist/pi/evals/integration/test_liveness_console_relay.sh +91 -1
  412. package/dist/pi/evals/integration/test_liveness_heartbeat.sh +66 -0
  413. package/dist/pi/evals/integration/test_pull_work_provider.sh +18 -0
  414. package/dist/pi/evals/integration/test_veritas_governance_kit.sh +256 -0
  415. package/dist/pi/evals/integration/test_workflow_artifacts.sh +257 -0
  416. package/dist/pi/evals/static/test_package.sh +6 -0
  417. package/dist/pi/evals/static/test_workflow_skills.sh +16 -0
  418. package/dist/pi/install.sh +1 -1
  419. package/dist/pi/kits/builder/flows/publish-learn.flow.json +9 -1
  420. package/dist/pi/kits/builder/skills/execute-plan/SKILL.md +4 -3
  421. package/dist/pi/kits/builder/skills/pull-work/SKILL.md +12 -0
  422. package/dist/pi/kits/builder/skills/review-work/SKILL.md +11 -0
  423. package/dist/pi/kits/veritas-governance/adapter/readiness-to-trust-bundle.mjs +19 -20
  424. package/dist/pi/kits/veritas-governance/assets/starter-hooks/githooks/post-commit +13 -0
  425. package/dist/pi/kits/veritas-governance/assets/starter-hooks/githooks/pre-push +13 -0
  426. package/dist/pi/kits/veritas-governance/assets/starter-standards/veritas/GOVERNANCE.md +23 -0
  427. package/dist/pi/kits/veritas-governance/assets/starter-standards/veritas/README.md +58 -0
  428. package/dist/pi/kits/veritas-governance/assets/starter-standards/veritas/authority/default.authority-settings.json +30 -0
  429. package/dist/pi/kits/veritas-governance/assets/starter-standards/veritas/repo-map.json +115 -0
  430. package/dist/pi/kits/veritas-governance/assets/starter-standards/veritas/repo-standards/default.repo-standards.json +54 -0
  431. package/dist/pi/kits/veritas-governance/assets/starter-standards/veritas.claims.json +179 -0
  432. package/dist/pi/kits/veritas-governance/docs/README.md +141 -10
  433. package/dist/pi/kits/veritas-governance/fixtures/standards-authoring/approved.trust-bundle.json +74 -0
  434. package/dist/pi/kits/veritas-governance/fixtures/standards-authoring/not-approved.trust-bundle.json +74 -0
  435. package/dist/pi/kits/veritas-governance/flows/standards-authoring.flow.json +35 -0
  436. package/dist/pi/kits/veritas-governance/kit.json +65 -0
  437. package/dist/pi/kits/veritas-governance/skills/consult-standards/SKILL.md +73 -0
  438. package/dist/pi/kits/veritas-governance/skills/standards-authoring/SKILL.md +87 -0
  439. package/dist/pi/schemas/backlog-provider-settings.schema.json +1 -1
  440. package/dist/pi/schemas/workflow-waves.schema.json +347 -0
  441. package/dist/pi/scripts/check-layer-boundary.mjs +98 -0
  442. package/dist/pi/scripts/hooks/claude-telemetry-hook.js +6 -0
  443. package/dist/pi/scripts/hooks/lib/liveness-heartbeat.js +42 -1
  444. package/dist/pi/scripts/hooks/lib/liveness-write.js +109 -9
  445. package/dist/pi/scripts/liveness/relay.sh +23 -11
  446. package/dist/pi/scripts/telemetry/lib/config.sh +29 -0
  447. package/docs/adr/0023-kit-provisioning.md +47 -0
  448. package/docs/adr/index.md +1 -0
  449. package/docs/architecture-engine-and-kits.md +17 -0
  450. package/docs/context-map.md +3 -0
  451. package/docs/decisions/backlog-readiness-source.md +89 -0
  452. package/docs/decisions/index.md +1 -0
  453. package/docs/developer-architecture.md +3 -3
  454. package/docs/flow-kit-repository-contract.md +34 -3
  455. package/docs/kit-authoring-guide.md +1 -1
  456. package/docs/veritas-integration.md +12 -0
  457. package/evals/ci/run-baseline.sh +4 -0
  458. package/evals/integration/test_kit_provisioning.sh +112 -0
  459. package/evals/integration/test_liveness_console_relay.sh +91 -1
  460. package/evals/integration/test_liveness_heartbeat.sh +66 -0
  461. package/evals/integration/test_pull_work_provider.sh +18 -0
  462. package/evals/integration/test_veritas_governance_kit.sh +256 -0
  463. package/evals/integration/test_workflow_artifacts.sh +257 -0
  464. package/evals/static/test_package.sh +6 -0
  465. package/evals/static/test_workflow_skills.sh +16 -0
  466. package/kits/builder/flows/publish-learn.flow.json +9 -1
  467. package/kits/builder/skills/execute-plan/SKILL.md +4 -3
  468. package/kits/builder/skills/pull-work/SKILL.md +12 -0
  469. package/kits/builder/skills/review-work/SKILL.md +11 -0
  470. package/kits/veritas-governance/adapter/readiness-to-trust-bundle.mjs +19 -20
  471. package/kits/veritas-governance/assets/starter-hooks/githooks/post-commit +13 -0
  472. package/kits/veritas-governance/assets/starter-hooks/githooks/pre-push +13 -0
  473. package/kits/veritas-governance/assets/starter-standards/veritas/GOVERNANCE.md +23 -0
  474. package/kits/veritas-governance/assets/starter-standards/veritas/README.md +58 -0
  475. package/kits/veritas-governance/assets/starter-standards/veritas/authority/default.authority-settings.json +30 -0
  476. package/kits/veritas-governance/assets/starter-standards/veritas/repo-map.json +115 -0
  477. package/kits/veritas-governance/assets/starter-standards/veritas/repo-standards/default.repo-standards.json +54 -0
  478. package/kits/veritas-governance/assets/starter-standards/veritas.claims.json +179 -0
  479. package/kits/veritas-governance/docs/README.md +141 -10
  480. package/kits/veritas-governance/fixtures/standards-authoring/approved.trust-bundle.json +74 -0
  481. package/kits/veritas-governance/fixtures/standards-authoring/not-approved.trust-bundle.json +74 -0
  482. package/kits/veritas-governance/flows/standards-authoring.flow.json +35 -0
  483. package/kits/veritas-governance/kit.json +65 -0
  484. package/kits/veritas-governance/skills/consult-standards/SKILL.md +73 -0
  485. package/kits/veritas-governance/skills/standards-authoring/SKILL.md +87 -0
  486. package/package.json +2 -1
  487. package/schemas/backlog-provider-settings.schema.json +1 -1
  488. package/schemas/workflow-waves.schema.json +347 -0
  489. package/scripts/check-layer-boundary.mjs +98 -0
  490. package/scripts/hooks/claude-telemetry-hook.js +6 -0
  491. package/scripts/hooks/lib/liveness-heartbeat.js +42 -1
  492. package/scripts/hooks/lib/liveness-write.js +109 -9
  493. package/scripts/liveness/relay.sh +23 -11
  494. package/scripts/telemetry/lib/config.sh +29 -0
  495. package/src/cli/builder-flow-runtime.test.mjs +86 -0
  496. package/src/cli/flow-resolver-composition.test.mjs +20 -1
  497. package/src/cli/init.ts +31 -3
  498. package/src/cli/kit-metadata-security.test.mjs +163 -1
  499. package/src/cli/kit-provisioning.test.mjs +122 -0
  500. package/src/cli/kit.ts +83 -2
  501. package/src/cli/pull-work-provider.ts +7 -1
  502. package/src/cli/validate-waves.test.mjs +134 -0
  503. package/src/cli/validate-workflow-artifacts.ts +47 -0
  504. package/src/cli/workflow.ts +7 -1
  505. package/src/flow-kit/provision.ts +118 -0
  506. package/src/flow-kit/validate.ts +233 -10
  507. package/src/runtime-adapters.ts +1 -1
@@ -18,6 +18,13 @@ source "$ROOT/evals/lib/node.sh"
18
18
 
19
19
  TMPDIR_EVAL="$(mktemp -d)"
20
20
  trap 'rm -rf "$TMPDIR_EVAL"; [[ -n "${STUB_PID:-}" ]] && kill "$STUB_PID" 2>/dev/null' EXIT
21
+
22
+ # Hermetic HOME: the conf-driven relay resolver (#567) reads ~/.flow-agents/telemetry-console.conf
23
+ # as a resolution slot. Point HOME at an empty dir so these tests never read the running machine's
24
+ # real console conf — enablement here is controlled only by the env flag / an explicit
25
+ # TELEMETRY_CONFIG_FILE, exactly as each case sets up.
26
+ export HOME="$TMPDIR_EVAL/clean-home"
27
+ mkdir -p "$HOME"
21
28
  PORT=38795
22
29
  RECV="$TMPDIR_EVAL/recv.jsonl"
23
30
 
@@ -29,6 +36,12 @@ fail() { echo " [FAIL] $1"; errors=$((errors + 1)); }
29
36
  # controls the response — "ok" (200) or "fail" (500) — to exercise the relay-failure path.
30
37
  start_stub() {
31
38
  local mode="$1"
39
+ # Fresh port per stub: the relay POST is detached/async, so a late POST from a PRIOR "on" case
40
+ # could otherwise race into the next case's freshly-cleared RECV on a reused port and cause a
41
+ # spurious "a POST happened" failure in a "no POST" assertion. A new port each time sends any
42
+ # stray prior-case POST to a now-dead port (connection refused), never into this case's RECV.
43
+ PORT=$((PORT + 1))
44
+ ENDPOINT="http://127.0.0.1:${PORT}/records"
32
45
  STUB_MODE="$mode" node -e '
33
46
  const http=require("http"),fs=require("fs");
34
47
  const out=process.argv[1], mode=process.env.STUB_MODE||"ok";
@@ -67,7 +80,7 @@ echo "=== console liveness relay (#295) ==="
67
80
  echo "--- 1. relay on+configured: liveness emit mirrors to the Console with Bearer + tenant ---"
68
81
  : > "$RECV"; start_stub ok || { fail "stub server did not start"; }
69
82
  ROOT_A="$TMPDIR_EVAL/a"
70
- EVT1='{"type":"claim","subjectId":"relay-subj-1","actor":"claude-code:sessA:host","actor_key":"claude-code:sessA:host","at":"2026-07-05T00:00:00Z","ttlSeconds":1800,"host":"host","branch":"agent/a/relay-subj-1","artifact_dir":"relay-subj-1"}'
83
+ EVT1='{"type":"claim","subjectId":"relay-subj-1","actor":"claude-code:sessA:host","actor_key":"claude-code:sessA:host","at":"2026-07-05T00:00:00Z","ttlSeconds":1800,"host":"host","branch":"agent/a/relay-subj-1","artifact_dir":"relay-subj-1","source":"tool-activity","activity":{"tool":"Bash"}}'
71
84
  (
72
85
  export FLOW_AGENTS_CONSOLE_LIVENESS_RELAY=1
73
86
  export FLOW_AGENTS_CONSOLE_LIVENESS_ENDPOINT_URL="$ENDPOINT"
@@ -92,6 +105,8 @@ const checks=[
92
105
  ["subjectId", b.subjectId==="relay-subj-1"],
93
106
  ["actor", b.actor==="claude-code:sessA:host"],
94
107
  ["branch", b.branch==="agent/a/relay-subj-1"],
108
+ ["source tool-activity", b.source==="tool-activity"],
109
+ ["activity.tool Bash (richer real-liveness rides to the Console)", !!b.activity && b.activity.tool==="Bash"],
95
110
  ];
96
111
  for(const [name,ok] of checks) console.log((ok?"OK ":"BAD ")+name);
97
112
  ' "$RECV" > "$TMPDIR_EVAL/checks.txt" 2>&1
@@ -156,6 +171,81 @@ console.log(hasRawCtl?"RAW":"ESCAPED");
156
171
  if grep -q ESCAPED "$TMPDIR_EVAL/inj.txt"; then pass "hostile actor/branch control bytes are JSON-escaped, never raw in the POST body (injection discipline)"; else fail "raw control bytes reached the POST body: $(cat "$TMPDIR_EVAL/inj.txt")"; fi
157
172
  stop_stub
158
173
 
174
+ # ─── 6. CONF-DRIVEN enablement (#567): NO env flag, `console_liveness_relay=1` in the conf → POST ─
175
+ echo "--- 6. conf-driven (#567): console_liveness_relay=1 in the conf relays with NO env var ---"
176
+ : > "$RECV"; start_stub ok
177
+ ROOT_F="$TMPDIR_EVAL/f"
178
+ CONF6="$TMPDIR_EVAL/conf6.conf"
179
+ printf 'console_telemetry_url=https://example.invalid\nconsole_liveness_relay=1\n' > "$CONF6"
180
+ (
181
+ unset FLOW_AGENTS_CONSOLE_LIVENESS_RELAY # the whole point: no env var
182
+ export TELEMETRY_CONFIG_FILE="$CONF6"
183
+ export FLOW_AGENTS_CONSOLE_LIVENESS_ENDPOINT_URL="$ENDPOINT" # POST target (stub)
184
+ emit_event "$ROOT_F" '{"type":"claim","subjectId":"conf-on-1","actor":"a","at":"t"}'
185
+ )
186
+ [[ -s "$ROOT_F/liveness/events.jsonl" ]] && pass "local write happened (conf-driven case)" || fail "local write missing (conf-driven)"
187
+ if wait_for_post; then pass "conf-driven relay POSTed with NO env var (console_liveness_relay=1)"; else fail "conf-driven relay did NOT POST (env-var-free enablement broken)"; fi
188
+ stop_stub
189
+
190
+ # ─── 7. CONF-DRIVEN auto-on parity (#469): a console url with no explicit key defaults ON ────────
191
+ echo "--- 7. conf-driven auto-on: a console url with no explicit key relays; explicit =0 suppresses ---"
192
+ : > "$RECV"; start_stub ok
193
+ ROOT_G="$TMPDIR_EVAL/g"
194
+ CONF7="$TMPDIR_EVAL/conf7.conf"
195
+ printf 'console_telemetry_url=https://example.invalid\n' > "$CONF7" # url only, no explicit key
196
+ (
197
+ unset FLOW_AGENTS_CONSOLE_LIVENESS_RELAY
198
+ export TELEMETRY_CONFIG_FILE="$CONF7"
199
+ export FLOW_AGENTS_CONSOLE_LIVENESS_ENDPOINT_URL="$ENDPOINT"
200
+ emit_event "$ROOT_G" '{"type":"claim","subjectId":"auto-on-1","actor":"a","at":"t"}'
201
+ )
202
+ if wait_for_post; then pass "auto-on: a configured console url defaults the relay ON (#469 parity)"; else fail "auto-on did NOT POST (console-url default-on broken)"; fi
203
+ stop_stub
204
+
205
+ : > "$RECV"; start_stub ok
206
+ ROOT_H="$TMPDIR_EVAL/h"
207
+ CONF8="$TMPDIR_EVAL/conf8.conf"
208
+ printf 'console_telemetry_url=https://example.invalid\nconsole_liveness_relay=0\n' > "$CONF8" # explicit off wins
209
+ (
210
+ unset FLOW_AGENTS_CONSOLE_LIVENESS_RELAY
211
+ export TELEMETRY_CONFIG_FILE="$CONF8"
212
+ export FLOW_AGENTS_CONSOLE_LIVENESS_ENDPOINT_URL="$ENDPOINT"
213
+ emit_event "$ROOT_H" '{"type":"claim","subjectId":"conf-off-1","actor":"a","at":"t"}'
214
+ )
215
+ sleep 1
216
+ [[ -s "$ROOT_H/liveness/events.jsonl" ]] && pass "local write happened (explicit conf off)" || fail "local write missing (explicit conf off)"
217
+ [[ ! -s "$RECV" ]] && pass "explicit console_liveness_relay=0 suppresses the relay even with a url (opt-out wins)" || fail "a POST happened despite console_liveness_relay=0"
218
+ stop_stub
219
+
220
+ # ─── 8. EXFIL DEFENSE: an UNTRUSTED (mode 644) default-path conf must NOT relay (trust gate) ─────
221
+ # The cases above drive enablement through TELEMETRY_CONFIG_FILE, which is trusted BY DESIGN (an
222
+ # explicit env override bypasses the mode-600 gate). This case exercises the actual supply-chain
223
+ # defense end-to-end: a conf planted at the user-global default slot (~/.flow-agents/…, reached via
224
+ # the hermetic HOME set at the top) pointing at an attacker stub with console_liveness_relay=1, but
225
+ # mode 644 — exactly what a non-operator drop (clone/tarball/local tool) can produce, since git can
226
+ # only ship 644/755, never 600. relay.sh re-sources config.sh, whose telemetry_conf_trusted gate
227
+ # (mode 600 + owner + not-a-symlink) rejects it, so no URL resolves and nothing is POSTed — while
228
+ # the durable local write still happens. NO env flag, NO TELEMETRY_CONFIG_FILE, NO endpoint env:
229
+ # the untrusted conf is the ONLY possible signal, so a POST here would be a real exfil regression.
230
+ echo "--- 8. exfil defense: an untrusted (mode 644) ~/.flow-agents conf with an attacker url never relays ---"
231
+ : > "$RECV"; start_stub ok
232
+ ROOT_X="$TMPDIR_EVAL/x"
233
+ mkdir -p "$HOME/.flow-agents"
234
+ UNTRUSTED_CONF="$HOME/.flow-agents/telemetry-console.conf"
235
+ printf 'console_telemetry_url=http://127.0.0.1:%s\nconsole_liveness_relay=1\n' "$PORT" > "$UNTRUSTED_CONF"
236
+ chmod 644 "$UNTRUSTED_CONF"
237
+ (
238
+ unset FLOW_AGENTS_CONSOLE_LIVENESS_RELAY
239
+ unset TELEMETRY_CONFIG_FILE
240
+ unset FLOW_AGENTS_CONSOLE_LIVENESS_ENDPOINT_URL
241
+ emit_event "$ROOT_X" '{"type":"claim","subjectId":"exfil-x","actor":"a","at":"t"}'
242
+ )
243
+ sleep 1
244
+ [[ -s "$ROOT_X/liveness/events.jsonl" ]] && pass "local write happened (untrusted-conf case, local-first intact)" || fail "local write missing (untrusted conf)"
245
+ [[ ! -s "$RECV" ]] && pass "an untrusted (644) default-path conf naming an attacker url NEVER relays (trust gate holds, no exfil)" || fail "EXFIL: a POST reached the attacker stub from an untrusted 644 conf"
246
+ rm -f "$UNTRUSTED_CONF"
247
+ stop_stub
248
+
159
249
  echo ""
160
250
  if [[ "$errors" -eq 0 ]]; then
161
251
  echo "test_liveness_console_relay: all checks passed."
@@ -704,6 +704,72 @@ else
704
704
  _fail "maybeEmitHeartbeat did not neutralize an orphan heartbeat as expected: $J1_OUT"
705
705
  fi
706
706
 
707
+ # ─── K. Richer "real liveness": activity descriptor on the emitted heartbeat ────────────────
708
+ echo "--- K. Activity enrichment (tool name on the pulse) ---"
709
+
710
+ # call_heartbeat_activity <scratch_root> <env_json> <now_iso> <activity_json>
711
+ # Like call_heartbeat, but passes an `activity` descriptor through opts so we can prove the emitted
712
+ # heartbeat carries a sanitized activity field (the "what is this agent doing right now" signal).
713
+ call_heartbeat_activity() {
714
+ local root="$1" env_json="$2" now="$3" activity_json="$4"
715
+ MODULE_ARG="$HEARTBEAT_MODULE" ROOT_ARG="$root" ENV_JSON_ARG="$env_json" NOW_ARG="$now" ACTIVITY_ARG="$activity_json" \
716
+ node - <<'NODE'
717
+ const { maybeEmitHeartbeat } = require(process.env.MODULE_ARG);
718
+ const env = JSON.parse(process.env.ENV_JSON_ARG);
719
+ const opts = { cwd: process.env.ROOT_ARG, env, now: process.env.NOW_ARG, activity: JSON.parse(process.env.ACTIVITY_ARG) };
720
+ process.stdout.write(JSON.stringify(maybeEmitHeartbeat(opts)));
721
+ NODE
722
+ }
723
+
724
+ # K1: a clean tool name rides through onto the emitted heartbeat as activity.tool.
725
+ K1_ROOT="$(new_scratch)"
726
+ seed_claim "$K1_ROOT" "k1-subj" "agent-k1" "2026-06-25T12:00:00.000Z" 1800
727
+ K1_RESULT="$(call_heartbeat_activity "$K1_ROOT" '{"FLOW_AGENTS_ACTOR":"agent-k1"}' "2026-06-25T12:01:00.000Z" '{"tool":"Bash"}')"
728
+ K1_LINE="$(tail -n 1 "$(stream_file "$K1_ROOT")" 2>/dev/null)"
729
+ if [[ "$K1_RESULT" == '{"emitted":true}' ]] \
730
+ && grep -q '"type":"heartbeat"' <<<"$K1_LINE" \
731
+ && grep -q '"activity":{"tool":"Bash"}' <<<"$K1_LINE"; then
732
+ _pass "the emitted heartbeat carries a sanitized activity.tool (what the agent is doing right now)"
733
+ else
734
+ _fail "the heartbeat did not carry the expected activity.tool: result=$K1_RESULT line=$K1_LINE"
735
+ fi
736
+
737
+ # K2: an MCP-style tool name (double underscores + hyphens) survives sanitizeSegment intact.
738
+ K2_ROOT="$(new_scratch)"
739
+ seed_claim "$K2_ROOT" "k2-subj" "agent-k2" "2026-06-25T12:00:00.000Z" 1800
740
+ call_heartbeat_activity "$K2_ROOT" '{"FLOW_AGENTS_ACTOR":"agent-k2"}' "2026-06-25T12:01:00.000Z" '{"tool":"mcp__claude-in-chrome__navigate"}' >/dev/null
741
+ K2_LINE="$(tail -n 1 "$(stream_file "$K2_ROOT")" 2>/dev/null)"
742
+ if grep -q '"activity":{"tool":"mcp__claude-in-chrome__navigate"}' <<<"$K2_LINE"; then
743
+ _pass "an MCP tool name (double underscores + hyphens) rides through the allowlist sanitizer intact"
744
+ else
745
+ _fail "the MCP tool name was not preserved on the activity descriptor: line=$K2_LINE"
746
+ fi
747
+
748
+ # K3: a hostile tool name (control bytes / injection payload) is stripped to the allowlist charset —
749
+ # never emitted raw into the append-only stream.
750
+ K3_ROOT="$(new_scratch)"
751
+ seed_claim "$K3_ROOT" "k3-subj" "agent-k3" "2026-06-25T12:00:00.000Z" 1800
752
+ call_heartbeat_activity "$K3_ROOT" '{"FLOW_AGENTS_ACTOR":"agent-k3"}' "2026-06-25T12:01:00.000Z" '{"tool":"Ba\"sh\n{\"x\":1}"}' >/dev/null
753
+ K3_LINE="$(tail -n 1 "$(stream_file "$K3_ROOT")" 2>/dev/null)"
754
+ # The allowlist keeps only [A-Za-z0-9_.-], so the payload collapses to "Bashx1".
755
+ if grep -q '"activity":{"tool":"Bashx1"}' <<<"$K3_LINE" && ! grep -q 'Ba"sh' <<<"$K3_LINE"; then
756
+ _pass "a hostile tool name is stripped to the allowlist charset, never emitted raw (injection discipline)"
757
+ else
758
+ _fail "the hostile tool name was not sanitized as expected: line=$K3_LINE"
759
+ fi
760
+
761
+ # K4: no activity supplied → the heartbeat is a plain aliveness pulse with NO activity key (the field
762
+ # is omitted, not emitted empty).
763
+ K4_ROOT="$(new_scratch)"
764
+ seed_claim "$K4_ROOT" "k4-subj" "agent-k4" "2026-06-25T12:00:00.000Z" 1800
765
+ call_heartbeat "$K4_ROOT" '{"FLOW_AGENTS_ACTOR":"agent-k4"}' "2026-06-25T12:01:00.000Z" >/dev/null
766
+ K4_LINE="$(tail -n 1 "$(stream_file "$K4_ROOT")" 2>/dev/null)"
767
+ if grep -q '"type":"heartbeat"' <<<"$K4_LINE" && ! grep -q '"activity"' <<<"$K4_LINE"; then
768
+ _pass "with no activity supplied the heartbeat omits the activity field entirely (no empty-object noise)"
769
+ else
770
+ _fail "the no-activity heartbeat unexpectedly carried an activity field: line=$K4_LINE"
771
+ fi
772
+
707
773
  echo ""
708
774
  if [[ "$errors" -eq 0 ]]; then
709
775
  echo "Liveness heartbeat integration passed."
@@ -131,6 +131,24 @@ node "$SCRIPT" \
131
131
  [[ "$(json_query "$TMPDIR_EVAL/unresolved.json" "items.11.dependency_impacts.0.impact_state")" == "unknown" ]] && pass "structured-only dependency impact state is unknown without resolved ref" || fail "structured-only dependency impact state is unknown without resolved ref"
132
132
  [[ "$(json_query "$TMPDIR_EVAL/unresolved.json" "items.11.readiness.classification")" == "blocked" ]] && pass "structured-only blocker blocks without prose parsing" || fail "structured-only blocker blocks without prose parsing"
133
133
 
134
+ # Readiness Source Integrity (docs/decisions/backlog-readiness-source.md):
135
+ # reaching the issue-listing path while a BoardProvider is configured is a
136
+ # bypass of the canonical readiness source and must be loud, never silent.
137
+ [[ "$(json_query "$TMPDIR_EVAL/normalized.json" "warnings.0.code")" == "board_provider_bypassed" ]] && pass "issue-listing path with configured board surfaces board_provider_bypassed" || fail "issue-listing path with configured board surfaces board_provider_bypassed"
138
+
139
+ node -e '
140
+ const fs = require("fs");
141
+ const doc = JSON.parse(fs.readFileSync(process.argv[1], "utf8"));
142
+ const settings = doc.projects[0];
143
+ delete settings.board_provider;
144
+ fs.writeFileSync(process.argv[2], JSON.stringify(settings, null, 2));
145
+ ' "$SETTINGS" "$TMPDIR_EVAL/boardless-settings.json"
146
+ node "$SCRIPT" \
147
+ --settings-json "$TMPDIR_EVAL/boardless-settings.json" \
148
+ --issues-json "$FIXTURE" \
149
+ > "$TMPDIR_EVAL/boardless.json"
150
+ [[ "$(json_query "$TMPDIR_EVAL/boardless.json" "warnings.length")" == "0" ]] && pass "issue-listing path without a configured board emits no bypass warning" || fail "issue-listing path without a configured board emits no bypass warning"
151
+
134
152
  if [[ "$errors" -eq 0 ]]; then
135
153
  echo "Pull work provider checks passed"
136
154
  else
@@ -133,6 +133,72 @@ echo "--- exemption-issuance: gate blocks without a verified approval, passes wi
133
133
  exemption_gate_case "$KIT/fixtures/exemption/approved.trust-bundle.json" "exemption-positive" 0
134
134
  exemption_gate_case "$KIT/fixtures/exemption/not-approved.trust-bundle.json" "exemption-negative" 1
135
135
 
136
+ # --- standards-authoring flow (Slice 2 PR3): registration, gate shape, gate cases ---
137
+ # Agentless propose -> apply flow whose human-approval-gate blocks the `veritas init --apply`
138
+ # write until a human-authored standards-authoring-approval claim is verified. The kit only
139
+ # gates the sign-off; Veritas does the derivation and the write (no evaluation reimplemented).
140
+ AUTHORING_FLOWDEF="$KIT/flows/standards-authoring.flow.json"
141
+ if node -e "const f=require('$AUTHORING_FLOWDEF'); if(f.id!=='veritas-governance.standards-authoring') process.exit(1);" 2>/dev/null; then
142
+ pass "standards-authoring flow file has id veritas-governance.standards-authoring"
143
+ else
144
+ fail "standards-authoring flow file missing or has unexpected id"
145
+ fi
146
+ if rg -q '"id": *"veritas-governance\.standards-authoring"' "$KIT/kit.json" && rg -q '"path": *"flows/standards-authoring\.flow\.json"' "$KIT/kit.json"; then
147
+ pass "standards-authoring flow is registered in kit.json flows[]"
148
+ else
149
+ fail "standards-authoring flow is NOT registered in kit.json flows[]"
150
+ fi
151
+ if rg -q '"id": *"veritas-governance\.standards-authoring"' "$KIT/kit.json" && rg -q '"path": *"skills/standards-authoring/SKILL.md"' "$KIT/kit.json"; then
152
+ pass "standards-authoring skill is registered in kit.json skills[]"
153
+ else
154
+ fail "standards-authoring skill is NOT registered in kit.json skills[]"
155
+ fi
156
+ # Agentless invariant: the kit declares no flow_step_actions (would opt into Builder's
157
+ # producer-ownership contract and break the agentless gate flows).
158
+ if rg -q 'flow_step_actions' "$KIT/kit.json"; then
159
+ fail "kit.json declares flow_step_actions — veritas-governance flows are agentless"
160
+ else
161
+ pass "kit stays agentless (no flow_step_actions)"
162
+ fi
163
+ if node -e "
164
+ const f=require('$AUTHORING_FLOWDEF');
165
+ const g=f.gates['human-approval-gate'];
166
+ const bc=g.expects[0].bundle_claim;
167
+ if (g.expects[0].kind!=='trust.bundle') process.exit(1);
168
+ if (bc.claimType!=='standards-authoring-approval') process.exit(1);
169
+ if (bc.subjectType!=='repo-governance-change') process.exit(1);
170
+ if (JSON.stringify(bc.accepted_statuses)!=='[\"verified\"]') process.exit(1);
171
+ " 2>/dev/null; then
172
+ pass "standards-authoring gate expects[] kind is trust.bundle and pins claimType/subjectType/accepted_statuses exactly"
173
+ else
174
+ fail "standards-authoring gate expects[] shape does not match the pinned claim selector"
175
+ fi
176
+ # Positive/negative gate cases against the committed fixtures. $1 bundle, $2 label, $3 expect.
177
+ authoring_gate_case() {
178
+ local bundle="$1" label="$2" expect="$3"
179
+ local work="$TMP_DIR/$label"; mkdir -p "$work"; ( cd "$work" && node "$FLOW_CLI" init >/dev/null 2>&1 )
180
+ ( cd "$work" && node "$FLOW_CLI" start "$AUTHORING_FLOWDEF" --run-id "$label" >/dev/null 2>&1 )
181
+ ( cd "$work" && node "$FLOW_CLI" attach-evidence "$label" --gate human-approval-gate --file "$bundle" --bundle >"$work/attach.out" 2>&1 )
182
+ if ! rg -q 'kind: trust.bundle' "$work/attach.out"; then
183
+ fail "[$label] evidence did not attach as kind: trust.bundle"; sed -n '1,20p' "$work/attach.out"; return
184
+ fi
185
+ ( cd "$work" && node "$FLOW_CLI" evaluate "$label" --gate human-approval-gate --exit-code >"$work/eval.out" 2>&1 )
186
+ local got=$?
187
+ if [[ "$got" == "$expect" ]]; then
188
+ pass "[$label] standards-authoring gate evaluate exit $got as expected"
189
+ else
190
+ fail "[$label] standards-authoring gate evaluate exit $got, expected $expect"; sed -n '1,20p' "$work/eval.out"
191
+ fi
192
+ }
193
+ authoring_gate_case "$KIT/fixtures/standards-authoring/approved.trust-bundle.json" "authoring-positive" 0
194
+ authoring_gate_case "$KIT/fixtures/standards-authoring/not-approved.trust-bundle.json" "authoring-negative" 1
195
+ # No-fork: the authoring skill wraps the veritas CLI; it must not vendor rule/claim evaluation.
196
+ if rg -q -i 'evaluateRepoStandards|evidence-check-runner\.mjs|class +[A-Za-z]*RuleEngine|repo-standards/default\.repo-standards\.json' "$KIT/skills/standards-authoring" "$KIT/flows/standards-authoring.flow.json" 2>/dev/null; then
197
+ fail "standards-authoring skill/flow appears to vendor Veritas evaluation logic (no-fork violated)"
198
+ else
199
+ pass "no-fork: standards-authoring wraps the veritas CLI, no vendored rule/claim engine"
200
+ fi
201
+
136
202
  # --- exemption-issuance: issue-step DECLARED append semantics (AC4) --------------
137
203
  # Seed a scratch delivery/DECLARED with main's real 2-entry array (inlined here, not read
138
204
  # live from the repo, so this eval is not coupled to that file's future contents), then
@@ -364,6 +430,196 @@ else
364
430
  echo " - SKIP live Veritas leg (set VERITAS_BIN + VERITAS_GOVERNED_REPO to enable); fixtures are captured real output"
365
431
  fi
366
432
 
433
+ # --- Starter-standards provisioning (Slice 2 PR2): the kit scaffolds a runnable .veritas/ ---
434
+ # The kit declares its starter Repo Standards as provisions[]; `kit provision` copies them into
435
+ # a consumer repo. This asserts the scaffold lands and is well-formed; when a Veritas binary is
436
+ # available it further asserts `veritas readiness` runs end-to-end against the scaffolded repo.
437
+ echo "--- starter-standards provisioning ---"
438
+ FA_CLI="$ROOT/build/src/cli.js"
439
+ if [[ ! -f "$FA_CLI" ]]; then
440
+ fail "flow-agents CLI not built at build/src/cli.js (run npm run build)"
441
+ else
442
+ prov="$TMP_DIR/provisioned-repo"; mkdir -p "$prov"
443
+ if node "$FA_CLI" kit provision "$KIT" --target "$prov" >"$TMP_DIR/provision.out" 2>&1; then
444
+ pass "kit provision scaffolds starter standards into a consumer repo"
445
+ else
446
+ fail "kit provision failed"; sed -n '1,20p' "$TMP_DIR/provision.out"
447
+ fi
448
+ # Every declared provision target must land and (for JSON) parse.
449
+ starter_targets=(
450
+ ".veritas/repo-map.json"
451
+ ".veritas/repo-standards/default.repo-standards.json"
452
+ ".veritas/authority/default.authority-settings.json"
453
+ ".veritas/GOVERNANCE.md"
454
+ ".veritas/README.md"
455
+ "veritas.claims.json"
456
+ )
457
+ for rel in "${starter_targets[@]}"; do
458
+ if [[ -f "$prov/$rel" ]]; then
459
+ if [[ "$rel" == *.json ]]; then
460
+ if node -e "JSON.parse(require('fs').readFileSync(process.argv[1],'utf8'))" "$prov/$rel" >/dev/null 2>&1; then
461
+ pass "scaffolded $rel is present and valid JSON"
462
+ else
463
+ fail "scaffolded $rel is not valid JSON"
464
+ fi
465
+ else
466
+ pass "scaffolded $rel is present"
467
+ fi
468
+ else
469
+ fail "expected scaffolded file missing: $rel"
470
+ fi
471
+ done
472
+ # The scaffold must reference the Veritas engine's OWN starter output, not reimplement it:
473
+ # every provision source lives under assets/, never in adapter/ or flows/ (no-fork already
474
+ # scopes there). Assert the declared sources exist inside the kit's assets tree.
475
+ if node -e "
476
+ const fs=require('fs'),path=require('path');
477
+ const kit=JSON.parse(fs.readFileSync(process.argv[1]+'/kit.json','utf8'));
478
+ const bad=(kit.provisions||[]).filter(p=>!p.path.startsWith('assets/')||!fs.existsSync(path.join(process.argv[1],p.path)));
479
+ if(bad.length){console.error('bad provisions:',bad.map(p=>p.id).join(','));process.exit(1)}
480
+ " "$KIT" >/dev/null 2>&1; then
481
+ pass "all starter provisions source from the kit's assets/ tree"
482
+ else
483
+ fail "a starter provision points outside assets/ or at a missing file"
484
+ fi
485
+ # Live: a Veritas binary must be able to run readiness against the scaffolded repo.
486
+ VBIN2="${VERITAS_BIN:-veritas}"
487
+ if command -v "$VBIN2" >/dev/null 2>&1 || [[ -x "$VBIN2" ]]; then
488
+ ( cd "$prov" && git init -q && printf '{"name":"scaffold-eval","scripts":{"test":"node -e \"process.exit(0)\""}}\n' > package.json \
489
+ && git add -A && git -c user.email=eval@local -c user.name=eval commit -qm scaffold ) >/dev/null 2>&1
490
+ if ( cd "$prov" && "$VBIN2" readiness --working-tree >/dev/null 2>&1 ); then :; fi
491
+ if ls "$prov/.kontourai/veritas/evidence/"*.json >/dev/null 2>&1; then
492
+ pass "veritas readiness runs end-to-end on the kit-scaffolded repo (evidence report produced)"
493
+ else
494
+ fail "veritas readiness produced no evidence report on the scaffolded repo"
495
+ fi
496
+ else
497
+ echo " - SKIP scaffold readiness leg (no Veritas binary; set VERITAS_BIN to enable)"
498
+ fi
499
+ fi
500
+
501
+ # --- Governance git-hook provisioning (Slice 3 PR / #648) --------------------------
502
+ # The kit ships the two governance git hooks as provisions[]; `kit provision` lands them
503
+ # (non-executable), and a documented chmod + core.hooksPath step activates them. This asserts
504
+ # the hook files land with the expected bodies and that, once activated, the pre-push hook fires.
505
+ echo "--- governance git-hook provisioning ---"
506
+ FA_CLI2="$ROOT/build/src/cli.js"
507
+ if [[ ! -f "$FA_CLI2" ]]; then
508
+ fail "flow-agents CLI not built at build/src/cli.js (run npm run build)"
509
+ else
510
+ hookrepo="$TMP_DIR/hook-provisioned-repo"; mkdir -p "$hookrepo"
511
+ ( cd "$hookrepo" && git init -q && printf '{"name":"hook-eval","scripts":{"prepush":"echo PREPUSH-RAN"}}\n' > package.json )
512
+ if node "$FA_CLI2" kit provision "$KIT" --target "$hookrepo" >"$TMP_DIR/hookprov.out" 2>&1; then
513
+ pass "kit provision lands the governance git hooks"
514
+ else
515
+ fail "kit provision (hooks) failed"; sed -n '1,20p' "$TMP_DIR/hookprov.out"
516
+ fi
517
+ # Both hook files present, match the committed kit assets byte-for-byte, AND carry their
518
+ # defining command. The byte-match alone cannot catch a corrupted kit asset (a bad asset is
519
+ # copied verbatim and still matches itself), so a content assertion pins what each hook must do.
520
+ declare -A hook_must_contain=(
521
+ [pre-push]='npm run --if-present prepush'
522
+ [post-commit]='veritas readiness --changed-from HEAD~1 --changed-to HEAD'
523
+ )
524
+ for hook in pre-push post-commit; do
525
+ if [[ -f "$hookrepo/.githooks/$hook" ]]; then
526
+ if cmp -s "$hookrepo/.githooks/$hook" "$KIT/assets/starter-hooks/githooks/$hook"; then
527
+ pass "scaffolded .githooks/$hook matches the kit asset byte-for-byte"
528
+ else
529
+ fail "scaffolded .githooks/$hook differs from the kit asset"
530
+ fi
531
+ if grep -qF "${hook_must_contain[$hook]}" "$hookrepo/.githooks/$hook"; then
532
+ pass "scaffolded .githooks/$hook invokes its defining command (${hook_must_contain[$hook]})"
533
+ else
534
+ fail "scaffolded .githooks/$hook is missing its defining command (${hook_must_contain[$hook]}) — corrupted asset?"
535
+ fi
536
+ else
537
+ fail "expected git hook missing: .githooks/$hook"
538
+ fi
539
+ done
540
+ # Provisions land non-executable by design (the engine copy is agent-blind) — assert for BOTH.
541
+ for hook in pre-push post-commit; do
542
+ if [[ -x "$hookrepo/.githooks/$hook" ]]; then
543
+ fail "provisioned .githooks/$hook is already executable — provisioning should be agent-blind (no +x)"
544
+ else
545
+ pass "provisioned .githooks/$hook lands non-executable (agent-blind copy; activation is explicit)"
546
+ fi
547
+ done
548
+ ( cd "$hookrepo" && chmod +x .githooks/pre-push .githooks/post-commit && git config core.hooksPath .githooks )
549
+ if [[ "$(cd "$hookrepo" && git config --get core.hooksPath)" == ".githooks" ]]; then
550
+ pass "activation sets core.hooksPath to .githooks"
551
+ else
552
+ fail "activation did not set core.hooksPath"
553
+ fi
554
+ # Prove GIT actually dispatches the hook via core.hooksPath — not just direct invocation. Push
555
+ # to a local bare remote; the pre-push hook (runs `npm run --if-present prepush`) fires through
556
+ # git's own hook machinery. Output captured to a file so pipefail + git's SIGPIPE can't interfere.
557
+ ( cd "$hookrepo" && git -c user.email=eval@local -c user.name=eval commit -qm base --allow-empty ) >/dev/null 2>&1
558
+ bare="$TMP_DIR/hook-remote.git"; git init --bare -q "$bare"
559
+ ( cd "$hookrepo" && git remote add origin "$bare" && git push -q origin HEAD:refs/heads/main ) >"$TMP_DIR/gitpush.out" 2>&1
560
+ if grep -qF PREPUSH-RAN "$TMP_DIR/gitpush.out"; then
561
+ pass "git dispatches the pre-push hook via core.hooksPath (real git push fires it)"
562
+ else
563
+ fail "git push did not fire the pre-push hook via core.hooksPath"; sed -n '1,12p' "$TMP_DIR/gitpush.out"
564
+ fi
565
+ # No-fork: hook assets live under assets/, and invoke the veritas CLI — they must not vendor
566
+ # rule/claim evaluation. (assets/ is outside the adapter/flows no-fork scope; assert explicitly.)
567
+ if rg -q -i 'evaluateRepoStandards|evidence-check-runner\.mjs|class +[A-Za-z]*RuleEngine' "$KIT/assets/starter-hooks" 2>/dev/null; then
568
+ fail "governance hook assets appear to vendor Veritas evaluation logic (no-fork violated)"
569
+ else
570
+ pass "no-fork: governance hooks invoke the veritas CLI only (no vendored rule/claim engine)"
571
+ fi
572
+ fi
573
+
574
+ # --- consult-standards skill (Slice 4 / #649): JIT guidance via `veritas explain` ---------
575
+ # A pull-based advisory skill telling an agent to run `veritas explain --file <path>` before
576
+ # editing. No MCP server; wraps the veritas CLI, reimplements no evaluation.
577
+ echo "--- consult-standards skill ---"
578
+ CONSULT_SKILL="$KIT/skills/consult-standards/SKILL.md"
579
+ if [[ -f "$CONSULT_SKILL" ]]; then
580
+ pass "consult-standards SKILL.md is present"
581
+ else
582
+ fail "consult-standards SKILL.md is missing"
583
+ fi
584
+ if rg -q '"id": *"veritas-governance\.consult-standards"' "$KIT/kit.json" && rg -q '"path": *"skills/consult-standards/SKILL.md"' "$KIT/kit.json"; then
585
+ pass "consult-standards skill is registered in kit.json skills[]"
586
+ else
587
+ fail "consult-standards skill is NOT registered in kit.json skills[]"
588
+ fi
589
+ # It must point agents at `veritas explain` (the JIT producer), not vendor evaluation.
590
+ if grep -qF 'veritas explain' "$CONSULT_SKILL"; then
591
+ pass "consult-standards points at the veritas explain CLI"
592
+ else
593
+ fail "consult-standards does not reference veritas explain"
594
+ fi
595
+ if rg -q -i 'evaluateRepoStandards|evidence-check-runner\.mjs|class +[A-Za-z]*RuleEngine' "$KIT/skills/consult-standards" 2>/dev/null; then
596
+ fail "consult-standards appears to vendor Veritas evaluation logic (no-fork violated)"
597
+ else
598
+ pass "no-fork: consult-standards wraps the veritas CLI, no vendored rule/claim engine"
599
+ fi
600
+ # No-MCP invariant (#649 / ADR 0011): the kit ships no MCP server CODE and declares no MCP
601
+ # dependency. Scoped to non-markdown files so the docs' explicit "no MCP server" prose (which
602
+ # names the concept precisely to say the kit avoids it) does not trip the check.
603
+ if rg -q -i 'modelcontextprotocol|new +McpServer|StdioServerTransport|createMcpServer' "$KIT" --glob '!*.md' 2>/dev/null; then
604
+ fail "kit ships MCP server code/dependency — #649 guidance is a skill, not an MCP server (ADR 0011)"
605
+ else
606
+ pass "no MCP server: JIT guidance is an agent-pull skill (ADR 0011)"
607
+ fi
608
+ # Live leg: with a Veritas binary, a scaffolded repo's `veritas explain --file` produces JIT context.
609
+ VBIN3="${VERITAS_BIN:-veritas}"
610
+ if command -v "$VBIN3" >/dev/null 2>&1 || [[ -x "$VBIN3" ]]; then
611
+ cs="$TMP_DIR/consult-repo"; mkdir -p "$cs"
612
+ ( cd "$cs" && git init -q && printf '{"name":"consult-eval","scripts":{"test":"node -e \\"process.exit(0)\\""}}\n' > package.json && "$VBIN3" init >/dev/null 2>&1 )
613
+ explain_out="$( cd "$cs" && "$VBIN3" explain --file package.json 2>&1 )"
614
+ if printf '%s' "$explain_out" | grep -qF 'Veritas JIT Context'; then
615
+ pass "veritas explain --file produces JIT context on a governed repo (the guidance the skill invokes)"
616
+ else
617
+ fail "veritas explain --file did not produce JIT context"; printf '%s\n' "$explain_out" | sed -n '1,8p'
618
+ fi
619
+ else
620
+ echo " - SKIP consult-standards live leg (no Veritas binary; set VERITAS_BIN to enable)"
621
+ fi
622
+
367
623
  echo ""
368
624
  if [[ "$errors" -eq 0 ]]; then
369
625
  echo "PASS: veritas-governance kit gate demo (positive passes, negative blocks)"