@intentius/chant 0.124.26 → 0.124.28

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 (459) hide show
  1. package/README.md +1 -1
  2. package/dist/__golden__/wave-loop/fan-out-gated.json +8 -0
  3. package/dist/__golden__/wave-loop/fan-out-no-members.json +4 -0
  4. package/dist/__golden__/wave-loop/fan-out-only.json +6 -0
  5. package/dist/__golden__/wave-loop/op-by-apply-hold.json +2 -0
  6. package/dist/__golden__/wave-loop/op-cost-member.json +3 -0
  7. package/dist/__golden__/wave-loop/op-held-on-before-apply.json +1 -0
  8. package/dist/__golden__/wave-loop/op-held-on.json +2 -0
  9. package/dist/__golden__/wave-loop/op-hooks-held.json +2 -0
  10. package/dist/__golden__/wave-loop/op-hooks-hold-before-apply.json +2 -0
  11. package/dist/__golden__/wave-loop/op-hooks-refused-at-base.json +3 -0
  12. package/dist/__golden__/wave-loop/op-hooks-share.json +3 -0
  13. package/dist/__golden__/wave-loop/op-per-run.json +7 -0
  14. package/dist/__golden__/wave-loop/op-pr-review.json +7 -0
  15. package/dist/__golden__/wave-loop/op-sealed.json +3 -0
  16. package/dist/__golden__/wave-loop/op-spend.json +3 -0
  17. package/dist/__golden__/wave-loop/op-wave-commands.json +7 -0
  18. package/dist/__golden__/wave-loop/op-wide-waiting.json +4 -0
  19. package/dist/change-set-graph.d.ts +56 -0
  20. package/dist/change-set-graph.d.ts.map +1 -0
  21. package/dist/change-set-graph.js +128 -0
  22. package/dist/change-set.d.ts +52 -3
  23. package/dist/change-set.d.ts.map +1 -1
  24. package/dist/change-set.js +35 -4
  25. package/dist/chant-version.d.ts +9 -0
  26. package/dist/chant-version.d.ts.map +1 -0
  27. package/dist/chant-version.js +16 -0
  28. package/dist/cli/commands/build.d.ts +8 -0
  29. package/dist/cli/commands/build.d.ts.map +1 -1
  30. package/dist/cli/commands/build.js +9 -8
  31. package/dist/cli/commands/check-lexicon-docs.d.ts.map +1 -1
  32. package/dist/cli/commands/check-lexicon-docs.js +30 -2
  33. package/dist/cli/commands/check-lexicon.d.ts.map +1 -1
  34. package/dist/cli/commands/check-lexicon.js +13 -2
  35. package/dist/cli/commands/init-lexicon/templates/docs.d.ts +4 -1
  36. package/dist/cli/commands/init-lexicon/templates/docs.d.ts.map +1 -1
  37. package/dist/cli/commands/init-lexicon/templates/docs.js +6 -6
  38. package/dist/cli/commands/init-lexicon.d.ts.map +1 -1
  39. package/dist/cli/commands/init-lexicon.js +17 -8
  40. package/dist/cli/handlers/approve.d.ts.map +1 -1
  41. package/dist/cli/handlers/approve.js +19 -4
  42. package/dist/cli/handlers/build.d.ts.map +1 -1
  43. package/dist/cli/handlers/build.js +28 -0
  44. package/dist/cli/handlers/change-set.d.ts +10 -0
  45. package/dist/cli/handlers/change-set.d.ts.map +1 -1
  46. package/dist/cli/handlers/change-set.js +51 -1
  47. package/dist/cli/handlers/fan-out.d.ts +1 -1
  48. package/dist/cli/handlers/fan-out.d.ts.map +1 -1
  49. package/dist/cli/handlers/fan-out.js +14 -3
  50. package/dist/cli/handlers/pr.d.ts +8 -2
  51. package/dist/cli/handlers/pr.d.ts.map +1 -1
  52. package/dist/cli/handlers/pr.js +148 -24
  53. package/dist/cli/handlers/promote.d.ts.map +1 -1
  54. package/dist/cli/handlers/promote.js +256 -21
  55. package/dist/cli/handlers/release.d.ts +34 -0
  56. package/dist/cli/handlers/release.d.ts.map +1 -0
  57. package/dist/cli/handlers/release.js +203 -0
  58. package/dist/cli/handlers/run.d.ts +28 -2
  59. package/dist/cli/handlers/run.d.ts.map +1 -1
  60. package/dist/cli/handlers/run.js +170 -13
  61. package/dist/cli/main.d.ts.map +1 -1
  62. package/dist/cli/main.js +88 -13
  63. package/dist/cli/mcp/workspace-tools.js +1 -1
  64. package/dist/cli/parse-args.d.ts.map +1 -1
  65. package/dist/cli/parse-args.js +49 -3
  66. package/dist/cli/registry.d.ts +29 -3
  67. package/dist/cli/registry.d.ts.map +1 -1
  68. package/dist/cli/run-events.d.ts +29 -0
  69. package/dist/cli/run-events.d.ts.map +1 -0
  70. package/dist/cli/run-events.js +47 -0
  71. package/dist/cli/version.d.ts +3 -5
  72. package/dist/cli/version.d.ts.map +1 -1
  73. package/dist/cli/version.js +3 -13
  74. package/dist/codegen/docs-in-site.d.ts +71 -0
  75. package/dist/codegen/docs-in-site.d.ts.map +1 -0
  76. package/dist/codegen/docs-in-site.js +177 -0
  77. package/dist/codegen/docs-types.d.ts +14 -1
  78. package/dist/codegen/docs-types.d.ts.map +1 -1
  79. package/dist/codegen/docs.d.ts +18 -1
  80. package/dist/codegen/docs.d.ts.map +1 -1
  81. package/dist/codegen/docs.js +40 -7
  82. package/dist/codegen/rehype-base-url.mjs +15 -9
  83. package/dist/components/auto-release.d.ts +4 -1
  84. package/dist/components/auto-release.d.ts.map +1 -1
  85. package/dist/components/auto-release.js +2 -0
  86. package/dist/components/cli-support.d.ts +6 -0
  87. package/dist/components/cli-support.d.ts.map +1 -1
  88. package/dist/components/cli-support.js +10 -9
  89. package/dist/components/driver.d.ts +42 -9
  90. package/dist/components/driver.d.ts.map +1 -1
  91. package/dist/components/driver.js +81 -54
  92. package/dist/components/fan-out-run.d.ts +7 -0
  93. package/dist/components/fan-out-run.d.ts.map +1 -1
  94. package/dist/components/fan-out-run.js +35 -26
  95. package/dist/components/pr-run.d.ts +11 -0
  96. package/dist/components/pr-run.d.ts.map +1 -1
  97. package/dist/components/pr-run.js +20 -1
  98. package/dist/components/promote-order.d.ts +38 -0
  99. package/dist/components/promote-order.d.ts.map +1 -0
  100. package/dist/components/promote-order.js +62 -0
  101. package/dist/components/promote.d.ts +15 -2
  102. package/dist/components/promote.d.ts.map +1 -1
  103. package/dist/components/promote.js +17 -0
  104. package/dist/components/release-compile.d.ts +133 -0
  105. package/dist/components/release-compile.d.ts.map +1 -0
  106. package/dist/components/release-compile.js +376 -0
  107. package/dist/components/release-gate.d.ts +125 -0
  108. package/dist/components/release-gate.d.ts.map +1 -0
  109. package/dist/components/release-gate.js +282 -0
  110. package/dist/components/release-promote.d.ts +96 -0
  111. package/dist/components/release-promote.d.ts.map +1 -0
  112. package/dist/components/release-promote.js +204 -0
  113. package/dist/components/run-progress.d.ts +7 -0
  114. package/dist/components/run-progress.d.ts.map +1 -1
  115. package/dist/components/wave-plan.d.ts +3 -1
  116. package/dist/components/wave-plan.d.ts.map +1 -1
  117. package/dist/components/wave-plan.js +1 -1
  118. package/dist/config.d.ts +7 -0
  119. package/dist/config.d.ts.map +1 -1
  120. package/dist/config.js +1 -0
  121. package/dist/index.d.ts +1 -0
  122. package/dist/index.d.ts.map +1 -1
  123. package/dist/index.js +2 -0
  124. package/dist/lifecycle/change-set-store.d.ts +67 -0
  125. package/dist/lifecycle/change-set-store.d.ts.map +1 -0
  126. package/dist/lifecycle/change-set-store.js +96 -0
  127. package/dist/lifecycle/commit-sha.d.ts +13 -0
  128. package/dist/lifecycle/commit-sha.d.ts.map +1 -0
  129. package/dist/lifecycle/commit-sha.js +21 -0
  130. package/dist/lifecycle/gate-change-set.d.ts +69 -0
  131. package/dist/lifecycle/gate-change-set.d.ts.map +1 -0
  132. package/dist/lifecycle/gate-change-set.js +106 -0
  133. package/dist/lifecycle/gate-ledger.d.ts +49 -1
  134. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  135. package/dist/lifecycle/gate-ledger.js +18 -0
  136. package/dist/lifecycle/release-cut.d.ts +107 -0
  137. package/dist/lifecycle/release-cut.d.ts.map +1 -0
  138. package/dist/lifecycle/release-cut.js +273 -0
  139. package/dist/lifecycle/release-ledger.d.ts +54 -0
  140. package/dist/lifecycle/release-ledger.d.ts.map +1 -1
  141. package/dist/lifecycle/release-ledger.js +53 -20
  142. package/dist/lifecycle/release-store.d.ts +190 -0
  143. package/dist/lifecycle/release-store.d.ts.map +1 -0
  144. package/dist/lifecycle/release-store.js +318 -0
  145. package/dist/lifecycle/run-ledger.d.ts +4 -0
  146. package/dist/lifecycle/run-ledger.d.ts.map +1 -1
  147. package/dist/lifecycle/run-ledger.js +2 -0
  148. package/dist/op/activities/change-coverage.d.ts.map +1 -1
  149. package/dist/op/activities/change-coverage.js +4 -2
  150. package/dist/op/activities/source-release.d.ts.map +1 -1
  151. package/dist/op/activities/source-release.js +7 -3
  152. package/dist/op/activities/source-rollback.d.ts.map +1 -1
  153. package/dist/op/activities/source-rollback.js +7 -3
  154. package/dist/op/activity-registry.d.ts +6 -3
  155. package/dist/op/activity-registry.d.ts.map +1 -1
  156. package/dist/op/activity-registry.js +7 -5
  157. package/dist/op/discover.d.ts.map +1 -1
  158. package/dist/op/discover.js +14 -7
  159. package/dist/op/gate-name.d.ts +11 -2
  160. package/dist/op/gate-name.d.ts.map +1 -1
  161. package/dist/op/gate-name.js +12 -3
  162. package/dist/op/gate-run-locator.d.ts +22 -0
  163. package/dist/op/gate-run-locator.d.ts.map +1 -1
  164. package/dist/op/gate-run-locator.js +31 -0
  165. package/dist/op/gate.d.ts +27 -3
  166. package/dist/op/gate.d.ts.map +1 -1
  167. package/dist/op/gate.js +57 -3
  168. package/dist/op/local-executor.d.ts +36 -1
  169. package/dist/op/local-executor.d.ts.map +1 -1
  170. package/dist/op/local-executor.js +158 -52
  171. package/dist/op/op-waves-run.d.ts.map +1 -1
  172. package/dist/op/op-waves-run.js +4 -0
  173. package/dist/op/run-live.d.ts +2 -0
  174. package/dist/op/run-live.d.ts.map +1 -1
  175. package/dist/op/run-live.js +1 -1
  176. package/dist/op/runtime.d.ts +46 -0
  177. package/dist/op/runtime.d.ts.map +1 -1
  178. package/dist/op/runtimes/local.d.ts.map +1 -1
  179. package/dist/op/runtimes/local.js +12 -2
  180. package/dist/point-decision.d.ts +2 -0
  181. package/dist/point-decision.d.ts.map +1 -1
  182. package/dist/point-decision.js +9 -2
  183. package/dist/run-event-store.d.ts +77 -0
  184. package/dist/run-event-store.d.ts.map +1 -0
  185. package/dist/run-event-store.js +204 -0
  186. package/dist/run-event-stream.d.ts +132 -0
  187. package/dist/run-event-stream.d.ts.map +1 -0
  188. package/dist/run-event-stream.js +238 -0
  189. package/dist/run-event.d.ts +267 -0
  190. package/dist/run-event.d.ts.map +1 -0
  191. package/dist/run-event.js +207 -0
  192. package/dist/wave-runtime.mjs +225 -242
  193. package/dist/workspace/__fixtures__/run-event-check.d.ts +19 -0
  194. package/dist/workspace/__fixtures__/run-event-check.d.ts.map +1 -0
  195. package/dist/workspace/__fixtures__/run-event-check.js +59 -0
  196. package/dist/workspace/change-set-show.d.ts +56 -0
  197. package/dist/workspace/change-set-show.d.ts.map +1 -0
  198. package/dist/workspace/change-set-show.js +54 -0
  199. package/dist/workspace/change-set-show.schema.json +102 -0
  200. package/dist/workspace/change-set.schema.json +28 -1
  201. package/dist/workspace/changes-cli.d.ts.map +1 -1
  202. package/dist/workspace/changes-cli.js +10 -1
  203. package/dist/workspace/changes.d.ts +37 -0
  204. package/dist/workspace/changes.d.ts.map +1 -1
  205. package/dist/workspace/changes.js +49 -2
  206. package/dist/workspace/changes.schema.json +135 -0
  207. package/dist/workspace/ci-green-cli.d.ts +19 -4
  208. package/dist/workspace/ci-green-cli.d.ts.map +1 -1
  209. package/dist/workspace/ci-green-cli.js +75 -12
  210. package/dist/workspace/ci-green-forge.d.ts +20 -3
  211. package/dist/workspace/ci-green-forge.d.ts.map +1 -1
  212. package/dist/workspace/ci-green-forge.js +6 -4
  213. package/dist/workspace/ci-green-workflow.d.ts +11 -0
  214. package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
  215. package/dist/workspace/ci-green-workflow.js +6 -0
  216. package/dist/workspace/ci-green.d.ts +273 -13
  217. package/dist/workspace/ci-green.d.ts.map +1 -1
  218. package/dist/workspace/ci-green.js +449 -38
  219. package/dist/workspace/ci-last-green.schema.json +32 -2
  220. package/dist/workspace/ci-list.schema.json +525 -0
  221. package/dist/workspace/commit-links.d.ts +85 -0
  222. package/dist/workspace/commit-links.d.ts.map +1 -0
  223. package/dist/workspace/commit-links.js +163 -0
  224. package/dist/workspace/declaration.d.ts +19 -0
  225. package/dist/workspace/declaration.d.ts.map +1 -1
  226. package/dist/workspace/declaration.js +1 -1
  227. package/dist/workspace/declaration.schema.json +12 -0
  228. package/dist/workspace/identity-gate-rule.d.ts +37 -0
  229. package/dist/workspace/identity-gate-rule.d.ts.map +1 -1
  230. package/dist/workspace/identity-gate-rule.js +72 -7
  231. package/dist/workspace/identity.d.ts +12 -0
  232. package/dist/workspace/identity.d.ts.map +1 -1
  233. package/dist/workspace/identity.js +13 -1
  234. package/dist/workspace/intent.d.ts +6 -1
  235. package/dist/workspace/intent.d.ts.map +1 -1
  236. package/dist/workspace/intent.js +51 -1
  237. package/dist/workspace/ls.d.ts +4 -0
  238. package/dist/workspace/ls.d.ts.map +1 -1
  239. package/dist/workspace/ls.js +2 -0
  240. package/dist/workspace/ls.schema.json +3 -1
  241. package/dist/workspace/member-pipeline.d.ts +6 -0
  242. package/dist/workspace/member-pipeline.d.ts.map +1 -1
  243. package/dist/workspace/member-pipeline.js +6 -0
  244. package/dist/workspace/promotion-order.d.ts +41 -0
  245. package/dist/workspace/promotion-order.d.ts.map +1 -0
  246. package/dist/workspace/promotion-order.js +95 -0
  247. package/dist/workspace/reason-codes.d.ts +2 -0
  248. package/dist/workspace/reason-codes.d.ts.map +1 -1
  249. package/dist/workspace/reason-codes.js +4 -1
  250. package/dist/workspace/releases.d.ts +72 -0
  251. package/dist/workspace/releases.d.ts.map +1 -0
  252. package/dist/workspace/releases.js +94 -0
  253. package/dist/workspace/releases.schema.json +391 -0
  254. package/dist/workspace/run-event.schema.json +288 -0
  255. package/dist/workspace/status-gates.d.ts +26 -1
  256. package/dist/workspace/status-gates.d.ts.map +1 -1
  257. package/dist/workspace/status-gates.js +31 -2
  258. package/dist/workspace/status-stewards.d.ts +4 -0
  259. package/dist/workspace/status-stewards.d.ts.map +1 -1
  260. package/dist/workspace/status-stewards.js +2 -0
  261. package/dist/workspace/status.d.ts +39 -0
  262. package/dist/workspace/status.d.ts.map +1 -1
  263. package/dist/workspace/status.js +48 -1
  264. package/dist/workspace/status.schema.json +70 -1
  265. package/dist/workspace/trust/ci-tag-statement.d.ts +102 -0
  266. package/dist/workspace/trust/ci-tag-statement.d.ts.map +1 -0
  267. package/dist/workspace/trust/ci-tag-statement.js +123 -0
  268. package/dist/workspace/trust/op-run-statement.d.ts +91 -0
  269. package/dist/workspace/trust/op-run-statement.d.ts.map +1 -0
  270. package/dist/workspace/trust/op-run-statement.js +143 -0
  271. package/dist/workspace/trust/rotation.d.ts +18 -2
  272. package/dist/workspace/trust/rotation.d.ts.map +1 -1
  273. package/dist/workspace/trust/rotation.js +65 -16
  274. package/dist/workspace/trust/seal.d.ts +11 -0
  275. package/dist/workspace/trust/seal.d.ts.map +1 -1
  276. package/dist/workspace/trust/seal.js +9 -0
  277. package/dist/workspace/trust/ssh-commit.d.ts.map +1 -1
  278. package/dist/workspace/trust/ssh-commit.js +10 -10
  279. package/package.json +1 -1
  280. package/src/__golden__/wave-loop/fan-out-gated.json +8 -0
  281. package/src/__golden__/wave-loop/fan-out-no-members.json +4 -0
  282. package/src/__golden__/wave-loop/fan-out-only.json +6 -0
  283. package/src/__golden__/wave-loop/op-by-apply-hold.json +2 -0
  284. package/src/__golden__/wave-loop/op-cost-member.json +3 -0
  285. package/src/__golden__/wave-loop/op-held-on-before-apply.json +1 -0
  286. package/src/__golden__/wave-loop/op-held-on.json +2 -0
  287. package/src/__golden__/wave-loop/op-hooks-held.json +2 -0
  288. package/src/__golden__/wave-loop/op-hooks-hold-before-apply.json +2 -0
  289. package/src/__golden__/wave-loop/op-hooks-refused-at-base.json +3 -0
  290. package/src/__golden__/wave-loop/op-hooks-share.json +3 -0
  291. package/src/__golden__/wave-loop/op-per-run.json +7 -0
  292. package/src/__golden__/wave-loop/op-pr-review.json +7 -0
  293. package/src/__golden__/wave-loop/op-sealed.json +3 -0
  294. package/src/__golden__/wave-loop/op-spend.json +3 -0
  295. package/src/__golden__/wave-loop/op-wave-commands.json +7 -0
  296. package/src/__golden__/wave-loop/op-wide-waiting.json +4 -0
  297. package/src/change-set-graph.test.ts +72 -0
  298. package/src/change-set-graph.ts +133 -0
  299. package/src/change-set.ts +76 -6
  300. package/src/chant-version.ts +16 -0
  301. package/src/cli/commands/build.ts +19 -8
  302. package/src/cli/commands/check-lexicon-docs.test.ts +51 -0
  303. package/src/cli/commands/check-lexicon-docs.ts +39 -2
  304. package/src/cli/commands/check-lexicon.ts +14 -2
  305. package/src/cli/commands/init-lexicon/templates/docs.ts +7 -6
  306. package/src/cli/commands/init-lexicon.test.ts +25 -0
  307. package/src/cli/commands/init-lexicon.ts +18 -8
  308. package/src/cli/compiled-cli.e2e.test.ts +31 -6
  309. package/src/cli/handlers/approve-release.test.ts +80 -0
  310. package/src/cli/handlers/approve.ts +18 -2
  311. package/src/cli/handlers/build.test.ts +52 -0
  312. package/src/cli/handlers/build.ts +29 -0
  313. package/src/cli/handlers/change-set.ts +49 -1
  314. package/src/cli/handlers/fan-out.test.ts +48 -0
  315. package/src/cli/handlers/fan-out.ts +15 -3
  316. package/src/cli/handlers/operator.test.ts +37 -0
  317. package/src/cli/handlers/pr.test.ts +194 -0
  318. package/src/cli/handlers/pr.ts +168 -34
  319. package/src/cli/handlers/promote.test.ts +389 -5
  320. package/src/cli/handlers/promote.ts +279 -20
  321. package/src/cli/handlers/release-implicit.e2e.test.ts +153 -0
  322. package/src/cli/handlers/release.e2e.test.ts +85 -0
  323. package/src/cli/handlers/release.ts +206 -0
  324. package/src/cli/handlers/run-auto-release.test.ts +71 -0
  325. package/src/cli/handlers/run-events-cmd.test.ts +92 -0
  326. package/src/cli/handlers/run.test.ts +30 -0
  327. package/src/cli/handlers/run.ts +176 -15
  328. package/src/cli/main.test.ts +7 -0
  329. package/src/cli/main.ts +88 -13
  330. package/src/cli/mcp/never-over-mcp.test.ts +2 -0
  331. package/src/cli/mcp/workspace-tools.ts +1 -1
  332. package/src/cli/parse-args.ts +37 -3
  333. package/src/cli/registry.ts +29 -3
  334. package/src/cli/run-events.ts +54 -0
  335. package/src/cli/version.ts +3 -13
  336. package/src/codegen/docs-in-site.test.ts +166 -0
  337. package/src/codegen/docs-in-site.ts +182 -0
  338. package/src/codegen/docs-site/AgentPrompt.astro +26 -1
  339. package/src/codegen/docs-types.ts +14 -1
  340. package/src/codegen/docs.ts +60 -7
  341. package/src/codegen/rehype-base-url.d.mts +3 -1
  342. package/src/codegen/rehype-base-url.mjs +15 -9
  343. package/src/codegen/rehype-base-url.test.ts +34 -0
  344. package/src/components/auto-release.test.ts +21 -0
  345. package/src/components/auto-release.ts +6 -1
  346. package/src/components/cli-support.test.ts +82 -0
  347. package/src/components/cli-support.ts +16 -9
  348. package/src/components/driver.ts +129 -56
  349. package/src/components/fan-out-run.ts +56 -35
  350. package/src/components/pr-run.ts +30 -1
  351. package/src/components/promote-order.test.ts +90 -0
  352. package/src/components/promote-order.ts +75 -0
  353. package/src/components/promote.test.ts +10 -1
  354. package/src/components/promote.ts +26 -1
  355. package/src/components/release-compile.test.ts +147 -0
  356. package/src/components/release-compile.ts +445 -0
  357. package/src/components/release-gate.test.ts +215 -0
  358. package/src/components/release-gate.ts +341 -0
  359. package/src/components/release-promote.test.ts +159 -0
  360. package/src/components/release-promote.ts +232 -0
  361. package/src/components/run-progress.ts +7 -0
  362. package/src/components/wave-plan.ts +1 -1
  363. package/src/config.ts +7 -1
  364. package/src/index.ts +2 -0
  365. package/src/lifecycle/change-set-store.test.ts +217 -0
  366. package/src/lifecycle/change-set-store.ts +112 -0
  367. package/src/lifecycle/commit-sha.ts +23 -0
  368. package/src/lifecycle/gate-change-set.e2e.test.ts +122 -0
  369. package/src/lifecycle/gate-change-set.ts +133 -0
  370. package/src/lifecycle/gate-ledger.test.ts +33 -0
  371. package/src/lifecycle/gate-ledger.ts +66 -1
  372. package/src/lifecycle/release-cut-signed.test.ts +180 -0
  373. package/src/lifecycle/release-cut.test.ts +411 -0
  374. package/src/lifecycle/release-cut.ts +367 -0
  375. package/src/lifecycle/release-ledger.test.ts +14 -0
  376. package/src/lifecycle/release-ledger.ts +85 -17
  377. package/src/lifecycle/release-store.ts +423 -0
  378. package/src/lifecycle/run-ledger.test.ts +10 -0
  379. package/src/lifecycle/run-ledger.ts +6 -0
  380. package/src/op/activities/change-coverage.ts +4 -1
  381. package/src/op/activities/source-release.ts +8 -3
  382. package/src/op/activities/source-rollback.ts +8 -4
  383. package/src/op/activity-registry.ts +7 -5
  384. package/src/op/commit-run-gate-deploy-join.test.ts +117 -0
  385. package/src/op/discover-root.test.ts +39 -0
  386. package/src/op/discover.ts +15 -8
  387. package/src/op/gate-name.ts +13 -3
  388. package/src/op/gate-release.test.ts +126 -0
  389. package/src/op/gate-run-locator.test.ts +110 -0
  390. package/src/op/gate-run-locator.ts +35 -0
  391. package/src/op/gate.ts +88 -6
  392. package/src/op/local-executor.ts +207 -52
  393. package/src/op/op-waves-run.ts +4 -0
  394. package/src/op/run-events.test.ts +166 -0
  395. package/src/op/run-live.ts +1 -1
  396. package/src/op/runtime.ts +39 -0
  397. package/src/op/runtimes/local.test.ts +16 -0
  398. package/src/op/runtimes/local.ts +13 -2
  399. package/src/point-decision.ts +12 -2
  400. package/src/run-event-store.test.ts +144 -0
  401. package/src/run-event-store.ts +213 -0
  402. package/src/run-event-stream.test.ts +175 -0
  403. package/src/run-event-stream.ts +306 -0
  404. package/src/run-event.test.ts +277 -0
  405. package/src/run-event.ts +451 -0
  406. package/src/wave-loop-golden.test.ts +9 -0
  407. package/src/workspace/__fixtures__/run-event-check.ts +58 -0
  408. package/src/workspace/ancestry-index.test.ts +93 -0
  409. package/src/workspace/change-set-show.schema.json +102 -0
  410. package/src/workspace/change-set-show.ts +72 -0
  411. package/src/workspace/change-set.schema.json +28 -1
  412. package/src/workspace/changes-cli.ts +10 -1
  413. package/src/workspace/changes.schema.json +135 -0
  414. package/src/workspace/changes.test.ts +1 -1
  415. package/src/workspace/changes.ts +84 -2
  416. package/src/workspace/ci-green-cli.ts +75 -13
  417. package/src/workspace/ci-green-forge.ts +24 -4
  418. package/src/workspace/ci-green-runs.test.ts +242 -0
  419. package/src/workspace/ci-green-signed.test.ts +302 -0
  420. package/src/workspace/ci-green-workflow.test.ts +16 -0
  421. package/src/workspace/ci-green-workflow.ts +12 -0
  422. package/src/workspace/ci-green.test.ts +131 -2
  423. package/src/workspace/ci-green.ts +624 -42
  424. package/src/workspace/ci-last-green.schema.json +32 -2
  425. package/src/workspace/ci-list.schema.json +525 -0
  426. package/src/workspace/commit-links.test.ts +279 -0
  427. package/src/workspace/commit-links.ts +183 -0
  428. package/src/workspace/declaration.schema.json +12 -0
  429. package/src/workspace/declaration.ts +22 -2
  430. package/src/workspace/identity-gate-rule.ts +91 -7
  431. package/src/workspace/identity.ts +14 -1
  432. package/src/workspace/intent.ts +48 -1
  433. package/src/workspace/ls.schema.json +3 -1
  434. package/src/workspace/ls.ts +6 -0
  435. package/src/workspace/member-pipeline.test.ts +17 -0
  436. package/src/workspace/member-pipeline.ts +9 -0
  437. package/src/workspace/promotion-order.ts +97 -0
  438. package/src/workspace/read-contract.e2e.test.ts +4 -1
  439. package/src/workspace/reason-codes.test.ts +2 -1
  440. package/src/workspace/reason-codes.ts +4 -1
  441. package/src/workspace/releases.schema.json +391 -0
  442. package/src/workspace/releases.test.ts +108 -0
  443. package/src/workspace/releases.ts +122 -0
  444. package/src/workspace/run-event.schema.json +288 -0
  445. package/src/workspace/status-contract.test.ts +52 -1
  446. package/src/workspace/status-gates.ts +56 -1
  447. package/src/workspace/status-stewards.ts +6 -0
  448. package/src/workspace/status.schema.json +70 -1
  449. package/src/workspace/status.ts +80 -1
  450. package/src/workspace/trust/ci-tag-statement.ts +151 -0
  451. package/src/workspace/trust/op-run-statement.ts +148 -0
  452. package/src/workspace/trust/rotation.ts +61 -14
  453. package/src/workspace/trust/seal.ts +10 -0
  454. package/src/workspace/trust/ssh-commit.ts +10 -9
  455. package/src/cli/commands/__fixtures__/init-lexicon-output/docs/astro.config.mjs +0 -14
  456. package/src/cli/commands/__fixtures__/init-lexicon-output/docs/package.json +0 -16
  457. package/src/cli/commands/__fixtures__/init-lexicon-output/docs/src/content/docs/index.mdx +0 -8
  458. package/src/cli/commands/__fixtures__/init-lexicon-output/docs/src/content.config.ts +0 -15
  459. package/src/cli/commands/__fixtures__/init-lexicon-output/docs/tsconfig.json +0 -10
@@ -0,0 +1,391 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://intentius.io/chant/schemas/workspace/releases/v1/releases.schema.json",
4
+ "title": "chant release list output",
5
+ "description": "What `chant release list --json` prints (#4026, ws-104): every release of one member, each the compiled output of one green commit, with its artifact digests, one target per environment, its cuts and the environments that run it. It reads the local chant/lifecycle branch and never fetches. Version 1 of the read contract. Readers ignore fields they do not know; a field is only ever added within a version. The codes are a closed list, each in the one closed list of `reason-codes.ts`. Contract version 1 of this document is written by chant 0.124.28 and newer; the read contract as a whole by chant 0.81.0 and newer.",
6
+ "oneOf": [
7
+ {
8
+ "$ref": "#/$defs/result"
9
+ },
10
+ {
11
+ "$ref": "#/$defs/failure"
12
+ }
13
+ ],
14
+ "$defs": {
15
+ "result": {
16
+ "type": "object",
17
+ "description": "Exit code 0, with or without releases.",
18
+ "required": [
19
+ "$schema",
20
+ "contract",
21
+ "chant",
22
+ "member",
23
+ "releases",
24
+ "reason"
25
+ ],
26
+ "properties": {
27
+ "$schema": {
28
+ "const": "https://intentius.io/chant/schemas/workspace/releases/v1/releases.schema.json"
29
+ },
30
+ "contract": {
31
+ "const": 1
32
+ },
33
+ "chant": {
34
+ "type": "string"
35
+ },
36
+ "error": false,
37
+ "member": {
38
+ "type": [
39
+ "string",
40
+ "null"
41
+ ],
42
+ "description": "The workspace member read, its path of names joined with / when nested, or null for a project outside a workspace (the flat ledger layout)."
43
+ },
44
+ "releases": {
45
+ "type": "array",
46
+ "description": "Newest cut first. A release stored with no cut comes last.",
47
+ "items": {
48
+ "$ref": "#/$defs/release"
49
+ }
50
+ },
51
+ "reason": {
52
+ "description": "Null when everything was read. ledger-malformed when some release files or cut lines could not be read; the rest are listed.",
53
+ "oneOf": [
54
+ {
55
+ "type": "null"
56
+ },
57
+ {
58
+ "type": "object",
59
+ "required": [
60
+ "code",
61
+ "message"
62
+ ],
63
+ "properties": {
64
+ "code": {
65
+ "enum": [
66
+ "ledger-malformed"
67
+ ]
68
+ },
69
+ "message": {
70
+ "type": "string"
71
+ }
72
+ }
73
+ }
74
+ ]
75
+ }
76
+ }
77
+ },
78
+ "release": {
79
+ "type": "object",
80
+ "required": [
81
+ "releaseDigest",
82
+ "label",
83
+ "member",
84
+ "commit",
85
+ "artifactDigests",
86
+ "targets",
87
+ "cuts",
88
+ "environments"
89
+ ],
90
+ "properties": {
91
+ "releaseDigest": {
92
+ "type": "string",
93
+ "pattern": "^(jcs1-)?sha256:[0-9a-f]{64}$",
94
+ "description": "computePlanDigest(\"release\", subject) over member, commit, artifactDigests, and each target's env, templates and the name and value of each param. The file is _releases/<releaseDigest>.json on chant/lifecycle, with : written as _."
95
+ },
96
+ "label": {
97
+ "type": [
98
+ "string",
99
+ "null"
100
+ ],
101
+ "description": "The release's label, from its cuts, or null. A label names one release in a member and a release takes at most one label."
102
+ },
103
+ "member": {
104
+ "type": [
105
+ "string",
106
+ "null"
107
+ ]
108
+ },
109
+ "commit": {
110
+ "type": "string",
111
+ "pattern": "^[0-9a-f]{40,64}$",
112
+ "description": "The full sha of the green commit the release was cut from."
113
+ },
114
+ "artifactDigests": {
115
+ "type": "array",
116
+ "description": "Each image and asset built once from the commit, sorted by component, then path. A config-only release carries the previous release's entries.",
117
+ "items": {
118
+ "type": "object",
119
+ "required": [
120
+ "component",
121
+ "kind",
122
+ "path",
123
+ "digest"
124
+ ],
125
+ "properties": {
126
+ "component": {
127
+ "type": "string"
128
+ },
129
+ "kind": {
130
+ "enum": [
131
+ "image",
132
+ "asset"
133
+ ]
134
+ },
135
+ "path": {
136
+ "type": "string"
137
+ },
138
+ "digest": {
139
+ "type": "string",
140
+ "minLength": 1
141
+ }
142
+ }
143
+ }
144
+ },
145
+ "targets": {
146
+ "type": "array",
147
+ "description": "One per environment the member declares, sorted by env.",
148
+ "items": {
149
+ "$ref": "#/$defs/target"
150
+ }
151
+ },
152
+ "cuts": {
153
+ "type": "array",
154
+ "description": "Each cut of the release, oldest first.",
155
+ "items": {
156
+ "$ref": "#/$defs/cut"
157
+ }
158
+ },
159
+ "environments": {
160
+ "type": "array",
161
+ "description": "The environments that run the release, sorted by env: in each, the components whose latest deploy record names this release in releaseDigest. A promote with --release writes that field. An environment can run components of several releases.",
162
+ "items": {
163
+ "type": "object",
164
+ "required": [
165
+ "env",
166
+ "components"
167
+ ],
168
+ "properties": {
169
+ "env": {
170
+ "type": "string"
171
+ },
172
+ "components": {
173
+ "type": "array",
174
+ "items": {
175
+ "type": "string"
176
+ }
177
+ }
178
+ }
179
+ }
180
+ }
181
+ }
182
+ },
183
+ "target": {
184
+ "type": "object",
185
+ "required": [
186
+ "env",
187
+ "templates",
188
+ "params"
189
+ ],
190
+ "properties": {
191
+ "env": {
192
+ "type": "string"
193
+ },
194
+ "templates": {
195
+ "type": "array",
196
+ "description": "The files the environment's deploys read, compiled for it, sorted by component, then path.",
197
+ "items": {
198
+ "type": "object",
199
+ "required": [
200
+ "component",
201
+ "path",
202
+ "digest"
203
+ ],
204
+ "properties": {
205
+ "component": {
206
+ "type": [
207
+ "string",
208
+ "null"
209
+ ],
210
+ "description": "The component whose deploy reads it, or null for a project with no components."
211
+ },
212
+ "path": {
213
+ "type": "string",
214
+ "description": "The path the deploy step names, relative to the member's directory."
215
+ },
216
+ "digest": {
217
+ "type": "string",
218
+ "pattern": "^(jcs1-)?sha256:[0-9a-f]{64}$",
219
+ "description": "sha256 of the file's bytes."
220
+ }
221
+ }
222
+ }
223
+ },
224
+ "params": {
225
+ "type": "array",
226
+ "description": "The resolved build parameters the environment was compiled with, sorted by name. source is outside the release digest.",
227
+ "items": {
228
+ "type": "object",
229
+ "required": [
230
+ "name",
231
+ "value",
232
+ "source"
233
+ ],
234
+ "properties": {
235
+ "name": {
236
+ "type": "string"
237
+ },
238
+ "value": {
239
+ "oneOf": [
240
+ {
241
+ "type": "string"
242
+ },
243
+ {
244
+ "type": "number"
245
+ },
246
+ {
247
+ "type": "boolean"
248
+ }
249
+ ]
250
+ },
251
+ "source": {
252
+ "type": "string",
253
+ "description": "cli, params-file, env or default."
254
+ }
255
+ }
256
+ }
257
+ }
258
+ }
259
+ },
260
+ "cut": {
261
+ "type": "object",
262
+ "required": [
263
+ "label",
264
+ "actor",
265
+ "timestamp",
266
+ "runOrigin",
267
+ "signature"
268
+ ],
269
+ "properties": {
270
+ "label": {
271
+ "type": [
272
+ "string",
273
+ "null"
274
+ ]
275
+ },
276
+ "actor": {
277
+ "type": "string"
278
+ },
279
+ "timestamp": {
280
+ "type": "string",
281
+ "description": "ISO 8601."
282
+ },
283
+ "runOrigin": {
284
+ "oneOf": [
285
+ {
286
+ "type": "null"
287
+ },
288
+ {
289
+ "type": "object",
290
+ "required": [
291
+ "forge"
292
+ ],
293
+ "properties": {
294
+ "forge": {
295
+ "enum": [
296
+ "github",
297
+ "gitlab",
298
+ "op",
299
+ "local"
300
+ ]
301
+ },
302
+ "repo": {
303
+ "type": "string"
304
+ },
305
+ "url": {
306
+ "type": "string"
307
+ }
308
+ }
309
+ }
310
+ ],
311
+ "description": "The CI run the cut ran in: the forge (github for GitHub and Forgejo, gitlab), the repo or project, and a link to the run. Null outside CI."
312
+ },
313
+ "signature": {
314
+ "type": [
315
+ "string",
316
+ "null"
317
+ ],
318
+ "description": "Added by #4031, written by chant 0.124.28 and newer. The cut's armored ssh signature (ssh-keygen -Y sign, namespace chant-release) by the actor's key, over the release digest, the label (empty for none), the actor and the timestamp, joined by LF with no final newline. Null for an unsigned cut. A reader checks it against .chant/allowed_signers at base; signatureCheck is chant's own check."
319
+ },
320
+ "signatureCheck": {
321
+ "type": "object",
322
+ "description": "Added within contract version 1 by #4031, written by chant 0.124.28 and newer. Whether signature verifies for actor against the signers file at base and, when the declaration at base names a release gate in identity.gates with a class, whether the role grants in .chant/trust.json at base put actor in it. Judged on every read.",
323
+ "required": [
324
+ "status",
325
+ "key",
326
+ "reason"
327
+ ],
328
+ "properties": {
329
+ "status": {
330
+ "enum": [
331
+ "verified",
332
+ "unsigned",
333
+ "unverified"
334
+ ],
335
+ "description": "verified: the signature verifies, and the actor is in the release gate's class when it names one. unsigned: the cut has no signature. unverified: it has one that does not count, and reason says why."
336
+ },
337
+ "key": {
338
+ "type": [
339
+ "string",
340
+ "null"
341
+ ],
342
+ "description": "The fingerprint (SHA256:...) of the key in the signature, or null for an unsigned cut or a signature that can't be read. Reported, never trusted."
343
+ },
344
+ "reason": {
345
+ "type": "string"
346
+ }
347
+ }
348
+ }
349
+ }
350
+ },
351
+ "failure": {
352
+ "type": "object",
353
+ "description": "Nothing was read. Exit code 1.",
354
+ "required": [
355
+ "$schema",
356
+ "contract",
357
+ "chant",
358
+ "error"
359
+ ],
360
+ "properties": {
361
+ "$schema": {
362
+ "const": "https://intentius.io/chant/schemas/workspace/releases/v1/releases.schema.json"
363
+ },
364
+ "contract": {
365
+ "const": 1
366
+ },
367
+ "chant": {
368
+ "type": "string"
369
+ },
370
+ "error": {
371
+ "type": "object",
372
+ "required": [
373
+ "code",
374
+ "message"
375
+ ],
376
+ "properties": {
377
+ "code": {
378
+ "enum": [
379
+ "not-a-git-repository",
380
+ "ledger-unreadable"
381
+ ]
382
+ },
383
+ "message": {
384
+ "type": "string"
385
+ }
386
+ }
387
+ }
388
+ }
389
+ }
390
+ }
391
+ }
@@ -0,0 +1,288 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://intentius.io/chant/schemas/workspace/run-event/v1/run-event.schema.json",
4
+ "title": "chant run event",
5
+ "description": "One event of a run's stream (#4019, behold #678): one JSON object per line, written by writeRunEvent and createRunEventWriter in src/run-event.ts. It covers Op runs, component runs and pipeline runs alike. Every event names the run, what it ran, the commit it built from and the runtime it ran on, so a reader shows a run the same way wherever it happened. A run's stream opens with run-start and ends with run-settle, whose status is the run's verdict; seq counts the events from 0. Version 1 of the read contract. Readers ignore fields they do not know; a field is only ever added within a version. The status sets are closed. Contract version 1 of this document is written by chant 0.124.28 and newer; the read contract as a whole by chant 0.81.0 and newer.",
6
+ "oneOf": [
7
+ { "$ref": "#/$defs/run-start" },
8
+ { "$ref": "#/$defs/run-settle" },
9
+ { "$ref": "#/$defs/wave-start" },
10
+ { "$ref": "#/$defs/wave-settle" },
11
+ { "$ref": "#/$defs/component-start" },
12
+ { "$ref": "#/$defs/component-settle" },
13
+ { "$ref": "#/$defs/phase-start" },
14
+ { "$ref": "#/$defs/phase-settle" },
15
+ { "$ref": "#/$defs/step-start" },
16
+ { "$ref": "#/$defs/step-settle" },
17
+ { "$ref": "#/$defs/gate-waiting" },
18
+ { "$ref": "#/$defs/gate-resolved" }
19
+ ],
20
+ "$defs": {
21
+ "envelope": {
22
+ "type": "object",
23
+ "description": "What every event carries.",
24
+ "required": ["$schema", "contract", "chant", "seq", "at", "type", "runId", "kind", "name", "gitSha", "runtime", "runOrigin"],
25
+ "properties": {
26
+ "$schema": { "const": "https://intentius.io/chant/schemas/workspace/run-event/v1/run-event.schema.json" },
27
+ "contract": { "const": 1 },
28
+ "chant": { "type": "string", "description": "The version of the chant that wrote the event." },
29
+ "seq": { "type": "integer", "minimum": 0, "description": "The event's place in its run's stream: 0 for run-start, one more for each event after it." },
30
+ "at": { "type": "string", "description": "When the event happened, ISO-8601." },
31
+ "type": { "type": "string" },
32
+ "runId": { "type": "string", "minLength": 1, "description": "The run's own id: an Op run's id, a component run's id (the id its release records carry, the CI run id in CI, else one minted locally), or the CI run id for a pipeline run. runOrigin says where it ran, which for an Op run in CI is the CI run, not the id space of runId." },
33
+ "kind": { "enum": ["op", "component", "pipeline"], "description": "What ran: an Op, a component selection (chant run --components), or a CI pipeline." },
34
+ "name": { "type": "string", "description": "The Op's name, the component selection as given, or the pipeline's name." },
35
+ "gitSha": {
36
+ "type": ["string", "null"],
37
+ "pattern": "^[0-9a-f]{40,64}$",
38
+ "description": "The commit the run built from, the same field a release record carries. Null when the run did not start in a git checkout."
39
+ },
40
+ "runtime": {
41
+ "enum": ["local", "steward", "ci"],
42
+ "description": "Where the run happened: in the process that started it, on a steward, or in a forge's CI."
43
+ },
44
+ "runOrigin": { "$ref": "#/$defs/runOrigin" }
45
+ }
46
+ },
47
+ "runOrigin": {
48
+ "type": "object",
49
+ "description": "Where the run ran and how to reach it: RunOrigin from lifecycle/release-ledger.ts, the shape a release record's runOrigin has. For an Op run in CI it locates the CI run, as the Op's run record does (#4020), while runId stays the Op run's own id.",
50
+ "required": ["forge"],
51
+ "properties": {
52
+ "forge": {
53
+ "enum": ["github", "gitlab", "op", "local"],
54
+ "description": "github: a GitHub Actions run, also the spelling Forgejo Actions uses. gitlab: a CI pipeline. op: a steward's run, named by its Op run id. local: a run on the machine that started it, outside CI."
55
+ },
56
+ "repo": { "type": "string", "description": "The repository or project slug on the forge, when the environment named one." },
57
+ "url": { "type": "string", "description": "A link to the run, when the environment gave enough to build one." }
58
+ }
59
+ },
60
+ "settleStatus": {
61
+ "enum": ["ok", "failed", "gated", "waiting"],
62
+ "description": "How a run, wave, component or phase settled. gated: it stopped at a gate nobody has approved. waiting: it stopped at a decision point nobody has answered. Neither is a failure."
63
+ },
64
+ "stepIndex": { "type": "integer", "minimum": 0, "description": "The step's place in its phase as authored, counting from 0, so two steps of one phase that share a name stay apart. Optional, added within contract 1 by chant 0.124.28 (#4041). A writer leaves it out for a step it has no authored place for, and a reader without it pairs a step-start with its step-settle by component, phase and step in stream order." },
65
+ "component": {
66
+ "type": ["string", "null"],
67
+ "description": "The component whose composition the phase or step belongs to in a component run, and null in an Op or pipeline run."
68
+ },
69
+ "run-start": {
70
+ "allOf": [
71
+ { "$ref": "#/$defs/envelope" },
72
+ {
73
+ "type": "object",
74
+ "description": "The run is about to start.",
75
+ "required": ["type", "waves"],
76
+ "properties": {
77
+ "type": { "const": "run-start" },
78
+ "waves": {
79
+ "type": ["array", "null"],
80
+ "items": { "type": "array", "items": { "type": "string" } },
81
+ "description": "In a component run, the waves of components the run will attempt, in order; wave numbers in later events count from 1 into this list. Null in an Op or pipeline run."
82
+ }
83
+ }
84
+ }
85
+ ]
86
+ },
87
+ "run-settle": {
88
+ "allOf": [
89
+ { "$ref": "#/$defs/envelope" },
90
+ {
91
+ "type": "object",
92
+ "description": "The run settled. The last event of the stream, and its verdict.",
93
+ "required": ["type", "status", "durationMs"],
94
+ "properties": {
95
+ "type": { "const": "run-settle" },
96
+ "status": { "$ref": "#/$defs/settleStatus" },
97
+ "durationMs": { "type": ["integer", "null"], "minimum": 0, "description": "From run-start to now, or null when the writer did not time it." },
98
+ "error": { "type": "string", "description": "With status failed, what failed, when the writer knows." }
99
+ }
100
+ }
101
+ ]
102
+ },
103
+ "wave-start": {
104
+ "allOf": [
105
+ { "$ref": "#/$defs/envelope" },
106
+ {
107
+ "type": "object",
108
+ "description": "A wave of a component run is about to start. Its components may run at the same time.",
109
+ "required": ["type", "wave", "components"],
110
+ "properties": {
111
+ "type": { "const": "wave-start" },
112
+ "wave": { "type": "integer", "minimum": 1 },
113
+ "components": { "type": "array", "items": { "type": "string" } }
114
+ }
115
+ }
116
+ ]
117
+ },
118
+ "wave-settle": {
119
+ "allOf": [
120
+ { "$ref": "#/$defs/envelope" },
121
+ {
122
+ "type": "object",
123
+ "description": "A wave settled. failed if any component in it failed, which stops the run before the next wave.",
124
+ "required": ["type", "wave", "status"],
125
+ "properties": {
126
+ "type": { "const": "wave-settle" },
127
+ "wave": { "type": "integer", "minimum": 1 },
128
+ "status": { "$ref": "#/$defs/settleStatus" }
129
+ }
130
+ }
131
+ ]
132
+ },
133
+ "component-start": {
134
+ "allOf": [
135
+ { "$ref": "#/$defs/envelope" },
136
+ {
137
+ "type": "object",
138
+ "description": "A component in a wave is about to start its deploy composition.",
139
+ "required": ["type", "wave", "component"],
140
+ "properties": {
141
+ "type": { "const": "component-start" },
142
+ "wave": { "type": "integer", "minimum": 1 },
143
+ "component": { "type": "string" }
144
+ }
145
+ }
146
+ ]
147
+ },
148
+ "component-settle": {
149
+ "allOf": [
150
+ { "$ref": "#/$defs/envelope" },
151
+ {
152
+ "type": "object",
153
+ "description": "A component's composition settled, after any rollback the run did for it.",
154
+ "required": ["type", "wave", "component", "status"],
155
+ "properties": {
156
+ "type": { "const": "component-settle" },
157
+ "wave": { "type": "integer", "minimum": 1 },
158
+ "component": { "type": "string" },
159
+ "status": { "$ref": "#/$defs/settleStatus" }
160
+ }
161
+ }
162
+ ]
163
+ },
164
+ "phase-start": {
165
+ "allOf": [
166
+ { "$ref": "#/$defs/envelope" },
167
+ {
168
+ "type": "object",
169
+ "description": "A phase is about to run its steps: an Op's phase, a component composition's phase, or a pipeline's stage.",
170
+ "required": ["type", "component", "phase"],
171
+ "properties": {
172
+ "type": { "const": "phase-start" },
173
+ "component": { "$ref": "#/$defs/component" },
174
+ "phase": { "type": "string" }
175
+ }
176
+ }
177
+ ]
178
+ },
179
+ "phase-settle": {
180
+ "allOf": [
181
+ { "$ref": "#/$defs/envelope" },
182
+ {
183
+ "type": "object",
184
+ "description": "A phase settled: ok when every step in it settled ok, skipped or cached.",
185
+ "required": ["type", "component", "phase", "status"],
186
+ "properties": {
187
+ "type": { "const": "phase-settle" },
188
+ "component": { "$ref": "#/$defs/component" },
189
+ "phase": { "type": "string" },
190
+ "status": { "$ref": "#/$defs/settleStatus" }
191
+ }
192
+ }
193
+ ]
194
+ },
195
+ "step-start": {
196
+ "allOf": [
197
+ { "$ref": "#/$defs/envelope" },
198
+ {
199
+ "type": "object",
200
+ "description": "A step is about to run: an Op or composition step, or a pipeline's job. A step that never started, such as one an earlier failure stopped, has a step-settle and no step-start.",
201
+ "required": ["type", "component", "phase", "step"],
202
+ "properties": {
203
+ "type": { "const": "step-start" },
204
+ "component": { "$ref": "#/$defs/component" },
205
+ "phase": { "type": "string" },
206
+ "step": { "type": "string", "description": "The step's activity, gate:<name> for a gate, effect:<name> for an effect, or the job's name." },
207
+ "index": { "$ref": "#/$defs/stepIndex" }
208
+ }
209
+ }
210
+ ]
211
+ },
212
+ "step-settle": {
213
+ "allOf": [
214
+ { "$ref": "#/$defs/envelope" },
215
+ {
216
+ "type": "object",
217
+ "description": "A step settled.",
218
+ "required": ["type", "component", "phase", "step", "status", "durationMs"],
219
+ "properties": {
220
+ "type": { "const": "step-settle" },
221
+ "component": { "$ref": "#/$defs/component" },
222
+ "phase": { "type": "string" },
223
+ "step": { "type": "string" },
224
+ "index": { "$ref": "#/$defs/stepIndex" },
225
+ "status": {
226
+ "enum": ["ok", "failed", "skipped", "cached", "gated", "waiting"],
227
+ "description": "ok: it ran and succeeded. failed: it ran and failed. skipped: it did not run, and skip says why. cached: a cache hit stood in for running it (#4015). gated: it stopped the run at a gate nobody has approved. waiting: it stopped the run at a decision point nobody has answered."
228
+ },
229
+ "skip": {
230
+ "enum": ["receipt", "resumed", "refused", "not-run", null],
231
+ "description": "With status skipped. receipt: the effect's receipt matched, so it had already applied. resumed: the run resumed at a later gate and carried this step's output from an earlier run. refused: it declined to go on, and message says why. not-run: an earlier step failed or stopped the run. Null when the writer does not know."
232
+ },
233
+ "durationMs": { "type": ["integer", "null"], "minimum": 0, "description": "How long it ran, or null when the writer did not time it." },
234
+ "error": { "type": "string", "description": "With status failed, what failed." },
235
+ "message": { "type": "string", "description": "Why a step skipped, gated or waited, for a person." }
236
+ }
237
+ }
238
+ ]
239
+ },
240
+ "gate-waiting": {
241
+ "allOf": [
242
+ { "$ref": "#/$defs/envelope" },
243
+ {
244
+ "type": "object",
245
+ "description": "The run stopped and waits on a person: a gate nobody has approved, or a decision point nobody has answered. The step settles gated or waiting next.",
246
+ "required": ["type", "component", "phase", "step", "op", "gate", "point"],
247
+ "properties": {
248
+ "type": { "const": "gate-waiting" },
249
+ "component": { "$ref": "#/$defs/component" },
250
+ "phase": { "type": "string" },
251
+ "step": { "type": "string" },
252
+ "index": { "$ref": "#/$defs/stepIndex" },
253
+ "op": { "type": "string", "description": "The op the gate is recorded under, which chant approve takes. It differs from name when a step's command stopped at a gate of its own." },
254
+ "gate": { "type": ["string", "null"], "description": "The gate's name, or null when the step waits on a decision point alone." },
255
+ "point": { "type": ["string", "null"], "description": "The answer record id of the open question, which points answer takes, or null." },
256
+ "message": { "type": "string", "description": "Why the gate did not pass, such as an approval for a different plan." }
257
+ }
258
+ }
259
+ ]
260
+ },
261
+ "gate-resolved": {
262
+ "allOf": [
263
+ { "$ref": "#/$defs/envelope" },
264
+ {
265
+ "type": "object",
266
+ "description": "A gate the run reached was approved, so its step goes on.",
267
+ "required": ["type", "component", "phase", "step", "op", "gate", "resolvedBy", "resolvedAt", "via"],
268
+ "properties": {
269
+ "type": { "const": "gate-resolved" },
270
+ "component": { "$ref": "#/$defs/component" },
271
+ "phase": { "type": "string" },
272
+ "step": { "type": "string" },
273
+ "index": { "$ref": "#/$defs/stepIndex" },
274
+ "op": { "type": "string" },
275
+ "gate": { "type": "string" },
276
+ "resolvedBy": { "type": "string", "description": "Who approved it." },
277
+ "resolvedAt": { "type": "string", "description": "When the approval was recorded, ISO-8601." },
278
+ "via": {
279
+ "enum": ["quorum", "policy", "point", "alias", "empty", null],
280
+ "description": "How the approval passed when it was more than one person's approval of this gate: a quorum, a policy permit, a decision point's answer, or an approval recorded under one of the gate's aliases. empty (added within contract 1 by #4045, chant 0.124.28 and newer): a release gate passed over an empty change set with no approval, on the resolution the promote wrote, whose resolvedBy is the actor running it."
281
+ },
282
+ "url": { "type": "string", "description": "Where the approval was made, when known." }
283
+ }
284
+ }
285
+ ]
286
+ }
287
+ }
288
+ }