@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
@@ -133,6 +133,72 @@ echo "--- exemption-issuance: gate blocks without a verified approval, passes wi
133
133
  exemption_gate_case "$KIT/fixtures/exemption/approved.trust-bundle.json" "exemption-positive" 0
134
134
  exemption_gate_case "$KIT/fixtures/exemption/not-approved.trust-bundle.json" "exemption-negative" 1
135
135
 
136
+ # --- standards-authoring flow (Slice 2 PR3): registration, gate shape, gate cases ---
137
+ # Agentless propose -> apply flow whose human-approval-gate blocks the `veritas init --apply`
138
+ # write until a human-authored standards-authoring-approval claim is verified. The kit only
139
+ # gates the sign-off; Veritas does the derivation and the write (no evaluation reimplemented).
140
+ AUTHORING_FLOWDEF="$KIT/flows/standards-authoring.flow.json"
141
+ if node -e "const f=require('$AUTHORING_FLOWDEF'); if(f.id!=='veritas-governance.standards-authoring') process.exit(1);" 2>/dev/null; then
142
+ pass "standards-authoring flow file has id veritas-governance.standards-authoring"
143
+ else
144
+ fail "standards-authoring flow file missing or has unexpected id"
145
+ fi
146
+ if rg -q '"id": *"veritas-governance\.standards-authoring"' "$KIT/kit.json" && rg -q '"path": *"flows/standards-authoring\.flow\.json"' "$KIT/kit.json"; then
147
+ pass "standards-authoring flow is registered in kit.json flows[]"
148
+ else
149
+ fail "standards-authoring flow is NOT registered in kit.json flows[]"
150
+ fi
151
+ if rg -q '"id": *"veritas-governance\.standards-authoring"' "$KIT/kit.json" && rg -q '"path": *"skills/standards-authoring/SKILL.md"' "$KIT/kit.json"; then
152
+ pass "standards-authoring skill is registered in kit.json skills[]"
153
+ else
154
+ fail "standards-authoring skill is NOT registered in kit.json skills[]"
155
+ fi
156
+ # Agentless invariant: the kit declares no flow_step_actions (would opt into Builder's
157
+ # producer-ownership contract and break the agentless gate flows).
158
+ if rg -q 'flow_step_actions' "$KIT/kit.json"; then
159
+ fail "kit.json declares flow_step_actions — veritas-governance flows are agentless"
160
+ else
161
+ pass "kit stays agentless (no flow_step_actions)"
162
+ fi
163
+ if node -e "
164
+ const f=require('$AUTHORING_FLOWDEF');
165
+ const g=f.gates['human-approval-gate'];
166
+ const bc=g.expects[0].bundle_claim;
167
+ if (g.expects[0].kind!=='trust.bundle') process.exit(1);
168
+ if (bc.claimType!=='standards-authoring-approval') process.exit(1);
169
+ if (bc.subjectType!=='repo-governance-change') process.exit(1);
170
+ if (JSON.stringify(bc.accepted_statuses)!=='[\"verified\"]') process.exit(1);
171
+ " 2>/dev/null; then
172
+ pass "standards-authoring gate expects[] kind is trust.bundle and pins claimType/subjectType/accepted_statuses exactly"
173
+ else
174
+ fail "standards-authoring gate expects[] shape does not match the pinned claim selector"
175
+ fi
176
+ # Positive/negative gate cases against the committed fixtures. $1 bundle, $2 label, $3 expect.
177
+ authoring_gate_case() {
178
+ local bundle="$1" label="$2" expect="$3"
179
+ local work="$TMP_DIR/$label"; mkdir -p "$work"; ( cd "$work" && node "$FLOW_CLI" init >/dev/null 2>&1 )
180
+ ( cd "$work" && node "$FLOW_CLI" start "$AUTHORING_FLOWDEF" --run-id "$label" >/dev/null 2>&1 )
181
+ ( cd "$work" && node "$FLOW_CLI" attach-evidence "$label" --gate human-approval-gate --file "$bundle" --bundle >"$work/attach.out" 2>&1 )
182
+ if ! rg -q 'kind: trust.bundle' "$work/attach.out"; then
183
+ fail "[$label] evidence did not attach as kind: trust.bundle"; sed -n '1,20p' "$work/attach.out"; return
184
+ fi
185
+ ( cd "$work" && node "$FLOW_CLI" evaluate "$label" --gate human-approval-gate --exit-code >"$work/eval.out" 2>&1 )
186
+ local got=$?
187
+ if [[ "$got" == "$expect" ]]; then
188
+ pass "[$label] standards-authoring gate evaluate exit $got as expected"
189
+ else
190
+ fail "[$label] standards-authoring gate evaluate exit $got, expected $expect"; sed -n '1,20p' "$work/eval.out"
191
+ fi
192
+ }
193
+ authoring_gate_case "$KIT/fixtures/standards-authoring/approved.trust-bundle.json" "authoring-positive" 0
194
+ authoring_gate_case "$KIT/fixtures/standards-authoring/not-approved.trust-bundle.json" "authoring-negative" 1
195
+ # No-fork: the authoring skill wraps the veritas CLI; it must not vendor rule/claim evaluation.
196
+ if rg -q -i 'evaluateRepoStandards|evidence-check-runner\.mjs|class +[A-Za-z]*RuleEngine|repo-standards/default\.repo-standards\.json' "$KIT/skills/standards-authoring" "$KIT/flows/standards-authoring.flow.json" 2>/dev/null; then
197
+ fail "standards-authoring skill/flow appears to vendor Veritas evaluation logic (no-fork violated)"
198
+ else
199
+ pass "no-fork: standards-authoring wraps the veritas CLI, no vendored rule/claim engine"
200
+ fi
201
+
136
202
  # --- exemption-issuance: issue-step DECLARED append semantics (AC4) --------------
137
203
  # Seed a scratch delivery/DECLARED with main's real 2-entry array (inlined here, not read
138
204
  # live from the repo, so this eval is not coupled to that file's future contents), then
@@ -364,6 +430,196 @@ else
364
430
  echo " - SKIP live Veritas leg (set VERITAS_BIN + VERITAS_GOVERNED_REPO to enable); fixtures are captured real output"
365
431
  fi
366
432
 
433
+ # --- Starter-standards provisioning (Slice 2 PR2): the kit scaffolds a runnable .veritas/ ---
434
+ # The kit declares its starter Repo Standards as provisions[]; `kit provision` copies them into
435
+ # a consumer repo. This asserts the scaffold lands and is well-formed; when a Veritas binary is
436
+ # available it further asserts `veritas readiness` runs end-to-end against the scaffolded repo.
437
+ echo "--- starter-standards provisioning ---"
438
+ FA_CLI="$ROOT/build/src/cli.js"
439
+ if [[ ! -f "$FA_CLI" ]]; then
440
+ fail "flow-agents CLI not built at build/src/cli.js (run npm run build)"
441
+ else
442
+ prov="$TMP_DIR/provisioned-repo"; mkdir -p "$prov"
443
+ if node "$FA_CLI" kit provision "$KIT" --target "$prov" >"$TMP_DIR/provision.out" 2>&1; then
444
+ pass "kit provision scaffolds starter standards into a consumer repo"
445
+ else
446
+ fail "kit provision failed"; sed -n '1,20p' "$TMP_DIR/provision.out"
447
+ fi
448
+ # Every declared provision target must land and (for JSON) parse.
449
+ starter_targets=(
450
+ ".veritas/repo-map.json"
451
+ ".veritas/repo-standards/default.repo-standards.json"
452
+ ".veritas/authority/default.authority-settings.json"
453
+ ".veritas/GOVERNANCE.md"
454
+ ".veritas/README.md"
455
+ "veritas.claims.json"
456
+ )
457
+ for rel in "${starter_targets[@]}"; do
458
+ if [[ -f "$prov/$rel" ]]; then
459
+ if [[ "$rel" == *.json ]]; then
460
+ if node -e "JSON.parse(require('fs').readFileSync(process.argv[1],'utf8'))" "$prov/$rel" >/dev/null 2>&1; then
461
+ pass "scaffolded $rel is present and valid JSON"
462
+ else
463
+ fail "scaffolded $rel is not valid JSON"
464
+ fi
465
+ else
466
+ pass "scaffolded $rel is present"
467
+ fi
468
+ else
469
+ fail "expected scaffolded file missing: $rel"
470
+ fi
471
+ done
472
+ # The scaffold must reference the Veritas engine's OWN starter output, not reimplement it:
473
+ # every provision source lives under assets/, never in adapter/ or flows/ (no-fork already
474
+ # scopes there). Assert the declared sources exist inside the kit's assets tree.
475
+ if node -e "
476
+ const fs=require('fs'),path=require('path');
477
+ const kit=JSON.parse(fs.readFileSync(process.argv[1]+'/kit.json','utf8'));
478
+ const bad=(kit.provisions||[]).filter(p=>!p.path.startsWith('assets/')||!fs.existsSync(path.join(process.argv[1],p.path)));
479
+ if(bad.length){console.error('bad provisions:',bad.map(p=>p.id).join(','));process.exit(1)}
480
+ " "$KIT" >/dev/null 2>&1; then
481
+ pass "all starter provisions source from the kit's assets/ tree"
482
+ else
483
+ fail "a starter provision points outside assets/ or at a missing file"
484
+ fi
485
+ # Live: a Veritas binary must be able to run readiness against the scaffolded repo.
486
+ VBIN2="${VERITAS_BIN:-veritas}"
487
+ if command -v "$VBIN2" >/dev/null 2>&1 || [[ -x "$VBIN2" ]]; then
488
+ ( cd "$prov" && git init -q && printf '{"name":"scaffold-eval","scripts":{"test":"node -e \"process.exit(0)\""}}\n' > package.json \
489
+ && git add -A && git -c user.email=eval@local -c user.name=eval commit -qm scaffold ) >/dev/null 2>&1
490
+ if ( cd "$prov" && "$VBIN2" readiness --working-tree >/dev/null 2>&1 ); then :; fi
491
+ if ls "$prov/.kontourai/veritas/evidence/"*.json >/dev/null 2>&1; then
492
+ pass "veritas readiness runs end-to-end on the kit-scaffolded repo (evidence report produced)"
493
+ else
494
+ fail "veritas readiness produced no evidence report on the scaffolded repo"
495
+ fi
496
+ else
497
+ echo " - SKIP scaffold readiness leg (no Veritas binary; set VERITAS_BIN to enable)"
498
+ fi
499
+ fi
500
+
501
+ # --- Governance git-hook provisioning (Slice 3 PR / #648) --------------------------
502
+ # The kit ships the two governance git hooks as provisions[]; `kit provision` lands them
503
+ # (non-executable), and a documented chmod + core.hooksPath step activates them. This asserts
504
+ # the hook files land with the expected bodies and that, once activated, the pre-push hook fires.
505
+ echo "--- governance git-hook provisioning ---"
506
+ FA_CLI2="$ROOT/build/src/cli.js"
507
+ if [[ ! -f "$FA_CLI2" ]]; then
508
+ fail "flow-agents CLI not built at build/src/cli.js (run npm run build)"
509
+ else
510
+ hookrepo="$TMP_DIR/hook-provisioned-repo"; mkdir -p "$hookrepo"
511
+ ( cd "$hookrepo" && git init -q && printf '{"name":"hook-eval","scripts":{"prepush":"echo PREPUSH-RAN"}}\n' > package.json )
512
+ if node "$FA_CLI2" kit provision "$KIT" --target "$hookrepo" >"$TMP_DIR/hookprov.out" 2>&1; then
513
+ pass "kit provision lands the governance git hooks"
514
+ else
515
+ fail "kit provision (hooks) failed"; sed -n '1,20p' "$TMP_DIR/hookprov.out"
516
+ fi
517
+ # Both hook files present, match the committed kit assets byte-for-byte, AND carry their
518
+ # defining command. The byte-match alone cannot catch a corrupted kit asset (a bad asset is
519
+ # copied verbatim and still matches itself), so a content assertion pins what each hook must do.
520
+ declare -A hook_must_contain=(
521
+ [pre-push]='npm run --if-present prepush'
522
+ [post-commit]='veritas readiness --changed-from HEAD~1 --changed-to HEAD'
523
+ )
524
+ for hook in pre-push post-commit; do
525
+ if [[ -f "$hookrepo/.githooks/$hook" ]]; then
526
+ if cmp -s "$hookrepo/.githooks/$hook" "$KIT/assets/starter-hooks/githooks/$hook"; then
527
+ pass "scaffolded .githooks/$hook matches the kit asset byte-for-byte"
528
+ else
529
+ fail "scaffolded .githooks/$hook differs from the kit asset"
530
+ fi
531
+ if grep -qF "${hook_must_contain[$hook]}" "$hookrepo/.githooks/$hook"; then
532
+ pass "scaffolded .githooks/$hook invokes its defining command (${hook_must_contain[$hook]})"
533
+ else
534
+ fail "scaffolded .githooks/$hook is missing its defining command (${hook_must_contain[$hook]}) — corrupted asset?"
535
+ fi
536
+ else
537
+ fail "expected git hook missing: .githooks/$hook"
538
+ fi
539
+ done
540
+ # Provisions land non-executable by design (the engine copy is agent-blind) — assert for BOTH.
541
+ for hook in pre-push post-commit; do
542
+ if [[ -x "$hookrepo/.githooks/$hook" ]]; then
543
+ fail "provisioned .githooks/$hook is already executable — provisioning should be agent-blind (no +x)"
544
+ else
545
+ pass "provisioned .githooks/$hook lands non-executable (agent-blind copy; activation is explicit)"
546
+ fi
547
+ done
548
+ ( cd "$hookrepo" && chmod +x .githooks/pre-push .githooks/post-commit && git config core.hooksPath .githooks )
549
+ if [[ "$(cd "$hookrepo" && git config --get core.hooksPath)" == ".githooks" ]]; then
550
+ pass "activation sets core.hooksPath to .githooks"
551
+ else
552
+ fail "activation did not set core.hooksPath"
553
+ fi
554
+ # Prove GIT actually dispatches the hook via core.hooksPath — not just direct invocation. Push
555
+ # to a local bare remote; the pre-push hook (runs `npm run --if-present prepush`) fires through
556
+ # git's own hook machinery. Output captured to a file so pipefail + git's SIGPIPE can't interfere.
557
+ ( cd "$hookrepo" && git -c user.email=eval@local -c user.name=eval commit -qm base --allow-empty ) >/dev/null 2>&1
558
+ bare="$TMP_DIR/hook-remote.git"; git init --bare -q "$bare"
559
+ ( cd "$hookrepo" && git remote add origin "$bare" && git push -q origin HEAD:refs/heads/main ) >"$TMP_DIR/gitpush.out" 2>&1
560
+ if grep -qF PREPUSH-RAN "$TMP_DIR/gitpush.out"; then
561
+ pass "git dispatches the pre-push hook via core.hooksPath (real git push fires it)"
562
+ else
563
+ fail "git push did not fire the pre-push hook via core.hooksPath"; sed -n '1,12p' "$TMP_DIR/gitpush.out"
564
+ fi
565
+ # No-fork: hook assets live under assets/, and invoke the veritas CLI — they must not vendor
566
+ # rule/claim evaluation. (assets/ is outside the adapter/flows no-fork scope; assert explicitly.)
567
+ if rg -q -i 'evaluateRepoStandards|evidence-check-runner\.mjs|class +[A-Za-z]*RuleEngine' "$KIT/assets/starter-hooks" 2>/dev/null; then
568
+ fail "governance hook assets appear to vendor Veritas evaluation logic (no-fork violated)"
569
+ else
570
+ pass "no-fork: governance hooks invoke the veritas CLI only (no vendored rule/claim engine)"
571
+ fi
572
+ fi
573
+
574
+ # --- consult-standards skill (Slice 4 / #649): JIT guidance via `veritas explain` ---------
575
+ # A pull-based advisory skill telling an agent to run `veritas explain --file <path>` before
576
+ # editing. No MCP server; wraps the veritas CLI, reimplements no evaluation.
577
+ echo "--- consult-standards skill ---"
578
+ CONSULT_SKILL="$KIT/skills/consult-standards/SKILL.md"
579
+ if [[ -f "$CONSULT_SKILL" ]]; then
580
+ pass "consult-standards SKILL.md is present"
581
+ else
582
+ fail "consult-standards SKILL.md is missing"
583
+ fi
584
+ if rg -q '"id": *"veritas-governance\.consult-standards"' "$KIT/kit.json" && rg -q '"path": *"skills/consult-standards/SKILL.md"' "$KIT/kit.json"; then
585
+ pass "consult-standards skill is registered in kit.json skills[]"
586
+ else
587
+ fail "consult-standards skill is NOT registered in kit.json skills[]"
588
+ fi
589
+ # It must point agents at `veritas explain` (the JIT producer), not vendor evaluation.
590
+ if grep -qF 'veritas explain' "$CONSULT_SKILL"; then
591
+ pass "consult-standards points at the veritas explain CLI"
592
+ else
593
+ fail "consult-standards does not reference veritas explain"
594
+ fi
595
+ if rg -q -i 'evaluateRepoStandards|evidence-check-runner\.mjs|class +[A-Za-z]*RuleEngine' "$KIT/skills/consult-standards" 2>/dev/null; then
596
+ fail "consult-standards appears to vendor Veritas evaluation logic (no-fork violated)"
597
+ else
598
+ pass "no-fork: consult-standards wraps the veritas CLI, no vendored rule/claim engine"
599
+ fi
600
+ # No-MCP invariant (#649 / ADR 0011): the kit ships no MCP server CODE and declares no MCP
601
+ # dependency. Scoped to non-markdown files so the docs' explicit "no MCP server" prose (which
602
+ # names the concept precisely to say the kit avoids it) does not trip the check.
603
+ if rg -q -i 'modelcontextprotocol|new +McpServer|StdioServerTransport|createMcpServer' "$KIT" --glob '!*.md' 2>/dev/null; then
604
+ fail "kit ships MCP server code/dependency — #649 guidance is a skill, not an MCP server (ADR 0011)"
605
+ else
606
+ pass "no MCP server: JIT guidance is an agent-pull skill (ADR 0011)"
607
+ fi
608
+ # Live leg: with a Veritas binary, a scaffolded repo's `veritas explain --file` produces JIT context.
609
+ VBIN3="${VERITAS_BIN:-veritas}"
610
+ if command -v "$VBIN3" >/dev/null 2>&1 || [[ -x "$VBIN3" ]]; then
611
+ cs="$TMP_DIR/consult-repo"; mkdir -p "$cs"
612
+ ( cd "$cs" && git init -q && printf '{"name":"consult-eval","scripts":{"test":"node -e \\"process.exit(0)\\""}}\n' > package.json && "$VBIN3" init >/dev/null 2>&1 )
613
+ explain_out="$( cd "$cs" && "$VBIN3" explain --file package.json 2>&1 )"
614
+ if printf '%s' "$explain_out" | grep -qF 'Veritas JIT Context'; then
615
+ pass "veritas explain --file produces JIT context on a governed repo (the guidance the skill invokes)"
616
+ else
617
+ fail "veritas explain --file did not produce JIT context"; printf '%s\n' "$explain_out" | sed -n '1,8p'
618
+ fi
619
+ else
620
+ echo " - SKIP consult-standards live leg (no Veritas binary; set VERITAS_BIN to enable)"
621
+ fi
622
+
367
623
  echo ""
368
624
  if [[ "$errors" -eq 0 ]]; then
369
625
  echo "PASS: veritas-governance kit gate demo (positive passes, negative blocks)"
@@ -1271,6 +1271,263 @@ else
1271
1271
  _fail "extra criteria failure did not mention criteria mismatch"
1272
1272
  fi
1273
1273
 
1274
+ # --- waves.json (#663 slice 1): wave manifest + reconcile-against-manifest as data ---------
1275
+ # The manifest is additive: every earlier fixture directory in this file has no waves.json and
1276
+ # still validates — that is the "absent file changes nothing" half of AC1.
1277
+
1278
+ GOOD_WAVES="$TMPDIR_EVAL/good-waves"
1279
+ mkdir -p "$GOOD_WAVES"
1280
+ cat > "$GOOD_WAVES/waves.json" <<'JSON'
1281
+ {
1282
+ "schema_version": "1.0",
1283
+ "task_slug": "good-waves",
1284
+ "waves": [
1285
+ {
1286
+ "wave_id": "execute-wave-1",
1287
+ "step": "execute",
1288
+ "declared_at": "2026-07-16T00:00:00Z",
1289
+ "expected_workers": [
1290
+ {"worker_id": "worker-1", "task": "implement module a", "owned_files": ["src/a.ts"]},
1291
+ {"worker_id": "worker-2", "task": "implement module b"}
1292
+ ],
1293
+ "worker_results": [
1294
+ {"worker_id": "worker-1", "status": "completed", "summary": "module a implemented", "recorded_at": "2026-07-16T01:00:00Z"},
1295
+ {"worker_id": "worker-2", "status": "failed", "summary": "module b tests failing", "recorded_at": "2026-07-16T01:00:00Z"}
1296
+ ],
1297
+ "reconciliation": {
1298
+ "status": "complete",
1299
+ "expected_count": 2,
1300
+ "reported_count": 2,
1301
+ "summary": "2 of 2 reported; no workers not_reported",
1302
+ "reconciled_at": "2026-07-16T01:05:00Z"
1303
+ }
1304
+ }
1305
+ ]
1306
+ }
1307
+ JSON
1308
+
1309
+ if flow_agents_node "$VALIDATOR" "$GOOD_WAVES" >"$TMPDIR_EVAL/good-waves.out" 2>&1; then
1310
+ _pass "fully reported wave manifest passes (2 of 2 reported)"
1311
+ else
1312
+ _fail "fully reported wave manifest should pass: $(cat "$TMPDIR_EVAL/good-waves.out")"
1313
+ fi
1314
+
1315
+ # Scenario (issue #663 AC): 3 workers expected, one never lands a terminal record. The
1316
+ # reconciled manifest records worker-3 explicitly as not_reported with "2 of 3 reported" —
1317
+ # and that is VALID DATA (exit 0), not a hook block: slice 1 makes the drop visible, slice 2
1318
+ # (stop-goal-fit) decides whether to refuse. Silent absorption is what must fail, below.
1319
+ SCENARIO_WAVES="$TMPDIR_EVAL/scenario-waves"
1320
+ mkdir -p "$SCENARIO_WAVES"
1321
+ cat > "$SCENARIO_WAVES/waves.json" <<'JSON'
1322
+ {
1323
+ "schema_version": "1.0",
1324
+ "task_slug": "scenario-waves",
1325
+ "waves": [
1326
+ {
1327
+ "wave_id": "execute-wave-1",
1328
+ "step": "execute",
1329
+ "declared_at": "2026-07-16T00:00:00Z",
1330
+ "expected_workers": [
1331
+ {"worker_id": "worker-1", "task": "task one"},
1332
+ {"worker_id": "worker-2", "task": "task two"},
1333
+ {"worker_id": "worker-3", "task": "task three"}
1334
+ ],
1335
+ "worker_results": [
1336
+ {"worker_id": "worker-1", "status": "completed", "summary": "done", "recorded_at": "2026-07-16T01:00:00Z"},
1337
+ {"worker_id": "worker-2", "status": "completed", "summary": "done", "recorded_at": "2026-07-16T01:00:00Z"},
1338
+ {"worker_id": "worker-3", "status": "not_reported", "summary": "no terminal report received by wave close; routed to re-dispatch", "recorded_at": "2026-07-16T01:05:00Z"}
1339
+ ],
1340
+ "reconciliation": {
1341
+ "status": "incomplete",
1342
+ "expected_count": 3,
1343
+ "reported_count": 2,
1344
+ "summary": "2 of 3 reported; worker-3 not_reported",
1345
+ "reconciled_at": "2026-07-16T01:05:00Z"
1346
+ }
1347
+ }
1348
+ ]
1349
+ }
1350
+ JSON
1351
+
1352
+ if flow_agents_node "$VALIDATOR" "$SCENARIO_WAVES" >"$TMPDIR_EVAL/scenario-waves.out" 2>&1; then
1353
+ _pass "2-of-3 scenario with explicit not_reported worker validates as data (no silent drop, no block)"
1354
+ else
1355
+ _fail "2-of-3 not_reported scenario should validate as data: $(cat "$TMPDIR_EVAL/scenario-waves.out")"
1356
+ fi
1357
+
1358
+ # Silent drop: reconciliation claims complete 3-of-3 while worker-3 has NO terminal record.
1359
+ mkdir -p "$BAD/waves-silent-drop"
1360
+ cat > "$BAD/waves-silent-drop/waves.json" <<'JSON'
1361
+ {
1362
+ "schema_version": "1.0",
1363
+ "task_slug": "waves-silent-drop",
1364
+ "waves": [
1365
+ {
1366
+ "wave_id": "execute-wave-1",
1367
+ "step": "execute",
1368
+ "declared_at": "2026-07-16T00:00:00Z",
1369
+ "expected_workers": [
1370
+ {"worker_id": "worker-1", "task": "task one"},
1371
+ {"worker_id": "worker-2", "task": "task two"},
1372
+ {"worker_id": "worker-3", "task": "task three"}
1373
+ ],
1374
+ "worker_results": [
1375
+ {"worker_id": "worker-1", "status": "completed", "summary": "done", "recorded_at": "2026-07-16T01:00:00Z"},
1376
+ {"worker_id": "worker-2", "status": "completed", "summary": "done", "recorded_at": "2026-07-16T01:00:00Z"}
1377
+ ],
1378
+ "reconciliation": {
1379
+ "status": "complete",
1380
+ "expected_count": 3,
1381
+ "reported_count": 3,
1382
+ "summary": "3 of 3 reported",
1383
+ "reconciled_at": "2026-07-16T01:05:00Z"
1384
+ }
1385
+ }
1386
+ ]
1387
+ }
1388
+ JSON
1389
+
1390
+ if flow_agents_node "$VALIDATOR" "$BAD/waves-silent-drop" >"$TMPDIR_EVAL/waves-silent-drop.out" 2>&1; then
1391
+ _fail "silently dropped worker behind a complete claim should fail"
1392
+ elif rg -q 'worker worker-3 has no terminal status record' "$TMPDIR_EVAL/waves-silent-drop.out" \
1393
+ && rg -q 'reported_count is 3 but 2 of 3 expected workers' "$TMPDIR_EVAL/waves-silent-drop.out" \
1394
+ && rg -q 'complete requires every expected worker' "$TMPDIR_EVAL/waves-silent-drop.out"; then
1395
+ _pass "silently dropped worker fails with missing-record, count, and impossible-complete messages"
1396
+ else
1397
+ _fail "silent-drop failure did not name the dropped worker and count mismatch: $(cat "$TMPDIR_EVAL/waves-silent-drop.out")"
1398
+ fi
1399
+
1400
+ # A complete claim over an explicitly not_reported worker is still impossible.
1401
+ mkdir -p "$BAD/waves-complete-not-reported"
1402
+ cat > "$BAD/waves-complete-not-reported/waves.json" <<'JSON'
1403
+ {
1404
+ "schema_version": "1.0",
1405
+ "task_slug": "waves-complete-not-reported",
1406
+ "waves": [
1407
+ {
1408
+ "wave_id": "execute-wave-1",
1409
+ "step": "execute",
1410
+ "declared_at": "2026-07-16T00:00:00Z",
1411
+ "expected_workers": [
1412
+ {"worker_id": "worker-1", "task": "task one"},
1413
+ {"worker_id": "worker-2", "task": "task two"}
1414
+ ],
1415
+ "worker_results": [
1416
+ {"worker_id": "worker-1", "status": "completed", "summary": "done", "recorded_at": "2026-07-16T01:00:00Z"},
1417
+ {"worker_id": "worker-2", "status": "not_reported", "summary": "never reported", "recorded_at": "2026-07-16T01:05:00Z"}
1418
+ ],
1419
+ "reconciliation": {
1420
+ "status": "complete",
1421
+ "expected_count": 2,
1422
+ "reported_count": 1,
1423
+ "summary": "1 of 2 reported; worker-2 not_reported",
1424
+ "reconciled_at": "2026-07-16T01:05:00Z"
1425
+ }
1426
+ }
1427
+ ]
1428
+ }
1429
+ JSON
1430
+
1431
+ if flow_agents_node "$VALIDATOR" "$BAD/waves-complete-not-reported" >"$TMPDIR_EVAL/waves-complete-not-reported.out" 2>&1; then
1432
+ _fail "complete claim over a not_reported worker should fail"
1433
+ elif rg -q 'complete requires every expected worker' "$TMPDIR_EVAL/waves-complete-not-reported.out"; then
1434
+ _pass "complete claim over a not_reported worker fails with actionable message"
1435
+ else
1436
+ _fail "complete-over-not_reported failure did not mention the complete rule: $(cat "$TMPDIR_EVAL/waves-complete-not-reported.out")"
1437
+ fi
1438
+
1439
+ # Exactly one terminal record per worker.
1440
+ mkdir -p "$BAD/waves-duplicate-record"
1441
+ cat > "$BAD/waves-duplicate-record/waves.json" <<'JSON'
1442
+ {
1443
+ "schema_version": "1.0",
1444
+ "task_slug": "waves-duplicate-record",
1445
+ "waves": [
1446
+ {
1447
+ "wave_id": "execute-wave-1",
1448
+ "step": "execute",
1449
+ "declared_at": "2026-07-16T00:00:00Z",
1450
+ "expected_workers": [
1451
+ {"worker_id": "worker-1", "task": "task one"}
1452
+ ],
1453
+ "worker_results": [
1454
+ {"worker_id": "worker-1", "status": "completed", "summary": "done", "recorded_at": "2026-07-16T01:00:00Z"},
1455
+ {"worker_id": "worker-1", "status": "failed", "summary": "also failed?", "recorded_at": "2026-07-16T01:01:00Z"}
1456
+ ]
1457
+ }
1458
+ ]
1459
+ }
1460
+ JSON
1461
+
1462
+ if flow_agents_node "$VALIDATOR" "$BAD/waves-duplicate-record" >"$TMPDIR_EVAL/waves-duplicate-record.out" 2>&1; then
1463
+ _fail "duplicate terminal record should fail"
1464
+ elif rg -q 'more than one terminal status record for worker worker-1' "$TMPDIR_EVAL/waves-duplicate-record.out"; then
1465
+ _pass "duplicate terminal record fails with actionable message"
1466
+ else
1467
+ _fail "duplicate-record failure did not name the worker: $(cat "$TMPDIR_EVAL/waves-duplicate-record.out")"
1468
+ fi
1469
+
1470
+ # Every reporter must be declared in the manifest before dispatch.
1471
+ mkdir -p "$BAD/waves-undeclared-reporter"
1472
+ cat > "$BAD/waves-undeclared-reporter/waves.json" <<'JSON'
1473
+ {
1474
+ "schema_version": "1.0",
1475
+ "task_slug": "waves-undeclared-reporter",
1476
+ "waves": [
1477
+ {
1478
+ "wave_id": "execute-wave-1",
1479
+ "step": "execute",
1480
+ "declared_at": "2026-07-16T00:00:00Z",
1481
+ "expected_workers": [
1482
+ {"worker_id": "worker-1", "task": "task one"}
1483
+ ],
1484
+ "worker_results": [
1485
+ {"worker_id": "worker-1", "status": "completed", "summary": "done", "recorded_at": "2026-07-16T01:00:00Z"},
1486
+ {"worker_id": "worker-9", "status": "completed", "summary": "surprise", "recorded_at": "2026-07-16T01:00:00Z"}
1487
+ ]
1488
+ }
1489
+ ]
1490
+ }
1491
+ JSON
1492
+
1493
+ if flow_agents_node "$VALIDATOR" "$BAD/waves-undeclared-reporter" >"$TMPDIR_EVAL/waves-undeclared-reporter.out" 2>&1; then
1494
+ _fail "undeclared reporter should fail"
1495
+ elif rg -q 'worker worker-9 that is not declared in expected_workers' "$TMPDIR_EVAL/waves-undeclared-reporter.out"; then
1496
+ _pass "undeclared reporter fails with actionable message"
1497
+ else
1498
+ _fail "undeclared-reporter failure did not name the worker: $(cat "$TMPDIR_EVAL/waves-undeclared-reporter.out")"
1499
+ fi
1500
+
1501
+ # Terminal status vocabulary is schema-enforced.
1502
+ mkdir -p "$BAD/waves-bad-status"
1503
+ cat > "$BAD/waves-bad-status/waves.json" <<'JSON'
1504
+ {
1505
+ "schema_version": "1.0",
1506
+ "task_slug": "waves-bad-status",
1507
+ "waves": [
1508
+ {
1509
+ "wave_id": "execute-wave-1",
1510
+ "step": "execute",
1511
+ "declared_at": "2026-07-16T00:00:00Z",
1512
+ "expected_workers": [
1513
+ {"worker_id": "worker-1", "task": "task one"}
1514
+ ],
1515
+ "worker_results": [
1516
+ {"worker_id": "worker-1", "status": "maybe-done", "summary": "unclear", "recorded_at": "2026-07-16T01:00:00Z"}
1517
+ ]
1518
+ }
1519
+ ]
1520
+ }
1521
+ JSON
1522
+
1523
+ if flow_agents_node "$VALIDATOR" "$BAD/waves-bad-status" >"$TMPDIR_EVAL/waves-bad-status.out" 2>&1; then
1524
+ _fail "unknown worker status should fail"
1525
+ elif rg -q 'status must be one of: completed, failed, blocked, not_reported' "$TMPDIR_EVAL/waves-bad-status.out"; then
1526
+ _pass "unknown worker status fails against the schema enum"
1527
+ else
1528
+ _fail "bad-status failure did not mention the status enum: $(cat "$TMPDIR_EVAL/waves-bad-status.out")"
1529
+ fi
1530
+
1274
1531
  if [[ "$errors" -eq 0 ]]; then
1275
1532
  echo "Workflow artifact integration passed."
1276
1533
  exit 0
@@ -210,6 +210,12 @@ for (const gateId of ["verify-gate", "merge-ready-gate"]) {
210
210
  for (const [reason, target] of Object.entries(expected)) if (gate.on_route_back?.[reason] !== target) throw new Error(`${gateId} ${reason} should route to ${target}`);
211
211
  if (gate.route_back_policy?.on_exceeded !== "block") throw new Error(`${gateId} route_back_policy should block on exceeded attempts`);
212
212
  }
213
+ // #695 item (a): pr-open must not be a one-way door — the composed publish-learn
214
+ // pr-open-gate declares the missing_evidence repair route back to verify.
215
+ const prOpenGate = publishLearn.gates?.["pr-open-gate"] || {};
216
+ if (prOpenGate.on_route_back?.missing_evidence !== "verify") throw new Error("pr-open-gate missing_evidence should route to verify");
217
+ if (prOpenGate.on_route_back?.default !== "verify") throw new Error("pr-open-gate default route-back should target verify");
218
+ if (prOpenGate.route_back_policy?.on_exceeded !== "block") throw new Error("pr-open-gate route_back_policy should block on exceeded attempts");
213
219
  for (const stepId of ["pr-open", "merge-ready-ci", "learn"]) {
214
220
  const step = (flow.steps || []).find((item) => item.id === stepId);
215
221
  if (step?.uses_flow !== "builder.publish-learn") throw new Error(`${stepId} should compose builder.publish-learn`);
@@ -246,6 +246,19 @@ require_text "$PLANNING_CONTRACT" 'Stop-short risks' "planning contract defines
246
246
  require_text "$PLANNING_CONTRACT" 'Source Evidence / Permalinks' "planning contract requires source evidence permalink expectations"
247
247
  require_text "$EXECUTION_CONTRACT" 'Parallel Wave Rules' "execution contract defines parallel wave rules"
248
248
  require_text "$EXECUTION_CONTRACT" 'modified files are recorded' "execution contract requires modified files"
249
+ require_text "$EXECUTION_CONTRACT" 'Wave Manifest And Reconciliation' "execution contract defines wave manifest reconciliation (#663)"
250
+ require_text "$EXECUTION_CONTRACT" 'N of M reported' "execution contract requires explicit N-of-M reconciliation language"
251
+ require_text "$EXECUTION_CONTRACT" 'not_reported' "execution contract records missing workers as not_reported"
252
+ require_text "$EXECUTION_CONTRACT" 'never silently absorb' "execution contract forbids silently absorbing missing workers"
253
+ require_text "$EXECUTE_PLAN" 'waves\.json' "execute-plan declares the wave manifest sidecar"
254
+ require_text "$EXECUTE_PLAN" 'N of M reported' "execute-plan reconciles waves with explicit N-of-M language"
255
+ require_text "$EXECUTE_PLAN" 'not_reported' "execute-plan records missing workers as not_reported"
256
+ require_text "$EXECUTE_PLAN" 'reconcile results against the wave manifest' "execute-plan collect step is reconcile-against-manifest"
257
+ require_text "$REVIEW_WORK" 'waves\.json' "review-work declares fan-out reviewer lanes in the wave manifest"
258
+ require_text "$REVIEW_WORK" 'N of M reported' "review-work reconciles reviewer lanes with explicit N-of-M language"
259
+ require_text "$REVIEW_WORK" 'not_reported' "review-work records missing reviewers as not_reported"
260
+ test -f "$ROOT/schemas/workflow-waves.schema.json" && pass "workflow waves schema exists" || fail "workflow waves schema exists"
261
+ require_text "$ROOT/src/cli/validate-workflow-artifacts.ts" 'waves\.json.*workflow-waves\.schema\.json' "validator registers waves.json against the waves schema"
249
262
  require_text "$ARTIFACT_LIFECYCLE_DOC" 'current-state dashboard' "artifact lifecycle defines local current-state role"
250
263
  require_text "$ARTIFACT_LIFECYCLE_DOC" 'Learning records are a routing surface' "artifact lifecycle defines learning routing semantics"
251
264
  require_text "$ARTIFACT_LIFECYCLE_DOC" '14-30 days' "artifact lifecycle documents local retention window"
@@ -776,6 +789,9 @@ require_text "$BUILDER_BUILD_FLOW" 'probe_status' "Builder build flow names prob
776
789
  require_text "$BUILDER_BUILD_FLOW" 'probe_artifact_ref' "Builder build flow names probe artifact ref"
777
790
  require_text "$BUILDER_BUILD_FLOW" 'Stale broad continuation language after a merge is not sufficient' "Builder build flow blocks stale broad continuation"
778
791
  require_text "$BUILDER_BUILD_FLOW" '"uses_flow": "builder.publish-learn"' "Builder build flow composes publish-learn extension"
792
+ require_text "$BUILDER_PUBLISH_LEARN_FLOW" '"on_route_back"' "Builder publish-learn flow declares route-back mappings (#695 item a)"
793
+ require_text "$BUILDER_PUBLISH_LEARN_FLOW" '"missing_evidence": "verify"' "Builder publish-learn pr-open-gate routes missing evidence to verify"
794
+ require_text "$BUILDER_PUBLISH_LEARN_FLOW" '"route_back_policy"' "Builder publish-learn pr-open-gate declares a route-back policy"
779
795
  require_text "$BUILDER_PUBLISH_LEARN_FLOW" '"builder.pr-open.pull-request"' "Builder publish-learn flow exports PR-open evidence"
780
796
  require_text "$BUILDER_PUBLISH_LEARN_FLOW" '"builder.merge-ready-ci.readiness"' "Builder publish-learn flow exports CI merge readiness evidence"
781
797
  require_text "$BUILDER_PUBLISH_LEARN_FLOW" '"builder.learn.evidence"' "Builder publish-learn flow exports learning evidence"
@@ -72,7 +72,7 @@ if [[ ! -e "$DEST/AGENTS.md" && ! -L "$DEST/AGENTS.md" ]]; then
72
72
  rm -f "$instruction_tmp"
73
73
  fi
74
74
  if command -v node >/dev/null 2>&1; then
75
- node "$DEST/scripts/install-merge.js" --config "$DEST/opencode.json" --managed-hooks "$SRC/opencode.json" --version "4.0.0" --install-record "$DEST/.flow-agents/install.json" --runtime "opencode" || true
75
+ node "$DEST/scripts/install-merge.js" --config "$DEST/opencode.json" --managed-hooks "$SRC/opencode.json" --version "4.1.0" --install-record "$DEST/.flow-agents/install.json" --runtime "opencode" || true
76
76
  fi
77
77
  if [[ ${#CONSOLE_CONFIG_ARGS[@]} -gt 0 || -n "${FLOW_AGENTS_TELEMETRY_SINK:-}" || -n "${FLOW_AGENTS_TELEMETRY_SINKS:-}" || -n "${FLOW_AGENTS_CONSOLE_URL:-}" || -n "${CONSOLE_TELEMETRY_URL:-}" || -n "${CONSOLE_URL:-}" || -n "${FLOW_AGENTS_CONSOLE_TOKEN_FILE:-}" || -n "${CONSOLE_TELEMETRY_TOKEN_FILE:-}" ]]; then
78
78
  bash "$DEST/scripts/telemetry/install-console-config.sh" "$DEST/scripts/telemetry/telemetry.conf" "${CONSOLE_CONFIG_ARGS[@]}"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "id": "builder.publish-learn",
3
- "version": "1.1",
3
+ "version": "1.2",
4
4
  "description": "Reusable delivery closeout extension: publish the verified change, confirm merge readiness from provider/CI evidence, and record learning feedback.",
5
5
  "steps": [
6
6
  { "id": "pr-open", "next": "merge-ready-ci" },
@@ -17,6 +17,14 @@
17
17
  "gates": {
18
18
  "pr-open-gate": {
19
19
  "step": "pr-open",
20
+ "on_route_back": {
21
+ "missing_evidence": "verify",
22
+ "default": "verify"
23
+ },
24
+ "route_back_policy": {
25
+ "max_attempts": 3,
26
+ "on_exceeded": "block"
27
+ },
20
28
  "expects": [
21
29
  {
22
30
  "id": "pull-request-opened",
@@ -11,7 +11,7 @@ Implement an approved plan while preserving scope, traceability, and recovery co
11
11
 
12
12
  - **Role:** canonical Builder build-step producer and standalone execution primitive.
13
13
  - **Binding:** `builder.build` step `execute`.
14
- - **Produces:** the active session execution report (`<slug>--deliver.md`), `state.json`, and `implementation-scope` for an active matching run.
14
+ - **Produces:** the active session execution report (`<slug>--deliver.md`), `state.json`, the wave manifest (`waves.json`) for delegated waves, and `implementation-scope` for an active matching run.
15
15
  - **Standalone no-run behavior:** execute the supplied plan and return execution evidence. Do not start a Builder run, record Builder evidence, or imply that an inactive Builder flow advanced.
16
16
 
17
17
  ## Model Routing
@@ -33,8 +33,8 @@ Use `RepositoryAdapter` for repository, target revision, worktree, and changed-f
33
33
 
34
34
  1. Read the plan. Return it to `plan-work` when it lacks a Definition Of Done, stable acceptance criteria, task mapping, sandbox boundary, or usable execution scope.
35
35
  2. Before delegation, compare the current target revision with the plan's base through `RepositoryAdapter`. Re-ground the plan when changed scope intersects its assumptions; record missing confirmation as `NOT_VERIFIED` rather than treating it as fresh.
36
- 3. Give each worker its bounded task, owned files, relevant acceptance IDs, required evidence, sandbox/worktree constraints, rollback conditions, and plan reference.
37
- 4. Run safe independent tasks concurrently and dependent tasks in order. Between waves, collect results, resolve conflicts, and update the execution record with completed work, remaining work, changed files, and supported acceptance criteria.
36
+ 3. Before dispatching a wave that delegates work, declare it in the session's wave manifest (`waves.json`, schema `schemas/workflow-waves.schema.json`): `wave_id`, owning step, and one `expected_workers` entry per worker, so the expected worker count (M) exists before any result arrives. Then give each worker its bounded task, owned files, relevant acceptance IDs, required evidence, sandbox/worktree constraints, rollback conditions, and plan reference.
37
+ 4. Run safe independent tasks concurrently and dependent tasks in order. Between waves, reconcile results against the wave manifest — never collect from memory or prose. Every declared worker must land exactly one terminal status record (`completed`, `failed`, or `blocked`). Record each declared worker that has no terminal record as `not_reported` — never silently absorb a missing worker — then record the wave's `reconciliation` with an explicit "N of M reported" summary naming the `not_reported` workers (for example "2 of 3 reported; worker-3 not_reported"). Treat the wave as complete only when N equals M; an incomplete wave is visible data that routes to re-dispatch, a blocker, or an explicit accepted gap. After reconciliation, resolve conflicts and update the execution record with completed work, remaining work, changed files, and supported acceptance criteria.
38
38
  5. For UI tasks, include the applicable frontend design guidance in the worker instruction.
39
39
  6. When implementation completes, record scope integrity: changed files, accepted deviations, task-to-criterion traceability, evidence, and outstanding gaps. Hand off to report-only review and verification; do not treat implementation as verification.
40
40
  7. Reconcile the execution report and `state.json` with the active session artifact directory.
@@ -49,6 +49,7 @@ The execution record must identify:
49
49
  - each completed task and its supported `AC*` identifiers
50
50
  - changed files and any scope deviation with approval or route-back reason
51
51
  - worker evidence, conflicts, rollback notes, remaining work, and next action
52
+ - per-wave reconciliation against the manifest: "N of M reported" and any `not_reported` workers with their recovery route
52
53
  - current revision comparison and re-grounding decision
53
54
 
54
55
  ## Active Builder Evidence