@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
@@ -7,26 +7,36 @@
7
7
  # never forked). The Console side ingests this record type and projects the fleet view + runs the
8
8
  # janitor (console repo #125); this script is only the flow-agents EMIT half.
9
9
  #
10
- # STRICTLY OPTIONAL and local-first (ADR 0012 §5): a no-op unless FLOW_AGENTS_CONSOLE_LIVENESS_RELAY
11
- # is enabled AND a console endpoint is configured. Best-effort throughout it must NEVER block, slow,
12
- # or fail the local liveness write that already happened before this was invoked. Every failure path
13
- # is a quiet `exit 0`.
10
+ # STRICTLY OPTIONAL and local-first (ADR 0012 §5): a no-op unless the liveness relay is enabled AND a
11
+ # console endpoint is configured. Enablement is conf-driven (#567, parity with economics #469): an
12
+ # operator sets `console_liveness_relay=1` in the console conf (or it defaults on once a console url
13
+ # resolves) — NOT an env var. config.sh (sourced below) is the authoritative, trust-gated decision
14
+ # and also supplies the endpoint/token/tenant from the conf. Best-effort throughout — it must NEVER
15
+ # block, slow, or fail the local liveness write that already happened before this was invoked. Every
16
+ # failure path is a quiet `exit 0`.
14
17
  #
15
18
  # Invoked (fully detached, best-effort) from scripts/hooks/lib/liveness-write.js after the durable
16
19
  # local append. Usage: relay.sh '<liveness-event-json>'
17
20
  set -uo pipefail
18
21
 
19
- # Opt-in gate — off by default.
20
- case "${FLOW_AGENTS_CONSOLE_LIVENESS_RELAY:-}" in
21
- 1 | true | TRUE | yes | on) ;;
22
- *) exit 0 ;;
23
- esac
24
-
25
22
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" || exit 0
26
23
 
27
24
  # transport.sh sources ${TELEMETRY_DIR}/lib/redact.sh at load — point it at the telemetry lib dir,
28
25
  # then reuse the SAME console POST core the telemetry mirror uses.
29
26
  export TELEMETRY_DIR="${TELEMETRY_DIR:-$SCRIPT_DIR/../telemetry}"
27
+
28
+ # Source config.sh FIRST (best-effort, like economics-record.sh) so the conf resolves enablement
29
+ # (FLOW_AGENTS_CONSOLE_LIVENESS_RELAY) and the endpoint/token/tenant — trust-gated for default-path
30
+ # confs. This is what makes conf-only operation work with NO env var set.
31
+ # shellcheck source=/dev/null
32
+ [[ -f "$TELEMETRY_DIR/lib/config.sh" ]] && source "$TELEMETRY_DIR/lib/config.sh" 2>/dev/null || true
33
+
34
+ # Opt-in gate — off by default, now honoring the conf-derived value config.sh just resolved.
35
+ case "${FLOW_AGENTS_CONSOLE_LIVENESS_RELAY:-}" in
36
+ 1 | true | TRUE | yes | on) ;;
37
+ *) exit 0 ;;
38
+ esac
39
+
30
40
  [[ -f "$TELEMETRY_DIR/lib/transport.sh" ]] || exit 0
31
41
  # shellcheck source=/dev/null
32
42
  source "$TELEMETRY_DIR/lib/transport.sh" 2>/dev/null || exit 0
@@ -73,7 +83,9 @@ record="$(printf '%s' "$event_json" | jq -c '{
73
83
  ttlSeconds: (.ttlSeconds // null),
74
84
  host: (.host // null),
75
85
  branch: (.branch // null),
76
- artifact_dir: (.artifact_dir // .artifactDir // null)
86
+ artifact_dir: (.artifact_dir // .artifactDir // null),
87
+ source: (.source // null),
88
+ activity: (.activity // null)
77
89
  }' 2>/dev/null)" || exit 0
78
90
  [[ -z "$record" || "$record" == "null" ]] && exit 0
79
91
 
@@ -109,6 +109,13 @@ FLOW_AGENTS_CONSOLE_ECONOMICS_ENDPOINT_URL="${FLOW_AGENTS_CONSOLE_ECONOMICS_ENDP
109
109
  # Set (non-empty) only when the config file carries an explicit console_economics_relay key —
110
110
  # distinguishes "operator said 0/1" from "key absent" for the default-on rule below.
111
111
  console_economics_relay_raw=""
112
+ # Liveness relay (#567): same conf-driven, opt-out-not-silent-off shape as economics (#469) so an
113
+ # operator enables the hosted liveness mirror via console_liveness_relay=1 in the conf, NOT an env
114
+ # var/.profile. A caller-pre-set env var is the starting point; the config key overrides it; absent
115
+ # any key the default-on rule below turns it on once a console telemetry sink resolves.
116
+ FLOW_AGENTS_CONSOLE_LIVENESS_RELAY="${FLOW_AGENTS_CONSOLE_LIVENESS_RELAY:-}"
117
+ FLOW_AGENTS_CONSOLE_LIVENESS_ENDPOINT_URL="${FLOW_AGENTS_CONSOLE_LIVENESS_ENDPOINT_URL:-}"
118
+ console_liveness_relay_raw=""
112
119
  # Pricing registry source (consumed by lib/pricing.sh). Explicit file/URL win;
113
120
  # otherwise lib/pricing.sh uses the bundled pricing.json offline.
114
121
  TELEMETRY_PRICING_FILE="${TELEMETRY_PRICING_FILE:-${FLOW_AGENTS_PRICING_FILE:-}}"
@@ -164,6 +171,17 @@ if [[ -f "$TELEMETRY_CONFIG_FILE" ]]; then
164
171
  esac
165
172
  ;;
166
173
  console_economics_endpoint_url) FLOW_AGENTS_CONSOLE_ECONOMICS_ENDPOINT_URL="$value" ;;
174
+ console_liveness_relay)
175
+ case "$(echo "$value" | tr '[:upper:]' '[:lower:]')" in
176
+ 1|true|yes|on) console_liveness_relay_raw="1" ;;
177
+ 0|false|no|off) console_liveness_relay_raw="0" ;;
178
+ *)
179
+ printf 'warning: config.sh: unrecognized console_liveness_relay value %q; treating as off\n' "$value" >&2
180
+ console_liveness_relay_raw="$value"
181
+ ;;
182
+ esac
183
+ ;;
184
+ console_liveness_endpoint_url) FLOW_AGENTS_CONSOLE_LIVENESS_ENDPOINT_URL="$value" ;;
167
185
  console_pricing_url) TELEMETRY_PRICING_URL="$value" ;;
168
186
  pricing_url) TELEMETRY_PRICING_URL="$value" ;;
169
187
  pricing_file) TELEMETRY_PRICING_FILE="$value" ;;
@@ -186,6 +204,17 @@ elif [[ -z "$FLOW_AGENTS_CONSOLE_ECONOMICS_RELAY" \
186
204
  FLOW_AGENTS_CONSOLE_ECONOMICS_RELAY=1
187
205
  fi
188
206
 
207
+ # Liveness relay default-on rule (#567), identical shape to economics above: an explicit
208
+ # console_liveness_relay config key always wins; otherwise, once a console telemetry sink resolves,
209
+ # the relay defaults ON unless a caller already pre-set FLOW_AGENTS_CONSOLE_LIVENESS_RELAY in the
210
+ # environment. relay.sh's own opt-in gate reads this exact variable.
211
+ if [[ -n "$console_liveness_relay_raw" ]]; then
212
+ FLOW_AGENTS_CONSOLE_LIVENESS_RELAY="$console_liveness_relay_raw"
213
+ elif [[ -z "$FLOW_AGENTS_CONSOLE_LIVENESS_RELAY" \
214
+ && ( -n "${CONSOLE_TELEMETRY_URL:-}" || -n "${CONSOLE_TELEMETRY_ENDPOINT_URL:-}" ) ]]; then
215
+ FLOW_AGENTS_CONSOLE_LIVENESS_RELAY=1
216
+ fi
217
+
189
218
  # Pricing URL is explicit-only (env or config). Do not derive the console
190
219
  # pricing endpoint by default; the bundled registry is the reliable offline floor.
191
220
 
@@ -88,6 +88,6 @@
88
88
  ],
89
89
  "name": "tool-security-reviewer",
90
90
  "description": "Delegate to me for security analysis. Checks OWASP Top 10, secrets detection, input validation, injection vulnerabilities, auth/authz, and rate limiting. Read-only analysis with shell for scanning tools.",
91
- "prompt": "You are a security reviewer. You analyze source code for vulnerabilities and produce a structured security report.\n\n## Input\nYou receive:\n- A list of files to review\n- Optional focus area (auth, input handling, DB, etc.)\n\n## Security Checklist\n\nFor each file, check:\n- **Hardcoded secrets**: API keys, tokens, passwords, connection strings, private keys\n- **SQL injection**: string concatenation in queries, missing parameterization\n- **XSS**: unescaped user input in HTML/templates, innerHTML usage\n- **CSRF**: missing CSRF tokens on state-changing endpoints\n- **Path traversal**: user input in file paths without sanitization\n- **Auth bypasses**: missing auth checks, broken access control, privilege escalation\n- **Rate limiting**: unprotected endpoints susceptible to abuse\n- **Error leakage**: stack traces, internal paths, or system info in error responses\n- **Dependency vulnerabilities**: run npm audit / pip-audit / cargo audit if available\n\n## OWASP Top 10 Mapping\n\nTag each finding with its OWASP category:\n- A01: Broken Access Control\n- A02: Cryptographic Failures\n- A03: Injection\n- A04: Insecure Design\n- A05: Security Misconfiguration\n- A06: Vulnerable Components\n- A07: Auth Failures\n- A08: Data Integrity Failures\n- A09: Logging Failures\n- A10: SSRF\n\n## Trigger Conditions\n\nPrioritize review of code involving:\n- Authentication or authorization logic\n- User input handling (forms, query params, headers)\n- Database queries\n- File system operations\n- External API calls\n- Cryptographic operations\n- Payment or financial code\n\n## Secret Patterns\n\nScan for common patterns:\n- `AKIA[0-9A-Z]{16}` (AWS access keys)\n- `-----BEGIN (RSA |EC )?PRIVATE KEY-----`\n- `(password|secret|token|api_key)\\s*[:=]\\s*['\"][^'\"]+['\"]`\n- Base64-encoded strings >40 chars in assignments\n\n## Output\n\nReturn a structured security report:\n```markdown\n## Security Review\n\nFiles analyzed: <count>\nFindings: <count by severity>\n\n### Findings\n\n#### [CRITICAL/HIGH/MEDIUM/LOW] <OWASP-ID> — <file>:<line> — <title>\n<description with evidence>\n**Remediation:** <specific fix>\n\n### Summary\n<overall assessment>\n```\n\n## Rules\n- No false positives without evidence. Show the vulnerable code.\n- Run dependency audit tools if available (npm audit, pip-audit, cargo audit).\n- If no security issues found, say so clearly — don't invent findings.\n- This is read-only analysis. Do not modify any files.",
91
+ "prompt": "You are a security reviewer. You analyze source code for vulnerabilities and produce a structured security report.\n\n## Input\nYou receive:\n- A list of files to review\n- Optional focus area (auth, input handling, DB, etc.)\n\n## Security Checklist\n\nFor each file, check:\n- **Hardcoded secrets**: API keys, tokens, passwords, connection strings, private keys\n- **SQL injection**: string concatenation in queries, missing parameterization\n- **XSS**: unescaped user input in HTML/templates, innerHTML usage\n- **CSRF**: missing CSRF tokens on state-changing endpoints\n- **Path traversal**: user input in file paths without sanitization\n- **Auth bypasses**: missing auth checks, broken access control, privilege escalation\n- **Rate limiting**: unprotected endpoints susceptible to abuse\n- **Error leakage**: stack traces, internal paths, or system info in error responses\n- **Dependency vulnerabilities**: run npm audit / pip-audit / cargo audit if available\n\n## OWASP Top 10 Mapping\n\nTag each finding with its OWASP category:\n- A01: Broken Access Control\n- A02: Cryptographic Failures\n- A03: Injection\n- A04: Insecure Design\n- A05: Security Misconfiguration\n- A06: Vulnerable Components\n- A07: Auth Failures\n- A08: Data Integrity Failures\n- A09: Logging Failures\n- A10: SSRF\n\n## Trigger Conditions\n\nPrioritize review of code involving:\n- Authentication or authorization logic\n- User input handling (forms, query params, headers)\n- Database queries\n- File system operations\n- External API calls\n- Cryptographic operations\n- Payment or financial code\n\n## Secret Patterns\n\nScan for common patterns:\n- `AKIA[0-9A-Z]{16}` (AWS access keys)\n- `-----BEGIN (RSA |EC )?PRIVATE KEY-----`\n- `(password|secret|token|api_key)\\s*[:=]\\s*['\"][^'\"]+['\"]`\n- Base64-encoded strings >40 chars in assignments\n\n## Output\n\nReturn a structured security report:\n```markdown\n## Security Review\n\nFiles analyzed: <count>\nFindings: <count by severity>\n\n### Findings\n\n#### [CRITICAL/HIGH/MEDIUM/LOW] <OWASP-ID> — <file>:<line> — <title>\n<description with evidence>\n**Remediation:** <specific fix>\n\n### Summary\n<overall assessment>\n```\n\n## Rules\n- No false positives without evidence: cite the exact `file:line` and a one-line description of the weakness as the evidence.\n- Do NOT reproduce exploit payloads, working attack strings, or large copied blocks of vulnerable code in the report. A precise `file:line` reference plus a short description IS the evidence — reproduction detail belongs in the fix pass, not the recorded finding. (This keeps security findings recordable through `workflow critique`, whose reviewer runtime's provider may content-filter exploit-shaped prose.)\n- Run dependency audit tools if available (npm audit, pip-audit, cargo audit).\n- If no security issues found, say so clearly — don't invent findings.\n- This is read-only analysis. Do not modify any files.",
92
92
  "model": "claude-sonnet-4.6-1m"
93
93
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@kontourai/flow-agents",
3
- "version": "4.0.0",
3
+ "version": "4.2.0",
4
4
  "type": "module"
5
5
  }
@@ -8,6 +8,7 @@ import { createInterface } from "node:readline/promises";
8
8
  import { stdin as input, stdout as output } from "node:process";
9
9
  import { parseArgs, flagBool, flagList, flagString } from "../lib/args.js";
10
10
  import { activateCodexLocal } from "../runtime-adapters.js";
11
+ import { provisionKit, ProvisionConflictError } from "../flow-kit/provision.js";
11
12
  import { main as buildBundles } from "../tools/build-universal-bundles.js";
12
13
  import { root } from "../tools/common.js";
13
14
  import { defaultCodexHome, durableInstallRecordPath, skillsManifestPath } from "../lib/local-artifact-root.js";
@@ -571,7 +572,21 @@ function installBundle(bundle, options) {
571
572
  }
572
573
  return result.status ?? 1;
573
574
  }
574
- function activateKits(options) {
575
+ function kitPathForInit(kitId, dest) {
576
+ const catalogPath = path.join(root, "kits", "catalog.json");
577
+ if (fs.existsSync(catalogPath)) {
578
+ const catalog = JSON.parse(fs.readFileSync(catalogPath, "utf8"));
579
+ const entry = Array.isArray(catalog.kits)
580
+ ? catalog.kits.find((item) => typeof item === "object" && item !== null && item.id === kitId)
581
+ : undefined;
582
+ const rel = entry && typeof entry === "object" ? entry.path : undefined;
583
+ if (typeof rel === "string")
584
+ return path.resolve(root, rel);
585
+ }
586
+ const installed = path.join(dest, "kits", "local", "repositories", kitId);
587
+ return fs.existsSync(installed) ? installed : null;
588
+ }
589
+ async function activateKits(options) {
575
590
  const activeKitIds = options.activeKitIds ?? [];
576
591
  if (!options.activateKits || activeKitIds.length === 0 || options.runtime !== "codex")
577
592
  return 0;
@@ -582,6 +597,23 @@ function activateKits(options) {
582
597
  }
583
598
  const generated = Array.isArray(result.generated_runtime_files) ? result.generated_runtime_files : [];
584
599
  console.log(`Activated ${generated.length} Codex local runtime asset(s)`);
600
+ for (const kitId of activeKitIds) {
601
+ const kitDir = kitPathForInit(kitId, options.dest);
602
+ if (!kitDir)
603
+ throw new Error(`activated kit '${kitId}' could not be resolved for provisioning`);
604
+ try {
605
+ const provisioned = await provisionKit(kitDir, options.dest);
606
+ if (provisioned.files.length > 0)
607
+ console.log(`Provisioned ${provisioned.files.length} file(s) from kit '${kitId}'`);
608
+ }
609
+ catch (error) {
610
+ if (!(error instanceof ProvisionConflictError))
611
+ throw error;
612
+ for (const conflict of error.conflicts) {
613
+ console.warn(`flow-agents init: warning: skipped existing provision '${conflict.target}' from kit '${kitId}'`);
614
+ }
615
+ }
616
+ }
585
617
  return 0;
586
618
  }
587
619
  /**
@@ -809,7 +841,7 @@ export async function main(argv = process.argv.slice(2)) {
809
841
  if (installed !== 0)
810
842
  return installed;
811
843
  writeInstallRecord(options.dest, "codex", true, options.activeKitIds ?? []);
812
- return activateKits(options);
844
+ return await activateKits(options);
813
845
  }
814
846
  // --global for pi: NOT_VERIFIED (no documented global dir). Warn and fall through to workspace install.
815
847
  if (options.global && options.runtime === "pi") {
@@ -822,7 +854,7 @@ export async function main(argv = process.argv.slice(2)) {
822
854
  if (installed !== 0)
823
855
  return installed;
824
856
  writeInstallRecord(options.dest, options.runtime, options.global, options.activeKitIds ?? []);
825
- const activated = activateKits(options);
857
+ const activated = await activateKits(options);
826
858
  // G2/G3: shared post-install auto-verify + summary tail. Applies
827
859
  // identically whether main() reached here via headlessOptions() or
828
860
  // interactiveOptions() -- never changes `activated`'s exit code.
@@ -6,7 +6,8 @@ import * as path from "node:path";
6
6
  import { fileURLToPath } from "node:url";
7
7
  import { parseArgs, flagBool, flagString } from "../lib/args.js";
8
8
  import { assertPathContained, assertPathsDisjoint, atomicWriteJson, copyDirAtomic, ensureSafeDirectory, isoNow, readJson, walkFiles } from "../lib/fs.js";
9
- import { assertKitRepository, deriveKitTargets, parseKitDependencies } from "../flow-kit/validate.js";
9
+ import { assertKitRepository, deriveKitTargets, parseKitDependencies, validateKitRepositoryDiagnostics } from "../flow-kit/validate.js";
10
+ import { provisionKit, ProvisionConflictError } from "../flow-kit/provision.js";
10
11
  import { activateCodexLocal, activateStrandsLocal } from "../runtime-adapters.js";
11
12
  import { defaultCodexHome } from "../lib/local-artifact-root.js";
12
13
  import { root } from "../tools/common.js";
@@ -35,6 +36,18 @@ function resolveCatalogKitSource(source) {
35
36
  return null;
36
37
  return path.resolve(path.dirname(repoCatalogPath), "..", rel);
37
38
  }
39
+ function resolveProvisionKitSource(source, dest) {
40
+ const localPath = path.resolve(source);
41
+ if (fs.existsSync(localPath))
42
+ return localPath;
43
+ const installed = loadRegistry(dest).kits.find((entry) => entry.id === source);
44
+ if (installed) {
45
+ const installedSource = installedPath(dest, source);
46
+ if (fs.existsSync(installedSource))
47
+ return installedSource;
48
+ }
49
+ return resolveCatalogKitSource(source);
50
+ }
38
51
  function loadRegistry(dest) {
39
52
  const file = registryPath(dest);
40
53
  if (!fs.existsSync(file))
@@ -64,6 +77,17 @@ function warnUninstalledDependencies(manifest, manifestPath, dest) {
64
77
  }
65
78
  }
66
79
  }
80
+ /**
81
+ * Print non-blocking kit-validation warnings (e.g. an agent-spawning trigger surface
82
+ * declared without complete guard config — context/contracts/trigger-guards.md).
83
+ * Shared by BOTH install source forms (local path and git clone) so the standing
84
+ * warning contract cannot silently diverge between them. Same non-blocking
85
+ * `warning:` convention as warnUninstalledDependencies above.
86
+ */
87
+ async function printKitValidationWarnings(kitDir) {
88
+ for (const warning of (await validateKitRepositoryDiagnostics(kitDir)).warnings)
89
+ console.log(`warning: ${warning}`);
90
+ }
67
91
  function contentHash(root) {
68
92
  const hash = crypto.createHash("sha256");
69
93
  for (const file of walkFiles(root)) {
@@ -122,6 +146,7 @@ async function installLocalSource(source, argv) {
122
146
  let manifest;
123
147
  try {
124
148
  manifest = await assertKitRepository(source);
149
+ await printKitValidationWarnings(source);
125
150
  }
126
151
  catch (error) {
127
152
  console.log("Flow Kit repository validation failed:");
@@ -211,6 +236,7 @@ async function installGitSource(rawUrl, argv) {
211
236
  let manifest;
212
237
  try {
213
238
  manifest = await assertKitRepository(tmpBase);
239
+ await printKitValidationWarnings(tmpBase);
214
240
  }
215
241
  catch (error) {
216
242
  console.log("Flow Kit repository validation failed:");
@@ -321,6 +347,69 @@ function activate(argv) {
321
347
  console.log(JSON.stringify(result, null, 2));
322
348
  return Array.isArray(result.errors) && result.errors.length ? 1 : 0;
323
349
  }
350
+ async function validate(argv) {
351
+ const args = parseArgs(argv);
352
+ const kitDir = path.resolve(args.positionals[0] ?? ".");
353
+ const diagnostics = await validateKitRepositoryDiagnostics(kitDir);
354
+ for (const warning of diagnostics.warnings)
355
+ console.log(`warning: ${warning}`);
356
+ if (diagnostics.errors.length) {
357
+ console.log("Flow Kit repository validation failed:");
358
+ for (const error of diagnostics.errors)
359
+ console.log(` - ${error}`);
360
+ return 1;
361
+ }
362
+ console.log(`Flow Kit repository validation passed: ${kitDir}`);
363
+ return 0;
364
+ }
365
+ async function provision(argv) {
366
+ const args = parseArgs(argv);
367
+ const source = args.positionals[0];
368
+ if (!source) {
369
+ console.error("provision: missing <kit-id-or-path> argument");
370
+ console.error("usage: flow-agents kit provision <kit-id-or-path> [--target <dir>] [--force] [--dry-run]");
371
+ return 2;
372
+ }
373
+ const dest = resolveDest(args.flags);
374
+ const kitDir = resolveProvisionKitSource(source, dest);
375
+ if (!kitDir) {
376
+ console.error(`provision: kit '${source}' was not found as a local path, installed kit, or catalog kit`);
377
+ return 1;
378
+ }
379
+ const target = path.resolve(flagString(args.flags, "target", process.cwd()) ?? process.cwd());
380
+ try {
381
+ const result = await provisionKit(kitDir, target, {
382
+ force: flagBool(args.flags, "force"),
383
+ dryRun: flagBool(args.flags, "dry-run"),
384
+ });
385
+ for (const file of result.files)
386
+ console.log(`${result.dry_run ? "would provision" : "provisioned"}: ${file.source} -> ${file.destination}`);
387
+ if (result.dry_run)
388
+ console.log(`dry-run: ${result.files.length} file(s) declared by kit '${result.kit_id}'; no files written`);
389
+ else if (result.files.length === 0)
390
+ console.log(`kit '${result.kit_id}' declares no provisions`);
391
+ else
392
+ console.log(`provisioned ${result.files.length} file(s) from kit '${result.kit_id}' into ${target}`);
393
+ return 0;
394
+ }
395
+ catch (error) {
396
+ if (error instanceof ProvisionConflictError) {
397
+ console.error(`provision: ${error.message}; rerun with --force to overwrite`);
398
+ for (const conflict of error.conflicts)
399
+ console.error(`conflict: ${conflict.target} (${conflict.destination})`);
400
+ return 1;
401
+ }
402
+ const diagnostics = error.diagnostics;
403
+ if (diagnostics?.length) {
404
+ console.error("Flow Kit repository validation failed:");
405
+ for (const diagnostic of diagnostics)
406
+ console.error(` - ${diagnostic}`);
407
+ }
408
+ else
409
+ console.error(`provision: ${error.message}`);
410
+ return 1;
411
+ }
412
+ }
324
413
  /**
325
414
  * inspect <kit-dir> [--json]
326
415
  *
@@ -375,9 +464,13 @@ export async function main(argv = process.argv.slice(2)) {
375
464
  return status(rest);
376
465
  if (command === "activate")
377
466
  return activate(rest);
467
+ if (command === "validate")
468
+ return await validate(rest);
469
+ if (command === "provision")
470
+ return await provision(rest);
378
471
  if (command === "inspect")
379
472
  return await inspect(rest);
380
- console.error("usage: flow-agents kit <install|activate|inspect|list|status> ...");
473
+ console.error("usage: flow-agents kit <install|activate|validate|provision|inspect|list|status> ...");
381
474
  return 2;
382
475
  }
383
476
  // Use process.exitCode (not process.exit) to allow stdout to be flushed before exit.
@@ -804,7 +804,13 @@ export function main(argv = process.argv.slice(2)) {
804
804
  const freshness = revisionFreshness(item, freshnessInputs);
805
805
  return { ...item, dependency_impacts: dependencyImpacts(item, resolved), revision_freshness: freshness, readiness: applyFreshnessToReadiness(classify(item, settings, resolved), freshness) };
806
806
  });
807
- console.log(JSON.stringify({ items }, null, 2));
807
+ // A configured BoardProvider is the canonical readiness source (docs/decisions/backlog-readiness-source.md).
808
+ // Reaching this issue-level listing path with a board configured is a bypass that must be loud, never silent.
809
+ const bypassedBoard = asRecord(asRecord(settings.board_provider)?.board);
810
+ const warnings = bypassedBoard
811
+ ? [{ code: "board_provider_bypassed", message: "A BoardProvider is configured but this pass used WorkItemProvider issue-level listing; board-driven selection is the canonical readiness source. Surface this bypass in the pull-work artifact instead of treating issue listing as a silent fallback." }]
812
+ : [];
813
+ console.log(JSON.stringify({ items, warnings }, null, 2));
808
814
  return 0;
809
815
  }
810
816
  // Use process.exitCode (not process.exit) to allow stdout to be flushed before exit.
@@ -18,6 +18,7 @@ const sidecarSchemas = {
18
18
  "critique.json": "schemas/workflow-critique.schema.json",
19
19
  "release.json": "schemas/workflow-release.schema.json",
20
20
  "learning.json": "schemas/workflow-learning.schema.json",
21
+ "waves.json": "schemas/workflow-waves.schema.json",
21
22
  };
22
23
  // Runtime coordination records live below a session but are not workflow
23
24
  // sidecars. Recursing into them would validate continuation-driver/state.json
@@ -386,11 +387,63 @@ function validateSidecar(file) {
386
387
  issues.push({ path: file, message: "deploy decision requires post_deploy_checks to be planned or pass" });
387
388
  }
388
389
  }
390
+ if (path.basename(file) === "waves.json") {
391
+ validateWaves(file, value, issues);
392
+ }
389
393
  if (path.basename(file) === "state.json" && value && typeof value === "object" && !Array.isArray(value) && !("branch" in value)) {
390
394
  warnings.push({ path: file, message: "state.json has no branch field (legacy/pre-#289 session) — re-run `ensure-session` to backfill agent/<actor>/<slug>." });
391
395
  }
392
396
  return { issues, warnings };
393
397
  }
398
+ // #663 slice 1: wave-result reconciliation is machine-checkable, not prose. The schema
399
+ // (schemas/workflow-waves.schema.json) validates the shape; these semantic checks enforce the
400
+ // cross-record arithmetic the mini schema engine cannot express: exactly one terminal status
401
+ // record per declared worker, no undeclared reporters, reconciliation counts that match the
402
+ // records, and a `complete` claim that is impossible while any expected worker lacks a
403
+ // worker-landed terminal status. Missing workers must be recorded explicitly as not_reported —
404
+ // a reconciled wave never silently absorbs a dropped worker. Enforcement here is data-level
405
+ // validation only; stop-hook refusal of wave completion is #663 part 3 (slice 2).
406
+ function validateWaves(file, value, issues) {
407
+ const waves = Array.isArray(value?.waves) ? value.waves : [];
408
+ waves.forEach((wave, index) => {
409
+ const loc = `waves.json.waves[${index}]`;
410
+ const expected = Array.isArray(wave?.expected_workers) ? wave.expected_workers : [];
411
+ const results = Array.isArray(wave?.worker_results) ? wave.worker_results : [];
412
+ const expectedIds = expected.map((w) => w?.worker_id).filter((id) => typeof id === "string" && id.length > 0);
413
+ const expectedIdSet = new Set(expectedIds);
414
+ if (expectedIdSet.size !== expectedIds.length)
415
+ issues.push({ path: file, message: `${loc}.expected_workers must declare unique worker_id values` });
416
+ const resultIds = results.map((r) => r?.worker_id).filter((id) => typeof id === "string" && id.length > 0);
417
+ const seen = new Set();
418
+ for (const id of resultIds) {
419
+ if (seen.has(id))
420
+ issues.push({ path: file, message: `${loc}.worker_results has more than one terminal status record for worker ${id}; each worker lands exactly one` });
421
+ seen.add(id);
422
+ if (!expectedIdSet.has(id))
423
+ issues.push({ path: file, message: `${loc}.worker_results records worker ${id} that is not declared in expected_workers; declare every worker in the manifest before dispatch` });
424
+ }
425
+ const reconciliation = wave?.reconciliation;
426
+ if (!reconciliation || typeof reconciliation !== "object" || Array.isArray(reconciliation))
427
+ return;
428
+ const expectedCount = expectedIds.length;
429
+ const reportedIds = new Set(results.filter((r) => ["completed", "failed", "blocked"].includes(r?.status) && expectedIdSet.has(r?.worker_id)).map((r) => r.worker_id));
430
+ const reportedCount = reportedIds.size;
431
+ if (reconciliation.expected_count !== expectedCount)
432
+ issues.push({ path: file, message: `${loc}.reconciliation.expected_count is ${reconciliation.expected_count} but expected_workers declares ${expectedCount}` });
433
+ if (reconciliation.reported_count !== reportedCount)
434
+ issues.push({ path: file, message: `${loc}.reconciliation.reported_count is ${reconciliation.reported_count} but ${reportedCount} of ${expectedCount} expected workers have a worker-landed terminal status (completed|failed|blocked)` });
435
+ const missing = expectedIds.filter((id) => !results.some((r) => r?.worker_id === id));
436
+ for (const id of missing)
437
+ issues.push({ path: file, message: `${loc} is reconciled but worker ${id} has no terminal status record; record it explicitly as not_reported — never silently absorb a missing worker` });
438
+ const notReported = results.filter((r) => r?.status === "not_reported" && expectedIdSet.has(r?.worker_id));
439
+ if (reconciliation.status === "complete" && (missing.length > 0 || notReported.length > 0 || reportedCount !== expectedCount)) {
440
+ issues.push({ path: file, message: `${loc}.reconciliation.status complete requires every expected worker to have a worker-landed terminal status; got ${reportedCount} of ${expectedCount} reported` });
441
+ }
442
+ if (reconciliation.status === "incomplete" && missing.length === 0 && notReported.length === 0 && reportedCount === expectedCount) {
443
+ issues.push({ path: file, message: `${loc}.reconciliation.status incomplete contradicts the records: all ${expectedCount} expected workers reported` });
444
+ }
445
+ });
446
+ }
394
447
  function validateLearningCorrections(file, status, records, issues) {
395
448
  records.forEach((record, index) => {
396
449
  const correction = record?.correction;
@@ -733,7 +733,11 @@ function assertDistinctReviewActor(sessionDir, slug) {
733
733
  const assignment = readActiveAssignment(sessionDir, slug);
734
734
  const caller = resolveCurrentAssignmentActor();
735
735
  if (assignment.actor_key === caller.actorKey) {
736
- throw new Error("workflow critique requires a reviewer identity distinct from the active implementation assignment actor");
736
+ throw new Error("workflow critique requires a reviewer identity distinct from the active implementation assignment actor. " +
737
+ "The reviewer identity is derived from the runtime actor, so an orchestrator that implemented and now reviews " +
738
+ "resolves to the same actor. To record an independent review, run the reviewer under a distinct actor: set " +
739
+ "FLOW_AGENTS_ACTOR=<reviewer-id> on the reviewing process, or run the reviewer in a separate runtime session " +
740
+ "(the runtime session id seeds the actor).");
737
741
  }
738
742
  return caller;
739
743
  }
@@ -0,0 +1,23 @@
1
+ export type ProvisionedFile = {
2
+ id: string;
3
+ target: string;
4
+ };
5
+ export type ProvisionPlanEntry = ProvisionedFile & {
6
+ source: string;
7
+ destination: string;
8
+ };
9
+ export type ProvisionResult = {
10
+ kit_id: string;
11
+ kit_hash?: string;
12
+ files: ProvisionPlanEntry[];
13
+ manifest_path?: string;
14
+ dry_run: boolean;
15
+ };
16
+ export declare class ProvisionConflictError extends Error {
17
+ readonly conflicts: ProvisionPlanEntry[];
18
+ constructor(conflicts: ProvisionPlanEntry[]);
19
+ }
20
+ export declare function provisionKit(kitDir: string, targetDir: string, options?: {
21
+ force?: boolean;
22
+ dryRun?: boolean;
23
+ }): Promise<ProvisionResult>;
@@ -0,0 +1,99 @@
1
+ import * as crypto from "node:crypto";
2
+ import * as fs from "node:fs";
3
+ import * as path from "node:path";
4
+ import { atomicCopyFile, atomicWriteJson, canonicalProspectivePath, walkFiles } from "../lib/fs.js";
5
+ import { PROVISION_MANIFEST_DIR, assertKitRepository } from "./validate.js";
6
+ export class ProvisionConflictError extends Error {
7
+ conflicts;
8
+ constructor(conflicts) {
9
+ super(`provisioning conflicts with ${conflicts.length} existing destination(s)`);
10
+ this.name = "ProvisionConflictError";
11
+ this.conflicts = conflicts;
12
+ }
13
+ }
14
+ function kitContentHash(kitDir) {
15
+ const hash = crypto.createHash("sha256");
16
+ for (const file of walkFiles(kitDir)) {
17
+ const rel = path.relative(kitDir, file).split(path.sep).join("/");
18
+ if (rel.split("/").some((part) => [".git", "__pycache__", ".pytest_cache"].includes(part)))
19
+ continue;
20
+ hash.update(rel);
21
+ hash.update("\0");
22
+ hash.update(fs.readFileSync(file));
23
+ hash.update("\0");
24
+ }
25
+ return `sha256:${hash.digest("hex")}`;
26
+ }
27
+ function isContained(root, candidate) {
28
+ const relative = path.relative(root, candidate);
29
+ return relative !== "" && !relative.startsWith("..") && !path.isAbsolute(relative);
30
+ }
31
+ function assertSafeDestination(rootReal, destination) {
32
+ const prospective = canonicalProspectivePath(destination);
33
+ if (!isContained(rootReal, prospective))
34
+ throw new Error(`provision target escapes consumer repository: ${destination}`);
35
+ if (!fs.existsSync(destination))
36
+ return;
37
+ const stat = fs.lstatSync(destination);
38
+ if (stat.isSymbolicLink())
39
+ throw new Error(`refusing provision target symlink: ${destination}`);
40
+ if (!stat.isFile())
41
+ throw new Error(`provision target is not a regular file: ${destination}`);
42
+ }
43
+ function manifestProvisions(manifest) {
44
+ if (!Array.isArray(manifest.provisions))
45
+ return [];
46
+ return manifest.provisions.map((entry) => {
47
+ const record = entry;
48
+ return {
49
+ id: String(record.id),
50
+ path: String(record.path),
51
+ target: path.posix.normalize(String(record.target).replace(/\\/g, "/")),
52
+ ...(typeof record.description === "string" ? { description: record.description } : {}),
53
+ };
54
+ });
55
+ }
56
+ export async function provisionKit(kitDir, targetDir, options = {}) {
57
+ const kitRoot = fs.realpathSync(path.resolve(kitDir));
58
+ const targetPath = path.resolve(targetDir);
59
+ if (!fs.existsSync(targetPath) || !fs.statSync(targetPath).isDirectory()) {
60
+ throw new Error(`provision target must exist and be a directory: ${targetPath}`);
61
+ }
62
+ const targetRoot = fs.realpathSync(targetPath);
63
+ const manifest = await assertKitRepository(kitRoot);
64
+ const kitId = String(manifest.id);
65
+ const files = manifestProvisions(manifest).map((entry) => ({
66
+ id: entry.id,
67
+ target: entry.target,
68
+ source: path.resolve(kitRoot, entry.path),
69
+ destination: path.resolve(targetRoot, ...entry.target.split("/")),
70
+ }));
71
+ for (const file of files)
72
+ assertSafeDestination(targetRoot, file.destination);
73
+ // Defense in depth against a source swapped to a link after validation: re-assert the
74
+ // link-resolved source stays inside the kit before we read and copy its bytes.
75
+ for (const file of files) {
76
+ const realSource = fs.realpathSync(file.source);
77
+ if (realSource !== kitRoot && !realSource.startsWith(`${kitRoot}${path.sep}`)) {
78
+ throw new Error(`provision source escapes the kit directory: ${file.id}`);
79
+ }
80
+ }
81
+ const conflicts = options.force ? [] : files.filter((file) => fs.existsSync(file.destination));
82
+ if (conflicts.length)
83
+ throw new ProvisionConflictError(conflicts);
84
+ const kitHash = kitContentHash(kitRoot);
85
+ if (options.dryRun || files.length === 0)
86
+ return { kit_id: kitId, kit_hash: kitHash, files, dry_run: Boolean(options.dryRun) };
87
+ const manifestPath = path.join(targetRoot, ...PROVISION_MANIFEST_DIR.split("/"), `${kitId}.json`);
88
+ assertSafeDestination(targetRoot, manifestPath);
89
+ for (const file of files)
90
+ atomicCopyFile(targetRoot, file.source, file.destination);
91
+ atomicWriteJson(targetRoot, manifestPath, {
92
+ schema_version: "1.0",
93
+ kit_id: kitId,
94
+ kit_hash: kitHash,
95
+ provisioned_at: new Date().toISOString(),
96
+ files: files.map(({ id, target }) => ({ id, target })),
97
+ });
98
+ return { kit_id: kitId, kit_hash: kitHash, files, manifest_path: manifestPath, dry_run: false };
99
+ }