@kontourai/flow-agents 3.12.1 → 4.0.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 (1029) hide show
  1. package/.github/workflows/ci.yml +76 -0
  2. package/CHANGELOG.md +41 -0
  3. package/build/generated/capability-declarations.json +177 -0
  4. package/build/src/builder-flow-runtime.d.ts +37 -0
  5. package/build/src/builder-flow-runtime.js +71 -1
  6. package/build/src/builder-gate-action-envelope.d.ts +58 -7
  7. package/build/src/builder-gate-action-envelope.js +160 -28
  8. package/build/src/builder-lifecycle-authority.d.ts +26 -0
  9. package/build/src/builder-lifecycle-authority.js +38 -0
  10. package/build/src/cli/builder-run.js +71 -2
  11. package/build/src/cli/narrative-render.d.ts +95 -0
  12. package/build/src/cli/narrative-render.js +466 -0
  13. package/build/src/cli/narrative-sources.d.ts +2 -0
  14. package/build/src/cli/narrative-sources.js +282 -0
  15. package/build/src/cli/public-contracts.d.ts +257 -0
  16. package/build/src/cli/public-contracts.js +87 -0
  17. package/build/src/cli/workflow-sidecar.d.ts +28 -12
  18. package/build/src/cli/workflow-sidecar.js +599 -180
  19. package/build/src/cli/workflow.js +11 -1
  20. package/build/src/cli.js +8 -0
  21. package/build/src/continuation-driver.d.ts +12 -0
  22. package/build/src/continuation-driver.js +16 -2
  23. package/build/src/continuation-validation.js +324 -8
  24. package/build/src/flow-kit/action-metadata.js +21 -1
  25. package/build/src/index.d.ts +33 -2
  26. package/build/src/index.js +24 -0
  27. package/build/src/lib/capability-declarations.d.ts +83 -0
  28. package/build/src/lib/capability-declarations.js +209 -0
  29. package/build/src/narrative/envelope.d.ts +111 -0
  30. package/build/src/narrative/envelope.js +590 -0
  31. package/build/src/narrative/eval-result.d.ts +60 -0
  32. package/build/src/narrative/eval-result.js +158 -0
  33. package/build/src/narrative/grounding-validator.d.ts +104 -0
  34. package/build/src/narrative/grounding-validator.js +472 -0
  35. package/build/src/narrative/integrity.d.ts +17 -0
  36. package/build/src/narrative/integrity.js +39 -0
  37. package/build/src/narrative/intent-economics.d.ts +42 -0
  38. package/build/src/narrative/intent-economics.js +82 -0
  39. package/build/src/narrative/intent.d.ts +94 -0
  40. package/build/src/narrative/intent.js +132 -0
  41. package/build/src/narrative/policy-filter.d.ts +15 -0
  42. package/build/src/narrative/policy-filter.js +58 -0
  43. package/build/src/narrative/projection.d.ts +58 -0
  44. package/build/src/narrative/projection.js +502 -0
  45. package/build/src/narrative/readers.d.ts +84 -0
  46. package/build/src/narrative/readers.js +406 -0
  47. package/build/src/narrative/render.d.ts +3 -0
  48. package/build/src/narrative/render.js +83 -0
  49. package/build/src/narrative/resolver.d.ts +52 -0
  50. package/build/src/narrative/resolver.js +190 -0
  51. package/build/src/narrative/snapshot.d.ts +90 -0
  52. package/build/src/narrative/snapshot.js +325 -0
  53. package/build/src/narrative/source-ids.d.ts +121 -0
  54. package/build/src/narrative/source-ids.js +201 -0
  55. package/build/src/narrative/statements.d.ts +84 -0
  56. package/build/src/narrative/statements.js +347 -0
  57. package/build/src/narrative/turn-spine.d.ts +19 -0
  58. package/build/src/narrative/turn-spine.js +73 -0
  59. package/build/src/tools/build-universal-bundles.js +8 -0
  60. package/build/src/tools/generate-capability-matrix.d.ts +7 -0
  61. package/build/src/tools/generate-capability-matrix.js +207 -0
  62. package/build/src/tools/validate-source-tree.js +5 -1
  63. package/context/scripts/hooks/stop-goal-fit.js +182 -9
  64. package/context/scripts/hooks/workflow-steering.js +160 -19
  65. package/context/scripts/telemetry/lib/session.sh +3 -0
  66. package/context/scripts/telemetry/lib/transport.sh +12 -3
  67. package/context/scripts/telemetry/telemetry.sh +480 -59
  68. package/dist/base/build/generated/capability-declarations.json +177 -0
  69. package/dist/base/build/package.json +1 -1
  70. package/dist/base/build/src/builder-flow-runtime.d.ts +37 -0
  71. package/dist/base/build/src/builder-flow-runtime.js +71 -1
  72. package/dist/base/build/src/builder-gate-action-envelope.d.ts +58 -7
  73. package/dist/base/build/src/builder-gate-action-envelope.js +160 -28
  74. package/dist/base/build/src/builder-lifecycle-authority.d.ts +26 -0
  75. package/dist/base/build/src/builder-lifecycle-authority.js +38 -0
  76. package/dist/base/build/src/cli/builder-run.js +71 -2
  77. package/dist/base/build/src/cli/narrative-render.d.ts +95 -0
  78. package/dist/base/build/src/cli/narrative-render.js +466 -0
  79. package/dist/base/build/src/cli/narrative-sources.d.ts +2 -0
  80. package/dist/base/build/src/cli/narrative-sources.js +282 -0
  81. package/dist/base/build/src/cli/public-contracts.d.ts +257 -0
  82. package/dist/base/build/src/cli/public-contracts.js +87 -0
  83. package/dist/base/build/src/cli/workflow-sidecar.d.ts +28 -12
  84. package/dist/base/build/src/cli/workflow-sidecar.js +599 -180
  85. package/dist/base/build/src/cli/workflow.js +11 -1
  86. package/dist/base/build/src/cli.js +8 -0
  87. package/dist/base/build/src/continuation-driver.d.ts +12 -0
  88. package/dist/base/build/src/continuation-driver.js +16 -2
  89. package/dist/base/build/src/continuation-validation.js +324 -8
  90. package/dist/base/build/src/flow-kit/action-metadata.js +21 -1
  91. package/dist/base/build/src/index.d.ts +33 -2
  92. package/dist/base/build/src/index.js +24 -0
  93. package/dist/base/build/src/lib/capability-declarations.d.ts +83 -0
  94. package/dist/base/build/src/lib/capability-declarations.js +209 -0
  95. package/dist/base/build/src/narrative/envelope.d.ts +111 -0
  96. package/dist/base/build/src/narrative/envelope.js +590 -0
  97. package/dist/base/build/src/narrative/eval-result.d.ts +60 -0
  98. package/dist/base/build/src/narrative/eval-result.js +158 -0
  99. package/dist/base/build/src/narrative/grounding-validator.d.ts +104 -0
  100. package/dist/base/build/src/narrative/grounding-validator.js +472 -0
  101. package/dist/base/build/src/narrative/integrity.d.ts +17 -0
  102. package/dist/base/build/src/narrative/integrity.js +39 -0
  103. package/dist/base/build/src/narrative/intent-economics.d.ts +42 -0
  104. package/dist/base/build/src/narrative/intent-economics.js +82 -0
  105. package/dist/base/build/src/narrative/intent.d.ts +94 -0
  106. package/dist/base/build/src/narrative/intent.js +132 -0
  107. package/dist/base/build/src/narrative/policy-filter.d.ts +15 -0
  108. package/dist/base/build/src/narrative/policy-filter.js +58 -0
  109. package/dist/base/build/src/narrative/projection.d.ts +58 -0
  110. package/dist/base/build/src/narrative/projection.js +502 -0
  111. package/dist/base/build/src/narrative/readers.d.ts +84 -0
  112. package/dist/base/build/src/narrative/readers.js +406 -0
  113. package/dist/base/build/src/narrative/render.d.ts +3 -0
  114. package/dist/base/build/src/narrative/render.js +83 -0
  115. package/dist/base/build/src/narrative/resolver.d.ts +52 -0
  116. package/dist/base/build/src/narrative/resolver.js +190 -0
  117. package/dist/base/build/src/narrative/snapshot.d.ts +90 -0
  118. package/dist/base/build/src/narrative/snapshot.js +325 -0
  119. package/dist/base/build/src/narrative/source-ids.d.ts +121 -0
  120. package/dist/base/build/src/narrative/source-ids.js +201 -0
  121. package/dist/base/build/src/narrative/statements.d.ts +84 -0
  122. package/dist/base/build/src/narrative/statements.js +347 -0
  123. package/dist/base/build/src/narrative/turn-spine.d.ts +19 -0
  124. package/dist/base/build/src/narrative/turn-spine.js +73 -0
  125. package/dist/base/build/src/tools/build-universal-bundles.js +8 -0
  126. package/dist/base/build/src/tools/generate-capability-matrix.d.ts +7 -0
  127. package/dist/base/build/src/tools/generate-capability-matrix.js +207 -0
  128. package/dist/base/build/src/tools/validate-source-tree.js +5 -1
  129. package/dist/base/context/scripts/hooks/stop-goal-fit.js +182 -9
  130. package/dist/base/context/scripts/hooks/workflow-steering.js +160 -19
  131. package/dist/base/context/scripts/telemetry/lib/session.sh +3 -0
  132. package/dist/base/context/scripts/telemetry/lib/transport.sh +12 -3
  133. package/dist/base/context/scripts/telemetry/telemetry.sh +480 -59
  134. package/dist/base/docs/context-map.md +4 -0
  135. package/dist/base/docs/decisions/index.md +1 -0
  136. package/dist/base/docs/decisions/writer-observed-execution.md +51 -0
  137. package/dist/base/docs/fixture-ownership.md +5 -1
  138. package/dist/base/docs/migrations.md +19 -4
  139. package/dist/base/docs/public-workflow-cli.md +9 -0
  140. package/dist/base/docs/spec/builder-flow-runtime.md +49 -8
  141. package/dist/base/docs/spec/runtime-hook-surface.md +29 -1
  142. package/dist/base/docs/specs/economics-record-contract.md +1 -1
  143. package/dist/base/docs/specs/harness-capability-matrix.md +63 -21
  144. package/dist/base/docs/workflow-usage-guide.md +4 -1
  145. package/dist/base/evals/ci/run-baseline.sh +38 -0
  146. package/dist/base/evals/fixtures/narrative-evals/README.md +62 -0
  147. package/dist/base/evals/fixtures/narrative-evals/corpus.json +129 -0
  148. package/dist/base/evals/fixtures/narrative-evals/scorer.mjs +522 -0
  149. package/dist/base/evals/fixtures/narrative-grounding-validator/corpus.json +20 -0
  150. package/dist/base/evals/fixtures/narrative-grounding-validator/prompt-injection-adversarial.txt +1 -0
  151. package/dist/base/evals/fixtures/narrative-grounding-validator/prompt-injection-control.txt +1 -0
  152. package/dist/base/evals/fixtures/narrative-grounding-validator/scorer.mjs +201 -0
  153. package/dist/base/evals/fixtures/narrative-prose-renderer/corpus.json +15 -0
  154. package/dist/base/evals/fixtures/narrative-prose-renderer/scorer.mjs +201 -0
  155. package/dist/base/evals/fixtures/narrative-sources/expected-capture-completeness.json +13 -0
  156. package/dist/base/evals/fixtures/narrative-sources/flow/runs/run-fixture/report.json +1 -0
  157. package/dist/base/evals/fixtures/narrative-sources/flow/runs/run-fixture/state.json +1 -0
  158. package/dist/base/evals/fixtures/narrative-sources/flow/runs/run-runtime/state.json +1 -0
  159. package/dist/base/evals/fixtures/narrative-sources/repo/created.txt +1 -0
  160. package/dist/base/evals/fixtures/narrative-sources/repo/fixture.txt +1 -0
  161. package/dist/base/evals/fixtures/narrative-sources/session/agents/agent-fixture/events.jsonl +2 -0
  162. package/dist/base/evals/fixtures/narrative-sources/session/agents/nested-worker/events.jsonl +1 -0
  163. package/dist/base/evals/fixtures/narrative-sources/session/trust.bundle +1 -0
  164. package/dist/base/evals/fixtures/narrative-sources/telemetry/full.jsonl +3 -0
  165. package/dist/base/evals/fixtures/narrative-sources/telemetry/runtime.jsonl +4 -0
  166. package/dist/base/evals/fixtures/narrative-sources/transcripts/session.txt +1 -0
  167. package/dist/base/evals/integration/test_capability_declarations.sh +183 -0
  168. package/dist/base/evals/integration/test_economics_record.sh +42 -0
  169. package/dist/base/evals/integration/test_fixture_retirement_audit.sh +2 -2
  170. package/dist/base/evals/integration/test_gate_review_inquiry_records.sh +42 -35
  171. package/dist/base/evals/integration/test_goal_fit_hook.sh +13 -5
  172. package/dist/base/evals/integration/test_goal_fit_narrative_exclusion.sh +68 -0
  173. package/dist/base/evals/integration/test_narrative_evals.sh +174 -0
  174. package/dist/base/evals/integration/test_narrative_grounded_envelope.sh +280 -0
  175. package/dist/base/evals/integration/test_narrative_grounding_validator.sh +166 -0
  176. package/dist/base/evals/integration/test_narrative_intent_annotation.sh +205 -0
  177. package/dist/base/evals/integration/test_narrative_prose_renderer.sh +239 -0
  178. package/dist/base/evals/integration/test_narrative_redaction_failclosed.sh +120 -0
  179. package/dist/base/evals/integration/test_narrative_runtime_projection.sh +146 -0
  180. package/dist/base/evals/integration/test_narrative_source_contract.sh +228 -0
  181. package/dist/base/evals/integration/test_narrative_trust_isolation.sh +408 -0
  182. package/dist/base/evals/integration/test_plain_stop_messaging.sh +91 -0
  183. package/dist/base/evals/integration/test_session_resume_roundtrip.sh +228 -0
  184. package/dist/base/evals/integration/test_telemetry_action_class.sh +265 -0
  185. package/dist/base/evals/integration/test_telemetry_delegation.sh +291 -0
  186. package/dist/base/evals/integration/test_telemetry_sanitize_usage.sh +155 -0
  187. package/dist/base/evals/integration/test_telemetry_task_slug.sh +158 -0
  188. package/dist/base/evals/integration/test_telemetry_tool_outcome.sh +279 -0
  189. package/dist/base/evals/integration/test_workflow_sidecar_writer.sh +111 -2
  190. package/dist/base/evals/run.sh +12 -0
  191. package/dist/base/evals/static/test_library_exports.sh +5 -0
  192. package/dist/base/install.sh +1 -1
  193. package/dist/base/schemas/grounded-execution-narrative.schema.json +292 -0
  194. package/dist/base/schemas/narrative-eval-result.schema.json +205 -0
  195. package/dist/base/schemas/narrative-runtime-projection.schema.json +134 -0
  196. package/dist/base/schemas/narrative-source-manifest.schema.json +294 -0
  197. package/dist/base/scripts/check-hachure-boundary.mjs +81 -0
  198. package/dist/base/scripts/hooks/stop-goal-fit.js +182 -9
  199. package/dist/base/scripts/hooks/workflow-steering.js +160 -19
  200. package/dist/base/scripts/telemetry/economics-record.schema.json +1 -1
  201. package/dist/base/scripts/telemetry/economics-record.sh +47 -3
  202. package/dist/base/scripts/telemetry/lib/session.sh +3 -0
  203. package/dist/base/scripts/telemetry/lib/transport.sh +12 -3
  204. package/dist/base/scripts/telemetry/telemetry.sh +480 -59
  205. package/dist/claude-code/build/generated/capability-declarations.json +177 -0
  206. package/dist/claude-code/build/package.json +1 -1
  207. package/dist/claude-code/build/src/builder-flow-runtime.d.ts +37 -0
  208. package/dist/claude-code/build/src/builder-flow-runtime.js +71 -1
  209. package/dist/claude-code/build/src/builder-gate-action-envelope.d.ts +58 -7
  210. package/dist/claude-code/build/src/builder-gate-action-envelope.js +160 -28
  211. package/dist/claude-code/build/src/builder-lifecycle-authority.d.ts +26 -0
  212. package/dist/claude-code/build/src/builder-lifecycle-authority.js +38 -0
  213. package/dist/claude-code/build/src/cli/builder-run.js +71 -2
  214. package/dist/claude-code/build/src/cli/narrative-render.d.ts +95 -0
  215. package/dist/claude-code/build/src/cli/narrative-render.js +466 -0
  216. package/dist/claude-code/build/src/cli/narrative-sources.d.ts +2 -0
  217. package/dist/claude-code/build/src/cli/narrative-sources.js +282 -0
  218. package/dist/claude-code/build/src/cli/public-contracts.d.ts +257 -0
  219. package/dist/claude-code/build/src/cli/public-contracts.js +87 -0
  220. package/dist/claude-code/build/src/cli/workflow-sidecar.d.ts +28 -12
  221. package/dist/claude-code/build/src/cli/workflow-sidecar.js +599 -180
  222. package/dist/claude-code/build/src/cli/workflow.js +11 -1
  223. package/dist/claude-code/build/src/cli.js +8 -0
  224. package/dist/claude-code/build/src/continuation-driver.d.ts +12 -0
  225. package/dist/claude-code/build/src/continuation-driver.js +16 -2
  226. package/dist/claude-code/build/src/continuation-validation.js +324 -8
  227. package/dist/claude-code/build/src/flow-kit/action-metadata.js +21 -1
  228. package/dist/claude-code/build/src/index.d.ts +33 -2
  229. package/dist/claude-code/build/src/index.js +24 -0
  230. package/dist/claude-code/build/src/lib/capability-declarations.d.ts +83 -0
  231. package/dist/claude-code/build/src/lib/capability-declarations.js +209 -0
  232. package/dist/claude-code/build/src/narrative/envelope.d.ts +111 -0
  233. package/dist/claude-code/build/src/narrative/envelope.js +590 -0
  234. package/dist/claude-code/build/src/narrative/eval-result.d.ts +60 -0
  235. package/dist/claude-code/build/src/narrative/eval-result.js +158 -0
  236. package/dist/claude-code/build/src/narrative/grounding-validator.d.ts +104 -0
  237. package/dist/claude-code/build/src/narrative/grounding-validator.js +472 -0
  238. package/dist/claude-code/build/src/narrative/integrity.d.ts +17 -0
  239. package/dist/claude-code/build/src/narrative/integrity.js +39 -0
  240. package/dist/claude-code/build/src/narrative/intent-economics.d.ts +42 -0
  241. package/dist/claude-code/build/src/narrative/intent-economics.js +82 -0
  242. package/dist/claude-code/build/src/narrative/intent.d.ts +94 -0
  243. package/dist/claude-code/build/src/narrative/intent.js +132 -0
  244. package/dist/claude-code/build/src/narrative/policy-filter.d.ts +15 -0
  245. package/dist/claude-code/build/src/narrative/policy-filter.js +58 -0
  246. package/dist/claude-code/build/src/narrative/projection.d.ts +58 -0
  247. package/dist/claude-code/build/src/narrative/projection.js +502 -0
  248. package/dist/claude-code/build/src/narrative/readers.d.ts +84 -0
  249. package/dist/claude-code/build/src/narrative/readers.js +406 -0
  250. package/dist/claude-code/build/src/narrative/render.d.ts +3 -0
  251. package/dist/claude-code/build/src/narrative/render.js +83 -0
  252. package/dist/claude-code/build/src/narrative/resolver.d.ts +52 -0
  253. package/dist/claude-code/build/src/narrative/resolver.js +190 -0
  254. package/dist/claude-code/build/src/narrative/snapshot.d.ts +90 -0
  255. package/dist/claude-code/build/src/narrative/snapshot.js +325 -0
  256. package/dist/claude-code/build/src/narrative/source-ids.d.ts +121 -0
  257. package/dist/claude-code/build/src/narrative/source-ids.js +201 -0
  258. package/dist/claude-code/build/src/narrative/statements.d.ts +84 -0
  259. package/dist/claude-code/build/src/narrative/statements.js +347 -0
  260. package/dist/claude-code/build/src/narrative/turn-spine.d.ts +19 -0
  261. package/dist/claude-code/build/src/narrative/turn-spine.js +73 -0
  262. package/dist/claude-code/build/src/tools/build-universal-bundles.js +8 -0
  263. package/dist/claude-code/build/src/tools/generate-capability-matrix.d.ts +7 -0
  264. package/dist/claude-code/build/src/tools/generate-capability-matrix.js +207 -0
  265. package/dist/claude-code/build/src/tools/validate-source-tree.js +5 -1
  266. package/dist/claude-code/context/scripts/hooks/stop-goal-fit.js +182 -9
  267. package/dist/claude-code/context/scripts/hooks/workflow-steering.js +160 -19
  268. package/dist/claude-code/context/scripts/telemetry/lib/session.sh +3 -0
  269. package/dist/claude-code/context/scripts/telemetry/lib/transport.sh +12 -3
  270. package/dist/claude-code/context/scripts/telemetry/telemetry.sh +480 -59
  271. package/dist/claude-code/docs/context-map.md +4 -0
  272. package/dist/claude-code/docs/decisions/index.md +1 -0
  273. package/dist/claude-code/docs/decisions/writer-observed-execution.md +51 -0
  274. package/dist/claude-code/docs/fixture-ownership.md +5 -1
  275. package/dist/claude-code/docs/migrations.md +19 -4
  276. package/dist/claude-code/docs/public-workflow-cli.md +9 -0
  277. package/dist/claude-code/docs/spec/builder-flow-runtime.md +49 -8
  278. package/dist/claude-code/docs/spec/runtime-hook-surface.md +29 -1
  279. package/dist/claude-code/docs/specs/economics-record-contract.md +1 -1
  280. package/dist/claude-code/docs/specs/harness-capability-matrix.md +63 -21
  281. package/dist/claude-code/docs/workflow-usage-guide.md +4 -1
  282. package/dist/claude-code/evals/ci/run-baseline.sh +38 -0
  283. package/dist/claude-code/evals/fixtures/narrative-evals/README.md +62 -0
  284. package/dist/claude-code/evals/fixtures/narrative-evals/corpus.json +129 -0
  285. package/dist/claude-code/evals/fixtures/narrative-evals/scorer.mjs +522 -0
  286. package/dist/claude-code/evals/fixtures/narrative-grounding-validator/corpus.json +20 -0
  287. package/dist/claude-code/evals/fixtures/narrative-grounding-validator/prompt-injection-adversarial.txt +1 -0
  288. package/dist/claude-code/evals/fixtures/narrative-grounding-validator/prompt-injection-control.txt +1 -0
  289. package/dist/claude-code/evals/fixtures/narrative-grounding-validator/scorer.mjs +201 -0
  290. package/dist/claude-code/evals/fixtures/narrative-prose-renderer/corpus.json +15 -0
  291. package/dist/claude-code/evals/fixtures/narrative-prose-renderer/scorer.mjs +201 -0
  292. package/dist/claude-code/evals/fixtures/narrative-sources/expected-capture-completeness.json +13 -0
  293. package/dist/claude-code/evals/fixtures/narrative-sources/flow/runs/run-fixture/report.json +1 -0
  294. package/dist/claude-code/evals/fixtures/narrative-sources/flow/runs/run-fixture/state.json +1 -0
  295. package/dist/claude-code/evals/fixtures/narrative-sources/flow/runs/run-runtime/state.json +1 -0
  296. package/dist/claude-code/evals/fixtures/narrative-sources/repo/created.txt +1 -0
  297. package/dist/claude-code/evals/fixtures/narrative-sources/repo/fixture.txt +1 -0
  298. package/dist/claude-code/evals/fixtures/narrative-sources/session/agents/agent-fixture/events.jsonl +2 -0
  299. package/dist/claude-code/evals/fixtures/narrative-sources/session/agents/nested-worker/events.jsonl +1 -0
  300. package/dist/claude-code/evals/fixtures/narrative-sources/session/trust.bundle +1 -0
  301. package/dist/claude-code/evals/fixtures/narrative-sources/telemetry/full.jsonl +3 -0
  302. package/dist/claude-code/evals/fixtures/narrative-sources/telemetry/runtime.jsonl +4 -0
  303. package/dist/claude-code/evals/fixtures/narrative-sources/transcripts/session.txt +1 -0
  304. package/dist/claude-code/evals/integration/test_capability_declarations.sh +183 -0
  305. package/dist/claude-code/evals/integration/test_economics_record.sh +42 -0
  306. package/dist/claude-code/evals/integration/test_fixture_retirement_audit.sh +2 -2
  307. package/dist/claude-code/evals/integration/test_gate_review_inquiry_records.sh +42 -35
  308. package/dist/claude-code/evals/integration/test_goal_fit_hook.sh +13 -5
  309. package/dist/claude-code/evals/integration/test_goal_fit_narrative_exclusion.sh +68 -0
  310. package/dist/claude-code/evals/integration/test_narrative_evals.sh +174 -0
  311. package/dist/claude-code/evals/integration/test_narrative_grounded_envelope.sh +280 -0
  312. package/dist/claude-code/evals/integration/test_narrative_grounding_validator.sh +166 -0
  313. package/dist/claude-code/evals/integration/test_narrative_intent_annotation.sh +205 -0
  314. package/dist/claude-code/evals/integration/test_narrative_prose_renderer.sh +239 -0
  315. package/dist/claude-code/evals/integration/test_narrative_redaction_failclosed.sh +120 -0
  316. package/dist/claude-code/evals/integration/test_narrative_runtime_projection.sh +146 -0
  317. package/dist/claude-code/evals/integration/test_narrative_source_contract.sh +228 -0
  318. package/dist/claude-code/evals/integration/test_narrative_trust_isolation.sh +408 -0
  319. package/dist/claude-code/evals/integration/test_plain_stop_messaging.sh +91 -0
  320. package/dist/claude-code/evals/integration/test_session_resume_roundtrip.sh +228 -0
  321. package/dist/claude-code/evals/integration/test_telemetry_action_class.sh +265 -0
  322. package/dist/claude-code/evals/integration/test_telemetry_delegation.sh +291 -0
  323. package/dist/claude-code/evals/integration/test_telemetry_sanitize_usage.sh +155 -0
  324. package/dist/claude-code/evals/integration/test_telemetry_task_slug.sh +158 -0
  325. package/dist/claude-code/evals/integration/test_telemetry_tool_outcome.sh +279 -0
  326. package/dist/claude-code/evals/integration/test_workflow_sidecar_writer.sh +111 -2
  327. package/dist/claude-code/evals/run.sh +12 -0
  328. package/dist/claude-code/evals/static/test_library_exports.sh +5 -0
  329. package/dist/claude-code/install.sh +1 -1
  330. package/dist/claude-code/schemas/grounded-execution-narrative.schema.json +292 -0
  331. package/dist/claude-code/schemas/narrative-eval-result.schema.json +205 -0
  332. package/dist/claude-code/schemas/narrative-runtime-projection.schema.json +134 -0
  333. package/dist/claude-code/schemas/narrative-source-manifest.schema.json +294 -0
  334. package/dist/claude-code/scripts/check-hachure-boundary.mjs +81 -0
  335. package/dist/claude-code/scripts/hooks/stop-goal-fit.js +182 -9
  336. package/dist/claude-code/scripts/hooks/workflow-steering.js +160 -19
  337. package/dist/claude-code/scripts/telemetry/economics-record.schema.json +1 -1
  338. package/dist/claude-code/scripts/telemetry/economics-record.sh +47 -3
  339. package/dist/claude-code/scripts/telemetry/lib/session.sh +3 -0
  340. package/dist/claude-code/scripts/telemetry/lib/transport.sh +12 -3
  341. package/dist/claude-code/scripts/telemetry/telemetry.sh +480 -59
  342. package/dist/codex/build/generated/capability-declarations.json +177 -0
  343. package/dist/codex/build/package.json +1 -1
  344. package/dist/codex/build/src/builder-flow-runtime.d.ts +37 -0
  345. package/dist/codex/build/src/builder-flow-runtime.js +71 -1
  346. package/dist/codex/build/src/builder-gate-action-envelope.d.ts +58 -7
  347. package/dist/codex/build/src/builder-gate-action-envelope.js +160 -28
  348. package/dist/codex/build/src/builder-lifecycle-authority.d.ts +26 -0
  349. package/dist/codex/build/src/builder-lifecycle-authority.js +38 -0
  350. package/dist/codex/build/src/cli/builder-run.js +71 -2
  351. package/dist/codex/build/src/cli/narrative-render.d.ts +95 -0
  352. package/dist/codex/build/src/cli/narrative-render.js +466 -0
  353. package/dist/codex/build/src/cli/narrative-sources.d.ts +2 -0
  354. package/dist/codex/build/src/cli/narrative-sources.js +282 -0
  355. package/dist/codex/build/src/cli/public-contracts.d.ts +257 -0
  356. package/dist/codex/build/src/cli/public-contracts.js +87 -0
  357. package/dist/codex/build/src/cli/workflow-sidecar.d.ts +28 -12
  358. package/dist/codex/build/src/cli/workflow-sidecar.js +599 -180
  359. package/dist/codex/build/src/cli/workflow.js +11 -1
  360. package/dist/codex/build/src/cli.js +8 -0
  361. package/dist/codex/build/src/continuation-driver.d.ts +12 -0
  362. package/dist/codex/build/src/continuation-driver.js +16 -2
  363. package/dist/codex/build/src/continuation-validation.js +324 -8
  364. package/dist/codex/build/src/flow-kit/action-metadata.js +21 -1
  365. package/dist/codex/build/src/index.d.ts +33 -2
  366. package/dist/codex/build/src/index.js +24 -0
  367. package/dist/codex/build/src/lib/capability-declarations.d.ts +83 -0
  368. package/dist/codex/build/src/lib/capability-declarations.js +209 -0
  369. package/dist/codex/build/src/narrative/envelope.d.ts +111 -0
  370. package/dist/codex/build/src/narrative/envelope.js +590 -0
  371. package/dist/codex/build/src/narrative/eval-result.d.ts +60 -0
  372. package/dist/codex/build/src/narrative/eval-result.js +158 -0
  373. package/dist/codex/build/src/narrative/grounding-validator.d.ts +104 -0
  374. package/dist/codex/build/src/narrative/grounding-validator.js +472 -0
  375. package/dist/codex/build/src/narrative/integrity.d.ts +17 -0
  376. package/dist/codex/build/src/narrative/integrity.js +39 -0
  377. package/dist/codex/build/src/narrative/intent-economics.d.ts +42 -0
  378. package/dist/codex/build/src/narrative/intent-economics.js +82 -0
  379. package/dist/codex/build/src/narrative/intent.d.ts +94 -0
  380. package/dist/codex/build/src/narrative/intent.js +132 -0
  381. package/dist/codex/build/src/narrative/policy-filter.d.ts +15 -0
  382. package/dist/codex/build/src/narrative/policy-filter.js +58 -0
  383. package/dist/codex/build/src/narrative/projection.d.ts +58 -0
  384. package/dist/codex/build/src/narrative/projection.js +502 -0
  385. package/dist/codex/build/src/narrative/readers.d.ts +84 -0
  386. package/dist/codex/build/src/narrative/readers.js +406 -0
  387. package/dist/codex/build/src/narrative/render.d.ts +3 -0
  388. package/dist/codex/build/src/narrative/render.js +83 -0
  389. package/dist/codex/build/src/narrative/resolver.d.ts +52 -0
  390. package/dist/codex/build/src/narrative/resolver.js +190 -0
  391. package/dist/codex/build/src/narrative/snapshot.d.ts +90 -0
  392. package/dist/codex/build/src/narrative/snapshot.js +325 -0
  393. package/dist/codex/build/src/narrative/source-ids.d.ts +121 -0
  394. package/dist/codex/build/src/narrative/source-ids.js +201 -0
  395. package/dist/codex/build/src/narrative/statements.d.ts +84 -0
  396. package/dist/codex/build/src/narrative/statements.js +347 -0
  397. package/dist/codex/build/src/narrative/turn-spine.d.ts +19 -0
  398. package/dist/codex/build/src/narrative/turn-spine.js +73 -0
  399. package/dist/codex/build/src/tools/build-universal-bundles.js +8 -0
  400. package/dist/codex/build/src/tools/generate-capability-matrix.d.ts +7 -0
  401. package/dist/codex/build/src/tools/generate-capability-matrix.js +207 -0
  402. package/dist/codex/build/src/tools/validate-source-tree.js +5 -1
  403. package/dist/codex/context/scripts/hooks/stop-goal-fit.js +182 -9
  404. package/dist/codex/context/scripts/hooks/workflow-steering.js +160 -19
  405. package/dist/codex/context/scripts/telemetry/lib/session.sh +3 -0
  406. package/dist/codex/context/scripts/telemetry/lib/transport.sh +12 -3
  407. package/dist/codex/context/scripts/telemetry/telemetry.sh +480 -59
  408. package/dist/codex/docs/context-map.md +4 -0
  409. package/dist/codex/docs/decisions/index.md +1 -0
  410. package/dist/codex/docs/decisions/writer-observed-execution.md +51 -0
  411. package/dist/codex/docs/fixture-ownership.md +5 -1
  412. package/dist/codex/docs/migrations.md +19 -4
  413. package/dist/codex/docs/public-workflow-cli.md +9 -0
  414. package/dist/codex/docs/spec/builder-flow-runtime.md +49 -8
  415. package/dist/codex/docs/spec/runtime-hook-surface.md +29 -1
  416. package/dist/codex/docs/specs/economics-record-contract.md +1 -1
  417. package/dist/codex/docs/specs/harness-capability-matrix.md +63 -21
  418. package/dist/codex/docs/workflow-usage-guide.md +4 -1
  419. package/dist/codex/evals/ci/run-baseline.sh +38 -0
  420. package/dist/codex/evals/fixtures/narrative-evals/README.md +62 -0
  421. package/dist/codex/evals/fixtures/narrative-evals/corpus.json +129 -0
  422. package/dist/codex/evals/fixtures/narrative-evals/scorer.mjs +522 -0
  423. package/dist/codex/evals/fixtures/narrative-grounding-validator/corpus.json +20 -0
  424. package/dist/codex/evals/fixtures/narrative-grounding-validator/prompt-injection-adversarial.txt +1 -0
  425. package/dist/codex/evals/fixtures/narrative-grounding-validator/prompt-injection-control.txt +1 -0
  426. package/dist/codex/evals/fixtures/narrative-grounding-validator/scorer.mjs +201 -0
  427. package/dist/codex/evals/fixtures/narrative-prose-renderer/corpus.json +15 -0
  428. package/dist/codex/evals/fixtures/narrative-prose-renderer/scorer.mjs +201 -0
  429. package/dist/codex/evals/fixtures/narrative-sources/expected-capture-completeness.json +13 -0
  430. package/dist/codex/evals/fixtures/narrative-sources/flow/runs/run-fixture/report.json +1 -0
  431. package/dist/codex/evals/fixtures/narrative-sources/flow/runs/run-fixture/state.json +1 -0
  432. package/dist/codex/evals/fixtures/narrative-sources/flow/runs/run-runtime/state.json +1 -0
  433. package/dist/codex/evals/fixtures/narrative-sources/repo/created.txt +1 -0
  434. package/dist/codex/evals/fixtures/narrative-sources/repo/fixture.txt +1 -0
  435. package/dist/codex/evals/fixtures/narrative-sources/session/agents/agent-fixture/events.jsonl +2 -0
  436. package/dist/codex/evals/fixtures/narrative-sources/session/agents/nested-worker/events.jsonl +1 -0
  437. package/dist/codex/evals/fixtures/narrative-sources/session/trust.bundle +1 -0
  438. package/dist/codex/evals/fixtures/narrative-sources/telemetry/full.jsonl +3 -0
  439. package/dist/codex/evals/fixtures/narrative-sources/telemetry/runtime.jsonl +4 -0
  440. package/dist/codex/evals/fixtures/narrative-sources/transcripts/session.txt +1 -0
  441. package/dist/codex/evals/integration/test_capability_declarations.sh +183 -0
  442. package/dist/codex/evals/integration/test_economics_record.sh +42 -0
  443. package/dist/codex/evals/integration/test_fixture_retirement_audit.sh +2 -2
  444. package/dist/codex/evals/integration/test_gate_review_inquiry_records.sh +42 -35
  445. package/dist/codex/evals/integration/test_goal_fit_hook.sh +13 -5
  446. package/dist/codex/evals/integration/test_goal_fit_narrative_exclusion.sh +68 -0
  447. package/dist/codex/evals/integration/test_narrative_evals.sh +174 -0
  448. package/dist/codex/evals/integration/test_narrative_grounded_envelope.sh +280 -0
  449. package/dist/codex/evals/integration/test_narrative_grounding_validator.sh +166 -0
  450. package/dist/codex/evals/integration/test_narrative_intent_annotation.sh +205 -0
  451. package/dist/codex/evals/integration/test_narrative_prose_renderer.sh +239 -0
  452. package/dist/codex/evals/integration/test_narrative_redaction_failclosed.sh +120 -0
  453. package/dist/codex/evals/integration/test_narrative_runtime_projection.sh +146 -0
  454. package/dist/codex/evals/integration/test_narrative_source_contract.sh +228 -0
  455. package/dist/codex/evals/integration/test_narrative_trust_isolation.sh +408 -0
  456. package/dist/codex/evals/integration/test_plain_stop_messaging.sh +91 -0
  457. package/dist/codex/evals/integration/test_session_resume_roundtrip.sh +228 -0
  458. package/dist/codex/evals/integration/test_telemetry_action_class.sh +265 -0
  459. package/dist/codex/evals/integration/test_telemetry_delegation.sh +291 -0
  460. package/dist/codex/evals/integration/test_telemetry_sanitize_usage.sh +155 -0
  461. package/dist/codex/evals/integration/test_telemetry_task_slug.sh +158 -0
  462. package/dist/codex/evals/integration/test_telemetry_tool_outcome.sh +279 -0
  463. package/dist/codex/evals/integration/test_workflow_sidecar_writer.sh +111 -2
  464. package/dist/codex/evals/run.sh +12 -0
  465. package/dist/codex/evals/static/test_library_exports.sh +5 -0
  466. package/dist/codex/install.sh +1 -1
  467. package/dist/codex/schemas/grounded-execution-narrative.schema.json +292 -0
  468. package/dist/codex/schemas/narrative-eval-result.schema.json +205 -0
  469. package/dist/codex/schemas/narrative-runtime-projection.schema.json +134 -0
  470. package/dist/codex/schemas/narrative-source-manifest.schema.json +294 -0
  471. package/dist/codex/scripts/check-hachure-boundary.mjs +81 -0
  472. package/dist/codex/scripts/hooks/stop-goal-fit.js +182 -9
  473. package/dist/codex/scripts/hooks/workflow-steering.js +160 -19
  474. package/dist/codex/scripts/telemetry/economics-record.schema.json +1 -1
  475. package/dist/codex/scripts/telemetry/economics-record.sh +47 -3
  476. package/dist/codex/scripts/telemetry/lib/session.sh +3 -0
  477. package/dist/codex/scripts/telemetry/lib/transport.sh +12 -3
  478. package/dist/codex/scripts/telemetry/telemetry.sh +480 -59
  479. package/dist/kiro/build/generated/capability-declarations.json +177 -0
  480. package/dist/kiro/build/package.json +1 -1
  481. package/dist/kiro/build/src/builder-flow-runtime.d.ts +37 -0
  482. package/dist/kiro/build/src/builder-flow-runtime.js +71 -1
  483. package/dist/kiro/build/src/builder-gate-action-envelope.d.ts +58 -7
  484. package/dist/kiro/build/src/builder-gate-action-envelope.js +160 -28
  485. package/dist/kiro/build/src/builder-lifecycle-authority.d.ts +26 -0
  486. package/dist/kiro/build/src/builder-lifecycle-authority.js +38 -0
  487. package/dist/kiro/build/src/cli/builder-run.js +71 -2
  488. package/dist/kiro/build/src/cli/narrative-render.d.ts +95 -0
  489. package/dist/kiro/build/src/cli/narrative-render.js +466 -0
  490. package/dist/kiro/build/src/cli/narrative-sources.d.ts +2 -0
  491. package/dist/kiro/build/src/cli/narrative-sources.js +282 -0
  492. package/dist/kiro/build/src/cli/public-contracts.d.ts +257 -0
  493. package/dist/kiro/build/src/cli/public-contracts.js +87 -0
  494. package/dist/kiro/build/src/cli/workflow-sidecar.d.ts +28 -12
  495. package/dist/kiro/build/src/cli/workflow-sidecar.js +599 -180
  496. package/dist/kiro/build/src/cli/workflow.js +11 -1
  497. package/dist/kiro/build/src/cli.js +8 -0
  498. package/dist/kiro/build/src/continuation-driver.d.ts +12 -0
  499. package/dist/kiro/build/src/continuation-driver.js +16 -2
  500. package/dist/kiro/build/src/continuation-validation.js +324 -8
  501. package/dist/kiro/build/src/flow-kit/action-metadata.js +21 -1
  502. package/dist/kiro/build/src/index.d.ts +33 -2
  503. package/dist/kiro/build/src/index.js +24 -0
  504. package/dist/kiro/build/src/lib/capability-declarations.d.ts +83 -0
  505. package/dist/kiro/build/src/lib/capability-declarations.js +209 -0
  506. package/dist/kiro/build/src/narrative/envelope.d.ts +111 -0
  507. package/dist/kiro/build/src/narrative/envelope.js +590 -0
  508. package/dist/kiro/build/src/narrative/eval-result.d.ts +60 -0
  509. package/dist/kiro/build/src/narrative/eval-result.js +158 -0
  510. package/dist/kiro/build/src/narrative/grounding-validator.d.ts +104 -0
  511. package/dist/kiro/build/src/narrative/grounding-validator.js +472 -0
  512. package/dist/kiro/build/src/narrative/integrity.d.ts +17 -0
  513. package/dist/kiro/build/src/narrative/integrity.js +39 -0
  514. package/dist/kiro/build/src/narrative/intent-economics.d.ts +42 -0
  515. package/dist/kiro/build/src/narrative/intent-economics.js +82 -0
  516. package/dist/kiro/build/src/narrative/intent.d.ts +94 -0
  517. package/dist/kiro/build/src/narrative/intent.js +132 -0
  518. package/dist/kiro/build/src/narrative/policy-filter.d.ts +15 -0
  519. package/dist/kiro/build/src/narrative/policy-filter.js +58 -0
  520. package/dist/kiro/build/src/narrative/projection.d.ts +58 -0
  521. package/dist/kiro/build/src/narrative/projection.js +502 -0
  522. package/dist/kiro/build/src/narrative/readers.d.ts +84 -0
  523. package/dist/kiro/build/src/narrative/readers.js +406 -0
  524. package/dist/kiro/build/src/narrative/render.d.ts +3 -0
  525. package/dist/kiro/build/src/narrative/render.js +83 -0
  526. package/dist/kiro/build/src/narrative/resolver.d.ts +52 -0
  527. package/dist/kiro/build/src/narrative/resolver.js +190 -0
  528. package/dist/kiro/build/src/narrative/snapshot.d.ts +90 -0
  529. package/dist/kiro/build/src/narrative/snapshot.js +325 -0
  530. package/dist/kiro/build/src/narrative/source-ids.d.ts +121 -0
  531. package/dist/kiro/build/src/narrative/source-ids.js +201 -0
  532. package/dist/kiro/build/src/narrative/statements.d.ts +84 -0
  533. package/dist/kiro/build/src/narrative/statements.js +347 -0
  534. package/dist/kiro/build/src/narrative/turn-spine.d.ts +19 -0
  535. package/dist/kiro/build/src/narrative/turn-spine.js +73 -0
  536. package/dist/kiro/build/src/tools/build-universal-bundles.js +8 -0
  537. package/dist/kiro/build/src/tools/generate-capability-matrix.d.ts +7 -0
  538. package/dist/kiro/build/src/tools/generate-capability-matrix.js +207 -0
  539. package/dist/kiro/build/src/tools/validate-source-tree.js +5 -1
  540. package/dist/kiro/context/scripts/hooks/stop-goal-fit.js +182 -9
  541. package/dist/kiro/context/scripts/hooks/workflow-steering.js +160 -19
  542. package/dist/kiro/context/scripts/telemetry/lib/session.sh +3 -0
  543. package/dist/kiro/context/scripts/telemetry/lib/transport.sh +12 -3
  544. package/dist/kiro/context/scripts/telemetry/telemetry.sh +480 -59
  545. package/dist/kiro/docs/context-map.md +4 -0
  546. package/dist/kiro/docs/decisions/index.md +1 -0
  547. package/dist/kiro/docs/decisions/writer-observed-execution.md +51 -0
  548. package/dist/kiro/docs/fixture-ownership.md +5 -1
  549. package/dist/kiro/docs/migrations.md +19 -4
  550. package/dist/kiro/docs/public-workflow-cli.md +9 -0
  551. package/dist/kiro/docs/spec/builder-flow-runtime.md +49 -8
  552. package/dist/kiro/docs/spec/runtime-hook-surface.md +29 -1
  553. package/dist/kiro/docs/specs/economics-record-contract.md +1 -1
  554. package/dist/kiro/docs/specs/harness-capability-matrix.md +63 -21
  555. package/dist/kiro/docs/workflow-usage-guide.md +4 -1
  556. package/dist/kiro/evals/ci/run-baseline.sh +38 -0
  557. package/dist/kiro/evals/fixtures/narrative-evals/README.md +62 -0
  558. package/dist/kiro/evals/fixtures/narrative-evals/corpus.json +129 -0
  559. package/dist/kiro/evals/fixtures/narrative-evals/scorer.mjs +522 -0
  560. package/dist/kiro/evals/fixtures/narrative-grounding-validator/corpus.json +20 -0
  561. package/dist/kiro/evals/fixtures/narrative-grounding-validator/prompt-injection-adversarial.txt +1 -0
  562. package/dist/kiro/evals/fixtures/narrative-grounding-validator/prompt-injection-control.txt +1 -0
  563. package/dist/kiro/evals/fixtures/narrative-grounding-validator/scorer.mjs +201 -0
  564. package/dist/kiro/evals/fixtures/narrative-prose-renderer/corpus.json +15 -0
  565. package/dist/kiro/evals/fixtures/narrative-prose-renderer/scorer.mjs +201 -0
  566. package/dist/kiro/evals/fixtures/narrative-sources/expected-capture-completeness.json +13 -0
  567. package/dist/kiro/evals/fixtures/narrative-sources/flow/runs/run-fixture/report.json +1 -0
  568. package/dist/kiro/evals/fixtures/narrative-sources/flow/runs/run-fixture/state.json +1 -0
  569. package/dist/kiro/evals/fixtures/narrative-sources/flow/runs/run-runtime/state.json +1 -0
  570. package/dist/kiro/evals/fixtures/narrative-sources/repo/created.txt +1 -0
  571. package/dist/kiro/evals/fixtures/narrative-sources/repo/fixture.txt +1 -0
  572. package/dist/kiro/evals/fixtures/narrative-sources/session/agents/agent-fixture/events.jsonl +2 -0
  573. package/dist/kiro/evals/fixtures/narrative-sources/session/agents/nested-worker/events.jsonl +1 -0
  574. package/dist/kiro/evals/fixtures/narrative-sources/session/trust.bundle +1 -0
  575. package/dist/kiro/evals/fixtures/narrative-sources/telemetry/full.jsonl +3 -0
  576. package/dist/kiro/evals/fixtures/narrative-sources/telemetry/runtime.jsonl +4 -0
  577. package/dist/kiro/evals/fixtures/narrative-sources/transcripts/session.txt +1 -0
  578. package/dist/kiro/evals/integration/test_capability_declarations.sh +183 -0
  579. package/dist/kiro/evals/integration/test_economics_record.sh +42 -0
  580. package/dist/kiro/evals/integration/test_fixture_retirement_audit.sh +2 -2
  581. package/dist/kiro/evals/integration/test_gate_review_inquiry_records.sh +42 -35
  582. package/dist/kiro/evals/integration/test_goal_fit_hook.sh +13 -5
  583. package/dist/kiro/evals/integration/test_goal_fit_narrative_exclusion.sh +68 -0
  584. package/dist/kiro/evals/integration/test_narrative_evals.sh +174 -0
  585. package/dist/kiro/evals/integration/test_narrative_grounded_envelope.sh +280 -0
  586. package/dist/kiro/evals/integration/test_narrative_grounding_validator.sh +166 -0
  587. package/dist/kiro/evals/integration/test_narrative_intent_annotation.sh +205 -0
  588. package/dist/kiro/evals/integration/test_narrative_prose_renderer.sh +239 -0
  589. package/dist/kiro/evals/integration/test_narrative_redaction_failclosed.sh +120 -0
  590. package/dist/kiro/evals/integration/test_narrative_runtime_projection.sh +146 -0
  591. package/dist/kiro/evals/integration/test_narrative_source_contract.sh +228 -0
  592. package/dist/kiro/evals/integration/test_narrative_trust_isolation.sh +408 -0
  593. package/dist/kiro/evals/integration/test_plain_stop_messaging.sh +91 -0
  594. package/dist/kiro/evals/integration/test_session_resume_roundtrip.sh +228 -0
  595. package/dist/kiro/evals/integration/test_telemetry_action_class.sh +265 -0
  596. package/dist/kiro/evals/integration/test_telemetry_delegation.sh +291 -0
  597. package/dist/kiro/evals/integration/test_telemetry_sanitize_usage.sh +155 -0
  598. package/dist/kiro/evals/integration/test_telemetry_task_slug.sh +158 -0
  599. package/dist/kiro/evals/integration/test_telemetry_tool_outcome.sh +279 -0
  600. package/dist/kiro/evals/integration/test_workflow_sidecar_writer.sh +111 -2
  601. package/dist/kiro/evals/run.sh +12 -0
  602. package/dist/kiro/evals/static/test_library_exports.sh +5 -0
  603. package/dist/kiro/install.sh +1 -1
  604. package/dist/kiro/schemas/grounded-execution-narrative.schema.json +292 -0
  605. package/dist/kiro/schemas/narrative-eval-result.schema.json +205 -0
  606. package/dist/kiro/schemas/narrative-runtime-projection.schema.json +134 -0
  607. package/dist/kiro/schemas/narrative-source-manifest.schema.json +294 -0
  608. package/dist/kiro/scripts/check-hachure-boundary.mjs +81 -0
  609. package/dist/kiro/scripts/hooks/stop-goal-fit.js +182 -9
  610. package/dist/kiro/scripts/hooks/workflow-steering.js +160 -19
  611. package/dist/kiro/scripts/telemetry/economics-record.schema.json +1 -1
  612. package/dist/kiro/scripts/telemetry/economics-record.sh +47 -3
  613. package/dist/kiro/scripts/telemetry/lib/session.sh +3 -0
  614. package/dist/kiro/scripts/telemetry/lib/transport.sh +12 -3
  615. package/dist/kiro/scripts/telemetry/telemetry.sh +480 -59
  616. package/dist/opencode/build/generated/capability-declarations.json +177 -0
  617. package/dist/opencode/build/package.json +1 -1
  618. package/dist/opencode/build/src/builder-flow-runtime.d.ts +37 -0
  619. package/dist/opencode/build/src/builder-flow-runtime.js +71 -1
  620. package/dist/opencode/build/src/builder-gate-action-envelope.d.ts +58 -7
  621. package/dist/opencode/build/src/builder-gate-action-envelope.js +160 -28
  622. package/dist/opencode/build/src/builder-lifecycle-authority.d.ts +26 -0
  623. package/dist/opencode/build/src/builder-lifecycle-authority.js +38 -0
  624. package/dist/opencode/build/src/cli/builder-run.js +71 -2
  625. package/dist/opencode/build/src/cli/narrative-render.d.ts +95 -0
  626. package/dist/opencode/build/src/cli/narrative-render.js +466 -0
  627. package/dist/opencode/build/src/cli/narrative-sources.d.ts +2 -0
  628. package/dist/opencode/build/src/cli/narrative-sources.js +282 -0
  629. package/dist/opencode/build/src/cli/public-contracts.d.ts +257 -0
  630. package/dist/opencode/build/src/cli/public-contracts.js +87 -0
  631. package/dist/opencode/build/src/cli/workflow-sidecar.d.ts +28 -12
  632. package/dist/opencode/build/src/cli/workflow-sidecar.js +599 -180
  633. package/dist/opencode/build/src/cli/workflow.js +11 -1
  634. package/dist/opencode/build/src/cli.js +8 -0
  635. package/dist/opencode/build/src/continuation-driver.d.ts +12 -0
  636. package/dist/opencode/build/src/continuation-driver.js +16 -2
  637. package/dist/opencode/build/src/continuation-validation.js +324 -8
  638. package/dist/opencode/build/src/flow-kit/action-metadata.js +21 -1
  639. package/dist/opencode/build/src/index.d.ts +33 -2
  640. package/dist/opencode/build/src/index.js +24 -0
  641. package/dist/opencode/build/src/lib/capability-declarations.d.ts +83 -0
  642. package/dist/opencode/build/src/lib/capability-declarations.js +209 -0
  643. package/dist/opencode/build/src/narrative/envelope.d.ts +111 -0
  644. package/dist/opencode/build/src/narrative/envelope.js +590 -0
  645. package/dist/opencode/build/src/narrative/eval-result.d.ts +60 -0
  646. package/dist/opencode/build/src/narrative/eval-result.js +158 -0
  647. package/dist/opencode/build/src/narrative/grounding-validator.d.ts +104 -0
  648. package/dist/opencode/build/src/narrative/grounding-validator.js +472 -0
  649. package/dist/opencode/build/src/narrative/integrity.d.ts +17 -0
  650. package/dist/opencode/build/src/narrative/integrity.js +39 -0
  651. package/dist/opencode/build/src/narrative/intent-economics.d.ts +42 -0
  652. package/dist/opencode/build/src/narrative/intent-economics.js +82 -0
  653. package/dist/opencode/build/src/narrative/intent.d.ts +94 -0
  654. package/dist/opencode/build/src/narrative/intent.js +132 -0
  655. package/dist/opencode/build/src/narrative/policy-filter.d.ts +15 -0
  656. package/dist/opencode/build/src/narrative/policy-filter.js +58 -0
  657. package/dist/opencode/build/src/narrative/projection.d.ts +58 -0
  658. package/dist/opencode/build/src/narrative/projection.js +502 -0
  659. package/dist/opencode/build/src/narrative/readers.d.ts +84 -0
  660. package/dist/opencode/build/src/narrative/readers.js +406 -0
  661. package/dist/opencode/build/src/narrative/render.d.ts +3 -0
  662. package/dist/opencode/build/src/narrative/render.js +83 -0
  663. package/dist/opencode/build/src/narrative/resolver.d.ts +52 -0
  664. package/dist/opencode/build/src/narrative/resolver.js +190 -0
  665. package/dist/opencode/build/src/narrative/snapshot.d.ts +90 -0
  666. package/dist/opencode/build/src/narrative/snapshot.js +325 -0
  667. package/dist/opencode/build/src/narrative/source-ids.d.ts +121 -0
  668. package/dist/opencode/build/src/narrative/source-ids.js +201 -0
  669. package/dist/opencode/build/src/narrative/statements.d.ts +84 -0
  670. package/dist/opencode/build/src/narrative/statements.js +347 -0
  671. package/dist/opencode/build/src/narrative/turn-spine.d.ts +19 -0
  672. package/dist/opencode/build/src/narrative/turn-spine.js +73 -0
  673. package/dist/opencode/build/src/tools/build-universal-bundles.js +8 -0
  674. package/dist/opencode/build/src/tools/generate-capability-matrix.d.ts +7 -0
  675. package/dist/opencode/build/src/tools/generate-capability-matrix.js +207 -0
  676. package/dist/opencode/build/src/tools/validate-source-tree.js +5 -1
  677. package/dist/opencode/context/scripts/hooks/stop-goal-fit.js +182 -9
  678. package/dist/opencode/context/scripts/hooks/workflow-steering.js +160 -19
  679. package/dist/opencode/context/scripts/telemetry/lib/session.sh +3 -0
  680. package/dist/opencode/context/scripts/telemetry/lib/transport.sh +12 -3
  681. package/dist/opencode/context/scripts/telemetry/telemetry.sh +480 -59
  682. package/dist/opencode/docs/context-map.md +4 -0
  683. package/dist/opencode/docs/decisions/index.md +1 -0
  684. package/dist/opencode/docs/decisions/writer-observed-execution.md +51 -0
  685. package/dist/opencode/docs/fixture-ownership.md +5 -1
  686. package/dist/opencode/docs/migrations.md +19 -4
  687. package/dist/opencode/docs/public-workflow-cli.md +9 -0
  688. package/dist/opencode/docs/spec/builder-flow-runtime.md +49 -8
  689. package/dist/opencode/docs/spec/runtime-hook-surface.md +29 -1
  690. package/dist/opencode/docs/specs/economics-record-contract.md +1 -1
  691. package/dist/opencode/docs/specs/harness-capability-matrix.md +63 -21
  692. package/dist/opencode/docs/workflow-usage-guide.md +4 -1
  693. package/dist/opencode/evals/ci/run-baseline.sh +38 -0
  694. package/dist/opencode/evals/fixtures/narrative-evals/README.md +62 -0
  695. package/dist/opencode/evals/fixtures/narrative-evals/corpus.json +129 -0
  696. package/dist/opencode/evals/fixtures/narrative-evals/scorer.mjs +522 -0
  697. package/dist/opencode/evals/fixtures/narrative-grounding-validator/corpus.json +20 -0
  698. package/dist/opencode/evals/fixtures/narrative-grounding-validator/prompt-injection-adversarial.txt +1 -0
  699. package/dist/opencode/evals/fixtures/narrative-grounding-validator/prompt-injection-control.txt +1 -0
  700. package/dist/opencode/evals/fixtures/narrative-grounding-validator/scorer.mjs +201 -0
  701. package/dist/opencode/evals/fixtures/narrative-prose-renderer/corpus.json +15 -0
  702. package/dist/opencode/evals/fixtures/narrative-prose-renderer/scorer.mjs +201 -0
  703. package/dist/opencode/evals/fixtures/narrative-sources/expected-capture-completeness.json +13 -0
  704. package/dist/opencode/evals/fixtures/narrative-sources/flow/runs/run-fixture/report.json +1 -0
  705. package/dist/opencode/evals/fixtures/narrative-sources/flow/runs/run-fixture/state.json +1 -0
  706. package/dist/opencode/evals/fixtures/narrative-sources/flow/runs/run-runtime/state.json +1 -0
  707. package/dist/opencode/evals/fixtures/narrative-sources/repo/created.txt +1 -0
  708. package/dist/opencode/evals/fixtures/narrative-sources/repo/fixture.txt +1 -0
  709. package/dist/opencode/evals/fixtures/narrative-sources/session/agents/agent-fixture/events.jsonl +2 -0
  710. package/dist/opencode/evals/fixtures/narrative-sources/session/agents/nested-worker/events.jsonl +1 -0
  711. package/dist/opencode/evals/fixtures/narrative-sources/session/trust.bundle +1 -0
  712. package/dist/opencode/evals/fixtures/narrative-sources/telemetry/full.jsonl +3 -0
  713. package/dist/opencode/evals/fixtures/narrative-sources/telemetry/runtime.jsonl +4 -0
  714. package/dist/opencode/evals/fixtures/narrative-sources/transcripts/session.txt +1 -0
  715. package/dist/opencode/evals/integration/test_capability_declarations.sh +183 -0
  716. package/dist/opencode/evals/integration/test_economics_record.sh +42 -0
  717. package/dist/opencode/evals/integration/test_fixture_retirement_audit.sh +2 -2
  718. package/dist/opencode/evals/integration/test_gate_review_inquiry_records.sh +42 -35
  719. package/dist/opencode/evals/integration/test_goal_fit_hook.sh +13 -5
  720. package/dist/opencode/evals/integration/test_goal_fit_narrative_exclusion.sh +68 -0
  721. package/dist/opencode/evals/integration/test_narrative_evals.sh +174 -0
  722. package/dist/opencode/evals/integration/test_narrative_grounded_envelope.sh +280 -0
  723. package/dist/opencode/evals/integration/test_narrative_grounding_validator.sh +166 -0
  724. package/dist/opencode/evals/integration/test_narrative_intent_annotation.sh +205 -0
  725. package/dist/opencode/evals/integration/test_narrative_prose_renderer.sh +239 -0
  726. package/dist/opencode/evals/integration/test_narrative_redaction_failclosed.sh +120 -0
  727. package/dist/opencode/evals/integration/test_narrative_runtime_projection.sh +146 -0
  728. package/dist/opencode/evals/integration/test_narrative_source_contract.sh +228 -0
  729. package/dist/opencode/evals/integration/test_narrative_trust_isolation.sh +408 -0
  730. package/dist/opencode/evals/integration/test_plain_stop_messaging.sh +91 -0
  731. package/dist/opencode/evals/integration/test_session_resume_roundtrip.sh +228 -0
  732. package/dist/opencode/evals/integration/test_telemetry_action_class.sh +265 -0
  733. package/dist/opencode/evals/integration/test_telemetry_delegation.sh +291 -0
  734. package/dist/opencode/evals/integration/test_telemetry_sanitize_usage.sh +155 -0
  735. package/dist/opencode/evals/integration/test_telemetry_task_slug.sh +158 -0
  736. package/dist/opencode/evals/integration/test_telemetry_tool_outcome.sh +279 -0
  737. package/dist/opencode/evals/integration/test_workflow_sidecar_writer.sh +111 -2
  738. package/dist/opencode/evals/run.sh +12 -0
  739. package/dist/opencode/evals/static/test_library_exports.sh +5 -0
  740. package/dist/opencode/install.sh +1 -1
  741. package/dist/opencode/schemas/grounded-execution-narrative.schema.json +292 -0
  742. package/dist/opencode/schemas/narrative-eval-result.schema.json +205 -0
  743. package/dist/opencode/schemas/narrative-runtime-projection.schema.json +134 -0
  744. package/dist/opencode/schemas/narrative-source-manifest.schema.json +294 -0
  745. package/dist/opencode/scripts/check-hachure-boundary.mjs +81 -0
  746. package/dist/opencode/scripts/hooks/stop-goal-fit.js +182 -9
  747. package/dist/opencode/scripts/hooks/workflow-steering.js +160 -19
  748. package/dist/opencode/scripts/telemetry/economics-record.schema.json +1 -1
  749. package/dist/opencode/scripts/telemetry/economics-record.sh +47 -3
  750. package/dist/opencode/scripts/telemetry/lib/session.sh +3 -0
  751. package/dist/opencode/scripts/telemetry/lib/transport.sh +12 -3
  752. package/dist/opencode/scripts/telemetry/telemetry.sh +480 -59
  753. package/dist/pi/build/generated/capability-declarations.json +177 -0
  754. package/dist/pi/build/package.json +1 -1
  755. package/dist/pi/build/src/builder-flow-runtime.d.ts +37 -0
  756. package/dist/pi/build/src/builder-flow-runtime.js +71 -1
  757. package/dist/pi/build/src/builder-gate-action-envelope.d.ts +58 -7
  758. package/dist/pi/build/src/builder-gate-action-envelope.js +160 -28
  759. package/dist/pi/build/src/builder-lifecycle-authority.d.ts +26 -0
  760. package/dist/pi/build/src/builder-lifecycle-authority.js +38 -0
  761. package/dist/pi/build/src/cli/builder-run.js +71 -2
  762. package/dist/pi/build/src/cli/narrative-render.d.ts +95 -0
  763. package/dist/pi/build/src/cli/narrative-render.js +466 -0
  764. package/dist/pi/build/src/cli/narrative-sources.d.ts +2 -0
  765. package/dist/pi/build/src/cli/narrative-sources.js +282 -0
  766. package/dist/pi/build/src/cli/public-contracts.d.ts +257 -0
  767. package/dist/pi/build/src/cli/public-contracts.js +87 -0
  768. package/dist/pi/build/src/cli/workflow-sidecar.d.ts +28 -12
  769. package/dist/pi/build/src/cli/workflow-sidecar.js +599 -180
  770. package/dist/pi/build/src/cli/workflow.js +11 -1
  771. package/dist/pi/build/src/cli.js +8 -0
  772. package/dist/pi/build/src/continuation-driver.d.ts +12 -0
  773. package/dist/pi/build/src/continuation-driver.js +16 -2
  774. package/dist/pi/build/src/continuation-validation.js +324 -8
  775. package/dist/pi/build/src/flow-kit/action-metadata.js +21 -1
  776. package/dist/pi/build/src/index.d.ts +33 -2
  777. package/dist/pi/build/src/index.js +24 -0
  778. package/dist/pi/build/src/lib/capability-declarations.d.ts +83 -0
  779. package/dist/pi/build/src/lib/capability-declarations.js +209 -0
  780. package/dist/pi/build/src/narrative/envelope.d.ts +111 -0
  781. package/dist/pi/build/src/narrative/envelope.js +590 -0
  782. package/dist/pi/build/src/narrative/eval-result.d.ts +60 -0
  783. package/dist/pi/build/src/narrative/eval-result.js +158 -0
  784. package/dist/pi/build/src/narrative/grounding-validator.d.ts +104 -0
  785. package/dist/pi/build/src/narrative/grounding-validator.js +472 -0
  786. package/dist/pi/build/src/narrative/integrity.d.ts +17 -0
  787. package/dist/pi/build/src/narrative/integrity.js +39 -0
  788. package/dist/pi/build/src/narrative/intent-economics.d.ts +42 -0
  789. package/dist/pi/build/src/narrative/intent-economics.js +82 -0
  790. package/dist/pi/build/src/narrative/intent.d.ts +94 -0
  791. package/dist/pi/build/src/narrative/intent.js +132 -0
  792. package/dist/pi/build/src/narrative/policy-filter.d.ts +15 -0
  793. package/dist/pi/build/src/narrative/policy-filter.js +58 -0
  794. package/dist/pi/build/src/narrative/projection.d.ts +58 -0
  795. package/dist/pi/build/src/narrative/projection.js +502 -0
  796. package/dist/pi/build/src/narrative/readers.d.ts +84 -0
  797. package/dist/pi/build/src/narrative/readers.js +406 -0
  798. package/dist/pi/build/src/narrative/render.d.ts +3 -0
  799. package/dist/pi/build/src/narrative/render.js +83 -0
  800. package/dist/pi/build/src/narrative/resolver.d.ts +52 -0
  801. package/dist/pi/build/src/narrative/resolver.js +190 -0
  802. package/dist/pi/build/src/narrative/snapshot.d.ts +90 -0
  803. package/dist/pi/build/src/narrative/snapshot.js +325 -0
  804. package/dist/pi/build/src/narrative/source-ids.d.ts +121 -0
  805. package/dist/pi/build/src/narrative/source-ids.js +201 -0
  806. package/dist/pi/build/src/narrative/statements.d.ts +84 -0
  807. package/dist/pi/build/src/narrative/statements.js +347 -0
  808. package/dist/pi/build/src/narrative/turn-spine.d.ts +19 -0
  809. package/dist/pi/build/src/narrative/turn-spine.js +73 -0
  810. package/dist/pi/build/src/tools/build-universal-bundles.js +8 -0
  811. package/dist/pi/build/src/tools/generate-capability-matrix.d.ts +7 -0
  812. package/dist/pi/build/src/tools/generate-capability-matrix.js +207 -0
  813. package/dist/pi/build/src/tools/validate-source-tree.js +5 -1
  814. package/dist/pi/context/scripts/hooks/stop-goal-fit.js +182 -9
  815. package/dist/pi/context/scripts/hooks/workflow-steering.js +160 -19
  816. package/dist/pi/context/scripts/telemetry/lib/session.sh +3 -0
  817. package/dist/pi/context/scripts/telemetry/lib/transport.sh +12 -3
  818. package/dist/pi/context/scripts/telemetry/telemetry.sh +480 -59
  819. package/dist/pi/docs/context-map.md +4 -0
  820. package/dist/pi/docs/decisions/index.md +1 -0
  821. package/dist/pi/docs/decisions/writer-observed-execution.md +51 -0
  822. package/dist/pi/docs/fixture-ownership.md +5 -1
  823. package/dist/pi/docs/migrations.md +19 -4
  824. package/dist/pi/docs/public-workflow-cli.md +9 -0
  825. package/dist/pi/docs/spec/builder-flow-runtime.md +49 -8
  826. package/dist/pi/docs/spec/runtime-hook-surface.md +29 -1
  827. package/dist/pi/docs/specs/economics-record-contract.md +1 -1
  828. package/dist/pi/docs/specs/harness-capability-matrix.md +63 -21
  829. package/dist/pi/docs/workflow-usage-guide.md +4 -1
  830. package/dist/pi/evals/ci/run-baseline.sh +38 -0
  831. package/dist/pi/evals/fixtures/narrative-evals/README.md +62 -0
  832. package/dist/pi/evals/fixtures/narrative-evals/corpus.json +129 -0
  833. package/dist/pi/evals/fixtures/narrative-evals/scorer.mjs +522 -0
  834. package/dist/pi/evals/fixtures/narrative-grounding-validator/corpus.json +20 -0
  835. package/dist/pi/evals/fixtures/narrative-grounding-validator/prompt-injection-adversarial.txt +1 -0
  836. package/dist/pi/evals/fixtures/narrative-grounding-validator/prompt-injection-control.txt +1 -0
  837. package/dist/pi/evals/fixtures/narrative-grounding-validator/scorer.mjs +201 -0
  838. package/dist/pi/evals/fixtures/narrative-prose-renderer/corpus.json +15 -0
  839. package/dist/pi/evals/fixtures/narrative-prose-renderer/scorer.mjs +201 -0
  840. package/dist/pi/evals/fixtures/narrative-sources/expected-capture-completeness.json +13 -0
  841. package/dist/pi/evals/fixtures/narrative-sources/flow/runs/run-fixture/report.json +1 -0
  842. package/dist/pi/evals/fixtures/narrative-sources/flow/runs/run-fixture/state.json +1 -0
  843. package/dist/pi/evals/fixtures/narrative-sources/flow/runs/run-runtime/state.json +1 -0
  844. package/dist/pi/evals/fixtures/narrative-sources/repo/created.txt +1 -0
  845. package/dist/pi/evals/fixtures/narrative-sources/repo/fixture.txt +1 -0
  846. package/dist/pi/evals/fixtures/narrative-sources/session/agents/agent-fixture/events.jsonl +2 -0
  847. package/dist/pi/evals/fixtures/narrative-sources/session/agents/nested-worker/events.jsonl +1 -0
  848. package/dist/pi/evals/fixtures/narrative-sources/session/trust.bundle +1 -0
  849. package/dist/pi/evals/fixtures/narrative-sources/telemetry/full.jsonl +3 -0
  850. package/dist/pi/evals/fixtures/narrative-sources/telemetry/runtime.jsonl +4 -0
  851. package/dist/pi/evals/fixtures/narrative-sources/transcripts/session.txt +1 -0
  852. package/dist/pi/evals/integration/test_capability_declarations.sh +183 -0
  853. package/dist/pi/evals/integration/test_economics_record.sh +42 -0
  854. package/dist/pi/evals/integration/test_fixture_retirement_audit.sh +2 -2
  855. package/dist/pi/evals/integration/test_gate_review_inquiry_records.sh +42 -35
  856. package/dist/pi/evals/integration/test_goal_fit_hook.sh +13 -5
  857. package/dist/pi/evals/integration/test_goal_fit_narrative_exclusion.sh +68 -0
  858. package/dist/pi/evals/integration/test_narrative_evals.sh +174 -0
  859. package/dist/pi/evals/integration/test_narrative_grounded_envelope.sh +280 -0
  860. package/dist/pi/evals/integration/test_narrative_grounding_validator.sh +166 -0
  861. package/dist/pi/evals/integration/test_narrative_intent_annotation.sh +205 -0
  862. package/dist/pi/evals/integration/test_narrative_prose_renderer.sh +239 -0
  863. package/dist/pi/evals/integration/test_narrative_redaction_failclosed.sh +120 -0
  864. package/dist/pi/evals/integration/test_narrative_runtime_projection.sh +146 -0
  865. package/dist/pi/evals/integration/test_narrative_source_contract.sh +228 -0
  866. package/dist/pi/evals/integration/test_narrative_trust_isolation.sh +408 -0
  867. package/dist/pi/evals/integration/test_plain_stop_messaging.sh +91 -0
  868. package/dist/pi/evals/integration/test_session_resume_roundtrip.sh +228 -0
  869. package/dist/pi/evals/integration/test_telemetry_action_class.sh +265 -0
  870. package/dist/pi/evals/integration/test_telemetry_delegation.sh +291 -0
  871. package/dist/pi/evals/integration/test_telemetry_sanitize_usage.sh +155 -0
  872. package/dist/pi/evals/integration/test_telemetry_task_slug.sh +158 -0
  873. package/dist/pi/evals/integration/test_telemetry_tool_outcome.sh +279 -0
  874. package/dist/pi/evals/integration/test_workflow_sidecar_writer.sh +111 -2
  875. package/dist/pi/evals/run.sh +12 -0
  876. package/dist/pi/evals/static/test_library_exports.sh +5 -0
  877. package/dist/pi/install.sh +1 -1
  878. package/dist/pi/schemas/grounded-execution-narrative.schema.json +292 -0
  879. package/dist/pi/schemas/narrative-eval-result.schema.json +205 -0
  880. package/dist/pi/schemas/narrative-runtime-projection.schema.json +134 -0
  881. package/dist/pi/schemas/narrative-source-manifest.schema.json +294 -0
  882. package/dist/pi/scripts/check-hachure-boundary.mjs +81 -0
  883. package/dist/pi/scripts/hooks/stop-goal-fit.js +182 -9
  884. package/dist/pi/scripts/hooks/workflow-steering.js +160 -19
  885. package/dist/pi/scripts/telemetry/economics-record.schema.json +1 -1
  886. package/dist/pi/scripts/telemetry/economics-record.sh +47 -3
  887. package/dist/pi/scripts/telemetry/lib/session.sh +3 -0
  888. package/dist/pi/scripts/telemetry/lib/transport.sh +12 -3
  889. package/dist/pi/scripts/telemetry/telemetry.sh +480 -59
  890. package/docs/context-map.md +4 -0
  891. package/docs/decisions/index.md +1 -0
  892. package/docs/decisions/writer-observed-execution.md +51 -0
  893. package/docs/fixture-ownership.md +5 -1
  894. package/docs/migrations.md +19 -4
  895. package/docs/public-workflow-cli.md +9 -0
  896. package/docs/spec/builder-flow-runtime.md +49 -8
  897. package/docs/spec/runtime-hook-surface.md +29 -1
  898. package/docs/specs/economics-record-contract.md +1 -1
  899. package/docs/specs/harness-capability-matrix.md +63 -21
  900. package/docs/workflow-usage-guide.md +4 -1
  901. package/evals/ci/run-baseline.sh +38 -0
  902. package/evals/fixtures/narrative-evals/README.md +62 -0
  903. package/evals/fixtures/narrative-evals/corpus.json +129 -0
  904. package/evals/fixtures/narrative-evals/scorer.mjs +522 -0
  905. package/evals/fixtures/narrative-grounding-validator/corpus.json +20 -0
  906. package/evals/fixtures/narrative-grounding-validator/prompt-injection-adversarial.txt +1 -0
  907. package/evals/fixtures/narrative-grounding-validator/prompt-injection-control.txt +1 -0
  908. package/evals/fixtures/narrative-grounding-validator/scorer.mjs +201 -0
  909. package/evals/fixtures/narrative-prose-renderer/corpus.json +15 -0
  910. package/evals/fixtures/narrative-prose-renderer/scorer.mjs +201 -0
  911. package/evals/fixtures/narrative-sources/expected-capture-completeness.json +13 -0
  912. package/evals/fixtures/narrative-sources/flow/runs/run-fixture/report.json +1 -0
  913. package/evals/fixtures/narrative-sources/flow/runs/run-fixture/state.json +1 -0
  914. package/evals/fixtures/narrative-sources/flow/runs/run-runtime/state.json +1 -0
  915. package/evals/fixtures/narrative-sources/repo/created.txt +1 -0
  916. package/evals/fixtures/narrative-sources/repo/fixture.txt +1 -0
  917. package/evals/fixtures/narrative-sources/session/agents/agent-fixture/events.jsonl +2 -0
  918. package/evals/fixtures/narrative-sources/session/agents/nested-worker/events.jsonl +1 -0
  919. package/evals/fixtures/narrative-sources/session/trust.bundle +1 -0
  920. package/evals/fixtures/narrative-sources/telemetry/full.jsonl +3 -0
  921. package/evals/fixtures/narrative-sources/telemetry/runtime.jsonl +4 -0
  922. package/evals/fixtures/narrative-sources/transcripts/session.txt +1 -0
  923. package/evals/integration/test_capability_declarations.sh +183 -0
  924. package/evals/integration/test_economics_record.sh +42 -0
  925. package/evals/integration/test_fixture_retirement_audit.sh +2 -2
  926. package/evals/integration/test_gate_review_inquiry_records.sh +42 -35
  927. package/evals/integration/test_goal_fit_hook.sh +13 -5
  928. package/evals/integration/test_goal_fit_narrative_exclusion.sh +68 -0
  929. package/evals/integration/test_narrative_evals.sh +174 -0
  930. package/evals/integration/test_narrative_grounded_envelope.sh +280 -0
  931. package/evals/integration/test_narrative_grounding_validator.sh +166 -0
  932. package/evals/integration/test_narrative_intent_annotation.sh +205 -0
  933. package/evals/integration/test_narrative_prose_renderer.sh +239 -0
  934. package/evals/integration/test_narrative_redaction_failclosed.sh +120 -0
  935. package/evals/integration/test_narrative_runtime_projection.sh +146 -0
  936. package/evals/integration/test_narrative_source_contract.sh +228 -0
  937. package/evals/integration/test_narrative_trust_isolation.sh +408 -0
  938. package/evals/integration/test_plain_stop_messaging.sh +91 -0
  939. package/evals/integration/test_session_resume_roundtrip.sh +228 -0
  940. package/evals/integration/test_telemetry_action_class.sh +265 -0
  941. package/evals/integration/test_telemetry_delegation.sh +291 -0
  942. package/evals/integration/test_telemetry_sanitize_usage.sh +155 -0
  943. package/evals/integration/test_telemetry_task_slug.sh +158 -0
  944. package/evals/integration/test_telemetry_tool_outcome.sh +279 -0
  945. package/evals/integration/test_workflow_sidecar_writer.sh +111 -2
  946. package/evals/run.sh +12 -0
  947. package/evals/static/test_library_exports.sh +5 -0
  948. package/package.json +9 -5
  949. package/schemas/grounded-execution-narrative.schema.json +292 -0
  950. package/schemas/narrative-eval-result.schema.json +205 -0
  951. package/schemas/narrative-runtime-projection.schema.json +134 -0
  952. package/schemas/narrative-source-manifest.schema.json +294 -0
  953. package/scripts/check-hachure-boundary.mjs +81 -0
  954. package/scripts/hooks/stop-goal-fit.js +182 -9
  955. package/scripts/hooks/workflow-steering.js +160 -19
  956. package/scripts/telemetry/economics-record.schema.json +1 -1
  957. package/scripts/telemetry/economics-record.sh +47 -3
  958. package/scripts/telemetry/lib/session.sh +3 -0
  959. package/scripts/telemetry/lib/transport.sh +12 -3
  960. package/scripts/telemetry/telemetry.sh +480 -59
  961. package/src/builder-flow-runtime.ts +102 -1
  962. package/src/builder-gate-action-envelope.ts +212 -35
  963. package/src/builder-lifecycle-authority.ts +48 -0
  964. package/src/cli/builder-flow-runtime.test.mjs +218 -7
  965. package/src/cli/builder-run.ts +71 -1
  966. package/src/cli/capability-declarations.test.mjs +117 -0
  967. package/src/cli/continuation-driver.test.mjs +327 -20
  968. package/src/cli/kit-metadata-security.test.mjs +90 -2
  969. package/src/cli/narrative-arch-isolation.test.mjs +198 -0
  970. package/src/cli/narrative-envelope.test.mjs +367 -0
  971. package/src/cli/narrative-grounding-validator.test.mjs +322 -0
  972. package/src/cli/narrative-intent.test.mjs +177 -0
  973. package/src/cli/narrative-policy-filter.test.mjs +66 -0
  974. package/src/cli/narrative-projection.test.mjs +236 -0
  975. package/src/cli/narrative-readers.test.mjs +196 -0
  976. package/src/cli/narrative-render.test.mjs +221 -0
  977. package/src/cli/narrative-render.ts +589 -0
  978. package/src/cli/narrative-resolver.test.mjs +114 -0
  979. package/src/cli/narrative-snapshot.test.mjs +149 -0
  980. package/src/cli/narrative-source-ids.test.mjs +84 -0
  981. package/src/cli/narrative-sources.ts +276 -0
  982. package/src/cli/narrative-statements.test.mjs +369 -0
  983. package/src/cli/narrative-turn-spine.test.mjs +74 -0
  984. package/src/cli/public-api.test.mjs +17 -0
  985. package/src/cli/public-contracts.ts +95 -0
  986. package/src/cli/sidecar-pure-helpers.test.mjs +216 -24
  987. package/src/cli/trust-bundle-policy-order.test.mjs +134 -1
  988. package/src/cli/workflow-sidecar.ts +563 -167
  989. package/src/cli/workflow.ts +15 -1
  990. package/src/cli/writer-observed-execution.test.mjs +102 -0
  991. package/src/cli.ts +8 -0
  992. package/src/continuation-driver.ts +32 -3
  993. package/src/continuation-validation.ts +336 -8
  994. package/src/flow-kit/action-metadata.ts +20 -1
  995. package/src/index.ts +241 -0
  996. package/src/lib/capability-declarations.ts +261 -0
  997. package/src/narrative/envelope.ts +624 -0
  998. package/src/narrative/eval-result.ts +175 -0
  999. package/src/narrative/grounding-validator.ts +610 -0
  1000. package/src/narrative/integrity.ts +53 -0
  1001. package/src/narrative/intent-economics.ts +119 -0
  1002. package/src/narrative/intent.ts +216 -0
  1003. package/src/narrative/policy-filter.ts +66 -0
  1004. package/src/narrative/projection.ts +530 -0
  1005. package/src/narrative/readers.ts +427 -0
  1006. package/src/narrative/render.ts +82 -0
  1007. package/src/narrative/resolver.ts +195 -0
  1008. package/src/narrative/snapshot.ts +365 -0
  1009. package/src/narrative/source-ids.ts +294 -0
  1010. package/src/narrative/statements.ts +423 -0
  1011. package/src/narrative/turn-spine.ts +99 -0
  1012. package/src/tools/build-universal-bundles.ts +8 -0
  1013. package/src/tools/generate-capability-matrix.ts +215 -0
  1014. package/src/tools/validate-source-tree.ts +5 -1
  1015. package/build/src/cli/sidecar-claim-explain.d.ts +0 -45
  1016. package/build/src/cli/sidecar-claim-explain.js +0 -87
  1017. package/dist/base/build/src/cli/sidecar-claim-explain.d.ts +0 -45
  1018. package/dist/base/build/src/cli/sidecar-claim-explain.js +0 -87
  1019. package/dist/claude-code/build/src/cli/sidecar-claim-explain.d.ts +0 -45
  1020. package/dist/claude-code/build/src/cli/sidecar-claim-explain.js +0 -87
  1021. package/dist/codex/build/src/cli/sidecar-claim-explain.d.ts +0 -45
  1022. package/dist/codex/build/src/cli/sidecar-claim-explain.js +0 -87
  1023. package/dist/kiro/build/src/cli/sidecar-claim-explain.d.ts +0 -45
  1024. package/dist/kiro/build/src/cli/sidecar-claim-explain.js +0 -87
  1025. package/dist/opencode/build/src/cli/sidecar-claim-explain.d.ts +0 -45
  1026. package/dist/opencode/build/src/cli/sidecar-claim-explain.js +0 -87
  1027. package/dist/pi/build/src/cli/sidecar-claim-explain.d.ts +0 -45
  1028. package/dist/pi/build/src/cli/sidecar-claim-explain.js +0 -87
  1029. package/src/cli/sidecar-claim-explain.ts +0 -130
@@ -73,7 +73,7 @@ export async function main(argv) {
73
73
  }
74
74
  async function drive(sessionDir, argv, json) {
75
75
  const parsed = parseArgs(argv);
76
- assertOnlyFlags(parsed.flags, new Set(["artifact-root", "session-dir", "json", "adapter-command-file", "evidence-signing-key-file", "max-turns", "turn-timeout-ms", "barrier-wait-ms", "barrier-poll-ms"]), "workflow drive");
76
+ assertOnlyFlags(parsed.flags, new Set(["artifact-root", "session-dir", "json", "adapter-command-file", "evidence-signing-key-file", "max-turns", "turn-timeout-ms", "barrier-wait-ms", "barrier-poll-ms", "context-policy"]), "workflow drive");
77
77
  const adapterCommandFile = flagString(parsed.flags, "adapter-command-file");
78
78
  if (!adapterCommandFile)
79
79
  throw new Error("workflow drive requires --adapter-command-file <path>");
@@ -84,6 +84,7 @@ async function drive(sessionDir, argv, json) {
84
84
  const turnTimeoutMs = integerFlag(parsed.flags, "turn-timeout-ms", 900_000, 1, 86_400_000);
85
85
  const barrierWaitMs = integerFlag(parsed.flags, "barrier-wait-ms", 300_000, 0, 86_400_000);
86
86
  const barrierPollMs = integerFlag(parsed.flags, "barrier-poll-ms", 1_000, 1, 60_000);
87
+ const contextPolicy = enumFlag(parsed.flags, "context-policy", ["warm", "fresh"], "warm");
87
88
  const { slug, projectRoot } = readBoundSession(sessionDir);
88
89
  assertOrdinaryMatchingAssignmentActor(sessionDir, slug);
89
90
  const adapterCommand = loadContinuationAdapterCommand(adapterCommandFile);
@@ -98,6 +99,7 @@ async function drive(sessionDir, argv, json) {
98
99
  store: continuationStore,
99
100
  maxTurns,
100
101
  adapterCommandIdentity: adapterCommand.identity,
102
+ contextPolicy,
101
103
  authorizeTurn: async () => { assertOrdinaryMatchingAssignmentActor(sessionDir, slug); },
102
104
  issueTurnAuthority: async (request) => {
103
105
  const currentAssignment = assertOrdinaryMatchingAssignmentActor(sessionDir, slug);
@@ -815,6 +817,14 @@ function integerFlag(flags, name, fallback, min, max) {
815
817
  throw new Error(`workflow drive --${name} must be an integer from ${min} through ${max}`);
816
818
  return value;
817
819
  }
820
+ function enumFlag(flags, name, allowed, fallback) {
821
+ const raw = flagString(flags, name);
822
+ if (raw === undefined)
823
+ return fallback;
824
+ if (!allowed.includes(raw))
825
+ throw new Error(`workflow drive --${name} must be one of: ${allowed.join(", ")}`);
826
+ return raw;
827
+ }
818
828
  function isWithin(candidate, root) {
819
829
  const relative = path.relative(root, candidate);
820
830
  return relative === "" || (!relative.startsWith(`..${path.sep}`) && relative !== ".." && !path.isAbsolute(relative));
package/build/src/cli.js CHANGED
@@ -11,12 +11,15 @@ import { main as init } from "./cli/init.js";
11
11
  import { main as promoteWorkflowArtifact } from "./cli/promote-workflow-artifact.js";
12
12
  import { main as publishChange } from "./cli/publish-change-helper.js";
13
13
  import { main as pullWorkProvider } from "./cli/pull-work-provider.js";
14
+ import { main as narrativeRender } from "./cli/narrative-render.js";
15
+ import { main as narrativeSources } from "./cli/narrative-sources.js";
14
16
  import { main as telemetryDoctor } from "./cli/telemetry-doctor.js";
15
17
  import { main as usageFeedback } from "./cli/usage-feedback.js";
16
18
  import { main as veritasGovernance } from "./cli/veritas-governance.js";
17
19
  import { main as workflowArtifactCleanupAudit } from "./cli/workflow-artifact-cleanup-audit.js";
18
20
  import { main as workflow } from "./cli/workflow.js";
19
21
  import { main as buildBundles } from "./tools/build-universal-bundles.js";
22
+ import { main as capabilityMatrix } from "./tools/generate-capability-matrix.js";
20
23
  import { main as contextMap } from "./tools/generate-context-map.js";
21
24
  import { main as validateSource } from "./tools/validate-source-tree.js";
22
25
  import { main as validatePackage } from "./tools/validate-package.js";
@@ -28,6 +31,7 @@ import { main as verify } from "./cli/verify.js";
28
31
  const availableCommands = new Map([
29
32
  ["build-bundles", () => buildBundles()],
30
33
  ["builder-run", builderRun],
34
+ ["capability-matrix", capabilityMatrix],
31
35
  ["console-learning-projection", consoleLearningProjection],
32
36
  ["context-map", contextMap],
33
37
  ["assignment-provider", assignmentProvider],
@@ -35,6 +39,8 @@ const availableCommands = new Map([
35
39
  ["effective-backlog-settings", effectiveBacklogSettings],
36
40
  ["fixture-retirement-audit", fixtureRetirementAudit],
37
41
  ["kit", kit],
42
+ ["narrative-render", narrativeRender],
43
+ ["narrative-sources", narrativeSources],
38
44
  ["init", init],
39
45
  ["promote-workflow-artifact", promoteWorkflowArtifact],
40
46
  ["publish-change", publishChange],
@@ -54,6 +60,7 @@ const availableCommands = new Map([
54
60
  ]);
55
61
  const aliases = new Map([
56
62
  ["flow-agents-build-bundles", "build-bundles"],
63
+ ["flow-agents-capability-matrix", "capability-matrix"],
57
64
  ["flow-agents-console-learning-projection", "console-learning-projection"],
58
65
  ["flow-agents-context-map", "context-map"],
59
66
  ["flow-agents-assignment-provider", "assignment-provider"],
@@ -61,6 +68,7 @@ const aliases = new Map([
61
68
  ["flow-agents-effective-backlog-settings", "effective-backlog-settings"],
62
69
  ["flow-agents-fixture-retirement-audit", "fixture-retirement-audit"],
63
70
  ["flow-agents-kit", "kit"],
71
+ ["flow-agents-narrative-render", "narrative-render"],
64
72
  ["flow-agents-promote-workflow-artifact", "promote-workflow-artifact"],
65
73
  ["flow-agents-publish-change", "publish-change"],
66
74
  ["flow-agents-pull-work-provider", "pull-work-provider"],
@@ -30,6 +30,14 @@ export type ContinuationTurnRequest = {
30
30
  next_action: Record<string, unknown> | null;
31
31
  /** Additive schema-1.0 field; older external adapters remain valid. */
32
32
  gate_action_envelope?: GateActionEnvelope;
33
+ /** Product-owned context routing; adapters must not infer this from model names. */
34
+ context_strategy?: ContinuationContextStrategy;
35
+ };
36
+ export type ContinuationContextPolicy = "warm" | "fresh";
37
+ export type ContinuationContextStrategy = {
38
+ thread: "new" | "resume";
39
+ handoff: "canonical";
40
+ reason: "mission_start" | "configured_policy";
33
41
  };
34
42
  export type ContinuationTurnResult = {
35
43
  status: "completed";
@@ -50,6 +58,8 @@ export type ContinuationDriverState = {
50
58
  definition_id: string;
51
59
  max_turns: number;
52
60
  adapter_command_identity: string | null;
61
+ /** Additive to schema 1.0. Missing legacy values mean warm. */
62
+ context_policy?: ContinuationContextPolicy;
53
63
  status: "active" | "waiting" | "done" | "failed" | "budget_exhausted";
54
64
  turns_started: number;
55
65
  active_turn_step?: string | null;
@@ -130,6 +140,7 @@ export type ContinuationDriverOutcome = {
130
140
  export interface RunContinuationDriverInput {
131
141
  maxTurns: number;
132
142
  adapterCommandIdentity?: string;
143
+ contextPolicy?: ContinuationContextPolicy;
133
144
  runtime: ContinuationRuntimePort;
134
145
  store: ContinuationStateStore;
135
146
  waitForBarrier?: (barrier: ContinuationBarrier) => Promise<"ready" | "pending">;
@@ -143,6 +154,7 @@ export interface DriveBuilderFlowSessionInput {
143
154
  sessionDir: string;
144
155
  maxTurns: number;
145
156
  adapterCommandIdentity?: string;
157
+ contextPolicy?: ContinuationContextPolicy;
146
158
  execute: ContinuationRuntimePort["execute"];
147
159
  waitForBarrier?: RunContinuationDriverInput["waitForBarrier"];
148
160
  authorizeTurn?: RunContinuationDriverInput["authorizeTurn"];
@@ -16,12 +16,15 @@ export async function runContinuationDriver(input) {
16
16
  assertMaxTurns(input.maxTurns);
17
17
  const now = input.now ?? (() => new Date());
18
18
  const adapterCommandIdentity = input.adapterCommandIdentity ?? null;
19
+ const contextPolicy = input.contextPolicy ?? "warm";
19
20
  const inspected = validateSnapshot(await input.runtime.inspect());
20
- let state = loadOrCreateState(input.store, inspected, input.maxTurns, adapterCommandIdentity, now);
21
+ let state = loadOrCreateState(input.store, inspected, input.maxTurns, adapterCommandIdentity, contextPolicy, now);
21
22
  if (state.max_turns !== input.maxTurns)
22
23
  throw new Error(`continuation maxTurns ${input.maxTurns} does not match the persisted mission budget ${state.max_turns}`);
23
24
  if (state.adapter_command_identity !== adapterCommandIdentity)
24
25
  throw new Error("continuation adapter command identity does not match the persisted mission adapter");
26
+ if ((state.context_policy ?? "warm") !== contextPolicy)
27
+ throw new Error("continuation context policy does not match the persisted mission policy");
25
28
  let settled = await settleMissionStart(input, state, now);
26
29
  if (settled.outcome)
27
30
  return settled.outcome;
@@ -115,8 +118,17 @@ function continuationTurnRequest(input, state, snapshot) {
115
118
  max_turns: input.maxTurns,
116
119
  next_action: snapshot.next_action ? structuredClone(snapshot.next_action) : null,
117
120
  ...(envelope ? { gate_action_envelope: envelope } : {}),
121
+ context_strategy: contextStrategy(input.contextPolicy ?? "warm", state.turns_started + 1),
118
122
  });
119
123
  }
124
+ function contextStrategy(policy, iteration) {
125
+ const missionStart = iteration === 1;
126
+ return {
127
+ thread: missionStart || policy === "fresh" ? "new" : "resume",
128
+ handoff: "canonical",
129
+ reason: missionStart ? "mission_start" : "configured_policy",
130
+ };
131
+ }
120
132
  function beginContinuationTurn(store, state, snapshot, iteration, now) {
121
133
  let started = saveState(store, state, {
122
134
  status: "active", turns_started: iteration, active_turn_step: snapshot.current_step,
@@ -262,6 +274,7 @@ export async function driveBuilderFlowSession(input) {
262
274
  return runContinuationDriver({
263
275
  maxTurns: input.maxTurns,
264
276
  ...(input.adapterCommandIdentity ? { adapterCommandIdentity: input.adapterCommandIdentity } : {}),
277
+ ...(input.contextPolicy ? { contextPolicy: input.contextPolicy } : {}),
265
278
  runtime,
266
279
  store: input.store ?? createFileContinuationStore(sessionDir),
267
280
  ...(input.waitForBarrier ? { waitForBarrier: input.waitForBarrier } : {}),
@@ -287,7 +300,7 @@ function builderSessionSnapshot(result) {
287
300
  ...(result.gateActionEnvelope ? { gate_action_envelope: structuredClone(result.gateActionEnvelope) } : {}),
288
301
  });
289
302
  }
290
- function loadOrCreateState(store, snapshot, maxTurns, adapterCommandIdentity, now) {
303
+ function loadOrCreateState(store, snapshot, maxTurns, adapterCommandIdentity, contextPolicy, now) {
291
304
  const existing = store.load();
292
305
  if (existing) {
293
306
  validateState(existing);
@@ -300,6 +313,7 @@ function loadOrCreateState(store, snapshot, maxTurns, adapterCommandIdentity, no
300
313
  definition_id: snapshot.definition_id,
301
314
  max_turns: maxTurns,
302
315
  adapter_command_identity: adapterCommandIdentity,
316
+ context_policy: contextPolicy,
303
317
  status: "active",
304
318
  turns_started: 0,
305
319
  active_turn_step: null,
@@ -1,4 +1,8 @@
1
+ import { isDeepStrictEqual } from "node:util";
1
2
  import { MAX_CONTINUATION_TURNS } from "./continuation-persistence.js";
3
+ import { installedBuilderGateActionAuthority, } from "./builder-gate-action-envelope.js";
4
+ import { EVIDENCE_REF_JSON_SCHEMA, PUBLIC_OPERATION_CONTRACTS, WORKFLOW_CRITIQUE_PARAMETERS, WORKFLOW_EVIDENCE_PARAMETERS, } from "./cli/public-contracts.js";
5
+ import { flowAgentsPackageVersion } from "./lib/package-version.js";
2
6
  export const MAX_CONTINUATION_ADAPTER_EVIDENCE_BYTES = 65_536;
3
7
  export const MAX_CONTINUATION_TURN_RESULT_BYTES = 74_000;
4
8
  export function validateSnapshot(value) {
@@ -12,38 +16,314 @@ export function validateSnapshot(value) {
12
16
  if (value.next_action !== null && (typeof value.next_action !== "object" || Array.isArray(value.next_action)))
13
17
  throw new Error("continuation snapshot next_action must be an object or null");
14
18
  if (value.gate_action_envelope !== undefined)
15
- validateGateActionEnvelope(value.gate_action_envelope);
19
+ validateGateActionEnvelope(value.gate_action_envelope, value);
16
20
  if (value.progress_snapshot !== undefined)
17
21
  validateProgressSnapshot(value.progress_snapshot);
18
22
  return structuredClone(value);
19
23
  }
20
- function validateGateActionEnvelope(value) {
21
- if (!value || typeof value !== "object" || value.schema_version !== "2.0" || !value.flow || typeof value.flow.current_step !== "string"
24
+ function validateGateActionEnvelope(value, snapshot) {
25
+ if (!value || typeof value !== "object" || value.schema_version !== "3.0" || !value.flow || typeof value.flow.current_step !== "string"
22
26
  || !value.progress || !Array.isArray(value.progress.canonical_evidence) || !Array.isArray(value.progress.observed_artifacts))
23
27
  throw new Error("continuation snapshot gate-action envelope is malformed");
24
- if (value.gate !== undefined)
25
- validateGateRequirementBindings(value);
28
+ if (!hasExactKeys(value, ["schema_version", "flow", "gate", "action", "public_interfaces", "stop_condition", "progress"])) {
29
+ throw new Error("continuation snapshot gate-action envelope has unsupported root fields");
30
+ }
31
+ if (!value.gate || !value.action || !Array.isArray(value.action.declared_artifacts) || !Array.isArray(value.action.artifact_bindings)
32
+ || !value.stop_condition?.required || !Array.isArray(value.stop_condition.required.artifact_refs)
33
+ || !value.public_interfaces?.schemas?.evidence_ref_json)
34
+ throw new Error("continuation snapshot gate-action envelope is missing typed public interfaces");
35
+ if (!isDeepStrictEqual(value.public_interfaces.schemas.evidence_ref_json, EVIDENCE_REF_JSON_SCHEMA))
36
+ throw new Error("continuation snapshot gate-action evidence schema is not canonical");
37
+ if (!safeTaskSlug(value.flow.run_id))
38
+ throw new Error("continuation snapshot gate-action run id is not a safe task slug");
39
+ if (value.flow.run_id !== snapshot.run_id || value.flow.definition_id !== snapshot.definition_id
40
+ || value.flow.current_step !== snapshot.current_step || value.flow.status !== snapshot.status)
41
+ throw new Error("continuation snapshot gate-action identity does not match the canonical snapshot");
42
+ if (!value.stop_condition.scope || value.stop_condition.scope.run_id !== snapshot.run_id
43
+ || value.stop_condition.scope.current_step !== snapshot.current_step || value.stop_condition.scope.current_gate_only !== true
44
+ || !isDeepStrictEqual(value.stop_condition.scope.gate_ids, value.flow.gate_ids))
45
+ throw new Error("continuation snapshot gate-action scope does not match the canonical snapshot");
46
+ validateFixedEnvelopeShape(value);
47
+ if (!Array.isArray(value.action.skills) || !Array.isArray(value.action.operations) || !Array.isArray(value.action.declared_evidence)
48
+ || !Array.isArray(value.public_interfaces.mutations))
49
+ throw new Error("continuation snapshot gate-action action bindings are malformed");
50
+ const sessionArgument = `.kontourai/flow-agents/${value.flow.run_id}`;
51
+ const packageIdentity = validateStatusInterface(value, sessionArgument);
52
+ const authority = installedBuilderGateActionAuthority(value.flow.definition_id, value.flow.current_step, value.flow.run_id);
53
+ if (value.flow.definition_version !== authority.definition_version) {
54
+ throw new Error("continuation snapshot gate-action definition version does not match installed Builder authority");
55
+ }
56
+ if (!isDeepStrictEqual(value.stop_condition.external_capability, authority.external_capability)) {
57
+ throw new Error("continuation snapshot gate-action external capability does not match installed Builder authority");
58
+ }
59
+ const declaredSkillIds = value.action.skills.map((skill) => skill.id);
60
+ const declaredOperations = value.action.operations;
61
+ if (!sameUniqueStrings(declaredSkillIds) || !sameUniqueStrings(declaredOperations) || !sameUniqueStrings(value.action.declared_evidence)) {
62
+ throw new Error("continuation snapshot gate-action declarations contain invalid or duplicate ids");
63
+ }
64
+ for (const skill of value.action.skills) {
65
+ if (!skill || !hasExactKeys(skill, ["id", "package", "path", "sha256"]) || !safeIdentifier(skill.id)
66
+ || !authority.action.skills.some((installed) => isDeepStrictEqual(skill, installed))) {
67
+ throw new Error("continuation snapshot gate-action skill binding is malformed");
68
+ }
69
+ }
70
+ const mutationInterfaces = validateMutations(value, sessionArgument, packageIdentity);
71
+ if (!isDeepStrictEqual(value.public_interfaces.mutations, authority.mutations)) {
72
+ throw new Error("continuation snapshot gate-action mutations do not match installed Builder authority");
73
+ }
74
+ const operationMutations = new Set(value.public_interfaces.mutations.flatMap((mutation) => mutation.interface === "operation" ? [mutation.operation] : []));
75
+ if (declaredOperations.some((operation) => !operationMutations.has(operation))) {
76
+ throw new Error("continuation snapshot gate-action declared operation has no canonical mutation");
77
+ }
78
+ const declaredByRef = new Map();
79
+ for (const artifact of value.action.declared_artifacts) {
80
+ validateArtifactTarget(artifact, value.flow.run_id, declaredSkillIds, declaredOperations, operationMutations, mutationInterfaces);
81
+ if (declaredByRef.has(artifact.ref))
82
+ throw new Error("continuation snapshot gate-action artifact targets contain duplicate refs");
83
+ declaredByRef.set(artifact.ref, artifact);
84
+ }
85
+ const boundRefs = new Set();
86
+ for (const binding of value.action.artifact_bindings) {
87
+ if (!binding || !hasExactKeys(binding, ["target", "expectation_ids"])
88
+ || !Array.isArray(binding.expectation_ids) || !sameUniqueStrings(binding.expectation_ids)
89
+ || binding.expectation_ids.some((id) => !value.action.declared_evidence.includes(id))
90
+ || !binding.target || !isDeepStrictEqual(declaredByRef.get(binding.target.ref), binding.target)
91
+ || boundRefs.has(binding.target.ref)) {
92
+ throw new Error("continuation snapshot gate-action artifact binding is malformed");
93
+ }
94
+ boundRefs.add(binding.target.ref);
95
+ }
96
+ if (boundRefs.size !== declaredByRef.size || [...declaredByRef.keys()].some((ref) => !boundRefs.has(ref))) {
97
+ throw new Error("continuation snapshot gate-action artifact bindings are incomplete");
98
+ }
99
+ for (const artifact of value.stop_condition.required.artifact_refs) {
100
+ validateArtifactTarget(artifact, value.flow.run_id, declaredSkillIds, declaredOperations, operationMutations, mutationInterfaces);
101
+ if (!isDeepStrictEqual(declaredByRef.get(artifact.ref), artifact))
102
+ throw new Error("continuation snapshot gate-action required artifact is not a declared target");
103
+ }
104
+ if (!isDeepStrictEqual(value.action, authority.action) || !isDeepStrictEqual(value.flow.gate_ids, [authority.gate_id])) {
105
+ throw new Error("continuation snapshot gate-action action does not match installed Builder authority");
106
+ }
107
+ validateGateRequirementBindings(value, authority);
26
108
  if (Buffer.byteLength(JSON.stringify(value), "utf8") > 65_536)
27
109
  throw new Error("continuation snapshot gate-action envelope exceeds 65536 bytes");
28
110
  }
29
- function validateGateRequirementBindings(value) {
111
+ function validateArtifactTarget(artifact, runId, declaredSkillIds, declaredOperations, operationMutations, mutationInterfaces) {
112
+ if (!artifact || typeof artifact !== "object")
113
+ throw new Error("continuation snapshot gate-action artifact target is malformed");
114
+ if (artifact.kind === "file") {
115
+ const prefix = `.kontourai/flow-agents/${runId}/`;
116
+ const resolvedRef = typeof artifact.ref === "string" ? artifact.ref.replaceAll("<slug>", runId) : "";
117
+ if (!hasExactKeys(artifact, ["kind", "ref", "path", "direct_write_allowed", "produced_via"])
118
+ || typeof artifact.ref !== "string" || artifact.ref.length === 0 || artifact.ref.includes("#") || resolvedRef.includes("<") || resolvedRef.includes(">")
119
+ || resolvedRef.includes("\\") || resolvedRef.includes("\0") || resolvedRef.split("/").some((segment) => segment === "" || segment === "." || segment === "..")
120
+ || forbiddenFileTarget(resolvedRef) || artifact.path !== `${prefix}${resolvedRef}`
121
+ || !artifact.produced_via || (artifact.direct_write_allowed === true
122
+ ? artifact.produced_via.interface !== "skill" || !hasExactKeys(artifact.produced_via, ["interface", "skill_ids"])
123
+ || !safeDeclaredSubset(artifact.produced_via.skill_ids, declaredSkillIds)
124
+ : artifact.direct_write_allowed === false
125
+ ? artifact.produced_via.interface !== "operation" || !hasExactKeys(artifact.produced_via, ["interface", "operations"])
126
+ || !safeDeclaredSubset(artifact.produced_via.operations, declaredOperations)
127
+ || artifact.produced_via.operations.some((operation) => !operationMutations.has(operation))
128
+ : true))
129
+ throw new Error("continuation snapshot gate-action file target is malformed");
130
+ }
131
+ else if (artifact.kind === "trust_slice") {
132
+ if (!hasExactKeys(artifact, ["kind", "ref", "bundle_file", "slice_id", "direct_write_allowed", "record_via"])
133
+ || artifact.bundle_file !== "trust.bundle" || !/^[a-z0-9]+(?:[.-][a-z0-9]+)*$/.test(artifact.slice_id)
134
+ || artifact.ref !== `trust.bundle#${artifact.slice_id}` || artifact.direct_write_allowed !== false
135
+ || !Array.isArray(artifact.record_via) || artifact.record_via.length === 0 || new Set(artifact.record_via).size !== artifact.record_via.length
136
+ || artifact.record_via.some((entry) => (entry !== "workflow.evidence" && entry !== "workflow.critique") || !mutationInterfaces.has(entry)))
137
+ throw new Error("continuation snapshot gate-action trust slice is malformed");
138
+ }
139
+ else {
140
+ throw new Error("continuation snapshot gate-action artifact target kind is invalid");
141
+ }
142
+ }
143
+ function safeDeclaredSubset(value, declared) {
144
+ const allowed = new Set(declared);
145
+ return Array.isArray(value) && value.length > 0 && new Set(value).size === value.length
146
+ && value.every((entry) => typeof entry === "string" && safeIdentifier(entry) && allowed.has(entry));
147
+ }
148
+ function validateStatusInterface(value, sessionArgument) {
149
+ const status = value.public_interfaces.status;
150
+ if (!status || !hasExactKeys(status, ["package", "command", "argv"]) || status.command !== "flow-agents" || !isPackageIdentity(status.package)
151
+ || status.package.version !== flowAgentsPackageVersion()
152
+ || !isDeepStrictEqual(status.argv, ["workflow", "status", "--session-dir", sessionArgument, "--json"])) {
153
+ throw new Error("continuation snapshot gate-action status interface is not canonical");
154
+ }
155
+ return status.package;
156
+ }
157
+ function validateMutations(value, sessionArgument, packageIdentity) {
158
+ const expectationIds = [];
159
+ const interfaces = new Set();
160
+ for (const mutation of value.public_interfaces.mutations) {
161
+ if (!mutation || !safeIdentifier(mutation.expectation_id))
162
+ throw new Error("continuation snapshot gate-action mutation expectation is malformed");
163
+ expectationIds.push(mutation.expectation_id);
164
+ interfaces.add(mutation.interface);
165
+ if (mutation.interface === "workflow.evidence") {
166
+ if (!hasExactKeys(mutation, ["expectation_id", "interface", "package", "command", "argv", "parameters"])
167
+ || !isDeepStrictEqual(mutation.package, packageIdentity) || mutation.command !== "flow-agents"
168
+ || !isDeepStrictEqual(mutation.argv, ["workflow", "evidence", "--session-dir", sessionArgument, "--expectation", mutation.expectation_id, "--json"])
169
+ || !isDeepStrictEqual(mutation.parameters, WORKFLOW_EVIDENCE_PARAMETERS)) {
170
+ throw new Error("continuation snapshot gate-action evidence mutation is not canonical");
171
+ }
172
+ }
173
+ else if (mutation.interface === "workflow.critique") {
174
+ if (!hasExactKeys(mutation, ["expectation_id", "interface", "package", "command", "argv", "parameters"])
175
+ || !isDeepStrictEqual(mutation.package, packageIdentity) || mutation.command !== "flow-agents"
176
+ || !isDeepStrictEqual(mutation.argv, ["workflow", "critique", "--session-dir", sessionArgument, "--json"])
177
+ || !isDeepStrictEqual(mutation.parameters, WORKFLOW_CRITIQUE_PARAMETERS)) {
178
+ throw new Error("continuation snapshot gate-action critique mutation is not canonical");
179
+ }
180
+ }
181
+ else if (mutation.interface === "operation") {
182
+ const expected = PUBLIC_OPERATION_CONTRACTS[mutation.operation];
183
+ if (!hasExactKeys(mutation, ["expectation_id", "interface", "operation", "protocol", "completion"])
184
+ || !expected || !value.action.operations.includes(mutation.operation) || !isDeepStrictEqual(mutation.protocol, expected)
185
+ || !isDeepStrictEqual(mutation.completion, { status: "external_verification_required", executable_by_flow_agents: false, gate_evidence_interface: null })) {
186
+ throw new Error("continuation snapshot gate-action operation mutation is not canonical");
187
+ }
188
+ }
189
+ else {
190
+ throw new Error("continuation snapshot gate-action mutation interface is invalid");
191
+ }
192
+ }
193
+ if (!sameSet(expectationIds, value.action.declared_evidence)) {
194
+ throw new Error("continuation snapshot gate-action mutations do not match declared evidence");
195
+ }
196
+ return interfaces;
197
+ }
198
+ function isPackageIdentity(value) {
199
+ return !!value && typeof value === "object" && !Array.isArray(value)
200
+ && hasExactKeys(value, ["name", "version"])
201
+ && value.name === "@kontourai/flow-agents"
202
+ && typeof value.version === "string"
203
+ && /^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/.test(value.version);
204
+ }
205
+ function safeTaskSlug(value) {
206
+ return value.length <= 128 && /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(value);
207
+ }
208
+ function safeIdentifier(value) {
209
+ return /^[a-z0-9]+(?:[.-][a-z0-9]+)*$/.test(value);
210
+ }
211
+ function sameUniqueStrings(value) {
212
+ return Array.isArray(value) && new Set(value).size === value.length && value.every((entry) => typeof entry === "string" && safeIdentifier(entry));
213
+ }
214
+ function sameSet(left, right) {
215
+ return left.length === right.length && new Set(left).size === left.length && left.every((entry) => right.includes(entry));
216
+ }
217
+ function forbiddenFileTarget(ref) {
218
+ const segments = ref.split("/");
219
+ return ref === "state.json" || ref === "trust.bundle"
220
+ || segments.some((segment) => segment.startsWith(".") || segment === "continuation-driver");
221
+ }
222
+ function hasExactKeys(value, expected) {
223
+ const keys = Object.keys(value).sort();
224
+ return isDeepStrictEqual(keys, [...expected].sort());
225
+ }
226
+ function validateFixedEnvelopeShape(value) {
227
+ if (!hasExactKeys(value.flow, ["run_id", "definition_id", "definition_version", "status", "current_step", "gate_ids"])
228
+ || typeof value.flow.definition_version !== "string" || value.flow.definition_version.length === 0
229
+ || !Array.isArray(value.flow.gate_ids) || !sameUniqueGateIds(value.flow.gate_ids)) {
230
+ throw new Error("continuation snapshot gate-action flow binding is malformed");
231
+ }
232
+ if (!hasExactKeys(value.gate, ["requirements", "unresolved_requirement_ids", "accepted_exceptions"])
233
+ || !Array.isArray(value.gate.requirements) || !Array.isArray(value.gate.unresolved_requirement_ids)
234
+ || !Array.isArray(value.gate.accepted_exceptions)) {
235
+ throw new Error("continuation snapshot gate-action gate binding is malformed");
236
+ }
237
+ if (!hasExactKeys(value.action, ["skills", "operations", "declared_artifacts", "artifact_bindings", "declared_evidence", "implementation_allowed"])
238
+ || typeof value.action.implementation_allowed !== "boolean") {
239
+ throw new Error("continuation snapshot gate-action action policy is malformed");
240
+ }
241
+ if (!hasExactKeys(value.public_interfaces, ["status", "schemas", "mutations"])
242
+ || !hasExactKeys(value.public_interfaces.schemas, ["evidence_ref_json"])) {
243
+ throw new Error("continuation snapshot gate-action public interfaces are malformed");
244
+ }
245
+ if (!hasExactKeys(value.stop_condition.scope, ["run_id", "current_step", "gate_ids", "current_gate_only"])) {
246
+ throw new Error("continuation snapshot gate-action stop scope is malformed");
247
+ }
248
+ const required = value.stop_condition.required;
249
+ if (!hasExactKeys(required, ["skill_ids", "artifact_refs", "unresolved_evidence_ids"])
250
+ || value.stop_condition.kind !== "one_turn" || value.stop_condition.after !== "return_adapter_result"
251
+ || value.stop_condition.synchronize_canonical_flow !== true || value.stop_condition.adapter_evidence_is_gate_evidence !== false
252
+ || !isDeepStrictEqual(value.stop_condition.sequence, ["activate_required_skills", "produce_declared_artifacts", "record_bound_evidence", "synchronize_canonical_flow", "return_adapter_result"])
253
+ || !Array.isArray(required.skill_ids) || !Array.isArray(required.unresolved_evidence_ids)) {
254
+ throw new Error("continuation snapshot gate-action stop condition is malformed");
255
+ }
256
+ const allowedStopKeys = ["kind", "scope", "required", "sequence", "after", "synchronize_canonical_flow", "adapter_evidence_is_gate_evidence"];
257
+ if (value.stop_condition.external_capability !== undefined)
258
+ allowedStopKeys.push("external_capability");
259
+ if (!hasExactKeys(value.stop_condition, allowedStopKeys))
260
+ throw new Error("continuation snapshot gate-action stop condition is malformed");
261
+ if (value.stop_condition.external_capability !== undefined) {
262
+ const capability = value.stop_condition.external_capability;
263
+ const protocol = PUBLIC_OPERATION_CONTRACTS[capability.operation];
264
+ if (!hasExactKeys(capability, ["status", "operation", "capability", "completion"])
265
+ || capability.status !== "waiting" || capability.completion !== "external_verification_required"
266
+ || !protocol || !value.action.operations.includes(capability.operation) || capability.capability !== protocol.capability) {
267
+ throw new Error("continuation snapshot gate-action external capability is malformed");
268
+ }
269
+ }
270
+ const progressKeys = ["canonical_evidence", "observed_artifacts"];
271
+ if (value.progress.prior_turn !== undefined)
272
+ progressKeys.push("prior_turn");
273
+ if (!hasExactKeys(value.progress, progressKeys)
274
+ || !value.progress.canonical_evidence.every((entry) => typeof entry === "string")
275
+ || !value.progress.observed_artifacts.every((entry) => typeof entry === "string")) {
276
+ throw new Error("continuation snapshot gate-action progress is malformed");
277
+ }
278
+ if (value.progress.prior_turn !== undefined)
279
+ validatePriorProgress(value.progress.prior_turn);
280
+ }
281
+ function sameUniqueGateIds(value) {
282
+ return Array.isArray(value) && new Set(value).size === value.length && value.every((entry) => typeof entry === "string"
283
+ && entry.split(":").every((part) => safeIdentifier(part)));
284
+ }
285
+ function validateGateRequirementBindings(value, authority) {
30
286
  if (!Array.isArray(value.flow.gate_ids) || !Array.isArray(value.gate.requirements) || !Array.isArray(value.gate.accepted_exceptions)) {
31
287
  throw new Error("continuation snapshot gate-action envelope has malformed gate bindings");
32
288
  }
33
289
  const activeGates = new Set(value.flow.gate_ids);
290
+ const requirementIds = [];
291
+ const unresolvedIds = [];
292
+ const unresolvedRequiredIds = [];
34
293
  const acceptedGates = new Set();
35
294
  for (const exception of value.gate.accepted_exceptions) {
36
- if (!exception || typeof exception.gate_id !== "string" || typeof exception.exception_id !== "string"
295
+ if (!exception || !hasExactKeys(exception, ["gate_id", "exception_id"])
296
+ || typeof exception.gate_id !== "string" || typeof exception.exception_id !== "string" || exception.exception_id.length === 0
37
297
  || !activeGates.has(exception.gate_id) || acceptedGates.has(exception.gate_id)) {
38
298
  throw new Error("continuation snapshot gate-action envelope has invalid accepted exceptions");
39
299
  }
40
300
  acceptedGates.add(exception.gate_id);
41
301
  }
42
302
  const gatesWithRequirements = new Set();
303
+ const authorityRequirements = new Map(authority.requirements.map((requirement) => [requirement.id, requirement]));
43
304
  for (const requirement of value.gate.requirements) {
44
- if (!requirement || typeof requirement.gate_id !== "string" || !activeGates.has(requirement.gate_id)) {
305
+ if (!requirement || !hasExactKeys(requirement, ["id", "gate_id", "required", "description", "claim_type", "subject_type", "status"])
306
+ || !safeIdentifier(requirement.id) || typeof requirement.gate_id !== "string" || !activeGates.has(requirement.gate_id)
307
+ || typeof requirement.required !== "boolean" || typeof requirement.description !== "string" || requirement.description.length === 0
308
+ || typeof requirement.claim_type !== "string" || requirement.claim_type.length === 0
309
+ || (requirement.subject_type !== null && (typeof requirement.subject_type !== "string" || requirement.subject_type.length === 0))
310
+ || !new Set(["satisfied", "accepted_exception", "unresolved"]).has(requirement.status)) {
45
311
  throw new Error("continuation snapshot gate-action envelope has an invalid requirement gate binding");
46
312
  }
313
+ const { status: _status, required: _required, ...shape } = requirement;
314
+ const authoritative = authorityRequirements.get(requirement.id);
315
+ if (!authoritative)
316
+ throw new Error("continuation snapshot gate-action requirement does not match installed Flow authority");
317
+ const { required: _authoritativeRequired, ...authoritativeShape } = authoritative;
318
+ if (!isDeepStrictEqual(shape, authoritativeShape)) {
319
+ throw new Error("continuation snapshot gate-action requirement does not match installed Flow authority");
320
+ }
321
+ requirementIds.push(requirement.id);
322
+ if (requirement.status === "unresolved") {
323
+ unresolvedIds.push(requirement.id);
324
+ if (requirement.required)
325
+ unresolvedRequiredIds.push(requirement.id);
326
+ }
47
327
  gatesWithRequirements.add(requirement.gate_id);
48
328
  if ((requirement.status === "accepted_exception") !== acceptedGates.has(requirement.gate_id)
49
329
  && requirement.status !== "satisfied") {
@@ -53,6 +333,28 @@ function validateGateRequirementBindings(value) {
53
333
  if ([...acceptedGates].some((gateId) => !gatesWithRequirements.has(gateId))) {
54
334
  throw new Error("continuation snapshot gate-action envelope exception has no bound requirements");
55
335
  }
336
+ if (!sameUniqueStrings(requirementIds) || !sameSet(requirementIds, value.action.declared_evidence)
337
+ || !sameSet(unresolvedIds, value.gate.unresolved_requirement_ids)
338
+ || !sameSet(unresolvedRequiredIds, value.stop_condition.required.unresolved_evidence_ids)) {
339
+ throw new Error("continuation snapshot gate-action requirement projections are inconsistent");
340
+ }
341
+ const expectedSkillIds = unresolvedRequiredIds.length > 0 ? value.action.skills.map((skill) => skill.id) : [];
342
+ if (!sameSet(expectedSkillIds, value.stop_condition.required.skill_ids)) {
343
+ throw new Error("continuation snapshot gate-action required skills are inconsistent");
344
+ }
345
+ const unresolvedRequired = new Set(unresolvedRequiredIds);
346
+ const expectedArtifacts = value.action.artifact_bindings
347
+ .filter((binding) => binding.expectation_ids.some((id) => unresolvedRequired.has(id)))
348
+ .map((binding) => binding.target);
349
+ if (!sameArtifactTargets(expectedArtifacts, value.stop_condition.required.artifact_refs)) {
350
+ throw new Error("continuation snapshot gate-action required artifacts are inconsistent");
351
+ }
352
+ }
353
+ function sameArtifactTargets(left, right) {
354
+ if (left.length !== right.length)
355
+ return false;
356
+ const rightByRef = new Map(right.map((target) => [target.ref, target]));
357
+ return rightByRef.size === right.length && left.every((target) => isDeepStrictEqual(target, rightByRef.get(target.ref)));
56
358
  }
57
359
  export function validateTurnResult(value) {
58
360
  if (!value || typeof value !== "object" || (value.status !== "completed" && value.status !== "wait"))
@@ -112,6 +414,8 @@ export function validateState(state) {
112
414
  assertMaxTurns(state.max_turns);
113
415
  if (state.adapter_command_identity !== null && (typeof state.adapter_command_identity !== "string" || state.adapter_command_identity.length === 0))
114
416
  throw new Error("continuation driver adapter_command_identity must be a non-empty string or null");
417
+ if (state.context_policy !== undefined && !new Set(["warm", "fresh"]).has(state.context_policy))
418
+ throw new Error("continuation driver context_policy must be warm or fresh");
115
419
  if (!Number.isSafeInteger(state.turns_started) || state.turns_started < 0 || state.turns_started > state.max_turns)
116
420
  throw new Error("continuation driver turns_started is outside its mission budget");
117
421
  if (state.active_turn_step !== undefined && state.active_turn_step !== null && (typeof state.active_turn_step !== "string" || state.active_turn_step.length === 0))
@@ -142,9 +446,21 @@ function validateAcceptedTurn(value) {
142
446
  || value.iteration < 1 || value.request?.iteration !== value.iteration || typeof value.captured_at !== "string" || !Number.isFinite(Date.parse(value.captured_at)))
143
447
  throw new Error("continuation accepted-turn capture is malformed");
144
448
  validateTurnResult(value.result);
449
+ if (value.request.context_strategy !== undefined)
450
+ validateContextStrategy(value.request.context_strategy);
145
451
  if (value.progress !== null)
146
452
  validatePriorProgress(value.progress);
147
453
  }
454
+ function validateContextStrategy(value) {
455
+ if (!value || typeof value !== "object" || Array.isArray(value))
456
+ throw new Error("continuation context strategy is malformed");
457
+ const strategy = value;
458
+ if (strategy.handoff !== "canonical" || !new Set(["new", "resume"]).has(String(strategy.thread))
459
+ || !new Set(["mission_start", "configured_policy"]).has(String(strategy.reason))
460
+ || Object.keys(strategy).some((key) => !new Set(["thread", "handoff", "reason"]).has(key))) {
461
+ throw new Error("continuation context strategy is malformed");
462
+ }
463
+ }
148
464
  function validateProgressSnapshot(value) {
149
465
  if (!value || typeof value !== "object" || typeof value.current_step !== "string" || value.current_step.length === 0
150
466
  || (value.canonical_status !== undefined && (typeof value.canonical_status !== "string" || value.canonical_status.length === 0))
@@ -68,7 +68,9 @@ function parseFlowStepActionEntry(raw, manifestPath, index, errors) {
68
68
  return null;
69
69
  }
70
70
  const artifactBindings = parseArtifactBindings(record.artifact_bindings ?? [], lists.artifacts, lists.expectation_ids, manifestPath, index, errors);
71
- return artifactBindings ? { flow_id: record.flow_id, step_id: record.step_id, ...lists, implementation_allowed: record.implementation_allowed, expectation_bindings: expectationBindings, artifact_bindings: artifactBindings } : null;
71
+ if (!artifactBindings || !validateArtifactProducers(artifactBindings, expectationBindings, lists.skills, manifestPath, index, errors))
72
+ return null;
73
+ return { flow_id: record.flow_id, step_id: record.step_id, ...lists, implementation_allowed: record.implementation_allowed, expectation_bindings: expectationBindings, artifact_bindings: artifactBindings };
72
74
  }
73
75
  function parseFlowStepActionLists(record, manifestPath, index, errors) {
74
76
  const skills = record.skills;
@@ -142,12 +144,30 @@ function parseArtifactBindings(value, artifacts, expectationIds, manifestPath, a
142
144
  if (Object.keys(record).some((key) => key !== "artifact" && key !== "expectation_ids") || typeof record.artifact !== "string" || !artifacts.includes(record.artifact)
143
145
  || !Array.isArray(record.expectation_ids) || !record.expectation_ids.every((id) => typeof id === "string" && expectationIds.includes(id)) || new Set(record.expectation_ids).size !== record.expectation_ids.length)
144
146
  return fail(errors, `${manifestPath}: flow_step_actions[${actionIndex}].artifact_bindings[${bindingIndex}] must bind one declared artifact to declared expectation_ids`);
147
+ if (record.artifact.startsWith("trust.bundle#") && record.expectation_ids.length === 0)
148
+ return fail(errors, `${manifestPath}: flow_step_actions[${actionIndex}].artifact_bindings[${bindingIndex}] trust slice must own at least one expectation to derive its recording interface`);
145
149
  bindings.push({ artifact: record.artifact, expectation_ids: record.expectation_ids });
146
150
  }
147
151
  if (!sameStringSet(bindings.map((binding) => binding.artifact), artifacts))
148
152
  return fail(errors, `${manifestPath}: flow_step_actions[${actionIndex}].artifact_bindings must bind every artifact exactly once`);
149
153
  return bindings;
150
154
  }
155
+ function validateArtifactProducers(bindings, expectationBindings, skills, manifestPath, actionIndex, errors) {
156
+ const expectationById = new Map(expectationBindings.map((binding) => [binding.expectation_id, binding]));
157
+ for (const [bindingIndex, binding] of bindings.entries()) {
158
+ const owners = binding.expectation_ids.map((id) => expectationById.get(id));
159
+ const operationOwners = owners.filter((owner) => owner.interface === "operation");
160
+ if (binding.artifact.startsWith("trust.bundle#") && operationOwners.length > 0) {
161
+ errors.push(`${manifestPath}: flow_step_actions[${actionIndex}].artifact_bindings[${bindingIndex}] trust slice cannot own an operation expectation`);
162
+ return false;
163
+ }
164
+ if (!binding.artifact.includes("#") && operationOwners.length === 0 && skills.length === 0) {
165
+ errors.push(`${manifestPath}: flow_step_actions[${actionIndex}].artifact_bindings[${bindingIndex}] file has no skill or operation producer`);
166
+ return false;
167
+ }
168
+ }
169
+ return true;
170
+ }
151
171
  export function isSafeBuilderArtifactRef(value) {
152
172
  if (typeof value !== "string" || value.length === 0 || value.includes("\0") || value.includes("\\"))
153
173
  return false;