@intentius/chant 0.13.1 → 0.15.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 (450) hide show
  1. package/dist/audit/catalog.d.ts +45 -5
  2. package/dist/audit/catalog.d.ts.map +1 -1
  3. package/dist/audit/proof.d.ts +3 -0
  4. package/dist/audit/proof.d.ts.map +1 -1
  5. package/dist/audit/report-model.d.ts +4 -1
  6. package/dist/audit/report-model.d.ts.map +1 -1
  7. package/dist/audit/report.d.ts +3 -0
  8. package/dist/audit/report.d.ts.map +1 -1
  9. package/dist/audit/rules-doc.d.ts +8 -2
  10. package/dist/audit/rules-doc.d.ts.map +1 -1
  11. package/dist/cli/commands/audit.d.ts.map +1 -1
  12. package/dist/cli/commands/doctor.d.ts.map +1 -1
  13. package/dist/cli/commands/lexicon-rolling-upgrade.d.ts +37 -0
  14. package/dist/cli/commands/lexicon-rolling-upgrade.d.ts.map +1 -0
  15. package/dist/cli/commands/lexicon-surface-diff.d.ts +48 -0
  16. package/dist/cli/commands/lexicon-surface-diff.d.ts.map +1 -0
  17. package/dist/cli/commands/lint.d.ts.map +1 -1
  18. package/dist/cli/commands/pinned-upgrade.d.ts +41 -0
  19. package/dist/cli/commands/pinned-upgrade.d.ts.map +1 -0
  20. package/dist/cli/handlers/build.d.ts.map +1 -1
  21. package/dist/cli/handlers/components.d.ts +39 -0
  22. package/dist/cli/handlers/components.d.ts.map +1 -0
  23. package/dist/cli/handlers/dev.d.ts +3 -0
  24. package/dist/cli/handlers/dev.d.ts.map +1 -1
  25. package/dist/cli/handlers/graph.d.ts +4 -2
  26. package/dist/cli/handlers/graph.d.ts.map +1 -1
  27. package/dist/cli/handlers/misc.d.ts.map +1 -1
  28. package/dist/cli/handlers/run.d.ts +49 -0
  29. package/dist/cli/handlers/run.d.ts.map +1 -1
  30. package/dist/cli/main.d.ts.map +1 -1
  31. package/dist/cli/registry.d.ts +35 -0
  32. package/dist/cli/registry.d.ts.map +1 -1
  33. package/dist/codegen/fetch.d.ts +22 -0
  34. package/dist/codegen/fetch.d.ts.map +1 -1
  35. package/dist/codegen/lexicon-regen.d.ts +110 -0
  36. package/dist/codegen/lexicon-regen.d.ts.map +1 -0
  37. package/dist/codegen/pinned-upgrade.d.ts +153 -0
  38. package/dist/codegen/pinned-upgrade.d.ts.map +1 -0
  39. package/dist/codegen/rolling-upgrade.d.ts +138 -0
  40. package/dist/codegen/rolling-upgrade.d.ts.map +1 -0
  41. package/dist/codegen/surface-snapshot.d.ts +173 -0
  42. package/dist/codegen/surface-snapshot.d.ts.map +1 -0
  43. package/dist/codegen/version-bump.d.ts +21 -0
  44. package/dist/codegen/version-bump.d.ts.map +1 -0
  45. package/dist/components/auto-release.d.ts +93 -0
  46. package/dist/components/auto-release.d.ts.map +1 -0
  47. package/dist/components/builders.d.ts +37 -0
  48. package/dist/components/builders.d.ts.map +1 -0
  49. package/dist/components/capability-plugin-loader.d.ts +111 -0
  50. package/dist/components/capability-plugin-loader.d.ts.map +1 -0
  51. package/dist/components/capability-plugin-schema.d.ts +24 -0
  52. package/dist/components/capability-plugin-schema.d.ts.map +1 -0
  53. package/dist/components/capability-plugin.d.ts +85 -0
  54. package/dist/components/capability-plugin.d.ts.map +1 -0
  55. package/dist/components/capability.d.ts +89 -0
  56. package/dist/components/capability.d.ts.map +1 -0
  57. package/dist/components/cli-support.d.ts +204 -0
  58. package/dist/components/cli-support.d.ts.map +1 -0
  59. package/dist/components/component.d.ts +179 -0
  60. package/dist/components/component.d.ts.map +1 -0
  61. package/dist/components/config-defaults.d.ts +41 -0
  62. package/dist/components/config-defaults.d.ts.map +1 -0
  63. package/dist/components/discover.d.ts +60 -0
  64. package/dist/components/discover.d.ts.map +1 -0
  65. package/dist/components/driver-output.d.ts +20 -0
  66. package/dist/components/driver-output.d.ts.map +1 -0
  67. package/dist/components/driver.d.ts +209 -0
  68. package/dist/components/driver.d.ts.map +1 -0
  69. package/dist/components/index.d.ts +22 -0
  70. package/dist/components/index.d.ts.map +1 -0
  71. package/dist/components/manifest-persistence.d.ts +79 -0
  72. package/dist/components/manifest-persistence.d.ts.map +1 -0
  73. package/dist/components/pilots/alb-ecs.pilot.d.ts +27 -0
  74. package/dist/components/pilots/alb-ecs.pilot.d.ts.map +1 -0
  75. package/dist/components/pilots/dynamodb.pilot.d.ts +22 -0
  76. package/dist/components/pilots/dynamodb.pilot.d.ts.map +1 -0
  77. package/dist/components/pilots/jar-emr.pilot.d.ts +37 -0
  78. package/dist/components/pilots/jar-emr.pilot.d.ts.map +1 -0
  79. package/dist/components/pilots/lambda.pilot.d.ts +35 -0
  80. package/dist/components/pilots/lambda.pilot.d.ts.map +1 -0
  81. package/dist/components/pilots/neo4j-fanout.pilot.d.ts +17 -0
  82. package/dist/components/pilots/neo4j-fanout.pilot.d.ts.map +1 -0
  83. package/dist/components/pilots/project.d.ts +13 -0
  84. package/dist/components/pilots/project.d.ts.map +1 -0
  85. package/dist/components/presets/ecs-fargate.d.ts +59 -0
  86. package/dist/components/presets/ecs-fargate.d.ts.map +1 -0
  87. package/dist/components/presets/index.d.ts +29 -0
  88. package/dist/components/presets/index.d.ts.map +1 -0
  89. package/dist/components/presets/lambda.d.ts +35 -0
  90. package/dist/components/presets/lambda.d.ts.map +1 -0
  91. package/dist/components/presets/single-host-compose.d.ts +43 -0
  92. package/dist/components/presets/single-host-compose.d.ts.map +1 -0
  93. package/dist/components/registry.d.ts +29 -0
  94. package/dist/components/registry.d.ts.map +1 -0
  95. package/dist/components/starter-plugin.d.ts +51 -0
  96. package/dist/components/starter-plugin.d.ts.map +1 -0
  97. package/dist/components/temporal-codegen-loader.d.ts +27 -0
  98. package/dist/components/temporal-codegen-loader.d.ts.map +1 -0
  99. package/dist/components/verbs/__tests__/mock-cloud-executor.d.ts +35 -0
  100. package/dist/components/verbs/__tests__/mock-cloud-executor.d.ts.map +1 -0
  101. package/dist/components/verbs/__tests__/mock-process-runner.d.ts +45 -0
  102. package/dist/components/verbs/__tests__/mock-process-runner.d.ts.map +1 -0
  103. package/dist/components/verbs/__tests__/mock-sbom-generator.d.ts +33 -0
  104. package/dist/components/verbs/__tests__/mock-sbom-generator.d.ts.map +1 -0
  105. package/dist/components/verbs/bom-writer.d.ts +155 -0
  106. package/dist/components/verbs/bom-writer.d.ts.map +1 -0
  107. package/dist/components/verbs/build-archive.d.ts +205 -0
  108. package/dist/components/verbs/build-archive.d.ts.map +1 -0
  109. package/dist/components/verbs/build.d.ts +150 -0
  110. package/dist/components/verbs/build.d.ts.map +1 -0
  111. package/dist/components/verbs/cloud-executor.d.ts +88 -0
  112. package/dist/components/verbs/cloud-executor.d.ts.map +1 -0
  113. package/dist/components/verbs/component-bom.d.ts +103 -0
  114. package/dist/components/verbs/component-bom.d.ts.map +1 -0
  115. package/dist/components/verbs/index.d.ts +49 -0
  116. package/dist/components/verbs/index.d.ts.map +1 -0
  117. package/dist/components/verbs/license-policy.d.ts +56 -0
  118. package/dist/components/verbs/license-policy.d.ts.map +1 -0
  119. package/dist/components/verbs/lockfile-sbom-generator.d.ts +81 -0
  120. package/dist/components/verbs/lockfile-sbom-generator.d.ts.map +1 -0
  121. package/dist/components/verbs/process-runner.d.ts +64 -0
  122. package/dist/components/verbs/process-runner.d.ts.map +1 -0
  123. package/dist/components/verbs/reproducibility.d.ts +80 -0
  124. package/dist/components/verbs/reproducibility.d.ts.map +1 -0
  125. package/dist/components/verbs/sbom-generator.d.ts +157 -0
  126. package/dist/components/verbs/sbom-generator.d.ts.map +1 -0
  127. package/dist/components/verbs/sbom.d.ts +79 -0
  128. package/dist/components/verbs/sbom.d.ts.map +1 -0
  129. package/dist/components/verbs/shell.d.ts +35 -0
  130. package/dist/components/verbs/shell.d.ts.map +1 -0
  131. package/dist/components/verbs/sign.d.ts +222 -0
  132. package/dist/components/verbs/sign.d.ts.map +1 -0
  133. package/dist/components/verbs/stub.d.ts +18 -0
  134. package/dist/components/verbs/stub.d.ts.map +1 -0
  135. package/dist/components/verbs/tool-sbom-generator.d.ts +51 -0
  136. package/dist/components/verbs/tool-sbom-generator.d.ts.map +1 -0
  137. package/dist/components/verbs/verify.d.ts +106 -0
  138. package/dist/components/verbs/verify.d.ts.map +1 -0
  139. package/dist/components/verbs/vex.d.ts +65 -0
  140. package/dist/components/verbs/vex.d.ts.map +1 -0
  141. package/dist/components/verbs/vuln-gate.d.ts +91 -0
  142. package/dist/components/verbs/vuln-gate.d.ts.map +1 -0
  143. package/dist/components/verbs/vuln-scan.d.ts +116 -0
  144. package/dist/components/verbs/vuln-scan.d.ts.map +1 -0
  145. package/dist/components/verbs/wait-verify.d.ts +85 -0
  146. package/dist/components/verbs/wait-verify.d.ts.map +1 -0
  147. package/dist/config.d.ts +205 -0
  148. package/dist/config.d.ts.map +1 -1
  149. package/dist/index.d.ts +4 -0
  150. package/dist/index.d.ts.map +1 -1
  151. package/dist/lexicon.d.ts +78 -0
  152. package/dist/lexicon.d.ts.map +1 -1
  153. package/dist/lifecycle/build-ledger-store.d.ts +121 -0
  154. package/dist/lifecycle/build-ledger-store.d.ts.map +1 -0
  155. package/dist/lifecycle/build-ledger.d.ts +225 -0
  156. package/dist/lifecycle/build-ledger.d.ts.map +1 -0
  157. package/dist/lifecycle/git.d.ts +84 -0
  158. package/dist/lifecycle/git.d.ts.map +1 -1
  159. package/dist/lifecycle/index.d.ts +5 -0
  160. package/dist/lifecycle/index.d.ts.map +1 -1
  161. package/dist/lifecycle/oras-referrer-lookup.d.ts +41 -0
  162. package/dist/lifecycle/oras-referrer-lookup.d.ts.map +1 -0
  163. package/dist/lifecycle/release-ledger.d.ts +122 -0
  164. package/dist/lifecycle/release-ledger.d.ts.map +1 -0
  165. package/dist/lifecycle/status.d.ts +150 -0
  166. package/dist/lifecycle/status.d.ts.map +1 -0
  167. package/dist/lint/component-checks.d.ts +95 -0
  168. package/dist/lint/component-checks.d.ts.map +1 -0
  169. package/dist/lint/engine.d.ts +23 -0
  170. package/dist/lint/engine.d.ts.map +1 -1
  171. package/dist/lint/presets/strict.json +8 -1
  172. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.d.ts +4 -0
  173. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.d.ts.map +1 -0
  174. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.d.ts +4 -0
  175. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.d.ts.map +1 -0
  176. package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.d.ts +4 -0
  177. package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.d.ts.map +1 -0
  178. package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.d.ts +4 -0
  179. package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.d.ts.map +1 -0
  180. package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.d.ts +4 -0
  181. package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.d.ts.map +1 -0
  182. package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.d.ts +10 -0
  183. package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.d.ts.map +1 -0
  184. package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.d.ts +3 -0
  185. package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.d.ts.map +1 -0
  186. package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.d.ts +4 -0
  187. package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.d.ts.map +1 -0
  188. package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.d.ts +4 -0
  189. package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.d.ts.map +1 -0
  190. package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.d.ts +4 -0
  191. package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.d.ts.map +1 -0
  192. package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.d.ts +4 -0
  193. package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.d.ts.map +1 -0
  194. package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.d.ts +4 -0
  195. package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.d.ts.map +1 -0
  196. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.d.ts +4 -0
  197. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.d.ts.map +1 -0
  198. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.d.ts +4 -0
  199. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.d.ts.map +1 -0
  200. package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.d.ts +4 -0
  201. package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.d.ts.map +1 -0
  202. package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.d.ts +4 -0
  203. package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.d.ts.map +1 -0
  204. package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.d.ts +4 -0
  205. package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.d.ts.map +1 -0
  206. package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.d.ts +4 -0
  207. package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.d.ts.map +1 -0
  208. package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.d.ts +4 -0
  209. package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.d.ts.map +1 -0
  210. package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.d.ts +4 -0
  211. package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.d.ts.map +1 -0
  212. package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.d.ts +3 -0
  213. package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.d.ts.map +1 -0
  214. package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.d.ts +4 -0
  215. package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.d.ts.map +1 -0
  216. package/dist/lint/rules/comp/comp001-publishes-never-applies.d.ts +20 -0
  217. package/dist/lint/rules/comp/comp001-publishes-never-applies.d.ts.map +1 -0
  218. package/dist/lint/rules/comp/comp002-dangling-wiring-ref.d.ts +28 -0
  219. package/dist/lint/rules/comp/comp002-dangling-wiring-ref.d.ts.map +1 -0
  220. package/dist/lint/rules/comp/comp003-mutating-no-rollback.d.ts +39 -0
  221. package/dist/lint/rules/comp/comp003-mutating-no-rollback.d.ts.map +1 -0
  222. package/dist/lint/rules/comp/comp004-gate-needs-temporal.d.ts +37 -0
  223. package/dist/lint/rules/comp/comp004-gate-needs-temporal.d.ts.map +1 -0
  224. package/dist/lint/rules/comp/comp005-capability-kind-is-noun.d.ts +43 -0
  225. package/dist/lint/rules/comp/comp005-capability-kind-is-noun.d.ts.map +1 -0
  226. package/dist/lint/rules/comp/comp006-shell-needs-reason.d.ts +22 -0
  227. package/dist/lint/rules/comp/comp006-shell-needs-reason.d.ts.map +1 -0
  228. package/dist/lint/rules/comp/comp007-composition-sprawl.d.ts +33 -0
  229. package/dist/lint/rules/comp/comp007-composition-sprawl.d.ts.map +1 -0
  230. package/dist/lint/rules/comp/index.d.ts +18 -0
  231. package/dist/lint/rules/comp/index.d.ts.map +1 -0
  232. package/dist/lint/rules/comp/support.d.ts +71 -0
  233. package/dist/lint/rules/comp/support.d.ts.map +1 -0
  234. package/dist/lsp/lexicon-providers.d.ts.map +1 -1
  235. package/dist/op/activity-registry.d.ts +11 -6
  236. package/dist/op/activity-registry.d.ts.map +1 -1
  237. package/dist/op/activity-runtime.d.ts +24 -0
  238. package/dist/op/activity-runtime.d.ts.map +1 -0
  239. package/dist/op/builders.d.ts +56 -0
  240. package/dist/op/builders.d.ts.map +1 -1
  241. package/dist/op/index.d.ts +2 -1
  242. package/dist/op/index.d.ts.map +1 -1
  243. package/dist/ownership.d.ts +20 -14
  244. package/dist/ownership.d.ts.map +1 -1
  245. package/package.json +14 -1
  246. package/src/audit/catalog.test.ts +74 -22
  247. package/src/audit/catalog.ts +74 -471
  248. package/src/audit/proof.ts +4 -2
  249. package/src/audit/report-html.test.ts +14 -7
  250. package/src/audit/report-model.ts +20 -9
  251. package/src/audit/report.test.ts +36 -13
  252. package/src/audit/report.ts +2 -0
  253. package/src/audit/rules-doc.test.ts +8 -6
  254. package/src/audit/rules-doc.ts +13 -5
  255. package/src/cli/commands/audit.ts +23 -18
  256. package/src/cli/commands/component-lint.test.ts +158 -0
  257. package/src/cli/commands/doctor.test.ts +116 -2
  258. package/src/cli/commands/doctor.ts +46 -0
  259. package/src/cli/commands/lexicon-rolling-upgrade.ts +198 -0
  260. package/src/cli/commands/lexicon-surface-diff.test.ts +104 -0
  261. package/src/cli/commands/lexicon-surface-diff.ts +185 -0
  262. package/src/cli/commands/lint.ts +142 -1
  263. package/src/cli/commands/pinned-upgrade.ts +204 -0
  264. package/src/cli/handlers/build.ts +58 -1
  265. package/src/cli/handlers/components.test.ts +504 -0
  266. package/src/cli/handlers/components.ts +404 -0
  267. package/src/cli/handlers/dev.ts +60 -1
  268. package/src/cli/handlers/graph.ts +47 -2
  269. package/src/cli/handlers/misc.ts +45 -1
  270. package/src/cli/handlers/run.test.ts +967 -3
  271. package/src/cli/handlers/run.ts +618 -11
  272. package/src/cli/main.test.ts +66 -0
  273. package/src/cli/main.ts +105 -2
  274. package/src/cli/registry.ts +35 -0
  275. package/src/codegen/fetch.test.ts +84 -3
  276. package/src/codegen/fetch.ts +76 -2
  277. package/src/codegen/lexicon-regen.test.ts +298 -0
  278. package/src/codegen/lexicon-regen.ts +545 -0
  279. package/src/codegen/pinned-upgrade.test.ts +399 -0
  280. package/src/codegen/pinned-upgrade.ts +423 -0
  281. package/src/codegen/rolling-upgrade.test.ts +333 -0
  282. package/src/codegen/rolling-upgrade.ts +320 -0
  283. package/src/codegen/surface-snapshot.test.ts +461 -0
  284. package/src/codegen/surface-snapshot.ts +546 -0
  285. package/src/codegen/version-bump.test.ts +47 -0
  286. package/src/codegen/version-bump.ts +39 -0
  287. package/src/components/README.md +130 -0
  288. package/src/components/SPRAWL-VALIDATION.md +181 -0
  289. package/src/components/__fixtures__/alb-ecs-service.json +51 -0
  290. package/src/components/__fixtures__/dynamodb-infra.json +32 -0
  291. package/src/components/__fixtures__/emr-job-consumer.json +26 -0
  292. package/src/components/__fixtures__/jar-lib-producer.json +16 -0
  293. package/src/components/__fixtures__/lambda-image-processor.json +28 -0
  294. package/src/components/__fixtures__/neo4j-fanout.json +34 -0
  295. package/src/components/__fixtures__/single-host-compose.json +29 -0
  296. package/src/components/auto-release.test.ts +217 -0
  297. package/src/components/auto-release.ts +216 -0
  298. package/src/components/builders.test.ts +45 -0
  299. package/src/components/builders.ts +71 -0
  300. package/src/components/capability-plugin-loader.ts +218 -0
  301. package/src/components/capability-plugin-schema.ts +56 -0
  302. package/src/components/capability-plugin.test.ts +235 -0
  303. package/src/components/capability-plugin.ts +108 -0
  304. package/src/components/capability.ts +117 -0
  305. package/src/components/cli-support.test.ts +579 -0
  306. package/src/components/cli-support.ts +481 -0
  307. package/src/components/component-schema.test.ts +265 -0
  308. package/src/components/component.schema.json +235 -0
  309. package/src/components/component.test.ts +251 -0
  310. package/src/components/component.ts +255 -0
  311. package/src/components/config-defaults.test.ts +263 -0
  312. package/src/components/config-defaults.ts +145 -0
  313. package/src/components/discover.test.ts +352 -0
  314. package/src/components/discover.ts +167 -0
  315. package/src/components/driver-output.ts +71 -0
  316. package/src/components/driver.test.ts +638 -0
  317. package/src/components/driver.ts +690 -0
  318. package/src/components/index.ts +113 -0
  319. package/src/components/manifest-persistence.test.ts +152 -0
  320. package/src/components/manifest-persistence.ts +164 -0
  321. package/src/components/pilots/README.md +33 -0
  322. package/src/components/pilots/alb-ecs.pilot.ts +63 -0
  323. package/src/components/pilots/dynamodb.pilot.ts +59 -0
  324. package/src/components/pilots/jar-emr.pilot.ts +69 -0
  325. package/src/components/pilots/lambda.pilot.ts +55 -0
  326. package/src/components/pilots/neo4j-fanout.pilot.ts +92 -0
  327. package/src/components/pilots/pilots-lint-clean.test.ts +78 -0
  328. package/src/components/pilots/pilots.test.ts +126 -0
  329. package/src/components/pilots/project.ts +13 -0
  330. package/src/components/presets/comp007-reduction.test.ts +122 -0
  331. package/src/components/presets/ecs-fargate.test.ts +84 -0
  332. package/src/components/presets/ecs-fargate.ts +103 -0
  333. package/src/components/presets/index.ts +32 -0
  334. package/src/components/presets/lambda.test.ts +35 -0
  335. package/src/components/presets/lambda.ts +53 -0
  336. package/src/components/presets/single-host-compose.test.ts +65 -0
  337. package/src/components/presets/single-host-compose.ts +64 -0
  338. package/src/components/registry.test.ts +112 -0
  339. package/src/components/registry.ts +37 -0
  340. package/src/components/starter-plugin.ts +105 -0
  341. package/src/components/temporal-codegen-loader.ts +41 -0
  342. package/src/components/verbs/__fixtures__/package-lock.json +45 -0
  343. package/src/components/verbs/__fixtures__/pom.xml +37 -0
  344. package/src/components/verbs/__fixtures__/schemas/cyclonedx-1.5.schema.json +3800 -0
  345. package/src/components/verbs/__fixtures__/schemas/cyclonedx-spdx-license.schema.json +621 -0
  346. package/src/components/verbs/__fixtures__/schemas/jsf-0.82.schema.json +240 -0
  347. package/src/components/verbs/__fixtures__/schemas/spdx-2.3.schema.json +740 -0
  348. package/src/components/verbs/__tests__/mock-cloud-executor.ts +102 -0
  349. package/src/components/verbs/__tests__/mock-process-runner.ts +79 -0
  350. package/src/components/verbs/__tests__/mock-sbom-generator.ts +85 -0
  351. package/src/components/verbs/bom-writer.test.ts +331 -0
  352. package/src/components/verbs/bom-writer.ts +386 -0
  353. package/src/components/verbs/build-archive.test.ts +251 -0
  354. package/src/components/verbs/build-archive.ts +296 -0
  355. package/src/components/verbs/build.test.ts +222 -0
  356. package/src/components/verbs/build.ts +252 -0
  357. package/src/components/verbs/cloud-executor.ts +181 -0
  358. package/src/components/verbs/component-bom.test.ts +219 -0
  359. package/src/components/verbs/component-bom.ts +189 -0
  360. package/src/components/verbs/index.ts +49 -0
  361. package/src/components/verbs/license-policy.ts +115 -0
  362. package/src/components/verbs/lockfile-sbom-generator.test.ts +195 -0
  363. package/src/components/verbs/lockfile-sbom-generator.ts +236 -0
  364. package/src/components/verbs/process-runner.test.ts +79 -0
  365. package/src/components/verbs/process-runner.ts +113 -0
  366. package/src/components/verbs/reproducibility.test.ts +24 -0
  367. package/src/components/verbs/reproducibility.ts +100 -0
  368. package/src/components/verbs/sbom-generator.test.ts +96 -0
  369. package/src/components/verbs/sbom-generator.ts +209 -0
  370. package/src/components/verbs/sbom.test.ts +184 -0
  371. package/src/components/verbs/sbom.ts +152 -0
  372. package/src/components/verbs/shell.test.ts +36 -0
  373. package/src/components/verbs/shell.ts +51 -0
  374. package/src/components/verbs/sign.test.ts +210 -0
  375. package/src/components/verbs/sign.ts +350 -0
  376. package/src/components/verbs/stub.ts +34 -0
  377. package/src/components/verbs/tool-sbom-generator.test.ts +194 -0
  378. package/src/components/verbs/tool-sbom-generator.ts +192 -0
  379. package/src/components/verbs/verify.test.ts +159 -0
  380. package/src/components/verbs/verify.ts +179 -0
  381. package/src/components/verbs/vex.ts +182 -0
  382. package/src/components/verbs/vuln-gate.test.ts +201 -0
  383. package/src/components/verbs/vuln-gate.ts +170 -0
  384. package/src/components/verbs/vuln-scan.test.ts +145 -0
  385. package/src/components/verbs/vuln-scan.ts +266 -0
  386. package/src/components/verbs/wait-verify.test.ts +111 -0
  387. package/src/components/verbs/wait-verify.ts +171 -0
  388. package/src/config.test.ts +74 -1
  389. package/src/config.ts +219 -0
  390. package/src/index.ts +32 -0
  391. package/src/lexicon.ts +88 -0
  392. package/src/lifecycle/build-ledger-store.test.ts +217 -0
  393. package/src/lifecycle/build-ledger-store.ts +165 -0
  394. package/src/lifecycle/build-ledger.test.ts +349 -0
  395. package/src/lifecycle/build-ledger.ts +305 -0
  396. package/src/lifecycle/git.test.ts +118 -0
  397. package/src/lifecycle/git.ts +149 -14
  398. package/src/lifecycle/index.ts +5 -0
  399. package/src/lifecycle/oras-referrer-lookup.test.ts +116 -0
  400. package/src/lifecycle/oras-referrer-lookup.ts +110 -0
  401. package/src/lifecycle/release-ledger.test.ts +209 -0
  402. package/src/lifecycle/release-ledger.ts +185 -0
  403. package/src/lifecycle/status.test.ts +330 -0
  404. package/src/lifecycle/status.ts +278 -0
  405. package/src/lint/component-checks.ts +148 -0
  406. package/src/lint/config.test.ts +21 -0
  407. package/src/lint/engine.ts +11 -2
  408. package/src/lint/presets/relaxed.json +8 -1
  409. package/src/lint/presets/strict.json +8 -1
  410. package/src/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.ts +9 -0
  411. package/src/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.ts +9 -0
  412. package/src/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.ts +11 -0
  413. package/src/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.ts +13 -0
  414. package/src/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.ts +11 -0
  415. package/src/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.ts +27 -0
  416. package/src/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.ts +10 -0
  417. package/src/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.ts +23 -0
  418. package/src/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.ts +10 -0
  419. package/src/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.ts +19 -0
  420. package/src/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.ts +10 -0
  421. package/src/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.ts +20 -0
  422. package/src/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.ts +23 -0
  423. package/src/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.ts +10 -0
  424. package/src/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.ts +14 -0
  425. package/src/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.ts +18 -0
  426. package/src/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.ts +10 -0
  427. package/src/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.ts +14 -0
  428. package/src/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.ts +13 -0
  429. package/src/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.ts +13 -0
  430. package/src/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.ts +12 -0
  431. package/src/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.ts +18 -0
  432. package/src/lint/rules/comp/comp.test.ts +378 -0
  433. package/src/lint/rules/comp/comp001-publishes-never-applies.ts +78 -0
  434. package/src/lint/rules/comp/comp002-dangling-wiring-ref.ts +94 -0
  435. package/src/lint/rules/comp/comp003-mutating-no-rollback.ts +115 -0
  436. package/src/lint/rules/comp/comp004-gate-needs-temporal.ts +66 -0
  437. package/src/lint/rules/comp/comp005-capability-kind-is-noun.ts +113 -0
  438. package/src/lint/rules/comp/comp006-shell-needs-reason.ts +55 -0
  439. package/src/lint/rules/comp/comp007-composition-sprawl.ts +71 -0
  440. package/src/lint/rules/comp/index.ts +37 -0
  441. package/src/lint/rules/comp/support.ts +173 -0
  442. package/src/lsp/lexicon-providers.test.ts +55 -0
  443. package/src/lsp/lexicon-providers.ts +13 -3
  444. package/src/op/activity-registry.test.ts +38 -0
  445. package/src/op/activity-registry.ts +31 -12
  446. package/src/op/activity-runtime.ts +73 -0
  447. package/src/op/builders.ts +92 -0
  448. package/src/op/index.ts +3 -1
  449. package/src/ownership.test.ts +24 -26
  450. package/src/ownership.ts +26 -38
@@ -0,0 +1,130 @@
1
+ # Component contract schema
2
+
3
+ `component.schema.json` is the portable JSON Schema (draft 2020-12) for the
4
+ **Component contract** described in the
5
+ [Components docs](../../../../docs/src/content/docs/components/) —
6
+ specifically
7
+ [`component-contract.mdx`](../../../../docs/src/content/docs/components/component-contract.mdx)
8
+ (fields, archetypes, the JSON projection) and
9
+ [`composition-and-wiring.mdx`](../../../../docs/src/content/docs/components/composition-and-wiring.mdx)
10
+ (the phase grammar, fan-out, and wiring reference forms). Those docs are
11
+ authoritative over this schema's prose; the schema is authoritative over the
12
+ document *shape*.
13
+
14
+ ## This schema is the substrate, not a chant-only type
15
+
16
+ A component is declarative data. chant's TypeScript authoring form (`Component`,
17
+ `phase()`, capability builders, etc. — tracked separately, see #551 "Chant-native
18
+ plugin" phase) is one typed frontend that **projects to** this JSON document. A
19
+ non-chant or legacy component can hand-write this JSON directly and be driven
20
+ by the same generic orchestrator, with no chant authoring step required. Making
21
+ the contract a portable spec rather than a runtime-only object is what keeps
22
+ walk-away cost low: nothing about participating in the release model requires
23
+ adopting chant.
24
+
25
+ ## What it models
26
+
27
+ - **Identity and ordering** — `name`, `dependsOn` (ordering only, resolved by
28
+ `chant graph --stacks`, no logic).
29
+ - **Live name mapping** — `liveNames` (#598), optional: the live lexicon
30
+ entity/resource name(s) this component owns, when they differ from `name`.
31
+ `chant components status --live` (`../lifecycle/status.ts`) joins the
32
+ release ledger against live evidence by name; `liveNames` lets that join
33
+ work for a component whose own name isn't the entity/resource name it
34
+ deploys, falling back to `name` itself when omitted. See
35
+ docs/src/content/docs/components/observability.mdx.
36
+ - **The three archetypes** — service (build → publish → apply → verify),
37
+ infra (apply → verify, no build), and producer/library (build → publish
38
+ only, no service apply). `deploy` being a plain composition is what makes
39
+ build-only and apply-only shapes first-class rather than special cases.
40
+ - **The composition grammar** — `deploy` is an ordered list of `Phase`s;
41
+ phases carry `steps` (capability invocations), an optional `parallel` flag,
42
+ and an optional `onFailure` for saga-style compensation. A step may itself
43
+ be a nested `Phase`, which is how fan-out (e.g. a Neo4j cluster seeding one
44
+ node then rolling through the rest) is expressed as composition rather than
45
+ orchestrator knowledge.
46
+ - **Gates** — a distinct step shape (`kind: "gate"`, `signalName`) for a
47
+ durable, human-approval wait.
48
+ - **Wiring reference forms**, all resolved by the graph, never by orchestrator
49
+ code:
50
+ - `$env.<path>` — environment config (e.g. `$env.registry`).
51
+ - `@<Phase>.<field>` — a prior step's output within the same component
52
+ (e.g. `@Publish.digest`).
53
+ - `@<component>.publish.uri|digest|key` — another component's published
54
+ artifact output (e.g. `@jar-lib.publish.uri`); the referenced component
55
+ must appear in `dependsOn`.
56
+ - `{ "stackOutput": { "stack", "name" } }` — a cross-stack
57
+ CloudFormation/ARM/... output, the JSON-side equivalent of the
58
+ TypeScript `stackOutput()` mechanism.
59
+
60
+ Capability-specific step properties (beyond the cross-cutting wiring-typed
61
+ ones like `imageRef`/`jar`/`revision`/`inputs`) are intentionally left open
62
+ (`additionalProperties: true` on `Step`). The capability interface and its
63
+ per-verb input/output types are the subject of a separate spec (#554); this
64
+ schema only needs every capability invocation to be representable as
65
+ `{ kind, ...params }`.
66
+
67
+ ## Versioning
68
+
69
+ - `$id` is stable: `https://intentius.io/chant/schemas/component/v1/component.schema.json`.
70
+ A breaking change to the contract gets a new `v2` path; this file does not
71
+ change shape incompatibly in place.
72
+ - `contractVersion` (currently pinned to `"1.0.0"`) is the document-level
73
+ version field a hand-written component can assert against.
74
+
75
+ ## Fixtures and tests
76
+
77
+ `__fixtures__/` holds real components drawn from the epic (#551): an ALB/ECS
78
+ service, a DynamoDB table, a Neo4j fan-out cluster, a JAR producer and its EMR
79
+ consumer, a single-host Docker Compose service, and (#558) a container-image
80
+ Lambda function. `component-schema.test.ts` validates every fixture against
81
+ `component.schema.json` with [ajv](https://ajv.js.org/) (`ajv/dist/2020` — the
82
+ draft 2020-12 build) and exercises the schema's negative cases (missing
83
+ required fields, malformed wiring references, an invalid archetype, a gate
84
+ missing `signalName`, and so on).
85
+
86
+ ## Typed authoring form (`component.ts`, #560)
87
+
88
+ `component.ts` is the real typed `Component` authoring frontend the docs
89
+ describe: `Component`, `Phase`, `Step`, `Gate`, `BuildSpec`, `Wiring` mirror
90
+ this schema's `$defs` field-for-field, plus the `phase()`/`gate()`/
91
+ `stackOutput()` builders and `projectToJson()` (the mechanical TS → JSON
92
+ projection, filling in `archetype` via `inferArchetype` when a component
93
+ doesn't set one explicitly — see the archetype table above). It supersedes
94
+ the Phase 1 stopgap `pilots/authoring-shape.ts` (deleted), which explicitly
95
+ deferred the real API to this issue.
96
+
97
+ ## Discovery (`discover.ts`, #560)
98
+
99
+ `discoverComponents(path)` finds every `Component` declared under a
100
+ directory, mirroring chant's existing declarable discovery
101
+ (`../discovery/index.ts`) as closely as a structurally distinct type allows,
102
+ and borrowing its file-suffix convention from Op discovery
103
+ (`../op/discover.ts`'s `*.op.ts`): any `.component.ts` file (excluding
104
+ `.test.component.ts`/`.spec.component.ts`) is scanned, every export
105
+ satisfying `isComponent` is collected (any export name, not just `default`,
106
+ so one file may declare several related components), and a duplicate
107
+ `component.name` across files is a discovery error — the same duplicate-name
108
+ discipline `collectEntities`/`discoverOps` already apply to resources/Ops.
109
+ `*.component.ts` was chosen over reusing the generic `.ts` + `Declarable`
110
+ marker convention because a `Component` has no `lexicon`/`entityType` shape
111
+ to tag; see `discover.ts`'s docstring for the full reasoning.
112
+
113
+ ## Pilots
114
+
115
+ `pilots/` (#555) authors three of those fixtures — the ALB/ECS service, the
116
+ DynamoDB table, and the Neo4j fan-out cluster — a second way: as TypeScript
117
+ authored against `component.ts`, composed from the real capability verbs in
118
+ `verbs/`. Each pilot's JSON projection is asserted equal to its
119
+ `__fixtures__/*.json` counterpart, so the fixture stays the one authoritative
120
+ JSON document; see `pilots/README.md` for the axis-by-axis mapping (build vs
121
+ no-build, single vs fan-out, sticky vs simple apply, cross-stack wiring, auto
122
+ vs no rollback).
123
+
124
+ `pilots/lambda.pilot.ts` (#558) adds a fourth component the same way — a
125
+ container-image Lambda function — to validate the sprawl metric holds beyond
126
+ the three pilots that were picked specifically to prove it. See
127
+ [`SPRAWL-VALIDATION.md`](./SPRAWL-VALIDATION.md) for the full write-up: the
128
+ before/after against the ALB/ECS pipeline's `describe-stacks | jq` glue, and
129
+ the per-component scorecard (new pipelines / driver edits / declarations /
130
+ capabilities) the epic's "definition of done" asks for.
@@ -0,0 +1,181 @@
1
+ # Sprawl metric validation (#558, epic #551)
2
+
3
+ This validates the sprawl metric epic #551 defines as its "definition of
4
+ done" against the three real pilots (#555) plus a fourth, deliberately
5
+ different component added here. Everything below runs through the one
6
+ generic `runInterpretDriver` (#556, [`../driver.ts`](./driver.ts)), unchanged.
7
+
8
+ ## The metric, from #551
9
+
10
+ > - Typical new component: 0 new pipelines, 0 orchestrator edits, 0 new capabilities, 1 declaration.
11
+ > - Genuinely novel component: 0 pipelines, 0 orchestrator edits, at most 1 new capability (then reusable), 1 declaration.
12
+ > - Cross-cutting change: 1 capability edited, 0 components touched.
13
+ > - The generic orchestrator contains zero per-component code (no `if component.name === ...`).
14
+ > - Three of our most-different real components run through one driver with no per-component driver code.
15
+
16
+ ## Before / after: the ALB/ECS pipeline glue this replaces
17
+
18
+ The component model's whole reason for existing is visible in one concrete
19
+ diff. [`examples/gitlab-aws-alb-api/src/pipeline.ts`](../../../../../examples/gitlab-aws-alb-api/src/pipeline.ts)
20
+ hand-rolls a `deployService` job that shells out to CloudFormation and greps
21
+ its own infra stack's outputs before it can deploy:
22
+
23
+ ```ts
24
+ // before — examples/gitlab-aws-alb-api/src/pipeline.ts (deployService job)
25
+ `OUTPUTS=$(aws cloudformation describe-stacks --stack-name ${INFRA_STACK} --query 'Stacks[0].Outputs' --output json)`,
26
+ `PARAMS=$(echo "$OUTPUTS" | jq -r '[(.[] | select(.OutputKey == "ClusterArn") | "clusterArn=" + .OutputValue), (.[] | select(.OutputKey == "ListenerArn") | "listenerArn=" + .OutputValue), ...] | join(" ")')`,
27
+ `IMAGE_URI=$(echo "$OUTPUTS" | jq -r '.[] | select(.OutputKey == "ApiRepoUri") | .OutputValue'):${CI_COMMIT_REF_SLUG}`,
28
+ `aws cloudformation deploy --template-file templates/template.json --stack-name ${STACK_NAME} ... --parameter-overrides $PARAMS image=$IMAGE_URI`,
29
+ ```
30
+
31
+ That `describe-stacks | jq` line is bespoke per pipeline: every component that
32
+ imports another stack's outputs re-derives its own grep. The component-native
33
+ replacement ([`pilots/alb-ecs.pilot.ts`](./pilots/alb-ecs.pilot.ts)) expresses
34
+ the same import as typed cross-stack wiring, resolved by the graph rather than
35
+ scripted in the pipeline:
36
+
37
+ ```ts
38
+ // after — pilots/alb-ecs.pilot.ts
39
+ const sharedAlbOutputs = {
40
+ listenerArn: { stackOutput: { stack: "shared-alb", name: "ListenerArn" } },
41
+ clusterArn: { stackOutput: { stack: "shared-alb", name: "ClusterArn" } },
42
+ subnets: { stackOutput: { stack: "shared-alb", name: "Subnets" } },
43
+ };
44
+ // ...
45
+ { kind: "cfn-deploy", template: "archive:search.template.json", imageRef: "@Publish.digest", inputs: sharedAlbOutputs }
46
+ ```
47
+
48
+ No `describe-stacks`, no `jq`, no shell string-building. `dependsOn:
49
+ ["shared-alb"]` plus three `stackOutput()` references replace the whole glue
50
+ block; `docker build`/`docker push` become the `docker-build`/`publish-image`
51
+ capabilities the driver dispatches to. [`driver.test.ts`](./driver.test.ts)
52
+ and [`pilots/pilots-e2e.test.ts`](./pilots/pilots-e2e.test.ts) exercise this
53
+ exact wiring end to end against a mock `CloudExecutor` — `cfn-deploy`
54
+ resolves the `stackOutput` reference itself; no orchestrator code parses a
55
+ CloudFormation output.
56
+
57
+ ## The three pilots, unchanged, through the one driver
58
+
59
+ [`driver.test.ts`](./driver.test.ts)'s `"runs the three pilots through one
60
+ driver instance with zero per-component driver code (sprawl metric)"` test
61
+ (pre-existing from #556/#557, still green) and
62
+ [`pilots-e2e.test.ts`](./pilots/pilots-e2e.test.ts)'s first `describe` block
63
+ run Neo4j fan-out, DynamoDB (sticky apply), and ALB/ECS (cross-stack, build)
64
+ through the same `runInterpretDriver` call, dispatching to the real,
65
+ `MockCloudExecutor`-backed capability implementations from #557
66
+ (`docker-build`, `publish-image`, `cfn-deploy`, `ecs-update-service`,
67
+ `code-deploy`, `wait-for-stack`, `wait-steady-state`, `wait-cluster-healthy`).
68
+ Nothing in [`driver.ts`](./driver.ts) branches on which of the three is
69
+ running — dispatch is purely by step `kind` via `CapabilityRegistry.resolve`.
70
+
71
+ ## The fourth component: image-processor-lambda
72
+
73
+ To validate the metric holds beyond the three pilots that were picked
74
+ specifically to prove it, this issue adds a fourth, deliberately different
75
+ component: [`pilots/lambda.pilot.ts`](./pilots/lambda.pilot.ts) /
76
+ [`__fixtures__/lambda-image-processor.json`](./__fixtures__/lambda-image-processor.json),
77
+ a container-image AWS Lambda function (`image-processor-lambda`).
78
+
79
+ It was picked over the single-host docker-compose fixture
80
+ ([`__fixtures__/single-host-compose.json`](./__fixtures__/single-host-compose.json))
81
+ specifically because compose would have needed four still-stubbed
82
+ capabilities at once (`load-image-on-host`, `copy-to-host`, `remote-exec`,
83
+ `wait-endpoint`) to actually run — busting the "at most 1 new capability"
84
+ bound before it even started. Lambda needed exactly one.
85
+
86
+ What makes it genuinely different from the three pilots, not a shape
87
+ variation of ALB/ECS:
88
+
89
+ - **No CloudFormation at all in its apply step.** Every one of the three
90
+ pilots (and `shared-alb`) applies via `cfn-deploy`. `image-processor-lambda`
91
+ is the first component in the validation set whose Apply phase contains no
92
+ `cfn-deploy` — it calls `UpdateFunctionCode` / `PublishVersion` /
93
+ `UpdateAlias` directly against the function.
94
+ - **Alias-based promotion, not a stack changeset.** Verification/rollback
95
+ reason about an alias pointer (`live` -> version N), not a stack status or a
96
+ service's running/desired task count.
97
+
98
+ What it reuses unchanged (zero new capabilities here): `docker-build` and
99
+ `publish-image` — a container-image Lambda's build/publish story is
100
+ byte-identical to ALB/ECS's (build an image, promote it by digest into the
101
+ registry); the same `@Publish.uri` prior-step wiring form every pilot already
102
+ uses carries the image reference into the apply step.
103
+
104
+ ### The one new capability: `lambda-deploy`
105
+
106
+ [`verbs/apply.ts`](./verbs/apply.ts)'s `createLambdaDeployCapability` is the
107
+ only new leaf this component required, built the same way #557 built the
108
+ other real leaves: typed input/output, an injectable `CloudExecutor`
109
+ (extended with a `lambda` client — [`verbs/cloud-executor.ts`](./verbs/cloud-executor.ts)),
110
+ a real shell-out implementation for production, and a `MockCloudExecutor`
111
+ implementation ([`verbs/__tests__/mock-cloud-executor.ts`](./verbs/__tests__/mock-cloud-executor.ts))
112
+ for tests. It declares a `rollback` (repoint the alias back to whatever
113
+ version it pointed at before this step ran) — the same best-effort,
114
+ capability-level compensation style `ecs-update-service` uses, since Lambda
115
+ has no native automatic rollback for a code update the way CodeFormation/
116
+ CodeDeploy do.
117
+
118
+ No other verb was touched or added. `driver.ts` was not edited.
119
+
120
+ ### Proof it runs through the same driver
121
+
122
+ [`driver.test.ts`](./driver.test.ts)'s `"runs all four components ... through
123
+ one driver instance with zero per-component driver code (sprawl metric,
124
+ extended)"` test and [`pilots-e2e.test.ts`](./pilots/pilots-e2e.test.ts)'s
125
+ second `describe`-block test run all five components (`shared-alb`,
126
+ `orders-table`, `neo4j-cluster`, `search-service`, `image-processor-lambda`)
127
+ through one `runInterpretDriver` call, dispatching `image-processor-lambda`'s
128
+ steps to the real `lambda-deploy` capability against a shared
129
+ `MockCloudExecutor` — no live AWS.
130
+
131
+ ## Scorecard
132
+
133
+ | Component | New pipelines | Driver edits | New declarations | New capabilities | Reused capabilities |
134
+ |---|---|---|---|---|---|
135
+ | Neo4j fan-out (#555) | 0 | 0 | 1 | 0 (#557 implemented the pilot set together) | `cfn-deploy`, `code-deploy`, `wait-cluster-healthy` |
136
+ | DynamoDB (#555) | 0 | 0 | 1 | 0 | `cfn-deploy`, `wait-for-stack` |
137
+ | ALB/ECS (#555) | 0 | 0 | 1 | 0 | `docker-build`, `publish-image`, `cfn-deploy`, `ecs-update-service`, `wait-steady-state` |
138
+ | **image-processor-lambda (#558, this issue)** | **0** | **0** | **1** | **1** (`lambda-deploy`) | `docker-build`, `publish-image` |
139
+
140
+ Read row-by-row against the metric: every component is one declaration, zero
141
+ new pipelines, zero driver edits. The fourth component needed exactly one new
142
+ capability — inside the "genuinely novel: at most 1" bound, not the
143
+ "typical: 0" bound the three original pilots hit, which is the honest result
144
+ for a component that introduces a capability family (Lambda code deploy) none
145
+ of the three pilots exercised.
146
+
147
+ ## Blockers found: none
148
+
149
+ No case forced a per-component branch in `driver.ts`. `driver.ts` was not
150
+ modified by this issue — every dispatch (`runCapabilityStep`, `runPhase`,
151
+ `resolveWiring`) already operates purely on the generic
152
+ `Component`/`Phase`/`Step` shapes and the `kind` string, with no branch naming
153
+ a specific component or capability. The fourth component's differences (no
154
+ `cfn-deploy` in Apply, alias-based promotion) required a new *capability*,
155
+ which is exactly where the epic says new behavior should land — never a new
156
+ capability *forced a driver change* to accommodate it.
157
+
158
+ If a future component needs multiple new capabilities at once (as
159
+ single-host compose would — four stubs), that is not by itself a driver
160
+ special-case; it just means that component was not the cheapest pick for a
161
+ minimal walkthrough. `load-image-on-host` / `copy-to-host` / `remote-exec` /
162
+ `wait-endpoint` remain typed stubs (`../capability.ts`'s "no cloud
163
+ implementation yet" contract) — implementing them is future capability work,
164
+ out of scope for this validation issue, and does not block the metric: the
165
+ schema/fixture already validates that composition
166
+ ([`component-schema.test.ts`](./component-schema.test.ts)), only the cloud
167
+ leaves are unimplemented.
168
+
169
+ ## Assumptions
170
+
171
+ - `lambda-deploy`'s `codeRef` carries a container image URI (this issue's
172
+ chosen shape), not a zip/S3 key — `zip-package` stays a stub, so a
173
+ zip-packaged Lambda was not in scope; a container-image Lambda was the
174
+ cheaper, still-genuinely-novel choice.
175
+ - `health-gate` in the Lambda pilot's Verify phase remains a typed stub (as it
176
+ already was for the ALB/ECS pilot) — verifying this issue is about apply
177
+ dispatch (`lambda-deploy`), not the wait/verify family.
178
+ - The Lambda pilot has no component-level `rollback` field (unlike ALB/ECS):
179
+ `lambda-deploy`'s own capability-level rollback (restore the alias) is
180
+ sufficient here, so no explicit compensation phase was added to the
181
+ declaration.
@@ -0,0 +1,51 @@
1
+ {
2
+ "$schema": "https://intentius.io/chant/schemas/component/v1/component.schema.json",
3
+ "contractVersion": "1.0.0",
4
+ "name": "search-service",
5
+ "archetype": "service",
6
+ "dependsOn": ["shared-alb"],
7
+ "build": { "kind": "docker-build", "context": ".", "into": "archive" },
8
+ "deploy": [
9
+ {
10
+ "phase": "Publish",
11
+ "steps": [
12
+ { "kind": "publish-image", "from": "archive", "to": "$env.registry" }
13
+ ]
14
+ },
15
+ {
16
+ "phase": "Apply",
17
+ "steps": [
18
+ {
19
+ "kind": "cfn-deploy",
20
+ "template": "archive:search.template.json",
21
+ "imageRef": "@Publish.digest",
22
+ "inputs": {
23
+ "listenerArn": { "stackOutput": { "stack": "shared-alb", "name": "ListenerArn" } },
24
+ "clusterArn": { "stackOutput": { "stack": "shared-alb", "name": "ClusterArn" } },
25
+ "subnets": { "stackOutput": { "stack": "shared-alb", "name": "Subnets" } }
26
+ }
27
+ },
28
+ {
29
+ "kind": "ecs-update-service",
30
+ "cluster": "$env.cluster",
31
+ "service": "search"
32
+ }
33
+ ]
34
+ },
35
+ {
36
+ "phase": "Verify",
37
+ "steps": [
38
+ { "kind": "wait-steady-state", "service": "search" },
39
+ { "kind": "health-gate", "path": "/healthz" }
40
+ ]
41
+ }
42
+ ],
43
+ "rollback": [
44
+ {
45
+ "phase": "Rollback",
46
+ "steps": [
47
+ { "kind": "rollback-previous", "service": "search", "cluster": "$env.cluster" }
48
+ ]
49
+ }
50
+ ]
51
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "$schema": "https://intentius.io/chant/schemas/component/v1/component.schema.json",
3
+ "contractVersion": "1.0.0",
4
+ "name": "orders-table",
5
+ "archetype": "infra",
6
+ "dependsOn": [],
7
+ "deploy": [
8
+ {
9
+ "phase": "Apply",
10
+ "steps": [
11
+ {
12
+ "kind": "cfn-deploy",
13
+ "template": "archive:orders-table.template.json",
14
+ "onReplace": "block",
15
+ "stageGsi": true
16
+ }
17
+ ]
18
+ },
19
+ {
20
+ "phase": "Verify",
21
+ "parallel": true,
22
+ "steps": [
23
+ { "kind": "wait-for-stack", "stack": "orders-table" },
24
+ {
25
+ "kind": "run-migration",
26
+ "script": "archive:migrations/backfill-gsi.sql",
27
+ "noRollback": "GSI backfill is forward-only; undoing it needs a second, hand-written migration, not automatic compensation"
28
+ }
29
+ ]
30
+ }
31
+ ]
32
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "$schema": "https://intentius.io/chant/schemas/component/v1/component.schema.json",
3
+ "contractVersion": "1.0.0",
4
+ "name": "emr-job",
5
+ "archetype": "infra",
6
+ "dependsOn": ["jar-lib"],
7
+ "deploy": [
8
+ {
9
+ "phase": "Submit",
10
+ "steps": [
11
+ {
12
+ "kind": "emr-start-job-run",
13
+ "jar": "@jar-lib.publish.uri",
14
+ "args": ["--input", "$env.inputPath", "--output", "$env.outputPath"],
15
+ "noRollback": "a submitted job run has no automatic undo; cancelling it does not revert data it already wrote"
16
+ }
17
+ ]
18
+ },
19
+ {
20
+ "phase": "Verify",
21
+ "steps": [
22
+ { "kind": "wait-job", "runId": "@Submit.runId" }
23
+ ]
24
+ }
25
+ ]
26
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "$schema": "https://intentius.io/chant/schemas/component/v1/component.schema.json",
3
+ "contractVersion": "1.0.0",
4
+ "name": "jar-lib",
5
+ "archetype": "producer-library",
6
+ "dependsOn": [],
7
+ "build": { "kind": "jvm-build", "context": ".", "into": "archive" },
8
+ "deploy": [
9
+ {
10
+ "phase": "Publish",
11
+ "steps": [
12
+ { "kind": "publish-artifact", "from": "archive", "to": "$env.s3" }
13
+ ]
14
+ }
15
+ ]
16
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "$schema": "https://intentius.io/chant/schemas/component/v1/component.schema.json",
3
+ "contractVersion": "1.0.0",
4
+ "name": "image-processor-lambda",
5
+ "archetype": "service",
6
+ "dependsOn": [],
7
+ "build": { "kind": "docker-build", "context": ".", "into": "archive" },
8
+ "deploy": [
9
+ {
10
+ "phase": "Publish",
11
+ "steps": [
12
+ { "kind": "publish-image", "from": "archive", "to": "$env.registry" }
13
+ ]
14
+ },
15
+ {
16
+ "phase": "Apply",
17
+ "steps": [
18
+ { "kind": "lambda-deploy", "functionName": "image-processor", "codeRef": "@Publish.uri", "alias": "live" }
19
+ ]
20
+ },
21
+ {
22
+ "phase": "Verify",
23
+ "steps": [
24
+ { "kind": "health-gate", "path": "@Apply.functionArn" }
25
+ ]
26
+ }
27
+ ]
28
+ }
@@ -0,0 +1,34 @@
1
+ {
2
+ "$schema": "https://intentius.io/chant/schemas/component/v1/component.schema.json",
3
+ "contractVersion": "1.0.0",
4
+ "name": "neo4j-cluster",
5
+ "archetype": "infra",
6
+ "dependsOn": [],
7
+ "deploy": [
8
+ {
9
+ "phase": "Seed",
10
+ "steps": [
11
+ { "kind": "cfn-deploy", "template": "archive:neo4j-az0-0.template.json" },
12
+ { "kind": "code-deploy", "instance": 0, "revision": "@Seed.templateUri" },
13
+ { "kind": "wait-cluster-healthy", "size": 1 }
14
+ ]
15
+ },
16
+ {
17
+ "phase": "Node 1",
18
+ "steps": [
19
+ { "kind": "gate", "signalName": "approve-neo4j-node-1", "description": "Confirm the seed node is healthy before rolling to node 1", "timeout": "24h" },
20
+ { "kind": "cfn-deploy", "template": "archive:neo4j-1.template.json" },
21
+ { "kind": "code-deploy", "instance": 1, "revision": "@Seed.templateUri" },
22
+ { "kind": "wait-cluster-healthy", "quorum": true }
23
+ ]
24
+ },
25
+ {
26
+ "phase": "Node 2",
27
+ "steps": [
28
+ { "kind": "cfn-deploy", "template": "archive:neo4j-2.template.json" },
29
+ { "kind": "code-deploy", "instance": 2, "revision": "@Seed.templateUri" },
30
+ { "kind": "wait-cluster-healthy", "quorum": true }
31
+ ]
32
+ }
33
+ ]
34
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "$schema": "https://intentius.io/chant/schemas/component/v1/component.schema.json",
3
+ "contractVersion": "1.0.0",
4
+ "name": "monitoring-host",
5
+ "archetype": "service",
6
+ "dependsOn": [],
7
+ "build": { "kind": "docker-build", "context": ".", "into": "archive" },
8
+ "deploy": [
9
+ {
10
+ "phase": "Publish",
11
+ "steps": [
12
+ { "kind": "load-image-on-host", "from": "archive", "host": "$env.host" }
13
+ ]
14
+ },
15
+ {
16
+ "phase": "Apply",
17
+ "steps": [
18
+ { "kind": "copy-to-host", "from": "archive:compose.yaml", "to": "/opt/monitoring/compose.yaml", "host": "$env.host" },
19
+ { "kind": "remote-exec", "host": "$env.host", "command": "docker compose -f /opt/monitoring/compose.yaml up -d" }
20
+ ]
21
+ },
22
+ {
23
+ "phase": "Verify",
24
+ "steps": [
25
+ { "kind": "wait-endpoint", "host": "$env.host", "path": "/-/healthy", "port": 9090 }
26
+ ]
27
+ }
28
+ ]
29
+ }