@intentius/chant 0.56.0 → 0.58.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 (515) hide show
  1. package/dist/audit/catalog.d.ts +51 -1
  2. package/dist/audit/catalog.d.ts.map +1 -1
  3. package/dist/audit/core.d.ts +20 -1
  4. package/dist/audit/core.d.ts.map +1 -1
  5. package/dist/audit/discover.d.ts +14 -8
  6. package/dist/audit/discover.d.ts.map +1 -1
  7. package/dist/audit/lineage.d.ts +10 -0
  8. package/dist/audit/lineage.d.ts.map +1 -0
  9. package/dist/audit/prior-art.d.ts +385 -0
  10. package/dist/audit/prior-art.d.ts.map +1 -0
  11. package/dist/audit/proof.d.ts +16 -0
  12. package/dist/audit/proof.d.ts.map +1 -1
  13. package/dist/audit/report-html.d.ts.map +1 -1
  14. package/dist/audit/report-model.d.ts +8 -1
  15. package/dist/audit/report-model.d.ts.map +1 -1
  16. package/dist/audit/report.d.ts.map +1 -1
  17. package/dist/audit/rules-doc.d.ts +3 -0
  18. package/dist/audit/rules-doc.d.ts.map +1 -1
  19. package/dist/audit/secrets.d.ts +15 -0
  20. package/dist/audit/secrets.d.ts.map +1 -1
  21. package/dist/audit/terraform-state.d.ts +46 -0
  22. package/dist/audit/terraform-state.d.ts.map +1 -0
  23. package/dist/build.d.ts +17 -1
  24. package/dist/build.d.ts.map +1 -1
  25. package/dist/claimed-fields.d.ts +161 -0
  26. package/dist/claimed-fields.d.ts.map +1 -0
  27. package/dist/cli/build-params-cli.d.ts +2 -2
  28. package/dist/cli/command-group.d.ts +14 -0
  29. package/dist/cli/command-group.d.ts.map +1 -1
  30. package/dist/cli/commands/audit.d.ts +17 -1
  31. package/dist/cli/commands/audit.d.ts.map +1 -1
  32. package/dist/cli/commands/build.d.ts.map +1 -1
  33. package/dist/cli/commands/check-lexicon-docs.d.ts +1 -1
  34. package/dist/cli/commands/check-lexicon-examples.d.ts +16 -6
  35. package/dist/cli/commands/check-lexicon-examples.d.ts.map +1 -1
  36. package/dist/cli/commands/import.d.ts.map +1 -1
  37. package/dist/cli/commands/init-lexicon/templates/codegen.d.ts +1 -0
  38. package/dist/cli/commands/init-lexicon/templates/codegen.d.ts.map +1 -1
  39. package/dist/cli/commands/init-lexicon/templates/project.d.ts +7 -0
  40. package/dist/cli/commands/init-lexicon/templates/project.d.ts.map +1 -1
  41. package/dist/cli/commands/init-lexicon.d.ts.map +1 -1
  42. package/dist/cli/commands/init.d.ts.map +1 -1
  43. package/dist/cli/commands/lint.d.ts.map +1 -1
  44. package/dist/cli/commands/onboard.d.ts +2 -0
  45. package/dist/cli/commands/onboard.d.ts.map +1 -1
  46. package/dist/cli/handlers/build.d.ts.map +1 -1
  47. package/dist/cli/handlers/lifecycle.d.ts.map +1 -1
  48. package/dist/cli/handlers/operator.d.ts +82 -16
  49. package/dist/cli/handlers/operator.d.ts.map +1 -1
  50. package/dist/cli/handlers/run.d.ts +49 -42
  51. package/dist/cli/handlers/run.d.ts.map +1 -1
  52. package/dist/cli/main.d.ts +28 -1
  53. package/dist/cli/main.d.ts.map +1 -1
  54. package/dist/cli/mcp/op-tools.d.ts +16 -1
  55. package/dist/cli/mcp/op-tools.d.ts.map +1 -1
  56. package/dist/cli/mcp/resource-handlers.d.ts.map +1 -1
  57. package/dist/cli/mcp/resources/context.d.ts.map +1 -1
  58. package/dist/cli/registry.d.ts +26 -9
  59. package/dist/cli/registry.d.ts.map +1 -1
  60. package/dist/codegen/generate-post-synth-barrel.d.ts +1 -1
  61. package/dist/components/auto-release.d.ts +10 -20
  62. package/dist/components/auto-release.d.ts.map +1 -1
  63. package/dist/components/capability.d.ts +4 -4
  64. package/dist/components/cli-support.d.ts +20 -21
  65. package/dist/components/cli-support.d.ts.map +1 -1
  66. package/dist/components/component.d.ts +3 -3
  67. package/dist/components/component.d.ts.map +1 -1
  68. package/dist/components/driver-output.d.ts.map +1 -1
  69. package/dist/components/driver.d.ts +66 -36
  70. package/dist/components/driver.d.ts.map +1 -1
  71. package/dist/components/index.d.ts +1 -2
  72. package/dist/components/index.d.ts.map +1 -1
  73. package/dist/components/manifest-persistence.d.ts +1 -9
  74. package/dist/components/manifest-persistence.d.ts.map +1 -1
  75. package/dist/components/run-progress.d.ts +6 -6
  76. package/dist/components/run-progress.d.ts.map +1 -1
  77. package/dist/components/verbs/run-agent.d.ts +9 -15
  78. package/dist/components/verbs/run-agent.d.ts.map +1 -1
  79. package/dist/components/verbs/verify.d.ts +2 -2
  80. package/dist/deep-observation.d.ts +17 -0
  81. package/dist/deep-observation.d.ts.map +1 -1
  82. package/dist/discovery/files.d.ts +4 -4
  83. package/dist/discovery/fold-import.d.ts.map +1 -1
  84. package/dist/discovery/param-deps.d.ts +33 -0
  85. package/dist/discovery/param-deps.d.ts.map +1 -1
  86. package/dist/discovery/sandbox/bundle.d.ts.map +1 -1
  87. package/dist/discovery/sandbox/config-wire.d.ts +2 -2
  88. package/dist/fold/foldable-helpers.d.ts +5 -1
  89. package/dist/fold/foldable-helpers.d.ts.map +1 -1
  90. package/dist/fold-provenance.d.ts +236 -0
  91. package/dist/fold-provenance.d.ts.map +1 -0
  92. package/dist/graph-ops.d.ts +1 -1
  93. package/dist/held-elsewhere.d.ts +85 -0
  94. package/dist/held-elsewhere.d.ts.map +1 -0
  95. package/dist/import/ir-utils.d.ts +1 -1
  96. package/dist/import/ir-utils.d.ts.map +1 -1
  97. package/dist/import/parser.d.ts +33 -0
  98. package/dist/import/parser.d.ts.map +1 -1
  99. package/dist/index.d.ts +3 -0
  100. package/dist/index.d.ts.map +1 -1
  101. package/dist/kubectl-context.d.ts +3 -3
  102. package/dist/lexicon-config.d.ts +4 -4
  103. package/dist/lexicon-plugin-helpers.d.ts +1 -1
  104. package/dist/lexicon.d.ts +104 -14
  105. package/dist/lexicon.d.ts.map +1 -1
  106. package/dist/lifecycle/change-set.d.ts +13 -0
  107. package/dist/lifecycle/change-set.d.ts.map +1 -1
  108. package/dist/lifecycle/deep-diff.d.ts +133 -6
  109. package/dist/lifecycle/deep-diff.d.ts.map +1 -1
  110. package/dist/lifecycle/deep-observe.d.ts.map +1 -1
  111. package/dist/lifecycle/gate-ledger.d.ts +71 -3
  112. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  113. package/dist/lifecycle/index.d.ts +1 -0
  114. package/dist/lifecycle/index.d.ts.map +1 -1
  115. package/dist/lifecycle/release-ledger.d.ts +2 -2
  116. package/dist/lifecycle/run-ledger.d.ts +53 -0
  117. package/dist/lifecycle/run-ledger.d.ts.map +1 -0
  118. package/dist/lifecycle/symptoms.d.ts +3 -3
  119. package/dist/lifecycle/symptoms.d.ts.map +1 -1
  120. package/dist/lint/config.d.ts +81 -2
  121. package/dist/lint/config.d.ts.map +1 -1
  122. package/dist/lint/post-synth.d.ts +55 -2
  123. package/dist/lint/post-synth.d.ts.map +1 -1
  124. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.d.ts +1 -1
  125. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.d.ts.map +1 -1
  126. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.d.ts +1 -1
  127. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.d.ts.map +1 -1
  128. package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.d.ts +44 -0
  129. package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.d.ts.map +1 -0
  130. package/dist/lint/rules/comp/index.d.ts +1 -1
  131. package/dist/lint/rules/comp/index.d.ts.map +1 -1
  132. package/dist/lint/rules/op/index.d.ts +16 -0
  133. package/dist/lint/rules/op/index.d.ts.map +1 -0
  134. package/dist/lint/rules/op/ops012-activity-contract.d.ts +27 -0
  135. package/dist/lint/rules/op/ops012-activity-contract.d.ts.map +1 -0
  136. package/dist/lint/rules/op/ops013-step-output-ref.d.ts +61 -0
  137. package/dist/lint/rules/op/ops013-step-output-ref.d.ts.map +1 -0
  138. package/dist/lint/rules/op/ops014-converge-rule-refusals.d.ts +55 -0
  139. package/dist/lint/rules/op/ops014-converge-rule-refusals.d.ts.map +1 -0
  140. package/dist/lint/rules/op/support.d.ts +12 -0
  141. package/dist/lint/rules/op/support.d.ts.map +1 -0
  142. package/dist/lint/suppressions.d.ts +108 -0
  143. package/dist/lint/suppressions.d.ts.map +1 -0
  144. package/dist/live-endpoint.d.ts +1 -1
  145. package/dist/op/activities/activity-contracts.d.ts +54 -0
  146. package/dist/op/activities/activity-contracts.d.ts.map +1 -0
  147. package/dist/op/activities/apply.d.ts +262 -0
  148. package/dist/op/activities/apply.d.ts.map +1 -0
  149. package/dist/op/activities/build.d.ts +13 -0
  150. package/dist/op/activities/build.d.ts.map +1 -0
  151. package/dist/op/activities/converge.d.ts +110 -0
  152. package/dist/op/activities/converge.d.ts.map +1 -0
  153. package/dist/op/activities/env-teardown.d.ts +76 -0
  154. package/dist/op/activities/env-teardown.d.ts.map +1 -0
  155. package/dist/op/activities/guard-validate.d.ts +64 -0
  156. package/dist/op/activities/guard-validate.d.ts.map +1 -0
  157. package/dist/op/activities/http-check.d.ts +34 -0
  158. package/dist/op/activities/http-check.d.ts.map +1 -0
  159. package/dist/op/activities/index.d.ts +31 -0
  160. package/dist/op/activities/index.d.ts.map +1 -0
  161. package/dist/op/activities/lexicon-upgrade.d.ts +182 -0
  162. package/dist/op/activities/lexicon-upgrade.d.ts.map +1 -0
  163. package/dist/op/activities/lifecycle.d.ts +42 -0
  164. package/dist/op/activities/lifecycle.d.ts.map +1 -0
  165. package/dist/op/activities/pipeline-audit.d.ts +84 -0
  166. package/dist/op/activities/pipeline-audit.d.ts.map +1 -0
  167. package/dist/op/activities/policy.d.ts +17 -0
  168. package/dist/op/activities/policy.d.ts.map +1 -0
  169. package/dist/op/activities/reconcile.d.ts +89 -0
  170. package/dist/op/activities/reconcile.d.ts.map +1 -0
  171. package/dist/op/activities/shell.d.ts +13 -0
  172. package/dist/op/activities/shell.d.ts.map +1 -0
  173. package/dist/op/activities/teardown.d.ts +10 -0
  174. package/dist/op/activities/teardown.d.ts.map +1 -0
  175. package/dist/op/activities/util.d.ts +7 -0
  176. package/dist/op/activities/util.d.ts.map +1 -0
  177. package/dist/op/activities/wait.d.ts +28 -0
  178. package/dist/op/activities/wait.d.ts.map +1 -0
  179. package/dist/op/activities/workflow-audit.d.ts +92 -0
  180. package/dist/op/activities/workflow-audit.d.ts.map +1 -0
  181. package/dist/op/activity-contract-registry.d.ts +76 -0
  182. package/dist/op/activity-contract-registry.d.ts.map +1 -0
  183. package/dist/op/activity-contract.d.ts +25 -18
  184. package/dist/op/activity-contract.d.ts.map +1 -1
  185. package/dist/op/activity-failure.d.ts +28 -0
  186. package/dist/op/activity-failure.d.ts.map +1 -0
  187. package/dist/op/activity-profiles.d.ts +118 -0
  188. package/dist/op/activity-profiles.d.ts.map +1 -0
  189. package/dist/op/activity-registry.d.ts +22 -38
  190. package/dist/op/activity-registry.d.ts.map +1 -1
  191. package/dist/op/activity-runtime.d.ts +3 -14
  192. package/dist/op/activity-runtime.d.ts.map +1 -1
  193. package/dist/op/builders.d.ts +84 -29
  194. package/dist/op/builders.d.ts.map +1 -1
  195. package/dist/op/composites/apply-op.d.ts +113 -0
  196. package/dist/op/composites/apply-op.d.ts.map +1 -0
  197. package/dist/op/composites/converge-op.d.ts +120 -0
  198. package/dist/op/composites/converge-op.d.ts.map +1 -0
  199. package/dist/op/composites/index.d.ts +26 -0
  200. package/dist/op/composites/index.d.ts.map +1 -0
  201. package/dist/op/composites/lexicon-upgrade-op.d.ts +78 -0
  202. package/dist/op/composites/lexicon-upgrade-op.d.ts.map +1 -0
  203. package/dist/op/composites/pipeline-audit-op.d.ts +50 -0
  204. package/dist/op/composites/pipeline-audit-op.d.ts.map +1 -0
  205. package/dist/op/composites/reconcile-op.d.ts +57 -0
  206. package/dist/op/composites/reconcile-op.d.ts.map +1 -0
  207. package/dist/op/composites/watch-op.d.ts +60 -0
  208. package/dist/op/composites/watch-op.d.ts.map +1 -0
  209. package/dist/op/composites/workflow-audit-op.d.ts +57 -0
  210. package/dist/op/composites/workflow-audit-op.d.ts.map +1 -0
  211. package/dist/op/converge-rule.d.ts +12 -10
  212. package/dist/op/converge-rule.d.ts.map +1 -1
  213. package/dist/op/cron.d.ts +51 -0
  214. package/dist/op/cron.d.ts.map +1 -0
  215. package/dist/op/discover.d.ts +9 -0
  216. package/dist/op/discover.d.ts.map +1 -1
  217. package/dist/op/duration.d.ts +11 -0
  218. package/dist/op/duration.d.ts.map +1 -0
  219. package/dist/op/emulator-lifecycle.d.ts.map +1 -1
  220. package/dist/op/gate.d.ts +90 -0
  221. package/dist/op/gate.d.ts.map +1 -0
  222. package/dist/op/generate-pipeline.d.ts +9 -0
  223. package/dist/op/generate-pipeline.d.ts.map +1 -1
  224. package/dist/op/index.d.ts +23 -7
  225. package/dist/op/index.d.ts.map +1 -1
  226. package/dist/op/local-executor.d.ts +114 -28
  227. package/dist/op/local-executor.d.ts.map +1 -1
  228. package/dist/op/local-output.d.ts +11 -1
  229. package/dist/op/local-output.d.ts.map +1 -1
  230. package/dist/op/op-ir.d.ts +184 -0
  231. package/dist/op/op-ir.d.ts.map +1 -0
  232. package/dist/op/op-verb-class.d.ts +10 -2
  233. package/dist/op/op-verb-class.d.ts.map +1 -1
  234. package/dist/op/operator.d.ts +30 -5
  235. package/dist/op/operator.d.ts.map +1 -1
  236. package/dist/op/receipt-store.d.ts +1 -1
  237. package/dist/op/receipt-store.d.ts.map +1 -1
  238. package/dist/op/resource.d.ts +15 -1
  239. package/dist/op/resource.d.ts.map +1 -1
  240. package/dist/op/runtime.d.ts +200 -0
  241. package/dist/op/runtime.d.ts.map +1 -0
  242. package/dist/op/runtimes/local.d.ts +29 -0
  243. package/dist/op/runtimes/local.d.ts.map +1 -0
  244. package/dist/op/step-output-ref.d.ts +15 -13
  245. package/dist/op/step-output-ref.d.ts.map +1 -1
  246. package/dist/op/types.d.ts +79 -27
  247. package/dist/op/types.d.ts.map +1 -1
  248. package/dist/ownership.d.ts +1 -1
  249. package/dist/provenance.d.ts +21 -0
  250. package/dist/provenance.d.ts.map +1 -1
  251. package/dist/serializer-walker.d.ts.map +1 -1
  252. package/dist/stack-output.d.ts +5 -0
  253. package/dist/stack-output.d.ts.map +1 -1
  254. package/package.json +6 -1
  255. package/src/audit/catalog.test.ts +79 -3
  256. package/src/audit/catalog.ts +111 -13
  257. package/src/audit/core.test.ts +26 -0
  258. package/src/audit/core.ts +61 -17
  259. package/src/audit/discover.test.ts +39 -0
  260. package/src/audit/discover.ts +91 -15
  261. package/src/audit/lineage.ts +100 -0
  262. package/src/audit/prior-art.ts +153 -0
  263. package/src/audit/proof.test.ts +67 -0
  264. package/src/audit/proof.ts +70 -0
  265. package/src/audit/report-html.ts +9 -4
  266. package/src/audit/report-model.ts +16 -2
  267. package/src/audit/report.test.ts +33 -0
  268. package/src/audit/report.ts +5 -3
  269. package/src/audit/rules-doc.test.ts +34 -2
  270. package/src/audit/rules-doc.ts +82 -9
  271. package/src/audit/secrets.ts +15 -3
  272. package/src/audit/terraform-state.test.ts +144 -0
  273. package/src/audit/terraform-state.ts +131 -0
  274. package/src/build.ts +31 -1
  275. package/src/claimed-fields.test.ts +145 -0
  276. package/src/claimed-fields.ts +208 -0
  277. package/src/cli/build-params-cli.ts +2 -2
  278. package/src/cli/command-group.ts +14 -0
  279. package/src/cli/commands/__fixtures__/audit-terraform/infra/.terraform/providers/lock.txt +1 -0
  280. package/src/cli/commands/__fixtures__/audit-terraform/infra/main.tf +1 -0
  281. package/src/cli/commands/__fixtures__/audit-terraform/infra/modules/foo/main.tf +1 -0
  282. package/src/cli/commands/__fixtures__/audit-terraform/infra/variables.tf +3 -0
  283. package/src/cli/commands/__fixtures__/init-lexicon-output/package.json +13 -4
  284. package/src/cli/commands/__fixtures__/init-lexicon-output/src/codegen/docs-cli.ts +4 -0
  285. package/src/cli/commands/__fixtures__/init-lexicon-output/src/codegen/package.ts +1 -0
  286. package/src/cli/commands/__fixtures__/init-lexicon-output/src/package-cli.ts +21 -0
  287. package/src/cli/commands/__snapshots__/init-lexicon.test.ts.snap +1 -0
  288. package/src/cli/commands/audit.test.ts +189 -11
  289. package/src/cli/commands/audit.ts +73 -27
  290. package/src/cli/commands/build.test.ts +292 -9
  291. package/src/cli/commands/build.ts +156 -24
  292. package/src/cli/commands/check-lexicon-docs.ts +1 -1
  293. package/src/cli/commands/check-lexicon-examples.test.ts +29 -1
  294. package/src/cli/commands/check-lexicon-examples.ts +42 -10
  295. package/src/cli/commands/import.ts +6 -0
  296. package/src/cli/commands/init-lexicon/templates/codegen.ts +9 -0
  297. package/src/cli/commands/init-lexicon/templates/project.ts +44 -4
  298. package/src/cli/commands/init-lexicon.test.ts +97 -2
  299. package/src/cli/commands/init-lexicon.ts +4 -2
  300. package/src/cli/commands/init.test.ts +35 -1
  301. package/src/cli/commands/init.ts +14 -3
  302. package/src/cli/commands/lint.test.ts +48 -0
  303. package/src/cli/commands/lint.ts +123 -0
  304. package/src/cli/commands/onboard.test.ts +75 -0
  305. package/src/cli/commands/onboard.ts +54 -23
  306. package/src/cli/handlers/build.test.ts +81 -1
  307. package/src/cli/handlers/build.ts +15 -1
  308. package/src/cli/handlers/graph.test.ts +3 -3
  309. package/src/cli/handlers/lifecycle.test.ts +195 -12
  310. package/src/cli/handlers/lifecycle.ts +123 -6
  311. package/src/cli/handlers/misc.ts +1 -1
  312. package/src/cli/handlers/operator.test.ts +183 -11
  313. package/src/cli/handlers/operator.ts +260 -55
  314. package/src/cli/handlers/run.test.ts +431 -1287
  315. package/src/cli/handlers/run.ts +365 -915
  316. package/src/cli/main.test.ts +23 -15
  317. package/src/cli/main.ts +88 -33
  318. package/src/cli/mcp/op-tools.ts +147 -88
  319. package/src/cli/mcp/resource-handlers.ts +10 -37
  320. package/src/cli/mcp/resources/context.ts +11 -12
  321. package/src/cli/mcp/server.test.ts +25 -27
  322. package/src/cli/mcp/server.ts +2 -2
  323. package/src/cli/registry.ts +26 -9
  324. package/src/codegen/docs.ts +1 -1
  325. package/src/codegen/generate-post-synth-barrel.test.ts +1 -1
  326. package/src/codegen/generate-post-synth-barrel.ts +1 -1
  327. package/src/components/README.md +3 -2
  328. package/src/components/auto-release.test.ts +4 -20
  329. package/src/components/auto-release.ts +17 -42
  330. package/src/components/capability.ts +4 -4
  331. package/src/components/cli-support.test.ts +10 -5
  332. package/src/components/cli-support.ts +52 -44
  333. package/src/components/component.schema.json +2 -2
  334. package/src/components/component.ts +3 -3
  335. package/src/components/driver-output.ts +14 -2
  336. package/src/components/driver.test.ts +92 -22
  337. package/src/components/driver.ts +193 -83
  338. package/src/components/index.ts +1 -6
  339. package/src/components/manifest-persistence.test.ts +2 -20
  340. package/src/components/manifest-persistence.ts +4 -24
  341. package/src/components/pilots/pilots-lint-clean.test.ts +11 -10
  342. package/src/components/run-progress.ts +6 -6
  343. package/src/components/verbs/run-agent.ts +11 -17
  344. package/src/components/verbs/verify.ts +2 -2
  345. package/src/deep-observation.test.ts +75 -0
  346. package/src/deep-observation.ts +48 -0
  347. package/src/discovery/collect.test.ts +3 -3
  348. package/src/discovery/files.ts +4 -4
  349. package/src/discovery/fold-import.ts +105 -2
  350. package/src/discovery/param-deps.test.ts +112 -1
  351. package/src/discovery/param-deps.ts +193 -0
  352. package/src/discovery/sandbox/bundle.ts +15 -1
  353. package/src/discovery/sandbox/config-wire.test.ts +2 -2
  354. package/src/discovery/sandbox/config-wire.ts +2 -2
  355. package/src/fold/fold.test.ts +56 -0
  356. package/src/fold/foldable-helpers.ts +81 -1
  357. package/src/fold-provenance-exclusion.test.ts +186 -0
  358. package/src/fold-provenance.test.ts +495 -0
  359. package/src/fold-provenance.ts +441 -0
  360. package/src/graph-ops.test.ts +2 -2
  361. package/src/graph-ops.ts +1 -1
  362. package/src/held-elsewhere.test.ts +102 -0
  363. package/src/held-elsewhere.ts +114 -0
  364. package/src/import/ir-utils.ts +11 -1
  365. package/src/import/parser.ts +35 -0
  366. package/src/index.ts +3 -0
  367. package/src/kubectl-context.ts +3 -3
  368. package/src/lexicon-config.test.ts +5 -5
  369. package/src/lexicon-config.ts +4 -4
  370. package/src/lexicon-plugin-helpers.ts +1 -1
  371. package/src/lexicon.ts +120 -14
  372. package/src/lifecycle/change-set.test.ts +49 -0
  373. package/src/lifecycle/change-set.ts +67 -0
  374. package/src/lifecycle/converge-ledger.ts +1 -1
  375. package/src/lifecycle/deep-diff.test.ts +267 -14
  376. package/src/lifecycle/deep-diff.ts +217 -14
  377. package/src/lifecycle/deep-observe.test.ts +3 -1
  378. package/src/lifecycle/deep-observe.ts +16 -6
  379. package/src/lifecycle/gate-ledger.test.ts +74 -2
  380. package/src/lifecycle/gate-ledger.ts +143 -36
  381. package/src/lifecycle/index.ts +1 -0
  382. package/src/lifecycle/release-ledger.ts +2 -2
  383. package/src/lifecycle/run-ledger.test.ts +268 -0
  384. package/src/lifecycle/run-ledger.ts +201 -0
  385. package/src/lifecycle/symptoms.ts +3 -3
  386. package/src/lint/config.test.ts +82 -1
  387. package/src/lint/config.ts +112 -3
  388. package/src/lint/policy.test.ts +1 -1
  389. package/src/lint/post-synth.test.ts +31 -0
  390. package/src/lint/post-synth.ts +54 -1
  391. package/src/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.ts +2 -2
  392. package/src/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.ts +1 -1
  393. package/src/lint/rules/comp/comp.test.ts +1 -1
  394. package/src/lint/rules/comp/comp004-gate-needs-durable-runtime.ts +74 -0
  395. package/src/lint/rules/comp/index.ts +3 -3
  396. package/src/lint/rules/op/index.ts +23 -0
  397. package/src/lint/rules/op/ops012-activity-contract.test.ts +161 -0
  398. package/src/lint/rules/op/ops012-activity-contract.ts +64 -0
  399. package/src/lint/rules/op/ops013-step-output-ref.test.ts +237 -0
  400. package/src/lint/rules/op/ops013-step-output-ref.ts +98 -0
  401. package/src/lint/rules/op/ops014-converge-rule-refusals.test.ts +263 -0
  402. package/src/lint/rules/op/ops014-converge-rule-refusals.ts +179 -0
  403. package/src/lint/rules/op/support.ts +11 -0
  404. package/src/lint/suppressions.test.ts +163 -0
  405. package/src/lint/suppressions.ts +204 -0
  406. package/src/live-endpoint.ts +1 -1
  407. package/src/op/activities/activity-contracts.ts +66 -0
  408. package/src/op/activities/apply.test.ts +567 -0
  409. package/src/op/activities/apply.ts +662 -0
  410. package/src/op/activities/build.ts +26 -0
  411. package/src/op/activities/converge.test.ts +330 -0
  412. package/src/op/activities/converge.ts +449 -0
  413. package/src/op/activities/env-teardown.test.ts +187 -0
  414. package/src/op/activities/env-teardown.ts +171 -0
  415. package/src/op/activities/guard-validate.test.ts +139 -0
  416. package/src/op/activities/guard-validate.ts +223 -0
  417. package/src/op/activities/http-check.test.ts +48 -0
  418. package/src/op/activities/http-check.ts +55 -0
  419. package/src/op/activities/index.ts +119 -0
  420. package/src/op/activities/lexicon-upgrade.test.ts +492 -0
  421. package/src/op/activities/lexicon-upgrade.ts +673 -0
  422. package/src/op/activities/lifecycle.ts +85 -0
  423. package/src/op/activities/pipeline-audit.test.ts +67 -0
  424. package/src/op/activities/pipeline-audit.ts +201 -0
  425. package/src/op/activities/policy.test.ts +19 -0
  426. package/src/op/activities/policy.ts +37 -0
  427. package/src/op/activities/reconcile.test.ts +81 -0
  428. package/src/op/activities/reconcile.ts +187 -0
  429. package/src/op/activities/shell.ts +26 -0
  430. package/src/op/activities/teardown.ts +22 -0
  431. package/src/op/activities/util.ts +6 -0
  432. package/src/op/activities/wait.ts +69 -0
  433. package/src/op/activities/workflow-audit.test.ts +90 -0
  434. package/src/op/activities/workflow-audit.ts +203 -0
  435. package/src/op/activity-contract-registry.test.ts +98 -0
  436. package/src/op/activity-contract-registry.ts +114 -0
  437. package/src/op/activity-contract.test.ts +1 -1
  438. package/src/op/activity-contract.ts +37 -33
  439. package/src/op/activity-failure.ts +34 -0
  440. package/src/op/activity-profiles.test.ts +56 -0
  441. package/src/op/activity-profiles.ts +116 -0
  442. package/src/op/activity-registry.test.ts +37 -28
  443. package/src/op/activity-registry.ts +27 -56
  444. package/src/op/activity-runtime.ts +3 -47
  445. package/src/op/builders-exports.test.ts +0 -49
  446. package/src/op/builders-typed.test.ts +164 -0
  447. package/src/op/builders.ts +123 -39
  448. package/src/op/composites/apply-op.ts +208 -0
  449. package/src/op/composites/composites.test.ts +366 -0
  450. package/src/op/composites/converge-op.test.ts +168 -0
  451. package/src/op/composites/converge-op.ts +214 -0
  452. package/src/op/composites/index.ts +26 -0
  453. package/src/op/composites/lexicon-upgrade-op.test.ts +68 -0
  454. package/src/op/composites/lexicon-upgrade-op.ts +134 -0
  455. package/src/op/composites/pipeline-audit-op.test.ts +25 -0
  456. package/src/op/composites/pipeline-audit-op.ts +78 -0
  457. package/src/op/composites/reconcile-op.test.ts +51 -0
  458. package/src/op/composites/reconcile-op.ts +107 -0
  459. package/src/op/composites/watch-op.ts +108 -0
  460. package/src/op/composites/workflow-audit-op.test.ts +25 -0
  461. package/src/op/composites/workflow-audit-op.ts +88 -0
  462. package/src/op/converge-rule.ts +12 -10
  463. package/src/op/cron.test.ts +128 -0
  464. package/src/op/cron.ts +149 -0
  465. package/src/op/discover-root.test.ts +105 -1
  466. package/src/op/discover.test.ts +6 -2
  467. package/src/op/discover.ts +84 -16
  468. package/src/op/duration.ts +21 -0
  469. package/src/op/effect-step.test.ts +26 -11
  470. package/src/op/emulator-lifecycle.ts +1 -2
  471. package/src/op/gate.ts +155 -0
  472. package/src/op/generate-pipeline.test.ts +65 -3
  473. package/src/op/generate-pipeline.ts +19 -2
  474. package/src/op/index.ts +39 -6
  475. package/src/op/local-executor.test.ts +163 -34
  476. package/src/op/local-executor.ts +370 -102
  477. package/src/op/local-output.test.ts +95 -11
  478. package/src/op/local-output.ts +33 -4
  479. package/src/op/op-ir.test.ts +281 -0
  480. package/src/op/op-ir.ts +417 -0
  481. package/src/op/op-verb-class.ts +19 -5
  482. package/src/op/op.test.ts +26 -5
  483. package/src/op/operator.test.ts +175 -6
  484. package/src/op/operator.ts +63 -16
  485. package/src/op/receipt-store.ts +1 -1
  486. package/src/op/resource.ts +20 -2
  487. package/src/op/runtime.ts +203 -0
  488. package/src/op/runtimes/local.test.ts +181 -0
  489. package/src/op/runtimes/local.ts +212 -0
  490. package/src/op/step-output-ref.ts +15 -13
  491. package/src/op/types.ts +84 -24
  492. package/src/ownership.ts +1 -1
  493. package/src/provenance.test.ts +6 -0
  494. package/src/provenance.ts +21 -1
  495. package/src/serializer-walker.test.ts +42 -0
  496. package/src/serializer-walker.ts +21 -2
  497. package/src/stack-output.ts +6 -1
  498. package/dist/cli/handlers/op-progress.d.ts +0 -90
  499. package/dist/cli/handlers/op-progress.d.ts.map +0 -1
  500. package/dist/cli/handlers/run-client.d.ts +0 -127
  501. package/dist/cli/handlers/run-client.d.ts.map +0 -1
  502. package/dist/cli/handlers/run-report.d.ts +0 -5
  503. package/dist/cli/handlers/run-report.d.ts.map +0 -1
  504. package/dist/components/temporal-codegen-loader.d.ts +0 -27
  505. package/dist/components/temporal-codegen-loader.d.ts.map +0 -1
  506. package/dist/lint/rules/comp/comp004-gate-needs-temporal.d.ts +0 -37
  507. package/dist/lint/rules/comp/comp004-gate-needs-temporal.d.ts.map +0 -1
  508. package/src/cli/handlers/op-progress.test.ts +0 -268
  509. package/src/cli/handlers/op-progress.ts +0 -248
  510. package/src/cli/handlers/run-client.test.ts +0 -82
  511. package/src/cli/handlers/run-client.ts +0 -219
  512. package/src/cli/handlers/run-report.test.ts +0 -62
  513. package/src/cli/handlers/run-report.ts +0 -122
  514. package/src/components/temporal-codegen-loader.ts +0 -41
  515. package/src/lint/rules/comp/comp004-gate-needs-temporal.ts +0 -66
@@ -11,7 +11,10 @@ const loadChantConfigMock = vi.fn();
11
11
  const readLeaseMock = vi.fn();
12
12
  const readConvergeLedgerMock = vi.fn();
13
13
  const appendGateResolutionMock = vi.fn();
14
+ const appendPendingGateMock = vi.fn();
14
15
  const readGateResolutionsMock = vi.fn();
16
+ const readGateLedgerMock = vi.fn();
17
+ const readRunLedgerMock = vi.fn();
15
18
  const pushLifecycleMock = vi.fn();
16
19
 
17
20
  vi.mock("../../op/operator", async () => {
@@ -40,12 +43,18 @@ vi.mock("../../lifecycle/converge-ledger", async () => {
40
43
  const actual = await vi.importActual<typeof import("../../lifecycle/converge-ledger")>("../../lifecycle/converge-ledger");
41
44
  return { ...actual, readConvergeLedger: (...args: unknown[]) => readConvergeLedgerMock(...args) };
42
45
  });
46
+ vi.mock("../../lifecycle/run-ledger", async () => {
47
+ const actual = await vi.importActual<typeof import("../../lifecycle/run-ledger")>("../../lifecycle/run-ledger");
48
+ return { ...actual, readRunLedger: (...args: unknown[]) => readRunLedgerMock(...args) };
49
+ });
43
50
  vi.mock("../../lifecycle/gate-ledger", async () => {
44
51
  const actual = await vi.importActual<typeof import("../../lifecycle/gate-ledger")>("../../lifecycle/gate-ledger");
45
52
  return {
46
53
  ...actual,
47
54
  appendGateResolution: (...args: unknown[]) => appendGateResolutionMock(...args),
55
+ appendPendingGate: (...args: unknown[]) => appendPendingGateMock(...args),
48
56
  readGateResolutions: (...args: unknown[]) => readGateResolutionsMock(...args),
57
+ readGateLedger: (...args: unknown[]) => readGateLedgerMock(...args),
49
58
  };
50
59
  });
51
60
  vi.mock("../../lifecycle/git", async () => {
@@ -71,6 +80,8 @@ beforeEach(() => {
71
80
  loadProfilesMock.mockResolvedValue({});
72
81
  discoverOpsMock.mockResolvedValue({ ops: new Map([["fountain-apply", {}]]), errors: [] });
73
82
  pushLifecycleMock.mockResolvedValue(true);
83
+ readGateResolutionsMock.mockResolvedValue({ records: [], malformed: 0 });
84
+ readGateLedgerMock.mockResolvedValue({ resolutions: [], pending: [], malformed: 0 });
74
85
  });
75
86
 
76
87
  describe("runOperator", () => {
@@ -84,7 +95,7 @@ describe("runOperator", () => {
84
95
 
85
96
  test("--once runs exactly one round and exits 0 when nothing failed", async () => {
86
97
  discoverConvergeOpsMock.mockResolvedValue({ ops: [{ config: { name: "staging-converge" } }], errors: [] });
87
- runOperatorRoundMock.mockResolvedValue([{ kind: "ticked", op: "staging-converge", env: "staging", result: { op: "staging-converge", records: [], totalMs: 1, ok: true } }]);
98
+ runOperatorRoundMock.mockResolvedValue([{ kind: "ticked", op: "staging-converge", env: "staging", result: { op: "staging-converge", records: [], totalMs: 1, status: "ok", startedAt: "2026-01-01T00:00:00.000Z" } }]);
88
99
 
89
100
  const code = await runOperator(ctx({ once: true }));
90
101
  expect(code).toBe(0);
@@ -147,7 +158,7 @@ describe("runOperatorStatus", () => {
147
158
 
148
159
  test("--json emits one row per discovered ConvergeOp with last tick, lease, and pending gates", async () => {
149
160
  discoverConvergeOpsMock.mockResolvedValue({
150
- ops: [{ config: { name: "staging-converge", searchAttributes: { Env: "staging" } } }],
161
+ ops: [{ config: { name: "staging-converge", labels: { Env: "staging" } } }],
151
162
  errors: [],
152
163
  });
153
164
  readConvergeLedgerMock.mockResolvedValue({
@@ -185,7 +196,7 @@ describe("runOperatorStatus", () => {
185
196
  // and the only affordance a renderer could offer was a shell command.
186
197
  test("a gated outcome's approval url rides onto the pending-gate row", async () => {
187
198
  discoverConvergeOpsMock.mockResolvedValue({
188
- ops: [{ config: { name: "staging-converge", searchAttributes: { Env: "staging" } } }],
199
+ ops: [{ config: { name: "staging-converge", labels: { Env: "staging" } } }],
189
200
  errors: [],
190
201
  });
191
202
  readConvergeLedgerMock.mockResolvedValue({
@@ -223,7 +234,7 @@ describe("runOperatorStatus", () => {
223
234
 
224
235
  test("the human render prints the address under the pending gate", async () => {
225
236
  discoverConvergeOpsMock.mockResolvedValue({
226
- ops: [{ config: { name: "staging-converge", searchAttributes: { Env: "staging" } } }],
237
+ ops: [{ config: { name: "staging-converge", labels: { Env: "staging" } } }],
227
238
  errors: [],
228
239
  });
229
240
  readConvergeLedgerMock.mockResolvedValue({
@@ -253,7 +264,7 @@ describe("runOperatorStatus", () => {
253
264
 
254
265
  test("a gate resolved after the tick that recorded it is no longer pending", async () => {
255
266
  discoverConvergeOpsMock.mockResolvedValue({
256
- ops: [{ config: { name: "staging-converge", searchAttributes: { Env: "staging" } } }],
267
+ ops: [{ config: { name: "staging-converge", labels: { Env: "staging" } } }],
257
268
  errors: [],
258
269
  });
259
270
  readConvergeLedgerMock.mockResolvedValue({
@@ -283,6 +294,51 @@ describe("runOperatorStatus", () => {
283
294
  expect(printed[0].pendingGates).toEqual([]);
284
295
  logSpy.mockRestore();
285
296
  });
297
+ // #2119 — a gate a plain `chant run <op>` stopped at is a pending fact on
298
+ // that op's own ledger, with no converge tick anywhere behind it.
299
+ test("lists a pending fact for a non-converge op", async () => {
300
+ discoverConvergeOpsMock.mockResolvedValue({ ops: [], errors: [] });
301
+ discoverOpsMock.mockResolvedValue({ ops: new Map([["prod-apply", {}]]), errors: [] });
302
+ readGateLedgerMock.mockResolvedValue({
303
+ resolutions: [],
304
+ pending: [{
305
+ version: 1, kind: "pending", op: "prod-apply", gate: "rollout-gate",
306
+ description: "release manager signs off",
307
+ timestamp: "2026-01-01T00:00:00.000Z", expiresAt: "2099-01-01T00:00:00.000Z",
308
+ url: "https://pr.example/9",
309
+ }],
310
+ malformed: 0,
311
+ });
312
+
313
+ const logSpy = vi.spyOn(console, "log").mockImplementation(() => undefined);
314
+ expect(await runOperatorStatus(ctx({}))).toBe(0);
315
+ const out = logSpy.mock.calls.map((c) => String(c[0])).join("\n");
316
+ expect(out).toContain("pending gates (no converge tick)");
317
+ expect(out).toContain("chant approve prod-apply rollout-gate");
318
+ expect(out).toContain("expires: 2099-01-01T00:00:00.000Z");
319
+ expect(out).toContain("approve at: https://pr.example/9");
320
+ logSpy.mockRestore();
321
+ });
322
+
323
+ test("an expired pending fact is not listed", async () => {
324
+ discoverConvergeOpsMock.mockResolvedValue({ ops: [], errors: [] });
325
+ discoverOpsMock.mockResolvedValue({ ops: new Map([["prod-apply", {}]]), errors: [] });
326
+ readGateLedgerMock.mockResolvedValue({
327
+ resolutions: [],
328
+ pending: [{
329
+ version: 1, kind: "pending", op: "prod-apply", gate: "rollout-gate",
330
+ timestamp: "2026-01-01T00:00:00.000Z", expiresAt: "2026-01-03T00:00:00.000Z",
331
+ }],
332
+ malformed: 0,
333
+ });
334
+
335
+ const errSpy = vi.spyOn(console, "error").mockImplementation(() => undefined);
336
+ const logSpy = vi.spyOn(console, "log").mockImplementation(() => undefined);
337
+ expect(await runOperatorStatus(ctx({}))).toBe(0);
338
+ expect(logSpy.mock.calls.map((c) => String(c[0])).join("\n")).not.toContain("pending gates");
339
+ logSpy.mockRestore();
340
+ errSpy.mockRestore();
341
+ });
286
342
  });
287
343
 
288
344
  describe("runApprove", () => {
@@ -310,6 +366,30 @@ describe("runApprove", () => {
310
366
  errSpy.mockRestore();
311
367
  });
312
368
 
369
+ // #2192 — every example README teaches `--approver you`; the handler read
370
+ // only `--actor` and fell through to $GITHUB_ACTOR / $USER, so the ledger
371
+ // recorded the shell user. Same precedence as `chant run approve`.
372
+ test("--approver wins over --actor and over the CI/shell identity", async () => {
373
+ vi.stubEnv("GITHUB_ACTOR", "ci-bot");
374
+ vi.stubEnv("USER", "alex");
375
+ appendGateResolutionMock.mockResolvedValue({
376
+ commit: "sha",
377
+ record: { version: 1, op: "deploy-gated", gate: "approve-deploy", resolvedBy: "you", timestamp: "2026-01-01T00:00:00.000Z" },
378
+ });
379
+ const errSpy = vi.spyOn(console, "error").mockImplementation(() => undefined);
380
+
381
+ const code = await runApprove(ctx({
382
+ path: "deploy-gated", extraPositional: "approve-deploy", approver: "you", actor: "alex",
383
+ }));
384
+
385
+ expect(code).toBe(0);
386
+ expect(appendGateResolutionMock).toHaveBeenCalledWith(
387
+ expect.objectContaining({ op: "deploy-gated", gate: "approve-deploy", resolvedBy: "you" }),
388
+ );
389
+ errSpy.mockRestore();
390
+ vi.unstubAllEnvs();
391
+ });
392
+
313
393
  // #2028 — the resolution's link is typed, so a reader is not sniffing
314
394
  // free-text `note` for something that looks like a URL.
315
395
  test("--url is recorded typed, alongside --note's prose", async () => {
@@ -361,6 +441,43 @@ describe("runApprove", () => {
361
441
  errSpy.mockRestore();
362
442
  });
363
443
 
444
+ // #2119 — `--expire` clears a standing pending fact without approving it.
445
+ test("--expire supersedes the standing pending fact and writes no resolution", async () => {
446
+ readGateLedgerMock.mockResolvedValue({
447
+ resolutions: [],
448
+ pending: [{
449
+ version: 1, kind: "pending", op: "fountain-apply", gate: "rollout-gate",
450
+ description: "release manager signs off",
451
+ timestamp: "2026-01-01T00:00:00.000Z", expiresAt: "2099-01-01T00:00:00.000Z",
452
+ }],
453
+ malformed: 0,
454
+ });
455
+ appendPendingGateMock.mockResolvedValue({ commit: "sha", record: {} });
456
+ const errSpy = vi.spyOn(console, "error").mockImplementation(() => undefined);
457
+
458
+ const code = await runApprove(ctx({ path: "fountain-apply", extraPositional: "rollout-gate", expire: true }));
459
+
460
+ expect(code).toBe(0);
461
+ expect(appendGateResolutionMock).not.toHaveBeenCalled();
462
+ const written = appendPendingGateMock.mock.calls[0][0];
463
+ expect(written.op).toBe("fountain-apply");
464
+ expect(written.gate).toBe("rollout-gate");
465
+ expect(written.description).toBe("release manager signs off");
466
+ // Already expired the moment it is written: the next run re-decides.
467
+ expect(written.expiresAt).toBe(written.timestamp);
468
+ expect(pushLifecycleMock).toHaveBeenCalled();
469
+ errSpy.mockRestore();
470
+ });
471
+
472
+ test("--expire with nothing standing writes nothing and still exits 0", async () => {
473
+ const errSpy = vi.spyOn(console, "error").mockImplementation(() => undefined);
474
+ const code = await runApprove(ctx({ path: "fountain-apply", extraPositional: "rollout-gate", expire: true }));
475
+ expect(code).toBe(0);
476
+ expect(appendPendingGateMock).not.toHaveBeenCalled();
477
+ expect(appendGateResolutionMock).not.toHaveBeenCalled();
478
+ errSpy.mockRestore();
479
+ });
480
+
364
481
  test("warns (but still records) when the op isn't among discovered *.op.ts declarations", async () => {
365
482
  discoverOpsMock.mockResolvedValue({ ops: new Map(), errors: [] });
366
483
  appendGateResolutionMock.mockResolvedValue({
@@ -396,10 +513,65 @@ describe("runOperatorLog", () => {
396
513
 
397
514
  beforeEach(() => {
398
515
  discoverConvergeOpsMock.mockResolvedValue({
399
- ops: [{ config: { name: "staging-converge", searchAttributes: { Env: "staging" } } }],
516
+ ops: [{ config: { name: "staging-converge", labels: { Env: "staging" } } }],
400
517
  errors: [],
401
518
  });
402
519
  readGateResolutionsMock.mockResolvedValue({ records: [], malformed: 0 });
520
+ readRunLedgerMock.mockResolvedValue({ records: [], malformed: 0 });
521
+ });
522
+
523
+ /** One Op-run record (#2118) as `readRunLedger` returns it. */
524
+ function run(over: Record<string, unknown> = {}) {
525
+ return {
526
+ version: 1,
527
+ id: "99999999-8888-7777-6666-555555555555",
528
+ op: "staging-converge",
529
+ env: "staging",
530
+ started: "2026-01-01T00:29:00.000Z",
531
+ ended: "2026-01-01T00:30:00.000Z",
532
+ status: "ok",
533
+ labels: { Converge: "true", Env: "staging" },
534
+ outcomes: { Drift: false },
535
+ phases: [{ name: "Converge", status: "ok", steps: [{ fn: "convergeTick", status: "ok", durationMs: 60_000 }] }],
536
+ ...over,
537
+ };
538
+ }
539
+
540
+ test("run records are merged into the timeline, ordered by the instant they ended (#2118)", async () => {
541
+ readConvergeLedgerMock.mockResolvedValue({
542
+ records: [
543
+ tick({ id: "t1", timestamp: "2026-01-01T00:00:00.000Z" }),
544
+ tick({ id: "t2", timestamp: "2026-01-01T01:00:00.000Z" }),
545
+ ],
546
+ malformed: 0,
547
+ });
548
+ readRunLedgerMock.mockResolvedValue({ records: [run({ id: "r1" })], malformed: 0 });
549
+
550
+ const logSpy = vi.spyOn(console, "log").mockImplementation(() => undefined);
551
+ expect(await runOperatorLog(ctx({ json: true }))).toBe(0);
552
+
553
+ const printed = JSON.parse(logSpy.mock.calls[0][0] as string);
554
+ expect(printed.entries.map((e: { kind: string; record: { id: string } }) => [e.kind, e.record.id])).toEqual([
555
+ ["tick", "t1"],
556
+ ["run", "r1"],
557
+ ["tick", "t2"],
558
+ ]);
559
+ expect(readRunLedgerMock).toHaveBeenCalledWith("staging", "staging-converge", expect.anything());
560
+ logSpy.mockRestore();
561
+ });
562
+
563
+ test("a run renders one line naming its status and captured outcomes", async () => {
564
+ readConvergeLedgerMock.mockResolvedValue({ records: [], malformed: 0 });
565
+ readRunLedgerMock.mockResolvedValue({ records: [run({ id: "r1", status: "gated" })], malformed: 0 });
566
+
567
+ const logSpy = vi.spyOn(console, "log").mockImplementation(() => undefined);
568
+ expect(await runOperatorLog(ctx({}))).toBe(0);
569
+
570
+ const out = logSpy.mock.calls.map((c) => String(c[0])).join("\n");
571
+ expect(out).toContain("staging-converge@staging");
572
+ expect(out).toContain("run gated phases=1 steps=1");
573
+ expect(out).toContain("Drift=false");
574
+ logSpy.mockRestore();
403
575
  });
404
576
 
405
577
  test("--json emits the whole tick history, not just the newest row", async () => {
@@ -416,7 +588,7 @@ describe("runOperatorLog", () => {
416
588
 
417
589
  const printed = JSON.parse(logSpy.mock.calls[0][0] as string);
418
590
  expect(printed.entries.map((e: { record: { id: string } }) => e.record.id)).toEqual(["t1", "t2", "t3"]);
419
- expect(printed.malformed).toEqual({ converge: 0, gates: 0 });
591
+ expect(printed.malformed).toEqual({ converge: 0, gates: 0, runs: 0 });
420
592
  logSpy.mockRestore();
421
593
  });
422
594
 
@@ -488,8 +660,8 @@ describe("runOperatorLog", () => {
488
660
  test("--op restricts to one ConvergeOp", async () => {
489
661
  discoverConvergeOpsMock.mockResolvedValue({
490
662
  ops: [
491
- { config: { name: "staging-converge", searchAttributes: { Env: "staging" } } },
492
- { config: { name: "other-converge", searchAttributes: { Env: "staging" } } },
663
+ { config: { name: "staging-converge", labels: { Env: "staging" } } },
664
+ { config: { name: "other-converge", labels: { Env: "staging" } } },
493
665
  ],
494
666
  errors: [],
495
667
  });
@@ -507,8 +679,8 @@ describe("runOperatorLog", () => {
507
679
  test("two ConvergeOps sharing one environment read that ledger once", async () => {
508
680
  discoverConvergeOpsMock.mockResolvedValue({
509
681
  ops: [
510
- { config: { name: "staging-converge", searchAttributes: { Env: "staging" } } },
511
- { config: { name: "other-converge", searchAttributes: { Env: "staging" } } },
682
+ { config: { name: "staging-converge", labels: { Env: "staging" } } },
683
+ { config: { name: "other-converge", labels: { Env: "staging" } } },
512
684
  ],
513
685
  errors: [],
514
686
  });