@kontourai/flow-agents 4.0.0 → 4.1.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 (451) hide show
  1. package/.github/workflows/ci.yml +8 -0
  2. package/CHANGELOG.md +27 -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/settings/backlog-provider-settings.json +1 -1
  19. package/context/settings/workspace-backlog-provider-settings.example.json +1 -1
  20. package/dist/base/build/package.json +1 -1
  21. package/dist/base/build/src/cli/init.js +35 -3
  22. package/dist/base/build/src/cli/kit.js +95 -2
  23. package/dist/base/build/src/cli/pull-work-provider.js +7 -1
  24. package/dist/base/build/src/cli/validate-workflow-artifacts.js +53 -0
  25. package/dist/base/build/src/cli/workflow.js +5 -1
  26. package/dist/base/build/src/flow-kit/provision.d.ts +23 -0
  27. package/dist/base/build/src/flow-kit/provision.js +99 -0
  28. package/dist/base/build/src/flow-kit/validate.d.ts +52 -0
  29. package/dist/base/build/src/flow-kit/validate.js +214 -9
  30. package/dist/base/build/src/runtime-adapters.js +1 -1
  31. package/dist/base/context/contracts/execution-contract.md +30 -1
  32. package/dist/base/context/contracts/review-contract.md +4 -0
  33. package/dist/base/context/contracts/trigger-guards.md +73 -0
  34. package/dist/base/context/settings/backlog-provider-settings.json +1 -1
  35. package/dist/base/context/settings/workspace-backlog-provider-settings.example.json +1 -1
  36. package/dist/base/docs/adr/0023-kit-provisioning.md +47 -0
  37. package/dist/base/docs/adr/index.md +1 -0
  38. package/dist/base/docs/architecture-engine-and-kits.md +17 -0
  39. package/dist/base/docs/context-map.md +3 -0
  40. package/dist/base/docs/decisions/backlog-readiness-source.md +89 -0
  41. package/dist/base/docs/decisions/index.md +1 -0
  42. package/dist/base/docs/developer-architecture.md +3 -3
  43. package/dist/base/docs/flow-kit-repository-contract.md +34 -3
  44. package/dist/base/docs/kit-authoring-guide.md +1 -1
  45. package/dist/base/docs/veritas-integration.md +12 -0
  46. package/dist/base/evals/ci/run-baseline.sh +4 -0
  47. package/dist/base/evals/integration/test_kit_provisioning.sh +112 -0
  48. package/dist/base/evals/integration/test_pull_work_provider.sh +18 -0
  49. package/dist/base/evals/integration/test_veritas_governance_kit.sh +256 -0
  50. package/dist/base/evals/integration/test_workflow_artifacts.sh +257 -0
  51. package/dist/base/evals/static/test_package.sh +6 -0
  52. package/dist/base/evals/static/test_workflow_skills.sh +16 -0
  53. package/dist/base/install.sh +1 -1
  54. package/dist/base/kits/builder/flows/publish-learn.flow.json +9 -1
  55. package/dist/base/kits/builder/skills/execute-plan/SKILL.md +4 -3
  56. package/dist/base/kits/builder/skills/pull-work/SKILL.md +12 -0
  57. package/dist/base/kits/builder/skills/review-work/SKILL.md +11 -0
  58. package/dist/base/kits/veritas-governance/adapter/readiness-to-trust-bundle.mjs +19 -20
  59. package/dist/base/kits/veritas-governance/assets/starter-hooks/githooks/post-commit +13 -0
  60. package/dist/base/kits/veritas-governance/assets/starter-hooks/githooks/pre-push +13 -0
  61. package/dist/base/kits/veritas-governance/assets/starter-standards/veritas/GOVERNANCE.md +23 -0
  62. package/dist/base/kits/veritas-governance/assets/starter-standards/veritas/README.md +58 -0
  63. package/dist/base/kits/veritas-governance/assets/starter-standards/veritas/authority/default.authority-settings.json +30 -0
  64. package/dist/base/kits/veritas-governance/assets/starter-standards/veritas/repo-map.json +115 -0
  65. package/dist/base/kits/veritas-governance/assets/starter-standards/veritas/repo-standards/default.repo-standards.json +54 -0
  66. package/dist/base/kits/veritas-governance/assets/starter-standards/veritas.claims.json +179 -0
  67. package/dist/base/kits/veritas-governance/docs/README.md +141 -10
  68. package/dist/base/kits/veritas-governance/fixtures/standards-authoring/approved.trust-bundle.json +74 -0
  69. package/dist/base/kits/veritas-governance/fixtures/standards-authoring/not-approved.trust-bundle.json +74 -0
  70. package/dist/base/kits/veritas-governance/flows/standards-authoring.flow.json +35 -0
  71. package/dist/base/kits/veritas-governance/kit.json +65 -0
  72. package/dist/base/kits/veritas-governance/skills/consult-standards/SKILL.md +73 -0
  73. package/dist/base/kits/veritas-governance/skills/standards-authoring/SKILL.md +87 -0
  74. package/dist/base/schemas/backlog-provider-settings.schema.json +1 -1
  75. package/dist/base/schemas/workflow-waves.schema.json +347 -0
  76. package/dist/base/scripts/check-layer-boundary.mjs +98 -0
  77. package/dist/catalog.json +2 -0
  78. package/dist/claude-code/.claude/agents/tool-security-reviewer.md +2 -1
  79. package/dist/claude-code/.claude/skills/consult-standards/SKILL.md +73 -0
  80. package/dist/claude-code/.claude/skills/execute-plan/SKILL.md +4 -3
  81. package/dist/claude-code/.claude/skills/pull-work/SKILL.md +12 -0
  82. package/dist/claude-code/.claude/skills/review-work/SKILL.md +11 -0
  83. package/dist/claude-code/.claude/skills/standards-authoring/SKILL.md +87 -0
  84. package/dist/claude-code/build/package.json +1 -1
  85. package/dist/claude-code/build/src/cli/init.js +35 -3
  86. package/dist/claude-code/build/src/cli/kit.js +95 -2
  87. package/dist/claude-code/build/src/cli/pull-work-provider.js +7 -1
  88. package/dist/claude-code/build/src/cli/validate-workflow-artifacts.js +53 -0
  89. package/dist/claude-code/build/src/cli/workflow.js +5 -1
  90. package/dist/claude-code/build/src/flow-kit/provision.d.ts +23 -0
  91. package/dist/claude-code/build/src/flow-kit/provision.js +99 -0
  92. package/dist/claude-code/build/src/flow-kit/validate.d.ts +52 -0
  93. package/dist/claude-code/build/src/flow-kit/validate.js +214 -9
  94. package/dist/claude-code/build/src/runtime-adapters.js +1 -1
  95. package/dist/claude-code/context/contracts/execution-contract.md +30 -1
  96. package/dist/claude-code/context/contracts/review-contract.md +4 -0
  97. package/dist/claude-code/context/contracts/trigger-guards.md +73 -0
  98. package/dist/claude-code/context/settings/backlog-provider-settings.json +1 -1
  99. package/dist/claude-code/context/settings/workspace-backlog-provider-settings.example.json +1 -1
  100. package/dist/claude-code/docs/adr/0023-kit-provisioning.md +47 -0
  101. package/dist/claude-code/docs/adr/index.md +1 -0
  102. package/dist/claude-code/docs/architecture-engine-and-kits.md +17 -0
  103. package/dist/claude-code/docs/context-map.md +3 -0
  104. package/dist/claude-code/docs/decisions/backlog-readiness-source.md +89 -0
  105. package/dist/claude-code/docs/decisions/index.md +1 -0
  106. package/dist/claude-code/docs/developer-architecture.md +3 -3
  107. package/dist/claude-code/docs/flow-kit-repository-contract.md +34 -3
  108. package/dist/claude-code/docs/kit-authoring-guide.md +1 -1
  109. package/dist/claude-code/docs/veritas-integration.md +12 -0
  110. package/dist/claude-code/evals/ci/run-baseline.sh +4 -0
  111. package/dist/claude-code/evals/integration/test_kit_provisioning.sh +112 -0
  112. package/dist/claude-code/evals/integration/test_pull_work_provider.sh +18 -0
  113. package/dist/claude-code/evals/integration/test_veritas_governance_kit.sh +256 -0
  114. package/dist/claude-code/evals/integration/test_workflow_artifacts.sh +257 -0
  115. package/dist/claude-code/evals/static/test_package.sh +6 -0
  116. package/dist/claude-code/evals/static/test_workflow_skills.sh +16 -0
  117. package/dist/claude-code/install.sh +1 -1
  118. package/dist/claude-code/kits/builder/flows/publish-learn.flow.json +9 -1
  119. package/dist/claude-code/kits/builder/skills/execute-plan/SKILL.md +4 -3
  120. package/dist/claude-code/kits/builder/skills/pull-work/SKILL.md +12 -0
  121. package/dist/claude-code/kits/builder/skills/review-work/SKILL.md +11 -0
  122. package/dist/claude-code/kits/veritas-governance/adapter/readiness-to-trust-bundle.mjs +19 -20
  123. package/dist/claude-code/kits/veritas-governance/assets/starter-hooks/githooks/post-commit +13 -0
  124. package/dist/claude-code/kits/veritas-governance/assets/starter-hooks/githooks/pre-push +13 -0
  125. package/dist/claude-code/kits/veritas-governance/assets/starter-standards/veritas/GOVERNANCE.md +23 -0
  126. package/dist/claude-code/kits/veritas-governance/assets/starter-standards/veritas/README.md +58 -0
  127. package/dist/claude-code/kits/veritas-governance/assets/starter-standards/veritas/authority/default.authority-settings.json +30 -0
  128. package/dist/claude-code/kits/veritas-governance/assets/starter-standards/veritas/repo-map.json +115 -0
  129. package/dist/claude-code/kits/veritas-governance/assets/starter-standards/veritas/repo-standards/default.repo-standards.json +54 -0
  130. package/dist/claude-code/kits/veritas-governance/assets/starter-standards/veritas.claims.json +179 -0
  131. package/dist/claude-code/kits/veritas-governance/docs/README.md +141 -10
  132. package/dist/claude-code/kits/veritas-governance/fixtures/standards-authoring/approved.trust-bundle.json +74 -0
  133. package/dist/claude-code/kits/veritas-governance/fixtures/standards-authoring/not-approved.trust-bundle.json +74 -0
  134. package/dist/claude-code/kits/veritas-governance/flows/standards-authoring.flow.json +35 -0
  135. package/dist/claude-code/kits/veritas-governance/kit.json +65 -0
  136. package/dist/claude-code/kits/veritas-governance/skills/consult-standards/SKILL.md +73 -0
  137. package/dist/claude-code/kits/veritas-governance/skills/standards-authoring/SKILL.md +87 -0
  138. package/dist/claude-code/schemas/backlog-provider-settings.schema.json +1 -1
  139. package/dist/claude-code/schemas/workflow-waves.schema.json +347 -0
  140. package/dist/claude-code/scripts/check-layer-boundary.mjs +98 -0
  141. package/dist/codex/.agents/skills/builder-shape/context/contracts/execution-contract.md +30 -1
  142. package/dist/codex/.agents/skills/consult-standards/SKILL.md +73 -0
  143. package/dist/codex/.agents/skills/deliver/context/contracts/execution-contract.md +30 -1
  144. package/dist/codex/.agents/skills/design-probe/context/contracts/execution-contract.md +30 -1
  145. package/dist/codex/.agents/skills/execute-plan/SKILL.md +4 -3
  146. package/dist/codex/.agents/skills/execute-plan/context/contracts/execution-contract.md +30 -1
  147. package/dist/codex/.agents/skills/fix-bug/context/contracts/execution-contract.md +30 -1
  148. package/dist/codex/.agents/skills/idea-to-backlog/context/contracts/execution-contract.md +30 -1
  149. package/dist/codex/.agents/skills/plan-work/context/contracts/execution-contract.md +30 -1
  150. package/dist/codex/.agents/skills/pull-work/SKILL.md +12 -0
  151. package/dist/codex/.agents/skills/pull-work/context/contracts/execution-contract.md +30 -1
  152. package/dist/codex/.agents/skills/review-work/SKILL.md +11 -0
  153. package/dist/codex/.agents/skills/review-work/context/contracts/execution-contract.md +30 -1
  154. package/dist/codex/.agents/skills/standards-authoring/SKILL.md +87 -0
  155. package/dist/codex/.agents/skills/tdd-workflow/context/contracts/execution-contract.md +30 -1
  156. package/dist/codex/.agents/skills/verify-work/context/contracts/execution-contract.md +30 -1
  157. package/dist/codex/.codex/agents/tool-security-reviewer.toml +1 -1
  158. package/dist/codex/build/package.json +1 -1
  159. package/dist/codex/build/src/cli/init.js +35 -3
  160. package/dist/codex/build/src/cli/kit.js +95 -2
  161. package/dist/codex/build/src/cli/pull-work-provider.js +7 -1
  162. package/dist/codex/build/src/cli/validate-workflow-artifacts.js +53 -0
  163. package/dist/codex/build/src/cli/workflow.js +5 -1
  164. package/dist/codex/build/src/flow-kit/provision.d.ts +23 -0
  165. package/dist/codex/build/src/flow-kit/provision.js +99 -0
  166. package/dist/codex/build/src/flow-kit/validate.d.ts +52 -0
  167. package/dist/codex/build/src/flow-kit/validate.js +214 -9
  168. package/dist/codex/build/src/runtime-adapters.js +1 -1
  169. package/dist/codex/context/contracts/execution-contract.md +30 -1
  170. package/dist/codex/context/contracts/review-contract.md +4 -0
  171. package/dist/codex/context/contracts/trigger-guards.md +73 -0
  172. package/dist/codex/context/settings/backlog-provider-settings.json +1 -1
  173. package/dist/codex/context/settings/workspace-backlog-provider-settings.example.json +1 -1
  174. package/dist/codex/docs/adr/0023-kit-provisioning.md +47 -0
  175. package/dist/codex/docs/adr/index.md +1 -0
  176. package/dist/codex/docs/architecture-engine-and-kits.md +17 -0
  177. package/dist/codex/docs/context-map.md +3 -0
  178. package/dist/codex/docs/decisions/backlog-readiness-source.md +89 -0
  179. package/dist/codex/docs/decisions/index.md +1 -0
  180. package/dist/codex/docs/developer-architecture.md +3 -3
  181. package/dist/codex/docs/flow-kit-repository-contract.md +34 -3
  182. package/dist/codex/docs/kit-authoring-guide.md +1 -1
  183. package/dist/codex/docs/veritas-integration.md +12 -0
  184. package/dist/codex/evals/ci/run-baseline.sh +4 -0
  185. package/dist/codex/evals/integration/test_kit_provisioning.sh +112 -0
  186. package/dist/codex/evals/integration/test_pull_work_provider.sh +18 -0
  187. package/dist/codex/evals/integration/test_veritas_governance_kit.sh +256 -0
  188. package/dist/codex/evals/integration/test_workflow_artifacts.sh +257 -0
  189. package/dist/codex/evals/static/test_package.sh +6 -0
  190. package/dist/codex/evals/static/test_workflow_skills.sh +16 -0
  191. package/dist/codex/install.sh +1 -1
  192. package/dist/codex/kits/builder/flows/publish-learn.flow.json +9 -1
  193. package/dist/codex/kits/builder/skills/execute-plan/SKILL.md +4 -3
  194. package/dist/codex/kits/builder/skills/pull-work/SKILL.md +12 -0
  195. package/dist/codex/kits/builder/skills/review-work/SKILL.md +11 -0
  196. package/dist/codex/kits/veritas-governance/adapter/readiness-to-trust-bundle.mjs +19 -20
  197. package/dist/codex/kits/veritas-governance/assets/starter-hooks/githooks/post-commit +13 -0
  198. package/dist/codex/kits/veritas-governance/assets/starter-hooks/githooks/pre-push +13 -0
  199. package/dist/codex/kits/veritas-governance/assets/starter-standards/veritas/GOVERNANCE.md +23 -0
  200. package/dist/codex/kits/veritas-governance/assets/starter-standards/veritas/README.md +58 -0
  201. package/dist/codex/kits/veritas-governance/assets/starter-standards/veritas/authority/default.authority-settings.json +30 -0
  202. package/dist/codex/kits/veritas-governance/assets/starter-standards/veritas/repo-map.json +115 -0
  203. package/dist/codex/kits/veritas-governance/assets/starter-standards/veritas/repo-standards/default.repo-standards.json +54 -0
  204. package/dist/codex/kits/veritas-governance/assets/starter-standards/veritas.claims.json +179 -0
  205. package/dist/codex/kits/veritas-governance/docs/README.md +141 -10
  206. package/dist/codex/kits/veritas-governance/fixtures/standards-authoring/approved.trust-bundle.json +74 -0
  207. package/dist/codex/kits/veritas-governance/fixtures/standards-authoring/not-approved.trust-bundle.json +74 -0
  208. package/dist/codex/kits/veritas-governance/flows/standards-authoring.flow.json +35 -0
  209. package/dist/codex/kits/veritas-governance/kit.json +65 -0
  210. package/dist/codex/kits/veritas-governance/skills/consult-standards/SKILL.md +73 -0
  211. package/dist/codex/kits/veritas-governance/skills/standards-authoring/SKILL.md +87 -0
  212. package/dist/codex/schemas/backlog-provider-settings.schema.json +1 -1
  213. package/dist/codex/schemas/workflow-waves.schema.json +347 -0
  214. package/dist/codex/scripts/check-layer-boundary.mjs +98 -0
  215. package/dist/kiro/agents/tool-security-reviewer.json +1 -1
  216. package/dist/kiro/build/package.json +1 -1
  217. package/dist/kiro/build/src/cli/init.js +35 -3
  218. package/dist/kiro/build/src/cli/kit.js +95 -2
  219. package/dist/kiro/build/src/cli/pull-work-provider.js +7 -1
  220. package/dist/kiro/build/src/cli/validate-workflow-artifacts.js +53 -0
  221. package/dist/kiro/build/src/cli/workflow.js +5 -1
  222. package/dist/kiro/build/src/flow-kit/provision.d.ts +23 -0
  223. package/dist/kiro/build/src/flow-kit/provision.js +99 -0
  224. package/dist/kiro/build/src/flow-kit/validate.d.ts +52 -0
  225. package/dist/kiro/build/src/flow-kit/validate.js +214 -9
  226. package/dist/kiro/build/src/runtime-adapters.js +1 -1
  227. package/dist/kiro/context/contracts/execution-contract.md +30 -1
  228. package/dist/kiro/context/contracts/review-contract.md +4 -0
  229. package/dist/kiro/context/contracts/trigger-guards.md +73 -0
  230. package/dist/kiro/context/settings/backlog-provider-settings.json +1 -1
  231. package/dist/kiro/context/settings/workspace-backlog-provider-settings.example.json +1 -1
  232. package/dist/kiro/docs/adr/0023-kit-provisioning.md +47 -0
  233. package/dist/kiro/docs/adr/index.md +1 -0
  234. package/dist/kiro/docs/architecture-engine-and-kits.md +17 -0
  235. package/dist/kiro/docs/context-map.md +3 -0
  236. package/dist/kiro/docs/decisions/backlog-readiness-source.md +89 -0
  237. package/dist/kiro/docs/decisions/index.md +1 -0
  238. package/dist/kiro/docs/developer-architecture.md +3 -3
  239. package/dist/kiro/docs/flow-kit-repository-contract.md +34 -3
  240. package/dist/kiro/docs/kit-authoring-guide.md +1 -1
  241. package/dist/kiro/docs/veritas-integration.md +12 -0
  242. package/dist/kiro/evals/ci/run-baseline.sh +4 -0
  243. package/dist/kiro/evals/integration/test_kit_provisioning.sh +112 -0
  244. package/dist/kiro/evals/integration/test_pull_work_provider.sh +18 -0
  245. package/dist/kiro/evals/integration/test_veritas_governance_kit.sh +256 -0
  246. package/dist/kiro/evals/integration/test_workflow_artifacts.sh +257 -0
  247. package/dist/kiro/evals/static/test_package.sh +6 -0
  248. package/dist/kiro/evals/static/test_workflow_skills.sh +16 -0
  249. package/dist/kiro/install.sh +1 -1
  250. package/dist/kiro/kits/builder/flows/publish-learn.flow.json +9 -1
  251. package/dist/kiro/kits/builder/skills/execute-plan/SKILL.md +4 -3
  252. package/dist/kiro/kits/builder/skills/pull-work/SKILL.md +12 -0
  253. package/dist/kiro/kits/builder/skills/review-work/SKILL.md +11 -0
  254. package/dist/kiro/kits/veritas-governance/adapter/readiness-to-trust-bundle.mjs +19 -20
  255. package/dist/kiro/kits/veritas-governance/assets/starter-hooks/githooks/post-commit +13 -0
  256. package/dist/kiro/kits/veritas-governance/assets/starter-hooks/githooks/pre-push +13 -0
  257. package/dist/kiro/kits/veritas-governance/assets/starter-standards/veritas/GOVERNANCE.md +23 -0
  258. package/dist/kiro/kits/veritas-governance/assets/starter-standards/veritas/README.md +58 -0
  259. package/dist/kiro/kits/veritas-governance/assets/starter-standards/veritas/authority/default.authority-settings.json +30 -0
  260. package/dist/kiro/kits/veritas-governance/assets/starter-standards/veritas/repo-map.json +115 -0
  261. package/dist/kiro/kits/veritas-governance/assets/starter-standards/veritas/repo-standards/default.repo-standards.json +54 -0
  262. package/dist/kiro/kits/veritas-governance/assets/starter-standards/veritas.claims.json +179 -0
  263. package/dist/kiro/kits/veritas-governance/docs/README.md +141 -10
  264. package/dist/kiro/kits/veritas-governance/fixtures/standards-authoring/approved.trust-bundle.json +74 -0
  265. package/dist/kiro/kits/veritas-governance/fixtures/standards-authoring/not-approved.trust-bundle.json +74 -0
  266. package/dist/kiro/kits/veritas-governance/flows/standards-authoring.flow.json +35 -0
  267. package/dist/kiro/kits/veritas-governance/kit.json +65 -0
  268. package/dist/kiro/kits/veritas-governance/skills/consult-standards/SKILL.md +73 -0
  269. package/dist/kiro/kits/veritas-governance/skills/standards-authoring/SKILL.md +87 -0
  270. package/dist/kiro/schemas/backlog-provider-settings.schema.json +1 -1
  271. package/dist/kiro/schemas/workflow-waves.schema.json +347 -0
  272. package/dist/kiro/scripts/check-layer-boundary.mjs +98 -0
  273. package/dist/opencode/.opencode/agents/tool-security-reviewer.md +2 -1
  274. package/dist/opencode/.opencode/skills/consult-standards/SKILL.md +73 -0
  275. package/dist/opencode/.opencode/skills/execute-plan/SKILL.md +4 -3
  276. package/dist/opencode/.opencode/skills/pull-work/SKILL.md +12 -0
  277. package/dist/opencode/.opencode/skills/review-work/SKILL.md +11 -0
  278. package/dist/opencode/.opencode/skills/standards-authoring/SKILL.md +87 -0
  279. package/dist/opencode/build/package.json +1 -1
  280. package/dist/opencode/build/src/cli/init.js +35 -3
  281. package/dist/opencode/build/src/cli/kit.js +95 -2
  282. package/dist/opencode/build/src/cli/pull-work-provider.js +7 -1
  283. package/dist/opencode/build/src/cli/validate-workflow-artifacts.js +53 -0
  284. package/dist/opencode/build/src/cli/workflow.js +5 -1
  285. package/dist/opencode/build/src/flow-kit/provision.d.ts +23 -0
  286. package/dist/opencode/build/src/flow-kit/provision.js +99 -0
  287. package/dist/opencode/build/src/flow-kit/validate.d.ts +52 -0
  288. package/dist/opencode/build/src/flow-kit/validate.js +214 -9
  289. package/dist/opencode/build/src/runtime-adapters.js +1 -1
  290. package/dist/opencode/context/contracts/execution-contract.md +30 -1
  291. package/dist/opencode/context/contracts/review-contract.md +4 -0
  292. package/dist/opencode/context/contracts/trigger-guards.md +73 -0
  293. package/dist/opencode/context/settings/backlog-provider-settings.json +1 -1
  294. package/dist/opencode/context/settings/workspace-backlog-provider-settings.example.json +1 -1
  295. package/dist/opencode/docs/adr/0023-kit-provisioning.md +47 -0
  296. package/dist/opencode/docs/adr/index.md +1 -0
  297. package/dist/opencode/docs/architecture-engine-and-kits.md +17 -0
  298. package/dist/opencode/docs/context-map.md +3 -0
  299. package/dist/opencode/docs/decisions/backlog-readiness-source.md +89 -0
  300. package/dist/opencode/docs/decisions/index.md +1 -0
  301. package/dist/opencode/docs/developer-architecture.md +3 -3
  302. package/dist/opencode/docs/flow-kit-repository-contract.md +34 -3
  303. package/dist/opencode/docs/kit-authoring-guide.md +1 -1
  304. package/dist/opencode/docs/veritas-integration.md +12 -0
  305. package/dist/opencode/evals/ci/run-baseline.sh +4 -0
  306. package/dist/opencode/evals/integration/test_kit_provisioning.sh +112 -0
  307. package/dist/opencode/evals/integration/test_pull_work_provider.sh +18 -0
  308. package/dist/opencode/evals/integration/test_veritas_governance_kit.sh +256 -0
  309. package/dist/opencode/evals/integration/test_workflow_artifacts.sh +257 -0
  310. package/dist/opencode/evals/static/test_package.sh +6 -0
  311. package/dist/opencode/evals/static/test_workflow_skills.sh +16 -0
  312. package/dist/opencode/install.sh +1 -1
  313. package/dist/opencode/kits/builder/flows/publish-learn.flow.json +9 -1
  314. package/dist/opencode/kits/builder/skills/execute-plan/SKILL.md +4 -3
  315. package/dist/opencode/kits/builder/skills/pull-work/SKILL.md +12 -0
  316. package/dist/opencode/kits/builder/skills/review-work/SKILL.md +11 -0
  317. package/dist/opencode/kits/veritas-governance/adapter/readiness-to-trust-bundle.mjs +19 -20
  318. package/dist/opencode/kits/veritas-governance/assets/starter-hooks/githooks/post-commit +13 -0
  319. package/dist/opencode/kits/veritas-governance/assets/starter-hooks/githooks/pre-push +13 -0
  320. package/dist/opencode/kits/veritas-governance/assets/starter-standards/veritas/GOVERNANCE.md +23 -0
  321. package/dist/opencode/kits/veritas-governance/assets/starter-standards/veritas/README.md +58 -0
  322. package/dist/opencode/kits/veritas-governance/assets/starter-standards/veritas/authority/default.authority-settings.json +30 -0
  323. package/dist/opencode/kits/veritas-governance/assets/starter-standards/veritas/repo-map.json +115 -0
  324. package/dist/opencode/kits/veritas-governance/assets/starter-standards/veritas/repo-standards/default.repo-standards.json +54 -0
  325. package/dist/opencode/kits/veritas-governance/assets/starter-standards/veritas.claims.json +179 -0
  326. package/dist/opencode/kits/veritas-governance/docs/README.md +141 -10
  327. package/dist/opencode/kits/veritas-governance/fixtures/standards-authoring/approved.trust-bundle.json +74 -0
  328. package/dist/opencode/kits/veritas-governance/fixtures/standards-authoring/not-approved.trust-bundle.json +74 -0
  329. package/dist/opencode/kits/veritas-governance/flows/standards-authoring.flow.json +35 -0
  330. package/dist/opencode/kits/veritas-governance/kit.json +65 -0
  331. package/dist/opencode/kits/veritas-governance/skills/consult-standards/SKILL.md +73 -0
  332. package/dist/opencode/kits/veritas-governance/skills/standards-authoring/SKILL.md +87 -0
  333. package/dist/opencode/schemas/backlog-provider-settings.schema.json +1 -1
  334. package/dist/opencode/schemas/workflow-waves.schema.json +347 -0
  335. package/dist/opencode/scripts/check-layer-boundary.mjs +98 -0
  336. package/dist/pi/.pi/skills/consult-standards/SKILL.md +73 -0
  337. package/dist/pi/.pi/skills/execute-plan/SKILL.md +4 -3
  338. package/dist/pi/.pi/skills/pull-work/SKILL.md +12 -0
  339. package/dist/pi/.pi/skills/review-work/SKILL.md +11 -0
  340. package/dist/pi/.pi/skills/standards-authoring/SKILL.md +87 -0
  341. package/dist/pi/build/package.json +1 -1
  342. package/dist/pi/build/src/cli/init.js +35 -3
  343. package/dist/pi/build/src/cli/kit.js +95 -2
  344. package/dist/pi/build/src/cli/pull-work-provider.js +7 -1
  345. package/dist/pi/build/src/cli/validate-workflow-artifacts.js +53 -0
  346. package/dist/pi/build/src/cli/workflow.js +5 -1
  347. package/dist/pi/build/src/flow-kit/provision.d.ts +23 -0
  348. package/dist/pi/build/src/flow-kit/provision.js +99 -0
  349. package/dist/pi/build/src/flow-kit/validate.d.ts +52 -0
  350. package/dist/pi/build/src/flow-kit/validate.js +214 -9
  351. package/dist/pi/build/src/runtime-adapters.js +1 -1
  352. package/dist/pi/context/contracts/execution-contract.md +30 -1
  353. package/dist/pi/context/contracts/review-contract.md +4 -0
  354. package/dist/pi/context/contracts/trigger-guards.md +73 -0
  355. package/dist/pi/context/settings/backlog-provider-settings.json +1 -1
  356. package/dist/pi/context/settings/workspace-backlog-provider-settings.example.json +1 -1
  357. package/dist/pi/docs/adr/0023-kit-provisioning.md +47 -0
  358. package/dist/pi/docs/adr/index.md +1 -0
  359. package/dist/pi/docs/architecture-engine-and-kits.md +17 -0
  360. package/dist/pi/docs/context-map.md +3 -0
  361. package/dist/pi/docs/decisions/backlog-readiness-source.md +89 -0
  362. package/dist/pi/docs/decisions/index.md +1 -0
  363. package/dist/pi/docs/developer-architecture.md +3 -3
  364. package/dist/pi/docs/flow-kit-repository-contract.md +34 -3
  365. package/dist/pi/docs/kit-authoring-guide.md +1 -1
  366. package/dist/pi/docs/veritas-integration.md +12 -0
  367. package/dist/pi/evals/ci/run-baseline.sh +4 -0
  368. package/dist/pi/evals/integration/test_kit_provisioning.sh +112 -0
  369. package/dist/pi/evals/integration/test_pull_work_provider.sh +18 -0
  370. package/dist/pi/evals/integration/test_veritas_governance_kit.sh +256 -0
  371. package/dist/pi/evals/integration/test_workflow_artifacts.sh +257 -0
  372. package/dist/pi/evals/static/test_package.sh +6 -0
  373. package/dist/pi/evals/static/test_workflow_skills.sh +16 -0
  374. package/dist/pi/install.sh +1 -1
  375. package/dist/pi/kits/builder/flows/publish-learn.flow.json +9 -1
  376. package/dist/pi/kits/builder/skills/execute-plan/SKILL.md +4 -3
  377. package/dist/pi/kits/builder/skills/pull-work/SKILL.md +12 -0
  378. package/dist/pi/kits/builder/skills/review-work/SKILL.md +11 -0
  379. package/dist/pi/kits/veritas-governance/adapter/readiness-to-trust-bundle.mjs +19 -20
  380. package/dist/pi/kits/veritas-governance/assets/starter-hooks/githooks/post-commit +13 -0
  381. package/dist/pi/kits/veritas-governance/assets/starter-hooks/githooks/pre-push +13 -0
  382. package/dist/pi/kits/veritas-governance/assets/starter-standards/veritas/GOVERNANCE.md +23 -0
  383. package/dist/pi/kits/veritas-governance/assets/starter-standards/veritas/README.md +58 -0
  384. package/dist/pi/kits/veritas-governance/assets/starter-standards/veritas/authority/default.authority-settings.json +30 -0
  385. package/dist/pi/kits/veritas-governance/assets/starter-standards/veritas/repo-map.json +115 -0
  386. package/dist/pi/kits/veritas-governance/assets/starter-standards/veritas/repo-standards/default.repo-standards.json +54 -0
  387. package/dist/pi/kits/veritas-governance/assets/starter-standards/veritas.claims.json +179 -0
  388. package/dist/pi/kits/veritas-governance/docs/README.md +141 -10
  389. package/dist/pi/kits/veritas-governance/fixtures/standards-authoring/approved.trust-bundle.json +74 -0
  390. package/dist/pi/kits/veritas-governance/fixtures/standards-authoring/not-approved.trust-bundle.json +74 -0
  391. package/dist/pi/kits/veritas-governance/flows/standards-authoring.flow.json +35 -0
  392. package/dist/pi/kits/veritas-governance/kit.json +65 -0
  393. package/dist/pi/kits/veritas-governance/skills/consult-standards/SKILL.md +73 -0
  394. package/dist/pi/kits/veritas-governance/skills/standards-authoring/SKILL.md +87 -0
  395. package/dist/pi/schemas/backlog-provider-settings.schema.json +1 -1
  396. package/dist/pi/schemas/workflow-waves.schema.json +347 -0
  397. package/dist/pi/scripts/check-layer-boundary.mjs +98 -0
  398. package/docs/adr/0023-kit-provisioning.md +47 -0
  399. package/docs/adr/index.md +1 -0
  400. package/docs/architecture-engine-and-kits.md +17 -0
  401. package/docs/context-map.md +3 -0
  402. package/docs/decisions/backlog-readiness-source.md +89 -0
  403. package/docs/decisions/index.md +1 -0
  404. package/docs/developer-architecture.md +3 -3
  405. package/docs/flow-kit-repository-contract.md +34 -3
  406. package/docs/kit-authoring-guide.md +1 -1
  407. package/docs/veritas-integration.md +12 -0
  408. package/evals/ci/run-baseline.sh +4 -0
  409. package/evals/integration/test_kit_provisioning.sh +112 -0
  410. package/evals/integration/test_pull_work_provider.sh +18 -0
  411. package/evals/integration/test_veritas_governance_kit.sh +256 -0
  412. package/evals/integration/test_workflow_artifacts.sh +257 -0
  413. package/evals/static/test_package.sh +6 -0
  414. package/evals/static/test_workflow_skills.sh +16 -0
  415. package/kits/builder/flows/publish-learn.flow.json +9 -1
  416. package/kits/builder/skills/execute-plan/SKILL.md +4 -3
  417. package/kits/builder/skills/pull-work/SKILL.md +12 -0
  418. package/kits/builder/skills/review-work/SKILL.md +11 -0
  419. package/kits/veritas-governance/adapter/readiness-to-trust-bundle.mjs +19 -20
  420. package/kits/veritas-governance/assets/starter-hooks/githooks/post-commit +13 -0
  421. package/kits/veritas-governance/assets/starter-hooks/githooks/pre-push +13 -0
  422. package/kits/veritas-governance/assets/starter-standards/veritas/GOVERNANCE.md +23 -0
  423. package/kits/veritas-governance/assets/starter-standards/veritas/README.md +58 -0
  424. package/kits/veritas-governance/assets/starter-standards/veritas/authority/default.authority-settings.json +30 -0
  425. package/kits/veritas-governance/assets/starter-standards/veritas/repo-map.json +115 -0
  426. package/kits/veritas-governance/assets/starter-standards/veritas/repo-standards/default.repo-standards.json +54 -0
  427. package/kits/veritas-governance/assets/starter-standards/veritas.claims.json +179 -0
  428. package/kits/veritas-governance/docs/README.md +141 -10
  429. package/kits/veritas-governance/fixtures/standards-authoring/approved.trust-bundle.json +74 -0
  430. package/kits/veritas-governance/fixtures/standards-authoring/not-approved.trust-bundle.json +74 -0
  431. package/kits/veritas-governance/flows/standards-authoring.flow.json +35 -0
  432. package/kits/veritas-governance/kit.json +65 -0
  433. package/kits/veritas-governance/skills/consult-standards/SKILL.md +73 -0
  434. package/kits/veritas-governance/skills/standards-authoring/SKILL.md +87 -0
  435. package/package.json +2 -1
  436. package/schemas/backlog-provider-settings.schema.json +1 -1
  437. package/schemas/workflow-waves.schema.json +347 -0
  438. package/scripts/check-layer-boundary.mjs +98 -0
  439. package/src/cli/builder-flow-runtime.test.mjs +86 -0
  440. package/src/cli/flow-resolver-composition.test.mjs +20 -1
  441. package/src/cli/init.ts +31 -3
  442. package/src/cli/kit-metadata-security.test.mjs +163 -1
  443. package/src/cli/kit-provisioning.test.mjs +122 -0
  444. package/src/cli/kit.ts +83 -2
  445. package/src/cli/pull-work-provider.ts +7 -1
  446. package/src/cli/validate-waves.test.mjs +134 -0
  447. package/src/cli/validate-workflow-artifacts.ts +47 -0
  448. package/src/cli/workflow.ts +7 -1
  449. package/src/flow-kit/provision.ts +118 -0
  450. package/src/flow-kit/validate.ts +233 -10
  451. package/src/runtime-adapters.ts +1 -1
@@ -717,7 +717,13 @@ function assertDistinctReviewActor(sessionDir: string, slug: string): ReturnType
717
717
  const assignment = readActiveAssignment(sessionDir, slug);
718
718
  const caller = resolveCurrentAssignmentActor();
719
719
  if (assignment.actor_key === caller.actorKey) {
720
- throw new Error("workflow critique requires a reviewer identity distinct from the active implementation assignment actor");
720
+ throw new Error(
721
+ "workflow critique requires a reviewer identity distinct from the active implementation assignment actor. " +
722
+ "The reviewer identity is derived from the runtime actor, so an orchestrator that implemented and now reviews " +
723
+ "resolves to the same actor. To record an independent review, run the reviewer under a distinct actor: set " +
724
+ "FLOW_AGENTS_ACTOR=<reviewer-id> on the reviewing process, or run the reviewer in a separate runtime session " +
725
+ "(the runtime session id seeds the actor).",
726
+ );
721
727
  }
722
728
  return caller;
723
729
  }
@@ -0,0 +1,118 @@
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, type KitProvisionEntry } from "./validate.js";
6
+
7
+ export type ProvisionedFile = { id: string; target: string };
8
+
9
+ export type ProvisionPlanEntry = ProvisionedFile & {
10
+ source: string;
11
+ destination: string;
12
+ };
13
+
14
+ export type ProvisionResult = {
15
+ kit_id: string;
16
+ kit_hash?: string;
17
+ files: ProvisionPlanEntry[];
18
+ manifest_path?: string;
19
+ dry_run: boolean;
20
+ };
21
+
22
+ export class ProvisionConflictError extends Error {
23
+ readonly conflicts: ProvisionPlanEntry[];
24
+
25
+ constructor(conflicts: ProvisionPlanEntry[]) {
26
+ super(`provisioning conflicts with ${conflicts.length} existing destination(s)`);
27
+ this.name = "ProvisionConflictError";
28
+ this.conflicts = conflicts;
29
+ }
30
+ }
31
+
32
+ function kitContentHash(kitDir: string): string {
33
+ const hash = crypto.createHash("sha256");
34
+ for (const file of walkFiles(kitDir)) {
35
+ const rel = path.relative(kitDir, file).split(path.sep).join("/");
36
+ if (rel.split("/").some((part) => [".git", "__pycache__", ".pytest_cache"].includes(part))) continue;
37
+ hash.update(rel);
38
+ hash.update("\0");
39
+ hash.update(fs.readFileSync(file));
40
+ hash.update("\0");
41
+ }
42
+ return `sha256:${hash.digest("hex")}`;
43
+ }
44
+
45
+ function isContained(root: string, candidate: string): boolean {
46
+ const relative = path.relative(root, candidate);
47
+ return relative !== "" && !relative.startsWith("..") && !path.isAbsolute(relative);
48
+ }
49
+
50
+ function assertSafeDestination(rootReal: string, destination: string): void {
51
+ const prospective = canonicalProspectivePath(destination);
52
+ if (!isContained(rootReal, prospective)) throw new Error(`provision target escapes consumer repository: ${destination}`);
53
+ if (!fs.existsSync(destination)) return;
54
+ const stat = fs.lstatSync(destination);
55
+ if (stat.isSymbolicLink()) throw new Error(`refusing provision target symlink: ${destination}`);
56
+ if (!stat.isFile()) throw new Error(`provision target is not a regular file: ${destination}`);
57
+ }
58
+
59
+ function manifestProvisions(manifest: Record<string, unknown>): KitProvisionEntry[] {
60
+ if (!Array.isArray(manifest.provisions)) return [];
61
+ return manifest.provisions.map((entry) => {
62
+ const record = entry as Record<string, unknown>;
63
+ return {
64
+ id: String(record.id),
65
+ path: String(record.path),
66
+ target: path.posix.normalize(String(record.target).replace(/\\/g, "/")),
67
+ ...(typeof record.description === "string" ? { description: record.description } : {}),
68
+ };
69
+ });
70
+ }
71
+
72
+ export async function provisionKit(
73
+ kitDir: string,
74
+ targetDir: string,
75
+ options: { force?: boolean; dryRun?: boolean } = {},
76
+ ): Promise<ProvisionResult> {
77
+ const kitRoot = fs.realpathSync(path.resolve(kitDir));
78
+ const targetPath = path.resolve(targetDir);
79
+ if (!fs.existsSync(targetPath) || !fs.statSync(targetPath).isDirectory()) {
80
+ throw new Error(`provision target must exist and be a directory: ${targetPath}`);
81
+ }
82
+ const targetRoot = fs.realpathSync(targetPath);
83
+ const manifest = await assertKitRepository(kitRoot);
84
+ const kitId = String(manifest.id);
85
+ const files = manifestProvisions(manifest).map((entry) => ({
86
+ id: entry.id,
87
+ target: entry.target,
88
+ source: path.resolve(kitRoot, entry.path),
89
+ destination: path.resolve(targetRoot, ...entry.target.split("/")),
90
+ }));
91
+
92
+ for (const file of files) assertSafeDestination(targetRoot, file.destination);
93
+ // Defense in depth against a source swapped to a link after validation: re-assert the
94
+ // link-resolved source stays inside the kit before we read and copy its bytes.
95
+ for (const file of files) {
96
+ const realSource = fs.realpathSync(file.source);
97
+ if (realSource !== kitRoot && !realSource.startsWith(`${kitRoot}${path.sep}`)) {
98
+ throw new Error(`provision source escapes the kit directory: ${file.id}`);
99
+ }
100
+ }
101
+ const conflicts = options.force ? [] : files.filter((file) => fs.existsSync(file.destination));
102
+ if (conflicts.length) throw new ProvisionConflictError(conflicts);
103
+
104
+ const kitHash = kitContentHash(kitRoot);
105
+ if (options.dryRun || files.length === 0) return { kit_id: kitId, kit_hash: kitHash, files, dry_run: Boolean(options.dryRun) };
106
+
107
+ const manifestPath = path.join(targetRoot, ...PROVISION_MANIFEST_DIR.split("/"), `${kitId}.json`);
108
+ assertSafeDestination(targetRoot, manifestPath);
109
+ for (const file of files) atomicCopyFile(targetRoot, file.source, file.destination);
110
+ atomicWriteJson(targetRoot, manifestPath, {
111
+ schema_version: "1.0",
112
+ kit_id: kitId,
113
+ kit_hash: kitHash,
114
+ provisioned_at: new Date().toISOString(),
115
+ files: files.map(({ id, target }) => ({ id, target })),
116
+ });
117
+ return { kit_id: kitId, kit_hash: kitHash, files, manifest_path: manifestPath, dry_run: false };
118
+ }
@@ -7,27 +7,40 @@ export { isObservableBuilderArtifactRef, isSafeBuilderArtifactRef, parseKitFlowS
7
7
  export type { KitFlowStepActionEntry, KitFlowStepArtifactBinding, KitFlowStepExpectationBinding } from "./action-metadata.js";
8
8
 
9
9
  // Extension-only asset classes: validated by Flow Agents. Flows are validated by @kontourai/flow.
10
- const EXTENSION_ASSET_CLASSES = ["skills", "docs", "adapters", "evals", "assets"] as const;
10
+ const EXTENSION_ASSET_CLASSES = ["skills", "docs", "adapters", "evals", "assets", "provisions"] as const;
11
11
 
12
12
  // Core container fields owned by kontourai/flow (flow-kit-container.schema.json).
13
13
  // agent-extension fields are skills, docs, adapters, evals, assets.
14
14
  const CORE_CONTAINER_FIELDS = new Set(["schema_version", "id", "name", "description", "product_name", "flows"]);
15
- const AGENT_EXTENSION_CLASSES = new Set(["skills", "docs", "adapters", "evals", "assets"]);
15
+ const AGENT_EXTENSION_CLASSES = new Set(["skills", "docs", "adapters", "evals", "assets", "provisions"]);
16
16
 
17
17
  // Flow Agents-recognized metadata fields that are neither core container fields nor
18
18
  // agent-extension asset classes. Recognized here so they are never misreported as
19
19
  // unknown third-party extension namespaces. `dependencies` declares cross-kit skill
20
20
  // dependencies (extension-layer ownership; see docs/adr/0019-kit-dependency-ownership.md),
21
21
  // workflow_triggers / hook_influence_expectations declare kit-owned runtime influence,
22
- // and first_party is legacy catalog/marketplace metadata. It does not grant runtime
23
- // capability or steering privilege.
24
- const KNOWN_METADATA_FIELDS = new Set(["dependencies", "workflow_triggers", "hook_influence_expectations", "flow_step_actions", "skill_roles", "first_party"]);
22
+ // agent_spawn_triggers declares perimeter trigger surfaces that spawn agent runs plus
23
+ // their guard config (context/contracts/trigger-guards.md), and first_party is legacy
24
+ // catalog/marketplace metadata. It does not grant runtime capability or steering privilege.
25
+ const KNOWN_METADATA_FIELDS = new Set(["dependencies", "workflow_triggers", "hook_influence_expectations", "flow_step_actions", "skill_roles", "first_party", "agent_spawn_triggers"]);
25
26
 
26
27
  export interface KitDependencyEntry {
27
28
  kit_id: string;
28
29
  reason?: string;
29
30
  }
30
31
 
32
+ export interface KitProvisionEntry {
33
+ id: string;
34
+ path: string;
35
+ target: string;
36
+ description?: string;
37
+ }
38
+
39
+ // Consumer-repo-relative directory (posix, lowercase) where the engine writes its own
40
+ // per-kit provision manifest. Reserved: a provision may not target inside it. Shared with
41
+ // provision.ts so the reservation and the actual manifest write stay in agreement.
42
+ export const PROVISION_MANIFEST_DIR = ".kontourai/flow-agents/provisions";
43
+
31
44
  export interface KitWorkflowTriggerEntry {
32
45
  id: string;
33
46
  when: string;
@@ -48,6 +61,20 @@ export interface KitHookInfluenceExpectationEntry {
48
61
  must_include_actions: string[];
49
62
  }
50
63
 
64
+ export interface KitAgentSpawnTriggerGuards {
65
+ dedup_key: string;
66
+ cooldown_seconds: number;
67
+ daily_cap: number;
68
+ max_concurrent: number;
69
+ }
70
+
71
+ export interface KitAgentSpawnTriggerEntry {
72
+ id: string;
73
+ description: string;
74
+ spawns_agent_runs: boolean;
75
+ guards?: KitAgentSpawnTriggerGuards;
76
+ }
77
+
51
78
  export type KitSkillRole = "entrypoint" | "profile" | "step" | "shared-primitive" | "extension";
52
79
 
53
80
  export interface KitSkillRoleEntry {
@@ -266,6 +293,120 @@ export function parseKitHookInfluenceExpectations(manifest: Record<string, unkno
266
293
  return { entries, errors };
267
294
  }
268
295
 
296
+ const AGENT_SPAWN_TRIGGER_GUARD_FIELDS = ["dedup_key", "cooldown_seconds", "daily_cap", "max_concurrent"] as const;
297
+
298
+ /**
299
+ * Parse and shape-validate a kit manifest's optional `agent_spawn_triggers` field:
300
+ * perimeter trigger surfaces (check failures, schedules, watchers) that spawn agent
301
+ * runs, plus their guard config. Contract: context/contracts/trigger-guards.md.
302
+ *
303
+ * Shape rules (ERRORS):
304
+ * - `agent_spawn_triggers` (if present) must be an array of objects.
305
+ * - `id` must match the workflow-trigger identifier pattern and be unique.
306
+ * - `description` must be a non-empty string.
307
+ * - `spawns_agent_runs` must be a boolean.
308
+ * - `guards` (if present) must be an object with exactly the four guard fields when
309
+ * complete: `dedup_key` non-empty string; `cooldown_seconds`, `daily_cap`,
310
+ * `max_concurrent` integers >= 1. Unknown guard fields are errors.
311
+ *
312
+ * Guard-completeness (WARNINGS, never errors — declaration-first rollout, #664):
313
+ * - an entry with `spawns_agent_runs: true` and missing or incomplete `guards`
314
+ * produces a warning naming the missing guard fields and the contract doc.
315
+ */
316
+ export function parseKitAgentSpawnTriggers(manifest: Record<string, unknown>, manifestPath: string): { entries: KitAgentSpawnTriggerEntry[]; errors: string[]; warnings: string[] } {
317
+ const entries: KitAgentSpawnTriggerEntry[] = [];
318
+ const errors: string[] = [];
319
+ const warnings: string[] = [];
320
+ const raw = manifest.agent_spawn_triggers;
321
+ if (raw === undefined) return { entries, errors, warnings };
322
+ if (!Array.isArray(raw)) {
323
+ errors.push(`${manifestPath}: .agent_spawn_triggers must be a list`);
324
+ return { entries, errors, warnings };
325
+ }
326
+ const fields = new Set(["id", "description", "spawns_agent_runs", "guards"]);
327
+ const seen = new Set<string>();
328
+ raw.forEach((entry, index) => {
329
+ if (typeof entry !== "object" || entry === null) {
330
+ errors.push(`${manifestPath}: agent_spawn_triggers[${index}] must be an object`);
331
+ return;
332
+ }
333
+ const record = entry as Record<string, unknown>;
334
+ const unknown = Object.keys(record).filter((field) => !fields.has(field));
335
+ if (unknown.length > 0) {
336
+ errors.push(`${manifestPath}: agent_spawn_triggers[${index}] contains unsupported field(s): ${unknown.join(", ")}`);
337
+ return;
338
+ }
339
+ const id = record.id;
340
+ if (!workflowTriggerIdentifier(id)) {
341
+ errors.push(`${manifestPath}: agent_spawn_triggers[${index}].id must match ^[a-z0-9]+(?:[.-][a-z0-9]+)*$`);
342
+ return;
343
+ }
344
+ if (seen.has(id)) {
345
+ errors.push(`${manifestPath}: agent_spawn_triggers[${index}].id duplicates '${id}'`);
346
+ return;
347
+ }
348
+ seen.add(id);
349
+ if (typeof record.description !== "string" || !record.description.trim()) {
350
+ errors.push(`${manifestPath}: agent_spawn_triggers[${index}].description must be a non-empty string`);
351
+ return;
352
+ }
353
+ if (typeof record.spawns_agent_runs !== "boolean") {
354
+ errors.push(`${manifestPath}: agent_spawn_triggers[${index}].spawns_agent_runs must be a boolean`);
355
+ return;
356
+ }
357
+ let guards: KitAgentSpawnTriggerGuards | undefined;
358
+ let guardsShapeValid = true;
359
+ const missingGuardFields: string[] = [];
360
+ if (record.guards !== undefined) {
361
+ if (typeof record.guards !== "object" || record.guards === null || Array.isArray(record.guards)) {
362
+ errors.push(`${manifestPath}: agent_spawn_triggers[${index}].guards must be an object when present`);
363
+ return;
364
+ }
365
+ const guardRecord = record.guards as Record<string, unknown>;
366
+ const guardFieldSet = new Set<string>(AGENT_SPAWN_TRIGGER_GUARD_FIELDS);
367
+ const unknownGuards = Object.keys(guardRecord).filter((field) => !guardFieldSet.has(field));
368
+ if (unknownGuards.length > 0) {
369
+ errors.push(`${manifestPath}: agent_spawn_triggers[${index}].guards contains unsupported field(s): ${unknownGuards.join(", ")}`);
370
+ return;
371
+ }
372
+ if (guardRecord.dedup_key !== undefined && (typeof guardRecord.dedup_key !== "string" || !guardRecord.dedup_key.trim())) {
373
+ errors.push(`${manifestPath}: agent_spawn_triggers[${index}].guards.dedup_key must be a non-empty string`);
374
+ guardsShapeValid = false;
375
+ }
376
+ for (const field of ["cooldown_seconds", "daily_cap", "max_concurrent"] as const) {
377
+ const value = guardRecord[field];
378
+ if (value !== undefined && (typeof value !== "number" || !Number.isInteger(value) || value < 1)) {
379
+ errors.push(`${manifestPath}: agent_spawn_triggers[${index}].guards.${field} must be an integer >= 1`);
380
+ guardsShapeValid = false;
381
+ }
382
+ }
383
+ if (!guardsShapeValid) return;
384
+ for (const field of AGENT_SPAWN_TRIGGER_GUARD_FIELDS) {
385
+ if (guardRecord[field] === undefined) missingGuardFields.push(field);
386
+ }
387
+ if (missingGuardFields.length === 0) {
388
+ guards = {
389
+ dedup_key: guardRecord.dedup_key as string,
390
+ cooldown_seconds: guardRecord.cooldown_seconds as number,
391
+ daily_cap: guardRecord.daily_cap as number,
392
+ max_concurrent: guardRecord.max_concurrent as number,
393
+ };
394
+ }
395
+ } else {
396
+ missingGuardFields.push(...AGENT_SPAWN_TRIGGER_GUARD_FIELDS);
397
+ }
398
+ if (record.spawns_agent_runs === true && missingGuardFields.length > 0) {
399
+ warnings.push(
400
+ `${manifestPath}: agent_spawn_triggers[${index}] ('${id}') spawns agent runs without complete guard config` +
401
+ ` (missing: ${missingGuardFields.join(", ")}); declare dedup_key, cooldown_seconds, daily_cap, and max_concurrent` +
402
+ ` per context/contracts/trigger-guards.md`,
403
+ );
404
+ }
405
+ entries.push({ id, description: record.description, spawns_agent_runs: record.spawns_agent_runs, ...(guards ? { guards } : {}) });
406
+ });
407
+ return { entries, errors, warnings };
408
+ }
409
+
269
410
  export function parseKitSkillRoles(manifest: Record<string, unknown>, manifestPath: string): { entries: KitSkillRoleEntry[]; errors: string[] } {
270
411
  const entries: KitSkillRoleEntry[] = [];
271
412
  const errors: string[] = [];
@@ -493,21 +634,34 @@ export async function deriveKitTargets(manifest: Record<string, unknown>, kitDir
493
634
  }
494
635
 
495
636
  export async function validateKitRepository(kitDir: string): Promise<string[]> {
637
+ return (await validateKitRepositoryDiagnostics(kitDir)).errors;
638
+ }
639
+
640
+ /**
641
+ * Repository validation with a non-blocking warnings channel alongside the blocking
642
+ * errors `validateKitRepository` has always returned. Warnings are advisory quality
643
+ * findings (today: an agent-spawning trigger surface declared without complete guard
644
+ * config — context/contracts/trigger-guards.md); they never fail validation.
645
+ */
646
+ export async function validateKitRepositoryDiagnostics(kitDir: string): Promise<{ errors: string[]; warnings: string[] }> {
496
647
  const errors: string[] = [];
648
+ const warnings: string[] = [];
497
649
  const manifestPath = path.join(kitDir, "kit.json");
498
650
  let manifest: Record<string, unknown>;
499
651
  try {
500
652
  manifest = readJson(manifestPath) as Record<string, unknown>;
501
653
  } catch (error) {
502
654
  errors.push(`${manifestPath}: invalid JSON: ${(error as Error).message}`);
503
- return errors;
655
+ return { errors, warnings };
504
656
  }
505
657
 
506
658
  errors.push(...await delegateCoreContainerValidation(kitDir, manifest));
507
659
  errors.push(...validateExtensionAssets(kitDir, manifestPath, manifest));
508
- errors.push(...validateAgentMetadata(kitDir, manifestPath, manifest));
660
+ const metadata = validateAgentMetadata(kitDir, manifestPath, manifest);
661
+ errors.push(...metadata.errors);
662
+ warnings.push(...metadata.warnings);
509
663
  if (manifest.first_party !== undefined && typeof manifest.first_party !== "boolean") errors.push(`${manifestPath}: .first_party must be a boolean when present`);
510
- return errors;
664
+ return { errors, warnings };
511
665
  }
512
666
 
513
667
  function validateExtensionAssets(kitDir: string, manifestPath: string, manifest: Record<string, unknown>): string[] {
@@ -528,10 +682,14 @@ function validateExtensionAssets(kitDir: string, manifestPath: string, manifest:
528
682
  const record = entry as Record<string, unknown>;
529
683
  const id = record.id;
530
684
  const rel = record.path;
685
+ const kitId = typeof manifest.id === "string" ? manifest.id : "";
531
686
  if (typeof id === "string") {
532
687
  if (seen.has(id)) errors.push(`${manifestPath}: ${section}[${index}].id duplicates`);
533
688
  seen.add(id);
534
689
  }
690
+ if (section === "provisions" && (typeof id !== "string" || !kitId || !id.startsWith(`${kitId}.`))) {
691
+ errors.push(`${manifestPath}: provisions[${index}].id must be prefixed with '${kitId}.'`);
692
+ }
535
693
  if (typeof rel !== "string" || !rel) {
536
694
  errors.push(`${manifestPath}: ${section}[${index}].path must be a string`);
537
695
  return;
@@ -540,6 +698,10 @@ function validateExtensionAssets(kitDir: string, manifestPath: string, manifest:
540
698
  errors.push(`${manifestPath}: ${section}[${index}].path must be relative`);
541
699
  return;
542
700
  }
701
+ if (rel.replace(/\\/g, "/").split("/").includes("..")) {
702
+ errors.push(`${manifestPath}: ${section}[${index}].path must not contain traversal segments`);
703
+ return;
704
+ }
543
705
  const resolved = path.resolve(kitDir, rel);
544
706
  const root = path.resolve(kitDir);
545
707
  if (resolved !== root && !resolved.startsWith(`${root}${path.sep}`)) {
@@ -548,21 +710,82 @@ function validateExtensionAssets(kitDir: string, manifestPath: string, manifest:
548
710
  }
549
711
  if (!fs.existsSync(resolved)) {
550
712
  errors.push(`${manifestPath}: ${section}[${index}].path points at missing asset: ${rel}`);
713
+ } else if (section === "provisions") {
714
+ if (!fs.statSync(resolved).isFile()) {
715
+ errors.push(`${manifestPath}: provisions[${index}].path must point at a file: ${rel}`);
716
+ } else {
717
+ // A provisioned source is copied byte-for-byte into a consumer repo, so a symlink that
718
+ // resolves outside the kit would exfiltrate arbitrary readable host files. Require the
719
+ // link-resolved real path to stay inside the kit.
720
+ const realResolved = fs.realpathSync(resolved);
721
+ const realRoot = fs.realpathSync(root);
722
+ if (realResolved !== realRoot && !realResolved.startsWith(`${realRoot}${path.sep}`)) {
723
+ errors.push(`${manifestPath}: provisions[${index}].path must not resolve outside the kit directory`);
724
+ }
725
+ }
551
726
  }
552
727
  });
553
728
  }
554
729
 
730
+ const rawProvisions = manifest.provisions;
731
+ if (Array.isArray(rawProvisions)) {
732
+ const targets = new Set<string>();
733
+ rawProvisions.forEach((entry, index) => {
734
+ if (typeof entry !== "object" || entry === null) return;
735
+ const record = entry as Record<string, unknown>;
736
+ if (record.description !== undefined && typeof record.description !== "string") {
737
+ errors.push(`${manifestPath}: provisions[${index}].description must be a string when present`);
738
+ }
739
+ const target = record.target;
740
+ if (typeof target !== "string" || target.trim().length === 0) {
741
+ errors.push(`${manifestPath}: provisions[${index}].target must be a non-empty string`);
742
+ return;
743
+ }
744
+ if (path.isAbsolute(target) || path.win32.isAbsolute(target)) {
745
+ errors.push(`${manifestPath}: provisions[${index}].target must be relative`);
746
+ return;
747
+ }
748
+ const segments = target.replace(/\\/g, "/").split("/");
749
+ if (segments.includes("..")) {
750
+ errors.push(`${manifestPath}: provisions[${index}].target must not contain traversal segments`);
751
+ return;
752
+ }
753
+ const normalized = path.posix.normalize(segments.join("/"));
754
+ if (normalized === "." || normalized.startsWith("..")) {
755
+ errors.push(`${manifestPath}: provisions[${index}].target must stay inside the consumer repository`);
756
+ return;
757
+ }
758
+ // Case-fold reserved-directory and collision checks: on a case-insensitive filesystem
759
+ // `.GIT/` still lands in the real `.git`, and README.md/readme.md still collide.
760
+ const lowered = normalized.toLowerCase();
761
+ if (lowered === ".git" || lowered.startsWith(".git/")) {
762
+ errors.push(`${manifestPath}: provisions[${index}].target must not be inside .git`);
763
+ return;
764
+ }
765
+ if (lowered === PROVISION_MANIFEST_DIR || lowered.startsWith(`${PROVISION_MANIFEST_DIR}/`)) {
766
+ errors.push(`${manifestPath}: provisions[${index}].target must not be inside the provision manifest namespace (${PROVISION_MANIFEST_DIR}/)`);
767
+ return;
768
+ }
769
+ if (targets.has(lowered)) errors.push(`${manifestPath}: provisions[${index}].target duplicates '${normalized}'`);
770
+ targets.add(lowered);
771
+ });
772
+ }
773
+
555
774
  return errors;
556
775
  }
557
776
 
558
- function validateAgentMetadata(kitDir: string, manifestPath: string, manifest: Record<string, unknown>): string[] {
777
+ function validateAgentMetadata(kitDir: string, manifestPath: string, manifest: Record<string, unknown>): { errors: string[]; warnings: string[] } {
559
778
  const errors: string[] = [];
779
+ const warnings: string[] = [];
560
780
  const depResult = parseKitDependencies(manifest, manifestPath);
561
781
  for (const err of depResult.errors) errors.push(err);
562
782
  const workflowTriggerResult = parseKitWorkflowTriggers(manifest, manifestPath);
563
783
  for (const err of workflowTriggerResult.errors) errors.push(err);
564
784
  const hookExpectationResult = parseKitHookInfluenceExpectations(manifest, manifestPath);
565
785
  for (const err of hookExpectationResult.errors) errors.push(err);
786
+ const agentSpawnTriggerResult = parseKitAgentSpawnTriggers(manifest, manifestPath);
787
+ for (const err of agentSpawnTriggerResult.errors) errors.push(err);
788
+ for (const warning of agentSpawnTriggerResult.warnings) warnings.push(warning);
566
789
  const flowStepActionResult = parseKitFlowStepActions(manifest, manifestPath);
567
790
  for (const err of flowStepActionResult.errors) errors.push(err);
568
791
  const skillRoleResult = parseKitSkillRoles(manifest, manifestPath);
@@ -570,7 +793,7 @@ function validateAgentMetadata(kitDir: string, manifestPath: string, manifest: R
570
793
  if ((manifest.skill_roles !== undefined || manifest.flow_step_actions !== undefined) && skillRoleResult.errors.length === 0) {
571
794
  errors.push(...validateActionRepositoryMetadata({ kitDir, manifestPath, manifest, actions: flowStepActionResult.entries, skillRoles: skillRoleResult.entries }));
572
795
  }
573
- return errors;
796
+ return { errors, warnings };
574
797
  }
575
798
 
576
799
  export async function assertKitRepository(kitDir: string): Promise<Record<string, unknown>> {
@@ -59,7 +59,7 @@ export type LoadedKit = {
59
59
  hook_influence_expectations: KitHookInfluenceExpectationRef[];
60
60
  };
61
61
 
62
- const ASSET_CLASSES = ["flows", "skills", "docs", "adapters", "evals", "assets"];
62
+ const ASSET_CLASSES = ["flows", "skills", "docs", "adapters", "evals", "assets", "provisions"];
63
63
  const KIT_ID_RE = /^[a-z][a-z0-9-]*$/;
64
64
 
65
65
  function assetPath(root: string, value: string): string | null {