@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
@@ -26,7 +26,7 @@
26
26
  */
27
27
 
28
28
  import type { Declaration, SignedGate } from "./declaration";
29
- import { admitApprover } from "./identity-gate-rule";
29
+ import { admitApprover, RELEASE_GATE, type GateAdmissionRule } from "./identity-gate-rule";
30
30
  import { classesOf, coreClassRegistry, roleGrants, type ClassRegistry } from "./principal-classes";
31
31
  import type { ReasonCode } from "./reason-codes";
32
32
  import { normalisePrincipal } from "./records";
@@ -165,6 +165,19 @@ export function gateAdmissionFrom(source: GateRuleSource, gate: string): GateAdm
165
165
  return { requirement, refuses: (a) => admitApprover(rule, a) };
166
166
  }
167
167
 
168
+ /**
169
+ * The rule a release cut is judged by (#4031): the declaration's
170
+ * `identity.gates.release` entry with its class, read at base, or, when the
171
+ * declaration names no `release` gate, a rule with no class, which checks a
172
+ * cut's signature alone. `requirement` is null in that case, and a cut may
173
+ * then be made unsigned.
174
+ */
175
+ export function releaseRuleFrom(source: GateRuleSource): { requirement: SignedGate | null; rule: GateAdmissionRule } {
176
+ const requirement = source.declaration?.identity?.gates[RELEASE_GATE] ?? null;
177
+ const { policy, classes } = source;
178
+ return { requirement, rule: { gate: RELEASE_GATE, class: requirement?.class ?? null, signers: policy, roles: roleGrants(policy), classes: classes.all() } };
179
+ }
180
+
168
181
  /**
169
182
  * The rule for `gate` in the workspace holding `cwd`, read at base (the
170
183
  * target branch tip), or null when there is no declaration or it names none.
@@ -772,9 +772,56 @@ export function windowOpening(top: string, rev: string, view: Pick<RecordView, "
772
772
  return view.decidedIn?.sha ?? addingCommit(top, rev, view.path);
773
773
  }
774
774
 
775
- /** `commit` and every commit between it and `rev` that has it as an ancestor. */
775
+ /** A full commit id, as git prints it: lowercase hex, sha1 or sha256. */
776
+ const FULL_COMMIT_ID = /^(?:[0-9a-f]{40}|[0-9a-f]{64})$/;
777
+
778
+ /**
779
+ * The children of every commit `rev` reaches, from one `git rev-list
780
+ * --parents` walk (#4032). Kept in memory for the last repository and commit
781
+ * read, since a walk asks for the windows of many records at one revision. A
782
+ * commit id names the same history for good, so the entry never goes stale.
783
+ */
784
+ let childIndex: { key: string; children: Map<string, string[]> } | undefined;
785
+
786
+ function childrenWithin(top: string, rev: string): Map<string, string[]> | undefined {
787
+ const key = `${top}\0${rev}`;
788
+ if (childIndex?.key === key) return childIndex.children;
789
+ const text = tryGit(top, ["rev-list", "--parents", rev]);
790
+ if (text === undefined) return undefined;
791
+ const children = new Map<string, string[]>();
792
+ for (const row of text.split("\n")) {
793
+ const [commit, ...parents] = row.trim().split(" ");
794
+ if (!commit) continue;
795
+ for (const p of parents) {
796
+ const list = children.get(p);
797
+ if (list) list.push(commit);
798
+ else children.set(p, [commit]);
799
+ }
800
+ }
801
+ childIndex = { key, children };
802
+ return children;
803
+ }
804
+
805
+ /**
806
+ * `commit` and every commit between it and `rev` that has it as an ancestor:
807
+ * what `git rev-list --ancestry-path <commit>..<rev>` lists, plus `commit`.
808
+ * With full commit ids it is read from the children of what `rev` reaches,
809
+ * walked once per revision, instead of one `git rev-list` per record (#4032).
810
+ */
776
811
  export function descendants(top: string, commit: string, rev: string): Set<string> {
777
812
  const out = new Set<string>([commit]);
813
+ const children = FULL_COMMIT_ID.test(commit) && FULL_COMMIT_ID.test(rev) ? childrenWithin(top, rev) : undefined;
814
+ if (children) {
815
+ const stack = [commit];
816
+ while (stack.length > 0) {
817
+ for (const c of children.get(stack.pop()!) ?? []) {
818
+ if (out.has(c)) continue;
819
+ out.add(c);
820
+ stack.push(c);
821
+ }
822
+ }
823
+ return out;
824
+ }
778
825
  const text = tryGit(top, ["rev-list", "--ancestry-path", `${commit}..${rev}`]);
779
826
  for (const line of (text ?? "").split("\n")) if (line.trim()) out.add(line.trim());
780
827
  return out;
@@ -25,7 +25,9 @@
25
25
  }
26
26
  }
27
27
  },
28
- "require": { "type": "array", "items": { "type": "string" } }
28
+ "require": { "type": "array", "items": { "type": "string" } },
29
+ "signedSince": { "type": "string", "description": "Added in contract 1 by #4031, written by chant 0.124.28 and newer, and only when the declaration sets it: the full sha of the first commit whose ci tags count only with a statement signed by a runner key. Tags on its strict first-parent ancestors count unsigned." },
30
+ "source": { "const": "runs", "description": "Added in contract 1 by #4044, written by chant 0.124.28 and newer, and only when the declaration sets ci.green.source to runs: ci tick reads each phase's results from chant's own Op runs on chant/lifecycle, each signed by a runner key, in place of the forge's check runs. Absent means check runs." }
29
31
  }
30
32
  },
31
33
  "result": {
@@ -144,6 +144,10 @@ export interface LsCiGreen {
144
144
  window: string;
145
145
  phases: { name: string; runs: string[]; skipped: "pass" | "fail" }[];
146
146
  require: string[];
147
+ /** The first commit whose ci tags need a signed statement (#4031). Present only when the declaration sets it. */
148
+ signedSince?: string;
149
+ /** Where the tick reads phase results (#4044). Present only when it is `runs`; absent means the forge's check runs. */
150
+ source?: "runs";
147
151
  }
148
152
 
149
153
  export interface LsGroup {
@@ -322,6 +326,8 @@ function readListing(query: LsQuery): { doc: LsDocument; declaration?: Declarati
322
326
  window: declaration.ci.green.window,
323
327
  phases: declaration.ci.green.phases.map((p) => ({ name: p.name, runs: p.runs, skipped: p.skipped })),
324
328
  require: declaration.ci.green.require,
329
+ ...(declaration.ci.green.signedSince !== null ? { signedSince: declaration.ci.green.signedSince } : {}),
330
+ ...(declaration.ci.green.source === "runs" ? { source: "runs" as const } : {}),
325
331
  }
326
332
  : null,
327
333
  }
@@ -95,6 +95,23 @@ describe("the component pipeline's file and command", () => {
95
95
  expect(plan.command).toBe("chant build --components --generate github --env staging --pr-loop --gate infra-apply --branch trunk");
96
96
  });
97
97
 
98
+ test("the recorded command keeps --image and each --before-script, in order (#4002)", () => {
99
+ const dir = join(repo, "services/api");
100
+ const plan = planMemberComponentPipeline({
101
+ projectDir: dir,
102
+ found: findWorkspaceRoot(dir)!,
103
+ lexicon: "forgejo",
104
+ env: "staging",
105
+ output: join(dir, "pr.yml"),
106
+ prLoop: {},
107
+ image: "node:22-bookworm",
108
+ beforeScript: ["npm ci", 'echo "$PWD/node_modules/.bin" >> "$GITHUB_PATH"'],
109
+ })!;
110
+ expect(plan.command).toBe(
111
+ `chant build --components --generate forgejo --env staging --pr-loop --image node:22-bookworm --before-script 'npm ci' --before-script 'echo "$PWD/node_modules/.bin" >> "$GITHUB_PATH"' --output pr.yml`,
112
+ );
113
+ });
114
+
98
115
  test("the recorded command keeps --wave-gate, --canary and --base (#3049)", () => {
99
116
  const dir = join(repo, "services/api");
100
117
  const plan = planMemberComponentPipeline({
@@ -205,6 +205,8 @@ export interface ComponentPlanInput {
205
205
  /** `--env`, or undefined for the generator's default. */
206
206
  env?: string;
207
207
  promoteTo?: string;
208
+ /** `--allow-skip` (#4030): the generated promote job may skip a step of the promotion order. */
209
+ allowSkip?: boolean;
208
210
  /** `--output`, relative to the current directory. */
209
211
  output?: string;
210
212
  params?: string[];
@@ -213,6 +215,10 @@ export interface ComponentPlanInput {
213
215
  prLoop?: { gate?: string; branch?: string };
214
216
  /** `--wave-gate` with its `--canary` and `--base` (#3049). */
215
217
  waveGate?: { gate: string; canary?: string[]; base?: string };
218
+ /** `--image` (#4002). */
219
+ image?: string;
220
+ /** `--before-script`, in order (#4002). */
221
+ beforeScript?: string[];
216
222
  }
217
223
 
218
224
  /** The generators' own default environment when `--env` is not given. */
@@ -242,6 +248,7 @@ export function planMemberComponentPipeline(input: ComponentPlanInput): MemberCo
242
248
 
243
249
  const parts = ["chant", "build", "--components", "--generate", input.lexicon, "--env", env];
244
250
  if (input.promoteTo) parts.push("--promote-to", input.promoteTo);
251
+ if (input.promoteTo && input.allowSkip) parts.push("--allow-skip");
245
252
  if (input.waveGate) {
246
253
  parts.push("--wave-gate", input.waveGate.gate);
247
254
  if (input.waveGate.canary?.length) parts.push("--canary", input.waveGate.canary.join(","));
@@ -252,6 +259,8 @@ export function planMemberComponentPipeline(input: ComponentPlanInput): MemberCo
252
259
  if (input.prLoop.gate) parts.push("--gate", input.prLoop.gate);
253
260
  if (input.prLoop.branch) parts.push("--branch", input.prLoop.branch);
254
261
  }
262
+ if (input.image) parts.push("--image", input.image);
263
+ for (const line of input.beforeScript ?? []) parts.push("--before-script", line);
255
264
  for (const p of input.params ?? []) parts.push("--param", p);
256
265
  if (input.paramsFile) parts.push("--params-file", relPath(ctx.memberRoot, resolve(input.paramsFile)));
257
266
  if (input.output) parts.push("--output", relPath(ctx.memberRoot, target));
@@ -0,0 +1,97 @@
1
+ /**
2
+ * A member's promotion order (#4030): the literal entries of the `environments`
3
+ * array in its `chant.config.ts`, in the order written. A release moves from
4
+ * each environment to the next, so `chant components promote --to <env>` can
5
+ * default `--from` to the step before, and `chant workspace status --json`
6
+ * lists the order for a reader such as behold's lane.
7
+ *
8
+ * A pattern entry such as `pr-*` names no environment, so it is not a step.
9
+ * A component's own `environments` (`component.schema.json`) say where its
10
+ * release is hosted in each environment and never set the order.
11
+ *
12
+ * `canary` marks a step as the canary step. It is declared and surfaced only:
13
+ * no chant command acts on it yet.
14
+ */
15
+
16
+ import { existsSync, readFileSync } from "node:fs";
17
+ import { join } from "node:path";
18
+ import { environmentName, isEnvironmentPattern, type EnvironmentDeclaration } from "../config";
19
+
20
+ /** One step of a member's promotion order. */
21
+ export interface PromotionStep {
22
+ name: string;
23
+ /** True when the entry sets `canary: true`. */
24
+ canary: boolean;
25
+ }
26
+
27
+ /** The member's promotion order from its config's `environments`; `[]` when it declares none. A repeated name keeps its first place. */
28
+ export function promotionOrder(declared: readonly EnvironmentDeclaration[] | null | undefined): PromotionStep[] {
29
+ const out: PromotionStep[] = [];
30
+ for (const entry of declared ?? []) {
31
+ const name = environmentName(entry);
32
+ if (isEnvironmentPattern(name) || out.some((s) => s.name === name)) continue;
33
+ out.push({ name, canary: typeof entry !== "string" && entry.canary === true });
34
+ }
35
+ return out;
36
+ }
37
+
38
+ const STRING = String.raw`(?:"[^"\\\n\[\]{}]*"|'[^'\\\n\[\]{}]*')`;
39
+ const PROP = String.raw`(?:(?:name|endpoint)\s*:\s*${STRING}|canary\s*:\s*(?:true|false))`;
40
+ const ENTRY = String.raw`(?:${STRING}|\{\s*(?:${PROP}\s*,?\s*)*\})`;
41
+ const ARRAY = new RegExp(String.raw`^\[\s*(?:${ENTRY}\s*,?\s*)*\]$`);
42
+
43
+ /**
44
+ * The promotion order a `chant.config.ts` writes as literals, read from its
45
+ * text without running it, or `undefined` when the text is not that simple.
46
+ * Evaluating a TypeScript config loads tsx, and `workspace status` reads every
47
+ * member without that cost (#3976), so the plain cases are read here and the
48
+ * rest fall back to loading the config. The plain cases are a config with no
49
+ * `environments` and no spread, and one whose only `environments` is an array
50
+ * of string entries and `{ name, endpoint, canary }` entries with literal values.
51
+ */
52
+ export function staticPromotionOrder(source: string): PromotionStep[] | undefined {
53
+ const text = source.replace(/("(?:[^"\\\n]|\\.)*"|'(?:[^'\\\n]|\\.)*'|`(?:[^`\\]|\\.)*`)|\/\*[\s\S]*?\*\/|\/\/[^\n]*/g, "$1");
54
+ const mentions = text.match(/\benvironments\b/g)?.length ?? 0;
55
+ if (mentions === 0) return /export\s+default\s*\{/.test(text) && !text.includes("...") ? [] : undefined;
56
+ if (mentions > 1 || text.includes("...")) return undefined;
57
+ const start = text.match(/\benvironments\s*:\s*(\[)/);
58
+ if (!start || start.index === undefined) return undefined;
59
+ const open = start.index + start[0].length - 1;
60
+ const close = text.indexOf("]", open);
61
+ if (close < 0) return undefined;
62
+ const array = text.slice(open, close + 1);
63
+ if (!ARRAY.test(array)) return undefined;
64
+ const entries: EnvironmentDeclaration[] = [];
65
+ for (const m of array.matchAll(new RegExp(`${STRING}|\\{[^}]*\\}`, "g"))) {
66
+ const raw = m[0];
67
+ if (raw.startsWith("{")) {
68
+ const name = raw.match(/\bname\s*:\s*(?:"([^"]*)"|'([^']*)')/);
69
+ if (!name) return undefined;
70
+ entries.push({ name: name[1] ?? name[2], canary: /\bcanary\s*:\s*true\b/.test(raw) });
71
+ } else {
72
+ entries.push(raw.slice(1, -1));
73
+ }
74
+ }
75
+ return promotionOrder(entries);
76
+ }
77
+
78
+ /**
79
+ * One member's promotion order from its directory's config: `[]` when it has
80
+ * none or declares no environments, and null when the config can't be read.
81
+ * A TypeScript config is read as text when it is plain ({@link staticPromotionOrder}),
82
+ * and loaded otherwise.
83
+ */
84
+ export async function readMemberPromotionOrder(dir: string): Promise<PromotionStep[] | null> {
85
+ try {
86
+ const ts = join(dir, "chant.config.ts");
87
+ if (existsSync(ts)) {
88
+ const plain = staticPromotionOrder(readFileSync(ts, "utf-8"));
89
+ if (plain) return plain;
90
+ }
91
+ const { loadChantConfig } = await import("../config");
92
+ const { config } = await loadChantConfig(dir);
93
+ return promotionOrder(config.environments);
94
+ } catch {
95
+ return null;
96
+ }
97
+ }
@@ -22,6 +22,7 @@ import { describe, expect, test } from "vitest";
22
22
  import { contract, git, REPO, validSchema } from "./__fixtures__/contract-repo";
23
23
  import checkSchema from "./check.schema.json";
24
24
  import ciLastGreenSchema from "./ci-last-green.schema.json";
25
+ import ciListSchema from "./ci-list.schema.json";
25
26
  import { workspaceComposites } from "./composites";
26
27
  import compositesSchema from "./composites.schema.json";
27
28
  import { workspaceGraph } from "./graph-cli";
@@ -43,13 +44,15 @@ import { queryRecordsSince } from "./records-since";
43
44
  import recordsSinceSchema from "./records-since.schema.json";
44
45
  import { workspacePoints } from "./points-cli";
45
46
  import pointsSchema from "./points.schema.json";
47
+ import releasesSchema from "./releases.schema.json";
48
+ import changeSetShowSchema from "./change-set-show.schema.json";
46
49
  import { workspaceStatus } from "./status";
47
50
  import statusSchema from "./status.schema.json";
48
51
 
49
52
  const FIXTURE = join(REPO, "reference-workspace");
50
53
  const TIMEOUT = 240_000;
51
54
 
52
- const SCHEMAS = { ls: lsSchema, graph: graphSchema, check: checkSchema, status: statusSchema, records: recordsSchema, "records-since": recordsSinceSchema, intent: intentSchema, "intent-record": intentRecordSchema, composites: compositesSchema, points: pointsSchema, patch: patchSchema, "ci-last-green": ciLastGreenSchema };
55
+ const SCHEMAS = { ls: lsSchema, graph: graphSchema, check: checkSchema, status: statusSchema, records: recordsSchema, "records-since": recordsSinceSchema, intent: intentSchema, "intent-record": intentRecordSchema, composites: compositesSchema, points: pointsSchema, patch: patchSchema, "ci-last-green": ciLastGreenSchema, "ci-list": ciListSchema, releases: releasesSchema, "change-set-show": changeSetShowSchema };
53
56
 
54
57
  /** This checkout's chant, started the way the CLI starts it, for members with no toolchain of their own. */
55
58
  const reader: Toolchain = {
@@ -9,7 +9,7 @@ import { readdirSync, readFileSync } from "node:fs";
9
9
  import { join } from "node:path";
10
10
  import { describe, expect, test } from "vitest";
11
11
  import { REPO } from "./__fixtures__/contract-repo";
12
- import { CHANGES_ERROR_CODES, CHANGES_FINDING_CODES } from "./changes";
12
+ import { CHANGES_ERROR_CODES, CHANGES_FINDING_CODES, COMMIT_LINK_FINDING_CODES } from "./changes";
13
13
  import { MEMBER_RUN_REASON_CODES } from "./compose-graph";
14
14
  import { COMPOSITES_ENVIRONMENT_REASON_CODES, COMPOSITES_ERROR_CODES, COMPOSITES_REASON_CODES, COMPOSITES_RUNTIME_REASON_CODES } from "./composites";
15
15
  import { WORKSPACE_ERROR_CODES } from "./declaration";
@@ -85,6 +85,7 @@ const PER_COMMAND: Record<string, readonly string[]> = {
85
85
  INTENT_REASON_CODES,
86
86
  INTENT_WHY_CODES,
87
87
  CHANGES_FINDING_CODES,
88
+ COMMIT_LINK_FINDING_CODES,
88
89
  CHANGES_ERROR_CODES,
89
90
  COMPOSITES_ERROR_CODES,
90
91
  COMPOSITES_REASON_CODES,
@@ -205,6 +205,9 @@ export const REASONS = {
205
205
  // The forward coverage check (check --changes, #2773): findings, one per changed path.
206
206
  "change-uncovered": "A path the diff changes is covered by no current decided record and no open work item, by path or by its member.",
207
207
  "change-out-of-scope": "A record in hand for the change, such as the work item it is for or a decision that item implements, lists a path the diff changes in its out_of_scope.",
208
+ // The commit link check (check --changes, #4029): findings, one per trunk commit.
209
+ "commit-unlinked": "A trunk commit in the range names no work item: it has no Chant-Record trailer of a work kind and no Chant-Lease trailer.",
210
+ "commit-wrongly-linked": "A trunk commit in the range names a work item that is not there: a Chant-Record whose id no work kind has or whose kind is not a work kind, a malformed Chant-Record, or a Chant-Lease that resolves to no work item, and no other trailer links it.",
208
211
  // The patch read (workspace patch): a read that fails.
209
212
  "patch-path-invalid": "workspace patch --path names a path that is not relative and inside the workspace.",
210
213
  // Composite instances joined to components (graph --composites, #2662): why the list is empty or has no component.
@@ -283,7 +286,7 @@ export const REASONS = {
283
286
  "wip-race": "Another writer moved refs/chant/wip/<branch> between this command's read and its write.",
284
287
  "wip-policy-none": "wip push or wip fetch was run, and no box block declares replicate, so there is no remote.",
285
288
  "wip-remote-unknown": "The replicate policy names a git remote the checkout does not have; the host adds it, with its credential, before chant pushes.",
286
- // Which commits passed CI (ci last-green and ci tick, #3573): why nothing was read.
289
+ // Which commits passed CI (ci last-green, ci list and ci tick, #3573): why nothing was read.
287
290
  "ci-green-undeclared": "The declaration has no ci.green block, so chant does not know which check runs make a commit green.",
288
291
  "ci-branch-unknown": "The checkout has no ref for the branch ci.green names: neither the remote-tracking branch nor a local one.",
289
292
  // A box whose isolation fails (check, #2727). Each is also a WSP finding.