@intentius/chant 0.124.13 → 0.124.15

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 (991) hide show
  1. package/bin/chant +11 -0
  2. package/dist/agents/checks.js +326 -0
  3. package/dist/agents/discover.js +885 -0
  4. package/dist/agents/importer.js +17 -0
  5. package/dist/agents/index.js +12 -0
  6. package/dist/agents/types.js +19 -0
  7. package/dist/apply.js +151 -0
  8. package/dist/attrref.js +70 -0
  9. package/dist/audit/catalog.js +350 -0
  10. package/dist/audit/core.js +252 -0
  11. package/dist/audit/discover.js +633 -0
  12. package/dist/audit/fetch.js +666 -0
  13. package/dist/audit/lineage.js +91 -0
  14. package/dist/audit/nginx.js +366 -0
  15. package/dist/audit/prior-art.js +132 -0
  16. package/dist/audit/proof.js +321 -0
  17. package/dist/audit/report-html.js +194 -0
  18. package/dist/audit/report-model.js +198 -0
  19. package/dist/audit/report.js +102 -0
  20. package/dist/audit/rules-doc.js +144 -0
  21. package/dist/audit/secrets.js +405 -0
  22. package/dist/audit/terraform-state.js +140 -0
  23. package/dist/audit/wrangler.js +262 -0
  24. package/dist/behaviour-delta.js +401 -0
  25. package/dist/behaviour-engine.js +357 -0
  26. package/dist/behaviour-graph.js +83 -0
  27. package/dist/behaviour-http.js +188 -0
  28. package/dist/behaviour-kinds.js +172 -0
  29. package/dist/behaviour-overlay.js +50 -0
  30. package/dist/behaviour-predict.js +188 -0
  31. package/dist/behaviour-request.js +194 -0
  32. package/dist/behaviour.js +1325 -0
  33. package/dist/build-params.js +108 -0
  34. package/dist/build.d.ts +6 -0
  35. package/dist/build.d.ts.map +1 -1
  36. package/dist/build.js +669 -0
  37. package/dist/builder.js +44 -0
  38. package/dist/cdk/advise.js +30 -0
  39. package/dist/cdk/assembly.js +122 -0
  40. package/dist/cdk/graph.js +444 -0
  41. package/dist/cdk/tier-map.js +64 -0
  42. package/dist/cdk/types.js +24 -0
  43. package/dist/change-set.d.ts +24 -2
  44. package/dist/change-set.d.ts.map +1 -1
  45. package/dist/change-set.js +361 -0
  46. package/dist/child-project.js +21 -0
  47. package/dist/ci-jobs.d.ts +227 -0
  48. package/dist/ci-jobs.d.ts.map +1 -0
  49. package/dist/ci-jobs.js +448 -0
  50. package/dist/claimed-fields.js +135 -0
  51. package/dist/cli/build-options.js +70 -0
  52. package/dist/cli/build-params-cli.js +139 -0
  53. package/dist/cli/command-group.js +123 -0
  54. package/dist/cli/commands/audit-agents.js +326 -0
  55. package/dist/cli/commands/audit.js +571 -0
  56. package/dist/cli/commands/build.js +920 -0
  57. package/dist/cli/commands/carve-apply.js +153 -0
  58. package/dist/cli/commands/carve-bridge.js +201 -0
  59. package/dist/cli/commands/carve-emit.js +332 -0
  60. package/dist/cli/commands/carve-status.js +119 -0
  61. package/dist/cli/commands/carve.js +204 -0
  62. package/dist/cli/commands/check-lexicon-docs.js +79 -0
  63. package/dist/cli/commands/check-lexicon-examples.js +177 -0
  64. package/dist/cli/commands/check-lexicon-intrinsics.js +291 -0
  65. package/dist/cli/commands/check-lexicon-mcp.js +82 -0
  66. package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
  67. package/dist/cli/commands/check-lexicon-plugin.js +104 -0
  68. package/dist/cli/commands/check-lexicon.js +766 -0
  69. package/dist/cli/commands/describe.js +85 -0
  70. package/dist/cli/commands/diff.js +175 -0
  71. package/dist/cli/commands/doctor.js +350 -0
  72. package/dist/cli/commands/import-agents.js +155 -0
  73. package/dist/cli/commands/import.js +670 -0
  74. package/dist/cli/commands/init-lexicon/templates/codegen.js +194 -0
  75. package/dist/cli/commands/init-lexicon/templates/docs.js +100 -0
  76. package/dist/cli/commands/init-lexicon/templates/examples.js +29 -0
  77. package/dist/cli/commands/init-lexicon/templates/lint.js +34 -0
  78. package/dist/cli/commands/init-lexicon/templates/lsp.js +37 -0
  79. package/dist/cli/commands/init-lexicon/templates/plugin.js +108 -0
  80. package/dist/cli/commands/init-lexicon/templates/project.js +240 -0
  81. package/dist/cli/commands/init-lexicon/templates/spec.js +56 -0
  82. package/dist/cli/commands/init-lexicon/templates/tests.js +66 -0
  83. package/dist/cli/commands/init-lexicon.js +172 -0
  84. package/dist/cli/commands/init.js +381 -0
  85. package/dist/cli/commands/lexicon-rolling-upgrade.js +145 -0
  86. package/dist/cli/commands/lexicon-surface-diff.js +145 -0
  87. package/dist/cli/commands/licenses.js +125 -0
  88. package/dist/cli/commands/lint.d.ts.map +1 -1
  89. package/dist/cli/commands/lint.js +948 -0
  90. package/dist/cli/commands/list.js +63 -0
  91. package/dist/cli/commands/migrate.d.ts.map +1 -1
  92. package/dist/cli/commands/migrate.js +423 -0
  93. package/dist/cli/commands/onboard.js +403 -0
  94. package/dist/cli/commands/pinned-upgrade.js +191 -0
  95. package/dist/cli/commands/update.js +194 -0
  96. package/dist/cli/commands/vendor.js +217 -0
  97. package/dist/cli/conflict-check.js +104 -0
  98. package/dist/cli/debug.js +8 -0
  99. package/dist/cli/format.js +104 -0
  100. package/dist/cli/handlers/build.js +267 -0
  101. package/dist/cli/handlers/carve-apply.js +30 -0
  102. package/dist/cli/handlers/carve-bridge.js +28 -0
  103. package/dist/cli/handlers/carve-emit.js +50 -0
  104. package/dist/cli/handlers/carve-status.js +26 -0
  105. package/dist/cli/handlers/carve.js +40 -0
  106. package/dist/cli/handlers/change-set.js +46 -0
  107. package/dist/cli/handlers/components.js +730 -0
  108. package/dist/cli/handlers/dev.js +113 -0
  109. package/dist/cli/handlers/emulator.js +233 -0
  110. package/dist/cli/handlers/explain.js +54 -0
  111. package/dist/cli/handlers/fan-out.js +422 -0
  112. package/dist/cli/handlers/gate-resume.js +275 -0
  113. package/dist/cli/handlers/generate.js +84 -0
  114. package/dist/cli/handlers/graph.js +969 -0
  115. package/dist/cli/handlers/init.js +102 -0
  116. package/dist/cli/handlers/lifecycle.js +1727 -0
  117. package/dist/cli/handlers/lint.js +62 -0
  118. package/dist/cli/handlers/migrate.js +48 -0
  119. package/dist/cli/handlers/misc.js +391 -0
  120. package/dist/cli/handlers/operator.js +1162 -0
  121. package/dist/cli/handlers/override-approve.js +102 -0
  122. package/dist/cli/handlers/pr.js +503 -0
  123. package/dist/cli/handlers/promote.js +342 -0
  124. package/dist/cli/handlers/run-generate.js +206 -0
  125. package/dist/cli/handlers/run-wave.js +66 -0
  126. package/dist/cli/handlers/run.js +1191 -0
  127. package/dist/cli/handlers/scenario.js +325 -0
  128. package/dist/cli/handlers/search.js +924 -0
  129. package/dist/cli/handlers/serve.js +32 -0
  130. package/dist/cli/handlers/vendor.js +154 -0
  131. package/dist/cli/index.js +3 -0
  132. package/dist/cli/is-entry-point.js +23 -0
  133. package/dist/cli/lsp/capabilities.js +28 -0
  134. package/dist/cli/lsp/diagnostics.js +34 -0
  135. package/dist/cli/lsp/server.js +329 -0
  136. package/dist/cli/main.d.ts.map +1 -1
  137. package/dist/cli/main.js +2540 -0
  138. package/dist/cli/mcp/lifecycle-tools.js +80 -0
  139. package/dist/cli/mcp/op-tools.js +306 -0
  140. package/dist/cli/mcp/resource-handlers.js +258 -0
  141. package/dist/cli/mcp/resources/context.js +85 -0
  142. package/dist/cli/mcp/server.js +353 -0
  143. package/dist/cli/mcp/tools/build.js +111 -0
  144. package/dist/cli/mcp/tools/composites.js +95 -0
  145. package/dist/cli/mcp/tools/explain.js +166 -0
  146. package/dist/cli/mcp/tools/import.js +49 -0
  147. package/dist/cli/mcp/tools/lint.js +41 -0
  148. package/dist/cli/mcp/tools/scaffold.js +111 -0
  149. package/dist/cli/mcp/tools/search.js +112 -0
  150. package/dist/cli/mcp/types.js +1 -0
  151. package/dist/cli/mcp/workspace-plugins.js +91 -0
  152. package/dist/cli/mcp/workspace-tools.d.ts +1 -1
  153. package/dist/cli/mcp/workspace-tools.js +564 -0
  154. package/dist/cli/mcp-config.js +70 -0
  155. package/dist/cli/plugins.js +313 -0
  156. package/dist/cli/registry.js +23 -0
  157. package/dist/cli/reporters/stylish.js +329 -0
  158. package/dist/cli/version.js +15 -0
  159. package/dist/cli/watch.js +79 -0
  160. package/dist/codegen/bound-property-types.js +82 -0
  161. package/dist/codegen/coverage.js +119 -0
  162. package/dist/codegen/docs-file-markers.js +60 -0
  163. package/dist/codegen/docs-pages.js +115 -0
  164. package/dist/codegen/docs-rule-scanning.js +164 -0
  165. package/dist/codegen/docs-rules.js +76 -0
  166. package/dist/codegen/docs-sections.js +117 -0
  167. package/dist/codegen/docs-sidebar.js +65 -0
  168. package/dist/codegen/docs-types.js +4 -0
  169. package/dist/codegen/docs.js +356 -0
  170. package/dist/codegen/fetch.js +340 -0
  171. package/dist/codegen/generate-post-synth-barrel.js +63 -0
  172. package/dist/codegen/generate-registry.js +71 -0
  173. package/dist/codegen/generate-runtime-index.js +56 -0
  174. package/dist/codegen/generate-typescript.js +119 -0
  175. package/dist/codegen/generate.js +115 -0
  176. package/dist/codegen/json-patch.js +141 -0
  177. package/dist/codegen/json-schema-to-ts.js +344 -0
  178. package/dist/codegen/json-schema.js +246 -0
  179. package/dist/codegen/lexicon-regen.js +412 -0
  180. package/dist/codegen/naming.js +217 -0
  181. package/dist/codegen/okf-lexicon.js +245 -0
  182. package/dist/codegen/package.js +150 -0
  183. package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
  184. package/dist/codegen/pinned-upgrade.js +494 -0
  185. package/dist/codegen/registry.js +60 -0
  186. package/dist/codegen/rehype-base-url.mjs +68 -0
  187. package/dist/codegen/rolling-upgrade.js +217 -0
  188. package/dist/codegen/surface-snapshot.js +537 -0
  189. package/dist/codegen/testdata/postgres-tags.json +242 -0
  190. package/dist/codegen/topo-sort.js +36 -0
  191. package/dist/codegen/typecheck.js +115 -0
  192. package/dist/codegen/validate.js +200 -0
  193. package/dist/codegen/version-bump.js +35 -0
  194. package/dist/components/auto-release.js +143 -0
  195. package/dist/components/builders.js +47 -0
  196. package/dist/components/capability-plugin-loader.js +175 -0
  197. package/dist/components/capability-plugin-schema.js +46 -0
  198. package/dist/components/capability-plugin.js +99 -0
  199. package/dist/components/capability.js +60 -0
  200. package/dist/components/changed-files.js +72 -0
  201. package/dist/components/cli-support.js +427 -0
  202. package/dist/components/component.js +120 -0
  203. package/dist/components/component.schema.json +271 -0
  204. package/dist/components/config-defaults.js +130 -0
  205. package/dist/components/deploy-units.js +60 -0
  206. package/dist/components/discover.d.ts.map +1 -1
  207. package/dist/components/discover.js +189 -0
  208. package/dist/components/driver-output.js +86 -0
  209. package/dist/components/driver.js +728 -0
  210. package/dist/components/fan-out-output.js +165 -0
  211. package/dist/components/fan-out-record.js +94 -0
  212. package/dist/components/fan-out-run.js +373 -0
  213. package/dist/components/fan-out-support.js +60 -0
  214. package/dist/components/fan-out.js +273 -0
  215. package/dist/components/gate-plan.js +41 -0
  216. package/dist/components/gated-wave-pipeline.js +46 -0
  217. package/dist/components/index.js +24 -0
  218. package/dist/components/layers.js +28 -0
  219. package/dist/components/manifest-persistence.js +108 -0
  220. package/dist/components/pilots/alb-ecs.pilot.js +59 -0
  221. package/dist/components/pilots/dynamodb.pilot.js +51 -0
  222. package/dist/components/pilots/jar-emr.pilot.js +65 -0
  223. package/dist/components/pilots/lambda.pilot.js +52 -0
  224. package/dist/components/pilots/neo4j-fanout.pilot.js +68 -0
  225. package/dist/components/pilots/project.js +12 -0
  226. package/dist/components/pr-pipeline.d.ts.map +1 -1
  227. package/dist/components/pr-pipeline.js +135 -0
  228. package/dist/components/pr-run.js +363 -0
  229. package/dist/components/presets/ecs-fargate.js +72 -0
  230. package/dist/components/presets/index.js +28 -0
  231. package/dist/components/presets/lambda.js +34 -0
  232. package/dist/components/presets/single-host-compose.js +41 -0
  233. package/dist/components/promote.js +549 -0
  234. package/dist/components/registry.js +34 -0
  235. package/dist/components/run-progress.js +33 -0
  236. package/dist/components/sandbox/driver.d.ts.map +1 -1
  237. package/dist/components/sandbox/driver.js +93 -0
  238. package/dist/components/sandbox/run.js +115 -0
  239. package/dist/components/starter-plugin.js +104 -0
  240. package/dist/components/verbs/__tests__/mock-cloud-executor.js +68 -0
  241. package/dist/components/verbs/__tests__/mock-process-runner.js +45 -0
  242. package/dist/components/verbs/__tests__/mock-sbom-generator.js +56 -0
  243. package/dist/components/verbs/bom-writer.js +287 -0
  244. package/dist/components/verbs/build-archive.js +188 -0
  245. package/dist/components/verbs/build.js +142 -0
  246. package/dist/components/verbs/cloud-executor.js +110 -0
  247. package/dist/components/verbs/component-bom.js +125 -0
  248. package/dist/components/verbs/ensure-secret.js +50 -0
  249. package/dist/components/verbs/index.js +61 -0
  250. package/dist/components/verbs/license-policy.js +75 -0
  251. package/dist/components/verbs/lockfile-sbom-generator.js +191 -0
  252. package/dist/components/verbs/process-runner.js +78 -0
  253. package/dist/components/verbs/r2-sync.js +93 -0
  254. package/dist/components/verbs/reproducibility.js +62 -0
  255. package/dist/components/verbs/run-agent.js +577 -0
  256. package/dist/components/verbs/sbom-generator.js +119 -0
  257. package/dist/components/verbs/sbom.js +97 -0
  258. package/dist/components/verbs/shell.js +32 -0
  259. package/dist/components/verbs/sign.js +221 -0
  260. package/dist/components/verbs/stub.js +28 -0
  261. package/dist/components/verbs/tool-sbom-generator.js +154 -0
  262. package/dist/components/verbs/verify.js +112 -0
  263. package/dist/components/verbs/vex.js +131 -0
  264. package/dist/components/verbs/vuln-gate.js +152 -0
  265. package/dist/components/verbs/vuln-scan.js +288 -0
  266. package/dist/components/verbs/wait-verify.js +106 -0
  267. package/dist/components/verbs/wrangler.js +179 -0
  268. package/dist/components/wave-plan.js +102 -0
  269. package/dist/composite.d.ts +10 -2
  270. package/dist/composite.d.ts.map +1 -1
  271. package/dist/composite.js +313 -0
  272. package/dist/config-import.d.ts.map +1 -1
  273. package/dist/config-import.js +22 -0
  274. package/dist/config-sandbox.js +122 -0
  275. package/dist/config-static.js +206 -0
  276. package/dist/config.js +605 -0
  277. package/dist/content-digest.js +23 -0
  278. package/dist/declarable.js +114 -0
  279. package/dist/deep-observation.js +437 -0
  280. package/dist/detectLexicon.js +54 -0
  281. package/dist/discovery/cache.js +70 -0
  282. package/dist/discovery/collect.d.ts +2 -1
  283. package/dist/discovery/collect.d.ts.map +1 -1
  284. package/dist/discovery/collect.js +223 -0
  285. package/dist/discovery/cycles.js +95 -0
  286. package/dist/discovery/entity-wire-codec.js +391 -0
  287. package/dist/discovery/entity-wire.js +42 -0
  288. package/dist/discovery/files.js +121 -0
  289. package/dist/discovery/fold-import.d.ts.map +1 -1
  290. package/dist/discovery/fold-import.js +4073 -0
  291. package/dist/discovery/fold-rank.js +292 -0
  292. package/dist/discovery/graph.js +115 -0
  293. package/dist/discovery/host-composite.d.ts +35 -0
  294. package/dist/discovery/host-composite.d.ts.map +1 -0
  295. package/dist/discovery/host-composite.js +93 -0
  296. package/dist/discovery/import.d.ts.map +1 -1
  297. package/dist/discovery/import.js +65 -0
  298. package/dist/discovery/index.d.ts +9 -0
  299. package/dist/discovery/index.d.ts.map +1 -1
  300. package/dist/discovery/index.js +333 -0
  301. package/dist/discovery/param-deps.js +487 -0
  302. package/dist/discovery/resolve.js +39 -0
  303. package/dist/discovery/sandbox/bundle.js +214 -0
  304. package/dist/discovery/sandbox/child-errors.js +26 -0
  305. package/dist/discovery/sandbox/config-run.js +100 -0
  306. package/dist/discovery/sandbox/config-wire.js +183 -0
  307. package/dist/discovery/sandbox/driver.d.ts.map +1 -1
  308. package/dist/discovery/sandbox/driver.js +333 -0
  309. package/dist/discovery/sandbox/fork.js +229 -0
  310. package/dist/discovery/sandbox/policy-run.js +142 -0
  311. package/dist/discovery/sandbox/policy-wire.js +152 -0
  312. package/dist/discovery/sandbox/run.js +77 -0
  313. package/dist/discovery/specifier-resolve.js +320 -0
  314. package/dist/discovery/walk.js +284 -0
  315. package/dist/effect-receipt.js +340 -0
  316. package/dist/env.js +55 -0
  317. package/dist/errors.js +62 -0
  318. package/dist/fold/fold.js +1434 -0
  319. package/dist/fold/foldable-helpers.js +229 -0
  320. package/dist/fold/subset.js +696 -0
  321. package/dist/fold-provenance.js +414 -0
  322. package/dist/gate-decision.d.ts +20 -9
  323. package/dist/gate-decision.d.ts.map +1 -1
  324. package/dist/gate-decision.js +313 -0
  325. package/dist/gate-resume-run.js +154 -0
  326. package/dist/gated-waves.js +165 -0
  327. package/dist/governance.js +43 -0
  328. package/dist/graph-declared.js +45 -0
  329. package/dist/graph-detail.js +207 -0
  330. package/dist/graph-dot.js +54 -0
  331. package/dist/graph-effective.js +107 -0
  332. package/dist/graph-ir.js +623 -0
  333. package/dist/graph-layout.js +184 -0
  334. package/dist/graph-lens.js +105 -0
  335. package/dist/graph-mermaid.js +83 -0
  336. package/dist/graph-ops.js +39 -0
  337. package/dist/graph-refs.js +156 -0
  338. package/dist/held-elsewhere.js +87 -0
  339. package/dist/identity.js +251 -0
  340. package/dist/import/base-parser.js +34 -0
  341. package/dist/import/embedded.js +255 -0
  342. package/dist/import/generator.js +1 -0
  343. package/dist/import/ir-utils.js +85 -0
  344. package/dist/import/parser-options.js +45 -0
  345. package/dist/import/parser.js +1 -0
  346. package/dist/index.js +118 -0
  347. package/dist/intrinsic-interpolation.js +73 -0
  348. package/dist/intrinsic.js +31 -0
  349. package/dist/join-key.js +35 -0
  350. package/dist/kubectl-context.js +150 -0
  351. package/dist/lexicon-config.js +58 -0
  352. package/dist/lexicon-integrity.js +47 -0
  353. package/dist/lexicon-manifest.js +70 -0
  354. package/dist/lexicon-module.d.ts.map +1 -1
  355. package/dist/lexicon-module.js +241 -0
  356. package/dist/lexicon-output.js +218 -0
  357. package/dist/lexicon-plugin-helpers.js +104 -0
  358. package/dist/lexicon-schema.js +136 -0
  359. package/dist/lexicon.js +130 -0
  360. package/dist/lifecycle/affected.js +224 -0
  361. package/dist/lifecycle/assert-live.js +110 -0
  362. package/dist/lifecycle/build-ledger-store.js +160 -0
  363. package/dist/lifecycle/build-ledger.js +155 -0
  364. package/dist/lifecycle/change-set.js +356 -0
  365. package/dist/lifecycle/converge-ledger.js +161 -0
  366. package/dist/lifecycle/deep-diff.js +233 -0
  367. package/dist/lifecycle/deep-observe.js +147 -0
  368. package/dist/lifecycle/digest.js +143 -0
  369. package/dist/lifecycle/disruption.js +135 -0
  370. package/dist/lifecycle/gate-applied.js +113 -0
  371. package/dist/lifecycle/gate-audit.d.ts +69 -2
  372. package/dist/lifecycle/gate-audit.d.ts.map +1 -1
  373. package/dist/lifecycle/gate-audit.js +415 -0
  374. package/dist/lifecycle/gate-ledger-select.js +89 -0
  375. package/dist/lifecycle/gate-ledger.d.ts +24 -0
  376. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  377. package/dist/lifecycle/gate-ledger.js +201 -0
  378. package/dist/lifecycle/gate-origin.js +117 -0
  379. package/dist/lifecycle/gate-pending.js +58 -0
  380. package/dist/lifecycle/git.js +1182 -0
  381. package/dist/lifecycle/identity.js +58 -0
  382. package/dist/lifecycle/index.js +26 -0
  383. package/dist/lifecycle/lease.js +283 -0
  384. package/dist/lifecycle/ledger-port.js +1 -0
  385. package/dist/lifecycle/legacy-digest.js +91 -0
  386. package/dist/lifecycle/live-diff.js +274 -0
  387. package/dist/lifecycle/local-note.js +15 -0
  388. package/dist/lifecycle/member-ledger.js +122 -0
  389. package/dist/lifecycle/observation-baseline.js +155 -0
  390. package/dist/lifecycle/observe.js +375 -0
  391. package/dist/lifecycle/oras-referrer-lookup.js +82 -0
  392. package/dist/lifecycle/override-ledger.js +54 -0
  393. package/dist/lifecycle/plan-digest.js +110 -0
  394. package/dist/lifecycle/plan-ledger.js +129 -0
  395. package/dist/lifecycle/receipt-plan.js +192 -0
  396. package/dist/lifecycle/release-ledger.js +155 -0
  397. package/dist/lifecycle/release-read.js +64 -0
  398. package/dist/lifecycle/replay.js +193 -0
  399. package/dist/lifecycle/rollback.js +102 -0
  400. package/dist/lifecycle/run-ledger.js +183 -0
  401. package/dist/lifecycle/scenario-eval.js +204 -0
  402. package/dist/lifecycle/scenario.js +214 -0
  403. package/dist/lifecycle/snapshot.js +239 -0
  404. package/dist/lifecycle/status.js +447 -0
  405. package/dist/lifecycle/symptoms.js +117 -0
  406. package/dist/lifecycle/teardown.js +255 -0
  407. package/dist/lifecycle/types.js +1 -0
  408. package/dist/lifecycle/unobserved-gate.js +33 -0
  409. package/dist/lifecycle/wave-plans.js +68 -0
  410. package/dist/lifecycle/work-item-id.js +36 -0
  411. package/dist/lifecycle/work-lease.js +393 -0
  412. package/dist/lint/component-checks.js +87 -0
  413. package/dist/lint/config.js +483 -0
  414. package/dist/lint/declarative.js +122 -0
  415. package/dist/lint/discover.d.ts.map +1 -1
  416. package/dist/lint/discover.js +138 -0
  417. package/dist/lint/engine.js +246 -0
  418. package/dist/lint/knowledge-checks.js +64 -0
  419. package/dist/lint/named-checks.js +22 -0
  420. package/dist/lint/output-checks.js +87 -0
  421. package/dist/lint/output-docs.js +163 -0
  422. package/dist/lint/parser.js +33 -0
  423. package/dist/lint/pipeline-change-gate.js +70 -0
  424. package/dist/lint/policy-import.d.ts +1 -1
  425. package/dist/lint/policy-import.d.ts.map +1 -1
  426. package/dist/lint/policy-import.js +62 -0
  427. package/dist/lint/policy-sandbox.js +86 -0
  428. package/dist/lint/policy.js +122 -0
  429. package/dist/lint/post-synth.js +87 -0
  430. package/dist/lint/presets/relaxed.json +26 -0
  431. package/dist/lint/presets/strict.json +24 -24
  432. package/dist/lint/receipt-checks.js +83 -0
  433. package/dist/lint/rule-loader.d.ts.map +1 -1
  434. package/dist/lint/rule-loader.js +89 -0
  435. package/dist/lint/rule-registry.js +86 -0
  436. package/dist/lint/rule.js +1 -0
  437. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
  438. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
  439. package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
  440. package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
  441. package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
  442. package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
  443. package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
  444. package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
  445. package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
  446. package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
  447. package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
  448. package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
  449. package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
  450. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
  451. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
  452. package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
  453. package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
  454. package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
  455. package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
  456. package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
  457. package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
  458. package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
  459. package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
  460. package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
  461. package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
  462. package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
  463. package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
  464. package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
  465. package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
  466. package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
  467. package/dist/lint/rules/comp/index.js +33 -0
  468. package/dist/lint/rules/comp/support.js +129 -0
  469. package/dist/lint/rules/composite-scope.js +51 -0
  470. package/dist/lint/rules/cor017-composite-name-match.js +93 -0
  471. package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
  472. package/dist/lint/rules/cor021-env-literal-name.js +100 -0
  473. package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
  474. package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
  475. package/dist/lint/rules/declarable-naming-convention.js +62 -0
  476. package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
  477. package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
  478. package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
  479. package/dist/lint/rules/evl004-spread-non-const.js +94 -0
  480. package/dist/lint/rules/evl005-resource-block-body.js +41 -0
  481. package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
  482. package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
  483. package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
  484. package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
  485. package/dist/lint/rules/export-required.js +115 -0
  486. package/dist/lint/rules/file-declarable-limit.js +88 -0
  487. package/dist/lint/rules/flat-declarations.js +62 -0
  488. package/dist/lint/rules/index.js +90 -0
  489. package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
  490. package/dist/lint/rules/no-redundant-type-import.js +76 -0
  491. package/dist/lint/rules/no-redundant-value-cast.js +41 -0
  492. package/dist/lint/rules/no-string-ref.js +59 -0
  493. package/dist/lint/rules/no-unused-declarable-import.js +75 -0
  494. package/dist/lint/rules/no-unused-declarable.js +142 -0
  495. package/dist/lint/rules/op/index.js +28 -0
  496. package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
  497. package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
  498. package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
  499. package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
  500. package/dist/lint/rules/op/support.js +11 -0
  501. package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
  502. package/dist/lint/rules/property-kind.js +56 -0
  503. package/dist/lint/rules/single-concern-file.js +71 -0
  504. package/dist/lint/rules/sys001-no-literal-key.js +60 -0
  505. package/dist/lint/selectors.js +168 -0
  506. package/dist/lint/suppressions.js +129 -0
  507. package/dist/lint/typescript.js +17 -0
  508. package/dist/live-endpoint.js +113 -0
  509. package/dist/live-read-session.js +76 -0
  510. package/dist/lsp/lexicon-providers.js +163 -0
  511. package/dist/lsp/types.js +5 -0
  512. package/dist/managed-fields.js +293 -0
  513. package/dist/mcp/types.js +4 -0
  514. package/dist/notify-verify.js +0 -1
  515. package/dist/notify.js +0 -1
  516. package/dist/notify.schema.json +72 -0
  517. package/dist/observation.js +266 -0
  518. package/dist/okf-read.js +134 -0
  519. package/dist/okf.js +275 -0
  520. package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
  521. package/dist/op/activities/activity-contracts.d.ts +1 -1
  522. package/dist/op/activities/activity-contracts.js +313 -0
  523. package/dist/op/activities/apply.js +582 -0
  524. package/dist/op/activities/build.js +18 -0
  525. package/dist/op/activities/change-coverage.js +40 -0
  526. package/dist/op/activities/change-set.d.ts +8 -3
  527. package/dist/op/activities/change-set.d.ts.map +1 -1
  528. package/dist/op/activities/change-set.js +67 -0
  529. package/dist/op/activities/converge.js +492 -0
  530. package/dist/op/activities/decide.js +211 -0
  531. package/dist/op/activities/env-teardown.js +110 -0
  532. package/dist/op/activities/factory.js +591 -0
  533. package/dist/op/activities/forge-pull-request.js +82 -0
  534. package/dist/op/activities/gh-host.js +78 -0
  535. package/dist/op/activities/guard-validate.js +165 -0
  536. package/dist/op/activities/http-check.js +40 -0
  537. package/dist/op/activities/index.js +59 -0
  538. package/dist/op/activities/lexicon-upgrade.js +629 -0
  539. package/dist/op/activities/lifecycle.js +109 -0
  540. package/dist/op/activities/pipeline-audit.js +147 -0
  541. package/dist/op/activities/policy.js +26 -0
  542. package/dist/op/activities/predict-behaviour.js +341 -0
  543. package/dist/op/activities/propose-upgrade.js +165 -0
  544. package/dist/op/activities/reconcile.d.ts +28 -16
  545. package/dist/op/activities/reconcile.d.ts.map +1 -1
  546. package/dist/op/activities/reconcile.js +1011 -0
  547. package/dist/op/activities/shell.js +118 -0
  548. package/dist/op/activities/source-release.js +97 -0
  549. package/dist/op/activities/source-rollback.js +165 -0
  550. package/dist/op/activities/teardown.js +17 -0
  551. package/dist/op/activities/util.js +6 -0
  552. package/dist/op/activities/wait.js +51 -0
  553. package/dist/op/activities/work-evidence.js +35 -0
  554. package/dist/op/activities/workflow-audit.js +133 -0
  555. package/dist/op/activity-contract-registry.js +106 -0
  556. package/dist/op/activity-contract.js +232 -0
  557. package/dist/op/activity-failure.js +31 -0
  558. package/dist/op/activity-profiles.js +129 -0
  559. package/dist/op/activity-registry.js +105 -0
  560. package/dist/op/activity-runtime.js +28 -0
  561. package/dist/op/builders.d.ts +1 -1
  562. package/dist/op/builders.d.ts.map +1 -1
  563. package/dist/op/builders.js +801 -0
  564. package/dist/op/change-signal.js +118 -0
  565. package/dist/op/composites/apply-op.js +151 -0
  566. package/dist/op/composites/behaviour-op.js +65 -0
  567. package/dist/op/composites/converge-op.js +141 -0
  568. package/dist/op/composites/index.js +19 -0
  569. package/dist/op/composites/lexicon-upgrade-op.js +107 -0
  570. package/dist/op/composites/pipeline-audit-op.js +50 -0
  571. package/dist/op/composites/reconcile-op.js +84 -0
  572. package/dist/op/composites/watch-op.js +69 -0
  573. package/dist/op/composites/workflow-audit-op.js +57 -0
  574. package/dist/op/converge-rule.js +205 -0
  575. package/dist/op/cron.js +146 -0
  576. package/dist/op/decide-backend.js +181 -0
  577. package/dist/op/decide-config.js +68 -0
  578. package/dist/op/decide-read-inputs.js +141 -0
  579. package/dist/op/discover.d.ts.map +1 -1
  580. package/dist/op/discover.js +213 -0
  581. package/dist/op/duration.js +21 -0
  582. package/dist/op/emulator-freshness.js +80 -0
  583. package/dist/op/emulator-lifecycle.js +269 -0
  584. package/dist/op/factory.js +83 -0
  585. package/dist/op/gate-approval.js +172 -0
  586. package/dist/op/gate-name.js +86 -0
  587. package/dist/op/gate-plan-context.js +167 -0
  588. package/dist/op/gate-point-run.js +67 -0
  589. package/dist/op/gate-point.js +111 -0
  590. package/dist/op/gate-resume-plan.js +155 -0
  591. package/dist/op/gate-resume.js +31 -0
  592. package/dist/op/gate-review.js +290 -0
  593. package/dist/op/gate-run-locator.js +85 -0
  594. package/dist/op/gate-summary.js +100 -0
  595. package/dist/op/gate-wait.js +56 -0
  596. package/dist/op/gate.js +449 -0
  597. package/dist/op/generate-pipeline.js +124 -0
  598. package/dist/op/index.js +51 -0
  599. package/dist/op/lifecycle-receipt-store.js +45 -0
  600. package/dist/op/local-executor.js +1164 -0
  601. package/dist/op/local-output.js +140 -0
  602. package/dist/op/op-ir.js +317 -0
  603. package/dist/op/op-verb-class.js +131 -0
  604. package/dist/op/op-waves-notify.js +136 -0
  605. package/dist/op/op-waves-run.d.ts +1 -1
  606. package/dist/op/op-waves-run.d.ts.map +1 -1
  607. package/dist/op/op-waves-run.js +1657 -0
  608. package/dist/op/op-waves.js +409 -0
  609. package/dist/op/operator.js +743 -0
  610. package/dist/op/receipt-store.js +94 -0
  611. package/dist/op/resource.js +23 -0
  612. package/dist/op/run-context.js +28 -0
  613. package/dist/op/run-live.js +256 -0
  614. package/dist/op/runtime.js +21 -0
  615. package/dist/op/runtimes/local.js +195 -0
  616. package/dist/op/source-archive.js +131 -0
  617. package/dist/op/step-output-ref.js +397 -0
  618. package/dist/op/steward-beside.js +169 -0
  619. package/dist/op/steward-points.js +138 -0
  620. package/dist/op/steward-turn.js +59 -0
  621. package/dist/op/steward.js +317 -0
  622. package/dist/op/types.js +25 -0
  623. package/dist/op/work-lease-decl.js +81 -0
  624. package/dist/op/work-lease-run.js +393 -0
  625. package/dist/override-gate.js +284 -0
  626. package/dist/owner-chain.js +74 -0
  627. package/dist/ownership.js +92 -0
  628. package/dist/params.js +61 -0
  629. package/dist/plan-summary.js +711 -0
  630. package/dist/point-decision.js +211 -0
  631. package/dist/pr-forge.js +810 -0
  632. package/dist/pr-loop.js +203 -0
  633. package/dist/project-codegen.js +191 -0
  634. package/dist/project-root.js +74 -0
  635. package/dist/project-validation.js +50 -0
  636. package/dist/provenance.js +157 -0
  637. package/dist/pseudo-parameter.js +40 -0
  638. package/dist/reconcile.js +450 -0
  639. package/dist/resource-attributes.js +33 -0
  640. package/dist/runtime-adapter.js +77 -0
  641. package/dist/runtime.js +66 -0
  642. package/dist/secret-materialization.js +153 -0
  643. package/dist/secret-provenance.js +250 -0
  644. package/dist/serializer-walker.js +112 -0
  645. package/dist/serializer.js +1 -0
  646. package/dist/sort.js +45 -0
  647. package/dist/stack-output.js +115 -0
  648. package/dist/telemetry-attribution.js +149 -0
  649. package/dist/terraform/__fixtures__/build-graph.js +63 -0
  650. package/dist/terraform/adopt-state.js +40 -0
  651. package/dist/terraform/aws-resources.js +384 -0
  652. package/dist/terraform/bridge.js +204 -0
  653. package/dist/terraform/carve-provider.js +155 -0
  654. package/dist/terraform/carve.js +138 -0
  655. package/dist/terraform/data-source-shape.js +57 -0
  656. package/dist/terraform/emit-source.js +36 -0
  657. package/dist/terraform/excise.js +123 -0
  658. package/dist/terraform/graduate.js +128 -0
  659. package/dist/terraform/graph.js +435 -0
  660. package/dist/terraform/hcl2json.js +60 -0
  661. package/dist/terraform/manifest.js +149 -0
  662. package/dist/terraform/parse.js +81 -0
  663. package/dist/terraform/providers/aws.js +146 -0
  664. package/dist/terraform/providers/gcp.js +294 -0
  665. package/dist/terraform/providers/index.js +17 -0
  666. package/dist/terraform/providers/kubernetes.js +253 -0
  667. package/dist/terraform/score.js +151 -0
  668. package/dist/terraform/state.js +67 -0
  669. package/dist/terraform/tier-map.js +74 -0
  670. package/dist/terraform/types.js +13 -0
  671. package/dist/terraform/unified-diff.js +132 -0
  672. package/dist/testing.js +295 -0
  673. package/dist/toml-emit.js +153 -0
  674. package/dist/toml-parse.js +355 -0
  675. package/dist/toml-utils.js +60 -0
  676. package/dist/toml.js +428 -0
  677. package/dist/ts-loader.d.ts +46 -0
  678. package/dist/ts-loader.d.ts.map +1 -0
  679. package/dist/ts-loader.js +103 -0
  680. package/dist/types.js +1 -0
  681. package/dist/utils.js +61 -0
  682. package/dist/validation.js +20 -0
  683. package/dist/vendor/js-yaml-load.js +1662 -0
  684. package/dist/workspace/__fixtures__/contract-repo.d.ts +7 -0
  685. package/dist/workspace/__fixtures__/contract-repo.d.ts.map +1 -1
  686. package/dist/workspace/__fixtures__/contract-repo.js +119 -0
  687. package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
  688. package/dist/workspace/__fixtures__/sessions.d.ts +1 -1
  689. package/dist/workspace/__fixtures__/sessions.d.ts.map +1 -1
  690. package/dist/workspace/__fixtures__/sessions.js +91 -0
  691. package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
  692. package/dist/workspace/agent-cli.js +99 -0
  693. package/dist/workspace/agent.schema.json +390 -0
  694. package/dist/workspace/answers-ledger.js +89 -0
  695. package/dist/workspace/box-cli.js +142 -0
  696. package/dist/workspace/box-factory-write.js +196 -0
  697. package/dist/workspace/box-factory-write.schema.json +342 -0
  698. package/dist/workspace/box-factory.js +88 -0
  699. package/dist/workspace/box-intent.js +126 -0
  700. package/dist/workspace/box-isolation.js +169 -0
  701. package/dist/workspace/box-listing-write.schema.json +204 -0
  702. package/dist/workspace/box-listing.js +298 -0
  703. package/dist/workspace/box-publish.js +352 -0
  704. package/dist/workspace/box-publish.schema.json +498 -0
  705. package/dist/workspace/box-services.js +39 -0
  706. package/dist/workspace/broker-protocol.js +359 -0
  707. package/dist/workspace/broker-protocol.schema.json +228 -0
  708. package/dist/workspace/change-set.schema.json +462 -0
  709. package/dist/workspace/changes-cli.js +56 -0
  710. package/dist/workspace/changes.js +446 -0
  711. package/dist/workspace/changes.schema.json +642 -0
  712. package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
  713. package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
  714. package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
  715. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
  716. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
  717. package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
  718. package/dist/workspace/chant-migrations.js +113 -0
  719. package/dist/workspace/check.schema.json +433 -0
  720. package/dist/workspace/checks/box-isolation.js +62 -0
  721. package/dist/workspace/checks/boxes.js +491 -0
  722. package/dist/workspace/checks/diagrams.js +104 -0
  723. package/dist/workspace/checks/generated.js +419 -0
  724. package/dist/workspace/checks/ledgers.js +212 -0
  725. package/dist/workspace/checks/links.js +191 -0
  726. package/dist/workspace/checks/live.js +100 -0
  727. package/dist/workspace/checks/pipelines.js +188 -0
  728. package/dist/workspace/checks/records.js +169 -0
  729. package/dist/workspace/checks.js +426 -0
  730. package/dist/workspace/ci-green-cli.js +125 -0
  731. package/dist/workspace/ci-green-forge.js +83 -0
  732. package/dist/workspace/ci-green-workflow.d.ts +3 -1
  733. package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
  734. package/dist/workspace/ci-green-workflow.js +202 -0
  735. package/dist/workspace/ci-green.js +325 -0
  736. package/dist/workspace/ci-last-green.schema.json +158 -0
  737. package/dist/workspace/class-data.d.ts +84 -0
  738. package/dist/workspace/class-data.d.ts.map +1 -0
  739. package/dist/workspace/class-data.js +238 -0
  740. package/dist/workspace/compose-graph.js +235 -0
  741. package/dist/workspace/compose-reports.js +146 -0
  742. package/dist/workspace/composites.js +264 -0
  743. package/dist/workspace/composites.schema.json +617 -0
  744. package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
  745. package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
  746. package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
  747. package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
  748. package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
  749. package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
  750. package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
  751. package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
  752. package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
  753. package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
  754. package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
  755. package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
  756. package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
  757. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
  758. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
  759. package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
  760. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
  761. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
  762. package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
  763. package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
  764. package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
  765. package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
  766. package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
  767. package/dist/workspace/conformance/broker.js +736 -0
  768. package/dist/workspace/conformance/index.js +673 -0
  769. package/dist/workspace/conformance/vitest.js +108 -0
  770. package/dist/workspace/conformance/writer.js +1080 -0
  771. package/dist/workspace/decide.js +879 -0
  772. package/dist/workspace/decision-points.schema.json +135 -135
  773. package/dist/workspace/declaration-write-cli.js +74 -0
  774. package/dist/workspace/declaration-write.js +238 -0
  775. package/dist/workspace/declaration.js +938 -0
  776. package/dist/workspace/declaration.schema.json +1413 -1413
  777. package/dist/workspace/declared-kinds.js +106 -0
  778. package/dist/workspace/environments.js +164 -0
  779. package/dist/workspace/evidence.schema.json +279 -0
  780. package/dist/workspace/export-cli.js +185 -0
  781. package/dist/workspace/export.js +499 -0
  782. package/dist/workspace/factory-rules.js +175 -0
  783. package/dist/workspace/generated-files.js +92 -0
  784. package/dist/workspace/glob.js +45 -0
  785. package/dist/workspace/graph-cache.js +352 -0
  786. package/dist/workspace/graph-cli.js +348 -0
  787. package/dist/workspace/graph.schema.json +1338 -0
  788. package/dist/workspace/identity-gate-rule.js +75 -0
  789. package/dist/workspace/identity.js +126 -0
  790. package/dist/workspace/import.js +283 -0
  791. package/dist/workspace/init.js +620 -0
  792. package/dist/workspace/intent-cli.js +263 -0
  793. package/dist/workspace/intent-joins.js +201 -0
  794. package/dist/workspace/intent-record.js +352 -0
  795. package/dist/workspace/intent-record.schema.json +864 -0
  796. package/dist/workspace/intent.js +1582 -0
  797. package/dist/workspace/intent.schema.json +2420 -0
  798. package/dist/workspace/json-edit.js +221 -0
  799. package/dist/workspace/jsonc.js +235 -0
  800. package/dist/workspace/kind-readers.js +103 -0
  801. package/dist/workspace/kinds.d.ts +3 -7
  802. package/dist/workspace/kinds.d.ts.map +1 -1
  803. package/dist/workspace/kinds.js +553 -0
  804. package/dist/workspace/lexicon-symbols.js +112 -0
  805. package/dist/workspace/lineage-adopt-cli.js +102 -0
  806. package/dist/workspace/lineage-adopt.js +360 -0
  807. package/dist/workspace/lineage-check.js +282 -0
  808. package/dist/workspace/lineage-cli.js +121 -0
  809. package/dist/workspace/lineage-hash-index.js +284 -0
  810. package/dist/workspace/lineage-init.js +507 -0
  811. package/dist/workspace/lineage-lock.js +387 -0
  812. package/dist/workspace/lineage-merge.js +45 -0
  813. package/dist/workspace/lineage-migrations.d.ts.map +1 -1
  814. package/dist/workspace/lineage-migrations.js +329 -0
  815. package/dist/workspace/lineage-provenance.js +36 -0
  816. package/dist/workspace/lineage-update.js +138 -0
  817. package/dist/workspace/lineage-upgrade-cli.js +131 -0
  818. package/dist/workspace/lineage-upgrade.js +889 -0
  819. package/dist/workspace/lineage-vendor.js +171 -0
  820. package/dist/workspace/lineage-version.js +128 -0
  821. package/dist/workspace/lineage-versions.js +275 -0
  822. package/dist/workspace/links.js +330 -0
  823. package/dist/workspace/ls-generated.js +95 -0
  824. package/dist/workspace/ls.js +277 -0
  825. package/dist/workspace/ls.schema.json +333 -0
  826. package/dist/workspace/member-commands.js +508 -0
  827. package/dist/workspace/member-handles.js +216 -0
  828. package/dist/workspace/member-pipeline.js +258 -0
  829. package/dist/workspace/member-run.js +117 -0
  830. package/dist/workspace/member-write.schema.json +193 -0
  831. package/dist/workspace/nested-graph.js +156 -0
  832. package/dist/workspace/nesting.js +38 -0
  833. package/dist/workspace/patch.js +301 -0
  834. package/dist/workspace/patch.schema.json +321 -0
  835. package/dist/workspace/pin-cli.js +55 -0
  836. package/dist/workspace/pin-integrity.js +100 -0
  837. package/dist/workspace/plan-summary.schema.json +155 -0
  838. package/dist/workspace/point-answer.schema.json +129 -129
  839. package/dist/workspace/points-cli.js +291 -0
  840. package/dist/workspace/points-write.schema.json +660 -0
  841. package/dist/workspace/points.js +521 -0
  842. package/dist/workspace/points.schema.json +916 -0
  843. package/dist/workspace/pr-report.schema.json +108 -0
  844. package/dist/workspace/principal-classes.d.ts +4 -11
  845. package/dist/workspace/principal-classes.d.ts.map +1 -1
  846. package/dist/workspace/principal-classes.js +162 -0
  847. package/dist/workspace/reason-codes.js +326 -0
  848. package/dist/workspace/record-assets.js +151 -0
  849. package/dist/workspace/record-decided.js +105 -0
  850. package/dist/workspace/record-sessions.js +96 -0
  851. package/dist/workspace/record-source.js +114 -0
  852. package/dist/workspace/records-amend.schema.json +284 -0
  853. package/dist/workspace/records-checkout.js +76 -0
  854. package/dist/workspace/records-cli.js +707 -0
  855. package/dist/workspace/records-close.js +116 -0
  856. package/dist/workspace/records-close.schema.json +278 -0
  857. package/dist/workspace/records-new.schema.json +202 -0
  858. package/dist/workspace/records-review.schema.json +367 -0
  859. package/dist/workspace/records-since.js +317 -0
  860. package/dist/workspace/records-since.schema.json +218 -0
  861. package/dist/workspace/records-write.js +1229 -0
  862. package/dist/workspace/records.js +1345 -0
  863. package/dist/workspace/records.schema.json +604 -0
  864. package/dist/workspace/reference-kinds/app/package.json +10 -0
  865. package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
  866. package/dist/workspace/returns.js +303 -0
  867. package/dist/workspace/root-refusal.js +75 -0
  868. package/dist/workspace/run-statement.schema.json +622 -0
  869. package/dist/workspace/runs-cli.js +584 -0
  870. package/dist/workspace/runs-write.schema.json +994 -0
  871. package/dist/workspace/runs.js +708 -0
  872. package/dist/workspace/runs.schema.json +1257 -0
  873. package/dist/workspace/runtimes.js +76 -0
  874. package/dist/workspace/session-kinds.js +83 -0
  875. package/dist/workspace/signers.schema.json +206 -0
  876. package/dist/workspace/source-block.js +125 -0
  877. package/dist/workspace/squash.js +177 -0
  878. package/dist/workspace/status-gates.js +162 -0
  879. package/dist/workspace/status-stewards.js +330 -0
  880. package/dist/workspace/status.js +514 -0
  881. package/dist/workspace/status.schema.json +998 -0
  882. package/dist/workspace/steward-index.js +191 -0
  883. package/dist/workspace/symbols.js +188 -0
  884. package/dist/workspace/template-manifest.js +227 -0
  885. package/dist/workspace/template-pins.js +115 -0
  886. package/dist/workspace/trailer-joins.js +65 -0
  887. package/dist/workspace/trailers.js +111 -0
  888. package/dist/workspace/tree.js +136 -0
  889. package/dist/workspace/trust/attestor.js +63 -0
  890. package/dist/workspace/trust/dsse.js +108 -0
  891. package/dist/workspace/trust/evidence-cli.js +175 -0
  892. package/dist/workspace/trust/evidence.js +161 -0
  893. package/dist/workspace/trust/gate-seal.js +226 -0
  894. package/dist/workspace/trust/policy.js +190 -0
  895. package/dist/workspace/trust/provenance.js +180 -0
  896. package/dist/workspace/trust/rotation.js +298 -0
  897. package/dist/workspace/trust/run-commits.js +101 -0
  898. package/dist/workspace/trust/run-statement.js +182 -0
  899. package/dist/workspace/trust/seal.js +272 -0
  900. package/dist/workspace/trust/signers-cli.js +152 -0
  901. package/dist/workspace/trust/ssh-commit.js +178 -0
  902. package/dist/workspace/trust/test-repo.js +118 -0
  903. package/dist/workspace/trust/trust-files.js +193 -0
  904. package/dist/workspace/trust/verify-cli.js +63 -0
  905. package/dist/workspace/trust/verify.js +192 -0
  906. package/dist/workspace/which-chant.js +141 -0
  907. package/dist/workspace/wip-cli.js +95 -0
  908. package/dist/workspace/wip-write.schema.json +504 -0
  909. package/dist/workspace/wip.js +631 -0
  910. package/dist/workspace/wip.schema.json +334 -0
  911. package/dist/workspace/work-cli.js +448 -0
  912. package/dist/workspace/work-evidence.js +122 -0
  913. package/dist/workspace/work-evidence.schema.json +222 -0
  914. package/dist/workspace/work-history.schema.json +421 -0
  915. package/dist/workspace/work-lease.schema.json +246 -0
  916. package/dist/workspace/work-size.js +77 -0
  917. package/dist/workspace/work.js +283 -0
  918. package/dist/workspace/workspace-kinds.schema.json +259 -259
  919. package/dist/workspace/workspace-principals.schema.json +53 -53
  920. package/dist/workspace/write-lock-cli.js +105 -0
  921. package/dist/workspace/write-lock.js +424 -0
  922. package/dist/workspace/write-lock.schema.json +172 -0
  923. package/dist/workspace/write-scope.js +484 -0
  924. package/dist/yaml.js +459 -0
  925. package/package.json +2 -2
  926. package/src/build.ts +8 -0
  927. package/src/change-set.test.ts +48 -0
  928. package/src/change-set.ts +52 -2
  929. package/src/ci-jobs.test.ts +49 -0
  930. package/src/ci-jobs.ts +515 -0
  931. package/src/cli/commands/check-lexicon-plugin.ts +2 -0
  932. package/src/cli/commands/lint.ts +3 -0
  933. package/src/cli/commands/migrate.ts +2 -0
  934. package/src/cli/compiled-cli.e2e.test.ts +165 -0
  935. package/src/cli/main.ts +121 -27
  936. package/src/cli/mcp/workspace-tools.ts +1 -1
  937. package/src/codegen/pinned-upgrade.ts +2 -0
  938. package/src/components/discover.ts +2 -0
  939. package/src/components/pr-pipeline.ts +3 -2
  940. package/src/components/sandbox/driver.ts +3 -1
  941. package/src/composite.ts +15 -3
  942. package/src/config-import.ts +3 -0
  943. package/src/discovery/collect.ts +15 -1
  944. package/src/discovery/fold-build-parity.test.ts +71 -0
  945. package/src/discovery/fold-import.ts +25 -127
  946. package/src/discovery/fold-project-provenance.test.ts +21 -4
  947. package/src/discovery/host-composite.ts +101 -0
  948. package/src/discovery/import.ts +2 -0
  949. package/src/discovery/index.ts +11 -1
  950. package/src/discovery/sandbox/driver.ts +3 -1
  951. package/src/gate-decision-bundle.test.ts +5 -4
  952. package/src/gate-decision-identity.test.ts +59 -6
  953. package/src/gate-decision.ts +81 -21
  954. package/src/lexicon-module.ts +3 -0
  955. package/src/lifecycle/gate-audit.test.ts +55 -1
  956. package/src/lifecycle/gate-audit.ts +116 -3
  957. package/src/lifecycle/gate-ledger.test.ts +20 -1
  958. package/src/lifecycle/gate-ledger.ts +33 -1
  959. package/src/lint/config.ts +1 -1
  960. package/src/lint/discover.ts +28 -8
  961. package/src/lint/policy-import.ts +4 -1
  962. package/src/lint/rule-loader.ts +2 -0
  963. package/src/op/activities/activity-contracts.ts +1 -1
  964. package/src/op/activities/change-set.ts +11 -3
  965. package/src/op/activities/lexicon-upgrade.test.ts +2 -0
  966. package/src/op/activities/reconcile.test.ts +62 -2
  967. package/src/op/activities/reconcile.ts +46 -22
  968. package/src/op/builders.ts +1 -1
  969. package/src/op/discover.ts +3 -0
  970. package/src/op/op-waves-run.ts +4 -3
  971. package/src/op/op-waves.test.ts +2 -0
  972. package/src/op/work-lease-run.test.ts +12 -4
  973. package/src/ts-loader.test.ts +23 -0
  974. package/src/ts-loader.ts +122 -0
  975. package/src/workspace/__fixtures__/contract-repo.ts +17 -1
  976. package/src/workspace/__fixtures__/sessions.ts +3 -3
  977. package/src/workspace/change-set.schema.json +5 -3
  978. package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
  979. package/src/workspace/ci-green-workflow.test.ts +4 -4
  980. package/src/workspace/ci-green-workflow.ts +5 -2
  981. package/src/workspace/class-data.test.ts +64 -0
  982. package/src/workspace/class-data.ts +236 -0
  983. package/src/workspace/declaration.ts +1 -1
  984. package/src/workspace/kinds.ts +7 -36
  985. package/src/workspace/lineage-migrations.ts +2 -0
  986. package/src/workspace/points.ts +1 -1
  987. package/src/workspace/principal-classes.ts +12 -95
  988. package/src/workspace/records-formats.test.ts +7 -2
  989. package/src/workspace/records-sessions-write.test.ts +3 -3
  990. package/src/workspace/status-contract.e2e.test.ts +37 -0
  991. package/src/workspace/status-contract.test.ts +23 -21
@@ -0,0 +1,204 @@
1
+ /**
2
+ * Pure evaluation of a plan scenario's `expect` clause against a `ChangeSet`
3
+ * (#1292).
4
+ *
5
+ * `evaluateScenario` reads only what the caller hands it — a `ChangeSet` and
6
+ * a `ScenarioExpect` — and does no I/O. Building the change set (reading a
7
+ * fixture, replaying it in place of a live observation) is the CLI handler's
8
+ * job (../cli/handlers/scenario.ts); this module is the part that stays
9
+ * testable without a filesystem, a build, or a fixture.
10
+ *
11
+ * Built on the same primitives `chant lifecycle plan` already computes from:
12
+ * `summarize` for counts, a filter over `cs.entries` for named deletes and
13
+ * ownership, and `evaluateUnobservedGate` (./unobserved-gate.ts, #1568) for
14
+ * the unobserved clause.
15
+ */
16
+ import { summarize } from "./change-set.js";
17
+ import { evaluateUnobservedGate } from "./unobserved-gate.js";
18
+ import { unobservedReasonText } from "../observation.js";
19
+ import { isBehaviourRefusalReport, renderBehaviourRefusal } from "../behaviour.js";
20
+ import { formatPerHour } from "../behaviour-delta.js";
21
+ /**
22
+ * Evaluate `expect` against `cs`. Pure: reads `cs`, `expect` and, for a
23
+ * `cost` clause, the fixture's `behaviour` block handed over as `behaviour`;
24
+ * computes nothing else. Every clause present on `expect` is checked
25
+ * independently and every one contributes to `checks`; `pass` is true only
26
+ * when all of them are.
27
+ */
28
+ export function evaluateScenario(cs, expect, behaviour) {
29
+ const counts = summarize(cs);
30
+ const checks = [];
31
+ if (expect.noop) {
32
+ // An effect receipt's fire (#1832) is a real proposed action — a
33
+ // migration or seed job about to run — even though it never counts
34
+ // toward the create/update/delete triad `buildChangeSet` classifies
35
+ // ordinary resources into. `noop: true` claims the plan does nothing;
36
+ // a pending effect fire is something, so it offends the claim exactly
37
+ // like a create/update/delete would.
38
+ const offenders = { create: counts.create, update: counts.update, delete: counts.delete, effect: counts.effect };
39
+ const clean = offenders.create === 0 && offenders.update === 0 && offenders.delete === 0 && offenders.effect === 0;
40
+ checks.push({
41
+ clause: "noop",
42
+ pass: clean,
43
+ ...(clean
44
+ ? {}
45
+ : {
46
+ detail: `expected noop (no create/update/delete/effect) but the plan proposes ` +
47
+ `${offenders.create} create, ${offenders.update} update, ${offenders.delete} delete, ${offenders.effect} effect — ` +
48
+ nameList(cs, ["create", "update", "delete", "effect"]),
49
+ }),
50
+ });
51
+ }
52
+ for (const clause of ["create", "update", "delete"]) {
53
+ const want = expect[clause];
54
+ if (want === undefined)
55
+ continue;
56
+ const got = counts[clause];
57
+ const pass = got === want;
58
+ checks.push({
59
+ clause,
60
+ pass,
61
+ ...(pass ? {} : { detail: `expected ${want} ${clause}, plan proposes ${got} — ${nameList(cs, [clause])}` }),
62
+ });
63
+ }
64
+ if (expect.deletes) {
65
+ checks.push(evaluateDeletesClause(cs, expect.deletes));
66
+ }
67
+ if (expect.unobserved !== undefined) {
68
+ checks.push(evaluateUnobservedClause(cs, expect.unobserved));
69
+ }
70
+ if (expect.cost !== undefined) {
71
+ checks.push(evaluateCostClause(expect.cost, behaviour));
72
+ }
73
+ return { pass: checks.every((c) => c.pass), checks };
74
+ }
75
+ /**
76
+ * The `cost` clause (#2358). Three refusals before any number is read, each
77
+ * naming why, because the alternative to each is a bound that passes on
78
+ * nothing:
79
+ *
80
+ * - no `behaviour` block in the fixture — nothing was predicted;
81
+ * - the block is a refusal — the engine was absent, unreachable, out of
82
+ * credit, over quota, or refused a credential, and the fixture carries
83
+ * that refusal's own text;
84
+ * - the named entity is not in the fixture's figures — declined with a
85
+ * reason, or never asked about.
86
+ *
87
+ * The figure is then one of three, and the detail says which: the named
88
+ * entity's own rate, the engine's stated total, or chant's sum over every
89
+ * predicted entity when the engine states no total. The sum is chant's own
90
+ * arithmetic and is labelled so; it also names every entity the engine
91
+ * declined, because those are in the estate and not in the sum.
92
+ */
93
+ function evaluateCostClause(bound, behaviour) {
94
+ const fail = (detail) => ({ clause: "cost", pass: false, detail });
95
+ if (behaviour === undefined || "missing" in behaviour) {
96
+ return fail(`${behaviour?.missing ?? "the fixture carries no `behaviour` block"} — a cost bound is checked against the ` +
97
+ "fixture's recorded prediction, and there is none. Record one on the snapshot, or drop the clause.");
98
+ }
99
+ const result = behaviour.result;
100
+ if (isBehaviourRefusalReport(result)) {
101
+ return fail(`the fixture's prediction is a refusal (${result.refusal.cause}), and a bound cannot be checked against no ` +
102
+ `figure: ${renderBehaviourRefusal(result.refusal, { color: false }).replace(/\n\s*/g, " ")}`);
103
+ }
104
+ const declined = Object.entries(result.unpredicted ?? {}).map(([name, u]) => `${name} (${u.reason}${u.detail ? `: ${u.detail}` : ""})`);
105
+ const declinedNote = declined.length > 0 ? `; ${declined.length} declined and not in the figure: ${declined.join(", ")}` : "";
106
+ let perHour;
107
+ let currency;
108
+ let which;
109
+ if (bound.entity !== undefined) {
110
+ const figure = Object.prototype.hasOwnProperty.call(result.entities, bound.entity)
111
+ ? result.entities[bound.entity]
112
+ : undefined;
113
+ if (!figure) {
114
+ const hole = result.unpredicted?.[bound.entity];
115
+ return fail(hole
116
+ ? `"${bound.entity}" was declined by the engine (${hole.reason}${hole.detail ? `: ${hole.detail}` : ""}), so it has no figure to bound`
117
+ : `"${bound.entity}" is in neither the fixture's figures nor its declined entities — the prediction never asked about it`);
118
+ }
119
+ perHour = figure.cost.perHour;
120
+ currency = figure.cost.currency;
121
+ which = `${bound.entity}'s own rate (${figure.provenance.engine} ${figure.provenance.version}, ${figure.provenance.tolerance}, ${figure.provenance.basis})`;
122
+ }
123
+ else if (result.meta.total) {
124
+ perHour = result.meta.total.perHour;
125
+ currency = result.meta.total.currency;
126
+ which = `the engine's own estate total (${result.meta.engine} ${result.meta.version})${declinedNote}`;
127
+ }
128
+ else {
129
+ const names = Object.keys(result.entities);
130
+ const currencies = new Set(names.map((n) => result.entities[n].cost.currency));
131
+ if (currencies.size > 1) {
132
+ return fail(`the engine states no total and the entities are priced in ${[...currencies].sort().join(", ")} — chant converts ` +
133
+ "nothing, so there is no one sum to bound");
134
+ }
135
+ if (names.length === 0) {
136
+ return fail(`the engine states no total and predicted no entity${declinedNote} — nothing to bound`);
137
+ }
138
+ perHour = names.reduce((sum, n) => sum + result.entities[n].cost.perHour, 0);
139
+ currency = [...currencies][0];
140
+ which = `chant's own sum over ${names.length} predicted entit${names.length === 1 ? "y" : "ies"} (the engine states no total)${declinedNote}`;
141
+ }
142
+ const level = result.meta.at.traffic;
143
+ if (currency !== bound.currency) {
144
+ return fail(`the bound is in ${bound.currency} and the figure is ${formatPerHour(perHour)} ${currency}/hour at "${level}" — ` +
145
+ `chant converts nothing; read from ${which}`);
146
+ }
147
+ const pass = perHour <= bound.maxPerHour;
148
+ const detail = `${pass ? "" : "exceeded: "}${formatPerHour(perHour)} ${currency}/hour at "${level}" against a bound of ` +
149
+ `${formatPerHour(bound.maxPerHour)} ${bound.currency}/hour; read from ${which}`;
150
+ return { clause: "cost", pass, detail };
151
+ }
152
+ /** Names (with type) of every entry matching one of `actions`, for a legible failure message. */
153
+ function nameList(cs, actions) {
154
+ const names = cs.entries
155
+ .filter((e) => actions.includes(e.action))
156
+ .map((e) => `${e.name}${e.type ? ` (${e.type})` : ""} [${e.action}]`);
157
+ return names.length === 0 ? "(no matching entries)" : names.join(", ");
158
+ }
159
+ function evaluateDeletesClause(cs, wanted) {
160
+ const actualDeletes = cs.entries.filter((e) => e.action === "delete");
161
+ const actualByName = new Map(actualDeletes.map((e) => [e.name, e]));
162
+ const wantedNames = new Set(wanted.map((w) => w.name));
163
+ const problems = [];
164
+ for (const want of wanted) {
165
+ const match = actualByName.get(want.name);
166
+ if (!match) {
167
+ problems.push(`"${want.name}" (ownership ${want.ownership}) — not proposed for delete`);
168
+ }
169
+ else if (match.ownership !== want.ownership) {
170
+ problems.push(`"${want.name}" — expected ownership "${want.ownership}", plan proposes ownership "${match.ownership}"`);
171
+ }
172
+ }
173
+ for (const e of actualDeletes) {
174
+ if (!wantedNames.has(e.name)) {
175
+ problems.push(`"${e.name}"${e.type ? ` (${e.type})` : ""} [${e.ownership}] — deleted but not expected`);
176
+ }
177
+ }
178
+ return {
179
+ clause: "deletes",
180
+ pass: problems.length === 0,
181
+ ...(problems.length > 0 ? { detail: problems.join("; ") } : {}),
182
+ };
183
+ }
184
+ function evaluateUnobservedClause(cs, policy) {
185
+ // evaluateUnobservedGate enumerates every unobserved row regardless of
186
+ // reason — "refuse" collects the full set to check against below. A
187
+ // scenario's allow list names ENTITIES, not reasons (./scenario.ts's
188
+ // ScenarioUnobservedPolicy doc explains why), so the gate's own reason-keyed
189
+ // policy isn't reused for the pass/fail decision — only for the enumeration.
190
+ const gate = evaluateUnobservedGate(cs, "refuse");
191
+ const allowedNames = typeof policy === "object" ? new Set(policy.allow) : undefined;
192
+ const unallowed = gate.findings.filter((f) => !allowedNames?.has(f.name));
193
+ return {
194
+ clause: "unobserved",
195
+ pass: unallowed.length === 0,
196
+ ...(unallowed.length > 0
197
+ ? {
198
+ detail: unallowed
199
+ .map((f) => `${f.name}${f.type ? ` (${f.type})` : ""} — ${unobservedReasonText(f.reason)}${f.detail ? `: ${f.detail}` : ""}`)
200
+ .join(", "),
201
+ }
202
+ : {}),
203
+ };
204
+ }
@@ -0,0 +1,214 @@
1
+ /**
2
+ * Plan scenarios (chant #1292): a declared expectation about what a change
3
+ * SHOULD do, checkable offline against a fixture snapshot.
4
+ *
5
+ * Everything else chant validates is about shape — is this declaration
6
+ * well-formed, does this reference resolve. Nothing answers "what will this
7
+ * change do" as something source can assert about itself, until now. A
8
+ * `Scenario` pairs a `given` (a stand-in for live observation) with an
9
+ * `expect` (a claim about the resulting change set) — `chant scenario check`
10
+ * (../cli/handlers/scenario.ts) builds the project, replays `given` in place
11
+ * of a live read, and evaluates `expect` against the resulting `ChangeSet`
12
+ * (./change-set.ts) via `evaluateScenario` (./scenario-eval.ts).
13
+ *
14
+ * Modeled precisely on the other non-resource Declarables (../effect-receipt.ts,
15
+ * ../secret-provenance.ts): discovery collects a `Scenario` like any entity
16
+ * (it is a Declarable), but it carries no resource payload and no serializer
17
+ * ever emits it — `partitionByLexicon` (../build.ts) excludes it from every
18
+ * lexicon's partition, the same way it excludes a secret declaration.
19
+ *
20
+ * This module is pure and does no I/O: `snapshot()` records where the fixture
21
+ * comes from without reading it, and the factory validates and freezes. The
22
+ * CLI handler is where the fixture is actually read, replayed, and compared —
23
+ * the same synthesis/plan split every other lifecycle primitive here follows.
24
+ */
25
+ import { DECLARABLE_MARKER } from "../declarable.js";
26
+ /** Marker symbol identifying a scenario declaration. `Symbol.for` so it
27
+ * survives the entity-wire codec, the same reason ../effect-receipt.ts and
28
+ * ../secret-provenance.ts use `Symbol.for` for their markers. */
29
+ export const SCENARIO_MARKER = Symbol.for("chant.scenario");
30
+ /** The `entityType` every scenario declaration carries. */
31
+ export const SCENARIO_ENTITY_TYPE = "Chant::Scenario";
32
+ /**
33
+ * Declare `given` from a single string. Pure and offline: no filesystem
34
+ * access, no git — the factory only classifies the string's SHAPE, never
35
+ * checks whether it exists. That is what keeps `Scenario` foldable under
36
+ * `--sandbox`, the same discipline `declareSecret`'s committed-encrypted path
37
+ * validation follows (../secret-provenance.ts).
38
+ *
39
+ * The classification is structural: a string containing a path separator or
40
+ * ending in `.json` is a fixture file; anything else (a bare token like
41
+ * `"prod"`) is an environment name. A `chant.config.ts` environment name that
42
+ * happens to contain a slash or end in `.json` is not supported by this
43
+ * heuristic — pass `{ kind: "env", env }` directly in that unlikely case.
44
+ */
45
+ export function snapshot(source) {
46
+ if (typeof source !== "string" || source.length === 0) {
47
+ throw new Error("snapshot: `source` must be a non-empty string");
48
+ }
49
+ const looksLikeFile = source.includes("/") || source.includes("\\") || source.toLowerCase().endsWith(".json");
50
+ return looksLikeFile ? { kind: "file", path: source } : { kind: "env", env: source };
51
+ }
52
+ /** Every recognized `expect` clause key — for the excess-key check below and
53
+ * for exhaustiveness at call sites. */
54
+ export const EXPECT_KEYS = ["noop", "create", "update", "delete", "deletes", "unobserved", "cost"];
55
+ const OWNERSHIP_VALUES = ["owned", "foreign", "unknown"];
56
+ /**
57
+ * Declare a plan scenario. The returned object is a locked Declarable:
58
+ * declared fields are immutable and nested structures are frozen, the same
59
+ * shape ../effect-receipt.ts and ../secret-provenance.ts lock down; the
60
+ * top-level object stays extensible so discovery can still stamp its own
61
+ * symbol-keyed metadata.
62
+ */
63
+ export function Scenario(name, options) {
64
+ if (typeof name !== "string" || name.length === 0) {
65
+ throw new Error("Scenario: `name` must be a non-empty string");
66
+ }
67
+ const given = validateGiven(name, options?.given);
68
+ const expect = validateExpect(name, options?.expect);
69
+ const decl = {
70
+ [DECLARABLE_MARKER]: true,
71
+ [SCENARIO_MARKER]: true,
72
+ lexicon: "chant",
73
+ entityType: SCENARIO_ENTITY_TYPE,
74
+ name,
75
+ given,
76
+ expect,
77
+ };
78
+ for (const key of Object.keys(decl)) {
79
+ Object.defineProperty(decl, key, { writable: false, configurable: false });
80
+ }
81
+ return decl;
82
+ }
83
+ function validateGiven(name, given) {
84
+ if (typeof given !== "object" || given === null) {
85
+ throw new Error(`Scenario("${name}"): \`given\` is required — use snapshot(path) or snapshot(env)`);
86
+ }
87
+ const g = given;
88
+ if (g.kind === "file") {
89
+ if (typeof g.path !== "string" || g.path.length === 0) {
90
+ throw new Error(`Scenario("${name}"): \`given\` of kind "file" requires a non-empty \`path\``);
91
+ }
92
+ return Object.freeze({ kind: "file", path: g.path });
93
+ }
94
+ if (g.kind === "env") {
95
+ if (typeof g.env !== "string" || g.env.length === 0) {
96
+ throw new Error(`Scenario("${name}"): \`given\` of kind "env" requires a non-empty \`env\``);
97
+ }
98
+ return Object.freeze({ kind: "env", env: g.env });
99
+ }
100
+ throw new Error(`Scenario("${name}"): \`given\` must come from snapshot(path) or snapshot(env), got kind "${String(g.kind)}"`);
101
+ }
102
+ function validateExpect(name, expect) {
103
+ if (typeof expect !== "object" || expect === null || Array.isArray(expect)) {
104
+ throw new Error(`Scenario("${name}"): \`expect\` must be a plain object`);
105
+ }
106
+ const e = expect;
107
+ for (const key of Object.keys(e)) {
108
+ if (!EXPECT_KEYS.includes(key)) {
109
+ throw new Error(`Scenario("${name}"): unknown \`expect\` clause "${key}" — expected one of ${EXPECT_KEYS.join(", ")}`);
110
+ }
111
+ }
112
+ if (Object.keys(e).length === 0) {
113
+ throw new Error(`Scenario("${name}"): \`expect\` must include at least one clause (${EXPECT_KEYS.join(", ")}) — an empty expect asserts nothing`);
114
+ }
115
+ const out = {};
116
+ if ("noop" in e) {
117
+ if (e.noop !== true) {
118
+ throw new Error(`Scenario("${name}"): \`expect.noop\`, when present, must be exactly \`true\``);
119
+ }
120
+ out.noop = true;
121
+ }
122
+ for (const countKey of ["create", "update", "delete"]) {
123
+ if (countKey in e) {
124
+ const v = e[countKey];
125
+ if (typeof v !== "number" || !Number.isInteger(v) || v < 0) {
126
+ throw new Error(`Scenario("${name}"): \`expect.${countKey}\`, when present, must be a non-negative integer`);
127
+ }
128
+ out[countKey] = v;
129
+ }
130
+ }
131
+ if ("deletes" in e) {
132
+ if (!Array.isArray(e.deletes)) {
133
+ throw new Error(`Scenario("${name}"): \`expect.deletes\` must be an array`);
134
+ }
135
+ out.deletes = Object.freeze(e.deletes.map((d, i) => {
136
+ if (typeof d !== "object" || d === null) {
137
+ throw new Error(`Scenario("${name}"): \`expect.deletes[${i}]\` must be an object`);
138
+ }
139
+ const { name: deleteName, ownership } = d;
140
+ if (typeof deleteName !== "string" || deleteName.length === 0) {
141
+ throw new Error(`Scenario("${name}"): \`expect.deletes[${i}].name\` must be a non-empty string`);
142
+ }
143
+ if (!OWNERSHIP_VALUES.includes(ownership)) {
144
+ throw new Error(`Scenario("${name}"): \`expect.deletes[${i}].ownership\` must be one of ${OWNERSHIP_VALUES.join(", ")}`);
145
+ }
146
+ return Object.freeze({ name: deleteName, ownership: ownership });
147
+ }));
148
+ }
149
+ if ("unobserved" in e) {
150
+ const u = e.unobserved;
151
+ if (u === "refuse") {
152
+ out.unobserved = "refuse";
153
+ }
154
+ else if (typeof u === "object" && u !== null && Array.isArray(u.allow)) {
155
+ const allow = u.allow;
156
+ allow.forEach((entry, i) => {
157
+ if (typeof entry !== "string" || entry.length === 0) {
158
+ throw new Error(`Scenario("${name}"): \`expect.unobserved.allow[${i}]\` must be a non-empty string`);
159
+ }
160
+ });
161
+ out.unobserved = Object.freeze({ allow: Object.freeze([...allow]) });
162
+ }
163
+ else {
164
+ throw new Error(`Scenario("${name}"): \`expect.unobserved\` must be "refuse" or { allow: [names] }`);
165
+ }
166
+ }
167
+ if ("cost" in e) {
168
+ const c = e.cost;
169
+ if (typeof c !== "object" || c === null || Array.isArray(c)) {
170
+ throw new Error(`Scenario("${name}"): \`expect.cost\` must be { maxPerHour, currency, entity? }`);
171
+ }
172
+ const { maxPerHour, currency, entity } = c;
173
+ if (typeof maxPerHour !== "number" || !Number.isFinite(maxPerHour) || maxPerHour < 0) {
174
+ throw new Error(`Scenario("${name}"): \`expect.cost.maxPerHour\` must be a non-negative finite number`);
175
+ }
176
+ if (typeof currency !== "string" || currency.trim() === "") {
177
+ throw new Error(`Scenario("${name}"): \`expect.cost.currency\` must be a non-empty ISO 4217 code — chant converts nothing, so a bound needs its currency`);
178
+ }
179
+ if (entity !== undefined && (typeof entity !== "string" || entity.length === 0)) {
180
+ throw new Error(`Scenario("${name}"): \`expect.cost.entity\`, when present, must be a non-empty string`);
181
+ }
182
+ for (const key of Object.keys(c)) {
183
+ if (!["maxPerHour", "currency", "entity"].includes(key)) {
184
+ throw new Error(`Scenario("${name}"): unknown \`expect.cost\` field "${key}" — expected maxPerHour, currency, entity`);
185
+ }
186
+ }
187
+ out.cost = Object.freeze({
188
+ maxPerHour,
189
+ currency: currency.trim(),
190
+ ...(entity !== undefined ? { entity } : {}),
191
+ });
192
+ }
193
+ return Object.freeze(out);
194
+ }
195
+ /** Type guard for a scenario declaration. */
196
+ export function isScenario(value) {
197
+ return (typeof value === "object" &&
198
+ value !== null &&
199
+ SCENARIO_MARKER in value &&
200
+ value[SCENARIO_MARKER] === true);
201
+ }
202
+ /**
203
+ * Extract the scenario declarations from a discovered entity map — the read
204
+ * surface `chant scenario check` (../cli/handlers/scenario.ts) uses. Keyed by
205
+ * entity name (export name), the same key `DiscoveryResult.entities` uses.
206
+ */
207
+ export function collectScenarios(entities) {
208
+ const out = new Map();
209
+ for (const [name, entity] of entities) {
210
+ if (isScenario(entity))
211
+ out.set(name, entity);
212
+ }
213
+ return out;
214
+ }
@@ -0,0 +1,239 @@
1
+ import { observeDeep } from "./deep-observe.js";
2
+ import { computeBuildDigest } from "./digest.js";
3
+ import { collectDependencies, collectAmbient } from "./observe.js";
4
+ import { writeSnapshot, snapshotStorageKey, getHeadCommit, pushLifecycle } from "./git.js";
5
+ import { sortedJsonReplacer } from "../utils.js";
6
+ import { formatUnobserved, normalizeObservation, unobservedAll } from "../observation.js";
7
+ // One list of secret-bearing property names for both observation depths
8
+ // (#1014): the thin path warns on them here, the deep path masks them before a
9
+ // property tree is ever rendered or committed. Two lists would eventually
10
+ // disagree about what counts as a secret.
11
+ import { isSensitiveKey } from "../deep-observation.js";
12
+ import { isObservableDeclarable } from "../declarable.js";
13
+ /**
14
+ * Check for potential sensitive data in resource attributes and return warnings.
15
+ */
16
+ function checkSensitiveData(resources) {
17
+ const warnings = [];
18
+ for (const [name, meta] of Object.entries(resources)) {
19
+ if (!meta.attributes)
20
+ continue;
21
+ for (const attrName of Object.keys(meta.attributes)) {
22
+ if (isSensitiveKey(attrName)) {
23
+ warnings.push(`Potential sensitive data in ${name}.attributes.${attrName} — ensure it is scrubbed`);
24
+ }
25
+ }
26
+ }
27
+ return warnings;
28
+ }
29
+ /**
30
+ * Validate ResourceMetadata entries — resources must have at least type and status.
31
+ * Returns { valid, dropped, warnings }.
32
+ */
33
+ function validateResources(resources) {
34
+ const valid = {};
35
+ const dropped = [];
36
+ const warnings = [];
37
+ for (const [name, meta] of Object.entries(resources)) {
38
+ if (!meta.type || !meta.status) {
39
+ dropped.push(name);
40
+ warnings.push(`Dropped ${name}: missing type or status`);
41
+ continue;
42
+ }
43
+ valid[name] = meta;
44
+ }
45
+ // Check for sensitive data in valid resources
46
+ warnings.push(...checkSensitiveData(valid));
47
+ return { valid, dropped, warnings };
48
+ }
49
+ /**
50
+ * Take state snapshots for all plugins that implement describeResources.
51
+ */
52
+ export async function takeSnapshot(environment, plugins, buildResult, opts) {
53
+ const stack = opts?.stack;
54
+ const depth = opts?.deep ? "deep" : "identity";
55
+ // A stack declares the region it deploys to (#1261). Passing it through is
56
+ // what lets a multi-region estate be observed at all: the reader targets the
57
+ // stack's own region rather than whichever one the shell happens to be set
58
+ // to, so out-of-region stacks stop coming back empty.
59
+ const region = opts?.region;
60
+ const warnings = [];
61
+ const errors = [];
62
+ const snapshots = [];
63
+ const headCommit = await getHeadCommit(opts);
64
+ const timestamp = new Date().toISOString();
65
+ const digest = computeBuildDigest(buildResult);
66
+ for (const plugin of plugins) {
67
+ if (!plugin.describeResources && !plugin.listArtifacts)
68
+ continue;
69
+ // Get serialized build output for this lexicon
70
+ const rawOutput = buildResult.outputs.get(plugin.name);
71
+ const buildOutput = rawOutput === undefined
72
+ ? ""
73
+ : typeof rawOutput === "string"
74
+ ? rawOutput
75
+ : rawOutput.primary;
76
+ // Get entity names + entity props for this lexicon
77
+ const entityNames = [];
78
+ const entities = new Map();
79
+ for (const [name, entity] of buildResult.entities) {
80
+ // Resource declarables only — outputs, parameters and serializer
81
+ // directives have no live counterpart (see lifecycle/observe.ts).
82
+ if (entity.lexicon === plugin.name && isObservableDeclarable(entity)) {
83
+ entityNames.push(name);
84
+ entities.set(name, {
85
+ entityType: entity.entityType,
86
+ props: (entity.props != null ? entity.props : {}),
87
+ });
88
+ }
89
+ }
90
+ let resources = {};
91
+ let artifacts = {};
92
+ let unobserved = {};
93
+ let stackExports;
94
+ try {
95
+ if (plugin.describeResources) {
96
+ const observed = normalizeObservation(await plugin.describeResources({
97
+ environment,
98
+ buildOutput,
99
+ entityNames,
100
+ entities,
101
+ stack,
102
+ region,
103
+ }));
104
+ const { valid, dropped, warnings: validationWarnings } = validateResources(observed.resources);
105
+ warnings.push(...validationWarnings);
106
+ if (dropped.length > 0) {
107
+ warnings.push(`${plugin.name}: dropped ${dropped.length} invalid resource(s)`);
108
+ }
109
+ resources = valid;
110
+ // Record the holes (#1089). A snapshot is evidence of what was seen; an
111
+ // entity nobody could read must not be recorded as "was not there",
112
+ // because the next diff would then read it back as absent.
113
+ unobserved = observed.unobserved;
114
+ stackExports = observed.stackExports;
115
+ for (const [name, entry] of Object.entries(unobserved)) {
116
+ warnings.push(`${plugin.name}: not observed — ${formatUnobserved(name, entry)}`);
117
+ }
118
+ }
119
+ if (plugin.listArtifacts) {
120
+ // No region: artifacts are registry/chart objects (docker, helm), not
121
+ // regional cloud resources, and `listArtifacts` takes no region.
122
+ const raw = await plugin.listArtifacts({ environment, entities, stack });
123
+ const { valid, dropped, warnings: validationWarnings } = validateResources(raw);
124
+ warnings.push(...validationWarnings);
125
+ if (dropped.length > 0) {
126
+ warnings.push(`${plugin.name}: dropped ${dropped.length} invalid artifact(s)`);
127
+ }
128
+ artifacts = valid;
129
+ }
130
+ if (Object.keys(resources).length === 0 && Object.keys(artifacts).length === 0) {
131
+ const unreadable = Object.keys(unobserved).length;
132
+ errors.push(unreadable > 0
133
+ ? `${plugin.name}: nothing observed — ${unreadable} declared entity(ies) could not be read (see warnings); not snapshotting an unread environment as empty`
134
+ : `${plugin.name}: no valid resources or artifacts returned`);
135
+ continue;
136
+ }
137
+ // The deep read is a second pass, after identity is known to be readable
138
+ // (#1267). Keeping it separate means a lexicon with no deep reader still
139
+ // snapshots exactly as before, and a deep read that comes back empty
140
+ // downgrades the record rather than discarding an identity snapshot that
141
+ // was already good.
142
+ let properties;
143
+ let recordedDepth = "identity";
144
+ if (depth === "deep") {
145
+ if (!plugin.observeResourcesDeep) {
146
+ warnings.push(`${plugin.name}: no deep reader — recording an identity snapshot; property questions cannot be answered from it`);
147
+ }
148
+ else {
149
+ const observed = await observeDeep(plugin, {
150
+ environment,
151
+ buildOutput,
152
+ entities,
153
+ ...(stack ? { stack } : {}),
154
+ ...(region ? { region } : {}),
155
+ });
156
+ for (const [name, entry] of Object.entries(observed.unobserved)) {
157
+ warnings.push(`${plugin.name}: not observed deeply — ${formatUnobserved(name, entry)}`);
158
+ }
159
+ if (Object.keys(observed.resources).length > 0) {
160
+ properties = observed.resources;
161
+ recordedDepth = "deep";
162
+ }
163
+ else {
164
+ warnings.push(`${plugin.name}: deep read returned no properties — recording an identity snapshot`);
165
+ }
166
+ }
167
+ }
168
+ // What this estate depends on but does not manage (#1273), recorded so a
169
+ // replayed snapshot can answer the same questions a live read can (#1266).
170
+ // Without them a snapshot holds the managed resources and no route to the
171
+ // account's default VPC, so `internetFacing` is unanswerable from it —
172
+ // which would make `search --at` quietly weaker than `search --live`.
173
+ const dependencies = await collectDependencies(plugin, {
174
+ environment,
175
+ entities,
176
+ observed: resources,
177
+ stacks: stack ? [{ name: stack, ...(region ? { region } : {}) }] : [],
178
+ });
179
+ for (const message of dependencies.warnings)
180
+ warnings.push(message);
181
+ // Ambient resources (#1278) are recorded too when asked for, so a replayed
182
+ // snapshot can answer "which of these are unused" without a live read.
183
+ // Without this `search --at --ambient` filters a set that was never
184
+ // recorded and silently returns nothing.
185
+ const ambient = opts?.ambient
186
+ ? await collectAmbient(plugin, {
187
+ environment,
188
+ kinds: opts?.ambientKinds ?? [...new Set([...entities.values()].map((e) => e.entityType))],
189
+ observed: resources,
190
+ stacks: stack ? [{ name: stack, ...(region ? { region } : {}) }] : [],
191
+ warnings,
192
+ })
193
+ : {};
194
+ const withDependencies = { ...resources, ...dependencies.resources, ...ambient };
195
+ const snapshot = {
196
+ lexicon: plugin.name,
197
+ environment,
198
+ ...(stack ? { stack } : {}),
199
+ commit: headCommit,
200
+ timestamp,
201
+ resources: withDependencies,
202
+ ...(dependencies.edges.length > 0 ? { edges: dependencies.edges } : {}),
203
+ ...(stackExports && Object.keys(stackExports).length > 0 ? { stackExports } : {}),
204
+ ...(Object.keys(unobserved).length > 0 && { unobserved }),
205
+ ...(Object.keys(artifacts).length > 0 && { artifacts }),
206
+ // Only written when deep. An absent field means identity, which is what
207
+ // every snapshot taken before #1267 was.
208
+ ...(recordedDepth === "deep" && { depth: recordedDepth, properties }),
209
+ digest,
210
+ };
211
+ snapshots.push(snapshot);
212
+ }
213
+ catch (err) {
214
+ // A thrown read is not an empty environment — record nothing and say so
215
+ // (#1089). Writing a snapshot here would persist "none of this exists".
216
+ errors.push(`${plugin.name}: ${err instanceof Error ? err.message : String(err)}`);
217
+ const message = err instanceof Error ? err.message : String(err);
218
+ for (const [name, entry] of Object.entries(unobservedAll(entityNames, "read-failed", message, entities))) {
219
+ warnings.push(`${plugin.name}: not observed — ${formatUnobserved(name, entry)}`);
220
+ }
221
+ }
222
+ }
223
+ // Write all successful snapshots to git
224
+ let commitSha = "";
225
+ for (const snapshot of snapshots) {
226
+ const json = JSON.stringify(snapshot, sortedJsonReplacer, 2);
227
+ commitSha = await writeSnapshot(snapshot.environment, snapshotStorageKey(snapshot.lexicon, snapshot.stack), json, opts);
228
+ }
229
+ // Push to remote
230
+ if (snapshots.length > 0) {
231
+ await pushLifecycle(opts);
232
+ }
233
+ return {
234
+ snapshots,
235
+ commit: commitSha,
236
+ warnings,
237
+ errors,
238
+ };
239
+ }