@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
@@ -25,6 +25,8 @@ export type { ReleaseRollbackPlanArgs, ReleaseRollbackPlanResult, ReleaseRollbac
25
25
  export type { HttpCheckArgs, HttpFetch } from "./http-check";
26
26
 
27
27
  export { lifecycleSnapshot, lifecycleDiff } from "./lifecycle";
28
+ export { composeChangeSet, lifecyclePlanChangeSet, readChangeSetPart } from "./change-set";
29
+ export type { ComposeChangeSetArgs, ComposeChangeSetResult, LifecyclePlanChangeSetArgs, ReadChangeSetPartArgs, ChangeSetPartResult } from "./change-set";
28
30
  export type { LifecycleSnapshotArgs, LifecycleDiffArgs, LifecycleDiffResult } from "./lifecycle";
29
31
 
30
32
  export { chantTeardown } from "./teardown";
@@ -70,6 +72,9 @@ export type {
70
72
  AzureApplier,
71
73
  GcpApplier,
72
74
  FlyApplier,
75
+ GrafanaApplier,
76
+ ClickHouseApplier,
77
+ PostgresApplier,
73
78
  AwsApplier,
74
79
  AwsRollback,
75
80
  } from "./apply";
@@ -178,3 +183,7 @@ export type { ChangeCoverageArgs, ChangeCoverageResult } from "./change-coverage
178
183
  // loads the workspace code on first call.
179
184
  export { decide } from "./decide";
180
185
  export type { DecideArgs, DecideResult } from "./decide";
186
+
187
+ // The factory reference Op's rules and hooks (#3406, ws-087): `factoryOp` in ../factory.ts declares them.
188
+ export { factoryPick, factoryReady, factoryAsk, factoryBuild, factoryCheck, factoryRecord } from "./factory";
189
+ export type { FactoryAskResult, FactoryBuildResult, FactoryCheckResult, FactoryRecordResult, FactoryPickResult, FactoryLease } from "./factory";
@@ -18,23 +18,37 @@ import type { UpgradeCheckResult } from "../../codegen/pinned-upgrade";
18
18
  import type { RollingUpgradeResult } from "../../codegen/rolling-upgrade";
19
19
  import { tmpdir } from "node:os";
20
20
  import { join } from "node:path";
21
- import { writeFileSync, readFileSync } from "node:fs";
21
+ import { writeFileSync, readFileSync, mkdirSync } from "node:fs";
22
22
 
23
23
  // ── Classification ────────────────────────────────────────────────────
24
24
 
25
25
  describe("pinned vs rolling classification", () => {
26
- test("pinned lexicons", () => {
27
- for (const l of ["k8s", "gcp", "docker", "gitlab"] as const) {
28
- expect(isPinned(l)).toBe(true);
26
+ const pin = {
27
+ file: "src/pin.ts",
28
+ pattern: /V = "(.+)"/,
29
+ replace: (v: string) => `V = "${v}"`,
30
+ upstream: { owner: "o", repo: "r", kind: "releases" as const },
31
+ };
32
+
33
+ test("pinned lexicons are any whose plugin declares upstreamPin", async () => {
34
+ const loadPin = vi.fn(async () => pin);
35
+ for (const l of ["k8s", "gcp", "docker", "gitlab", "sql", "k3s", "cedar"]) {
36
+ expect(await isPinned(l, "/x", loadPin)).toBe(true);
29
37
  expect(isRolling(l)).toBe(false);
30
38
  }
31
39
  });
32
40
 
33
- test("rolling lexicons", () => {
41
+ test("a lexicon without a pin is not pinned", async () => {
42
+ expect(await isPinned("helm", "/x", async () => null)).toBe(false);
43
+ });
44
+
45
+ test("rolling lexicons", async () => {
46
+ const loadPin = vi.fn(async () => null);
34
47
  for (const l of ["aws", "azure", "github"] as const) {
35
48
  expect(isRolling(l)).toBe(true);
36
- expect(isPinned(l)).toBe(false);
49
+ expect(await isPinned(l, "/x", loadPin)).toBe(false);
37
50
  }
51
+ expect(loadPin).not.toHaveBeenCalled();
38
52
  });
39
53
  });
40
54
 
@@ -389,6 +403,86 @@ describe("lexiconUpgrade breakage handling", () => {
389
403
 
390
404
  // ── out-of-scope rejection ────────────────────────────────────────────
391
405
 
406
+ describe("discovered pinned lexicons (#3266)", () => {
407
+ const pin = {
408
+ file: "src/pin.ts",
409
+ pattern: /V = "(.+)"/,
410
+ replace: (v: string) => `V = "${v}"`,
411
+ upstream: { owner: "o", repo: "r", kind: "releases" as const },
412
+ };
413
+
414
+ test("a lexicon with a declared pin reaches the pinned check and opens a PR", async () => {
415
+ const checkPinned: CheckPinnedFn = vi.fn(async () => pinnedResult());
416
+ const applyBump = vi.fn(async () => ({ filePath: "/x/src/pin.ts" }));
417
+ const { gh } = recordingGh();
418
+ const dir = join(tmpdir(), `chant-3266-${process.pid}`);
419
+ mkdirSync(dir, { recursive: true });
420
+ writeFileSync(join(dir, "package.json"), JSON.stringify({ version: "0.1.0" }));
421
+ const r = await lexiconUpgrade({
422
+ lexicon: "k3s",
423
+ lexiconDir: dir,
424
+ mode: "pull-request",
425
+ _loadPin: async () => pin,
426
+ _checkPinned: checkPinned,
427
+ _applyBump: applyBump,
428
+ _bumpPackageVersion: vi.fn(),
429
+ _gh: gh,
430
+ });
431
+ expect(checkPinned).toHaveBeenCalledOnce();
432
+ expect(applyBump).toHaveBeenCalledWith("k3s", dir, "v1.33.0");
433
+ expect(r.hasUpgrade).toBe(true);
434
+ });
435
+
436
+ test("a lexicon with no pin and not rolling is rejected", async () => {
437
+ await expect(
438
+ lexiconUpgrade({ lexicon: "helm", mode: "report", _loadPin: async () => null }),
439
+ ).rejects.toThrow(/not supported/);
440
+ });
441
+
442
+ test("a discovered pin reaches the real check when none is injected", async () => {
443
+ const loadPin = vi.fn(async () => pin);
444
+ // The real checkPinnedUpgrade loads the pin itself; an empty dir has no
445
+ // plugin, so it reports the fetch error rather than throwing "not supported".
446
+ const r = await lexiconUpgrade({
447
+ lexicon: "sql",
448
+ lexiconDir: join(tmpdir(), "chant-3266-none"),
449
+ mode: "report",
450
+ _loadPin: loadPin,
451
+ });
452
+ expect(loadPin).toHaveBeenCalledOnce();
453
+ expect(r.validationOk).toBe(false);
454
+ });
455
+
456
+ test("an alsoMoves pin is report-only: newer version and manual step, no bump, no git", async () => {
457
+ const manual = pinnedResult({
458
+ validation: null,
459
+ from: "25.8.1.1-lts",
460
+ to: "26.3.1.1-lts",
461
+ manualPin: { file: "src/spec/pin.ts", instructions: "move CLICKHOUSE_IMAGE_DIGEST too" },
462
+ });
463
+ const applyBump = vi.fn();
464
+ const { gh, calls } = recordingGh();
465
+ for (const mode of ["report", "issue", "pull-request"] as const) {
466
+ const r = await lexiconUpgrade({
467
+ lexicon: "sql",
468
+ mode,
469
+ _checkPinned: vi.fn(async () => manual),
470
+ _applyBump: applyBump,
471
+ _gh: gh,
472
+ });
473
+ expect(r.hasUpgrade).toBe(true);
474
+ expect(r.mode).toBe("report");
475
+ expect(r.prUrl).toBeUndefined();
476
+ expect(r.issueUrl).toBeUndefined();
477
+ expect(r.summary).toContain("26.3.1.1-lts");
478
+ expect(r.summary).toContain("move CLICKHOUSE_IMAGE_DIGEST too");
479
+ expect(r.summary).toContain("src/spec/pin.ts");
480
+ }
481
+ expect(applyBump).not.toHaveBeenCalled();
482
+ expect(calls).toHaveLength(0);
483
+ });
484
+ });
485
+
392
486
  describe("out-of-scope lexicons", () => {
393
487
  test("helm/forgejo throw", async () => {
394
488
  for (const l of ["helm", "forgejo"]) {
@@ -585,3 +679,63 @@ describe("lexiconUpgrade pull-request mode: package.json version bump", () => {
585
679
  }
586
680
  });
587
681
  });
682
+
683
+ describe("a lexicon with several pins (#3288)", () => {
684
+ const manual = (pin: string, from: string, to: string): UpgradeCheckResult =>
685
+ pinnedResult({ pin, validation: null, from, to, manualPin: { file: "src/spec/postgres-pin.ts", instructions: `move the ${pin} digest too` } });
686
+ const current = (pin: string, v: string): UpgradeCheckResult => pinnedResult({ pin, validation: null, hasUpgrade: false, from: v, to: v });
687
+
688
+ test("every pin is reported; manual pins stay report-only in every mode", async () => {
689
+ const results = [current("clickhouse", "26.8.15.10"), manual("postgres-17", "17.11", "17.12"), manual("postgres-14", "14.24", "14.25")];
690
+ const applyBump = vi.fn();
691
+ const { gh, calls } = recordingGh();
692
+ for (const mode of ["report", "issue", "pull-request"] as const) {
693
+ const r = await lexiconUpgrade({ lexicon: "sql", mode, _checkPinned: vi.fn(async () => results), _applyBump: applyBump, _gh: gh });
694
+ expect(r.hasUpgrade).toBe(true);
695
+ expect(r.mode).toBe("report");
696
+ expect(r.summary).toContain("## Lexicon upgrade: sql (clickhouse)");
697
+ expect(r.summary).toContain("## Lexicon upgrade: sql (postgres-17)");
698
+ expect(r.summary).toContain("move the postgres-17 digest too");
699
+ expect(r.summary).toContain("move the postgres-14 digest too");
700
+ }
701
+ expect(applyBump).not.toHaveBeenCalled();
702
+ expect(calls).toHaveLength(0);
703
+ });
704
+
705
+ test("no pin has an upgrade: nothing to do", async () => {
706
+ const r = await lexiconUpgrade({
707
+ lexicon: "sql",
708
+ _checkPinned: vi.fn(async () => [current("clickhouse", "1.0"), current("postgres-18", "18.6")]),
709
+ });
710
+ expect(r.hasUpgrade).toBe(false);
711
+ expect(r.validationOk).toBe(true);
712
+ });
713
+
714
+ test("the pin label is forwarded to the check", async () => {
715
+ const check = vi.fn(async () => [current("postgres-16", "16.15")]);
716
+ await lexiconUpgrade({ lexicon: "sql", pin: "postgres-16", _checkPinned: check });
717
+ expect(check).toHaveBeenCalledWith(expect.objectContaining({ lexicon: "sql", pin: "postgres-16" }));
718
+ });
719
+
720
+ test("a rewritable pin leads: the PR branch, title and bump name the pin", async () => {
721
+ const results = [manual("clickhouse", "1.0", "2.0"), pinnedResult({ pin: "postgres-17", from: "17.11", to: "17.12" })];
722
+ const applyBump = vi.fn(async () => ({ filePath: "/x/pin.ts" }));
723
+ const { gh, calls } = recordingGh();
724
+ const dir = join(tmpdir(), `chant-3288-${process.pid}`);
725
+ mkdirSync(dir, { recursive: true });
726
+ writeFileSync(join(dir, "package.json"), JSON.stringify({ version: "0.1.0" }));
727
+ await lexiconUpgrade({
728
+ lexicon: "sql",
729
+ mode: "pull-request",
730
+ lexiconDir: dir,
731
+ _checkPinned: vi.fn(async () => results),
732
+ _applyBump: applyBump,
733
+ _bumpPackageVersion: vi.fn(() => "/x/package.json"),
734
+ _gh: gh,
735
+ });
736
+ expect(applyBump).toHaveBeenCalledWith("sql", dir, "17.12", "postgres-17");
737
+ expect(calls.some((c) => c.includes("lexicon-upgrade/sql-postgres-17"))).toBe(true);
738
+ expect(upgradeBranchName("sql", "postgres-17")).toBe("lexicon-upgrade/sql-postgres-17");
739
+ expect(upgradePrTitle("sql", "17.11", "17.12", "postgres-17")).toBe("feat(sql): upgrade postgres-17 17.11 to 17.12");
740
+ });
741
+ });
@@ -1,6 +1,8 @@
1
1
  /**
2
2
  * lexiconUpgrade — the upgrade-detection and PR-automation activity for
3
- * in-scope lexicons (k8s, gcp, docker, gitlab, aws, azure, github).
3
+ * in-scope lexicons: every lexicon whose plugin declares `upstreamPin` (k8s,
4
+ * k3s, gcp, docker, gitlab, cedar, sql, ...) plus the rolling ones (aws, azure,
5
+ * github, fly).
4
6
  *
5
7
  * Classifies the lexicon as pinned or rolling, calls the right check function,
6
8
  * then surfaces the result in the requested mode: report (default), issue, or
@@ -25,7 +27,7 @@ import { exec } from "node:child_process";
25
27
  import { promisify } from "node:util";
26
28
  import { readFileSync, writeFileSync } from "node:fs";
27
29
  import { join } from "node:path";
28
- import type { UpgradeCheckResult, LexiconId } from "../../codegen/pinned-upgrade";
30
+ import type { UpgradeCheckResult, LexiconId, UpstreamPin } from "../../codegen/pinned-upgrade";
29
31
  import type { RollingUpgradeResult, RollingLexicon } from "../../codegen/rolling-upgrade";
30
32
  import { bumpForSeverity, bumpPackageJsonVersion } from "../../codegen/version-bump";
31
33
  import { postOrUpdateGithubIssue } from "./reconcile";
@@ -48,8 +50,9 @@ export type SemverLabel = "minor" | "breaking";
48
50
  export interface LexiconUpgradeArgs {
49
51
  /**
50
52
  * Which lexicon to check. Determines pinned vs rolling dispatch:
51
- * PINNED: k8s, gcp, docker, gitlab, cedar
52
53
  * ROLLING: aws, azure, github, fly
54
+ * PINNED: any other lexicon whose plugin declares `upstreamPin`
55
+ * (discovered at run time, as `chant dev pinned-upgrade` does)
53
56
  */
54
57
  lexicon: SupportedLexicon;
55
58
  /**
@@ -57,11 +60,17 @@ export interface LexiconUpgradeArgs {
57
60
  * Defaults to `<cwd>/lexicons/<lexicon>`.
58
61
  */
59
62
  lexiconDir?: string;
63
+ /**
64
+ * Label of one pin to check, for a lexicon whose plugin declares several
65
+ * (`upstreamPins`). Omitted, every pin is checked and reported.
66
+ */
67
+ pin?: string;
60
68
  /** What to produce. Default: "report". */
61
69
  mode?: LexiconUpgradeMode;
62
70
  /**
63
- * Override the pinned check function — inject a mock in tests.
64
- * The real implementation calls checkPinnedUpgrade from core.
71
+ * Override the pinned check function — inject a mock in tests. It may
72
+ * return one result or one per pin.
73
+ * The real implementation calls checkPinnedUpgrades from core.
65
74
  */
66
75
  _checkPinned?: CheckPinnedFn;
67
76
  /**
@@ -77,6 +86,13 @@ export interface LexiconUpgradeArgs {
77
86
  * Override the applyPinnedVersionBump function — inject a mock in tests.
78
87
  */
79
88
  _applyBump?: ApplyBumpFn;
89
+ /**
90
+ * Override pin discovery — inject a mock in tests. The real one is
91
+ * `loadUpstreamPin` from core, the loader `chant dev pinned-upgrade` uses.
92
+ * Not consulted when `_checkPinned` is injected: that stands in for the
93
+ * whole pinned check.
94
+ */
95
+ _loadPin?: (lexicon: string, lexiconDir: string) => Promise<UpstreamPin | null>;
80
96
  /**
81
97
  * Override the package.json version writer — inject a mock in tests.
82
98
  * Defaults to bumpPackageJsonVersion.
@@ -109,9 +125,11 @@ export interface LexiconUpgradeResult {
109
125
  export type CheckPinnedFn = (opts: {
110
126
  lexiconDir: string;
111
127
  lexicon: LexiconId;
128
+ /** One pin's label; omitted, every pin of the plugin. */
129
+ pin?: string;
112
130
  force?: boolean;
113
131
  verbose?: boolean;
114
- }) => Promise<UpgradeCheckResult>;
132
+ }) => Promise<UpgradeCheckResult | UpgradeCheckResult[]>;
115
133
 
116
134
  /** Matches checkRollingUpgrade from core. */
117
135
  export type CheckRollingFn = (opts: {
@@ -141,6 +159,7 @@ export type ApplyBumpFn = (
141
159
  lexicon: LexiconId,
142
160
  lexiconDir: string,
143
161
  newVersion: string,
162
+ pin?: string,
144
163
  ) => { filePath: string } | Promise<{ filePath: string }>;
145
164
 
146
165
  /**
@@ -177,21 +196,32 @@ export function computeBumpedVersion(
177
196
 
178
197
  // ── Classification ────────────────────────────────────────────────────
179
198
 
180
- // cedar pins `CEDAR_WASM_VERSION`, a dependency version rather than a spec
181
- // URL, but the pinned-constant machinery is the same (#1650).
182
- const PINNED_LEXICONS: ReadonlySet<string> = new Set<LexiconId>(["k8s", "gcp", "docker", "gitlab", "cedar"]);
199
+ // Rolling lexicons follow their upstream spec with no version constant, so
200
+ // they are a fixed list. Every other lexicon is pinned when its plugin declares
201
+ // `upstreamPin` (cedar's CEDAR_WASM_VERSION, sql's ClickHouse version, k3s...):
202
+ // discovered at run time, not listed here.
183
203
  const ROLLING_LEXICONS: ReadonlySet<string> = new Set<RollingLexicon>(["aws", "azure", "github", "fly"]);
184
204
 
185
- /** Return true when the lexicon uses a pinned version constant. */
186
- export function isPinned(lexicon: SupportedLexicon): lexicon is LexiconId {
187
- return PINNED_LEXICONS.has(lexicon);
188
- }
189
-
190
205
  /** Return true when the lexicon follows a rolling spec (no pinned constant). */
191
206
  export function isRolling(lexicon: SupportedLexicon): lexicon is RollingLexicon {
192
207
  return ROLLING_LEXICONS.has(lexicon);
193
208
  }
194
209
 
210
+ /**
211
+ * Return true when the lexicon's plugin declares an `upstreamPin` (loaded from
212
+ * `lexiconDir`, else from its installed package), the same discovery
213
+ * `chant dev pinned-upgrade` does.
214
+ */
215
+ export async function isPinned(
216
+ lexicon: SupportedLexicon,
217
+ lexiconDir?: string,
218
+ loadPin?: (lexicon: string, lexiconDir: string) => Promise<UpstreamPin | null>,
219
+ ): Promise<boolean> {
220
+ if (isRolling(lexicon)) return false;
221
+ const load = loadPin ?? (async (l, d) => (await import("../../codegen/pinned-upgrade")).loadUpstreamPin(l, d));
222
+ return (await load(lexicon, lexiconDir ?? `${process.cwd()}/lexicons/${lexicon}`)) !== null;
223
+ }
224
+
195
225
  // ── Semver labeling ───────────────────────────────────────────────────
196
226
 
197
227
  /**
@@ -210,8 +240,8 @@ export function severityToLabel(severity: string): SemverLabel | null {
210
240
  // ── Branch / PR naming ────────────────────────────────────────────────
211
241
 
212
242
  /** Long-lived branch name for a lexicon upgrade PR. */
213
- export function upgradeBranchName(lexicon: SupportedLexicon): string {
214
- return `lexicon-upgrade/${lexicon}`;
243
+ export function upgradeBranchName(lexicon: SupportedLexicon, pin?: string): string {
244
+ return pin ? `lexicon-upgrade/${lexicon}-${pin}` : `lexicon-upgrade/${lexicon}`;
215
245
  }
216
246
 
217
247
  /** PR title for an upgrade. */
@@ -219,8 +249,9 @@ export function upgradePrTitle(
219
249
  lexicon: SupportedLexicon,
220
250
  from?: string,
221
251
  to?: string | null,
252
+ pin?: string,
222
253
  ): string {
223
- if (from && to) return `feat(${lexicon}): upgrade spec ${from} to ${to}`;
254
+ if (from && to) return `feat(${lexicon}): upgrade ${pin ? `${pin} ` : "spec "}${from} to ${to}`;
224
255
  return `feat(${lexicon}): upgrade to latest spec`;
225
256
  }
226
257
 
@@ -229,14 +260,18 @@ export function upgradePrTitle(
229
260
  /** Build the PR/issue/report body from the upgrade result data. */
230
261
  export function buildUpgradeSummary(opts: {
231
262
  lexicon: SupportedLexicon;
263
+ /** The pin's label, for a lexicon with several pins. */
264
+ pin?: string;
232
265
  from?: string;
233
266
  to?: string | null;
234
267
  deltaText: string;
235
268
  semverLabel: SemverLabel | null;
236
269
  validationOk: boolean;
237
270
  failures?: Array<{ step: string; output: string }>;
271
+ /** Set for a pin that moves with other constants: nothing was bumped or regenerated. */
272
+ manualPin?: { file: string; instructions: string };
238
273
  }): string {
239
- const { lexicon, from, to, deltaText, semverLabel, validationOk, failures = [] } = opts;
274
+ const { lexicon, from, to, deltaText, semverLabel, validationOk, failures = [], manualPin } = opts;
240
275
 
241
276
  // Example validation status (#604): the upgrade check lints the lexicon's
242
277
  // examples (regenLexicon step 6), and an example failure makes validation
@@ -246,7 +281,7 @@ export function buildUpgradeSummary(opts: {
246
281
  // for rolling lexicons.)
247
282
  const exampleFailures = failures.filter((f) => f.step === "lint" || f.step === "examples");
248
283
 
249
- const lines: string[] = [`## Lexicon upgrade: ${lexicon}`];
284
+ const lines: string[] = [`## Lexicon upgrade: ${lexicon}${opts.pin ? ` (${opts.pin})` : ""}`];
250
285
  if (from) lines.push(``, `**From:** \`${from}\` **To:** \`${to ?? "latest"}\``);
251
286
  if (semverLabel) lines.push(`**Semver label:** \`${semverLabel}\``);
252
287
  lines.push(
@@ -257,6 +292,17 @@ export function buildUpgradeSummary(opts: {
257
292
 
258
293
  lines.push(``);
259
294
 
295
+ if (manualPin) {
296
+ lines.push(`### Manual pin bump`);
297
+ lines.push(``);
298
+ lines.push(
299
+ `This pin cannot be rewritten automatically, so nothing was edited or regenerated. ` +
300
+ `Edit \`${manualPin.file}\`: ${manualPin.instructions}`,
301
+ );
302
+ lines.push(``);
303
+ return lines.join("\n");
304
+ }
305
+
260
306
  if (!validationOk) {
261
307
  lines.push(`### Validation failures`);
262
308
  lines.push(``);
@@ -403,7 +449,7 @@ let _realApplyBump: ApplyBumpFn | null = null;
403
449
  async function getRealCheckPinned(): Promise<CheckPinnedFn> {
404
450
  if (!_realCheckPinned) {
405
451
  const mod = await import("../../codegen/pinned-upgrade");
406
- _realCheckPinned = (opts) => mod.checkPinnedUpgrade(opts);
452
+ _realCheckPinned = (opts) => mod.checkPinnedUpgrades(opts);
407
453
  }
408
454
  return _realCheckPinned;
409
455
  }
@@ -419,8 +465,8 @@ async function getRealCheckRolling(): Promise<CheckRollingFn> {
419
465
  async function getRealApplyBump(): Promise<ApplyBumpFn> {
420
466
  if (!_realApplyBump) {
421
467
  const mod = await import("../../codegen/pinned-upgrade");
422
- _realApplyBump = (lexicon, lexiconDir, newVersion) =>
423
- mod.applyPinnedVersionBump(lexicon, lexiconDir, newVersion);
468
+ _realApplyBump = (lexicon, lexiconDir, newVersion, pin) =>
469
+ mod.applyPinnedVersionBump(lexicon, lexiconDir, newVersion, pin);
424
470
  }
425
471
  return _realApplyBump;
426
472
  }
@@ -430,9 +476,12 @@ async function getRealApplyBump(): Promise<ApplyBumpFn> {
430
476
  /**
431
477
  * Run the lexicon upgrade check for one lexicon and surface the result.
432
478
  *
433
- * Pinned lexicons (k8s, gcp, docker, gitlab):
479
+ * Pinned lexicons (any whose plugin declares `upstreamPin`):
434
480
  * Calls checkPinnedUpgrade. A PR is opened only when hasUpgrade=true AND
435
481
  * validation passed. Validation failures produce a report or issue.
482
+ * A pin that moves with other constants (`alsoMoves`, sql's version plus
483
+ * digest) is report-only: the summary names the newer version and the
484
+ * manual step, and no branch, bump or PR is made.
436
485
  *
437
486
  * Rolling lexicons (aws, azure, github):
438
487
  * Calls checkRollingUpgrade. A PR is opened only when the surface changed
@@ -472,20 +521,65 @@ export async function lexiconUpgrade(args: LexiconUpgradeArgs): Promise<LexiconU
472
521
  let to: string | null | undefined;
473
522
  let freshSnapshotJson: string | null = null;
474
523
 
475
- if (isPinned(lexicon)) {
524
+ // An injected check stands in for the whole pinned check, so discovery runs
525
+ // only on the real path.
526
+ const pinned = !isRolling(lexicon) && (args._checkPinned ? true : await isPinned(lexicon, lexiconDir, args._loadPin));
527
+ let manualPin: { file: string; instructions: string } | undefined;
528
+
529
+ let pinLabel: string | undefined;
530
+ let summaryOverride: string | undefined;
531
+
532
+ if (pinned) {
476
533
  const checkPinned = args._checkPinned ?? (await getRealCheckPinned());
477
- const result = await checkPinned({ lexiconDir, lexicon });
534
+ const raw = await checkPinned({ lexiconDir, lexicon, ...(args.pin ? { pin: args.pin } : {}) });
535
+ const results = Array.isArray(raw) ? raw : [raw];
536
+ const multi = results.length > 1;
537
+
538
+ // The pin the rest of the flow (validation, bump, PR) acts on: the first
539
+ // one that has a rewritable upgrade, else the first with any finding.
540
+ // A pin with `alsoMoves` (manualPin) is report-only, so it never leads.
541
+ const rewritable = (r: UpgradeCheckResult) => r.hasUpgrade && !r.manualPin && !r.fetchError;
542
+ const result = results.find(rewritable) ?? results.find((r) => r.hasUpgrade || r.fetchError) ?? results[0]!;
543
+ if (multi) {
544
+ pinLabel = rewritable(result) ? result.pin : undefined;
545
+ const sections = results.map((r) =>
546
+ buildUpgradeSummary({
547
+ lexicon,
548
+ pin: r.pin,
549
+ from: r.from,
550
+ to: r.to,
551
+ deltaText: r.validation?.deltaText ?? "",
552
+ semverLabel: severityToLabel(r.validation?.severity ?? "none"),
553
+ validationOk: r.fetchError ? false : (r.validation?.ok ?? true),
554
+ failures: r.fetchError
555
+ ? [{ step: "upstream-fetch", output: r.fetchError }]
556
+ : (r.validation?.failures ?? []).map((f) => ({ step: f.step, output: f.output })),
557
+ manualPin: r.manualPin,
558
+ }),
559
+ );
560
+ const others = results.filter((r) => r !== result && rewritable(r));
561
+ if (others.length > 0) {
562
+ const names = others.map((r) => r.pin).join(", ");
563
+ sections.push(
564
+ "More than one pin has an upgrade this run can bump. This run acts on " + result.pin +
565
+ "; run it again with pin set to each of the others (" + names + ").",
566
+ );
567
+ }
568
+ summaryOverride = sections.join("\n\n");
569
+ }
478
570
 
479
571
  if (result.fetchError) {
480
- const summary = buildUpgradeSummary({
481
- lexicon,
482
- from: result.from,
483
- to: result.to,
484
- deltaText: "",
485
- semverLabel: null,
486
- validationOk: false,
487
- failures: [{ step: "upstream-fetch", output: result.fetchError }],
488
- });
572
+ const summary =
573
+ summaryOverride ??
574
+ buildUpgradeSummary({
575
+ lexicon,
576
+ from: result.from,
577
+ to: result.to,
578
+ deltaText: "",
579
+ semverLabel: null,
580
+ validationOk: false,
581
+ failures: [{ step: "upstream-fetch", output: result.fetchError }],
582
+ });
489
583
  return {
490
584
  lexicon,
491
585
  mode,
@@ -497,9 +591,10 @@ export async function lexiconUpgrade(args: LexiconUpgradeArgs): Promise<LexiconU
497
591
  };
498
592
  }
499
593
 
500
- hasUpgrade = result.hasUpgrade;
594
+ hasUpgrade = results.some((r) => r.hasUpgrade && !r.fetchError);
501
595
  from = result.from;
502
596
  to = result.to;
597
+ manualPin = multi ? (rewritable(result) ? undefined : result.manualPin) : result.manualPin;
503
598
  severity = result.validation?.severity ?? "none";
504
599
  deltaText = result.validation?.deltaText ?? "";
505
600
  validationOk = result.validation?.ok ?? true;
@@ -524,20 +619,23 @@ export async function lexiconUpgrade(args: LexiconUpgradeArgs): Promise<LexiconU
524
619
  } else {
525
620
  throw new Error(
526
621
  `Lexicon "${lexicon as string}" is not supported by LexiconUpgradeOp. ` +
527
- `Supported: k8s, gcp, docker, gitlab, aws, azure, github`,
622
+ `Supported: the rolling lexicons (${[...ROLLING_LEXICONS].join(", ")}) and any lexicon whose plugin declares upstreamPin.`,
528
623
  );
529
624
  }
530
625
 
531
626
  const semverLabel = severityToLabel(severity);
532
- const summary = buildUpgradeSummary({
533
- lexicon,
534
- from,
535
- to,
536
- deltaText,
537
- semverLabel,
538
- validationOk,
539
- failures,
540
- });
627
+ const summary =
628
+ summaryOverride ??
629
+ buildUpgradeSummary({
630
+ lexicon,
631
+ from,
632
+ to,
633
+ deltaText,
634
+ semverLabel,
635
+ validationOk,
636
+ failures,
637
+ manualPin,
638
+ });
541
639
 
542
640
  // ── 2. No upgrade ─────────────────────────────────────────────────
543
641
 
@@ -584,15 +682,20 @@ export async function lexiconUpgrade(args: LexiconUpgradeArgs): Promise<LexiconU
584
682
 
585
683
  // ── 4. Upgrade ready: surface according to mode ───────────────────
586
684
 
587
- const title = upgradePrTitle(lexicon, from, to);
685
+ const title = upgradePrTitle(lexicon, from, to, pinLabel);
588
686
 
589
687
  // #546: rolling lexicons have no version pin, so a "pull-request" would only
590
688
  // refresh the baseline snapshot — low signal, no build-output change. Surface
591
689
  // rolling drift as an issue instead; re-baselining stays a deliberate
592
690
  // maintainer action (`chant dev surface-diff <lexicon> --update-snapshot --bump`).
593
691
  // Pinned lexicons keep opening version-bump PRs.
594
- const effectiveMode: LexiconUpgradeMode =
595
- mode === "pull-request" && isRolling(lexicon) ? "issue" : mode;
692
+ // A pin that moves with other constants cannot be bumped here, so it is
693
+ // report-only whatever the mode.
694
+ const effectiveMode: LexiconUpgradeMode = manualPin
695
+ ? "report"
696
+ : mode === "pull-request" && isRolling(lexicon)
697
+ ? "issue"
698
+ : mode;
596
699
 
597
700
  if (effectiveMode === "report") {
598
701
  return {
@@ -622,7 +725,7 @@ export async function lexiconUpgrade(args: LexiconUpgradeArgs): Promise<LexiconU
622
725
 
623
726
  // ── 5. pull-request mode: idempotent branch + PR management ──────
624
727
 
625
- const branch = upgradeBranchName(lexicon);
728
+ const branch = upgradeBranchName(lexicon, pinLabel);
626
729
 
627
730
  // Idempotency check: if the open PR already has this summary, nothing changed.
628
731
  // Compare trimmed — gh/git round-trips can alter trailing whitespace.
@@ -662,9 +765,9 @@ export async function lexiconUpgrade(args: LexiconUpgradeArgs): Promise<LexiconU
662
765
  await gh(`git checkout ${shellQuote(branch)}`);
663
766
 
664
767
  // For pinned lexicons: apply the spec version bump permanently on this branch.
665
- if (isPinned(lexicon) && to) {
768
+ if (pinned && to) {
666
769
  const applyBump = args._applyBump ?? (await getRealApplyBump());
667
- const { filePath } = await applyBump(lexicon, lexiconDir, to);
770
+ const { filePath } = await (pinLabel ? applyBump(lexicon, lexiconDir, to, pinLabel) : applyBump(lexicon, lexiconDir, to));
668
771
  await gh(`git add ${shellQuote(filePath)}`).catch(() => {/* best-effort */});
669
772
 
670
773
  // Bump the lexicon's package.json version so merging this PR causes
@@ -7,7 +7,8 @@
7
7
 
8
8
  import { describe, expect, it } from "vitest";
9
9
  import { z } from "zod";
10
- import { activity, phase, effect } from "./builders";
10
+ import { activity, decide, phase, effect } from "./builders";
11
+ import { decideContract } from "./activities/activity-contracts";
11
12
  import type { OpConfig } from "./types";
12
13
  import {
13
14
  activityContract,
@@ -118,6 +119,25 @@ describe("validateActivitySteps() — passing Ops", () => {
118
119
  });
119
120
  });
120
121
 
122
+ describe("validateActivitySteps() — a whole-value reference in a record-typed arg (#3299)", () => {
123
+ const contracts = new Map([["decide", decideContract]]);
124
+
125
+ it("accepts decide's `inputs: step.out.json` without throwing", () => {
126
+ const fetch = activity("fetchInputs", {}, { id: "fetch" });
127
+ const ask = decide("dispatch-tier", { inputs: fetch.out.json as unknown as Record<string, unknown> });
128
+ const config = opWith({ phases: [phase("Fetch", [fetch]), phase("Decide", [ask])] });
129
+ expect(validateActivitySteps(config, contracts)).toEqual([]);
130
+ });
131
+
132
+ it("reports a symbol key in a record-typed arg as a finding instead of throwing", () => {
133
+ const step = activity("decide", { point: "dispatch-tier", inputs: { [Symbol("odd")]: 1 } });
134
+ const config = opWith({ phases: [phase("Decide", [step])] });
135
+ const issues = validateActivitySteps(config, contracts);
136
+ expect(issues.length).toBeGreaterThan(0);
137
+ expect(issues[0].message).toContain("args.inputs.Symbol(odd)");
138
+ });
139
+ });
140
+
121
141
  describe("validateActivitySteps() — the four failure classes from #1288", () => {
122
142
  it("flags an unknown profile — e.g. kubectlApply(..., { profile: \"longInfa\" })", () => {
123
143
  const step = activity("kubectlApply", { manifest: "dist/k8s.yaml" }, "longInfa" as never);