@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
@@ -5,19 +5,24 @@ import { parseKitFlowStepActions, workflowTriggerIdentifier } from "./action-met
5
5
  import { validateActionRepositoryMetadata } from "./action-repository-validation.js";
6
6
  export { isObservableBuilderArtifactRef, isSafeBuilderArtifactRef, parseKitFlowStepActions } from "./action-metadata.js";
7
7
  // Extension-only asset classes: validated by Flow Agents. Flows are validated by @kontourai/flow.
8
- const EXTENSION_ASSET_CLASSES = ["skills", "docs", "adapters", "evals", "assets"];
8
+ const EXTENSION_ASSET_CLASSES = ["skills", "docs", "adapters", "evals", "assets", "provisions"];
9
9
  // Core container fields owned by kontourai/flow (flow-kit-container.schema.json).
10
10
  // agent-extension fields are skills, docs, adapters, evals, assets.
11
11
  const CORE_CONTAINER_FIELDS = new Set(["schema_version", "id", "name", "description", "product_name", "flows"]);
12
- const AGENT_EXTENSION_CLASSES = new Set(["skills", "docs", "adapters", "evals", "assets"]);
12
+ const AGENT_EXTENSION_CLASSES = new Set(["skills", "docs", "adapters", "evals", "assets", "provisions"]);
13
13
  // Flow Agents-recognized metadata fields that are neither core container fields nor
14
14
  // agent-extension asset classes. Recognized here so they are never misreported as
15
15
  // unknown third-party extension namespaces. `dependencies` declares cross-kit skill
16
16
  // dependencies (extension-layer ownership; see docs/adr/0019-kit-dependency-ownership.md),
17
17
  // workflow_triggers / hook_influence_expectations declare kit-owned runtime influence,
18
- // and first_party is legacy catalog/marketplace metadata. It does not grant runtime
19
- // capability or steering privilege.
20
- const KNOWN_METADATA_FIELDS = new Set(["dependencies", "workflow_triggers", "hook_influence_expectations", "flow_step_actions", "skill_roles", "first_party"]);
18
+ // agent_spawn_triggers declares perimeter trigger surfaces that spawn agent runs plus
19
+ // their guard config (context/contracts/trigger-guards.md), and first_party is legacy
20
+ // catalog/marketplace metadata. It does not grant runtime capability or steering privilege.
21
+ const KNOWN_METADATA_FIELDS = new Set(["dependencies", "workflow_triggers", "hook_influence_expectations", "flow_step_actions", "skill_roles", "first_party", "agent_spawn_triggers"]);
22
+ // Consumer-repo-relative directory (posix, lowercase) where the engine writes its own
23
+ // per-kit provision manifest. Reserved: a provision may not target inside it. Shared with
24
+ // provision.ts so the reservation and the actual manifest write stay in agreement.
25
+ export const PROVISION_MANIFEST_DIR = ".kontourai/flow-agents/provisions";
21
26
  /**
22
27
  * Parse and shape-validate a kit manifest's `dependencies` field (Flow Agents
23
28
  * extension-layer metadata; see docs/adr/0019-kit-dependency-ownership.md).
@@ -221,6 +226,120 @@ export function parseKitHookInfluenceExpectations(manifest, manifestPath) {
221
226
  });
222
227
  return { entries, errors };
223
228
  }
229
+ const AGENT_SPAWN_TRIGGER_GUARD_FIELDS = ["dedup_key", "cooldown_seconds", "daily_cap", "max_concurrent"];
230
+ /**
231
+ * Parse and shape-validate a kit manifest's optional `agent_spawn_triggers` field:
232
+ * perimeter trigger surfaces (check failures, schedules, watchers) that spawn agent
233
+ * runs, plus their guard config. Contract: context/contracts/trigger-guards.md.
234
+ *
235
+ * Shape rules (ERRORS):
236
+ * - `agent_spawn_triggers` (if present) must be an array of objects.
237
+ * - `id` must match the workflow-trigger identifier pattern and be unique.
238
+ * - `description` must be a non-empty string.
239
+ * - `spawns_agent_runs` must be a boolean.
240
+ * - `guards` (if present) must be an object with exactly the four guard fields when
241
+ * complete: `dedup_key` non-empty string; `cooldown_seconds`, `daily_cap`,
242
+ * `max_concurrent` integers >= 1. Unknown guard fields are errors.
243
+ *
244
+ * Guard-completeness (WARNINGS, never errors — declaration-first rollout, #664):
245
+ * - an entry with `spawns_agent_runs: true` and missing or incomplete `guards`
246
+ * produces a warning naming the missing guard fields and the contract doc.
247
+ */
248
+ export function parseKitAgentSpawnTriggers(manifest, manifestPath) {
249
+ const entries = [];
250
+ const errors = [];
251
+ const warnings = [];
252
+ const raw = manifest.agent_spawn_triggers;
253
+ if (raw === undefined)
254
+ return { entries, errors, warnings };
255
+ if (!Array.isArray(raw)) {
256
+ errors.push(`${manifestPath}: .agent_spawn_triggers must be a list`);
257
+ return { entries, errors, warnings };
258
+ }
259
+ const fields = new Set(["id", "description", "spawns_agent_runs", "guards"]);
260
+ const seen = new Set();
261
+ raw.forEach((entry, index) => {
262
+ if (typeof entry !== "object" || entry === null) {
263
+ errors.push(`${manifestPath}: agent_spawn_triggers[${index}] must be an object`);
264
+ return;
265
+ }
266
+ const record = entry;
267
+ const unknown = Object.keys(record).filter((field) => !fields.has(field));
268
+ if (unknown.length > 0) {
269
+ errors.push(`${manifestPath}: agent_spawn_triggers[${index}] contains unsupported field(s): ${unknown.join(", ")}`);
270
+ return;
271
+ }
272
+ const id = record.id;
273
+ if (!workflowTriggerIdentifier(id)) {
274
+ errors.push(`${manifestPath}: agent_spawn_triggers[${index}].id must match ^[a-z0-9]+(?:[.-][a-z0-9]+)*$`);
275
+ return;
276
+ }
277
+ if (seen.has(id)) {
278
+ errors.push(`${manifestPath}: agent_spawn_triggers[${index}].id duplicates '${id}'`);
279
+ return;
280
+ }
281
+ seen.add(id);
282
+ if (typeof record.description !== "string" || !record.description.trim()) {
283
+ errors.push(`${manifestPath}: agent_spawn_triggers[${index}].description must be a non-empty string`);
284
+ return;
285
+ }
286
+ if (typeof record.spawns_agent_runs !== "boolean") {
287
+ errors.push(`${manifestPath}: agent_spawn_triggers[${index}].spawns_agent_runs must be a boolean`);
288
+ return;
289
+ }
290
+ let guards;
291
+ let guardsShapeValid = true;
292
+ const missingGuardFields = [];
293
+ if (record.guards !== undefined) {
294
+ if (typeof record.guards !== "object" || record.guards === null || Array.isArray(record.guards)) {
295
+ errors.push(`${manifestPath}: agent_spawn_triggers[${index}].guards must be an object when present`);
296
+ return;
297
+ }
298
+ const guardRecord = record.guards;
299
+ const guardFieldSet = new Set(AGENT_SPAWN_TRIGGER_GUARD_FIELDS);
300
+ const unknownGuards = Object.keys(guardRecord).filter((field) => !guardFieldSet.has(field));
301
+ if (unknownGuards.length > 0) {
302
+ errors.push(`${manifestPath}: agent_spawn_triggers[${index}].guards contains unsupported field(s): ${unknownGuards.join(", ")}`);
303
+ return;
304
+ }
305
+ if (guardRecord.dedup_key !== undefined && (typeof guardRecord.dedup_key !== "string" || !guardRecord.dedup_key.trim())) {
306
+ errors.push(`${manifestPath}: agent_spawn_triggers[${index}].guards.dedup_key must be a non-empty string`);
307
+ guardsShapeValid = false;
308
+ }
309
+ for (const field of ["cooldown_seconds", "daily_cap", "max_concurrent"]) {
310
+ const value = guardRecord[field];
311
+ if (value !== undefined && (typeof value !== "number" || !Number.isInteger(value) || value < 1)) {
312
+ errors.push(`${manifestPath}: agent_spawn_triggers[${index}].guards.${field} must be an integer >= 1`);
313
+ guardsShapeValid = false;
314
+ }
315
+ }
316
+ if (!guardsShapeValid)
317
+ return;
318
+ for (const field of AGENT_SPAWN_TRIGGER_GUARD_FIELDS) {
319
+ if (guardRecord[field] === undefined)
320
+ missingGuardFields.push(field);
321
+ }
322
+ if (missingGuardFields.length === 0) {
323
+ guards = {
324
+ dedup_key: guardRecord.dedup_key,
325
+ cooldown_seconds: guardRecord.cooldown_seconds,
326
+ daily_cap: guardRecord.daily_cap,
327
+ max_concurrent: guardRecord.max_concurrent,
328
+ };
329
+ }
330
+ }
331
+ else {
332
+ missingGuardFields.push(...AGENT_SPAWN_TRIGGER_GUARD_FIELDS);
333
+ }
334
+ if (record.spawns_agent_runs === true && missingGuardFields.length > 0) {
335
+ warnings.push(`${manifestPath}: agent_spawn_triggers[${index}] ('${id}') spawns agent runs without complete guard config` +
336
+ ` (missing: ${missingGuardFields.join(", ")}); declare dedup_key, cooldown_seconds, daily_cap, and max_concurrent` +
337
+ ` per context/contracts/trigger-guards.md`);
338
+ }
339
+ entries.push({ id, description: record.description, spawns_agent_runs: record.spawns_agent_runs, ...(guards ? { guards } : {}) });
340
+ });
341
+ return { entries, errors, warnings };
342
+ }
224
343
  export function parseKitSkillRoles(manifest, manifestPath) {
225
344
  const entries = [];
226
345
  const errors = [];
@@ -393,7 +512,17 @@ export async function deriveKitTargets(manifest, kitDir = "", sourceRoot = proce
393
512
  };
394
513
  }
395
514
  export async function validateKitRepository(kitDir) {
515
+ return (await validateKitRepositoryDiagnostics(kitDir)).errors;
516
+ }
517
+ /**
518
+ * Repository validation with a non-blocking warnings channel alongside the blocking
519
+ * errors `validateKitRepository` has always returned. Warnings are advisory quality
520
+ * findings (today: an agent-spawning trigger surface declared without complete guard
521
+ * config — context/contracts/trigger-guards.md); they never fail validation.
522
+ */
523
+ export async function validateKitRepositoryDiagnostics(kitDir) {
396
524
  const errors = [];
525
+ const warnings = [];
397
526
  const manifestPath = path.join(kitDir, "kit.json");
398
527
  let manifest;
399
528
  try {
@@ -401,14 +530,16 @@ export async function validateKitRepository(kitDir) {
401
530
  }
402
531
  catch (error) {
403
532
  errors.push(`${manifestPath}: invalid JSON: ${error.message}`);
404
- return errors;
533
+ return { errors, warnings };
405
534
  }
406
535
  errors.push(...await delegateCoreContainerValidation(kitDir, manifest));
407
536
  errors.push(...validateExtensionAssets(kitDir, manifestPath, manifest));
408
- errors.push(...validateAgentMetadata(kitDir, manifestPath, manifest));
537
+ const metadata = validateAgentMetadata(kitDir, manifestPath, manifest);
538
+ errors.push(...metadata.errors);
539
+ warnings.push(...metadata.warnings);
409
540
  if (manifest.first_party !== undefined && typeof manifest.first_party !== "boolean")
410
541
  errors.push(`${manifestPath}: .first_party must be a boolean when present`);
411
- return errors;
542
+ return { errors, warnings };
412
543
  }
413
544
  function validateExtensionAssets(kitDir, manifestPath, manifest) {
414
545
  const errors = [];
@@ -429,11 +560,15 @@ function validateExtensionAssets(kitDir, manifestPath, manifest) {
429
560
  const record = entry;
430
561
  const id = record.id;
431
562
  const rel = record.path;
563
+ const kitId = typeof manifest.id === "string" ? manifest.id : "";
432
564
  if (typeof id === "string") {
433
565
  if (seen.has(id))
434
566
  errors.push(`${manifestPath}: ${section}[${index}].id duplicates`);
435
567
  seen.add(id);
436
568
  }
569
+ if (section === "provisions" && (typeof id !== "string" || !kitId || !id.startsWith(`${kitId}.`))) {
570
+ errors.push(`${manifestPath}: provisions[${index}].id must be prefixed with '${kitId}.'`);
571
+ }
437
572
  if (typeof rel !== "string" || !rel) {
438
573
  errors.push(`${manifestPath}: ${section}[${index}].path must be a string`);
439
574
  return;
@@ -442,6 +577,10 @@ function validateExtensionAssets(kitDir, manifestPath, manifest) {
442
577
  errors.push(`${manifestPath}: ${section}[${index}].path must be relative`);
443
578
  return;
444
579
  }
580
+ if (rel.replace(/\\/g, "/").split("/").includes("..")) {
581
+ errors.push(`${manifestPath}: ${section}[${index}].path must not contain traversal segments`);
582
+ return;
583
+ }
445
584
  const resolved = path.resolve(kitDir, rel);
446
585
  const root = path.resolve(kitDir);
447
586
  if (resolved !== root && !resolved.startsWith(`${root}${path.sep}`)) {
@@ -451,12 +590,73 @@ function validateExtensionAssets(kitDir, manifestPath, manifest) {
451
590
  if (!fs.existsSync(resolved)) {
452
591
  errors.push(`${manifestPath}: ${section}[${index}].path points at missing asset: ${rel}`);
453
592
  }
593
+ else if (section === "provisions") {
594
+ if (!fs.statSync(resolved).isFile()) {
595
+ errors.push(`${manifestPath}: provisions[${index}].path must point at a file: ${rel}`);
596
+ }
597
+ else {
598
+ // A provisioned source is copied byte-for-byte into a consumer repo, so a symlink that
599
+ // resolves outside the kit would exfiltrate arbitrary readable host files. Require the
600
+ // link-resolved real path to stay inside the kit.
601
+ const realResolved = fs.realpathSync(resolved);
602
+ const realRoot = fs.realpathSync(root);
603
+ if (realResolved !== realRoot && !realResolved.startsWith(`${realRoot}${path.sep}`)) {
604
+ errors.push(`${manifestPath}: provisions[${index}].path must not resolve outside the kit directory`);
605
+ }
606
+ }
607
+ }
608
+ });
609
+ }
610
+ const rawProvisions = manifest.provisions;
611
+ if (Array.isArray(rawProvisions)) {
612
+ const targets = new Set();
613
+ rawProvisions.forEach((entry, index) => {
614
+ if (typeof entry !== "object" || entry === null)
615
+ return;
616
+ const record = entry;
617
+ if (record.description !== undefined && typeof record.description !== "string") {
618
+ errors.push(`${manifestPath}: provisions[${index}].description must be a string when present`);
619
+ }
620
+ const target = record.target;
621
+ if (typeof target !== "string" || target.trim().length === 0) {
622
+ errors.push(`${manifestPath}: provisions[${index}].target must be a non-empty string`);
623
+ return;
624
+ }
625
+ if (path.isAbsolute(target) || path.win32.isAbsolute(target)) {
626
+ errors.push(`${manifestPath}: provisions[${index}].target must be relative`);
627
+ return;
628
+ }
629
+ const segments = target.replace(/\\/g, "/").split("/");
630
+ if (segments.includes("..")) {
631
+ errors.push(`${manifestPath}: provisions[${index}].target must not contain traversal segments`);
632
+ return;
633
+ }
634
+ const normalized = path.posix.normalize(segments.join("/"));
635
+ if (normalized === "." || normalized.startsWith("..")) {
636
+ errors.push(`${manifestPath}: provisions[${index}].target must stay inside the consumer repository`);
637
+ return;
638
+ }
639
+ // Case-fold reserved-directory and collision checks: on a case-insensitive filesystem
640
+ // `.GIT/` still lands in the real `.git`, and README.md/readme.md still collide.
641
+ const lowered = normalized.toLowerCase();
642
+ if (lowered === ".git" || lowered.startsWith(".git/")) {
643
+ errors.push(`${manifestPath}: provisions[${index}].target must not be inside .git`);
644
+ return;
645
+ }
646
+ if (lowered === PROVISION_MANIFEST_DIR || lowered.startsWith(`${PROVISION_MANIFEST_DIR}/`)) {
647
+ errors.push(`${manifestPath}: provisions[${index}].target must not be inside the provision manifest namespace (${PROVISION_MANIFEST_DIR}/)`);
648
+ return;
649
+ }
650
+ if (targets.has(lowered))
651
+ errors.push(`${manifestPath}: provisions[${index}].target duplicates '${normalized}'`);
652
+ targets.add(lowered);
454
653
  });
455
654
  }
456
655
  return errors;
457
656
  }
458
657
  function validateAgentMetadata(kitDir, manifestPath, manifest) {
459
658
  const errors = [];
659
+ const warnings = [];
460
660
  const depResult = parseKitDependencies(manifest, manifestPath);
461
661
  for (const err of depResult.errors)
462
662
  errors.push(err);
@@ -466,6 +666,11 @@ function validateAgentMetadata(kitDir, manifestPath, manifest) {
466
666
  const hookExpectationResult = parseKitHookInfluenceExpectations(manifest, manifestPath);
467
667
  for (const err of hookExpectationResult.errors)
468
668
  errors.push(err);
669
+ const agentSpawnTriggerResult = parseKitAgentSpawnTriggers(manifest, manifestPath);
670
+ for (const err of agentSpawnTriggerResult.errors)
671
+ errors.push(err);
672
+ for (const warning of agentSpawnTriggerResult.warnings)
673
+ warnings.push(warning);
469
674
  const flowStepActionResult = parseKitFlowStepActions(manifest, manifestPath);
470
675
  for (const err of flowStepActionResult.errors)
471
676
  errors.push(err);
@@ -475,7 +680,7 @@ function validateAgentMetadata(kitDir, manifestPath, manifest) {
475
680
  if ((manifest.skill_roles !== undefined || manifest.flow_step_actions !== undefined) && skillRoleResult.errors.length === 0) {
476
681
  errors.push(...validateActionRepositoryMetadata({ kitDir, manifestPath, manifest, actions: flowStepActionResult.entries, skillRoles: skillRoleResult.entries }));
477
682
  }
478
- return errors;
683
+ return { errors, warnings };
479
684
  }
480
685
  export async function assertKitRepository(kitDir) {
481
686
  const errors = await validateKitRepository(kitDir);
@@ -3,7 +3,7 @@ import * as path from "node:path";
3
3
  import { atomicCopyFile, atomicWriteJson, ensureSafeDirectory, readJson, relPath } from "./lib/fs.js";
4
4
  import { flowAgentsArtifactRoot } from "./lib/local-artifact-root.js";
5
5
  import { parseKitDependencies, parseKitHookInfluenceExpectations, parseKitWorkflowTriggers } from "./flow-kit/validate.js";
6
- const ASSET_CLASSES = ["flows", "skills", "docs", "adapters", "evals", "assets"];
6
+ const ASSET_CLASSES = ["flows", "skills", "docs", "adapters", "evals", "assets", "provisions"];
7
7
  const KIT_ID_RE = /^[a-z][a-z0-9-]*$/;
8
8
  function assetPath(root, value) {
9
9
  if (path.isAbsolute(value))
@@ -42,7 +42,36 @@ Execution may upgrade to a stronger mode when risk increases. Downgrades require
42
42
  - Independent tasks with no shared files can run in the same wave.
43
43
  - Shared files, generated artifacts, migrations, and cross-cutting contracts should be serialized unless the plan gives explicit file ownership.
44
44
  - Worker delegation must name the exact worker role (`tool-worker`) rather than spawning an unnamed/default implementation agent.
45
- - After each wave, collect results, check conflicts, and update the session artifact before starting the next wave.
45
+ - After each wave, reconcile results against the wave manifest (below), check conflicts, and update the session artifact before starting the next wave.
46
+
47
+ ## Wave Manifest And Reconciliation
48
+
49
+ Fan-out collection is machine-checkable, not prose. A reduce step that silently
50
+ drops a worker's stream is worse than one that errors.
51
+
52
+ - **Declare before dispatch.** Before dispatching a wave that delegates work,
53
+ declare it in the session's `waves.json` sidecar (schema:
54
+ `schemas/workflow-waves.schema.json`): `wave_id`, owning step, and one
55
+ `expected_workers` entry per worker. The expected count (M) must exist before
56
+ any result arrives.
57
+ - **One terminal record per worker.** Each worker lands exactly one terminal
58
+ status record: `completed`, `failed`, or `blocked`. Duplicate records and
59
+ undeclared reporters are validation errors.
60
+ - **Reconcile at wave close.** The orchestrator's collect step is
61
+ reconcile-against-manifest: record every declared worker that has no terminal
62
+ record as `not_reported` — never silently absorb a missing worker — then
63
+ record the wave's `reconciliation` with `expected_count` M, `reported_count`
64
+ N, and an explicit "N of M reported" summary naming the `not_reported`
65
+ workers (for example "2 of 3 reported; worker-3 not_reported").
66
+ - **Incomplete is visible, never silent.** A wave is `complete` only when N
67
+ equals M. An incomplete wave stays visible data and routes to re-dispatch, a
68
+ blocker report, or an explicit accepted gap; it must never be treated as
69
+ complete because the missing worker was forgotten.
70
+ - **Enforcement boundary (slice 1).** `validate-workflow-artifacts` enforces
71
+ the shape and the cross-record arithmetic (counts, exactly-one-record,
72
+ undeclared reporters, impossible `complete` claims) as data-level validation.
73
+ Stop-hook refusal of wave completion is #663 part 3 (slice 2), deferred until
74
+ the hook correctness issues (#453/#450/#494) are resolved.
46
75
 
47
76
  ## Delegation: Model Routing
48
77
 
@@ -100,6 +100,10 @@ npm run workflow:sidecar -- import-critique .kontourai/flow-agents/<slug> \
100
100
  --reviewer tool-code-reviewer
101
101
  ```
102
102
 
103
+ A security-review finding is recorded as a structured verdict + reference — `{severity, file_refs: ["path:line"], description: "<one-line weakness>"}` — not as reproduced exploit payloads or copied vulnerable-code blocks. A precise reference is sufficient evidence; the fuller remediation detail belongs in the fix pass, not the recorded finding. This keeps security findings recordable even when the reviewer runtime's provider content-filters exploit-shaped prose.
104
+
105
+ Recording a review requires a reviewer identity distinct from the active implementation-assignment actor (anti-self-review). The identity is derived from the runtime actor, so an orchestrator that implemented cannot also review under the same actor: run the reviewer under a distinct actor — set `FLOW_AGENTS_ACTOR=<reviewer-id>` on the reviewing process, or run it in a separate runtime session.
106
+
103
107
  ## Gate Rules
104
108
 
105
109
  - Critical or high findings block delivery until fixed, accepted by the user, deferred with explicit rationale, or marked false positive.
@@ -0,0 +1,73 @@
1
+ # Trigger-Spawned Agent Run Guards Contract
2
+
3
+ > Read [`context/contracts/standing-directives.md`](standing-directives.md) — ratified owner directives that override default engineering conservatism.
4
+
5
+ Any kit, hook, or integration that spawns an agent run from a trigger MUST declare, before it ships, how that spawn surface is guarded against runaway amplification. A trigger with no dedup, cooldown, cap, or concurrency guard converts one flapping upstream signal into an unbounded stream of agent runs — each of which may hold permissions, spend budget, and mutate state without a human turn in the loop. A 2026-07 field near-miss made this concrete: an on-failure escalation wired without these guards would have spawned a continuous stream of permission-skipping agent runs from a single flapping check. This contract makes the guard requirements standing suite policy so the next trigger-driven feature inherits them by default instead of rediscovering them in an incident.
6
+
7
+ ## Scope
8
+
9
+ A **trigger-spawned agent run** is any agent execution started by an event rather than by a human request in an interactive session: a check or CI failure escalation, a schedule firing, a watcher or automation trigger, or any other perimeter event that launches headless agent work.
10
+
11
+ Out of scope:
12
+
13
+ - `workflow_triggers` in kit.json — in-session workflow steering for an already-running interactive session. Steering routes an existing session; it does not spawn a run.
14
+ - Subagent delegation inside an active, human-initiated session — the session itself is the supervision boundary.
15
+
16
+ No flow-agents hook spawns agent runs today (all four hook policy classes are advisory/steering), but the suite's perimeter already does, and in-repo consumers are planned (see "Future consumers" below). The contract applies the moment a surface CAN spawn a run, not the moment it misbehaves.
17
+
18
+ ## Required Guard Declarations
19
+
20
+ Every trigger surface that spawns agent runs declares all four guards, with explicit values. The defaults below are the starting point when the feature has no measured reason to differ; declaring a weaker value than the default requires a recorded rationale on the owning work item.
21
+
22
+ | Guard | Field | Meaning | Default |
23
+ | --- | --- | --- | --- |
24
+ | Dedup | `dedup_key` | The trigger-signature expression used to suppress duplicate spawns while an equivalent run is pending or was recently spawned. For failure escalations: subject plus normalized failure signature (e.g. `check-name+failure-signature`), so a repeat of the same failure does not spawn a second run. | subject + trigger signature |
25
+ | Cooldown | `cooldown_seconds` | Minimum seconds between spawns for the same subject, regardless of signature churn. | `900` |
26
+ | Daily cap | `daily_cap` | Maximum spawns per trigger surface per day; the surface goes quiet (with a visible, non-silent skip) once reached. | `20` |
27
+ | Concurrency lock | `max_concurrent` | Maximum runs from this surface allowed to exist simultaneously, expressed as a limit; `1` is a mutual-exclusion lock. | `1` |
28
+
29
+ A skipped spawn (dedup hit, cooldown window, cap reached, lock held) must be observable — logged or counted, never silently dropped — so a guard absorbing real signal is diagnosable.
30
+
31
+ ## Kit Declaration: `agent_spawn_triggers`
32
+
33
+ Kits declare agent-spawning trigger surfaces in kit.json through the optional `agent_spawn_triggers` extension field (Flow Agents extension-layer metadata, like `dependencies` and `workflow_triggers`):
34
+
35
+ ```jsonc
36
+ "agent_spawn_triggers": [
37
+ {
38
+ "id": "on-check-failure",
39
+ "description": "Escalates failing checks to a headless agent run.",
40
+ "spawns_agent_runs": true,
41
+ "guards": {
42
+ "dedup_key": "check-name+failure-signature",
43
+ "cooldown_seconds": 900,
44
+ "daily_cap": 20,
45
+ "max_concurrent": 1
46
+ }
47
+ }
48
+ ]
49
+ ```
50
+
51
+ - `id`: unique identifier (`^[a-z0-9]+(?:[.-][a-z0-9]+)*$`).
52
+ - `description`: non-empty human-readable purpose of the surface.
53
+ - `spawns_agent_runs`: required boolean. `false` documents a trigger surface that fires without spawning agent runs (e.g. notification-only); such entries need no guards.
54
+ - `guards`: required-complete when `spawns_agent_runs` is `true` — all four fields, `dedup_key` a non-empty string, the three numeric guards integers >= 1.
55
+
56
+ Hooks and integrations that live outside a kit manifest declare the same four guards, with the same vocabulary, in their own configuration or design artifact.
57
+
58
+ ## Enforcement
59
+
60
+ Kit repository validation emits a **WARNING** (not an error) when an `agent_spawn_triggers` entry has `spawns_agent_runs: true` and missing or incomplete `guards`. Malformed declarations (wrong types, duplicate ids, non-positive limits) are shape ERRORS like every other extension field.
61
+
62
+ Warning-level enforcement is deliberate, declaration-first rollout: the declaration is new and optional, and no in-repo surface spawns runs yet. When the first in-repo trigger-spawned runner ships, its surface must declare complete guards, and enforcement for spawning surfaces hardens with it (validation error and/or runtime refusal). Runtime guard enforcement is explicitly NOT part of this contract's first iteration — no spawning or guard machinery exists in this repo yet, and per standing directive 4 (standalone-first), the enforcement runtime belongs with the first real spawner.
63
+
64
+ ## Conforming Examples
65
+
66
+ - **kontourai/plumb#1** — check-failure escalation to a headless agent with per-subject cooldown, failure-signature dedup, and a max-concurrent cap: the direct antecedent of this contract's `cooldown_seconds`, `dedup_key`, and `max_concurrent` guards.
67
+ - **ephemeris** — trigger firing that is coalesced per claim, idempotent, and rate-limited: dedup and cap expressed as coalescing plus rate limits, showing the guards generalize beyond failure escalation.
68
+
69
+ Both are cited as reference implementations of the guard vocabulary; consult their current sources when implementing a new surface.
70
+
71
+ ## Future Consumers
72
+
73
+ The autonomy epic's background-review fork — kontourai/flow-agents#252, under epic #250 — will spawn agent runs from a trigger. Any implementation of #252 MUST declare its guard configuration under this contract (an `agent_spawn_triggers` entry with complete `guards`, or the equivalent declaration in its owning design artifact) before it ships.
@@ -41,7 +41,7 @@
41
41
  "issue_state": "open",
42
42
  "include_labels": [],
43
43
  "ready_statuses": ["ready"],
44
- "exclude_statuses": ["in_progress", "blocked", "review", "verification", "done"]
44
+ "exclude_statuses": ["triage", "in_progress", "blocked", "review", "verification", "done"]
45
45
  },
46
46
  "wip_policy": {
47
47
  "prefer_finishing_active_work": true,
@@ -36,7 +36,7 @@
36
36
  "issue_state": "open",
37
37
  "include_labels": [],
38
38
  "ready_statuses": ["ready"],
39
- "exclude_statuses": ["in_progress", "blocked", "review", "verification", "done"]
39
+ "exclude_statuses": ["triage", "in_progress", "blocked", "review", "verification", "done"]
40
40
  },
41
41
  "wip_policy": {
42
42
  "prefer_finishing_active_work": true,
@@ -0,0 +1,47 @@
1
+ ---
2
+ title: "ADR 0023: Declarative Kit Provisioning"
3
+ ---
4
+
5
+ # ADR 0023: Declarative Kit Provisioning
6
+
7
+ **Date:** 2026-07-16
8
+ **Status:** Accepted (owner-ratified Option A in flow-agents#647)
9
+
10
+ ---
11
+
12
+ ## Context
13
+
14
+ Kits sometimes need to supply repository-owned configuration or policy files in addition to runtime projections. The motivating `veritas-governance` follow-up needs this capability, but embedding kit-specific copy logic in Flow Agents would violate the kit boundary. Runtime activation is also the wrong mechanism: its projection directory is regenerable adapter state, while these files must become normal files in the consumer repository.
15
+
16
+ ## Decision
17
+
18
+ A kit may declare a `provisions` list in `kit.json`. Each entry is inert data naming an id, a source file inside the kit, and a consumer-repository-relative target. Provision declarations are never executed.
19
+
20
+ The Flow Agents engine performs agent-blind file copying through an explicit `kit provision` operation. It validates source and target containment, preflights every destination, and creates files only when no declared destination already exists. An explicit `--force` option may replace declared destination files; the default never silently overwrites an anchor-owned or consumer-owned file. `--dry-run` reports the plan without writing.
21
+
22
+ `flow-agents init --activate-kit` invokes the same engine after activation with create-only semantics. Existing destinations are reported as skipped warnings so init remains safe to rerun. Provisioning remains separate from runtime activation and its projection directory.
23
+
24
+ The engine records successful copies under `.kontourai/flow-agents/provisions/<kit-id>.json`. This manifest is bookkeeping and may be replaced on a later successful provisioning operation. Enforcement policy and ownership of protected paths remain anchor-side; a kit declaration does not grant permission to overwrite them.
25
+
26
+ ## Consequences
27
+
28
+ - Kits can ship repository files without executable installers or kit-specific engine behavior.
29
+ - Create-only defaults preserve consumer and anchor ownership; replacement requires an explicit user operation.
30
+ - Provisioned files belong to the consumer repository once written. Uninstalling or deactivating a kit never removes or reverts them.
31
+ - Runtime adapters continue to activate only their supported projection assets and report provisions as explicitly skipped.
32
+ - Consumers that need stronger protected-path policy enforce it at their anchor; the generic engine remains deliberately dumb and kit-neutral.
33
+
34
+ ## Accepted residuals
35
+
36
+ - **Copy is best-effort against concurrent interposition (both ends).** The checks and the copy
37
+ are separate steps (check-then-act): a file created into a declared destination between the
38
+ conflict preflight and the write can still be overwritten, and a source re-pointed to a link
39
+ between its containment check and its read could resolve elsewhere. Provisioning targets a
40
+ developer/CI working tree, not a hostile multi-writer path, so both TOCTOU windows are accepted
41
+ rather than closed with exclusive-create / open-then-fstat plumbing. The static guarantees are
42
+ enforced up front: reserved-directory (`.git`, the provision manifest namespace), source and
43
+ destination containment (link-resolved), and case-fold collision rejection; concurrent
44
+ interposition on either end is out of scope.
45
+ - **Target case-folding assumes the common single-case-family repo.** Collision and reserved-path
46
+ checks case-fold targets so case-insensitive filesystems are safe; a genuinely case-sensitive
47
+ repo that intends two targets differing only in case is rejected as a portability hazard.
@@ -32,3 +32,4 @@ Numbered ADRs below are FROZEN immutable history (see the banner on each file).
32
32
  | 0020 | Trust-Reconcile Manifest, Claim Classification, and Waivers | unknown | [0020-trust-reconcile-manifest-and-claim-classification.md](./0020-trust-reconcile-manifest-and-claim-classification.md) |
33
33
  | 0021 | Assignment Leases and Stale-Claim Takeover | 2026-07-02 | [0021-assignment-leases-and-stale-claim-takeover.md](./0021-assignment-leases-and-stale-claim-takeover.md) |
34
34
  | 0022 | Fail-Closed Delivery Reconciliation with Governed Exemptions | 2026-07-02 | [0022-fail-closed-delivery-reconciliation-with-governed-exemptions.md](./0022-fail-closed-delivery-reconciliation-with-governed-exemptions.md) |
35
+ | 0023 | Declarative Kit Provisioning | 2026-07-16 | [0023-kit-provisioning.md](./0023-kit-provisioning.md) |
@@ -102,9 +102,26 @@ Kit trust is orthogonal to engine privilege. A marketplace may call a kit offici
102
102
 
103
103
  The answer is determined by validation, activation, and gate evidence, not by a privileged kit list.
104
104
 
105
+ ## The Portfolio Layer Doctrine
106
+
107
+ The engine/kits split here is Flow Agents' instance of the portfolio-wide **Layer Doctrine**
108
+ ([surface/docs/architecture/portfolio-layer-doctrine.md](https://github.com/kontourai/surface/blob/main/docs/architecture/portfolio-layer-doctrine.md)):
109
+ dependency direction is one-way up the stack (open trust format → building-block tools → Surface →
110
+ products), and no layer reaches sideways into a peer. A product engine (e.g. `@kontourai/veritas`)
111
+ never depends on the platform, and a **kit consumes an engine only through its CLI + recorded
112
+ artifacts, never as an npm library import** — the whole point of the manifest/catalog model above.
113
+ Both edges are now enforced executably: veritas-side by `check-no-flow-agents-dep.mjs` (the engine
114
+ declares no flow-agents dependency) and here by [`scripts/check-layer-boundary.mjs`](../scripts/check-layer-boundary.mjs)
115
+ (no kit imports the veritas engine as a library). See veritas's
116
+ [Engine / Surface Seam](https://github.com/kontourai/veritas/blob/main/docs/architecture/engine-surface-seam.md)
117
+ for the canonical engine-vs-kit capability inventory that the Veritas Governance Kit row above
118
+ builds on.
119
+
105
120
  ## Related docs
106
121
 
107
122
  - [Flow Kit Authoring Guide](kit-authoring-guide.md)
108
123
  - [Flow Kit Repository Contract](flow-kit-repository-contract.md)
109
124
  - [Runtime Hook Surface spec](spec/runtime-hook-surface.md)
110
125
  - [Verifiable Trust](verifiable-trust.md)
126
+ - [Veritas Engine / Surface Seam](https://github.com/kontourai/veritas/blob/main/docs/architecture/engine-surface-seam.md) — how `@kontourai/veritas` splits into an engine library + the kit-owned product surface
127
+ - [Portfolio Layer Doctrine](https://github.com/kontourai/surface/blob/main/docs/architecture/portfolio-layer-doctrine.md)
@@ -71,6 +71,7 @@ Machine-readable workflow state lives beside Markdown artifacts in `.kontourai/f
71
71
  | workflow-learning.schema.json | Flow Agents Workflow Learning | https://flow-agents.dev/schemas/workflow-learning.schema.json |
72
72
  | workflow-release.schema.json | Flow Agents Workflow Release Readiness | https://flow-agents.dev/schemas/workflow-release.schema.json |
73
73
  | workflow-state.schema.json | Flow Agents Workflow State | https://flow-agents.dev/schemas/workflow-state.schema.json |
74
+ | workflow-waves.schema.json | Flow Agents Workflow Waves | https://flow-agents.dev/schemas/workflow-waves.schema.json |
74
75
 
75
76
  Primary tools: public `flow-agents workflow`, `trust.bundle`, artifact validation, `scripts/hooks/stop-goal-fit.js`, and `scripts/hooks/workflow-steering.js`. The package-internal writer is not an agent or consumer interface.
76
77
 
@@ -100,6 +101,7 @@ Primary tools: public `flow-agents workflow`, `trust.bundle`, artifact validatio
100
101
  | agentic-engineering | skills/agentic-engineering/SKILL.md | Eval-first execution, task decomposition, and cost-aware model routing for AI-driven development workflows. |
101
102
  | browser-test | skills/browser-test/SKILL.md | Headless browser automation via Playwright — screenshots, accessibility checks, form filling, UI testing, DOM inspection. |
102
103
  | builder-shape | kits/builder/skills/builder-shape/SKILL.md | Builder Kit shaping entrypoint. Turns a raw idea into a provider-neutral, reviewable backlog proposal and stops before build selection unless the user explicitly continues. |
104
+ | consult-standards | kits/veritas-governance/skills/consult-standards/SKILL.md | Get just-in-time Veritas governance guidance for a file or work area before editing it: run `veritas explain --file <path>` (or `--work-area <id>`) to see the governance excerpt, the Repo Standards rules that apply, their do/don't/exampl... |
103
105
  | dependency-update | skills/dependency-update/SKILL.md | Analyze and upgrade project dependencies — latest versions, security vulnerabilities, actionable update plan across all package managers. |
104
106
  | design-probe | kits/builder/skills/design-probe/SKILL.md | Generic one-question-at-a-time design probe for turning unclear goals, designs, and handoffs into shared understanding. |
105
107
  | eval-rebuild | skills/eval-rebuild/SKILL.md | Project-specific build and install commands for the eval feedback loop. Injected into eval-builder agent. Replace this skill for different build systems. |
@@ -108,6 +110,7 @@ Primary tools: public `flow-agents workflow`, `trust.bundle`, artifact validatio
108
110
  | knowledge-capture | kits/knowledge/skills/knowledge-capture/SKILL.md | Save durable knowledge, lightweight pointers, user corrections, decisions, lessons, relationship context, or source references into the knowledge base. Use when the user says save, remember, capture, file this, bookmark context, or when... |
109
111
  | pickup-probe | kits/builder/skills/pickup-probe/SKILL.md | Provider-grounded pickup probe used at the Builder design-probe step before planning. |
110
112
  | search-first | skills/search-first/SKILL.md | Research-before-coding workflow. Search for existing tools, libraries, and patterns before writing custom code. |
113
+ | standards-authoring | kits/veritas-governance/skills/standards-authoring/SKILL.md | Author or update a repo's Veritas Repo Standards through the kit's standards-authoring flow: run `veritas init --explore`/`--guided` to derive a proposed starter set (project name, repo-shape-adaptive Repo Map nodes, evidence-check infer... |
111
114
 
112
115
  ## Agents
113
116