@intentius/chant 0.124.51 → 0.124.54

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 (593) hide show
  1. package/dist/audit/discover.d.ts.map +1 -1
  2. package/dist/audit/discover.js +3 -1
  3. package/dist/behaviour.d.ts +1 -1
  4. package/dist/behaviour.d.ts.map +1 -1
  5. package/dist/capabilities/templates.d.ts +65 -0
  6. package/dist/capabilities/templates.d.ts.map +1 -0
  7. package/dist/capabilities/templates.js +193 -0
  8. package/dist/capabilities/templates.json +145 -0
  9. package/dist/change-set-graph.d.ts +35 -3
  10. package/dist/change-set-graph.d.ts.map +1 -1
  11. package/dist/change-set-graph.js +60 -9
  12. package/dist/change-set.d.ts +65 -7
  13. package/dist/change-set.d.ts.map +1 -1
  14. package/dist/change-set.js +23 -12
  15. package/dist/ci-identity.d.ts +7 -2
  16. package/dist/ci-identity.d.ts.map +1 -1
  17. package/dist/ci-identity.js +4 -1
  18. package/dist/cli/commands/import-index.d.ts +52 -0
  19. package/dist/cli/commands/import-index.d.ts.map +1 -0
  20. package/dist/cli/commands/import-index.js +226 -0
  21. package/dist/cli/commands/lint.d.ts.map +1 -1
  22. package/dist/cli/commands/lint.js +4 -2
  23. package/dist/cli/handlers/components.d.ts.map +1 -1
  24. package/dist/cli/handlers/components.js +11 -2
  25. package/dist/cli/handlers/fan-out.d.ts.map +1 -1
  26. package/dist/cli/handlers/fan-out.js +16 -3
  27. package/dist/cli/handlers/graph.d.ts.map +1 -1
  28. package/dist/cli/handlers/graph.js +22 -4
  29. package/dist/cli/handlers/index-cloud.d.ts +14 -0
  30. package/dist/cli/handlers/index-cloud.d.ts.map +1 -0
  31. package/dist/cli/handlers/index-cloud.js +22 -0
  32. package/dist/cli/handlers/index-diff.d.ts +18 -0
  33. package/dist/cli/handlers/index-diff.d.ts.map +1 -0
  34. package/dist/cli/handlers/index-diff.js +142 -0
  35. package/dist/cli/handlers/lifecycle-drift.d.ts +25 -0
  36. package/dist/cli/handlers/lifecycle-drift.d.ts.map +1 -0
  37. package/dist/cli/handlers/lifecycle-drift.js +64 -0
  38. package/dist/cli/handlers/lifecycle.d.ts.map +1 -1
  39. package/dist/cli/handlers/lifecycle.js +188 -28
  40. package/dist/cli/handlers/misc.d.ts +9 -0
  41. package/dist/cli/handlers/misc.d.ts.map +1 -1
  42. package/dist/cli/handlers/misc.js +77 -0
  43. package/dist/cli/handlers/pr.d.ts.map +1 -1
  44. package/dist/cli/handlers/pr.js +17 -3
  45. package/dist/cli/handlers/promote.d.ts.map +1 -1
  46. package/dist/cli/handlers/promote.js +89 -15
  47. package/dist/cli/handlers/query.d.ts.map +1 -1
  48. package/dist/cli/handlers/query.js +28 -4
  49. package/dist/cli/handlers/scenario.d.ts.map +1 -1
  50. package/dist/cli/handlers/scenario.js +8 -7
  51. package/dist/cli/handlers/search.d.ts +34 -4
  52. package/dist/cli/handlers/search.d.ts.map +1 -1
  53. package/dist/cli/handlers/search.js +216 -36
  54. package/dist/cli/main.d.ts.map +1 -1
  55. package/dist/cli/main.js +55 -1
  56. package/dist/cli/mcp/lifecycle-tools.d.ts.map +1 -1
  57. package/dist/cli/mcp/lifecycle-tools.js +3 -2
  58. package/dist/cli/mcp/resource-handlers.d.ts.map +1 -1
  59. package/dist/cli/mcp/resource-handlers.js +4 -3
  60. package/dist/cli/mcp/workspace-tools.js +1 -1
  61. package/dist/cli/parse-args.d.ts.map +1 -1
  62. package/dist/cli/parse-args.js +55 -2
  63. package/dist/cli/registry.d.ts +19 -1
  64. package/dist/cli/registry.d.ts.map +1 -1
  65. package/dist/cloud-lister/aws.d.ts +35 -0
  66. package/dist/cloud-lister/aws.d.ts.map +1 -0
  67. package/dist/cloud-lister/aws.js +203 -0
  68. package/dist/cloud-lister/azure.d.ts +34 -0
  69. package/dist/cloud-lister/azure.d.ts.map +1 -0
  70. package/dist/cloud-lister/azure.js +129 -0
  71. package/dist/cloud-lister/common.d.ts +40 -0
  72. package/dist/cloud-lister/common.d.ts.map +1 -0
  73. package/dist/cloud-lister/common.js +83 -0
  74. package/dist/cloud-lister/credentials.d.ts +50 -0
  75. package/dist/cloud-lister/credentials.d.ts.map +1 -0
  76. package/dist/cloud-lister/credentials.js +86 -0
  77. package/dist/cloud-lister/fakes.d.ts +27 -0
  78. package/dist/cloud-lister/fakes.d.ts.map +1 -0
  79. package/dist/cloud-lister/fakes.js +50 -0
  80. package/dist/cloud-lister/gcp.d.ts +42 -0
  81. package/dist/cloud-lister/gcp.d.ts.map +1 -0
  82. package/dist/cloud-lister/gcp.js +143 -0
  83. package/dist/cloud-lister/guard.d.ts +49 -0
  84. package/dist/cloud-lister/guard.d.ts.map +1 -0
  85. package/dist/cloud-lister/guard.js +103 -0
  86. package/dist/cloud-lister/ids.d.ts +23 -0
  87. package/dist/cloud-lister/ids.d.ts.map +1 -0
  88. package/dist/cloud-lister/ids.js +42 -0
  89. package/dist/cloud-lister/index.d.ts +67 -0
  90. package/dist/cloud-lister/index.d.ts.map +1 -0
  91. package/dist/cloud-lister/index.js +102 -0
  92. package/dist/cloud-lister/kubernetes.d.ts +64 -0
  93. package/dist/cloud-lister/kubernetes.d.ts.map +1 -0
  94. package/dist/cloud-lister/kubernetes.js +276 -0
  95. package/dist/cloud-lister/markers.d.ts +31 -0
  96. package/dist/cloud-lister/markers.d.ts.map +1 -0
  97. package/dist/cloud-lister/markers.js +73 -0
  98. package/dist/cloud-lister/mask.d.ts +31 -0
  99. package/dist/cloud-lister/mask.d.ts.map +1 -0
  100. package/dist/cloud-lister/mask.js +74 -0
  101. package/dist/cloud-lister/sigv4.d.ts +29 -0
  102. package/dist/cloud-lister/sigv4.d.ts.map +1 -0
  103. package/dist/cloud-lister/sigv4.js +54 -0
  104. package/dist/cloud-lister/transport.d.ts +55 -0
  105. package/dist/cloud-lister/transport.d.ts.map +1 -0
  106. package/dist/cloud-lister/transport.js +86 -0
  107. package/dist/cloud-lister/types.d.ts +121 -0
  108. package/dist/cloud-lister/types.d.ts.map +1 -0
  109. package/dist/cloud-lister/types.js +24 -0
  110. package/dist/components/capability-plugin-loader.d.ts.map +1 -1
  111. package/dist/components/capability-plugin-loader.js +6 -0
  112. package/dist/components/capability-plugin.d.ts +9 -0
  113. package/dist/components/capability-plugin.d.ts.map +1 -1
  114. package/dist/components/capability.d.ts +224 -0
  115. package/dist/components/capability.d.ts.map +1 -1
  116. package/dist/components/cli-support.d.ts +21 -0
  117. package/dist/components/cli-support.d.ts.map +1 -1
  118. package/dist/components/cli-support.js +58 -14
  119. package/dist/components/covered-round.d.ts +173 -0
  120. package/dist/components/covered-round.d.ts.map +1 -0
  121. package/dist/components/covered-round.js +200 -0
  122. package/dist/components/declared-reads.d.ts +38 -0
  123. package/dist/components/declared-reads.d.ts.map +1 -0
  124. package/dist/components/declared-reads.js +131 -0
  125. package/dist/components/deploy-units.d.ts.map +1 -1
  126. package/dist/components/deploy-units.js +4 -0
  127. package/dist/components/driver.d.ts +42 -1
  128. package/dist/components/driver.d.ts.map +1 -1
  129. package/dist/components/driver.js +74 -3
  130. package/dist/components/fan-out-run.d.ts +23 -1
  131. package/dist/components/fan-out-run.d.ts.map +1 -1
  132. package/dist/components/fan-out-run.js +82 -14
  133. package/dist/components/fan-out-support.d.ts +6 -0
  134. package/dist/components/fan-out-support.d.ts.map +1 -1
  135. package/dist/components/fan-out-support.js +4 -1
  136. package/dist/components/fan-out.d.ts +28 -0
  137. package/dist/components/fan-out.d.ts.map +1 -1
  138. package/dist/components/groups.d.ts +229 -0
  139. package/dist/components/groups.d.ts.map +1 -0
  140. package/dist/components/groups.js +760 -0
  141. package/dist/components/index.d.ts +7 -2
  142. package/dist/components/index.d.ts.map +1 -1
  143. package/dist/components/index.js +5 -0
  144. package/dist/components/plan-shape-conformance.d.ts +48 -0
  145. package/dist/components/plan-shape-conformance.d.ts.map +1 -0
  146. package/dist/components/plan-shape-conformance.js +122 -0
  147. package/dist/components/pr-run.d.ts +62 -7
  148. package/dist/components/pr-run.d.ts.map +1 -1
  149. package/dist/components/pr-run.js +354 -53
  150. package/dist/components/promote-rounds.d.ts +9 -0
  151. package/dist/components/promote-rounds.d.ts.map +1 -1
  152. package/dist/components/promote-rounds.js +23 -2
  153. package/dist/components/promote.d.ts +17 -0
  154. package/dist/components/promote.d.ts.map +1 -1
  155. package/dist/components/promote.js +36 -6
  156. package/dist/components/release-gate.d.ts +23 -1
  157. package/dist/components/release-gate.d.ts.map +1 -1
  158. package/dist/components/release-gate.js +97 -33
  159. package/dist/components/run-groups.d.ts +58 -0
  160. package/dist/components/run-groups.d.ts.map +1 -0
  161. package/dist/components/run-groups.js +78 -0
  162. package/dist/components/starter-plugin.d.ts +1 -0
  163. package/dist/components/starter-plugin.d.ts.map +1 -1
  164. package/dist/components/starter-plugin.js +6 -1
  165. package/dist/components/verbs/index.d.ts +1 -0
  166. package/dist/components/verbs/index.d.ts.map +1 -1
  167. package/dist/components/verbs/index.js +1 -0
  168. package/dist/components/verbs/member-outputs.d.ts +187 -0
  169. package/dist/components/verbs/member-outputs.d.ts.map +1 -0
  170. package/dist/components/verbs/member-outputs.js +218 -0
  171. package/dist/components/wave-plan.d.ts +2 -0
  172. package/dist/components/wave-plan.d.ts.map +1 -1
  173. package/dist/components/wave-plan.js +4 -1
  174. package/dist/config.d.ts +60 -0
  175. package/dist/config.d.ts.map +1 -1
  176. package/dist/config.js +27 -0
  177. package/dist/deep-observation.d.ts +1 -13
  178. package/dist/deep-observation.d.ts.map +1 -1
  179. package/dist/deep-observation.js +5 -22
  180. package/dist/drift-record.d.ts +542 -0
  181. package/dist/drift-record.d.ts.map +1 -0
  182. package/dist/drift-record.js +886 -0
  183. package/dist/engine-facts.d.ts +144 -0
  184. package/dist/engine-facts.d.ts.map +1 -0
  185. package/dist/engine-facts.js +14 -0
  186. package/dist/graph-ir.d.ts +153 -2
  187. package/dist/graph-ir.d.ts.map +1 -1
  188. package/dist/graph-ir.js +224 -6
  189. package/dist/graph-refs.d.ts +145 -0
  190. package/dist/graph-refs.d.ts.map +1 -1
  191. package/dist/graph-refs.js +305 -0
  192. package/dist/graph-schema/fixtures/adopt.json +15 -0
  193. package/dist/graph-schema/fixtures/choudoufu.engine-graph.json +169 -0
  194. package/dist/graph-schema/fixtures/index.json +68 -0
  195. package/dist/graph-schema/fixtures/plunge.engine-graph.json +158 -0
  196. package/dist/graph-schema/fixtures.d.ts +23 -0
  197. package/dist/graph-schema/fixtures.d.ts.map +1 -0
  198. package/dist/graph-schema/fixtures.js +246 -0
  199. package/dist/graph-schema/generate.d.ts +15 -0
  200. package/dist/graph-schema/generate.d.ts.map +1 -0
  201. package/dist/graph-schema/generate.js +267 -0
  202. package/dist/graph-schema/graph.schema.json +1387 -0
  203. package/dist/health.schema.json +2 -1
  204. package/dist/identity.d.ts.map +1 -1
  205. package/dist/identity.js +2 -0
  206. package/dist/index.d.ts +1 -0
  207. package/dist/index.d.ts.map +1 -1
  208. package/dist/index.js +2 -0
  209. package/dist/instance-nodes.d.ts +159 -0
  210. package/dist/instance-nodes.d.ts.map +1 -0
  211. package/dist/instance-nodes.js +231 -0
  212. package/dist/lexicon.d.ts +72 -0
  213. package/dist/lexicon.d.ts.map +1 -1
  214. package/dist/lifecycle/adoption-file.d.ts +56 -0
  215. package/dist/lifecycle/adoption-file.d.ts.map +1 -0
  216. package/dist/lifecycle/adoption-file.js +123 -0
  217. package/dist/lifecycle/cloud-index.d.ts +186 -0
  218. package/dist/lifecycle/cloud-index.d.ts.map +1 -0
  219. package/dist/lifecycle/cloud-index.js +618 -0
  220. package/dist/lifecycle/derive-edges.d.ts +59 -0
  221. package/dist/lifecycle/derive-edges.d.ts.map +1 -0
  222. package/dist/lifecycle/derive-edges.js +126 -0
  223. package/dist/lifecycle/git.d.ts +10 -9
  224. package/dist/lifecycle/git.d.ts.map +1 -1
  225. package/dist/lifecycle/git.js +7 -1
  226. package/dist/lifecycle/identity-match.d.ts +133 -0
  227. package/dist/lifecycle/identity-match.d.ts.map +1 -0
  228. package/dist/lifecycle/identity-match.js +147 -0
  229. package/dist/lifecycle/index-diff.d.ts +224 -0
  230. package/dist/lifecycle/index-diff.d.ts.map +1 -0
  231. package/dist/lifecycle/index-diff.js +327 -0
  232. package/dist/lifecycle/index-document.d.ts +130 -0
  233. package/dist/lifecycle/index-document.d.ts.map +1 -0
  234. package/dist/lifecycle/index-document.js +189 -0
  235. package/dist/lifecycle/index-drift.d.ts +121 -0
  236. package/dist/lifecycle/index-drift.d.ts.map +1 -0
  237. package/dist/lifecycle/index-drift.js +178 -0
  238. package/dist/lifecycle/index-import.d.ts +168 -0
  239. package/dist/lifecycle/index-import.d.ts.map +1 -0
  240. package/dist/lifecycle/index-import.js +515 -0
  241. package/dist/lifecycle/index-join.d.ts +129 -0
  242. package/dist/lifecycle/index-join.d.ts.map +1 -0
  243. package/dist/lifecycle/index-join.js +248 -0
  244. package/dist/lifecycle/index.d.ts +4 -0
  245. package/dist/lifecycle/index.d.ts.map +1 -1
  246. package/dist/lifecycle/index.js +4 -0
  247. package/dist/lifecycle/observation-baseline.d.ts +61 -21
  248. package/dist/lifecycle/observation-baseline.d.ts.map +1 -1
  249. package/dist/lifecycle/observation-baseline.js +144 -19
  250. package/dist/lifecycle/observe.d.ts.map +1 -1
  251. package/dist/lifecycle/observe.js +6 -1
  252. package/dist/lifecycle/query.d.ts +45 -4
  253. package/dist/lifecycle/query.d.ts.map +1 -1
  254. package/dist/lifecycle/query.js +89 -7
  255. package/dist/lifecycle/replay.d.ts +10 -3
  256. package/dist/lifecycle/replay.d.ts.map +1 -1
  257. package/dist/lifecycle/replay.js +10 -6
  258. package/dist/lifecycle/scenario.d.ts +4 -3
  259. package/dist/lifecycle/scenario.d.ts.map +1 -1
  260. package/dist/lifecycle/snapshot-store-fake.d.ts +9 -0
  261. package/dist/lifecycle/snapshot-store-fake.d.ts.map +1 -0
  262. package/dist/lifecycle/snapshot-store-fake.js +21 -0
  263. package/dist/lifecycle/snapshot-store-s3.d.ts +102 -0
  264. package/dist/lifecycle/snapshot-store-s3.d.ts.map +1 -0
  265. package/dist/lifecycle/snapshot-store-s3.js +254 -0
  266. package/dist/lifecycle/snapshot-store.d.ts +170 -0
  267. package/dist/lifecycle/snapshot-store.d.ts.map +1 -0
  268. package/dist/lifecycle/snapshot-store.js +832 -0
  269. package/dist/lifecycle/snapshot.d.ts +11 -0
  270. package/dist/lifecycle/snapshot.d.ts.map +1 -1
  271. package/dist/lifecycle/snapshot.js +18 -5
  272. package/dist/lifecycle/type-listing.d.ts +148 -0
  273. package/dist/lifecycle/type-listing.d.ts.map +1 -0
  274. package/dist/lifecycle/type-listing.js +166 -0
  275. package/dist/lint/component-checks.d.ts +15 -1
  276. package/dist/lint/component-checks.d.ts.map +1 -1
  277. package/dist/lint/component-checks.js +1 -0
  278. package/dist/lint/presets/relaxed.json +2 -1
  279. package/dist/lint/presets/strict.json +2 -1
  280. package/dist/lint/rules/__fixtures__/comp/comp008/fail/dns.component.d.ts +4 -0
  281. package/dist/lint/rules/__fixtures__/comp/comp008/fail/dns.component.d.ts.map +1 -0
  282. package/dist/lint/rules/__fixtures__/comp/comp008/fail/dns.component.js +13 -0
  283. package/dist/lint/rules/__fixtures__/comp/comp008/pass/dns.component.d.ts +4 -0
  284. package/dist/lint/rules/__fixtures__/comp/comp008/pass/dns.component.d.ts.map +1 -0
  285. package/dist/lint/rules/__fixtures__/comp/comp008/pass/dns.component.js +8 -0
  286. package/dist/lint/rules/comp/comp008-applies-signal-only-root.d.ts +33 -0
  287. package/dist/lint/rules/comp/comp008-applies-signal-only-root.d.ts.map +1 -0
  288. package/dist/lint/rules/comp/comp008-applies-signal-only-root.js +123 -0
  289. package/dist/lint/rules/comp/index.d.ts +2 -1
  290. package/dist/lint/rules/comp/index.d.ts.map +1 -1
  291. package/dist/lint/rules/comp/index.js +4 -1
  292. package/dist/observation.d.ts +19 -2
  293. package/dist/observation.d.ts.map +1 -1
  294. package/dist/observation.js +18 -1
  295. package/dist/op/activities/activity-contracts.d.ts +1 -1
  296. package/dist/op/activities/activity-contracts.js +1 -1
  297. package/dist/op/activities/change-set.d.ts +6 -4
  298. package/dist/op/activities/change-set.d.ts.map +1 -1
  299. package/dist/op/activities/change-set.js +4 -2
  300. package/dist/op/activity-failure.d.ts +27 -0
  301. package/dist/op/activity-failure.d.ts.map +1 -1
  302. package/dist/op/activity-failure.js +31 -0
  303. package/dist/op/index.d.ts +2 -1
  304. package/dist/op/index.d.ts.map +1 -1
  305. package/dist/op/index.js +1 -1
  306. package/dist/op/local-executor.d.ts +5 -1
  307. package/dist/op/local-executor.d.ts.map +1 -1
  308. package/dist/op/local-executor.js +22 -8
  309. package/dist/pr-loop.d.ts +92 -3
  310. package/dist/pr-loop.d.ts.map +1 -1
  311. package/dist/pr-loop.js +62 -3
  312. package/dist/pulumi-urn.d.ts +101 -0
  313. package/dist/pulumi-urn.d.ts.map +1 -0
  314. package/dist/pulumi-urn.js +131 -0
  315. package/dist/release-floors.d.ts +23 -0
  316. package/dist/release-floors.d.ts.map +1 -0
  317. package/dist/release-floors.js +22 -0
  318. package/dist/sensitive-key.d.ts +23 -0
  319. package/dist/sensitive-key.d.ts.map +1 -0
  320. package/dist/sensitive-key.js +31 -0
  321. package/dist/wave-runtime.mjs +234 -234
  322. package/dist/workspace/adoption-report.d.ts +53 -0
  323. package/dist/workspace/adoption-report.d.ts.map +1 -0
  324. package/dist/workspace/adoption-report.js +76 -0
  325. package/dist/workspace/capabilities-contract.d.ts +7 -0
  326. package/dist/workspace/capabilities-contract.d.ts.map +1 -1
  327. package/dist/workspace/capabilities-contract.js +2 -1
  328. package/dist/workspace/capabilities.schema.json +98 -0
  329. package/dist/workspace/change-set.schema.json +42 -3
  330. package/dist/workspace/ci-cloud-identity.d.ts +13 -1
  331. package/dist/workspace/ci-cloud-identity.d.ts.map +1 -1
  332. package/dist/workspace/ci-cloud-identity.js +30 -1
  333. package/dist/workspace/compose-graph.d.ts +10 -1
  334. package/dist/workspace/compose-graph.d.ts.map +1 -1
  335. package/dist/workspace/compose-graph.js +6 -1
  336. package/dist/workspace/conformance/index.d.ts +1 -1
  337. package/dist/workspace/conformance/index.d.ts.map +1 -1
  338. package/dist/workspace/conformance/index.js +6 -1
  339. package/dist/workspace/drift-cli.d.ts +81 -0
  340. package/dist/workspace/drift-cli.d.ts.map +1 -0
  341. package/dist/workspace/drift-cli.js +317 -0
  342. package/dist/workspace/drift.schema.json +672 -0
  343. package/dist/workspace/graph-cli.d.ts +2 -0
  344. package/dist/workspace/graph-cli.d.ts.map +1 -1
  345. package/dist/workspace/graph-cli.js +3 -0
  346. package/dist/workspace/graph.schema.json +72 -0
  347. package/dist/workspace/init.d.ts +5 -1
  348. package/dist/workspace/init.d.ts.map +1 -1
  349. package/dist/workspace/init.js +55 -9
  350. package/dist/workspace/ledger.schema.json +1 -1
  351. package/dist/workspace/nested-graph.d.ts.map +1 -1
  352. package/dist/workspace/nested-graph.js +2 -0
  353. package/dist/workspace/pr-report.schema.json +76 -3
  354. package/dist/workspace/promote-waves.d.ts +112 -0
  355. package/dist/workspace/promote-waves.d.ts.map +1 -0
  356. package/dist/workspace/promote-waves.js +290 -0
  357. package/dist/workspace/promote.d.ts +84 -2
  358. package/dist/workspace/promote.d.ts.map +1 -1
  359. package/dist/workspace/promote.js +347 -61
  360. package/dist/workspace/reason-codes.d.ts +12 -0
  361. package/dist/workspace/reason-codes.d.ts.map +1 -1
  362. package/dist/workspace/reason-codes.js +14 -0
  363. package/dist/workspace/search-contract.d.ts +3 -3
  364. package/dist/workspace/search-contract.d.ts.map +1 -1
  365. package/dist/workspace/search-contract.js +2 -0
  366. package/dist/workspace/search.schema.json +103 -5
  367. package/package.json +14 -1
  368. package/src/__fixtures__/drift-record/README.md +58 -0
  369. package/src/__fixtures__/drift-record/choudoufu-cone.ndjson +4 -0
  370. package/src/__fixtures__/drift-record/choudoufu-resource.ndjson +3 -0
  371. package/src/__fixtures__/drift-record/component-status-ledger.json +65 -0
  372. package/src/__fixtures__/drift-record/component-status.json +91 -0
  373. package/src/__fixtures__/drift-record/deep-diff.json +259 -0
  374. package/src/__fixtures__/drift-record/lifecycle-diff-live.json +825 -0
  375. package/src/__fixtures__/drift-record/live-diff.json +125 -0
  376. package/src/audit/discover.e2e.test.ts +14 -0
  377. package/src/audit/discover.ts +3 -1
  378. package/src/behaviour.ts +1 -1
  379. package/src/capabilities/templates.json +145 -0
  380. package/src/capabilities/templates.test.ts +212 -0
  381. package/src/capabilities/templates.ts +204 -0
  382. package/src/change-set-bundle.test.ts +83 -0
  383. package/src/change-set-graph.ts +80 -9
  384. package/src/change-set.test.ts +24 -0
  385. package/src/change-set.ts +77 -14
  386. package/src/ci-identity-targets.test.ts +23 -0
  387. package/src/ci-identity.ts +10 -4
  388. package/src/cli/commands/import-index.test.ts +117 -0
  389. package/src/cli/commands/import-index.ts +265 -0
  390. package/src/cli/commands/lint.ts +4 -2
  391. package/src/cli/handlers/components.test.ts +9 -0
  392. package/src/cli/handlers/components.ts +12 -2
  393. package/src/cli/handlers/fan-out.ts +17 -3
  394. package/src/cli/handlers/graph.test.ts +42 -0
  395. package/src/cli/handlers/graph.ts +26 -4
  396. package/src/cli/handlers/index-cloud.ts +32 -0
  397. package/src/cli/handlers/index-diff.test.ts +68 -0
  398. package/src/cli/handlers/index-diff.ts +146 -0
  399. package/src/cli/handlers/ledger-root-member.test.ts +161 -0
  400. package/src/cli/handlers/lifecycle-drift.ts +68 -0
  401. package/src/cli/handlers/lifecycle.test.ts +33 -11
  402. package/src/cli/handlers/lifecycle.ts +205 -30
  403. package/src/cli/handlers/misc.ts +73 -0
  404. package/src/cli/handlers/pr-waves-blocked.test.ts +37 -2
  405. package/src/cli/handlers/pr.ts +16 -3
  406. package/src/cli/handlers/promote.test.ts +64 -0
  407. package/src/cli/handlers/promote.ts +81 -6
  408. package/src/cli/handlers/query.ts +27 -4
  409. package/src/cli/handlers/run-declared-reads-cli.test.ts +187 -0
  410. package/src/cli/handlers/run-groups-cli.test.ts +229 -0
  411. package/src/cli/handlers/scenario.test.ts +13 -0
  412. package/src/cli/handlers/scenario.ts +8 -7
  413. package/src/cli/handlers/search-index.test.ts +255 -0
  414. package/src/cli/handlers/search-json.test.ts +1 -1
  415. package/src/cli/handlers/search-ownership.test.ts +194 -0
  416. package/src/cli/handlers/search.ts +271 -38
  417. package/src/cli/main.test.ts +7 -0
  418. package/src/cli/main.ts +56 -1
  419. package/src/cli/mcp/lifecycle-tools.ts +3 -2
  420. package/src/cli/mcp/resource-handlers.ts +4 -3
  421. package/src/cli/mcp/workspace-tools.ts +1 -1
  422. package/src/cli/parse-args.ts +40 -2
  423. package/src/cli/registry.ts +19 -1
  424. package/src/cloud-lister/aws.test.ts +202 -0
  425. package/src/cloud-lister/aws.ts +226 -0
  426. package/src/cloud-lister/azure.test.ts +132 -0
  427. package/src/cloud-lister/azure.ts +142 -0
  428. package/src/cloud-lister/common.ts +115 -0
  429. package/src/cloud-lister/credentials.ts +110 -0
  430. package/src/cloud-lister/fakes.ts +66 -0
  431. package/src/cloud-lister/gcp.test.ts +121 -0
  432. package/src/cloud-lister/gcp.ts +159 -0
  433. package/src/cloud-lister/guard.test.ts +198 -0
  434. package/src/cloud-lister/guard.ts +111 -0
  435. package/src/cloud-lister/ids.ts +54 -0
  436. package/src/cloud-lister/index.ts +134 -0
  437. package/src/cloud-lister/kubernetes.test.ts +160 -0
  438. package/src/cloud-lister/kubernetes.ts +284 -0
  439. package/src/cloud-lister/markers.ts +74 -0
  440. package/src/cloud-lister/mask.ts +77 -0
  441. package/src/cloud-lister/shape.test.ts +81 -0
  442. package/src/cloud-lister/sigv4.ts +70 -0
  443. package/src/cloud-lister/transport.ts +118 -0
  444. package/src/cloud-lister/types.ts +135 -0
  445. package/src/components/capability-plugin-loader.ts +4 -0
  446. package/src/components/capability-plugin.ts +10 -0
  447. package/src/components/capability.ts +238 -0
  448. package/src/components/cli-support.ts +70 -14
  449. package/src/components/covered-round.test.ts +166 -0
  450. package/src/components/covered-round.ts +293 -0
  451. package/src/components/declared-reads.test.ts +103 -0
  452. package/src/components/declared-reads.ts +134 -0
  453. package/src/components/deploy-units.ts +4 -0
  454. package/src/components/driver.ts +101 -4
  455. package/src/components/fan-out-run.ts +95 -15
  456. package/src/components/fan-out-support.ts +10 -1
  457. package/src/components/fan-out.ts +30 -0
  458. package/src/components/groups.test.ts +320 -0
  459. package/src/components/groups.ts +880 -0
  460. package/src/components/index.ts +59 -0
  461. package/src/components/plan-shape-conformance.ts +130 -0
  462. package/src/components/pr-env-run-bundle.test.ts +2 -0
  463. package/src/components/pr-run.test.ts +728 -4
  464. package/src/components/pr-run.ts +395 -55
  465. package/src/components/promote-rounds.ts +25 -2
  466. package/src/components/promote.ts +55 -5
  467. package/src/components/registry.test.ts +1 -1
  468. package/src/components/release-gate.ts +115 -30
  469. package/src/components/release-groups.test.ts +362 -0
  470. package/src/components/run-groups.ts +113 -0
  471. package/src/components/starter-plugin.ts +6 -0
  472. package/src/components/verbs/index.ts +1 -0
  473. package/src/components/verbs/member-outputs.test.ts +205 -0
  474. package/src/components/verbs/member-outputs.ts +308 -0
  475. package/src/components/wave-plan.ts +5 -2
  476. package/src/config.ts +44 -0
  477. package/src/deep-observation.ts +5 -23
  478. package/src/drift-record.test.ts +596 -0
  479. package/src/drift-record.ts +1206 -0
  480. package/src/engine-facts.guard.test.ts +111 -0
  481. package/src/engine-facts.test.ts +178 -0
  482. package/src/engine-facts.ts +154 -0
  483. package/src/gated-waves-bundle.test.ts +2 -0
  484. package/src/graph-ir-live.test.ts +92 -0
  485. package/src/graph-ir.ts +317 -7
  486. package/src/graph-refs.ts +416 -0
  487. package/src/graph-schema/fixtures/adopt.json +15 -0
  488. package/src/graph-schema/fixtures/choudoufu.engine-graph.json +169 -0
  489. package/src/graph-schema/fixtures/index.json +68 -0
  490. package/src/graph-schema/fixtures/plunge.engine-graph.json +158 -0
  491. package/src/graph-schema/fixtures.ts +267 -0
  492. package/src/graph-schema/generate.ts +263 -0
  493. package/src/graph-schema/graph-schema.test.ts +153 -0
  494. package/src/graph-schema/graph.schema.json +1387 -0
  495. package/src/health.schema.json +2 -1
  496. package/src/identity.ts +2 -0
  497. package/src/index.ts +2 -0
  498. package/src/instance-nodes.ts +288 -0
  499. package/src/lexicon.ts +76 -0
  500. package/src/lifecycle/__fixtures__/index-diff/20261026T120000Z-aaaaaaaaaaaa.json +149 -0
  501. package/src/lifecycle/__fixtures__/index-diff/20261026T130000Z-bbbbbbbbbbbb.json +127 -0
  502. package/src/lifecycle/adoption-file.test.ts +100 -0
  503. package/src/lifecycle/adoption-file.ts +154 -0
  504. package/src/lifecycle/cloud-index.test.ts +517 -0
  505. package/src/lifecycle/cloud-index.ts +736 -0
  506. package/src/lifecycle/derive-edges.test.ts +193 -0
  507. package/src/lifecycle/derive-edges.ts +182 -0
  508. package/src/lifecycle/git.ts +10 -4
  509. package/src/lifecycle/identity-match.test.ts +308 -0
  510. package/src/lifecycle/identity-match.ts +257 -0
  511. package/src/lifecycle/index-diff.test.ts +198 -0
  512. package/src/lifecycle/index-diff.ts +476 -0
  513. package/src/lifecycle/index-document.test.ts +64 -0
  514. package/src/lifecycle/index-document.ts +299 -0
  515. package/src/lifecycle/index-drift.test.ts +191 -0
  516. package/src/lifecycle/index-drift.ts +304 -0
  517. package/src/lifecycle/index-import.test.ts +255 -0
  518. package/src/lifecycle/index-import.ts +634 -0
  519. package/src/lifecycle/index-join.test.ts +250 -0
  520. package/src/lifecycle/index-join.ts +304 -0
  521. package/src/lifecycle/index-store-load-bearing.test.ts +187 -0
  522. package/src/lifecycle/index.ts +4 -0
  523. package/src/lifecycle/member-ledger.test.ts +25 -7
  524. package/src/lifecycle/observation-baseline.test.ts +72 -1
  525. package/src/lifecycle/observation-baseline.ts +190 -27
  526. package/src/lifecycle/observe.ts +6 -1
  527. package/src/lifecycle/query.test.ts +69 -1
  528. package/src/lifecycle/query.ts +103 -10
  529. package/src/lifecycle/replay.test.ts +9 -5
  530. package/src/lifecycle/replay.ts +9 -5
  531. package/src/lifecycle/scenario.ts +4 -3
  532. package/src/lifecycle/snapshot-store-fake.ts +29 -0
  533. package/src/lifecycle/snapshot-store-s3.ts +316 -0
  534. package/src/lifecycle/snapshot-store.test.ts +385 -0
  535. package/src/lifecycle/snapshot-store.ts +981 -0
  536. package/src/lifecycle/snapshot.test.ts +13 -0
  537. package/src/lifecycle/snapshot.ts +23 -6
  538. package/src/lifecycle/type-listing.test.ts +166 -0
  539. package/src/lifecycle/type-listing.ts +309 -0
  540. package/src/lint/component-checks.ts +17 -1
  541. package/src/lint/config.test.ts +3 -0
  542. package/src/lint/presets/relaxed.json +2 -1
  543. package/src/lint/presets/strict.json +2 -1
  544. package/src/lint/rules/__fixtures__/comp/comp008/fail/dns.component.ts +15 -0
  545. package/src/lint/rules/__fixtures__/comp/comp008/pass/dns.component.ts +10 -0
  546. package/src/lint/rules/comp/comp.test.ts +2 -1
  547. package/src/lint/rules/comp/comp008-applies-signal-only-root.ts +121 -0
  548. package/src/lint/rules/comp/comp008.test.ts +77 -0
  549. package/src/lint/rules/comp/index.ts +4 -1
  550. package/src/observation-edges.test.ts +33 -0
  551. package/src/observation.ts +36 -1
  552. package/src/op/activities/activity-contracts.ts +1 -1
  553. package/src/op/activities/change-set.ts +8 -5
  554. package/src/op/activity-failure.ts +36 -0
  555. package/src/op/index.ts +2 -1
  556. package/src/op/local-executor.test.ts +80 -0
  557. package/src/op/local-executor.ts +27 -9
  558. package/src/pr-loop-bundle.test.ts +5 -2
  559. package/src/pr-loop.test.ts +57 -1
  560. package/src/pr-loop.ts +154 -6
  561. package/src/pulumi-urn.ts +151 -0
  562. package/src/release-floors.ts +22 -0
  563. package/src/sensitive-key.ts +34 -0
  564. package/src/workspace/adoption-report.test.ts +61 -0
  565. package/src/workspace/adoption-report.ts +103 -0
  566. package/src/workspace/capabilities-contract.test.ts +4 -0
  567. package/src/workspace/capabilities-contract.ts +9 -1
  568. package/src/workspace/capabilities.schema.json +98 -0
  569. package/src/workspace/change-set.schema.json +42 -3
  570. package/src/workspace/ci-cloud-identity.ts +31 -1
  571. package/src/workspace/compose-graph.test.ts +12 -0
  572. package/src/workspace/compose-graph.ts +12 -1
  573. package/src/workspace/conformance/conformance.e2e.test.ts +2 -1
  574. package/src/workspace/conformance/index.ts +6 -1
  575. package/src/workspace/drift-cli.test.ts +65 -0
  576. package/src/workspace/drift-cli.ts +365 -0
  577. package/src/workspace/drift.schema.json +672 -0
  578. package/src/workspace/graph-cli.ts +5 -0
  579. package/src/workspace/graph.schema.json +72 -0
  580. package/src/workspace/init.test.ts +38 -1
  581. package/src/workspace/init.ts +50 -8
  582. package/src/workspace/intent-gaps.test.ts +18 -2
  583. package/src/workspace/ledger.schema.json +1 -1
  584. package/src/workspace/nested-graph.ts +1 -0
  585. package/src/workspace/pr-report.schema.json +76 -3
  586. package/src/workspace/promote-waves.test.ts +296 -0
  587. package/src/workspace/promote-waves.ts +340 -0
  588. package/src/workspace/promote.test.ts +158 -4
  589. package/src/workspace/promote.ts +398 -57
  590. package/src/workspace/reason-codes.test.ts +4 -1
  591. package/src/workspace/reason-codes.ts +14 -0
  592. package/src/workspace/search-contract.ts +2 -0
  593. package/src/workspace/search.schema.json +103 -5
@@ -0,0 +1,1387 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://intentius.io/chant/schemas/graph/v1/graph.schema.json",
4
+ "title": "chant-graph/v1",
5
+ "description": "Generated from chant core's TypeScript types (packages/core/src/engine-facts.ts, packages/core/src/lifecycle/index-document.ts, packages/core/src/lifecycle/adoption-file.ts) by `npm run generate:graph-schema`; do not edit by hand. Three documents: an engine graph (`#/$defs/EngineGraphDocument`, what `choudoufu live-graph -json` and `plunge graph --json` print, chant#4520), an index version (`#/$defs/IndexDocument`, behold#1025) and an adoption file (`#/$defs/AdoptionFile`, the `adopt: v1` input choudoufu, plunge and chant adopt from, chant#4536). Objects are closed so a writer's test catches a misspelled field; a reader ignores fields it does not know.",
6
+ "anyOf": [
7
+ {
8
+ "$ref": "#/$defs/EngineGraphDocument"
9
+ },
10
+ {
11
+ "$ref": "#/$defs/IndexDocument"
12
+ },
13
+ {
14
+ "$ref": "#/$defs/AdoptionFile"
15
+ }
16
+ ],
17
+ "$defs": {
18
+ "AdoptionFile": {
19
+ "description": "An adoption file (`adopt: \"v1\"`): one index version and the nodes to adopt from it.",
20
+ "type": "object",
21
+ "properties": {
22
+ "adopt": {
23
+ "const": "v1"
24
+ },
25
+ "index": {
26
+ "$ref": "#/$defs/AdoptionIndexRef"
27
+ },
28
+ "select": {
29
+ "type": "array",
30
+ "items": {
31
+ "$ref": "#/$defs/AdoptionSelection"
32
+ }
33
+ }
34
+ },
35
+ "required": [
36
+ "adopt",
37
+ "index",
38
+ "select"
39
+ ],
40
+ "additionalProperties": false
41
+ },
42
+ "AdoptionIndexRef": {
43
+ "description": "The index version an adoption file reads from.",
44
+ "type": "object",
45
+ "properties": {
46
+ "scopeKey": {
47
+ "description": "The version's `stamp.scopeKey`: `cloud/<substrate>/<scopeId>/<scope digest>`.",
48
+ "type": "string"
49
+ },
50
+ "version": {
51
+ "description": "The version's file name under the scope key: `<observedAt>-<digest12>.json`.",
52
+ "type": "string"
53
+ },
54
+ "digest": {
55
+ "description": "The version's `stamp.digest`, sha256 hex. A `sha256:` prefix is accepted and ignored.",
56
+ "type": "string"
57
+ }
58
+ },
59
+ "required": [
60
+ "scopeKey",
61
+ "version",
62
+ "digest"
63
+ ],
64
+ "additionalProperties": false
65
+ },
66
+ "AdoptionSelection": {
67
+ "description": "One node to adopt.",
68
+ "type": "object",
69
+ "properties": {
70
+ "node": {
71
+ "description": "The index node id: `<substrate>/<scopeId>/<location>/<listedType>/<nativeId>`.",
72
+ "type": "string"
73
+ },
74
+ "as": {
75
+ "description": "The engine's address for the object: a Terraform address for choudoufu, a URN name and parent for plunge, an entity (logical) name for chant.",
76
+ "type": "string"
77
+ },
78
+ "type": {
79
+ "description": "The engine's type (`aws_lb`, `aws:s3/bucket:Bucket`, `AWS::S3::Bucket`). Left out only when the node's listed type joins to exactly one engine type; an engine refuses an ambiguous join without it, naming every candidate.",
80
+ "type": "string"
81
+ }
82
+ },
83
+ "required": [
84
+ "node",
85
+ "as"
86
+ ],
87
+ "additionalProperties": false
88
+ },
89
+ "ChantIndexScope": {
90
+ "description": "A chant source: a snapshot or `chant graph --format ir`. Today's snapshot key, unchanged.",
91
+ "type": "object",
92
+ "properties": {
93
+ "kind": {
94
+ "const": "chant"
95
+ },
96
+ "member": {
97
+ "description": "`.` for a project outside a workspace.",
98
+ "type": "string"
99
+ },
100
+ "env": {
101
+ "type": "string"
102
+ },
103
+ "stack": {
104
+ "type": "string"
105
+ },
106
+ "lexicon": {
107
+ "type": "string"
108
+ }
109
+ },
110
+ "required": [
111
+ "kind",
112
+ "member",
113
+ "env",
114
+ "lexicon"
115
+ ],
116
+ "additionalProperties": false
117
+ },
118
+ "CloudIndexScope": {
119
+ "description": "A direct cloud read (behold#1029). Lists are sorted and deduplicated by canonicalScope.",
120
+ "type": "object",
121
+ "properties": {
122
+ "kind": {
123
+ "const": "cloud"
124
+ },
125
+ "substrate": {
126
+ "type": "string",
127
+ "enum": [
128
+ "aws",
129
+ "azure",
130
+ "gcp",
131
+ "kubernetes"
132
+ ]
133
+ },
134
+ "scopeId": {
135
+ "description": "The account, subscription, project or cluster.",
136
+ "type": "string"
137
+ },
138
+ "locations": {
139
+ "description": "Regions or locations, or `\"*\"` for every one.",
140
+ "anyOf": [
141
+ {
142
+ "type": "array",
143
+ "items": {
144
+ "type": "string"
145
+ }
146
+ },
147
+ {
148
+ "type": "string",
149
+ "enum": [
150
+ "*"
151
+ ]
152
+ }
153
+ ]
154
+ },
155
+ "types": {
156
+ "description": "Listed types, or `\"*\"` for every one.",
157
+ "anyOf": [
158
+ {
159
+ "type": "array",
160
+ "items": {
161
+ "type": "string"
162
+ }
163
+ },
164
+ {
165
+ "type": "string",
166
+ "enum": [
167
+ "*"
168
+ ]
169
+ }
170
+ ]
171
+ },
172
+ "tagFilter": {
173
+ "description": "A tag or label filter, when the read had one.",
174
+ "type": "object",
175
+ "additionalProperties": {
176
+ "type": "string"
177
+ }
178
+ }
179
+ },
180
+ "required": [
181
+ "kind",
182
+ "substrate",
183
+ "scopeId",
184
+ "locations",
185
+ "types"
186
+ ],
187
+ "additionalProperties": false
188
+ },
189
+ "CoverageEntry": {
190
+ "description": "What a read looked at, per type and location. A node can be absent only where this says `listed`. `\"*\"` in `listedType` or `location` means every type or every location (behold#1029's lister writes it for a run with `types` or `locations` of `\"*\"`); indexCoverageFor honours it.",
191
+ "type": "object",
192
+ "properties": {
193
+ "listedType": {
194
+ "type": "string"
195
+ },
196
+ "location": {
197
+ "type": "string"
198
+ },
199
+ "verdict": {
200
+ "type": "string",
201
+ "enum": [
202
+ "filtered",
203
+ "listed",
204
+ "no-binding",
205
+ "no-credentials",
206
+ "not-reached",
207
+ "read-failed",
208
+ "unsupported-kind"
209
+ ]
210
+ },
211
+ "detail": {
212
+ "type": "string"
213
+ }
214
+ },
215
+ "required": [
216
+ "listedType",
217
+ "location",
218
+ "verdict"
219
+ ],
220
+ "additionalProperties": false
221
+ },
222
+ "EdgeGrain": {
223
+ "description": "What an edge joins (#4520): two blocks, two instances, or a property of one instance to another. Absent on an edge whose source does not say.",
224
+ "type": "string",
225
+ "enum": [
226
+ "block",
227
+ "instance",
228
+ "property"
229
+ ]
230
+ },
231
+ "EngineCloudId": {
232
+ "description": "One cloud identifier of a node.",
233
+ "type": "object",
234
+ "properties": {
235
+ "kind": {
236
+ "type": "string",
237
+ "enum": [
238
+ "arn",
239
+ "import-id",
240
+ "k8s-uid",
241
+ "provider-id",
242
+ "self-link"
243
+ ]
244
+ },
245
+ "value": {
246
+ "type": "string"
247
+ }
248
+ },
249
+ "required": [
250
+ "kind",
251
+ "value"
252
+ ],
253
+ "additionalProperties": false
254
+ },
255
+ "EngineFacts": {
256
+ "description": "What an ownership engine observed about one node (#4520). Never read for a decision. Every field is optional: one the engine cannot supply is absent, never guessed, and a reader shows it as unknown.",
257
+ "type": "object",
258
+ "properties": {
259
+ "ownership": {
260
+ "description": "The engine's ownership verdict. A node built from configuration alone has none.",
261
+ "type": "string",
262
+ "enum": [
263
+ "bound",
264
+ "foreign",
265
+ "pending",
266
+ "unowned"
267
+ ]
268
+ },
269
+ "markers": {
270
+ "$ref": "#/$defs/EngineMarkers"
271
+ },
272
+ "ownedBy": {
273
+ "description": "What bound the node: a marker, the engine's record, or its name.",
274
+ "type": "string",
275
+ "enum": [
276
+ "marker",
277
+ "name",
278
+ "record"
279
+ ]
280
+ },
281
+ "cloudIds": {
282
+ "description": "The node's cloud ids. The first is the primary one and equals `physicalId` when both are set.",
283
+ "type": "array",
284
+ "items": {
285
+ "$ref": "#/$defs/EngineCloudId"
286
+ }
287
+ },
288
+ "recordVersions": {
289
+ "$ref": "#/$defs/EngineRecordVersions"
290
+ },
291
+ "observedAt": {
292
+ "description": "ISO 8601 UTC, when this node's live facts were read.",
293
+ "type": "string"
294
+ }
295
+ },
296
+ "additionalProperties": false
297
+ },
298
+ "EngineGraphDocument": {
299
+ "description": "The one JSON document `choudoufu live-graph -json` and `plunge graph --json` print. A `GraphIR` at version 1: node ids are the engine's own addresses (choudoufu's instance address, plunge's URN), and readers map them with `entityKeyFor`, `observedInstanceNodeId` and `pulumiNodeKey`.",
300
+ "type": "object",
301
+ "properties": {
302
+ "version": {
303
+ "const": 1
304
+ },
305
+ "meta": {
306
+ "$ref": "#/$defs/EngineGraphDocumentMeta"
307
+ },
308
+ "nodes": {
309
+ "type": "array",
310
+ "items": {
311
+ "$ref": "#/$defs/IRNode"
312
+ }
313
+ },
314
+ "edges": {
315
+ "type": "array",
316
+ "items": {
317
+ "$ref": "#/$defs/IREdge"
318
+ }
319
+ },
320
+ "groups": {
321
+ "$ref": "#/$defs/IRGroups"
322
+ },
323
+ "exports": {
324
+ "description": "Outputs this stack publishes for other stacks to import (#513).",
325
+ "type": "array",
326
+ "items": {
327
+ "$ref": "#/$defs/IRExport"
328
+ }
329
+ },
330
+ "imports": {
331
+ "description": "Parameters this stack imports from other stacks. A viewer matches an import's `name` to another stack's export `name` to draw the cross-stack edge; the parameter's in-stack consumers are ordinary `$ref` edges to it (#513).",
332
+ "type": "array",
333
+ "items": {
334
+ "$ref": "#/$defs/IRImport"
335
+ }
336
+ },
337
+ "pipeline": {
338
+ "description": "The CI/pipeline projection alongside the component graph (#989) — see IRPipeline.",
339
+ "$ref": "#/$defs/IRPipeline"
340
+ },
341
+ "dangling": {
342
+ "description": "References that name nothing in this graph (#3910) — see IRDanglingRef. Absent when there are none.",
343
+ "type": "array",
344
+ "items": {
345
+ "$ref": "#/$defs/IRDanglingRef"
346
+ }
347
+ },
348
+ "derivedAttrs": {
349
+ "description": "Attributes chant computed rather than read back from the provider, keyed by the kind they were folded onto. An enrichment pass records what it derived here so callers can report the graph's own surface without knowing any attribute name — the set is whatever the passes produced, not a list maintained by hand.",
350
+ "type": "object",
351
+ "additionalProperties": {
352
+ "type": "array",
353
+ "items": {
354
+ "type": "string"
355
+ }
356
+ }
357
+ },
358
+ "capabilityView": {
359
+ "description": "With `chant graph --format ir --capability-view` (#4378): the lexicon-neutral view capability rules read, built by this chant through the project's own lexicon mappings and adapters. A `ViewDocument` (`capabilities/view.ts`). Absent unless asked for."
360
+ },
361
+ "rootReads": {
362
+ "description": "With `chant graph --live` (INTENTIUS/chant#4452): which read answered each root, the observation's structured RootRead report passed through as the lexicon wrote it, keyed by the lexicon's root key (terraform uses `terraform.roots.<root>`). `depth` is the read asked for, and `fellBackTo` and `reason` are set only when that read failed, so the read that answered is `fellBackTo ?? depth`. A consumer reads this and never the stderr notes that say the same thing in prose. Additive: absent when no lexicon reported one (a lexicon with one read path, a source graph, an `--at` replay), and an older chant never writes it.",
363
+ "type": "object",
364
+ "additionalProperties": {
365
+ "$ref": "#/$defs/RootRead"
366
+ }
367
+ }
368
+ },
369
+ "required": [
370
+ "version",
371
+ "meta",
372
+ "nodes",
373
+ "edges",
374
+ "groups"
375
+ ],
376
+ "additionalProperties": false
377
+ },
378
+ "EngineGraphDocumentMeta": {
379
+ "description": "The open `meta` bag of an engine graph document, holding `engineGraph`.",
380
+ "type": "object",
381
+ "properties": {
382
+ "engineGraph": {
383
+ "$ref": "#/$defs/EngineGraphMeta"
384
+ }
385
+ },
386
+ "required": [
387
+ "engineGraph"
388
+ ]
389
+ },
390
+ "EngineGraphEngine": {
391
+ "description": "The engine that printed the document.",
392
+ "type": "object",
393
+ "properties": {
394
+ "name": {
395
+ "description": "`choudoufu` or `plunge`.",
396
+ "type": "string"
397
+ },
398
+ "version": {
399
+ "type": "string"
400
+ }
401
+ },
402
+ "required": [
403
+ "name"
404
+ ],
405
+ "additionalProperties": false
406
+ },
407
+ "EngineGraphGap": {
408
+ "description": "A node the engine could not describe, and why.",
409
+ "type": "object",
410
+ "properties": {
411
+ "address": {
412
+ "type": "string"
413
+ },
414
+ "reason": {
415
+ "type": "string"
416
+ },
417
+ "detail": {
418
+ "type": "string"
419
+ }
420
+ },
421
+ "required": [
422
+ "address",
423
+ "reason"
424
+ ],
425
+ "additionalProperties": false
426
+ },
427
+ "EngineGraphMeta": {
428
+ "description": "`meta.engineGraph` on an engine graph document.",
429
+ "type": "object",
430
+ "properties": {
431
+ "format": {
432
+ "description": "ENGINE_GRAPH_FORMAT.",
433
+ "const": 1
434
+ },
435
+ "engine": {
436
+ "$ref": "#/$defs/EngineGraphEngine"
437
+ },
438
+ "scope": {
439
+ "$ref": "#/$defs/EngineGraphScope"
440
+ },
441
+ "observedAt": {
442
+ "description": "ISO 8601 UTC, when the read started. Absent when nothing was read live.",
443
+ "type": "string"
444
+ },
445
+ "markerScheme": {
446
+ "$ref": "#/$defs/EngineMarkerScheme"
447
+ },
448
+ "gaps": {
449
+ "type": "array",
450
+ "items": {
451
+ "$ref": "#/$defs/EngineGraphGap"
452
+ }
453
+ }
454
+ },
455
+ "required": [
456
+ "format",
457
+ "engine",
458
+ "scope"
459
+ ],
460
+ "additionalProperties": false
461
+ },
462
+ "EngineGraphScope": {
463
+ "description": "What the read covered: a choudoufu estate or a plunge stack.",
464
+ "anyOf": [
465
+ {
466
+ "type": "object",
467
+ "properties": {
468
+ "kind": {
469
+ "const": "estate"
470
+ },
471
+ "estate": {
472
+ "type": "string"
473
+ }
474
+ },
475
+ "required": [
476
+ "kind",
477
+ "estate"
478
+ ],
479
+ "additionalProperties": false
480
+ },
481
+ {
482
+ "type": "object",
483
+ "properties": {
484
+ "kind": {
485
+ "const": "stack"
486
+ },
487
+ "project": {
488
+ "type": "string"
489
+ },
490
+ "stack": {
491
+ "type": "string"
492
+ }
493
+ },
494
+ "required": [
495
+ "kind",
496
+ "project",
497
+ "stack"
498
+ ],
499
+ "additionalProperties": false
500
+ }
501
+ ]
502
+ },
503
+ "EngineIndexScope": {
504
+ "description": "A graph an engine printed (choudoufu, plunge).",
505
+ "type": "object",
506
+ "properties": {
507
+ "kind": {
508
+ "const": "engine"
509
+ },
510
+ "engine": {
511
+ "type": "string"
512
+ },
513
+ "estate": {
514
+ "description": "choudoufu's estate.",
515
+ "type": "string"
516
+ },
517
+ "project": {
518
+ "description": "plunge's project and stack.",
519
+ "type": "string"
520
+ },
521
+ "stack": {
522
+ "type": "string"
523
+ },
524
+ "backend": {
525
+ "description": "The backend URL, with any credentials stripped before it reaches here.",
526
+ "type": "string"
527
+ }
528
+ },
529
+ "required": [
530
+ "kind",
531
+ "engine"
532
+ ],
533
+ "additionalProperties": false
534
+ },
535
+ "EngineMarkerScheme": {
536
+ "description": "The marker keys and encodings the engine passes into its sweep packages, printed once per document.",
537
+ "type": "object",
538
+ "properties": {
539
+ "ownerKey": {
540
+ "type": "string"
541
+ },
542
+ "addressKey": {
543
+ "type": "string"
544
+ },
545
+ "continuationKeys": {
546
+ "description": "Keys a long value continues into (`tofu-slot`, `plunge-urn-2`).",
547
+ "type": "array",
548
+ "items": {
549
+ "type": "string"
550
+ }
551
+ },
552
+ "encoding": {
553
+ "type": "object",
554
+ "properties": {
555
+ "tags": {
556
+ "type": "string",
557
+ "enum": [
558
+ "digest",
559
+ "escaped",
560
+ "plain"
561
+ ]
562
+ },
563
+ "labels": {
564
+ "type": "string",
565
+ "enum": [
566
+ "digest",
567
+ "escaped",
568
+ "plain"
569
+ ]
570
+ }
571
+ },
572
+ "required": [
573
+ "tags",
574
+ "labels"
575
+ ],
576
+ "additionalProperties": false
577
+ }
578
+ },
579
+ "required": [
580
+ "ownerKey",
581
+ "addressKey",
582
+ "encoding"
583
+ ],
584
+ "additionalProperties": false
585
+ },
586
+ "EngineMarkers": {
587
+ "description": "The marker values an engine read or recorded for one node.",
588
+ "type": "object",
589
+ "properties": {
590
+ "owner": {
591
+ "description": "The estate name, or plunge's `<project>/<stack>`. A digest under encoding `digest`.",
592
+ "type": "string"
593
+ },
594
+ "address": {
595
+ "description": "The tofu-address value, or plunge's URN without stack and project. Same encoding rule as `owner`.",
596
+ "type": "string"
597
+ },
598
+ "encoding": {
599
+ "description": "How `owner` and `address` are written on the object.",
600
+ "type": "string",
601
+ "enum": [
602
+ "digest",
603
+ "escaped",
604
+ "plain"
605
+ ]
606
+ },
607
+ "source": {
608
+ "description": "`live`: read off the live object. `record`: what the engine's record says it wrote.",
609
+ "type": "string",
610
+ "enum": [
611
+ "live",
612
+ "record"
613
+ ]
614
+ }
615
+ },
616
+ "required": [
617
+ "encoding",
618
+ "source"
619
+ ],
620
+ "additionalProperties": false
621
+ },
622
+ "EngineRecordVersion": {
623
+ "description": "One version of a node's record. No record values.",
624
+ "type": "object",
625
+ "properties": {
626
+ "id": {
627
+ "type": "string"
628
+ },
629
+ "writtenAt": {
630
+ "description": "ISO 8601 UTC.",
631
+ "type": "string"
632
+ },
633
+ "current": {
634
+ "type": "boolean"
635
+ },
636
+ "deleted": {
637
+ "type": "boolean"
638
+ }
639
+ },
640
+ "required": [
641
+ "id",
642
+ "writtenAt",
643
+ "current",
644
+ "deleted"
645
+ ],
646
+ "additionalProperties": false
647
+ },
648
+ "EngineRecordVersions": {
649
+ "description": "The versions of a node's record, when the run asked for them (`-history`, `--versions`).",
650
+ "type": "object",
651
+ "properties": {
652
+ "kept": {
653
+ "description": "False for a store that replaces records in place (local, Kubernetes).",
654
+ "type": "boolean"
655
+ },
656
+ "versions": {
657
+ "description": "Newest first.",
658
+ "type": "array",
659
+ "items": {
660
+ "$ref": "#/$defs/EngineRecordVersion"
661
+ }
662
+ }
663
+ },
664
+ "required": [
665
+ "kept",
666
+ "versions"
667
+ ],
668
+ "additionalProperties": false
669
+ },
670
+ "GraphIR": {
671
+ "description": "The full graph IR for a project at the default (declarable) detail level.",
672
+ "type": "object",
673
+ "properties": {
674
+ "version": {
675
+ "description": "GRAPH_IR_VERSION, stamped by `chant graph --format ir` when it writes the IR (#2529). Absent on an IR built in memory, and on output from a chant older than the field, which a reader treats as version 1.",
676
+ "type": "number"
677
+ },
678
+ "nodes": {
679
+ "type": "array",
680
+ "items": {
681
+ "$ref": "#/$defs/IRNode"
682
+ }
683
+ },
684
+ "edges": {
685
+ "type": "array",
686
+ "items": {
687
+ "$ref": "#/$defs/IREdge"
688
+ }
689
+ },
690
+ "groups": {
691
+ "$ref": "#/$defs/IRGroups"
692
+ },
693
+ "meta": {
694
+ "description": "Graph-level facts that are about the whole read rather than any one node.\n\nDeliberately an open bag. A fact lands here when it has no node to sit on — `_behaviour` (#2377) carries the engine, its version, the traffic level the figures are *at*, and the estate's totals, or a whole refusal report when there was no engine to ask. None of that is a property of a single entity, and putting the refusal on nodes would mean writing it N times or dropping it, and dropping it is the one outcome the contract forbids (`./behaviour-overlay.ts`).\n\nAbsent unless something filled it, and a consumer reads absence as \"not looked\" rather than as a negative finding.",
695
+ "type": "object"
696
+ },
697
+ "exports": {
698
+ "description": "Outputs this stack publishes for other stacks to import (#513).",
699
+ "type": "array",
700
+ "items": {
701
+ "$ref": "#/$defs/IRExport"
702
+ }
703
+ },
704
+ "imports": {
705
+ "description": "Parameters this stack imports from other stacks. A viewer matches an import's `name` to another stack's export `name` to draw the cross-stack edge; the parameter's in-stack consumers are ordinary `$ref` edges to it (#513).",
706
+ "type": "array",
707
+ "items": {
708
+ "$ref": "#/$defs/IRImport"
709
+ }
710
+ },
711
+ "pipeline": {
712
+ "description": "The CI/pipeline projection alongside the component graph (#989) — see IRPipeline.",
713
+ "$ref": "#/$defs/IRPipeline"
714
+ },
715
+ "dangling": {
716
+ "description": "References that name nothing in this graph (#3910) — see IRDanglingRef. Absent when there are none.",
717
+ "type": "array",
718
+ "items": {
719
+ "$ref": "#/$defs/IRDanglingRef"
720
+ }
721
+ },
722
+ "derivedAttrs": {
723
+ "description": "Attributes chant computed rather than read back from the provider, keyed by the kind they were folded onto. An enrichment pass records what it derived here so callers can report the graph's own surface without knowing any attribute name — the set is whatever the passes produced, not a list maintained by hand.",
724
+ "type": "object",
725
+ "additionalProperties": {
726
+ "type": "array",
727
+ "items": {
728
+ "type": "string"
729
+ }
730
+ }
731
+ },
732
+ "capabilityView": {
733
+ "description": "With `chant graph --format ir --capability-view` (#4378): the lexicon-neutral view capability rules read, built by this chant through the project's own lexicon mappings and adapters. A `ViewDocument` (`capabilities/view.ts`). Absent unless asked for."
734
+ },
735
+ "rootReads": {
736
+ "description": "With `chant graph --live` (INTENTIUS/chant#4452): which read answered each root, the observation's structured RootRead report passed through as the lexicon wrote it, keyed by the lexicon's root key (terraform uses `terraform.roots.<root>`). `depth` is the read asked for, and `fellBackTo` and `reason` are set only when that read failed, so the read that answered is `fellBackTo ?? depth`. A consumer reads this and never the stderr notes that say the same thing in prose. Additive: absent when no lexicon reported one (a lexicon with one read path, a source graph, an `--at` replay), and an older chant never writes it.",
737
+ "type": "object",
738
+ "additionalProperties": {
739
+ "$ref": "#/$defs/RootRead"
740
+ }
741
+ }
742
+ },
743
+ "required": [
744
+ "nodes",
745
+ "edges",
746
+ "groups"
747
+ ],
748
+ "additionalProperties": false
749
+ },
750
+ "IRDanglingRef": {
751
+ "description": "A reference whose target is not a node of this graph (#3910): a job `needs` a job no workflow declares, a `uses:` names another repository's workflow, a GitLab `include:` names a file chant did not generate. Kept on the IR rather than dropped or matched to a near name, so a reader can tell \"no dependency\" from \"a dependency on something outside this project\". Field names follow the live resolver's `DanglingRef` (./graph-refs.ts).",
752
+ "type": "object",
753
+ "properties": {
754
+ "from": {
755
+ "description": "The node holding the reference.",
756
+ "type": "string"
757
+ },
758
+ "kind": {
759
+ "description": "The edge kind the reference would have been.",
760
+ "$ref": "#/$defs/IREdgeKind"
761
+ },
762
+ "path": {
763
+ "description": "Where on `from` it was written, e.g. `needs`, `uses`, `trigger.include`.",
764
+ "type": "string"
765
+ },
766
+ "value": {
767
+ "description": "The reference exactly as written.",
768
+ "type": "string"
769
+ },
770
+ "crossPipeline": {
771
+ "description": "Same meaning as IREdge.crossPipeline.",
772
+ "type": "boolean"
773
+ }
774
+ },
775
+ "required": [
776
+ "from",
777
+ "kind",
778
+ "path",
779
+ "value"
780
+ ],
781
+ "additionalProperties": false
782
+ },
783
+ "IREdge": {
784
+ "description": "A directed dependency: `from` references `to` (an attribute of it, for `ref`).",
785
+ "type": "object",
786
+ "properties": {
787
+ "from": {
788
+ "type": "string"
789
+ },
790
+ "to": {
791
+ "type": "string"
792
+ },
793
+ "kind": {
794
+ "description": "\"ref\" for an AttrRef-derived edge; a CI kind otherwise (see IREdgeKind).",
795
+ "$ref": "#/$defs/IREdgeKind"
796
+ },
797
+ "viaAttr": {
798
+ "description": "The consumer-side property the reference flows through, when derivable.",
799
+ "type": "string"
800
+ },
801
+ "toAttr": {
802
+ "description": "The producer-side attribute referenced (e.g. \"id\"). Added at detail T3.",
803
+ "type": "string"
804
+ },
805
+ "crossPipeline": {
806
+ "description": "True when the edge leaves the pipeline `from` belongs to (#3910): a reusable-workflow call, a `workflow_run` trigger, a GitLab child or multi-project trigger, an include, a cross-project `needs`. A renderer that draws each pipeline as a group (IRGroups.byPipeline) reads this to route the edge between groups. Absent on every in-pipeline edge.",
807
+ "type": "boolean"
808
+ },
809
+ "grain": {
810
+ "description": "What the edge joins (#4520): two blocks, two instances, or a property of one instance to another. Set by an engine's graph (choudoufu: `block`; plunge: `instance` for dependencies, parents and providers, `property` for property dependencies). Absent when the source does not say. Two edges between the same pair that differ only in grain are two edges.",
811
+ "$ref": "#/$defs/EdgeGrain"
812
+ },
813
+ "origin": {
814
+ "description": "Where the edge came from (behold#1025): `declared` (an AttrRef or an EntityReference), `observed` (the engine or the cloud reported it), or `derived` (a reference catalog rule matched an attribute value to another node, #4522). Absent reads as `declared` on a source IR and `observed` on a live one, which is what both meant before the field.",
815
+ "type": "string",
816
+ "enum": [
817
+ "declared",
818
+ "derived",
819
+ "observed"
820
+ ]
821
+ },
822
+ "rule": {
823
+ "description": "With `origin: \"derived\"`: the rule that produced the edge, `<lexicon>:<from kind>:<path>` for a catalog rule and `<lexicon>:<from kind>:tag:<key>` for a typed tag rule.",
824
+ "type": "string"
825
+ },
826
+ "relation": {
827
+ "description": "`reference` (the default when absent) or `containment`: the holder sits inside the target (a subnet in its VPC). A containment edge is also in `groups.byContainer`, so a renderer that draws boxes can skip the line.",
828
+ "type": "string",
829
+ "enum": [
830
+ "containment",
831
+ "reference"
832
+ ]
833
+ }
834
+ },
835
+ "required": [
836
+ "from",
837
+ "to",
838
+ "kind"
839
+ ],
840
+ "additionalProperties": false
841
+ },
842
+ "IREdgeKind": {
843
+ "description": "What an edge means (#3910). `ref` is a typed cross-resource reference (an `AttrRef`, a `Ref` intrinsic, a whole node held in props, or an EntityReference). The rest are the dependency strings a CI lexicon writes, reported through a plugin's `graphEdges` hook:\n\n - `needs` — job waits for job (GitHub/GitLab `needs:`, GitLab stage order)\n - `calls` — job runs a reusable workflow or a local composite action (`uses:`)\n - `triggers` — a pipeline starts another one: GitLab `trigger:` (from starts to), GitHub `on.workflow_run` (to finishing starts from)\n - `includes` — a pipeline pulls in another file's config (GitLab `include:`)\n - `extends` — a job inherits another job's keys (GitLab `extends:`)\n\nEvery edge points from the entity that holds the reference to the entity it names. The set grows additively (GRAPH_IR_VERSION): a reader ignores a kind it does not know.",
844
+ "type": "string",
845
+ "enum": [
846
+ "calls",
847
+ "extends",
848
+ "includes",
849
+ "needs",
850
+ "ref",
851
+ "triggers"
852
+ ]
853
+ },
854
+ "IRExport": {
855
+ "description": "A cross-stack export this stack publishes (a `stackOutput`/`output`): its name (the matching key another stack imports by) and the node that produces it.",
856
+ "type": "object",
857
+ "properties": {
858
+ "name": {
859
+ "description": "Output name — the cross-stack handle (e.g. \"ClusterArn\").",
860
+ "type": "string"
861
+ },
862
+ "node": {
863
+ "description": "Logical name of the producing node, when resolvable.",
864
+ "type": "string"
865
+ },
866
+ "attr": {
867
+ "description": "Producer-side attribute the output reads (e.g. \"Arn\").",
868
+ "type": "string"
869
+ },
870
+ "value": {
871
+ "description": "The published value, when the graph was observed rather than declared (#1279)."
872
+ },
873
+ "stack": {
874
+ "description": "The deployed stack that publishes it, on an observed graph (#1279).",
875
+ "type": "string"
876
+ },
877
+ "previously": {
878
+ "description": "Names the output had before, from a rename hint a lexicon read (#3931).",
879
+ "type": "array",
880
+ "items": {
881
+ "type": "string"
882
+ }
883
+ }
884
+ },
885
+ "required": [
886
+ "name"
887
+ ],
888
+ "additionalProperties": false
889
+ },
890
+ "IRGroups": {
891
+ "description": "Grouping metadata for cluster/subgraph rendering. Maps group name -> node ids.",
892
+ "type": "object",
893
+ "properties": {
894
+ "byLexicon": {
895
+ "type": "object",
896
+ "additionalProperties": {
897
+ "type": "array",
898
+ "items": {
899
+ "type": "string"
900
+ }
901
+ }
902
+ },
903
+ "byComposite": {
904
+ "type": "object",
905
+ "additionalProperties": {
906
+ "type": "array",
907
+ "items": {
908
+ "type": "string"
909
+ }
910
+ }
911
+ },
912
+ "byStack": {
913
+ "description": "Deployable-stack grouping (`stackName → nodeIds`). Consumers (e.g. pinhole's boundary boxes) read this rather than inferring stacks — which is the point, so it should never require one.\n\nThree sources, depending on how the project is shaped:\n\n - **side-by-side stacks**, declared in config and composed by `buildDeclaredPerStack` — keys are the declared stack names. Nothing is inferred; the project stated both the names and the membership.\n - **entities that name their own unit** (entityStack, #2266) — keys are those names, one entry per unit. A terraform root is the case this exists for: five `terraform.roots` are five `terraform apply`s and five boundary boxes, not one bucket called `terraform`.\n - **one source tree** — keys are lexicon partitions, since each lexicon serialises to one deployable stack.\n\nFormerly documented as awaiting \"#513 phase 2\" to regroup by nested child-project. #513 is closed and that phase was never filed; directory partitioning is the exception rather than the rule (#1433).",
914
+ "type": "object",
915
+ "additionalProperties": {
916
+ "type": "array",
917
+ "items": {
918
+ "type": "string"
919
+ }
920
+ }
921
+ },
922
+ "byContainer": {
923
+ "description": "Live containment (#779): a container node id → the node ids directly inside it (VPC → subnets/SGs, subnet → instances/service). Nested *flatly* — a subnet is both a member of its VPC's entry and a key with its own members — so a boundary-box renderer recurses it. Populated by `chant graph --live` from the reference resolver's containment output; absent for source IR.",
924
+ "type": "object",
925
+ "additionalProperties": {
926
+ "type": "array",
927
+ "items": {
928
+ "type": "string"
929
+ }
930
+ }
931
+ },
932
+ "byWave": {
933
+ "description": "Component-graph deploy wave (`chant graph --components --format ir`): `wave-N → component node ids` that deploy in parallel in that wave. A wave-laned renderer reads this the way `byStack` drives boundary boxes. Present only for the component-DAG projection; absent for entity IR.",
934
+ "type": "object",
935
+ "additionalProperties": {
936
+ "type": "array",
937
+ "items": {
938
+ "type": "string"
939
+ }
940
+ }
941
+ },
942
+ "byPipeline": {
943
+ "description": "CI pipeline membership (#3910): a workflow or pipeline name -> the node ids it runs (the workflow node and its jobs). Reported by a CI lexicon's `graphEdges` hook; absent when no lexicon reports one. Edges marked `crossPipeline` run between these groups.",
944
+ "type": "object",
945
+ "additionalProperties": {
946
+ "type": "array",
947
+ "items": {
948
+ "type": "string"
949
+ }
950
+ }
951
+ }
952
+ },
953
+ "additionalProperties": false
954
+ },
955
+ "IRImport": {
956
+ "description": "A cross-stack import this stack consumes — a `Parameter` fed from another stack's output at deploy time. A viewer matches an import `name` to another stack's export `name` to draw the cross-stack edge; the parameter's in-stack consumers are ordinary `$ref` edges to `node` (#513). A reader that infers that match by name uses `joinKey()` from `./join-key.ts` and labels the edge `exact` or `folded`, the way `chant workspace graph` labels joins across members (#2539, ws-008).",
957
+ "type": "object",
958
+ "properties": {
959
+ "name": {
960
+ "description": "Parameter name — the cross-stack handle (e.g. \"clusterArn\").",
961
+ "type": "string"
962
+ },
963
+ "node": {
964
+ "description": "Logical name of the parameter node.",
965
+ "type": "string"
966
+ }
967
+ },
968
+ "required": [
969
+ "name",
970
+ "node"
971
+ ],
972
+ "additionalProperties": false
973
+ },
974
+ "IRNode": {
975
+ "description": "One resource in the graph.",
976
+ "type": "object",
977
+ "properties": {
978
+ "id": {
979
+ "description": "Logical name (the export name, or composite-expanded name).",
980
+ "type": "string"
981
+ },
982
+ "kind": {
983
+ "description": "Resource type, e.g. \"GkeCluster\".",
984
+ "type": "string"
985
+ },
986
+ "lexicon": {
987
+ "description": "Lexicon the resource belongs to, e.g. \"gcp\".",
988
+ "type": "string"
989
+ },
990
+ "compositeParent": {
991
+ "description": "Name of the composite *type* that expanded this node, when it came from one (e.g. \"CockroachDbCluster\").",
992
+ "type": "string"
993
+ },
994
+ "compositeInstance": {
995
+ "description": "The composite *instance* (export name) this node belongs to — shared by every node from the same composite call. Detail tiers collapse on this (#494).",
996
+ "type": "string"
997
+ },
998
+ "attrs": {
999
+ "description": "Literal/const/ref-resolved props. References appear as `{ $ref }`.",
1000
+ "type": "object"
1001
+ },
1002
+ "sourceLoc": {
1003
+ "description": "Where the node was declared.",
1004
+ "$ref": "#/$defs/SourceLoc"
1005
+ },
1006
+ "physicalId": {
1007
+ "description": "Live-only (`chant graph --live`): the observed physical identifier (id / ARN). Absent for source-derived IR. The reference resolver (#778) indexes on this to reconstruct edges from live resource references.",
1008
+ "type": "string"
1009
+ },
1010
+ "ownership": {
1011
+ "description": "Live-only: ownership verdict read from the resource's marker (#119/#120). `owned` = chant-managed. Absent for source-derived IR.",
1012
+ "type": "string",
1013
+ "enum": [
1014
+ "foreign",
1015
+ "owned"
1016
+ ]
1017
+ },
1018
+ "runtimeOwner": {
1019
+ "description": "Live-only, undeclared nodes: the declared entity this node's owner-reference chain resolves to (#1077) — a Pod a declared Deployment's controller created, for instance. Presence of this field is what an overlay reads to paint the node `runtime` instead of `warn`/foreign; a node without it (including every declared, source-derived node) is unaffected.",
1020
+ "type": "string"
1021
+ },
1022
+ "instanceOf": {
1023
+ "description": "On an instance node of a `count` or `for_each` block (#4454): the block node's id. The node's own id is that id followed by instanceKey, `aws_eip.pool[0]` under `aws_eip.pool`, and the block node stays in the graph as the rollup. Absent on every other node. See `./instance-nodes.ts`.",
1024
+ "type": "string"
1025
+ },
1026
+ "instanceKey": {
1027
+ "description": "With instanceOf: the block's own instance key as the engine prints it, `[0]` or `[\"a\"]`. Absent on an instance that only an expanded enclosing scope makes (#4486), a block without `count` under `module \"app\" { count = 2 }`.",
1028
+ "type": "string"
1029
+ },
1030
+ "instanceScope": {
1031
+ "description": "With instanceOf, under an expanded enclosing scope (#4486): that scope's path as the engine prints it, `module.app[0]`. The node id then carries the key on the scope's segment, `estate/module.app[0]/aws_eip.pool[1]`.",
1032
+ "type": "string"
1033
+ },
1034
+ "instanceRollup": {
1035
+ "description": "On a block node whose `count` or `for_each` the declared graph cannot count (#4489): why it stays one node, and the expression. Absent on a block that is not expanded and on one whose instances are listed. See `./instance-nodes.ts`.",
1036
+ "$ref": "#/$defs/InstanceRollup"
1037
+ },
1038
+ "facts": {
1039
+ "description": "What an ownership engine (choudoufu, plunge) observed about this node (#4520, #4527). On a live node it is copied from `ResourceMetadata.facts`. On a declared node it comes from the entity's entityFacts: the pulumi lexicon reads a plunge member's checked-in `engine-graph.json` beside its stack export (#4529). For people and for readers that show the graph. Nothing in chant decides from it, and ownership keeps its own meaning. Absent unless an engine supplied it. See `./engine-facts.ts`.",
1040
+ "$ref": "#/$defs/EngineFacts"
1041
+ },
1042
+ "listedType": {
1043
+ "description": "Indexed nodes only (#4521, behold#1025): the inventory API's own type name, as the cloud lister read it: `AWS::S3::Bucket`, `microsoft.storage/storageaccounts`, `storage.googleapis.com/Bucket`, `apps/v1/Deployment`. Absent on every node a cloud listing did not make.",
1044
+ "type": "string"
1045
+ },
1046
+ "location": {
1047
+ "description": "Indexed nodes only: the region or location the object was listed in, `global` for a global type, a namespace or `cluster` for Kubernetes.",
1048
+ "type": "string"
1049
+ },
1050
+ "nativeId": {
1051
+ "description": "Indexed nodes only: the identifier the listing returned, Cloud Control's `Identifier`, the ARM id, the asset `name`, or `namespace/name`.",
1052
+ "type": "string"
1053
+ },
1054
+ "tags": {
1055
+ "description": "Indexed nodes only: tags or labels as read, masked by key. Where markers come from.",
1056
+ "type": "object",
1057
+ "additionalProperties": {
1058
+ "type": "string"
1059
+ }
1060
+ },
1061
+ "unmappedKind": {
1062
+ "description": "Indexed nodes only: true when no lexicon kind maps the listed type. The node keeps `kind` = listedType and `lexicon` = the substrate, and is never dropped (#4521).",
1063
+ "type": "boolean"
1064
+ }
1065
+ },
1066
+ "required": [
1067
+ "id",
1068
+ "kind",
1069
+ "lexicon",
1070
+ "attrs"
1071
+ ],
1072
+ "additionalProperties": false
1073
+ },
1074
+ "IRPipeline": {
1075
+ "description": "The CI/pipeline projection of a component graph (#989): the stages/jobs/ `needs` a CI-provider lexicon (gitlab, github, forgejo, or any lexicon implementing `generateComponentPipeline`) would synthesize for `chant build --components --generate <lexicon>`, reused here — never re-derived — as first-class IR nodes/edges. A consumer (e.g. behold) reads this alongside the component graph's `nodes`/`edges`/`groups.byWave` to render the CI shape without parsing generated YAML. Present only when `chant graph --components --format ir` is invoked with `--projection <lexicon>`.",
1076
+ "type": "object",
1077
+ "properties": {
1078
+ "provider": {
1079
+ "description": "The CI-provider lexicon that produced this projection (e.g. \"gitlab\").",
1080
+ "type": "string"
1081
+ },
1082
+ "env": {
1083
+ "description": "The environment the projected pipeline deploys (#2046) — copied from the generator's own resolution (`ComponentPipelineResult.env`), so the IR carries the identity instead of leaving a consumer to lex it out of a job's run line.",
1084
+ "type": "string"
1085
+ },
1086
+ "stages": {
1087
+ "description": "Wave-ordered stage names — 1:1 with the component graph's `groups.byWave` keys.",
1088
+ "type": "array",
1089
+ "items": {
1090
+ "type": "string"
1091
+ }
1092
+ },
1093
+ "nodes": {
1094
+ "type": "array",
1095
+ "items": {
1096
+ "$ref": "#/$defs/IRPipelineNode"
1097
+ }
1098
+ },
1099
+ "edges": {
1100
+ "type": "array",
1101
+ "items": {
1102
+ "$ref": "#/$defs/IRPipelineEdge"
1103
+ }
1104
+ }
1105
+ },
1106
+ "required": [
1107
+ "provider",
1108
+ "stages",
1109
+ "nodes",
1110
+ "edges"
1111
+ ],
1112
+ "additionalProperties": false
1113
+ },
1114
+ "IRPipelineEdge": {
1115
+ "description": "A `needs:` dependency between two generated CI jobs — mirrors the `dependsOn` edge it derives from, consumer job → producer job.",
1116
+ "type": "object",
1117
+ "properties": {
1118
+ "from": {
1119
+ "type": "string"
1120
+ },
1121
+ "to": {
1122
+ "type": "string"
1123
+ },
1124
+ "kind": {
1125
+ "const": "needs"
1126
+ }
1127
+ },
1128
+ "required": [
1129
+ "from",
1130
+ "to",
1131
+ "kind"
1132
+ ],
1133
+ "additionalProperties": false
1134
+ },
1135
+ "IRPipelineNode": {
1136
+ "description": "One generated CI job in the pipeline projection (`chant graph --components --format ir --projection <lexicon>`, #989) — the same job a CI-provider lexicon's `generateComponentPipeline` synthesizes for `chant build --components --generate <lexicon>` (see `ComponentPipelineJob`, ./lexicon.ts), reshaped into the IR's node vocabulary.",
1137
+ "type": "object",
1138
+ "properties": {
1139
+ "id": {
1140
+ "description": "CI job name (the generator's job id — a safe YAML/workflow key).",
1141
+ "type": "string"
1142
+ },
1143
+ "kind": {
1144
+ "const": "CIJob"
1145
+ },
1146
+ "component": {
1147
+ "description": "The component this job triggers.",
1148
+ "type": "string"
1149
+ },
1150
+ "stage": {
1151
+ "description": "The stage/wave this job runs in — the same wave index as the component graph's `groups.byWave` (one CI stage/`needs:`-level per wave).",
1152
+ "type": "string"
1153
+ }
1154
+ },
1155
+ "required": [
1156
+ "id",
1157
+ "kind",
1158
+ "component",
1159
+ "stage"
1160
+ ],
1161
+ "additionalProperties": false
1162
+ },
1163
+ "IndexDocument": {
1164
+ "description": "One index version.",
1165
+ "type": "object",
1166
+ "properties": {
1167
+ "index": {
1168
+ "const": "v1"
1169
+ },
1170
+ "stamp": {
1171
+ "$ref": "#/$defs/IndexStamp"
1172
+ },
1173
+ "coverage": {
1174
+ "type": "array",
1175
+ "items": {
1176
+ "$ref": "#/$defs/CoverageEntry"
1177
+ }
1178
+ },
1179
+ "graph": {
1180
+ "$ref": "#/$defs/GraphIR"
1181
+ },
1182
+ "notes": {
1183
+ "type": "array",
1184
+ "items": {
1185
+ "$ref": "#/$defs/IndexNote"
1186
+ }
1187
+ }
1188
+ },
1189
+ "required": [
1190
+ "index",
1191
+ "stamp",
1192
+ "coverage",
1193
+ "graph"
1194
+ ],
1195
+ "additionalProperties": false
1196
+ },
1197
+ "IndexNote": {
1198
+ "description": "A type with no lister, a lexicon with no catalog, a disabled API.",
1199
+ "type": "object",
1200
+ "properties": {
1201
+ "kind": {
1202
+ "type": "string"
1203
+ },
1204
+ "message": {
1205
+ "type": "string"
1206
+ },
1207
+ "listedType": {
1208
+ "type": "string"
1209
+ },
1210
+ "location": {
1211
+ "type": "string"
1212
+ },
1213
+ "command": {
1214
+ "description": "A command the person can run themselves, never run by the source (a GCP API to enable).",
1215
+ "type": "string"
1216
+ }
1217
+ },
1218
+ "required": [
1219
+ "kind",
1220
+ "message"
1221
+ ],
1222
+ "additionalProperties": false
1223
+ },
1224
+ "IndexScope": {
1225
+ "anyOf": [
1226
+ {
1227
+ "$ref": "#/$defs/ChantIndexScope"
1228
+ },
1229
+ {
1230
+ "$ref": "#/$defs/CloudIndexScope"
1231
+ },
1232
+ {
1233
+ "$ref": "#/$defs/EngineIndexScope"
1234
+ }
1235
+ ]
1236
+ },
1237
+ "IndexSource": {
1238
+ "type": "object",
1239
+ "properties": {
1240
+ "kind": {
1241
+ "$ref": "#/$defs/IndexSourceKind"
1242
+ },
1243
+ "name": {
1244
+ "description": "`behold-lister`, `choudoufu`, `plunge`, `chant`.",
1245
+ "type": "string"
1246
+ },
1247
+ "version": {
1248
+ "type": "string"
1249
+ }
1250
+ },
1251
+ "required": [
1252
+ "kind",
1253
+ "name"
1254
+ ],
1255
+ "additionalProperties": false
1256
+ },
1257
+ "IndexSourceKind": {
1258
+ "description": "Who produced an index.",
1259
+ "type": "string",
1260
+ "enum": [
1261
+ "chant",
1262
+ "cloud",
1263
+ "engine"
1264
+ ]
1265
+ },
1266
+ "IndexStamp": {
1267
+ "type": "object",
1268
+ "properties": {
1269
+ "source": {
1270
+ "$ref": "#/$defs/IndexSource"
1271
+ },
1272
+ "scope": {
1273
+ "$ref": "#/$defs/IndexScope"
1274
+ },
1275
+ "scopeKey": {
1276
+ "description": "The store path the scope maps to (indexScopeKey): a reader refuses a mismatch by comparing it.",
1277
+ "type": "string"
1278
+ },
1279
+ "observedAt": {
1280
+ "description": "When the read started, ISO UTC.",
1281
+ "type": "string"
1282
+ },
1283
+ "completedAt": {
1284
+ "description": "When the last call returned, ISO UTC.",
1285
+ "type": "string"
1286
+ },
1287
+ "commit": {
1288
+ "description": "The source repository commit, when there is one.",
1289
+ "type": "string"
1290
+ },
1291
+ "digest": {
1292
+ "description": "sha256 hex of the canonical `graph` and `coverage` (indexDocumentDigest).",
1293
+ "type": "string"
1294
+ }
1295
+ },
1296
+ "required": [
1297
+ "source",
1298
+ "scope",
1299
+ "scopeKey",
1300
+ "observedAt",
1301
+ "digest"
1302
+ ],
1303
+ "additionalProperties": false
1304
+ },
1305
+ "InstanceRollup": {
1306
+ "description": "On a block node whose `count` or `for_each` the declared graph cannot count (#4489): why, and the expression it could not count. `argument` and `expression` are the block's own, or with `call` those of the enclosing module call that could not be counted.",
1307
+ "type": "object",
1308
+ "properties": {
1309
+ "code": {
1310
+ "type": "string",
1311
+ "enum": [
1312
+ "instances-each-value",
1313
+ "instances-form-unread",
1314
+ "instances-merge",
1315
+ "instances-module-uncounted",
1316
+ "instances-over-limit",
1317
+ "instances-value-unknown"
1318
+ ]
1319
+ },
1320
+ "argument": {
1321
+ "description": "`count` or `for_each`.",
1322
+ "type": "string",
1323
+ "enum": [
1324
+ "count",
1325
+ "for_each"
1326
+ ]
1327
+ },
1328
+ "expression": {
1329
+ "description": "The expression as written, without the `${ }` around it.",
1330
+ "type": "string"
1331
+ },
1332
+ "call": {
1333
+ "description": "With `instances-module-uncounted`: the module call, `module.app` or `module.app.module.db`.",
1334
+ "type": "string"
1335
+ }
1336
+ },
1337
+ "required": [
1338
+ "code",
1339
+ "argument",
1340
+ "expression"
1341
+ ],
1342
+ "additionalProperties": false
1343
+ },
1344
+ "RootRead": {
1345
+ "description": "The read a root was asked for and the one that answered. `depth` is the read asked for (`\"plan\"` for a plan-depth root, `\"live+plan\"` for a live root at the plan depth). `fellBackTo` is set only when that read failed: the read that answered instead (`\"live\"` is live-plan alone, for a live root), or `\"declared\"` when none did. `reason` is a short machine-stable cause, not prose to match on.",
1346
+ "type": "object",
1347
+ "properties": {
1348
+ "depth": {
1349
+ "type": "string"
1350
+ },
1351
+ "fellBackTo": {
1352
+ "type": "string",
1353
+ "enum": [
1354
+ "declared",
1355
+ "live",
1356
+ "state"
1357
+ ]
1358
+ },
1359
+ "reason": {
1360
+ "type": "string"
1361
+ }
1362
+ },
1363
+ "required": [
1364
+ "depth"
1365
+ ],
1366
+ "additionalProperties": false
1367
+ },
1368
+ "SourceLoc": {
1369
+ "description": "Where in the source a node came from. Entity-level (file), not a line map.",
1370
+ "type": "object",
1371
+ "properties": {
1372
+ "file": {
1373
+ "description": "Path of the declaring file, relative to the project root when possible.",
1374
+ "type": "string"
1375
+ },
1376
+ "line": {
1377
+ "description": "Line number, when available. Provenance is entity-level today, so this is usually absent — reserved for a future source map.",
1378
+ "type": "number"
1379
+ }
1380
+ },
1381
+ "required": [
1382
+ "file"
1383
+ ],
1384
+ "additionalProperties": false
1385
+ }
1386
+ }
1387
+ }