@intentius/chant 0.124.28 → 0.124.30

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 (449) hide show
  1. package/dist/build-params.d.ts +34 -1
  2. package/dist/build-params.d.ts.map +1 -1
  3. package/dist/build-params.js +31 -1
  4. package/dist/change-set-graph.d.ts +8 -1
  5. package/dist/change-set-graph.d.ts.map +1 -1
  6. package/dist/change-set-graph.js +4 -2
  7. package/dist/change-set.d.ts +10 -0
  8. package/dist/change-set.d.ts.map +1 -1
  9. package/dist/change-set.js +4 -3
  10. package/dist/cli/build-params-cli.d.ts +7 -1
  11. package/dist/cli/build-params-cli.d.ts.map +1 -1
  12. package/dist/cli/build-params-cli.js +17 -8
  13. package/dist/cli/commands/build.d.ts.map +1 -1
  14. package/dist/cli/commands/build.js +6 -3
  15. package/dist/cli/handlers/approve.d.ts.map +1 -1
  16. package/dist/cli/handlers/approve.js +45 -0
  17. package/dist/cli/handlers/build.d.ts.map +1 -1
  18. package/dist/cli/handlers/build.js +18 -4
  19. package/dist/cli/handlers/fan-out.d.ts +9 -0
  20. package/dist/cli/handlers/fan-out.d.ts.map +1 -1
  21. package/dist/cli/handlers/fan-out.js +67 -8
  22. package/dist/cli/handlers/lifecycle-gc.d.ts +19 -0
  23. package/dist/cli/handlers/lifecycle-gc.d.ts.map +1 -0
  24. package/dist/cli/handlers/lifecycle-gc.js +143 -0
  25. package/dist/cli/handlers/pr.d.ts +11 -3
  26. package/dist/cli/handlers/pr.d.ts.map +1 -1
  27. package/dist/cli/handlers/pr.js +134 -26
  28. package/dist/cli/handlers/promote.d.ts +7 -0
  29. package/dist/cli/handlers/promote.d.ts.map +1 -1
  30. package/dist/cli/handlers/promote.js +210 -33
  31. package/dist/cli/handlers/release.d.ts +62 -5
  32. package/dist/cli/handlers/release.d.ts.map +1 -1
  33. package/dist/cli/handlers/release.js +414 -28
  34. package/dist/cli/handlers/run.d.ts +11 -1
  35. package/dist/cli/handlers/run.d.ts.map +1 -1
  36. package/dist/cli/handlers/run.js +67 -6
  37. package/dist/cli/main.d.ts.map +1 -1
  38. package/dist/cli/main.js +91 -10
  39. package/dist/cli/parse-args.d.ts.map +1 -1
  40. package/dist/cli/parse-args.js +73 -2
  41. package/dist/cli/registry.d.ts +32 -4
  42. package/dist/cli/registry.d.ts.map +1 -1
  43. package/dist/cli/run-events.d.ts +3 -2
  44. package/dist/cli/run-events.d.ts.map +1 -1
  45. package/dist/cli/run-events.js +5 -3
  46. package/dist/components/auto-release.d.ts +2 -0
  47. package/dist/components/auto-release.d.ts.map +1 -1
  48. package/dist/components/auto-release.js +1 -0
  49. package/dist/components/capability.d.ts +9 -0
  50. package/dist/components/capability.d.ts.map +1 -1
  51. package/dist/components/driver.d.ts +8 -0
  52. package/dist/components/driver.d.ts.map +1 -1
  53. package/dist/components/driver.js +35 -0
  54. package/dist/components/fan-out-inputs.d.ts +69 -0
  55. package/dist/components/fan-out-inputs.d.ts.map +1 -0
  56. package/dist/components/fan-out-inputs.js +169 -0
  57. package/dist/components/fan-out-record.d.ts +13 -0
  58. package/dist/components/fan-out-record.d.ts.map +1 -1
  59. package/dist/components/fan-out-record.js +16 -0
  60. package/dist/components/fan-out-run.d.ts.map +1 -1
  61. package/dist/components/fan-out-run.js +50 -0
  62. package/dist/components/fan-out.d.ts +4 -0
  63. package/dist/components/fan-out.d.ts.map +1 -1
  64. package/dist/components/pr-pipeline.d.ts +49 -0
  65. package/dist/components/pr-pipeline.d.ts.map +1 -1
  66. package/dist/components/pr-pipeline.js +38 -4
  67. package/dist/components/pr-run.d.ts +20 -2
  68. package/dist/components/pr-run.d.ts.map +1 -1
  69. package/dist/components/pr-run.js +26 -13
  70. package/dist/components/promote.d.ts +23 -0
  71. package/dist/components/promote.d.ts.map +1 -1
  72. package/dist/components/promote.js +60 -2
  73. package/dist/components/release-compile.d.ts +9 -0
  74. package/dist/components/release-compile.d.ts.map +1 -1
  75. package/dist/components/release-compile.js +9 -3
  76. package/dist/components/release-gate.d.ts +11 -1
  77. package/dist/components/release-gate.d.ts.map +1 -1
  78. package/dist/components/release-gate.js +10 -4
  79. package/dist/components/wave-plan.d.ts +16 -0
  80. package/dist/components/wave-plan.d.ts.map +1 -1
  81. package/dist/components/wave-plan.js +36 -2
  82. package/dist/config.d.ts +38 -0
  83. package/dist/config.d.ts.map +1 -1
  84. package/dist/config.js +2 -0
  85. package/dist/flag-params.d.ts +54 -0
  86. package/dist/flag-params.d.ts.map +1 -0
  87. package/dist/flag-params.js +130 -0
  88. package/dist/lifecycle/__fixtures__/publish-fakes.d.ts +120 -0
  89. package/dist/lifecycle/__fixtures__/publish-fakes.d.ts.map +1 -0
  90. package/dist/lifecycle/__fixtures__/publish-fakes.js +304 -0
  91. package/dist/lifecycle/change-set-store.d.ts +2 -1
  92. package/dist/lifecycle/change-set-store.d.ts.map +1 -1
  93. package/dist/lifecycle/change-set-store.js +2 -1
  94. package/dist/lifecycle/delivery-metrics.d.ts +139 -0
  95. package/dist/lifecycle/delivery-metrics.d.ts.map +1 -0
  96. package/dist/lifecycle/delivery-metrics.js +145 -0
  97. package/dist/lifecycle/deploy-outcome.d.ts +81 -0
  98. package/dist/lifecycle/deploy-outcome.d.ts.map +1 -0
  99. package/dist/lifecycle/deploy-outcome.js +101 -0
  100. package/dist/lifecycle/gate-change-set.d.ts +10 -1
  101. package/dist/lifecycle/gate-change-set.d.ts.map +1 -1
  102. package/dist/lifecycle/gate-change-set.js +35 -3
  103. package/dist/lifecycle/gate-ledger.d.ts +2 -3
  104. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  105. package/dist/lifecycle/git.d.ts +30 -1
  106. package/dist/lifecycle/git.d.ts.map +1 -1
  107. package/dist/lifecycle/git.js +31 -5
  108. package/dist/lifecycle/index.d.ts +4 -0
  109. package/dist/lifecycle/index.d.ts.map +1 -1
  110. package/dist/lifecycle/index.js +4 -0
  111. package/dist/lifecycle/mixed-environment.d.ts +95 -0
  112. package/dist/lifecycle/mixed-environment.d.ts.map +1 -0
  113. package/dist/lifecycle/mixed-environment.js +154 -0
  114. package/dist/lifecycle/publish-attachments.d.ts +79 -0
  115. package/dist/lifecycle/publish-attachments.d.ts.map +1 -0
  116. package/dist/lifecycle/publish-attachments.js +179 -0
  117. package/dist/lifecycle/publish-credentials.d.ts +37 -0
  118. package/dist/lifecycle/publish-credentials.d.ts.map +1 -0
  119. package/dist/lifecycle/publish-credentials.js +69 -0
  120. package/dist/lifecycle/publish-declaration.d.ts +97 -0
  121. package/dist/lifecycle/publish-declaration.d.ts.map +1 -0
  122. package/dist/lifecycle/publish-declaration.js +83 -0
  123. package/dist/lifecycle/publish-forge.d.ts +53 -0
  124. package/dist/lifecycle/publish-forge.d.ts.map +1 -0
  125. package/dist/lifecycle/publish-forge.js +298 -0
  126. package/dist/lifecycle/publish-npm.d.ts +61 -0
  127. package/dist/lifecycle/publish-npm.d.ts.map +1 -0
  128. package/dist/lifecycle/publish-npm.js +242 -0
  129. package/dist/lifecycle/publish-oci.d.ts +64 -0
  130. package/dist/lifecycle/publish-oci.d.ts.map +1 -0
  131. package/dist/lifecycle/publish-oci.js +383 -0
  132. package/dist/lifecycle/publish-record.d.ts +66 -0
  133. package/dist/lifecycle/publish-record.d.ts.map +1 -0
  134. package/dist/lifecycle/publish-record.js +84 -0
  135. package/dist/lifecycle/publish-targets.d.ts +45 -0
  136. package/dist/lifecycle/publish-targets.d.ts.map +1 -0
  137. package/dist/lifecycle/publish-targets.js +85 -0
  138. package/dist/lifecycle/release-cut.d.ts +48 -1
  139. package/dist/lifecycle/release-cut.d.ts.map +1 -1
  140. package/dist/lifecycle/release-cut.js +116 -23
  141. package/dist/lifecycle/release-join.d.ts +95 -0
  142. package/dist/lifecycle/release-join.d.ts.map +1 -0
  143. package/dist/lifecycle/release-join.js +139 -0
  144. package/dist/lifecycle/release-ledger.d.ts +8 -3
  145. package/dist/lifecycle/release-ledger.d.ts.map +1 -1
  146. package/dist/lifecycle/release-ledger.js +2 -0
  147. package/dist/lifecycle/release-publish.d.ts +312 -0
  148. package/dist/lifecycle/release-publish.d.ts.map +1 -0
  149. package/dist/lifecycle/release-publish.js +335 -0
  150. package/dist/lifecycle/release-revocation.d.ts +80 -0
  151. package/dist/lifecycle/release-revocation.d.ts.map +1 -0
  152. package/dist/lifecycle/release-revocation.js +123 -0
  153. package/dist/lifecycle/release-store.d.ts +12 -2
  154. package/dist/lifecycle/release-store.d.ts.map +1 -1
  155. package/dist/lifecycle/release-store.js +4 -2
  156. package/dist/lifecycle/release-verify.d.ts +61 -0
  157. package/dist/lifecycle/release-verify.d.ts.map +1 -0
  158. package/dist/lifecycle/release-verify.js +92 -0
  159. package/dist/lifecycle/release-workstation.d.ts +91 -0
  160. package/dist/lifecycle/release-workstation.d.ts.map +1 -0
  161. package/dist/lifecycle/release-workstation.js +180 -0
  162. package/dist/lifecycle/retention-policy.d.ts +45 -0
  163. package/dist/lifecycle/retention-policy.d.ts.map +1 -0
  164. package/dist/lifecycle/retention-policy.js +43 -0
  165. package/dist/lifecycle/retention.d.ts +185 -0
  166. package/dist/lifecycle/retention.d.ts.map +1 -0
  167. package/dist/lifecycle/retention.js +400 -0
  168. package/dist/lifecycle/run-ledger.d.ts +1 -1
  169. package/dist/lifecycle/run-ledger.d.ts.map +1 -1
  170. package/dist/lifecycle/run-ledger.js +9 -0
  171. package/dist/op/activities/activity-contracts.d.ts +1 -0
  172. package/dist/op/activities/activity-contracts.d.ts.map +1 -1
  173. package/dist/op/activities/activity-contracts.js +1 -0
  174. package/dist/op/activities/shell.d.ts +6 -0
  175. package/dist/op/activities/shell.d.ts.map +1 -1
  176. package/dist/op/activities/shell.js +1 -1
  177. package/dist/op/local-executor.d.ts +23 -1
  178. package/dist/op/local-executor.d.ts.map +1 -1
  179. package/dist/op/local-executor.js +9 -3
  180. package/dist/op/runtime.d.ts +27 -0
  181. package/dist/op/runtime.d.ts.map +1 -1
  182. package/dist/op/runtime.js +20 -0
  183. package/dist/plan-summary.d.ts.map +1 -1
  184. package/dist/plan-summary.js +8 -2
  185. package/dist/pr-forge.d.ts +23 -0
  186. package/dist/pr-forge.d.ts.map +1 -1
  187. package/dist/pr-forge.js +44 -0
  188. package/dist/pr-loop.d.ts +17 -0
  189. package/dist/pr-loop.d.ts.map +1 -1
  190. package/dist/pr-loop.js +30 -4
  191. package/dist/pr-report-url.d.ts +82 -0
  192. package/dist/pr-report-url.d.ts.map +1 -0
  193. package/dist/pr-report-url.js +174 -0
  194. package/dist/provenance.d.ts +2 -2
  195. package/dist/provenance.d.ts.map +1 -1
  196. package/dist/run-event-store.d.ts +29 -2
  197. package/dist/run-event-store.d.ts.map +1 -1
  198. package/dist/run-event-store.js +50 -3
  199. package/dist/run-event-stream.d.ts +4 -3
  200. package/dist/run-event-stream.d.ts.map +1 -1
  201. package/dist/run-event-stream.js +7 -3
  202. package/dist/run-event.d.ts +34 -1
  203. package/dist/run-event.d.ts.map +1 -1
  204. package/dist/run-event.js +4 -0
  205. package/dist/wave-runtime.mjs +260 -229
  206. package/dist/workspace/__fixtures__/flag-workspace.d.ts +31 -0
  207. package/dist/workspace/__fixtures__/flag-workspace.d.ts.map +1 -0
  208. package/dist/workspace/__fixtures__/flag-workspace.js +114 -0
  209. package/dist/workspace/change-set.schema.json +5 -1
  210. package/dist/workspace/check.schema.json +4 -2
  211. package/dist/workspace/checks/records.d.ts +9 -1
  212. package/dist/workspace/checks/records.d.ts.map +1 -1
  213. package/dist/workspace/checks/records.js +35 -1
  214. package/dist/workspace/checks.d.ts +1 -0
  215. package/dist/workspace/checks.d.ts.map +1 -1
  216. package/dist/workspace/checks.js +2 -1
  217. package/dist/workspace/ci-green-forge.d.ts +2 -0
  218. package/dist/workspace/ci-green-forge.d.ts.map +1 -1
  219. package/dist/workspace/ci-green.d.ts +10 -0
  220. package/dist/workspace/ci-green.d.ts.map +1 -1
  221. package/dist/workspace/ci-green.js +14 -5
  222. package/dist/workspace/ci-run.d.ts +222 -0
  223. package/dist/workspace/ci-run.d.ts.map +1 -0
  224. package/dist/workspace/ci-run.js +464 -0
  225. package/dist/workspace/ci-serve.d.ts +214 -0
  226. package/dist/workspace/ci-serve.d.ts.map +1 -0
  227. package/dist/workspace/ci-serve.js +412 -0
  228. package/dist/workspace/declaration.d.ts +16 -0
  229. package/dist/workspace/declaration.d.ts.map +1 -1
  230. package/dist/workspace/declaration.js +26 -0
  231. package/dist/workspace/declaration.schema.json +64 -0
  232. package/dist/workspace/declared-kinds.d.ts +16 -0
  233. package/dist/workspace/declared-kinds.d.ts.map +1 -1
  234. package/dist/workspace/declared-kinds.js +25 -0
  235. package/dist/workspace/delivery-metrics.d.ts +91 -0
  236. package/dist/workspace/delivery-metrics.d.ts.map +1 -0
  237. package/dist/workspace/delivery-metrics.js +217 -0
  238. package/dist/workspace/delivery-metrics.schema.json +519 -0
  239. package/dist/workspace/flags-read.d.ts +37 -0
  240. package/dist/workspace/flags-read.d.ts.map +1 -0
  241. package/dist/workspace/flags-read.js +103 -0
  242. package/dist/workspace/flags.d.ts +100 -0
  243. package/dist/workspace/flags.d.ts.map +1 -0
  244. package/dist/workspace/flags.js +98 -0
  245. package/dist/workspace/graph-cli.js +1 -1
  246. package/dist/workspace/intent-cli.d.ts +11 -2
  247. package/dist/workspace/intent-cli.d.ts.map +1 -1
  248. package/dist/workspace/intent-cli.js +54 -5
  249. package/dist/workspace/intent-trace.d.ts +219 -0
  250. package/dist/workspace/intent-trace.d.ts.map +1 -0
  251. package/dist/workspace/intent-trace.js +314 -0
  252. package/dist/workspace/intent.d.ts +30 -6
  253. package/dist/workspace/intent.d.ts.map +1 -1
  254. package/dist/workspace/intent.js +141 -21
  255. package/dist/workspace/intent.schema.json +702 -6
  256. package/dist/workspace/overlap.d.ts +146 -0
  257. package/dist/workspace/overlap.d.ts.map +1 -0
  258. package/dist/workspace/overlap.js +276 -0
  259. package/dist/workspace/pr-report.schema.json +5 -0
  260. package/dist/workspace/reason-codes.d.ts +2 -0
  261. package/dist/workspace/reason-codes.d.ts.map +1 -1
  262. package/dist/workspace/reason-codes.js +3 -0
  263. package/dist/workspace/records.d.ts +15 -2
  264. package/dist/workspace/records.d.ts.map +1 -1
  265. package/dist/workspace/records.js +32 -0
  266. package/dist/workspace/records.schema.json +21 -2
  267. package/dist/workspace/reference-kinds/flag/flag.kind.mjs +32 -0
  268. package/dist/workspace/reference-kinds/flag/flag.schema.json +53 -0
  269. package/dist/workspace/releases.d.ts +9 -0
  270. package/dist/workspace/releases.d.ts.map +1 -1
  271. package/dist/workspace/releases.js +9 -0
  272. package/dist/workspace/releases.schema.json +123 -1
  273. package/dist/workspace/run-event.schema.json +24 -6
  274. package/dist/workspace/status-gates.d.ts +8 -0
  275. package/dist/workspace/status-gates.d.ts.map +1 -1
  276. package/dist/workspace/status-stewards.d.ts +2 -0
  277. package/dist/workspace/status-stewards.d.ts.map +1 -1
  278. package/dist/workspace/status-stewards.js +1 -0
  279. package/dist/workspace/status.d.ts +78 -0
  280. package/dist/workspace/status.d.ts.map +1 -1
  281. package/dist/workspace/status.js +170 -3
  282. package/dist/workspace/status.schema.json +210 -2
  283. package/dist/workspace/wip.d.ts.map +1 -1
  284. package/dist/workspace/wip.js +11 -3
  285. package/package.json +1 -1
  286. package/src/build-params.test.ts +46 -0
  287. package/src/build-params.ts +55 -1
  288. package/src/change-set-graph.ts +10 -2
  289. package/src/change-set.ts +14 -3
  290. package/src/cli/build-params-cli.ts +22 -9
  291. package/src/cli/commands/build.ts +6 -3
  292. package/src/cli/handlers/approve-release.test.ts +5 -1
  293. package/src/cli/handlers/approve-revoked.test.ts +155 -0
  294. package/src/cli/handlers/approve.ts +47 -0
  295. package/src/cli/handlers/build.test.ts +30 -0
  296. package/src/cli/handlers/build.ts +20 -4
  297. package/src/cli/handlers/fan-out.test.ts +262 -1
  298. package/src/cli/handlers/fan-out.ts +72 -8
  299. package/src/cli/handlers/intent-trace.e2e.test.ts +201 -0
  300. package/src/cli/handlers/lifecycle-gc.test.ts +126 -0
  301. package/src/cli/handlers/lifecycle-gc.ts +146 -0
  302. package/src/cli/handlers/pr.test.ts +148 -1
  303. package/src/cli/handlers/pr.ts +144 -28
  304. package/src/cli/handlers/promote.test.ts +280 -2
  305. package/src/cli/handlers/promote.ts +210 -34
  306. package/src/cli/handlers/release-implicit.e2e.test.ts +12 -4
  307. package/src/cli/handlers/release-join.e2e.test.ts +185 -0
  308. package/src/cli/handlers/release-publish-targets.e2e.test.ts +295 -0
  309. package/src/cli/handlers/release-verify.e2e.test.ts +117 -0
  310. package/src/cli/handlers/release-workstation-ci.e2e.test.ts +135 -0
  311. package/src/cli/handlers/release.e2e.test.ts +146 -32
  312. package/src/cli/handlers/release.ts +415 -28
  313. package/src/cli/handlers/run-auto-release.test.ts +9 -0
  314. package/src/cli/handlers/run-release.test.ts +55 -0
  315. package/src/cli/handlers/run.ts +69 -5
  316. package/src/cli/main.test.ts +1 -0
  317. package/src/cli/main.ts +91 -10
  318. package/src/cli/parse-args.ts +54 -2
  319. package/src/cli/registry.ts +32 -4
  320. package/src/cli/run-events.ts +5 -2
  321. package/src/components/auto-release.test.ts +9 -0
  322. package/src/components/auto-release.ts +3 -0
  323. package/src/components/capability.ts +9 -0
  324. package/src/components/driver.test.ts +24 -0
  325. package/src/components/driver.ts +36 -0
  326. package/src/components/fan-out-inputs.test.ts +85 -0
  327. package/src/components/fan-out-inputs.ts +192 -0
  328. package/src/components/fan-out-record.test.ts +10 -0
  329. package/src/components/fan-out-record.ts +19 -0
  330. package/src/components/fan-out-run.ts +48 -0
  331. package/src/components/fan-out.ts +4 -0
  332. package/src/components/pr-pipeline.ts +67 -4
  333. package/src/components/pr-run.test.ts +127 -0
  334. package/src/components/pr-run.ts +32 -12
  335. package/src/components/promote.ts +68 -2
  336. package/src/components/release-compile.ts +17 -3
  337. package/src/components/release-gate.ts +18 -4
  338. package/src/components/wave-plan.ts +45 -2
  339. package/src/config.ts +8 -0
  340. package/src/flag-params.test.ts +144 -0
  341. package/src/flag-params.ts +134 -0
  342. package/src/lifecycle/__fixtures__/publish-fakes.ts +351 -0
  343. package/src/lifecycle/change-set-store.ts +2 -1
  344. package/src/lifecycle/delivery-metrics.ts +263 -0
  345. package/src/lifecycle/deploy-outcome.ts +147 -0
  346. package/src/lifecycle/gate-change-set.ts +37 -6
  347. package/src/lifecycle/gate-ledger.ts +2 -2
  348. package/src/lifecycle/git.ts +61 -8
  349. package/src/lifecycle/index.ts +4 -0
  350. package/src/lifecycle/mixed-environment.test.ts +97 -0
  351. package/src/lifecycle/mixed-environment.ts +204 -0
  352. package/src/lifecycle/publish-attachments.ts +196 -0
  353. package/src/lifecycle/publish-credentials.ts +84 -0
  354. package/src/lifecycle/publish-declaration.ts +95 -0
  355. package/src/lifecycle/publish-forge.ts +325 -0
  356. package/src/lifecycle/publish-npm.ts +259 -0
  357. package/src/lifecycle/publish-oci.ts +396 -0
  358. package/src/lifecycle/publish-record.ts +113 -0
  359. package/src/lifecycle/publish-resume.test.ts +168 -0
  360. package/src/lifecycle/publish-targets.test.ts +494 -0
  361. package/src/lifecycle/publish-targets.ts +100 -0
  362. package/src/lifecycle/release-cut.test.ts +74 -2
  363. package/src/lifecycle/release-cut.ts +158 -22
  364. package/src/lifecycle/release-flag.test.ts +112 -0
  365. package/src/lifecycle/release-join.test.ts +68 -0
  366. package/src/lifecycle/release-join.ts +182 -0
  367. package/src/lifecycle/release-ledger.ts +9 -3
  368. package/src/lifecycle/release-publish.test.ts +225 -0
  369. package/src/lifecycle/release-publish.ts +568 -0
  370. package/src/lifecycle/release-revocation.ts +147 -0
  371. package/src/lifecycle/release-store.ts +15 -4
  372. package/src/lifecycle/release-verify.test.ts +110 -0
  373. package/src/lifecycle/release-verify.ts +120 -0
  374. package/src/lifecycle/release-workstation.test.ts +204 -0
  375. package/src/lifecycle/release-workstation.ts +216 -0
  376. package/src/lifecycle/retention-growth.e2e.test.ts +279 -0
  377. package/src/lifecycle/retention-policy.ts +63 -0
  378. package/src/lifecycle/retention.test.ts +363 -0
  379. package/src/lifecycle/retention.ts +508 -0
  380. package/src/lifecycle/run-ledger.ts +7 -1
  381. package/src/op/activities/activity-contracts.ts +1 -0
  382. package/src/op/activities/shell.ts +7 -1
  383. package/src/op/local-executor.ts +27 -4
  384. package/src/op/runtime.ts +42 -0
  385. package/src/plan-summary.test.ts +20 -0
  386. package/src/plan-summary.ts +8 -1
  387. package/src/pr-forge.test.ts +25 -0
  388. package/src/pr-forge.ts +62 -0
  389. package/src/pr-loop.test.ts +13 -1
  390. package/src/pr-loop.ts +41 -4
  391. package/src/pr-report-url.test.ts +131 -0
  392. package/src/pr-report-url.ts +209 -0
  393. package/src/provenance.ts +2 -2
  394. package/src/run-event-store.ts +63 -3
  395. package/src/run-event-stream.ts +8 -4
  396. package/src/run-event.ts +38 -1
  397. package/src/workspace/__fixtures__/flag-workspace.ts +132 -0
  398. package/src/workspace/__fixtures__/older-records/change-set-984534ea9.json +100 -0
  399. package/src/workspace/__fixtures__/older-records/older-records.json +326 -0
  400. package/src/workspace/change-set.schema.json +5 -1
  401. package/src/workspace/check.schema.json +4 -2
  402. package/src/workspace/checks/records.ts +35 -1
  403. package/src/workspace/checks.ts +2 -1
  404. package/src/workspace/ci-green-forge.ts +2 -0
  405. package/src/workspace/ci-green.ts +20 -5
  406. package/src/workspace/ci-run.test.ts +416 -0
  407. package/src/workspace/ci-run.ts +571 -0
  408. package/src/workspace/ci-serve.test.ts +268 -0
  409. package/src/workspace/ci-serve.ts +521 -0
  410. package/src/workspace/declaration.schema.json +64 -0
  411. package/src/workspace/declaration.test.ts +28 -0
  412. package/src/workspace/declaration.ts +38 -0
  413. package/src/workspace/declared-kinds.ts +40 -1
  414. package/src/workspace/delivery-metrics.schema.json +519 -0
  415. package/src/workspace/delivery-metrics.test.ts +236 -0
  416. package/src/workspace/delivery-metrics.ts +286 -0
  417. package/src/workspace/flags-read.ts +121 -0
  418. package/src/workspace/flags.test.ts +141 -0
  419. package/src/workspace/flags.ts +157 -0
  420. package/src/workspace/graph-cli.ts +1 -1
  421. package/src/workspace/intent-cli.ts +46 -5
  422. package/src/workspace/intent-trace.test.ts +173 -0
  423. package/src/workspace/intent-trace.ts +484 -0
  424. package/src/workspace/intent.schema.json +702 -6
  425. package/src/workspace/intent.ts +148 -25
  426. package/src/workspace/older-records.test.ts +412 -0
  427. package/src/workspace/overlap.test.ts +165 -0
  428. package/src/workspace/overlap.ts +340 -0
  429. package/src/workspace/pr-report.schema.json +5 -0
  430. package/src/workspace/read-contract.e2e.test.ts +2 -1
  431. package/src/workspace/reason-codes.test.ts +5 -0
  432. package/src/workspace/reason-codes.ts +3 -0
  433. package/src/workspace/record-assets.test.ts +2 -1
  434. package/src/workspace/records-contract.e2e.test.ts +2 -1
  435. package/src/workspace/records.schema.json +21 -2
  436. package/src/workspace/records.ts +36 -2
  437. package/src/workspace/reference-kinds/flag/flag.kind.mjs +32 -0
  438. package/src/workspace/reference-kinds/flag/flag.schema.json +53 -0
  439. package/src/workspace/releases.schema.json +123 -1
  440. package/src/workspace/releases.ts +11 -0
  441. package/src/workspace/run-event.schema.json +24 -6
  442. package/src/workspace/status-contract.test.ts +29 -0
  443. package/src/workspace/status-gates.ts +8 -0
  444. package/src/workspace/status-mixed.test.ts +152 -0
  445. package/src/workspace/status-revoked.test.ts +153 -0
  446. package/src/workspace/status-stewards.ts +3 -0
  447. package/src/workspace/status.schema.json +210 -2
  448. package/src/workspace/status.ts +254 -3
  449. package/src/workspace/wip.ts +11 -2
@@ -0,0 +1,326 @@
1
+ {
2
+ "$comment": "Ledger lines as chant 0.124.27 and older producers wrote them, before #4020 (gitSha and runOrigin on run records, gitSha and runId on gate lines, admission on deploy records), #4043 (releaseDigest on deploy records), #4045 (releaseDigest and empty on gate lines) and #4046 (implicit releases) added their fields. Data only: workspace/older-records.test.ts writes each file to the chant/lifecycle branch of a temp repo and reads it through the real readers (INTENTIUS/chant#4034). Every entry names the producer that wrote its shape and the source it was taken from. The values are made up. The keys, and which keys are present, are what each producer wrote.",
3
+ "files": {
4
+ "staging/releases.jsonl": [
5
+ {
6
+ "producer": "chant components release (a CI job)",
7
+ "source": "packages/core/src/cli/handlers/components.ts at 162e1602c^ (the appendReleaseRecord call in the release handler): component, env, digest, gitSha, runId, runOrigin from resolveRunId, timestamp, actor; no approver because none was passed",
8
+ "line": {
9
+ "version": 1,
10
+ "component": "api",
11
+ "env": "staging",
12
+ "digest": "sha256:47e0cbb98c01f4a49e3450e8686ca069f23c3c13c2d49cf50a4c3513f01b6ed3",
13
+ "gitSha": "2f22765d04931a078909145ca628d2264c852d7d",
14
+ "runId": "8431209934",
15
+ "runOrigin": { "forge": "github", "repo": "acme/shop", "url": "https://github.com/acme/shop/actions/runs/8431209934" },
16
+ "timestamp": "2026-09-08T14:02:11.482Z",
17
+ "actor": "ci-bot"
18
+ }
19
+ },
20
+ {
21
+ "producer": "chant components release --approver (a person at a terminal)",
22
+ "source": "the same call with args.approver set (#1035) and no CI env, so resolveRunId minted a local id",
23
+ "line": {
24
+ "version": 1,
25
+ "component": "worker",
26
+ "env": "staging",
27
+ "digest": "sha256:fc653e205472032353d140e5cd5543e7d3e3de8dc2013b1a43e2f068a4260198",
28
+ "gitSha": "6b1f53303a732ccc8c6aae6640399827c15250e3",
29
+ "runId": "local-1788901200000",
30
+ "runOrigin": { "forge": "local" },
31
+ "timestamp": "2026-09-08T21:00:00.000Z",
32
+ "actor": "alice",
33
+ "approver": "bob"
34
+ }
35
+ },
36
+ {
37
+ "producer": "chant run --components (auto-release), a pinned helm deploy",
38
+ "source": "packages/core/src/components/auto-release.ts at 162e1602c^ (maybeRecordAutoRelease): the rendered digest in digest, the input-side digest in inputDigest (#1242, #1243); no approver and no admission, which run --components copied only from 0.124.28",
39
+ "line": {
40
+ "version": 1,
41
+ "component": "ingress",
42
+ "env": "staging",
43
+ "digest": "sha256:9ccd4fd27f728a7d88462fc94e6c8d901d1d2de3d5d0291ca99bccd462d8d3e4",
44
+ "gitSha": "a625406f6977d45c1391b078f4d3656e0b75bfcb",
45
+ "runId": "local-1788904800000",
46
+ "runOrigin": { "forge": "local" },
47
+ "timestamp": "2026-09-08T22:00:00.000Z",
48
+ "actor": "alice",
49
+ "inputDigest": "sha256:bc227a21bd89c5c2e7e971e001e538da4dff21e972059a914b38595400418ca1"
50
+ }
51
+ },
52
+ {
53
+ "producer": "SQL Yodeler (yodel apply)",
54
+ "source": "INTENTIUS/sql-yodeler at 8dacbec, src/release/index.ts recordRelease: component is the project directory in its repository or schema, digest is schemaSha of the recorded schema (test/release.test.ts holds the call), runId and runOrigin from resolveRunId, approver when a gate approved",
55
+ "line": {
56
+ "version": 1,
57
+ "component": "schema",
58
+ "env": "staging",
59
+ "digest": "sha256:69c1a029277e628cfd0386e730d5d8decf9414b4fde67b37c77efe32b7550804",
60
+ "gitSha": "e4666a670f042877c67a84473a71675ee0950a08",
61
+ "runId": "8431977120",
62
+ "runOrigin": { "forge": "github", "repo": "acme/warehouse", "url": "https://github.com/acme/warehouse/actions/runs/8431977120" },
63
+ "timestamp": "2026-09-09T08:30:00.000Z",
64
+ "actor": "acme-deploy",
65
+ "approver": "alice"
66
+ }
67
+ }
68
+ ],
69
+ "prod/releases.jsonl": [
70
+ {
71
+ "producer": "chant components release",
72
+ "source": "as the first staging entry; the build api went to prod first",
73
+ "line": {
74
+ "version": 1,
75
+ "component": "api",
76
+ "env": "prod",
77
+ "digest": "sha256:db88ccee4ed09c4324d896b8a0db6dab0091c76f579eab51e54656c40517866f",
78
+ "gitSha": "8dc29fc58c0bd99068c2e5c752aa61521d4f11ce",
79
+ "runId": "8399000111",
80
+ "runOrigin": { "forge": "github", "repo": "acme/shop", "url": "https://github.com/acme/shop/actions/runs/8399000111" },
81
+ "timestamp": "2026-09-01T10:00:00.000Z",
82
+ "actor": "ci-bot"
83
+ }
84
+ },
85
+ {
86
+ "producer": "chant components promote",
87
+ "source": "packages/core/src/components/promote.ts at 162e1602c^ (sharedRecord plus promotedFrom, #2530): the artifact is the staging record's own, and promotedFrom names the staging record by env, runId and timestamp",
88
+ "line": {
89
+ "version": 1,
90
+ "component": "api",
91
+ "env": "prod",
92
+ "digest": "sha256:47e0cbb98c01f4a49e3450e8686ca069f23c3c13c2d49cf50a4c3513f01b6ed3",
93
+ "gitSha": "2f22765d04931a078909145ca628d2264c852d7d",
94
+ "runId": "local-1788987600000",
95
+ "runOrigin": { "forge": "local" },
96
+ "timestamp": "2026-09-09T12:00:00.000Z",
97
+ "actor": "alice",
98
+ "approver": "bob",
99
+ "promotedFrom": { "env": "staging", "runId": "8431209934", "timestamp": "2026-09-08T14:02:11.482Z" }
100
+ }
101
+ },
102
+ {
103
+ "producer": "chant components rollback",
104
+ "source": "packages/core/src/op/activities/source-rollback.ts at 162e1602c^ and promote.ts rollbackRecord (#2531): the earlier release's digest again, with restores naming it",
105
+ "line": {
106
+ "version": 1,
107
+ "component": "api",
108
+ "env": "prod",
109
+ "digest": "sha256:db88ccee4ed09c4324d896b8a0db6dab0091c76f579eab51e54656c40517866f",
110
+ "gitSha": "8dc29fc58c0bd99068c2e5c752aa61521d4f11ce",
111
+ "runId": "local-1789074000000",
112
+ "runOrigin": { "forge": "local" },
113
+ "timestamp": "2026-09-10T12:00:00.000Z",
114
+ "actor": "alice",
115
+ "restores": { "env": "prod", "runId": "8399000111", "timestamp": "2026-09-01T10:00:00.000Z" }
116
+ }
117
+ },
118
+ {
119
+ "producer": "chant components redeploy",
120
+ "source": "promote.ts redeployRecord (#2604): the digest the ledger recorded as current, deployed again, with redeploys naming that record",
121
+ "line": {
122
+ "version": 1,
123
+ "component": "api",
124
+ "env": "prod",
125
+ "digest": "sha256:db88ccee4ed09c4324d896b8a0db6dab0091c76f579eab51e54656c40517866f",
126
+ "gitSha": "8dc29fc58c0bd99068c2e5c752aa61521d4f11ce",
127
+ "runId": "local-1789077600000",
128
+ "runOrigin": { "forge": "local" },
129
+ "timestamp": "2026-09-10T13:00:00.000Z",
130
+ "actor": "alice",
131
+ "redeploys": { "env": "prod", "runId": "local-1789074000000", "timestamp": "2026-09-10T12:00:00.000Z" }
132
+ }
133
+ },
134
+ {
135
+ "producer": "SQL Yodeler, a tenant",
136
+ "source": "recordRelease with env.tenant set: the component is schema/<tenant> and the ledger env is the tenant's env",
137
+ "line": {
138
+ "version": 1,
139
+ "component": "schema/acme",
140
+ "env": "prod",
141
+ "digest": "sha256:69c1a029277e628cfd0386e730d5d8decf9414b4fde67b37c77efe32b7550804",
142
+ "gitSha": "e4666a670f042877c67a84473a71675ee0950a08",
143
+ "runId": "8432100045",
144
+ "runOrigin": { "forge": "github", "repo": "acme/warehouse", "url": "https://github.com/acme/warehouse/actions/runs/8432100045" },
145
+ "timestamp": "2026-09-09T16:00:00.000Z",
146
+ "actor": "acme-deploy"
147
+ }
148
+ }
149
+ ],
150
+ "fly/releases.jsonl": [
151
+ {
152
+ "producer": "chud-studio (arugula-salad/studio), the release Op's Record phase",
153
+ "source": "template/delivery/ops/release.op.ts at studio 6e0e5d8 calls releaseRecord, chant's op/activities/source-release.ts, whose appendReleaseRecord call at 162e1602c^ wrote this shape: digest is the release plan's digest, gitSha the plan's, approver the gate's resolvedBy names",
154
+ "line": {
155
+ "version": 1,
156
+ "component": "app",
157
+ "env": "fly",
158
+ "digest": "sha256:65a540cde9fceddfc88c9a21750b256c99096ebe6ae31f4a8ff26e89712f67cf",
159
+ "gitSha": "2f22765d04931a078909145ca628d2264c852d7d",
160
+ "runId": "local-1788998400000",
161
+ "runOrigin": { "forge": "local" },
162
+ "timestamp": "2026-09-10T00:00:00.000Z",
163
+ "actor": "alex",
164
+ "approver": "alex"
165
+ }
166
+ }
167
+ ],
168
+ "fly/runs__release.jsonl": [
169
+ {
170
+ "producer": "chud-studio's release Op, first run, stopped at the ship gate",
171
+ "source": "packages/core/src/lifecycle/run-ledger.ts buildRunRecord at 162e1602c^ (OpRunRecord in op/runtime.ts): no gitSha and no runOrigin",
172
+ "line": {
173
+ "version": 1,
174
+ "id": "0b7d6a3e-5f1c-4c52-9a52-6f0d3f6f5a11",
175
+ "op": "release",
176
+ "env": "fly",
177
+ "started": "2026-09-09T23:50:00.000Z",
178
+ "ended": "2026-09-09T23:50:41.000Z",
179
+ "status": "gated",
180
+ "labels": { "Env": "fly" },
181
+ "outcomes": {},
182
+ "phases": [
183
+ { "name": "Check", "status": "ok", "durationMs": 20100, "steps": [{ "fn": "shell", "status": "ok", "durationMs": 20100 }] },
184
+ { "name": "Plan", "status": "ok", "durationMs": 900, "steps": [{ "fn": "releasePlan", "status": "ok", "durationMs": 900 }] },
185
+ { "name": "Gate", "status": "skipped", "steps": [{ "fn": "gate:ship", "status": "skipped", "durationMs": 0 }] }
186
+ ],
187
+ "gate": { "name": "ship", "since": "2026-09-09T23:50:40.000Z" }
188
+ }
189
+ },
190
+ {
191
+ "producer": "chud-studio's release Op, second run, after the approval",
192
+ "source": "as above; the Gate step carries approval { gate, resolvedBy, timestamp } (#2119)",
193
+ "line": {
194
+ "version": 1,
195
+ "id": "9c1e5b07-2d44-4f9a-8d0b-3a7f1c2b9e22",
196
+ "op": "release",
197
+ "env": "fly",
198
+ "started": "2026-09-10T00:00:00.000Z",
199
+ "ended": "2026-09-10T00:01:10.000Z",
200
+ "status": "ok",
201
+ "labels": { "Env": "fly" },
202
+ "outcomes": {},
203
+ "phases": [
204
+ { "name": "Check", "status": "ok", "durationMs": 20300, "steps": [{ "fn": "shell", "status": "ok", "durationMs": 20300 }] },
205
+ { "name": "Gate", "status": "ok", "durationMs": 5, "steps": [{ "fn": "gate:ship", "status": "ok", "durationMs": 5, "approval": { "gate": "ship", "resolvedBy": "alex", "timestamp": "2026-09-09T23:55:00.000Z" } }] },
206
+ { "name": "Ship", "status": "ok", "durationMs": 40100, "steps": [{ "fn": "flyRelease", "status": "ok", "durationMs": 40100 }] }
207
+ ]
208
+ }
209
+ }
210
+ ],
211
+ "_gates/api.jsonl": [
212
+ {
213
+ "producer": "chant run --components, a component gate (the pending fact)",
214
+ "source": "packages/core/src/lifecycle/gate-ledger.ts PendingGateRecord at 162e1602c^: environment and planDigest since #2574; no gitSha, runId, releaseDigest",
215
+ "line": {
216
+ "version": 1,
217
+ "kind": "pending",
218
+ "op": "api",
219
+ "gate": "deploy",
220
+ "environment": "prod",
221
+ "planDigest": "sha256:0c3c94bc645b25af58a4ed063bbd3c428cc9eeb119ed7c86f197c63c3c6b5000",
222
+ "timestamp": "2026-09-09T11:00:00.000Z",
223
+ "expiresAt": "2026-09-16T11:00:00.000Z"
224
+ }
225
+ },
226
+ {
227
+ "producer": "chant approve api deploy --env prod",
228
+ "source": "GateResolutionRecord at 162e1602c^, a line with no kind (the shape before #2119 stayed valid) and origin cli (#2384); no gitSha, runId, releaseDigest, empty",
229
+ "line": {
230
+ "version": 1,
231
+ "op": "api",
232
+ "gate": "deploy",
233
+ "resolvedBy": "bob",
234
+ "timestamp": "2026-09-09T11:30:00.000Z",
235
+ "planDigest": "sha256:0c3c94bc645b25af58a4ed063bbd3c428cc9eeb119ed7c86f197c63c3c6b5000",
236
+ "environment": "prod",
237
+ "origin": "cli"
238
+ }
239
+ }
240
+ ],
241
+ "_gates/release.jsonl": [
242
+ {
243
+ "producer": "chud-studio's release Op gate ship (the pending fact)",
244
+ "source": "a gate step of an authored Op (op/gate.ts at 162e1602c^): no environment, the plan digest from the releasePlan activity; the quorum block studio adds is left out",
245
+ "line": {
246
+ "version": 1,
247
+ "kind": "pending",
248
+ "op": "release",
249
+ "gate": "ship",
250
+ "description": "Ship app to fly",
251
+ "planDigest": "sha256:65a540cde9fceddfc88c9a21750b256c99096ebe6ae31f4a8ff26e89712f67cf",
252
+ "timestamp": "2026-09-09T23:50:40.000Z",
253
+ "expiresAt": "2026-09-16T23:50:40.000Z"
254
+ }
255
+ },
256
+ {
257
+ "producer": "chant approve release ship --plan <digest>",
258
+ "source": "GateResolutionRecord at 162e1602c^ with kind resolution (#2119) and the plan (#2300)",
259
+ "line": {
260
+ "version": 1,
261
+ "kind": "resolution",
262
+ "op": "release",
263
+ "gate": "ship",
264
+ "resolvedBy": "alex",
265
+ "timestamp": "2026-09-09T23:55:00.000Z",
266
+ "planDigest": "sha256:65a540cde9fceddfc88c9a21750b256c99096ebe6ae31f4a8ff26e89712f67cf",
267
+ "origin": "cli"
268
+ }
269
+ }
270
+ ],
271
+ "_gates/web.jsonl": [
272
+ {
273
+ "producer": "chant components pr-apply (the pending fact for a pull request's change set)",
274
+ "source": "pr-apply bound the change-set document's digest in planDigest from #4022 (984534ea9); the document is change-set-984534ea9.json beside this file: composeChangeSet and lifecyclePlanPart as they stood at 984534ea9, before #4045 added releaseDigest and environment, then mapChangeSetToGraph with no graph read, which is what storeGateChangeSet stores when the graph can't be read (every node null, graph null)",
275
+ "line": {
276
+ "version": 1,
277
+ "kind": "pending",
278
+ "op": "web",
279
+ "gate": "pr-apply",
280
+ "environment": "staging",
281
+ "planDigest": "jcs1-sha256:38ee3f4bfab616f181ff10ea6b2c75284e3b93a0f976907fc84954e6c0356f07",
282
+ "timestamp": "2026-09-09T09:00:00.000Z",
283
+ "expiresAt": "2026-09-16T09:00:00.000Z"
284
+ }
285
+ }
286
+ ],
287
+ "_gates/nightly.jsonl": [
288
+ {
289
+ "producer": "an Op gate that binds no plan (before #2300)",
290
+ "source": "PendingGateRecord with no planDigest and no environment, and a resolution with neither, the shape every gate had before #2300",
291
+ "line": {
292
+ "version": 1,
293
+ "kind": "pending",
294
+ "op": "nightly",
295
+ "gate": "confirm",
296
+ "timestamp": "2026-09-08T00:00:00.000Z",
297
+ "expiresAt": "2026-09-15T00:00:00.000Z"
298
+ }
299
+ },
300
+ {
301
+ "producer": "chant approve nightly confirm",
302
+ "source": "as above, written before #2119 so it has no kind",
303
+ "line": {
304
+ "version": 1,
305
+ "op": "nightly",
306
+ "gate": "confirm",
307
+ "resolvedBy": "dave",
308
+ "timestamp": "2026-09-08T01:00:00.000Z"
309
+ }
310
+ }
311
+ ]
312
+ },
313
+ "plans": {
314
+ "producer": "chud-studio's release Op, the releasePlan activity, persisted by releaseRecord (persistReleasePlan, plan-ledger.ts, ws-055)",
315
+ "source": "template/delivery/ops/release.op.ts at studio 6e0e5d8: component, env, gitSha and content { artifact, shipSkip }; the plan carries its own digest",
316
+ "digest": "sha256:65a540cde9fceddfc88c9a21750b256c99096ebe6ae31f4a8ff26e89712f67cf",
317
+ "plan": {
318
+ "digest": "sha256:65a540cde9fceddfc88c9a21750b256c99096ebe6ae31f4a8ff26e89712f67cf",
319
+ "component": "app",
320
+ "env": "fly",
321
+ "gitSha": "2f22765d04931a078909145ca628d2264c852d7d",
322
+ "artifact": { "kind": "source-tree", "digest": "sha256:6ce407d632d7e805de020f9d0a5d70fea814b67285ced915be1271255b4fb622", "dir": "app" },
323
+ "shipSkip": { "answer": "ship", "decider": "model" }
324
+ }
325
+ }
326
+ }
@@ -26,7 +26,7 @@
26
26
  "digest": {
27
27
  "type": "string",
28
28
  "pattern": "^(?:jcs1-)?sha256:[0-9a-f]{64}$",
29
- "description": "computePlanDigest(\"change-set-document\", \u2026) over the set digest (computePlanDigest(\"change-set\", \u2026) over the members' { member, planDigest } pairs sorted by member), each member's member, status and holes, the entries without their node, the side effects, and on a release gate's document its releaseDigest and environment, provisional members and their entries left out. What a gate over the whole run binds."
29
+ "description": "computePlanDigest(\"change-set-document\", \u2026) over the set digest (computePlanDigest(\"change-set\", \u2026) over the members' { member, planDigest } pairs sorted by member), each member's member, status and holes, the entries without their node and source, the side effects, and on a release gate's document its releaseDigest and environment, provisional members and their entries left out. What a gate over the whole run binds."
30
30
  },
31
31
  "releaseDigest": {
32
32
  "type": "string",
@@ -271,6 +271,10 @@
271
271
  "node": {
272
272
  "type": ["string", "null"],
273
273
  "description": "Added in contract 1 by #4022, written by chant 0.124.28 and newer on a stored change set (chant change-set show). The graph node the entry changes, as chant graph --format ir names it, with the member in front (<member>/<id>) inside a workspace, as chant workspace graph names it. A chant entry's node is its address; a terraform-family entry's is <root>/<block key>, where the block key is each module call as module.<name>/ and then the block's address with no index. Null when the graph holds no node for the address, such as a delete of a block the source no longer declares. Absent on a document never mapped onto a graph. Not part of digest."
274
+ },
275
+ "source": {
276
+ "type": "string",
277
+ "description": "Added in contract 1 by #4025, written by chant 0.124.29 and newer on a stored change set. The source file that declares the entry's node, as a path from the repository root: the node's sourceLoc.file in the member's graph IR with the member's directory in front. Absent when node is null or the node has no source location, and on a change set stored by an older chant. workspace status attributes the entry to a work item through the commits linked to the item that changed this file. Not part of digest."
274
278
  }
275
279
  }
276
280
  },
@@ -295,11 +295,12 @@
295
295
  "box-intent-unknown",
296
296
  "box-intent-unconstrained",
297
297
  "work-acceptance-unmet",
298
+ "flag-stale",
298
299
  "diagram-source-missing",
299
300
  "diagram-render-missing",
300
301
  "diagram-render-drift"
301
302
  ],
302
- "description": "For WSP001: why the declaration can't be read. For WSP121 to WSP127, the box finding (#2726, #2727, #2780, #2850). For WSP117, work-acceptance-unmet (#2772). For WSP131 to WSP133, the diagram finding (#2764)."
303
+ "description": "For WSP001: why the declaration can't be read. For WSP121 to WSP127, the box finding (#2726, #2727, #2780, #2850). For WSP117, work-acceptance-unmet (#2772). For WSP118, flag-stale (#4024). For WSP131 to WSP133, the diagram finding (#2764)."
303
304
  }
304
305
  }
305
306
  },
@@ -373,11 +374,12 @@
373
374
  "box-intent-unknown",
374
375
  "box-intent-unconstrained",
375
376
  "work-acceptance-unmet",
377
+ "flag-stale",
376
378
  "diagram-source-missing",
377
379
  "diagram-render-missing",
378
380
  "diagram-render-drift"
379
381
  ],
380
- "description": "For WSP001: why the declaration can't be read. For WSP121 to WSP127, the box finding (#2726, #2727, #2780, #2850). For WSP117, work-acceptance-unmet (#2772). For WSP131 to WSP133, the diagram finding (#2764)."
382
+ "description": "For WSP001: why the declaration can't be read. For WSP121 to WSP127, the box finding (#2726, #2727, #2780, #2850). For WSP117, work-acceptance-unmet (#2772). For WSP118, flag-stale (#4024). For WSP131 to WSP133, the diagram finding (#2764)."
381
383
  },
382
384
  "reason": {
383
385
  "type": "string"
@@ -16,10 +16,18 @@
16
16
  * | WSP115 | a record kind the declaration names is missing or does not load as one (fixed, #2680) |
17
17
  * | WSP116 | an answer kind's decision points file is missing or not valid (fixed, ws-058, #2738) |
18
18
  * | WSP117 | a done work item has an acceptance criterion no passing evidence meets (#2772) |
19
+ * | WSP118 | a feature flag whose work item's decisions are all confirmed, so it is due for removal (#4024) |
19
20
  *
20
21
  * WSP117 reads the records of every declared work kind with acceptance
21
22
  * criteria, in the working tree, and the records of `--kind`. It carries the
22
23
  * reason code `work-acceptance-unmet`.
24
+ *
25
+ * WSP118 reads the records of every declared flag kind (#4024), in the
26
+ * working tree. A flag is due for removal when the work item it hides
27
+ * implements at least one decision and every one is confirmed: closed in its
28
+ * kind and superseded by nothing. It is a warning by default, since a flag
29
+ * left on trunk breaks nothing; the declaration's `checks` can raise it. It
30
+ * carries the reason code `flag-stale`.
23
31
  */
24
32
 
25
33
  import type { WorkspaceCheck, WorkspaceDiagnostic } from "../checks";
@@ -27,7 +35,7 @@ import type { ReasonCode } from "../reason-codes";
27
35
  import type { ReadErrorCode, RecordEntry } from "../records";
28
36
 
29
37
  /** The read contract's codes the record checks carry as `code`: WSP117's (#2772). */
30
- export const RECORD_FINDING_CODES = ["work-acceptance-unmet"] as const satisfies readonly ReasonCode[];
38
+ export const RECORD_FINDING_CODES = ["work-acceptance-unmet", "flag-stale"] as const satisfies readonly ReasonCode[];
31
39
 
32
40
  /** The records `check --kind` read, or why they could not be read. */
33
41
  export type RecordFacts =
@@ -171,4 +179,30 @@ export const RECORD_CHECKS: readonly WorkspaceCheck[] = [
171
179
  return out;
172
180
  },
173
181
  },
182
+ {
183
+ id: "WSP118",
184
+ name: "flag-stale",
185
+ description:
186
+ "No feature flag outlives its work: a flag whose work item implements decisions that are all confirmed (closed in their kind and superseded by nothing) is due for removal, with the parameter it backs (#4024).",
187
+ severity: "warning",
188
+ configurable: true,
189
+ check(ctx) {
190
+ const out: WorkspaceDiagnostic[] = [];
191
+ for (const k of ctx.facts?.declaredKinds ?? []) {
192
+ for (const f of k.flags ?? []) {
193
+ if (f.stale === null) continue;
194
+ out.push({
195
+ checkId: this.id,
196
+ severity: this.severity,
197
+ message: `flag ${f.flag} ${f.stale}; remove the flag record and the parameter it backs`,
198
+ ...(k.declared.member !== null ? { entity: k.declared.member } : {}),
199
+ pointer: "",
200
+ file: f.file,
201
+ code: "flag-stale",
202
+ });
203
+ }
204
+ }
205
+ return out;
206
+ },
207
+ },
174
208
  ];
@@ -30,6 +30,7 @@
30
30
  * | WSP115 | the record kinds the declaration names (#2680) |
31
31
  * | WSP116 | the decision points file of each declared answer kind (ws-058) |
32
32
  * | WSP117 | a done work item's acceptance criteria all met (#2772) |
33
+ * | WSP118 | no feature flag outlives its work: a flag whose work item's decisions are all confirmed is due for removal (#4024) |
33
34
  * | WSP121, WSP122 | boxes: no literal credential, every capability brokered (#2726) |
34
35
  * | WSP123, WSP124 | box isolation: no shared port, state path or cookie, no literal machine path (#2727) |
35
36
  * | WSP125 | boxes: a fountain Box declares the callback token fountain gives its sandbox (#2780) |
@@ -521,7 +522,7 @@ export async function runDeclarationChecks(
521
522
  const gathered = options.gather === false || options.tree ? {} : await gatherWorkspaceFacts(root, declaration, options);
522
523
  // The declared record kinds load from the working tree; under --at only whether each exists at the revision is checked (#2680).
523
524
  // A declared work kind's acceptance criteria are counted in the working tree too (#2772).
524
- const declaredKinds = options.gather === false ? undefined : await loadDeclaredKinds(declaration, tree, root, { load: !options.tree, acceptance: !options.tree });
525
+ const declaredKinds = options.gather === false ? undefined : await loadDeclaredKinds(declaration, tree, root, { load: !options.tree, acceptance: !options.tree, flags: !options.tree });
525
526
  // A box's intent is read from the working tree's records, so not under --at (#2850).
526
527
  const boxIntents = declaredKinds && !options.tree ? await resolveBoxIntents(declaration, root, declaredKinds) : undefined;
527
528
  // A linked member's lexicons name its tables and columns as outputs (#3931); reading them folds its source, never runs it.
@@ -37,6 +37,8 @@ export interface CheckRun {
37
37
  * time in milliseconds, which orders a re-run after the run it replaced.
38
38
  */
39
39
  opRun?: OpRunRef;
40
+ /** For a failed Op run, its record's `failure.code` (#4094), which a revoke note names. Absent otherwise. */
41
+ failureCode?: string;
40
42
  }
41
43
 
42
44
  /** The Op run a {@link CheckRun} stands for (#4044). */
@@ -117,6 +117,8 @@ export interface RunVerdict {
117
117
  verdict: Verdict;
118
118
  /** The Op run this is, when the source is chant runs (#4044). */
119
119
  opRun?: OpRunRef;
120
+ /** Why the Op run failed, its record's `failure.code` (#4094), when it says. */
121
+ failureCode?: string;
120
122
  }
121
123
 
122
124
  export interface PhaseVerdict {
@@ -144,7 +146,7 @@ export function evaluatePhase(phase: CiPhase, latest: readonly CheckRun[]): Phas
144
146
  if (matched.length === 0) unmatched.push(pattern);
145
147
  for (const r of matched) {
146
148
  if (runs.some((x) => x.name === r.name)) continue;
147
- runs.push({ name: r.name, id: r.id, status: r.status, conclusion: r.conclusion, url: r.url, verdict: runVerdict(phase, r), ...(r.opRun ? { opRun: r.opRun } : {}) });
149
+ runs.push({ name: r.name, id: r.id, status: r.status, conclusion: r.conclusion, url: r.url, verdict: runVerdict(phase, r), ...(r.opRun ? { opRun: r.opRun } : {}), ...(r.failureCode ? { failureCode: r.failureCode } : {}) });
148
150
  }
149
151
  }
150
152
  const verdict: Verdict = runs.some((r) => r.verdict === "fail")
@@ -263,7 +265,8 @@ export function greenAnnotation(green: CiGreen, sha: string, verdict: CommitVerd
263
265
  /** The annotation of a revoked tag: the phase and the run that failed, and the time, signed when `signer` is given (#4031). */
264
266
  export function revokedAnnotation(green: CiGreen, sha: string, failure: NonNullable<CommitVerdict["failure"]>, at: Date, signer?: CiTagSigner): string {
265
267
  const record: CiTagRecord = { schema: 1, tag: "revoked", commit: sha, branch: green.branch, at: iso(at), ...sourceField(green), phase: failure.phase, run: runRecord(failure.run) };
266
- return `ci: phase ${failure.phase} failed in ${failure.run.name} (${failure.run.conclusion ?? failure.run.status})\n\n${recordJson(record, signer)}\n`;
268
+ const code = failure.run.failureCode ? `, ${failure.run.failureCode}` : "";
269
+ return `ci: phase ${failure.phase} failed in ${failure.run.name} (${failure.run.conclusion ?? failure.run.status}${code})\n\n${recordJson(record, signer)}\n`;
267
270
  }
268
271
 
269
272
  /**
@@ -627,6 +630,7 @@ export function opRunCheckRun(record: OpRunRecord, signer: string): CheckRun {
627
630
  completedAt: settled ? record.ended : null,
628
631
  url: record.runOrigin?.url ?? null,
629
632
  opRun: { id: record.id, env: record.env, signer, statement: record.statement! },
633
+ ...(record.status === "fail" && record.failure ? { failureCode: record.failure.code } : {}),
630
634
  };
631
635
  }
632
636
 
@@ -895,6 +899,18 @@ const asRun = (r: unknown): CiListRun | null => {
895
899
  return { name: o.name, id: typeof o.id === "number" ? o.id : null, conclusion: typeof o.conclusion === "string" ? o.conclusion : null, url: typeof o.url === "string" ? o.url : null, ...opRun };
896
900
  };
897
901
 
902
+ /** The revoked tag on a commit as `ci list` shows it, which the release reads of #4033 (ws-105) reuse. */
903
+ export type RevokedTagView = NonNullable<CiListCommit["revoked"]>;
904
+
905
+ /**
906
+ * A counted revoked tag as `ci list` shows it: its name and time, the phase
907
+ * and run its annotation names, and its signer. A tag made from chant runs
908
+ * (#4044) names its run with `id: null` and the Op run in `opRun`.
909
+ */
910
+ export function revokedTagView(sha: string, r: CountedCiTag): RevokedTagView {
911
+ return { tag: `${CI_REVOKED_TAG_PREFIX}${sha}`, tagged: r.tagged, phase: typeof r.record?.phase === "string" ? r.record.phase : null, run: asRun(r.record?.run), signer: r.signer };
912
+ }
913
+
898
914
  /** A judged run as `ci list` shows it. */
899
915
  const listRun = (r: RunVerdict): CiListRun => ({ name: r.name, id: r.opRun ? null : r.id, conclusion: r.conclusion, url: r.url, ...(r.opRun ? { opRun: { id: r.opRun.id, env: r.opRun.env, signer: r.opRun.signer } } : {}) });
900
916
 
@@ -966,9 +982,8 @@ export async function ciList(req: ListRequest): Promise<CiListDocument> {
966
982
  let phases = green.require.map((name) => recordedPhase(g, name));
967
983
  let revoked: CiListCommit["revoked"] = null;
968
984
  if (r) {
969
- const phase = typeof r.record?.phase === "string" ? r.record.phase : null;
970
- const run = asRun(r.record?.run);
971
- revoked = { tag: `${CI_REVOKED_TAG_PREFIX}${c.sha}`, tagged: r.tagged, phase, run, signer: r.signer };
985
+ revoked = revokedTagView(c.sha, r);
986
+ const { phase, run } = revoked;
972
987
  phases = phases.map((p) => (p.phase === phase ? { phase: p.phase, result: "fail", runs: run ? [run] : [] } : p));
973
988
  } else if (!g && (runs || req.forge)) {
974
989
  const verdict = evaluateCommit(green, runs ? runs.checkRuns(c.sha) : await req.forge!.checkRuns(c.sha));