@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
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * The intent graph over one region: `chant workspace graph --intent
3
- * <path[:start-end]|path#symbol>` (#2651; #2650 sections B and C1; #2524 D8,
3
+ * <path[:start-end]|path#symbol|member/node|sha>` (#2651; #2650 sections B and C1; #2524 D8,
4
4
  * D15; #3034).
5
5
  *
6
6
  * A person points at some code and asks how it got this way and who decided
@@ -75,6 +75,7 @@ import { followSquashes, squashLineOrigins } from "./squash.js";
75
75
  import { memberDirOnDisk, memberSymbolResolvers } from "./lexicon-symbols.js";
76
76
  import { resolveSymbol, symbolResolverFor } from "./symbols.js";
77
77
  import { readTrailerJoins } from "./trailer-joins.js";
78
+ import { buildTrace } from "./intent-trace.js";
78
79
  import { joinPath, skippedDir, workingTree } from "./tree.js";
79
80
  import { activeAttestors } from "./trust/attestor.js";
80
81
  import { commitProvenance, policyAtBase, resolveBase } from "./trust/provenance.js";
@@ -303,6 +304,24 @@ export function closingCommit(top, rev, path, stateField, closed) {
303
304
  }
304
305
  return closing;
305
306
  }
307
+ /**
308
+ * The files a commit changed, from the workspace root (#4023): against its
309
+ * first parent, or every file for a root commit. Files outside the workspace
310
+ * are left out.
311
+ */
312
+ export function changedFiles(top, sha, workspacePrefix) {
313
+ const out = tryGit(top, ["diff-tree", "--no-commit-id", "-r", "--name-only", "--root", "-m", "--first-parent", "-z", sha]) ?? "";
314
+ const files = new Set();
315
+ for (const f of out.split("\0")) {
316
+ if (!f)
317
+ continue;
318
+ if (workspacePrefix === "")
319
+ files.add(f);
320
+ else if (f.startsWith(`${workspacePrefix}/`))
321
+ files.add(f.slice(workspacePrefix.length + 1));
322
+ }
323
+ return [...files].sort();
324
+ }
306
325
  /** The commit a decision record's window opens at: the one that decided it, or, when it is not approved, the one that added it. */
307
326
  export function windowOpening(top, rev, view) {
308
327
  return view.decidedIn?.sha ?? addingCommit(top, rev, view.path);
@@ -504,6 +523,8 @@ export async function loadKinds(query, top) {
504
523
  }
505
524
  return out;
506
525
  }
526
+ /** A commit sha as a region may give it: 7 to 64 hex digits. */
527
+ const COMMIT_REGION = /^[0-9a-fA-F]{7,64}$/;
507
528
  async function resolveRegion(query, located, declaration) {
508
529
  const parsed = parseRegion(query.region);
509
530
  if ("error" in parsed)
@@ -553,9 +574,40 @@ async function resolveRegion(query, located, declaration) {
553
574
  return { path: file === "" ? "." : file, lines: loc.line ? { start: loc.line, end: loc.line } : null, node: query.region, symbol: null };
554
575
  }
555
576
  }
556
- throw new IntentError("intent-region-invalid", `${query.region} is not a path in the workspace${located.tree.label}, a path#symbol, or a graph node id`);
577
+ // A commit sha, when no path or node has the name (#4023): the commit and the files it changed.
578
+ if (COMMIT_REGION.test(query.region) && located.top) {
579
+ const sha = tryGit(located.top, ["rev-parse", "--verify", "--quiet", `${query.region}^{commit}`])?.trim();
580
+ if (sha)
581
+ return { path: ".", lines: null, node: null, symbol: null, commit: sha };
582
+ }
583
+ throw new IntentError("intent-region-invalid", `${query.region} is not a path in the workspace${located.tree.label}, a path#symbol, a graph node id or a commit`);
557
584
  }
558
585
  /** Build the intent document. Never throws an {@link IntentError}, {@link WorkspaceReadError} or {@link RecordReadError}. */
586
+ /**
587
+ * Give each work node the in-flight items it overlaps by file (#4025). Only a
588
+ * working-tree read, since the overlap is about the branches as they are now;
589
+ * a read that fails leaves the field off.
590
+ */
591
+ async function addOverlaps(work, declaration, root, top, at) {
592
+ if (work.length === 0 || at !== null)
593
+ return;
594
+ let report;
595
+ try {
596
+ const { readOverlap } = await import("./overlap.js");
597
+ report = await readOverlap({ declaration, root, top, changeSets: [] });
598
+ }
599
+ catch {
600
+ return;
601
+ }
602
+ if (report === null)
603
+ return;
604
+ for (const n of work) {
605
+ const self = `${n.recordKind}:${n.record}`;
606
+ n.overlaps = report.pairs
607
+ .filter((p) => p.items.includes(self) && p.files.length > 0)
608
+ .map((p) => ({ with: p.items[0] === self ? p.items[1] : p.items[0], files: p.files }));
609
+ }
610
+ }
559
611
  export async function intentGraph(query) {
560
612
  const head = { $schema: INTENT_OUTPUT_SCHEMA_ID, contract: INTENT_CONTRACT_VERSION, chant: readerVersion() };
561
613
  try {
@@ -575,7 +627,7 @@ async function walk(query, head) {
575
627
  throw new IntentError("not-a-git-repository", "the intent graph reads git history, and this directory is not in a git repository");
576
628
  const declaration = readDeclaration(located.tree, "", { rootChant: true });
577
629
  const region = await resolveRegion(query, located, declaration);
578
- const type = region.path === "." ? "dir" : located.tree.stat(region.path);
630
+ const type = region.commit ? "commit" : region.path === "." ? "dir" : located.tree.stat(region.path);
579
631
  if (!type)
580
632
  throw new IntentError("intent-region-invalid", `${region.path} does not exist${located.tree.label}`);
581
633
  if (region.lines) {
@@ -601,8 +653,21 @@ async function walk(query, head) {
601
653
  findings.push({ id: `finding:${code}:${findings.filter((f) => f.code === code).length + 1}`, kind: "finding", code, message, concerns });
602
654
  };
603
655
  // The region, its files and its member.
604
- const member = region.path === "." ? (declaration.members.find((m) => m.dir === ".")?.name ?? null) : memberHolding(region.path, declaration.members);
605
- const rid = regionId(region.path, region.lines, region.symbol?.name);
656
+ // A commit region (#4023) covers the files the commit changed, from the workspace root, and the members holding them.
657
+ const workspacePrefix = located.root === "." ? "" : located.root;
658
+ const changed = region.commit ? changedFiles(top, region.commit, workspacePrefix) : [];
659
+ const changedMembers = [...new Set(changed.map((f) => memberHolding(f, declaration.members)).filter((m) => m !== null))];
660
+ const member = region.commit
661
+ ? changedMembers.length === 1
662
+ ? changedMembers[0]
663
+ : null
664
+ : region.path === "."
665
+ ? (declaration.members.find((m) => m.dir === ".")?.name ?? null)
666
+ : memberHolding(region.path, declaration.members);
667
+ const regionMembers = region.commit ? changedMembers : member ? [member] : [];
668
+ const rid = region.commit ? `region:commit:${region.commit}` : regionId(region.path, region.lines, region.symbol?.name);
669
+ /** How messages name the region: its path, or the commit. */
670
+ const regionLabel = region.commit ? `commit ${region.commit.slice(0, 8)}` : region.path;
606
671
  add({
607
672
  id: rid,
608
673
  kind: "region",
@@ -614,6 +679,7 @@ async function walk(query, head) {
614
679
  generated: type === "file" ? isGeneratedPath(declaration, region.path) : null,
615
680
  node: region.node,
616
681
  symbol: region.symbol,
682
+ ...(region.commit ? { commit: region.commit } : {}),
617
683
  });
618
684
  const files = type === "dir" ? filesUnder(located.tree, region.path) : [];
619
685
  for (const f of files)
@@ -629,9 +695,8 @@ async function walk(query, head) {
629
695
  const shallow = tryGit(top, ["rev-parse", "--is-shallow-repository"])?.trim() === "true";
630
696
  if (shallow)
631
697
  reasons.push({ code: "intent-history-shallow", message: "this is a shallow clone, so the history stops at its boundary and the oldest commit listed may stand for many" });
632
- const workspacePrefix = located.root === "." ? "" : located.root;
633
698
  const gitPath = joinPath(workspacePrefix, region.path);
634
- const touched = rev ? regionHistory(top, rev, gitPath, type, region.lines) : [];
699
+ const touched = region.commit ? [{ sha: region.commit, lines: null }] : rev && type !== "commit" ? regionHistory(top, rev, gitPath, type, region.lines) : [];
635
700
  // Who last wrote each current line of a file region (#3034). A commit blame
636
701
  // names and the history walk missed, as when a move confuses git log -L,
637
702
  // joins the commits that touched the region.
@@ -848,7 +913,11 @@ async function walk(query, head) {
848
913
  if (!isWorkspacePath(p))
849
914
  continue;
850
915
  const full = joinPath(kindPrefix, p);
851
- if (regionFull !== "" && constraintCovers(full, regionFull)) {
916
+ if (type === "commit") {
917
+ if (changed.some((f) => constraintCovers(full, joinPath(workspacePrefix, f))))
918
+ matched.push({ entry, granularity: "path", to: rid });
919
+ }
920
+ else if (regionFull !== "" && constraintCovers(full, regionFull)) {
852
921
  matched.push({ entry, granularity: "path", to: rid });
853
922
  }
854
923
  else if (type === "dir" && full !== regionFull && (regionFull === "" || full.startsWith(`${regionFull}/`))) {
@@ -858,7 +927,7 @@ async function walk(query, head) {
858
927
  }
859
928
  }
860
929
  else if (entry.startsWith("member:")) {
861
- if (member !== null && entry.slice("member:".length) === member)
930
+ if (regionMembers.includes(entry.slice("member:".length)))
862
931
  matched.push({ entry, granularity: "member", to: rid });
863
932
  }
864
933
  else {
@@ -1264,7 +1333,7 @@ async function walk(query, head) {
1264
1333
  edges.push({ kind: "within", from: c.id, to: h.node.id, state: "worked" });
1265
1334
  }
1266
1335
  if (readsRecords && c.state === "undecided") {
1267
- find("intent-commit-undecided", `${t.sha.slice(0, 8)} changed the region when no decision constrained ${region.path} by path`, [c.id, rid]);
1336
+ find("intent-commit-undecided", `${t.sha.slice(0, 8)} changed the region when no decision constrained ${regionLabel} by path`, [c.id, rid]);
1268
1337
  }
1269
1338
  if (readsRecords && !j.unit && j.carries.length === 0 && c.pullRequest === null && coveredAt(t.sha, ["path", "member", "contract", "issue"]).length === 0) {
1270
1339
  find("intent-commit-bare", `${t.sha.slice(0, 8)} names no unit, no record, no pull request and no decision`, [c.id]);
@@ -1278,13 +1347,13 @@ async function walk(query, head) {
1278
1347
  if (readsRecords) {
1279
1348
  const current = covering.filter((c) => c.node.supersededBy === null);
1280
1349
  if (covering.length === 0) {
1281
- find("intent-region-unconstrained", `no decision constrains ${region.path}`, [rid]);
1350
+ find("intent-region-unconstrained", `no decision constrains ${regionLabel}`, [rid]);
1282
1351
  }
1283
1352
  else if (current.length === 0) {
1284
- find("intent-decision-superseded-live", `every decision constraining ${region.path} is superseded: ${covering.map((c) => `${c.node.record} by ${c.node.supersededBy}`).join(", ")}`, [rid, ...covering.map((c) => c.node.id)]);
1353
+ find("intent-decision-superseded-live", `every decision constraining ${regionLabel} is superseded: ${covering.map((c) => `${c.node.record} by ${c.node.supersededBy}`).join(", ")}`, [rid, ...covering.map((c) => c.node.id)]);
1285
1354
  }
1286
1355
  else if (current.every((c) => !c.node.closed)) {
1287
- find("intent-decision-provisional", `the decisions constraining ${region.path} are ${[...new Set(current.map((c) => c.node.state ?? "stateless"))].join(" or ")}, and none is in a closed state`, [rid, ...current.map((c) => c.node.id)]);
1356
+ find("intent-decision-provisional", `the decisions constraining ${regionLabel} are ${[...new Set(current.map((c) => c.node.state ?? "stateless"))].join(" or ")}, and none is in a closed state`, [rid, ...current.map((c) => c.node.id)]);
1288
1357
  }
1289
1358
  // A current decision with a dissent nobody addressed or withdrew (#2686), from its quorum.
1290
1359
  for (const c of current) {
@@ -1296,14 +1365,14 @@ async function walk(query, head) {
1296
1365
  id: `finding:intent-decision-contested:${findings.filter((f) => f.code === "intent-decision-contested").length + 1}`,
1297
1366
  kind: "finding",
1298
1367
  code: "intent-decision-contested",
1299
- message: `${c.node.record} constrains ${region.path} and has ${open.length} open ${open.length === 1 ? "concern" : "concerns"}, from ${open.map((o) => o.reviewer).join(", ")}: a dissent neither addressed nor withdrawn`,
1368
+ message: `${c.node.record} constrains ${regionLabel} and has ${open.length} open ${open.length === 1 ? "concern" : "concerns"}, from ${open.map((o) => o.reviewer).join(", ")}: a dissent neither addressed nor withdrawn`,
1300
1369
  concerns: [c.node.id, rid],
1301
1370
  openConcerns: { count: open.length, principals },
1302
1371
  });
1303
1372
  }
1304
1373
  const granularities = new Set(covering.flatMap((c) => c.node.constrains.map((x) => x.granularity)));
1305
1374
  if (covering.length > 0 && !granularities.has("path") && granularities.has("member")) {
1306
- find("intent-constraint-coarse", `${region.path} is constrained only through its member, ${member}`, [rid, ...covering.map((c) => c.node.id)]);
1375
+ find("intent-constraint-coarse", `${regionLabel} is constrained only through its member, ${regionMembers.join(", ")}`, [rid, ...covering.map((c) => c.node.id)]);
1307
1376
  }
1308
1377
  }
1309
1378
  // Findings about work items (#2683).
@@ -1316,7 +1385,7 @@ async function walk(query, head) {
1316
1385
  const w = windows.get(c.node.id);
1317
1386
  if (w && touched.some((t) => w.from.has(t.sha) && !w.until?.has(t.sha)))
1318
1387
  continue;
1319
- find("intent-decision-unimplemented", `${c.node.record} is ${c.node.state} and constrains ${region.path}, and no work item that is not dropped implements it, and no commit changed the region in its window`, [c.node.id, rid]);
1388
+ find("intent-decision-unimplemented", `${c.node.record} is ${c.node.state} and constrains ${regionLabel}, and no work item that is not dropped implements it, and no commit changed the region in its window`, [c.node.id, rid]);
1320
1389
  }
1321
1390
  for (const h of workCovering) {
1322
1391
  const node = h.node;
@@ -1336,7 +1405,7 @@ async function walk(query, head) {
1336
1405
  const impl = implementersOf(d);
1337
1406
  if (impl.length === 0 || impl.some((h) => h.view.state === workSpec(h).done))
1338
1407
  continue;
1339
- find("intent-work-open-decided-code", `${own.length} ${own.length === 1 ? "commit" : "commits"} in ${region.path} ${own.length === 1 ? "is" : "are"} ${d.record}'s own work, and ${impl.map((h) => `${h.view.id} is ${h.view.state ?? "stateless"}`).join(", ")}: the code says done and the queue says not`, [d.id, ...own, ...impl.map((h) => workNode(h).id)]);
1408
+ find("intent-work-open-decided-code", `${own.length} ${own.length === 1 ? "commit" : "commits"} in ${regionLabel} ${own.length === 1 ? "is" : "are"} ${d.record}'s own work, and ${impl.map((h) => `${h.view.id} is ${h.view.state ?? "stateless"}`).join(", ")}: the code says done and the queue says not`, [d.id, ...own, ...impl.map((h) => workNode(h).id)]);
1340
1409
  }
1341
1410
  }
1342
1411
  // 5. Links: the declared member links that touch the region's member, read in source.
@@ -1412,6 +1481,8 @@ async function walk(query, head) {
1412
1481
  const kindPrefix = h.kind.records.workspaceRoot === "." ? "" : h.kind.records.workspaceRoot;
1413
1482
  const full = joinPath(kindPrefix, parsed.path);
1414
1483
  const contains = (a, b) => a === b || a === "" || b.startsWith(`${a}/`);
1484
+ if (type === "commit")
1485
+ return changed.some((f) => contains(full, joinPath(workspacePrefix, f)) || contains(joinPath(workspacePrefix, f), full));
1415
1486
  if (!contains(full, regionFull) && !contains(regionFull, full))
1416
1487
  return false;
1417
1488
  if (full === regionFull && parsed.lines && region.lines)
@@ -1428,7 +1499,7 @@ async function walk(query, head) {
1428
1499
  if (gap && h.view.state === workSpec(h).done) {
1429
1500
  const node = workNode(h);
1430
1501
  if (!node.warnings.some((w) => w.code === "work-done-gap-open")) {
1431
- node.warnings.push({ code: "work-done-gap-open", message: `${node.record} is ${h.view.state}, and ${f.code}, the gap it came from, still fires on ${region.path}` });
1502
+ node.warnings.push({ code: "work-done-gap-open", message: `${node.record} is ${h.view.state}, and ${f.code}, the gap it came from, still fires on ${regionLabel}` });
1432
1503
  }
1433
1504
  }
1434
1505
  }
@@ -1474,15 +1545,63 @@ async function walk(query, head) {
1474
1545
  }
1475
1546
  for (const f of findings)
1476
1547
  nodes.set(f.id, f);
1548
+ await addOverlaps([...nodes.values()].filter((n) => n.kind === "work"), declaration, located.rootOnDisk, top, located.at);
1477
1549
  const why = explain();
1478
1550
  const all = [...nodes.values()];
1551
+ // The why chain (#4023): each commit's work item, ci tag, release, gate resolutions and deploys.
1552
+ const workIds = new Map();
1553
+ const workNodeIds = new Map();
1554
+ for (const h of workAll) {
1555
+ const name = h.kind.records.loaded.kind.name;
1556
+ (workIds.get(name) ?? workIds.set(name, new Set()).get(name)).add(h.view.id);
1557
+ if (h.node)
1558
+ workNodeIds.set(`${name}:${h.view.id}`, h.node.id);
1559
+ }
1560
+ for (const k of workKinds)
1561
+ if (!workIds.has(k.records.loaded.kind.name))
1562
+ workIds.set(k.records.loaded.kind.name, new Set());
1563
+ const windowsOf = new Map();
1564
+ for (const e of edges) {
1565
+ if (e.kind !== "within" || e.state !== "worked")
1566
+ continue;
1567
+ const w = nodes.get(e.to);
1568
+ if (!w)
1569
+ continue;
1570
+ const sha = e.from.slice("commit:".length);
1571
+ (windowsOf.get(sha) ?? windowsOf.set(sha, []).get(sha)).push({ id: `${w.recordKind}:${w.record}`, node: w.id, path: w.path });
1572
+ }
1573
+ const later = new Map();
1574
+ const trace = await buildTrace({
1575
+ top,
1576
+ commits: all.filter((n) => n.kind === "commit").map((c) => ({ id: c.id, sha: c.sha, trailers: c.trailers, joins: c.joins })),
1577
+ work: readsWork ? { index: { kinds: workIds }, nodes: workNodeIds } : null,
1578
+ windows: windowsOf,
1579
+ // The region's member's ledger; for a region in no member, every member's and the workspace's own.
1580
+ ledgers: (regionMembers.length > 0 ? regionMembers : declaration.members.map((m) => m.name))
1581
+ .map((name) => {
1582
+ const dir = declaration.members.find((m) => m.name === name).dir;
1583
+ return { member: name, cwd: memberDirOnDisk(located.rootOnDisk, dir), within: dir === "." ? null : `_members/${name}/` };
1584
+ })
1585
+ .concat(regionMembers.length > 0 ? [] : [{ member: null, cwd: located.rootOnDisk, within: null }]),
1586
+ green: declaration.ci?.green ?? null,
1587
+ contains: (sha, commit) => {
1588
+ if (commit === sha)
1589
+ return true;
1590
+ if (!rev || !FULL_COMMIT_ID.test(commit))
1591
+ return false;
1592
+ let set = later.get(sha);
1593
+ if (!set)
1594
+ later.set(sha, (set = descendants(top, sha, rev)));
1595
+ return set.has(commit);
1596
+ },
1597
+ });
1479
1598
  return {
1480
1599
  doc: {
1481
1600
  ...head,
1482
1601
  at: located.at,
1483
1602
  workspace: { name: declaration.name, root: located.root },
1484
1603
  region: rid,
1485
- history: { rev, follows: region.lines ? "line-range" : type === "file" ? "file" : "directory", shallow },
1604
+ history: { rev, follows: region.commit ? "commit" : region.lines ? "line-range" : type === "file" ? "file" : "directory", shallow },
1486
1605
  kinds: kinds.map((k) => ({ file: k.display, name: k.name, records: k.records?.loaded.kind.name ?? null, joins: k.joins?.form ?? null })),
1487
1606
  nodes: all,
1488
1607
  edges,
@@ -1494,6 +1613,7 @@ async function walk(query, head) {
1494
1613
  findings: findings.length,
1495
1614
  },
1496
1615
  why,
1616
+ trace,
1497
1617
  },
1498
1618
  failed: reasons.some((r) => r.code === "intent-plugin-failed"),
1499
1619
  };
@@ -1618,12 +1738,12 @@ async function walk(query, head) {
1618
1738
  if (!explained) {
1619
1739
  gaps.push({
1620
1740
  code: "intent-why-no-decision",
1621
- message: readsRecords ? `no current decision governs ${region.path}, and none is carried out by what made its lines` : `no record kind was read, so no decision can account for ${region.path}`,
1741
+ message: readsRecords ? `no current decision governs ${regionLabel}, and none is carried out by what made its lines` : `no record kind was read, so no decision can account for ${regionLabel}`,
1622
1742
  });
1623
1743
  }
1624
1744
  const committed = who.filter((w) => w.sha !== null);
1625
1745
  if (fileLines !== null ? committed.length > 0 && committed.every((w) => w.runs.length === 0) : touched.length > 0 && runNodes.length === 0) {
1626
- gaps.push({ code: "intent-why-no-run", message: `no agent run is joined to the commits that made ${fileLines !== null ? "the current lines of " : ""}${region.path}` });
1746
+ gaps.push({ code: "intent-why-no-run", message: `no agent run is joined to the commits that made ${fileLines !== null ? "the current lines of " : ""}${regionLabel}` });
1627
1747
  }
1628
1748
  const uncommitted = who.filter((w) => w.sha === null).map((w) => w.line);
1629
1749
  if (uncommitted.length > 0)