@intentius/chant 0.101.0 → 0.104.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (739) hide show
  1. package/dist/agents/checks.d.ts.map +1 -1
  2. package/dist/attrref.d.ts.map +1 -1
  3. package/dist/audit/core.d.ts +2 -0
  4. package/dist/audit/core.d.ts.map +1 -1
  5. package/dist/audit/discover.d.ts.map +1 -1
  6. package/dist/audit/nginx.d.ts.map +1 -1
  7. package/dist/audit/prior-art.d.ts +48 -0
  8. package/dist/audit/prior-art.d.ts.map +1 -1
  9. package/dist/behaviour-kinds.d.ts.map +1 -1
  10. package/dist/builder.d.ts.map +1 -1
  11. package/dist/change-set.d.ts +232 -0
  12. package/dist/change-set.d.ts.map +1 -0
  13. package/dist/cli/commands/audit.d.ts +7 -0
  14. package/dist/cli/commands/audit.d.ts.map +1 -1
  15. package/dist/cli/commands/build.d.ts.map +1 -1
  16. package/dist/cli/commands/carve-emit.d.ts.map +1 -1
  17. package/dist/cli/commands/check-lexicon.d.ts +16 -0
  18. package/dist/cli/commands/check-lexicon.d.ts.map +1 -1
  19. package/dist/cli/commands/import.d.ts +8 -0
  20. package/dist/cli/commands/import.d.ts.map +1 -1
  21. package/dist/cli/commands/init-lexicon.d.ts.map +1 -1
  22. package/dist/cli/commands/init.d.ts +19 -0
  23. package/dist/cli/commands/init.d.ts.map +1 -1
  24. package/dist/cli/commands/onboard.d.ts +9 -0
  25. package/dist/cli/commands/onboard.d.ts.map +1 -1
  26. package/dist/cli/commands/pinned-upgrade.d.ts +19 -5
  27. package/dist/cli/commands/pinned-upgrade.d.ts.map +1 -1
  28. package/dist/cli/handlers/build.d.ts.map +1 -1
  29. package/dist/cli/handlers/change-set.d.ts +11 -0
  30. package/dist/cli/handlers/change-set.d.ts.map +1 -0
  31. package/dist/cli/handlers/dev.d.ts.map +1 -1
  32. package/dist/cli/handlers/fan-out.d.ts +33 -0
  33. package/dist/cli/handlers/fan-out.d.ts.map +1 -1
  34. package/dist/cli/handlers/lifecycle.d.ts.map +1 -1
  35. package/dist/cli/handlers/misc.d.ts.map +1 -1
  36. package/dist/cli/handlers/operator.d.ts +16 -0
  37. package/dist/cli/handlers/operator.d.ts.map +1 -1
  38. package/dist/cli/handlers/pr.d.ts +31 -0
  39. package/dist/cli/handlers/pr.d.ts.map +1 -0
  40. package/dist/cli/handlers/run.d.ts.map +1 -1
  41. package/dist/cli/lsp/server.d.ts.map +1 -1
  42. package/dist/cli/main.d.ts.map +1 -1
  43. package/dist/cli/mcp/op-tools.d.ts.map +1 -1
  44. package/dist/cli/mcp/server.d.ts.map +1 -1
  45. package/dist/cli/mcp/tools/build.d.ts.map +1 -1
  46. package/dist/cli/mcp/tools/composites.d.ts.map +1 -1
  47. package/dist/cli/mcp/tools/explain.d.ts.map +1 -1
  48. package/dist/cli/mcp/tools/import.d.ts.map +1 -1
  49. package/dist/cli/mcp/tools/lint.d.ts.map +1 -1
  50. package/dist/cli/mcp/tools/scaffold.d.ts.map +1 -1
  51. package/dist/cli/mcp/tools/search.d.ts.map +1 -1
  52. package/dist/cli/mcp/workspace-tools.d.ts +4 -3
  53. package/dist/cli/mcp/workspace-tools.d.ts.map +1 -1
  54. package/dist/cli/registry.d.ts +74 -3
  55. package/dist/cli/registry.d.ts.map +1 -1
  56. package/dist/codegen/fetch.d.ts.map +1 -1
  57. package/dist/codegen/naming.d.ts.map +1 -1
  58. package/dist/codegen/pinned-upgrade.d.ts +67 -3
  59. package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
  60. package/dist/codegen/registry.d.ts.map +1 -1
  61. package/dist/components/auto-release.d.ts +16 -0
  62. package/dist/components/auto-release.d.ts.map +1 -1
  63. package/dist/components/capability-plugin-loader.d.ts.map +1 -1
  64. package/dist/components/capability.d.ts +53 -0
  65. package/dist/components/capability.d.ts.map +1 -1
  66. package/dist/components/changed-files.d.ts +31 -0
  67. package/dist/components/changed-files.d.ts.map +1 -0
  68. package/dist/components/cli-support.d.ts +9 -1
  69. package/dist/components/cli-support.d.ts.map +1 -1
  70. package/dist/components/component.d.ts +24 -0
  71. package/dist/components/component.d.ts.map +1 -1
  72. package/dist/components/deploy-units.d.ts.map +1 -1
  73. package/dist/components/driver.d.ts +13 -0
  74. package/dist/components/driver.d.ts.map +1 -1
  75. package/dist/components/fan-out-output.d.ts +6 -0
  76. package/dist/components/fan-out-output.d.ts.map +1 -1
  77. package/dist/components/fan-out-record.d.ts +41 -0
  78. package/dist/components/fan-out-record.d.ts.map +1 -0
  79. package/dist/components/fan-out-run.d.ts +65 -0
  80. package/dist/components/fan-out-run.d.ts.map +1 -1
  81. package/dist/components/fan-out-support.d.ts +2 -0
  82. package/dist/components/fan-out-support.d.ts.map +1 -1
  83. package/dist/components/fan-out.d.ts +6 -0
  84. package/dist/components/fan-out.d.ts.map +1 -1
  85. package/dist/components/gated-wave-pipeline.d.ts +50 -0
  86. package/dist/components/gated-wave-pipeline.d.ts.map +1 -0
  87. package/dist/components/index.d.ts +1 -1
  88. package/dist/components/index.d.ts.map +1 -1
  89. package/dist/components/layers.d.ts +25 -0
  90. package/dist/components/layers.d.ts.map +1 -0
  91. package/dist/components/pr-pipeline.d.ts +61 -0
  92. package/dist/components/pr-pipeline.d.ts.map +1 -0
  93. package/dist/components/pr-run.d.ts +119 -0
  94. package/dist/components/pr-run.d.ts.map +1 -0
  95. package/dist/components/promote.d.ts.map +1 -1
  96. package/dist/components/starter-plugin.d.ts.map +1 -1
  97. package/dist/components/verbs/process-runner.d.ts.map +1 -1
  98. package/dist/components/verbs/r2-sync.d.ts.map +1 -1
  99. package/dist/components/verbs/run-agent.d.ts.map +1 -1
  100. package/dist/components/verbs/sbom-generator.d.ts.map +1 -1
  101. package/dist/components/verbs/shell.d.ts.map +1 -1
  102. package/dist/components/verbs/sign.d.ts.map +1 -1
  103. package/dist/components/verbs/verify.d.ts.map +1 -1
  104. package/dist/components/verbs/vuln-gate.d.ts.map +1 -1
  105. package/dist/components/verbs/vuln-scan.d.ts.map +1 -1
  106. package/dist/components/verbs/wrangler.d.ts.map +1 -1
  107. package/dist/components/wave-plan.d.ts +49 -0
  108. package/dist/components/wave-plan.d.ts.map +1 -0
  109. package/dist/composite.d.ts.map +1 -1
  110. package/dist/config.d.ts +19 -7
  111. package/dist/config.d.ts.map +1 -1
  112. package/dist/declarable.d.ts +16 -0
  113. package/dist/declarable.d.ts.map +1 -1
  114. package/dist/discovery/cache.d.ts.map +1 -1
  115. package/dist/discovery/fold-import.d.ts +15 -5
  116. package/dist/discovery/fold-import.d.ts.map +1 -1
  117. package/dist/discovery/param-deps.d.ts +16 -0
  118. package/dist/discovery/param-deps.d.ts.map +1 -1
  119. package/dist/discovery/sandbox/policy-wire.d.ts.map +1 -1
  120. package/dist/discovery/specifier-resolve.d.ts +37 -0
  121. package/dist/discovery/specifier-resolve.d.ts.map +1 -0
  122. package/dist/errors.d.ts.map +1 -1
  123. package/dist/fold/fold.d.ts +3 -1
  124. package/dist/fold/fold.d.ts.map +1 -1
  125. package/dist/gated-waves.d.ts +147 -0
  126. package/dist/gated-waves.d.ts.map +1 -0
  127. package/dist/graph-detail.d.ts.map +1 -1
  128. package/dist/graph-ir.d.ts.map +1 -1
  129. package/dist/graph-layout.d.ts.map +1 -1
  130. package/dist/import/base-parser.d.ts.map +1 -1
  131. package/dist/import/embedded.d.ts +7 -0
  132. package/dist/import/embedded.d.ts.map +1 -1
  133. package/dist/import/parser-options.d.ts +14 -0
  134. package/dist/import/parser-options.d.ts.map +1 -0
  135. package/dist/import/parser.d.ts +17 -0
  136. package/dist/import/parser.d.ts.map +1 -1
  137. package/dist/index.d.ts +1 -0
  138. package/dist/index.d.ts.map +1 -1
  139. package/dist/kubectl-context.d.ts.map +1 -1
  140. package/dist/lexicon-output.d.ts.map +1 -1
  141. package/dist/lexicon-schema.d.ts +3 -3
  142. package/dist/lexicon.d.ts +103 -3
  143. package/dist/lexicon.d.ts.map +1 -1
  144. package/dist/lifecycle/assert-live.d.ts.map +1 -1
  145. package/dist/lifecycle/gate-ledger.d.ts +22 -0
  146. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  147. package/dist/lifecycle/git.d.ts +46 -1
  148. package/dist/lifecycle/git.d.ts.map +1 -1
  149. package/dist/lifecycle/member-ledger.d.ts.map +1 -1
  150. package/dist/lifecycle/observe.d.ts.map +1 -1
  151. package/dist/lifecycle/plan-ledger.d.ts.map +1 -1
  152. package/dist/lifecycle/release-ledger.d.ts.map +1 -1
  153. package/dist/lifecycle/scenario.d.ts.map +1 -1
  154. package/dist/lifecycle/status.d.ts.map +1 -1
  155. package/dist/lifecycle/work-lease.d.ts +61 -2
  156. package/dist/lifecycle/work-lease.d.ts.map +1 -1
  157. package/dist/lint/config.d.ts +8 -8
  158. package/dist/lint/engine.d.ts +6 -0
  159. package/dist/lint/engine.d.ts.map +1 -1
  160. package/dist/lint/post-synth.d.ts +18 -0
  161. package/dist/lint/post-synth.d.ts.map +1 -1
  162. package/dist/lsp/lexicon-providers.d.ts.map +1 -1
  163. package/dist/op/activities/activity-contracts.d.ts +137 -11
  164. package/dist/op/activities/activity-contracts.d.ts.map +1 -1
  165. package/dist/op/activities/apply.d.ts +79 -9
  166. package/dist/op/activities/apply.d.ts.map +1 -1
  167. package/dist/op/activities/change-set.d.ts +62 -0
  168. package/dist/op/activities/change-set.d.ts.map +1 -0
  169. package/dist/op/activities/decide.d.ts +2 -0
  170. package/dist/op/activities/decide.d.ts.map +1 -1
  171. package/dist/op/activities/factory.d.ts +137 -0
  172. package/dist/op/activities/factory.d.ts.map +1 -0
  173. package/dist/op/activities/index.d.ts +5 -1
  174. package/dist/op/activities/index.d.ts.map +1 -1
  175. package/dist/op/activities/lexicon-upgrade.d.ts +44 -12
  176. package/dist/op/activities/lexicon-upgrade.d.ts.map +1 -1
  177. package/dist/op/activity-contract.d.ts +1 -1
  178. package/dist/op/activity-contract.d.ts.map +1 -1
  179. package/dist/op/activity-failure.d.ts.map +1 -1
  180. package/dist/op/activity-profiles.d.ts.map +1 -1
  181. package/dist/op/builders.d.ts +11 -0
  182. package/dist/op/builders.d.ts.map +1 -1
  183. package/dist/op/composites/apply-op.d.ts +12 -5
  184. package/dist/op/composites/apply-op.d.ts.map +1 -1
  185. package/dist/op/composites/lexicon-upgrade-op.d.ts +22 -6
  186. package/dist/op/composites/lexicon-upgrade-op.d.ts.map +1 -1
  187. package/dist/op/decide-backend.d.ts +5 -1
  188. package/dist/op/decide-backend.d.ts.map +1 -1
  189. package/dist/op/decide-read-inputs.d.ts +4 -2
  190. package/dist/op/decide-read-inputs.d.ts.map +1 -1
  191. package/dist/op/emulator-lifecycle.d.ts +21 -2
  192. package/dist/op/emulator-lifecycle.d.ts.map +1 -1
  193. package/dist/op/factory.d.ts +83 -0
  194. package/dist/op/factory.d.ts.map +1 -0
  195. package/dist/op/gate-approval.d.ts +5 -1
  196. package/dist/op/gate-approval.d.ts.map +1 -1
  197. package/dist/op/gate-wait.d.ts.map +1 -1
  198. package/dist/op/gate.d.ts +19 -3
  199. package/dist/op/gate.d.ts.map +1 -1
  200. package/dist/op/index.d.ts +6 -1
  201. package/dist/op/index.d.ts.map +1 -1
  202. package/dist/op/local-executor.d.ts +6 -0
  203. package/dist/op/local-executor.d.ts.map +1 -1
  204. package/dist/op/op-ir.d.ts +2 -0
  205. package/dist/op/op-ir.d.ts.map +1 -1
  206. package/dist/op/op-verb-class.d.ts.map +1 -1
  207. package/dist/op/operator.d.ts.map +1 -1
  208. package/dist/op/run-context.d.ts +39 -0
  209. package/dist/op/run-context.d.ts.map +1 -0
  210. package/dist/op/run-live.d.ts.map +1 -1
  211. package/dist/op/runtimes/local.d.ts.map +1 -1
  212. package/dist/op/source-archive.d.ts.map +1 -1
  213. package/dist/op/steward-beside.d.ts.map +1 -1
  214. package/dist/op/steward-points.d.ts.map +1 -1
  215. package/dist/op/steward.d.ts.map +1 -1
  216. package/dist/op/types.d.ts +16 -3
  217. package/dist/op/types.d.ts.map +1 -1
  218. package/dist/op/work-lease-run.d.ts +24 -4
  219. package/dist/op/work-lease-run.d.ts.map +1 -1
  220. package/dist/plan-summary.d.ts +207 -0
  221. package/dist/plan-summary.d.ts.map +1 -0
  222. package/dist/pr-forge.d.ts +105 -0
  223. package/dist/pr-forge.d.ts.map +1 -0
  224. package/dist/pr-loop.d.ts +178 -0
  225. package/dist/pr-loop.d.ts.map +1 -0
  226. package/dist/project-root.d.ts.map +1 -1
  227. package/dist/provenance.d.ts +21 -0
  228. package/dist/provenance.d.ts.map +1 -1
  229. package/dist/pseudo-parameter.d.ts.map +1 -1
  230. package/dist/reconcile.d.ts.map +1 -1
  231. package/dist/secret-materialization.d.ts.map +1 -1
  232. package/dist/telemetry-attribution.d.ts +31 -0
  233. package/dist/telemetry-attribution.d.ts.map +1 -1
  234. package/dist/terraform/emit-source.d.ts.map +1 -1
  235. package/dist/terraform/hcl2json.d.ts +45 -0
  236. package/dist/terraform/hcl2json.d.ts.map +1 -0
  237. package/dist/terraform/parse.d.ts +4 -40
  238. package/dist/terraform/parse.d.ts.map +1 -1
  239. package/dist/testing.d.ts.map +1 -1
  240. package/dist/workspace/__fixtures__/contract-repo.d.ts.map +1 -1
  241. package/dist/workspace/__fixtures__/decide-workspace.d.ts +1 -1
  242. package/dist/workspace/__fixtures__/decide-workspace.d.ts.map +1 -1
  243. package/dist/workspace/agent-cli.d.ts +5 -0
  244. package/dist/workspace/agent-cli.d.ts.map +1 -1
  245. package/dist/workspace/box-cli.d.ts +12 -0
  246. package/dist/workspace/box-cli.d.ts.map +1 -0
  247. package/dist/workspace/box-factory.d.ts +97 -0
  248. package/dist/workspace/box-factory.d.ts.map +1 -0
  249. package/dist/workspace/box-listing.d.ts +85 -0
  250. package/dist/workspace/box-listing.d.ts.map +1 -0
  251. package/dist/workspace/box-publish.d.ts +147 -0
  252. package/dist/workspace/box-publish.d.ts.map +1 -0
  253. package/dist/workspace/broker-protocol.d.ts +190 -0
  254. package/dist/workspace/broker-protocol.d.ts.map +1 -0
  255. package/dist/workspace/changes.d.ts.map +1 -1
  256. package/dist/workspace/chant-migrations/chud-lexicon-exit.d.ts.map +1 -1
  257. package/dist/workspace/checks/boxes.d.ts.map +1 -1
  258. package/dist/workspace/checks.d.ts +5 -0
  259. package/dist/workspace/checks.d.ts.map +1 -1
  260. package/dist/workspace/compose-graph.d.ts +10 -0
  261. package/dist/workspace/compose-graph.d.ts.map +1 -1
  262. package/dist/workspace/composites.d.ts +2 -2
  263. package/dist/workspace/composites.d.ts.map +1 -1
  264. package/dist/workspace/conformance/__fixtures__/reference-broker.d.ts +17 -0
  265. package/dist/workspace/conformance/__fixtures__/reference-broker.d.ts.map +1 -0
  266. package/dist/workspace/conformance/broker.d.ts +202 -0
  267. package/dist/workspace/conformance/broker.d.ts.map +1 -0
  268. package/dist/workspace/conformance/index.d.ts +68 -6
  269. package/dist/workspace/conformance/index.d.ts.map +1 -1
  270. package/dist/workspace/conformance/vitest.d.ts +19 -3
  271. package/dist/workspace/conformance/vitest.d.ts.map +1 -1
  272. package/dist/workspace/conformance/writer.d.ts +462 -0
  273. package/dist/workspace/conformance/writer.d.ts.map +1 -0
  274. package/dist/workspace/decide.d.ts +126 -12
  275. package/dist/workspace/decide.d.ts.map +1 -1
  276. package/dist/workspace/decision-points.schema.json +11 -4
  277. package/dist/workspace/declaration.d.ts +156 -4
  278. package/dist/workspace/declaration.d.ts.map +1 -1
  279. package/dist/workspace/declaration.schema.json +383 -5
  280. package/dist/workspace/environments.d.ts +36 -10
  281. package/dist/workspace/environments.d.ts.map +1 -1
  282. package/dist/workspace/factory-rules.d.ts +180 -0
  283. package/dist/workspace/factory-rules.d.ts.map +1 -0
  284. package/dist/workspace/generated-files.d.ts.map +1 -1
  285. package/dist/workspace/graph-cache.d.ts.map +1 -1
  286. package/dist/workspace/graph-cli.d.ts +2 -0
  287. package/dist/workspace/graph-cli.d.ts.map +1 -1
  288. package/dist/workspace/identity.d.ts +111 -0
  289. package/dist/workspace/identity.d.ts.map +1 -0
  290. package/dist/workspace/init.d.ts +21 -0
  291. package/dist/workspace/init.d.ts.map +1 -1
  292. package/dist/workspace/intent-cli.d.ts +7 -4
  293. package/dist/workspace/intent-cli.d.ts.map +1 -1
  294. package/dist/workspace/intent-record.d.ts +36 -2
  295. package/dist/workspace/intent-record.d.ts.map +1 -1
  296. package/dist/workspace/intent.d.ts +249 -8
  297. package/dist/workspace/intent.d.ts.map +1 -1
  298. package/dist/workspace/json-edit.d.ts +24 -0
  299. package/dist/workspace/json-edit.d.ts.map +1 -0
  300. package/dist/workspace/jsonc.d.ts +11 -0
  301. package/dist/workspace/jsonc.d.ts.map +1 -1
  302. package/dist/workspace/kinds.d.ts +66 -4
  303. package/dist/workspace/kinds.d.ts.map +1 -1
  304. package/dist/workspace/lexicon-symbols.d.ts +29 -0
  305. package/dist/workspace/lexicon-symbols.d.ts.map +1 -0
  306. package/dist/workspace/lineage-hash-index.d.ts.map +1 -1
  307. package/dist/workspace/lineage-lock.d.ts +2 -2
  308. package/dist/workspace/lineage-lock.d.ts.map +1 -1
  309. package/dist/workspace/lineage-upgrade.d.ts +31 -2
  310. package/dist/workspace/lineage-upgrade.d.ts.map +1 -1
  311. package/dist/workspace/links.d.ts.map +1 -1
  312. package/dist/workspace/point-answer.schema.json +42 -2
  313. package/dist/workspace/points-cli.d.ts +10 -3
  314. package/dist/workspace/points-cli.d.ts.map +1 -1
  315. package/dist/workspace/points.d.ts +66 -5
  316. package/dist/workspace/points.d.ts.map +1 -1
  317. package/dist/workspace/principal-classes.d.ts +114 -0
  318. package/dist/workspace/principal-classes.d.ts.map +1 -0
  319. package/dist/workspace/reason-codes.d.ts +53 -4
  320. package/dist/workspace/reason-codes.d.ts.map +1 -1
  321. package/dist/workspace/record-assets.d.ts.map +1 -1
  322. package/dist/workspace/record-sessions.d.ts +5 -7
  323. package/dist/workspace/record-sessions.d.ts.map +1 -1
  324. package/dist/workspace/records-checkout.d.ts +54 -0
  325. package/dist/workspace/records-checkout.d.ts.map +1 -0
  326. package/dist/workspace/records-cli.d.ts +34 -1
  327. package/dist/workspace/records-cli.d.ts.map +1 -1
  328. package/dist/workspace/records-close.d.ts +7 -3
  329. package/dist/workspace/records-close.d.ts.map +1 -1
  330. package/dist/workspace/records-since.d.ts.map +1 -1
  331. package/dist/workspace/records-write.d.ts +68 -7
  332. package/dist/workspace/records-write.d.ts.map +1 -1
  333. package/dist/workspace/records.d.ts +43 -9
  334. package/dist/workspace/records.d.ts.map +1 -1
  335. package/dist/workspace/runs-cli.d.ts +296 -0
  336. package/dist/workspace/runs-cli.d.ts.map +1 -0
  337. package/dist/workspace/runs.d.ts +544 -0
  338. package/dist/workspace/runs.d.ts.map +1 -0
  339. package/dist/workspace/session-kinds.d.ts +1 -1
  340. package/dist/workspace/session-kinds.d.ts.map +1 -1
  341. package/dist/workspace/source-block.d.ts +1 -1
  342. package/dist/workspace/source-block.d.ts.map +1 -1
  343. package/dist/workspace/squash.d.ts +80 -0
  344. package/dist/workspace/squash.d.ts.map +1 -0
  345. package/dist/workspace/status-gates.d.ts +17 -3
  346. package/dist/workspace/status-gates.d.ts.map +1 -1
  347. package/dist/workspace/status.d.ts +64 -0
  348. package/dist/workspace/status.d.ts.map +1 -1
  349. package/dist/workspace/symbols.d.ts +63 -0
  350. package/dist/workspace/symbols.d.ts.map +1 -0
  351. package/dist/workspace/trailer-joins.d.ts +46 -0
  352. package/dist/workspace/trailer-joins.d.ts.map +1 -0
  353. package/dist/workspace/trailers.d.ts +89 -0
  354. package/dist/workspace/trailers.d.ts.map +1 -0
  355. package/dist/workspace/trust/attestor.d.ts.map +1 -1
  356. package/dist/workspace/trust/rotation.d.ts.map +1 -1
  357. package/dist/workspace/trust/run-commits.d.ts +46 -0
  358. package/dist/workspace/trust/run-commits.d.ts.map +1 -0
  359. package/dist/workspace/trust/run-statement.d.ts +128 -0
  360. package/dist/workspace/trust/run-statement.d.ts.map +1 -0
  361. package/dist/workspace/trust/seal.d.ts +38 -0
  362. package/dist/workspace/trust/seal.d.ts.map +1 -1
  363. package/dist/workspace/trust/test-repo.d.ts.map +1 -1
  364. package/dist/workspace/trust/verify-cli.d.ts +1 -1
  365. package/dist/workspace/trust/verify.d.ts +16 -2
  366. package/dist/workspace/trust/verify.d.ts.map +1 -1
  367. package/dist/workspace/wip-cli.d.ts +21 -0
  368. package/dist/workspace/wip-cli.d.ts.map +1 -0
  369. package/dist/workspace/wip.d.ts +268 -0
  370. package/dist/workspace/wip.d.ts.map +1 -0
  371. package/dist/workspace/work-cli.d.ts +39 -3
  372. package/dist/workspace/work-cli.d.ts.map +1 -1
  373. package/dist/workspace/work-evidence.d.ts +1 -1
  374. package/dist/workspace/work-evidence.d.ts.map +1 -1
  375. package/dist/workspace/work-size.d.ts +55 -0
  376. package/dist/workspace/work-size.d.ts.map +1 -0
  377. package/dist/workspace/work.d.ts +26 -1
  378. package/dist/workspace/work.d.ts.map +1 -1
  379. package/dist/workspace/workspace-kinds.schema.json +122 -0
  380. package/dist/workspace/workspace-principals.schema.json +60 -0
  381. package/dist/workspace/write-lock-cli.d.ts +60 -0
  382. package/dist/workspace/write-lock-cli.d.ts.map +1 -0
  383. package/dist/workspace/write-lock.d.ts +152 -0
  384. package/dist/workspace/write-lock.d.ts.map +1 -0
  385. package/dist/workspace/write-scope.d.ts +83 -19
  386. package/dist/workspace/write-scope.d.ts.map +1 -1
  387. package/dist/yaml.d.ts +21 -39
  388. package/dist/yaml.d.ts.map +1 -1
  389. package/package.json +7 -2
  390. package/src/__fixtures__/change-set/lifecycle-plan.floci.json +59 -0
  391. package/src/__fixtures__/change-set/lifecycle-v1.ts.txt +4 -0
  392. package/src/__fixtures__/change-set/lifecycle-v2.ts.txt +4 -0
  393. package/src/__fixtures__/change-set/lifecycle.change-set.golden.json +95 -0
  394. package/src/__fixtures__/change-set/warden.change-set.golden.json +106 -0
  395. package/src/__fixtures__/change-set/warden.plan.json +44 -0
  396. package/src/__fixtures__/plan-summary/normalization-vectors.json +1593 -0
  397. package/src/__fixtures__/pr-loop/pr-apply-applied.note.golden.md +31 -0
  398. package/src/__fixtures__/pr-loop/pr-apply-refused.note.golden.md +31 -0
  399. package/src/__fixtures__/pr-loop/pr-plan.golden.json +127 -0
  400. package/src/__fixtures__/pr-loop/pr-plan.note.golden.md +37 -0
  401. package/src/audit/core.test.ts +15 -0
  402. package/src/audit/core.ts +8 -2
  403. package/src/audit/discover.test.ts +11 -0
  404. package/src/audit/discover.ts +7 -2
  405. package/src/audit/prior-art.ts +15 -0
  406. package/src/change-set-bundle.test.ts +57 -0
  407. package/src/change-set.test.ts +215 -0
  408. package/src/change-set.ts +445 -0
  409. package/src/cli/commands/__fixtures__/init-lexicon-output/package.json +1 -1
  410. package/src/cli/commands/audit-opt-in.test.ts +54 -0
  411. package/src/cli/commands/audit.ts +29 -2
  412. package/src/cli/commands/build.test.ts +19 -0
  413. package/src/cli/commands/build.ts +3 -2
  414. package/src/cli/commands/carve-emit-state.test.ts +4 -0
  415. package/src/cli/commands/carve-emit.ts +5 -19
  416. package/src/cli/commands/check-lexicon.test.ts +62 -1
  417. package/src/cli/commands/check-lexicon.ts +36 -6
  418. package/src/cli/commands/import-live.test.ts +18 -0
  419. package/src/cli/commands/import-parser-options.test.ts +133 -0
  420. package/src/cli/commands/import.ts +21 -3
  421. package/src/cli/commands/init-lexicon/templates/project.ts +1 -1
  422. package/src/cli/commands/init.test.ts +8 -1
  423. package/src/cli/commands/init.ts +23 -8
  424. package/src/cli/commands/lint.test.ts +37 -0
  425. package/src/cli/commands/onboard.test.ts +53 -3
  426. package/src/cli/commands/onboard.ts +52 -4
  427. package/src/cli/commands/pinned-upgrade.ts +73 -33
  428. package/src/cli/handlers/__snapshots__/build-member.test.ts.snap +2 -2
  429. package/src/cli/handlers/build.ts +13 -1
  430. package/src/cli/handlers/change-set.test.ts +56 -0
  431. package/src/cli/handlers/change-set.ts +44 -0
  432. package/src/cli/handlers/components.ts +2 -2
  433. package/src/cli/handlers/dev.ts +8 -6
  434. package/src/cli/handlers/fan-out.test.ts +221 -2
  435. package/src/cli/handlers/fan-out.ts +165 -75
  436. package/src/cli/handlers/graph.ts +3 -0
  437. package/src/cli/handlers/lifecycle.test.ts +67 -0
  438. package/src/cli/handlers/lifecycle.ts +6 -5
  439. package/src/cli/handlers/misc.ts +2 -0
  440. package/src/cli/handlers/operator.test.ts +21 -0
  441. package/src/cli/handlers/operator.ts +121 -6
  442. package/src/cli/handlers/pr.ts +373 -0
  443. package/src/cli/handlers/run.test.ts +111 -0
  444. package/src/cli/handlers/run.ts +86 -24
  445. package/src/cli/handlers/scenario.ts +2 -2
  446. package/src/cli/main.test.ts +21 -0
  447. package/src/cli/main.ts +246 -30
  448. package/src/cli/mcp/never-over-mcp.test.ts +101 -0
  449. package/src/cli/mcp/op-tools.ts +24 -2
  450. package/src/cli/mcp/workspace-tools.test.ts +5 -2
  451. package/src/cli/mcp/workspace-tools.ts +62 -7
  452. package/src/cli/registry.ts +74 -3
  453. package/src/codegen/pinned-upgrade-multi.test.ts +157 -0
  454. package/src/codegen/pinned-upgrade-tags.test.ts +112 -0
  455. package/src/codegen/pinned-upgrade.test.ts +104 -0
  456. package/src/codegen/pinned-upgrade.ts +250 -56
  457. package/src/codegen/testdata/postgres-tags.json +242 -0
  458. package/src/components/auto-release.ts +1 -1
  459. package/src/components/capability.ts +55 -0
  460. package/src/components/changed-files.ts +66 -0
  461. package/src/components/cli-support.ts +28 -5
  462. package/src/components/component.schema.json +17 -0
  463. package/src/components/component.ts +25 -0
  464. package/src/components/deploy-units.ts +3 -0
  465. package/src/components/driver.test.ts +52 -0
  466. package/src/components/driver.ts +31 -13
  467. package/src/components/fan-out-output.ts +42 -1
  468. package/src/components/fan-out-record.ts +69 -0
  469. package/src/components/fan-out-run.test.ts +17 -0
  470. package/src/components/fan-out-run.ts +304 -1
  471. package/src/components/fan-out-support.ts +3 -0
  472. package/src/components/fan-out-waves.test.ts +375 -0
  473. package/src/components/fan-out.ts +18 -17
  474. package/src/components/gated-wave-pipeline.ts +82 -0
  475. package/src/components/index.ts +1 -0
  476. package/src/components/layers.ts +30 -0
  477. package/src/components/pr-pipeline.ts +91 -0
  478. package/src/components/pr-run.test.ts +205 -0
  479. package/src/components/pr-run.ts +280 -0
  480. package/src/components/promote.ts +5 -0
  481. package/src/components/verbs/shell.test.ts +11 -0
  482. package/src/components/verbs/shell.ts +7 -3
  483. package/src/components/wave-plan.ts +124 -0
  484. package/src/config.test.ts +21 -0
  485. package/src/config.ts +15 -0
  486. package/src/declarable.test.ts +21 -0
  487. package/src/declarable.ts +19 -0
  488. package/src/discovery/fold-composite.test.ts +41 -5
  489. package/src/discovery/fold-import.test.ts +129 -0
  490. package/src/discovery/fold-import.ts +643 -131
  491. package/src/discovery/fold-package-composite.test.ts +264 -0
  492. package/src/discovery/fold-specifiers.test.ts +191 -0
  493. package/src/discovery/param-deps.test.ts +66 -1
  494. package/src/discovery/param-deps.ts +45 -0
  495. package/src/discovery/sandbox/bundle.ts +1 -1
  496. package/src/discovery/specifier-resolve.ts +344 -0
  497. package/src/fold/fold.test.ts +39 -1
  498. package/src/fold/fold.ts +83 -9
  499. package/src/fold-provenance.test.ts +140 -0
  500. package/src/gated-waves-bundle.test.ts +62 -0
  501. package/src/gated-waves.test.ts +118 -0
  502. package/src/gated-waves.ts +240 -0
  503. package/src/graph-ir.test.ts +83 -0
  504. package/src/graph-ir.ts +29 -0
  505. package/src/import/embedded.test.ts +20 -0
  506. package/src/import/embedded.ts +13 -0
  507. package/src/import/parser-options.ts +46 -0
  508. package/src/import/parser.ts +20 -0
  509. package/src/index.ts +1 -0
  510. package/src/lexicon.ts +106 -3
  511. package/src/lifecycle/gate-ledger.ts +23 -0
  512. package/src/lifecycle/git.ts +102 -16
  513. package/src/lifecycle/observe.test.ts +18 -0
  514. package/src/lifecycle/observe.ts +6 -4
  515. package/src/lifecycle/snapshot.ts +2 -2
  516. package/src/lifecycle/work-lease.test.ts +1 -1
  517. package/src/lifecycle/work-lease.ts +93 -2
  518. package/src/lint/engine.test.ts +55 -0
  519. package/src/lint/engine.ts +30 -4
  520. package/src/lint/output-docs.test.ts +59 -56
  521. package/src/lint/post-synth.test.ts +19 -0
  522. package/src/lint/post-synth.ts +19 -1
  523. package/src/meta/declared-imports.test.ts +1 -1
  524. package/src/op/activities/activity-contracts.ts +84 -0
  525. package/src/op/activities/apply.test.ts +189 -5
  526. package/src/op/activities/apply.ts +230 -8
  527. package/src/op/activities/change-set.ts +114 -0
  528. package/src/op/activities/decide.ts +3 -0
  529. package/src/op/activities/factory.ts +675 -0
  530. package/src/op/activities/index.ts +9 -0
  531. package/src/op/activities/lexicon-upgrade.test.ts +160 -6
  532. package/src/op/activities/lexicon-upgrade.ts +154 -51
  533. package/src/op/activity-contract.test.ts +21 -1
  534. package/src/op/activity-contract.ts +19 -9
  535. package/src/op/builders.ts +23 -0
  536. package/src/op/composites/apply-op.ts +12 -5
  537. package/src/op/composites/composites.test.ts +30 -3
  538. package/src/op/composites/lexicon-upgrade-op.test.ts +7 -2
  539. package/src/op/composites/lexicon-upgrade-op.ts +29 -8
  540. package/src/op/decide-backend.ts +5 -1
  541. package/src/op/decide-read-inputs.ts +33 -5
  542. package/src/op/emulator-lifecycle.test.ts +23 -0
  543. package/src/op/emulator-lifecycle.ts +52 -14
  544. package/src/op/factory.e2e.test.ts +232 -0
  545. package/src/op/factory.ts +118 -0
  546. package/src/op/gate-approval.test.ts +74 -0
  547. package/src/op/gate-approval.ts +5 -1
  548. package/src/op/gate.ts +31 -5
  549. package/src/op/index.ts +11 -1
  550. package/src/op/local-executor.test.ts +15 -0
  551. package/src/op/local-executor.ts +40 -12
  552. package/src/op/local-output.ts +1 -1
  553. package/src/op/op-ir.test.ts +9 -0
  554. package/src/op/op-ir.ts +4 -0
  555. package/src/op/op-verb-class.ts +3 -0
  556. package/src/op/operator.ts +4 -0
  557. package/src/op/run-context.test.ts +141 -0
  558. package/src/op/run-context.ts +51 -0
  559. package/src/op/runtimes/local.test.ts +14 -0
  560. package/src/op/runtimes/local.ts +2 -0
  561. package/src/op/steward-beside.ts +2 -0
  562. package/src/op/types.ts +16 -3
  563. package/src/op/work-lease-run.test.ts +47 -0
  564. package/src/op/work-lease-run.ts +76 -11
  565. package/src/plan-summary.test.ts +263 -0
  566. package/src/plan-summary.ts +845 -0
  567. package/src/pr-forge.test.ts +237 -0
  568. package/src/pr-forge.ts +332 -0
  569. package/src/pr-loop-bundle.test.ts +46 -0
  570. package/src/pr-loop.test.ts +171 -0
  571. package/src/pr-loop.ts +324 -0
  572. package/src/provenance.ts +35 -0
  573. package/src/telemetry-attribution.test.ts +23 -1
  574. package/src/telemetry-attribution.ts +51 -0
  575. package/src/terraform/hcl2json.test.ts +21 -0
  576. package/src/terraform/hcl2json.ts +81 -0
  577. package/src/terraform/parse.ts +11 -74
  578. package/src/workspace/agent-cli.ts +7 -3
  579. package/src/workspace/agent.schema.json +22 -0
  580. package/src/workspace/app-kind.test.ts +196 -0
  581. package/src/workspace/box-cli.ts +113 -0
  582. package/src/workspace/box-factory.test.ts +323 -0
  583. package/src/workspace/box-factory.ts +136 -0
  584. package/src/workspace/box-listing-write.schema.json +204 -0
  585. package/src/workspace/box-listing.test.ts +234 -0
  586. package/src/workspace/box-listing.ts +324 -0
  587. package/src/workspace/box-publish.schema.json +498 -0
  588. package/src/workspace/box-publish.test.ts +204 -0
  589. package/src/workspace/box-publish.ts +420 -0
  590. package/src/workspace/box-ship.test.ts +96 -0
  591. package/src/workspace/broker-protocol.schema.json +186 -0
  592. package/src/workspace/broker-protocol.test.ts +122 -0
  593. package/src/workspace/broker-protocol.ts +317 -0
  594. package/src/workspace/builder-tiers.test.ts +146 -0
  595. package/src/workspace/change-set.schema.json +460 -0
  596. package/src/workspace/changes.schema.json +12 -20
  597. package/src/workspace/changes.ts +4 -1
  598. package/src/workspace/chant-migrations.e2e.test.ts +17 -5
  599. package/src/workspace/checks/boxes.test.ts +5 -0
  600. package/src/workspace/checks.ts +39 -8
  601. package/src/workspace/component-environments.test.ts +105 -0
  602. package/src/workspace/compose-graph.ts +7 -0
  603. package/src/workspace/composites.schema.json +23 -4
  604. package/src/workspace/composites.test.ts +8 -8
  605. package/src/workspace/composites.ts +13 -2
  606. package/src/workspace/conformance/__fixture__/decisions/decision.schema.json +2 -2
  607. package/src/workspace/conformance/__fixtures__/reference-broker.ts +207 -0
  608. package/src/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
  609. package/src/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
  610. package/src/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
  611. package/src/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
  612. package/src/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
  613. package/src/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
  614. package/src/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
  615. package/src/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
  616. package/src/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
  617. package/src/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
  618. package/src/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
  619. package/src/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
  620. package/src/workspace/conformance/broker.test.ts +122 -0
  621. package/src/workspace/conformance/broker.ts +792 -0
  622. package/src/workspace/conformance/conformance.e2e.test.ts +36 -3
  623. package/src/workspace/conformance/index.mjs +51 -3
  624. package/src/workspace/conformance/index.ts +107 -15
  625. package/src/workspace/conformance/vitest.ts +76 -2
  626. package/src/workspace/conformance/writer-conformance.e2e.test.ts +177 -0
  627. package/src/workspace/conformance/writer.test.ts +186 -0
  628. package/src/workspace/conformance/writer.ts +1191 -0
  629. package/src/workspace/decide.test.ts +208 -4
  630. package/src/workspace/decide.ts +433 -73
  631. package/src/workspace/decision-points.schema.json +11 -4
  632. package/src/workspace/declaration.schema.json +383 -5
  633. package/src/workspace/declaration.ts +315 -10
  634. package/src/workspace/environments.ts +66 -14
  635. package/src/workspace/factory-rules.test.ts +62 -0
  636. package/src/workspace/factory-rules.ts +218 -0
  637. package/src/workspace/graph-cli.ts +6 -3
  638. package/src/workspace/graph.schema.json +314 -0
  639. package/src/workspace/identity.test.ts +219 -0
  640. package/src/workspace/identity.ts +186 -0
  641. package/src/workspace/init.ts +82 -2
  642. package/src/workspace/intent-cli.ts +84 -13
  643. package/src/workspace/intent-patch-id.test.ts +162 -0
  644. package/src/workspace/intent-record.schema.json +336 -1
  645. package/src/workspace/intent-record.ts +96 -16
  646. package/src/workspace/intent-reviews.test.ts +76 -0
  647. package/src/workspace/intent-squash.test.ts +213 -0
  648. package/src/workspace/intent-why.test.ts +274 -0
  649. package/src/workspace/intent.schema.json +950 -9
  650. package/src/workspace/intent.test.ts +11 -2
  651. package/src/workspace/intent.ts +722 -65
  652. package/src/workspace/json-edit.test.ts +121 -0
  653. package/src/workspace/json-edit.ts +142 -0
  654. package/src/workspace/jsonc.ts +20 -0
  655. package/src/workspace/kinds.ts +201 -39
  656. package/src/workspace/lexicon-symbols.test.ts +148 -0
  657. package/src/workspace/lexicon-symbols.ts +125 -0
  658. package/src/workspace/lineage-upgrade.test.ts +63 -0
  659. package/src/workspace/lineage-upgrade.ts +146 -5
  660. package/src/workspace/plan-summary.schema.json +155 -0
  661. package/src/workspace/point-answer.schema.json +42 -2
  662. package/src/workspace/points-cli.ts +42 -16
  663. package/src/workspace/points-write.schema.json +163 -4
  664. package/src/workspace/points.schema.json +157 -2
  665. package/src/workspace/points.test.ts +13 -1
  666. package/src/workspace/points.ts +118 -12
  667. package/src/workspace/pr-report.schema.json +95 -0
  668. package/src/workspace/principal-classes.test.ts +175 -0
  669. package/src/workspace/principal-classes.ts +307 -0
  670. package/src/workspace/profiles.test.ts +159 -0
  671. package/src/workspace/read-contract.test.ts +2 -2
  672. package/src/workspace/reason-codes.test.ts +23 -3
  673. package/src/workspace/reason-codes.ts +61 -4
  674. package/src/workspace/record-sessions.ts +9 -8
  675. package/src/workspace/records-amend.schema.json +80 -0
  676. package/src/workspace/records-checkout.ts +106 -0
  677. package/src/workspace/records-cli.ts +123 -17
  678. package/src/workspace/records-close.schema.json +79 -0
  679. package/src/workspace/records-close.ts +31 -7
  680. package/src/workspace/records-concurrent.e2e.test.ts +135 -0
  681. package/src/workspace/records-concurrent.test.ts +145 -0
  682. package/src/workspace/records-formats.test.ts +46 -10
  683. package/src/workspace/records-new.schema.json +9 -0
  684. package/src/workspace/records-review.schema.json +80 -0
  685. package/src/workspace/records-sessions-write.test.ts +69 -0
  686. package/src/workspace/records-sessions.test.ts +22 -0
  687. package/src/workspace/records-uncommitted.test.ts +171 -0
  688. package/src/workspace/records-write.ts +219 -30
  689. package/src/workspace/records.schema.json +88 -1
  690. package/src/workspace/records.ts +76 -8
  691. package/src/workspace/reference-kinds/app/package.json +10 -0
  692. package/src/workspace/reference-kinds/app/workspace-kinds.json +45 -0
  693. package/src/workspace/run-statement.schema.json +622 -0
  694. package/src/workspace/runs-cli.ts +710 -0
  695. package/src/workspace/runs-statement.test.ts +239 -0
  696. package/src/workspace/runs-write.schema.json +994 -0
  697. package/src/workspace/runs.schema.json +1257 -0
  698. package/src/workspace/runs.test.ts +281 -0
  699. package/src/workspace/runs.ts +970 -0
  700. package/src/workspace/session-kinds.ts +3 -3
  701. package/src/workspace/squash.ts +198 -0
  702. package/src/workspace/status-contract.test.ts +10 -2
  703. package/src/workspace/status-gates.ts +25 -9
  704. package/src/workspace/status.schema.json +252 -4
  705. package/src/workspace/status.ts +110 -1
  706. package/src/workspace/symbols.ts +191 -0
  707. package/src/workspace/trailer-joins.test.ts +171 -0
  708. package/src/workspace/trailer-joins.ts +82 -0
  709. package/src/workspace/trailers.ts +148 -0
  710. package/src/workspace/trust/run-commits.ts +115 -0
  711. package/src/workspace/trust/run-statement.ts +226 -0
  712. package/src/workspace/trust/seal.ts +58 -1
  713. package/src/workspace/trust/verify-cli.ts +6 -5
  714. package/src/workspace/trust/verify.ts +39 -6
  715. package/src/workspace/wip-cli.ts +97 -0
  716. package/src/workspace/wip-write.schema.json +504 -0
  717. package/src/workspace/wip.schema.json +334 -0
  718. package/src/workspace/wip.test.ts +294 -0
  719. package/src/workspace/wip.ts +753 -0
  720. package/src/workspace/work-cli.e2e.test.ts +28 -1
  721. package/src/workspace/work-cli.ts +136 -8
  722. package/src/workspace/work-evidence.schema.json +5 -0
  723. package/src/workspace/work-history.schema.json +73 -1
  724. package/src/workspace/work-history.test.ts +48 -5
  725. package/src/workspace/work-kind-fields.test.ts +154 -0
  726. package/src/workspace/work-lease.schema.json +14 -1
  727. package/src/workspace/work-size.test.ts +77 -0
  728. package/src/workspace/work-size.ts +93 -0
  729. package/src/workspace/work.ts +82 -0
  730. package/src/workspace/workspace-kinds.schema.json +122 -0
  731. package/src/workspace/workspace-principals.schema.json +60 -0
  732. package/src/workspace/write-lock-cli.ts +131 -0
  733. package/src/workspace/write-lock.schema.json +172 -0
  734. package/src/workspace/write-lock.test.ts +189 -0
  735. package/src/workspace/write-lock.ts +474 -0
  736. package/src/workspace/write-scope.test.ts +144 -3
  737. package/src/workspace/write-scope.ts +192 -45
  738. package/src/yaml.test.ts +111 -1
  739. package/src/yaml.ts +141 -549
@@ -29,6 +29,7 @@ import { stepTimeoutProblem } from "./activity-profiles";
29
29
  import { describeGateMismatch, evaluateGate, gitGateLedgerPort, type GateCheck, type GateLedgerPort } from "./gate";
30
30
  import { gateName } from "./gate-name";
31
31
  import type { ResolvedGateApproval } from "./gate-approval";
32
+ import { withOpRunContext, type OpRunContext, type PassedGate } from "./run-context";
32
33
  import type { PendingGateRecord } from "../lifecycle/gate-ledger";
33
34
  import { isPointWait, type WaitingPoint } from "./steward-points";
34
35
  import { isGateWait } from "./gate-wait";
@@ -416,9 +417,11 @@ async function runStep(
416
417
  if (step.id) resultsById.set(step.id, result);
417
418
  const record: StepRecord = { ...base, status: "ok", durationMs: Date.now() - start };
418
419
  const attrs = outcomeAttributesOf(step);
419
- if (attrs.length > 0) {
420
- record.outcomes = attrs.map((a) => ({ name: a.name, value: resolvePath(result, a.from) }));
421
- record.outcome = record.outcomes[0];
420
+ // An attribute whose path the result does not hold is left off, rather than recorded as undefined.
421
+ const outcomes = attrs.map((a) => ({ name: a.name, value: resolvePath(result, a.from) })).filter((o) => o.value !== undefined);
422
+ if (outcomes.length > 0) {
423
+ record.outcomes = outcomes;
424
+ record.outcome = outcomes[0];
422
425
  }
423
426
  return { record, result };
424
427
  } catch (err) {
@@ -482,6 +485,8 @@ interface GateContext {
482
485
  runId?: string;
483
486
  /** Called once per settled step, in production order (#2121) — what `--progress-json` streams from. */
484
487
  onRecord?: (record: StepRecord) => void;
488
+ /** The run context's list of passed gates (#2522). A gate that passes is appended here. */
489
+ passed?: PassedGate[];
485
490
  /** The run's hold on its work item's lease (#2748). Absent in compensation phases, which run whatever the lease did. */
486
491
  work?: RunWorkLease;
487
492
  }
@@ -643,6 +648,17 @@ async function runGateStep(
643
648
 
644
649
  if (check.satisfied) {
645
650
  const { resolution } = check;
651
+ const passedApproval: NonNullable<StepRecord["approval"]> = {
652
+ gate: gateName(step),
653
+ resolvedBy: resolution.resolvedBy,
654
+ timestamp: resolution.timestamp,
655
+ ...(resolution.url ? { url: resolution.url } : {}),
656
+ ...(check.via ? { via: check.via } : {}),
657
+ ...(check.approvals ? { approvers: check.approvals.map((r) => r.resolvedBy) } : {}),
658
+ };
659
+ // #2522: a later step reads this gate's approval from the run context
660
+ // rather than re-tallying the ledger, so it sees the decision this run made.
661
+ gates.passed?.push({ gate: gateName(step), approval: passedApproval });
646
662
  return {
647
663
  record: {
648
664
  phase: phaseName,
@@ -650,14 +666,7 @@ async function runGateStep(
650
666
  args: {},
651
667
  status: "ok",
652
668
  durationMs: Date.now() - start,
653
- approval: {
654
- gate: gateName(step),
655
- resolvedBy: resolution.resolvedBy,
656
- timestamp: resolution.timestamp,
657
- ...(resolution.url ? { url: resolution.url } : {}),
658
- ...(check.via ? { via: check.via } : {}),
659
- ...(check.approvals ? { approvers: check.approvals.map((r) => r.resolvedBy) } : {}),
660
- },
669
+ approval: passedApproval,
661
670
  },
662
671
  };
663
672
  }
@@ -971,6 +980,12 @@ export interface RunOpOptions {
971
980
  now?: string;
972
981
  /** Identifies this run on any pending fact it records. */
973
982
  runId?: string;
983
+ /**
984
+ * The environment the run was started for (`--env`, #2522). The executor
985
+ * only hands it to activities through the run context (`./run-context.ts`).
986
+ * The run ledger path still comes from the Op's `labels.Env`.
987
+ */
988
+ env?: string;
974
989
  /**
975
990
  * Called once per settled step, in the order the records are produced
976
991
  * (#2121) — what the local op runtime (./runtimes/local.ts) feeds
@@ -1039,6 +1054,13 @@ export async function runOpLocally(
1039
1054
  const turn = currentStewardTurn();
1040
1055
  const steward = options.steward ?? turn?.steward;
1041
1056
  const restore = turn && turn.run !== runId ? enterStewardTurn({ ...turn, run: runId }) : undefined;
1057
+ // #2522: every activity in this run can read the run it is in.
1058
+ const run: OpRunContext = {
1059
+ op: config.name,
1060
+ runId,
1061
+ ...(options.env !== undefined ? { env: options.env } : {}),
1062
+ passedGates: [],
1063
+ };
1042
1064
  // A run that writes to the ledger also says what it is doing while it runs
1043
1065
  // (./run-live.ts), and removes that once its record is written.
1044
1066
  const live = options.ledger
@@ -1052,7 +1074,11 @@ export async function runOpLocally(
1052
1074
  })
1053
1075
  : undefined;
1054
1076
  try {
1055
- return await withLiveRun(live, () => runOpInTurn(config, activities, profiles, signal, { ...options, runId, ...(steward ? { steward } : {}) }));
1077
+ return await withLiveRun(live, () =>
1078
+ withOpRunContext(run, () =>
1079
+ runOpInTurn(config, activities, profiles, signal, { ...options, runId, ...(steward ? { steward } : {}) }, run),
1080
+ ),
1081
+ );
1056
1082
  } finally {
1057
1083
  live?.close();
1058
1084
  restore?.();
@@ -1065,6 +1091,7 @@ async function runOpInTurn(
1065
1091
  profiles: Record<string, ActivityProfile>,
1066
1092
  signal: AbortSignal | undefined,
1067
1093
  options: RunOpOptions & { runId: string },
1094
+ run: OpRunContext,
1068
1095
  ): Promise<OpRunResult> {
1069
1096
  const runId = options.runId;
1070
1097
 
@@ -1074,6 +1101,7 @@ async function runOpInTurn(
1074
1101
  ...(options.now ? { now: options.now } : {}),
1075
1102
  runId,
1076
1103
  ...(options.onRecord ? { onRecord: options.onRecord } : {}),
1104
+ passed: run.passedGates,
1077
1105
  };
1078
1106
 
1079
1107
  // Effect steps are ordered (read-compare-run-write): refuse them in a
@@ -66,7 +66,7 @@ export function renderHuman(result: OpRunResult, write: Writer = stderr): void {
66
66
  : work.released
67
67
  ? `released ${work.outcome}`
68
68
  : "not released; it runs out on its own";
69
- write(`[work] ${work.item} held by ${work.holder}${work.branch ? ` on ${work.branch}` : ""}: ${end}`);
69
+ write(`[work] ${work.item} held by ${work.holder}${work.branch ? ` on ${work.branch}` : ""}: ${end}${work.kept ? `; the attempt is kept at ${work.kept}` : ""}`);
70
70
  } else if (work?.refusal) {
71
71
  write(`[work] nothing claimed: ${work.refusal}`);
72
72
  }
@@ -325,3 +325,12 @@ describe("op.json IR", () => {
325
325
  expect("path" in (deployStep.args.context as object)).toBe(false);
326
326
  });
327
327
  });
328
+
329
+ describe("neverOverMcp (chant#3447)", () => {
330
+ it("survives the IR round trip, and is absent when not declared", () => {
331
+ const base = { name: "tf-apply", overview: "apply", phases: [] };
332
+ expect(buildOpIR({ ...base, neverOverMcp: true }).neverOverMcp).toBe(true);
333
+ expect(buildOpIR(base)).not.toHaveProperty("neverOverMcp");
334
+ expect(opConfigFromIR(buildOpIR({ ...base, neverOverMcp: true })).neverOverMcp).toBe(true);
335
+ });
336
+ });
package/src/op/op-ir.ts CHANGED
@@ -199,6 +199,8 @@ export interface OpIR {
199
199
  workLease?: OpWorkLease;
200
200
  /** `OpConfig.changesCheckout` (#2748), present only when true. */
201
201
  changesCheckout?: true;
202
+ /** `OpConfig.neverOverMcp`, present only when true. */
203
+ neverOverMcp?: true;
202
204
  phases: OpIRPhase[];
203
205
  onFailure: OpIRPhase[];
204
206
  /** Every activity profile referenced by a step in this Op, keyed by profile name — from the registry passed to {@link buildOpIR}, empty when none was. */
@@ -365,6 +367,7 @@ export function buildOpIR(
365
367
  ...(config.schedule ? { schedule: config.schedule } : {}),
366
368
  ...(config.workLease ? { workLease: config.workLease } : {}),
367
369
  ...(config.changesCheckout ? { changesCheckout: true as const } : {}),
370
+ ...(config.neverOverMcp ? { neverOverMcp: true as const } : {}),
368
371
  phases: config.phases.map((p) => irPhase(p, contractRegistry)),
369
372
  onFailure: (config.onFailure ?? []).map((p) => irPhase(p, contractRegistry)),
370
373
  activityProfiles: sortedEntries(profiles),
@@ -446,5 +449,6 @@ export function opConfigFromIR(ir: OpIR): OpConfig {
446
449
  ...(ir.schedule ? { schedule: ir.schedule } : {}),
447
450
  ...(ir.workLease ? { workLease: ir.workLease } : {}),
448
451
  ...(ir.changesCheckout ? { changesCheckout: true } : {}),
452
+ ...(ir.neverOverMcp ? { neverOverMcp: true } : {}),
449
453
  };
450
454
  }
@@ -35,6 +35,9 @@ export type OpVerbClass = "read-only" | "mutating" | "destructive";
35
35
  const READ_ONLY_ACTIVITY_FNS: ReadonlySet<string> = new Set([
36
36
  "lifecycleSnapshot",
37
37
  "lifecycleDiff",
38
+ "composeChangeSet",
39
+ "lifecyclePlanChangeSet",
40
+ "readChangeSetPart",
38
41
  "httpCheck",
39
42
  "policyGate",
40
43
  "workflowSupplyChainAudit",
@@ -577,6 +577,10 @@ export async function runOperatorRound(opts: OperatorRoundOptions): Promise<Oper
577
577
  try {
578
578
  const result = await runOpLocally(config, opts.activities, opts.profiles, opts.signal, {
579
579
  runId,
580
+ // #2522: the environment the operator was started for (`--env`, or a
581
+ // steward's environment) reaches the activities through the run
582
+ // context, as `chant run --env` does.
583
+ ...(opts.env ?? opts.stewardEnv ? { env: opts.env ?? opts.stewardEnv } : {}),
580
584
  ...(steward ? { steward: steward.name } : {}),
581
585
  ledger: { cwd: opts.cwd },
582
586
  // A steward's turn claims work leases as `<steward>/<op>@<holder>`
@@ -0,0 +1,141 @@
1
+ /**
2
+ * The run context an activity reads (#2522): the Op, the run id the run
3
+ * ledger records, `--env`, and the gates the run has passed.
4
+ */
5
+ import { describe, test, expect } from "vitest";
6
+ import type { OpConfig } from "./types";
7
+ import type { ActivityFn, ActivityProfile } from "./activity-registry";
8
+ import { runOpLocally } from "./local-executor";
9
+ import { memoryGateLedgerPort } from "./gate";
10
+ import { currentOpRun, type OpRunContext } from "./run-context";
11
+ import { gatePolicyVersion, type GatePolicyRef, type ResolvedGateApproval } from "./gate-approval";
12
+ import type { GateResolutionRecord } from "../lifecycle/gate-ledger";
13
+
14
+ const PROFILES: Record<string, ActivityProfile> = {
15
+ fastIdempotent: { timeout: "5m", retry: { maximumAttempts: 1 } },
16
+ };
17
+ const NOW = "2026-09-05T12:00:00.000Z";
18
+
19
+ function op(steps: OpConfig["phases"][number]["steps"]): OpConfig {
20
+ return { name: "release", overview: "", phases: [{ name: "main", steps }] };
21
+ }
22
+
23
+ describe("the Op run context (#2522)", () => {
24
+ test("an activity reads the Op, the run id and --env", async () => {
25
+ let seen: OpRunContext | undefined;
26
+ const activities = new Map<string, ActivityFn>([
27
+ ["deploy", async () => { await Promise.resolve(); seen = currentOpRun(); }],
28
+ ]);
29
+ const result = await runOpLocally(op([{ kind: "activity", fn: "deploy" }]), activities, PROFILES, undefined, {
30
+ runId: "local-123",
31
+ env: "staging",
32
+ });
33
+ expect(seen).toEqual({ op: "release", runId: "local-123", env: "staging", passedGates: [] });
34
+ expect(result.record?.id).toBe("local-123");
35
+ });
36
+
37
+ test("without --env the context carries none, and outside a run there is no context", async () => {
38
+ let seen: OpRunContext | undefined;
39
+ const activities = new Map<string, ActivityFn>([["deploy", async () => { seen = currentOpRun(); }]]);
40
+ await runOpLocally(op([{ kind: "activity", fn: "deploy" }]), activities, PROFILES, undefined, { runId: "r1" });
41
+ expect(seen).toEqual({ op: "release", runId: "r1", passedGates: [] });
42
+ expect(currentOpRun()).toBeUndefined();
43
+ });
44
+
45
+ test("a step after a passed gate reads the gate's approval", async () => {
46
+ const seen: OpRunContext[] = [];
47
+ const activities = new Map<string, ActivityFn>([
48
+ ["plan", async () => { seen.push(currentOpRun()!); }],
49
+ ["apply", async () => { seen.push(currentOpRun()!); }],
50
+ ]);
51
+ const port = memoryGateLedgerPort({
52
+ pending: [{
53
+ version: 1, kind: "pending", op: "release", gate: "ship",
54
+ timestamp: "2026-09-05T10:00:00.000Z", expiresAt: "2026-09-07T10:00:00.000Z",
55
+ }],
56
+ resolutions: [{ version: 1, op: "release", gate: "ship", resolvedBy: "alex", timestamp: "2026-09-05T11:00:00.000Z" }],
57
+ });
58
+ const result = await runOpLocally(
59
+ op([
60
+ { kind: "activity", fn: "plan" },
61
+ { kind: "gate", gate: "ship" },
62
+ { kind: "activity", fn: "apply" },
63
+ ]),
64
+ activities,
65
+ PROFILES,
66
+ undefined,
67
+ { gates: port, now: NOW, runId: "r2" },
68
+ );
69
+ expect(result.status).toBe("ok");
70
+ expect(seen[0]!.passedGates).toEqual([]);
71
+ expect(seen[1]!.passedGates).toEqual([
72
+ { gate: "ship", approval: { gate: "ship", resolvedBy: "alex", timestamp: "2026-09-05T11:00:00.000Z" } },
73
+ ]);
74
+ expect(seen[1]!.passedGates[0]!.approval).toEqual(result.records.find((r) => r.fn === "gate:ship")?.approval);
75
+ });
76
+
77
+ describe("a policy permit and the gates a run passed (#2512)", () => {
78
+ const TEXT = 'permit (principal is Chant::Agent, action, resource) when { context.risk == "low" };\n';
79
+ const POLICY: GatePolicyRef = { kind: "gate-policy", lexicon: "cedar", name: "ship", version: gatePolicyVersion(TEXT), text: TEXT };
80
+ const enforce: ResolvedGateApproval = { policy: POLICY, mode: "enforce" };
81
+ const permit = (mode: "log-only" | "enforce"): GateResolutionRecord => ({
82
+ version: 1, op: "release", gate: "ship", resolvedBy: "release-bot", timestamp: "2026-09-05T11:00:00.000Z",
83
+ approver: { kind: "agent" },
84
+ policyDecision: { policy: "ship", version: POLICY.version, mode, decision: "allow", determining: ["ship-0"], errors: [] },
85
+ });
86
+
87
+ async function run(mode: "log-only" | "enforce") {
88
+ const seen: OpRunContext[] = [];
89
+ const activities = new Map<string, ActivityFn>([["apply", async () => { seen.push(currentOpRun()!); }]]);
90
+ const port = memoryGateLedgerPort({
91
+ pending: [{
92
+ version: 1, kind: "pending", op: "release", gate: "ship",
93
+ timestamp: "2026-09-05T10:00:00.000Z", expiresAt: "2026-09-07T10:00:00.000Z",
94
+ approval: { ...enforce, mode },
95
+ }],
96
+ resolutions: [permit(mode)],
97
+ });
98
+ const result = await runOpLocally(
99
+ op([
100
+ { kind: "gate", gate: "ship", approval: { policy: POLICY, mode: "enforce" } },
101
+ { kind: "activity", fn: "apply" },
102
+ ]),
103
+ activities,
104
+ PROFILES,
105
+ undefined,
106
+ { gates: port, now: NOW, runId: "r3" },
107
+ );
108
+ return { result, seen };
109
+ }
110
+
111
+ test("an enforce-mode permit passes the gate, and the next step sees it as passed by policy", async () => {
112
+ const { result, seen } = await run("enforce");
113
+ expect(result.status).toBe("ok");
114
+ expect(seen[0]!.passedGates.map((g) => [g.gate, g.approval.via])).toEqual([["ship", "policy"]]);
115
+ });
116
+
117
+ test("a permit recorded under log-only does not pass the enforced gate, so no step sees it as passed", async () => {
118
+ const { result, seen } = await run("log-only");
119
+ expect(result.status).toBe("gated");
120
+ expect(seen).toEqual([]);
121
+ expect(result.records.find((r) => r.fn === "gate:ship")?.approval).toBeUndefined();
122
+ });
123
+ });
124
+
125
+ test("two runs in flight at once each see their own context", async () => {
126
+ const seen = new Map<string, string | undefined>();
127
+ const activities = new Map<string, ActivityFn>([
128
+ ["deploy", async () => {
129
+ await new Promise((r) => setTimeout(r, 5));
130
+ const ctx = currentOpRun()!;
131
+ seen.set(ctx.runId, ctx.env);
132
+ }],
133
+ ]);
134
+ const config = op([{ kind: "activity", fn: "deploy" }]);
135
+ await Promise.all([
136
+ runOpLocally(config, activities, PROFILES, undefined, { runId: "a", env: "staging" }),
137
+ runOpLocally(config, activities, PROFILES, undefined, { runId: "b", env: "prod" }),
138
+ ]);
139
+ expect(Object.fromEntries(seen)).toEqual({ a: "staging", b: "prod" });
140
+ });
141
+ });
@@ -0,0 +1,51 @@
1
+ /**
2
+ * The run an activity is part of (#2522).
3
+ *
4
+ * An activity is called as `fn(args, signal)`, which says nothing about the
5
+ * run around it. An activity that deploys somewhere needs the environment the
6
+ * run was asked for, one that appends a ledger record of its own needs the run
7
+ * id to name the run that made it, and a step after a gate may need to know the
8
+ * gate passed and who approved it.
9
+ *
10
+ * `runOpLocally` (`./local-executor.ts`) sets this for the whole run, and
11
+ * {@link currentOpRun} reads it from inside an activity. It is backed by
12
+ * `AsyncLocalStorage`, so it follows the activity through every `await` and is
13
+ * `undefined` outside a run.
14
+ */
15
+
16
+ import { AsyncLocalStorage } from "node:async_hooks";
17
+ import type { StepRecord } from "./local-executor";
18
+
19
+ /** A gate this run has passed, with the approval that passed it. */
20
+ export interface PassedGate {
21
+ gate: string;
22
+ approval: NonNullable<StepRecord["approval"]>;
23
+ }
24
+
25
+ /** What an activity can read about the run it is in. */
26
+ export interface OpRunContext {
27
+ /** The Op's name. */
28
+ op: string;
29
+ /** The run id the run ledger record carries. */
30
+ runId: string;
31
+ /** `--env`, as handed to `OpRuntimeProvider.start`. Absent when the run was started without one. */
32
+ env?: string;
33
+ /** Every gate this run has passed so far, in the order it passed them. */
34
+ passedGates: PassedGate[];
35
+ }
36
+
37
+ const store = new AsyncLocalStorage<OpRunContext>();
38
+
39
+ /**
40
+ * The run the calling activity is part of, or `undefined` outside a run.
41
+ * `passedGates` is a copy taken at the time of the call.
42
+ */
43
+ export function currentOpRun(): OpRunContext | undefined {
44
+ const ctx = store.getStore();
45
+ return ctx ? { ...ctx, passedGates: [...ctx.passedGates] } : undefined;
46
+ }
47
+
48
+ /** Run `fn` with `ctx` as the current run. The executor calls this. A runtime that calls activities itself can too. */
49
+ export function withOpRunContext<T>(ctx: OpRunContext, fn: () => T): T {
50
+ return store.run(ctx, fn);
51
+ }
@@ -81,6 +81,20 @@ describe("the local op runtime", () => {
81
81
  expect(status.records?.map((r) => r.fn)).toEqual(["ok"]);
82
82
  });
83
83
 
84
+ test("an activity reads --env and the run id the ledger records (#2522)", async () => {
85
+ const { currentOpRun } = await import("../run-context");
86
+ let seen: ReturnType<typeof currentOpRun>;
87
+ loadActivitiesMock.mockResolvedValue(new Map([["ok", vi.fn(async () => { seen = currentOpRun(); })]]));
88
+ const runtime = createLocalOpRuntime();
89
+
90
+ const handle = await runtime.start(op("hello", [{ kind: "activity", fn: "ok", args: {} }]), { env: "staging" });
91
+ const status = await handle.result();
92
+
93
+ expect(seen?.env).toBe("staging");
94
+ expect(seen?.runId).toBe(handle.runId);
95
+ expect(status.result?.record?.id).toBe(handle.runId);
96
+ });
97
+
84
98
  test("the project's configured lexicons decide which appliers load", async () => {
85
99
  loadActivitiesMock.mockResolvedValue(new Map([["ok", vi.fn(async () => ({}))]]));
86
100
  const runtime = createLocalOpRuntime();
@@ -152,6 +152,8 @@ export function createLocalOpRuntime(opts: { projectPath?: string } = {}): OpRun
152
152
  startOpts.signal,
153
153
  {
154
154
  runId,
155
+ // #2522: `--env` reaches the activities through the run context.
156
+ ...(startOpts.env !== undefined ? { env: startOpts.env } : {}),
155
157
  // The run's outcome is a durable fact (#2118): the executor
156
158
  // appends it here, at the one seam every local run passes
157
159
  // through, rather than in the CLI handler above it.
@@ -118,6 +118,8 @@ export function inProcessBesideLauncher(
118
118
  try {
119
119
  const result = await runOpLocally(start.op, activities, profiles, controller.signal, {
120
120
  steward: start.steward,
121
+ // #2522: the same `--env` the spawned launcher passes on the command line.
122
+ ...(start.env ? { env: start.env } : {}),
121
123
  ledger: { cwd: start.cwd },
122
124
  work: { holder: start.holder },
123
125
  });
package/src/op/types.ts CHANGED
@@ -59,6 +59,14 @@ export interface OpConfig {
59
59
  * coding agent is editing.
60
60
  */
61
61
  changesCheckout?: boolean;
62
+ /**
63
+ * Approvals for this Op belong to people, so an agent never resolves its
64
+ * gates or runs it over MCP. `op-approve` refuses any gate of this Op and
65
+ * `op-run` refuses the Op, whatever channel the gate was reached on.
66
+ * `op-list`, `op-status` and `op-report` still answer. The shell commands
67
+ * `chant run` and `chant approve` are unchanged.
68
+ */
69
+ neverOverMcp?: boolean;
62
70
  }
63
71
 
64
72
  /**
@@ -91,8 +99,12 @@ export interface OpWorkLease {
91
99
  ttl?: string;
92
100
  /**
93
101
  * How the release records a run that ended `ok`: a reference to a step
94
- * output holding a short string (`done`, `not_done`, ...). Default `done`;
95
- * a failed run releases `not_done` and a gated one `gated`.
102
+ * output holding one of the closed list of lease outcomes
103
+ * (`WORK_LEASE_OUTCOMES` in `../lifecycle/work-lease.ts`, #3147: `done`,
104
+ * `not_done`, `abandoned`, `gated`, `waiting`, `dropped`, `redraft`,
105
+ * `ask`). Default `done`; a failed run releases `not_done`, a gated one
106
+ * `gated` and one waiting on a decision point `waiting`. A word outside
107
+ * the list is released `not_done`, with a note naming it.
96
108
  */
97
109
  outcome?: StepOutputRef;
98
110
  }
@@ -178,7 +190,8 @@ export interface ActivityStep {
178
190
  *
179
191
  * `from` is a dot-path into the return value (e.g. `"drifted"` for
180
192
  * `{ drifted: boolean }`); when omitted, the whole return value is
181
- * recorded.
193
+ * recorded. An attribute whose path the result does not hold (an optional
194
+ * field left out) is not recorded, rather than recorded as `undefined`.
182
195
  */
183
196
  outcomeAttribute?: OutcomeAttribute | OutcomeAttribute[];
184
197
  }
@@ -342,4 +342,51 @@ describe("an Op that changes the checkout", () => {
342
342
  expect(git(["status", "--porcelain"], dir).stdout).toBe(" M app/index.ts\n");
343
343
  });
344
344
  });
345
+
346
+ test("a run that ends not_done keeps its attempt at refs/chant/kept/<item>/<token>, committed and uncommitted work, and the branch goes back (#3147)", async () => {
347
+ await withTestDir(async (dir) => {
348
+ await initRepo(dir);
349
+ const head = git(["rev-parse", "HEAD"], dir).stdout.trim();
350
+ const activities = new Map<string, ActivityFn>([
351
+ [
352
+ "build",
353
+ async (args) => {
354
+ const worktree = String(args.worktree);
355
+ writeFileSync(join(worktree, "app", "feature.ts"), "export const feature = true;\n");
356
+ expect(git(["add", "-A"], worktree).status).toBe(0);
357
+ expect(git(["commit", "-q", "-m", "half a build"], worktree).status).toBe(0);
358
+ writeFileSync(join(worktree, "app", "notes.md"), "left uncommitted\n");
359
+ throw new Error("the check fails");
360
+ },
361
+ ],
362
+ ]);
363
+ const result = await run(dispatchOp({ workLease: { item: "W-8" }, changesCheckout: true }, [step("build", { worktree: workLeaseOutput("worktree") })]), activities, dir);
364
+ expect(result.status).toBe("fail");
365
+ const token = result.workLease!.token!;
366
+ const kept = `refs/chant/kept/W-8/${token}`;
367
+ expect(result.workLease).toMatchObject({ item: "W-8", released: true, outcome: "not_done", kept });
368
+ // Both the commit and the uncommitted file are in the kept attempt; the branch is where the run started.
369
+ expect(git(["show", `${kept}:app/feature.ts`], dir).stdout).toBe("export const feature = true;\n");
370
+ expect(git(["show", `${kept}:app/notes.md`], dir).stdout).toBe("left uncommitted\n");
371
+ expect(git(["rev-parse", "chant/work/W-8"], dir).stdout.trim()).toBe(head);
372
+ expect(git(["rev-parse", "HEAD"], dir).stdout.trim()).toBe(head);
373
+ });
374
+ });
375
+
376
+ test("a run whose step names a lease outcome releases it, and keeps nothing when it changed nothing; a word outside the list is not_done (#3147)", async () => {
377
+ await withTestDir(async (dir) => {
378
+ await initRepo(dir);
379
+ let word = "dropped";
380
+ const activities = new Map<string, ActivityFn>([["record", async () => ({ outcome: word })]]);
381
+ const op = () => dispatchOp({ workLease: { item: "W-9", outcome: stepOutput("record", "outcome") }, changesCheckout: true }, [step("record", {}, { id: "record" })]);
382
+ const dropped = await run(op(), activities, dir);
383
+ expect(dropped.workLease).toMatchObject({ released: true, outcome: "dropped", kept: null });
384
+ word = "skipped";
385
+ const other = await run(op(), activities, dir);
386
+ expect(other.workLease).toMatchObject({ released: true, outcome: "not_done", kept: null });
387
+ const last = (await readLeaseHistory("W-9", { cwd: dir })).records.at(-1);
388
+ expect(last).toMatchObject({ event: "release", outcome: "not_done" });
389
+ expect(last?.note).toMatch(/"skipped" is not a work lease outcome/);
390
+ });
391
+ });
345
392
  });