@intentius/chant 0.124.12 → 0.124.14

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 (928) 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.js +668 -0
  35. package/dist/builder.js +44 -0
  36. package/dist/cdk/advise.js +30 -0
  37. package/dist/cdk/assembly.js +122 -0
  38. package/dist/cdk/graph.js +444 -0
  39. package/dist/cdk/tier-map.js +64 -0
  40. package/dist/cdk/types.js +24 -0
  41. package/dist/change-set.js +312 -0
  42. package/dist/child-project.js +21 -0
  43. package/dist/claimed-fields.js +135 -0
  44. package/dist/cli/build-options.js +70 -0
  45. package/dist/cli/build-params-cli.js +139 -0
  46. package/dist/cli/command-group.js +123 -0
  47. package/dist/cli/commands/audit-agents.js +326 -0
  48. package/dist/cli/commands/audit.js +571 -0
  49. package/dist/cli/commands/build.js +920 -0
  50. package/dist/cli/commands/carve-apply.js +153 -0
  51. package/dist/cli/commands/carve-bridge.js +201 -0
  52. package/dist/cli/commands/carve-emit.js +332 -0
  53. package/dist/cli/commands/carve-status.js +119 -0
  54. package/dist/cli/commands/carve.js +204 -0
  55. package/dist/cli/commands/check-lexicon-docs.js +79 -0
  56. package/dist/cli/commands/check-lexicon-examples.js +177 -0
  57. package/dist/cli/commands/check-lexicon-intrinsics.js +291 -0
  58. package/dist/cli/commands/check-lexicon-mcp.js +82 -0
  59. package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
  60. package/dist/cli/commands/check-lexicon-plugin.js +104 -0
  61. package/dist/cli/commands/check-lexicon.js +766 -0
  62. package/dist/cli/commands/describe.js +85 -0
  63. package/dist/cli/commands/diff.js +175 -0
  64. package/dist/cli/commands/doctor.js +350 -0
  65. package/dist/cli/commands/import-agents.js +155 -0
  66. package/dist/cli/commands/import.js +670 -0
  67. package/dist/cli/commands/init-lexicon/templates/codegen.js +194 -0
  68. package/dist/cli/commands/init-lexicon/templates/docs.js +100 -0
  69. package/dist/cli/commands/init-lexicon/templates/examples.js +29 -0
  70. package/dist/cli/commands/init-lexicon/templates/lint.js +34 -0
  71. package/dist/cli/commands/init-lexicon/templates/lsp.js +37 -0
  72. package/dist/cli/commands/init-lexicon/templates/plugin.js +108 -0
  73. package/dist/cli/commands/init-lexicon/templates/project.js +240 -0
  74. package/dist/cli/commands/init-lexicon/templates/spec.js +56 -0
  75. package/dist/cli/commands/init-lexicon/templates/tests.js +66 -0
  76. package/dist/cli/commands/init-lexicon.js +172 -0
  77. package/dist/cli/commands/init.js +381 -0
  78. package/dist/cli/commands/lexicon-rolling-upgrade.js +145 -0
  79. package/dist/cli/commands/lexicon-surface-diff.js +145 -0
  80. package/dist/cli/commands/licenses.js +125 -0
  81. package/dist/cli/commands/lint.d.ts.map +1 -1
  82. package/dist/cli/commands/lint.js +948 -0
  83. package/dist/cli/commands/list.js +63 -0
  84. package/dist/cli/commands/migrate.d.ts.map +1 -1
  85. package/dist/cli/commands/migrate.js +423 -0
  86. package/dist/cli/commands/onboard.js +403 -0
  87. package/dist/cli/commands/pinned-upgrade.js +191 -0
  88. package/dist/cli/commands/update.js +194 -0
  89. package/dist/cli/commands/vendor.js +217 -0
  90. package/dist/cli/conflict-check.js +104 -0
  91. package/dist/cli/debug.js +8 -0
  92. package/dist/cli/format.js +104 -0
  93. package/dist/cli/handlers/build.js +267 -0
  94. package/dist/cli/handlers/carve-apply.js +30 -0
  95. package/dist/cli/handlers/carve-bridge.js +28 -0
  96. package/dist/cli/handlers/carve-emit.js +50 -0
  97. package/dist/cli/handlers/carve-status.js +26 -0
  98. package/dist/cli/handlers/carve.js +40 -0
  99. package/dist/cli/handlers/change-set.js +46 -0
  100. package/dist/cli/handlers/components.js +730 -0
  101. package/dist/cli/handlers/dev.js +113 -0
  102. package/dist/cli/handlers/emulator.js +233 -0
  103. package/dist/cli/handlers/explain.js +54 -0
  104. package/dist/cli/handlers/fan-out.js +422 -0
  105. package/dist/cli/handlers/gate-resume.js +275 -0
  106. package/dist/cli/handlers/generate.js +84 -0
  107. package/dist/cli/handlers/graph.js +969 -0
  108. package/dist/cli/handlers/init.js +102 -0
  109. package/dist/cli/handlers/lifecycle.js +1727 -0
  110. package/dist/cli/handlers/lint.js +62 -0
  111. package/dist/cli/handlers/migrate.js +48 -0
  112. package/dist/cli/handlers/misc.js +391 -0
  113. package/dist/cli/handlers/operator.js +1162 -0
  114. package/dist/cli/handlers/override-approve.js +102 -0
  115. package/dist/cli/handlers/pr.js +503 -0
  116. package/dist/cli/handlers/promote.js +342 -0
  117. package/dist/cli/handlers/run-generate.js +206 -0
  118. package/dist/cli/handlers/run-wave.js +66 -0
  119. package/dist/cli/handlers/run.js +1191 -0
  120. package/dist/cli/handlers/scenario.js +325 -0
  121. package/dist/cli/handlers/search.js +924 -0
  122. package/dist/cli/handlers/serve.js +32 -0
  123. package/dist/cli/handlers/vendor.js +154 -0
  124. package/dist/cli/index.js +3 -0
  125. package/dist/cli/is-entry-point.js +23 -0
  126. package/dist/cli/lsp/capabilities.js +28 -0
  127. package/dist/cli/lsp/diagnostics.js +34 -0
  128. package/dist/cli/lsp/server.js +329 -0
  129. package/dist/cli/main.d.ts.map +1 -1
  130. package/dist/cli/main.js +2540 -0
  131. package/dist/cli/mcp/lifecycle-tools.js +80 -0
  132. package/dist/cli/mcp/op-tools.js +306 -0
  133. package/dist/cli/mcp/resource-handlers.js +258 -0
  134. package/dist/cli/mcp/resources/context.js +85 -0
  135. package/dist/cli/mcp/server.js +353 -0
  136. package/dist/cli/mcp/tools/build.js +111 -0
  137. package/dist/cli/mcp/tools/composites.js +95 -0
  138. package/dist/cli/mcp/tools/explain.js +166 -0
  139. package/dist/cli/mcp/tools/import.js +49 -0
  140. package/dist/cli/mcp/tools/lint.js +41 -0
  141. package/dist/cli/mcp/tools/scaffold.js +111 -0
  142. package/dist/cli/mcp/tools/search.js +112 -0
  143. package/dist/cli/mcp/types.js +1 -0
  144. package/dist/cli/mcp/workspace-plugins.js +91 -0
  145. package/dist/cli/mcp/workspace-tools.d.ts +1 -1
  146. package/dist/cli/mcp/workspace-tools.js +564 -0
  147. package/dist/cli/mcp-config.js +70 -0
  148. package/dist/cli/plugins.js +313 -0
  149. package/dist/cli/registry.js +23 -0
  150. package/dist/cli/reporters/stylish.js +329 -0
  151. package/dist/cli/version.js +15 -0
  152. package/dist/cli/watch.js +79 -0
  153. package/dist/codegen/bound-property-types.js +82 -0
  154. package/dist/codegen/coverage.js +119 -0
  155. package/dist/codegen/docs-file-markers.js +60 -0
  156. package/dist/codegen/docs-pages.js +115 -0
  157. package/dist/codegen/docs-rule-scanning.js +164 -0
  158. package/dist/codegen/docs-rules.js +76 -0
  159. package/dist/codegen/docs-sections.js +117 -0
  160. package/dist/codegen/docs-sidebar.js +65 -0
  161. package/dist/codegen/docs-types.js +4 -0
  162. package/dist/codegen/docs.js +356 -0
  163. package/dist/codegen/fetch.js +340 -0
  164. package/dist/codegen/generate-post-synth-barrel.js +63 -0
  165. package/dist/codegen/generate-registry.js +71 -0
  166. package/dist/codegen/generate-runtime-index.js +56 -0
  167. package/dist/codegen/generate-typescript.js +119 -0
  168. package/dist/codegen/generate.js +115 -0
  169. package/dist/codegen/json-patch.js +141 -0
  170. package/dist/codegen/json-schema-to-ts.js +344 -0
  171. package/dist/codegen/json-schema.js +246 -0
  172. package/dist/codegen/lexicon-regen.js +412 -0
  173. package/dist/codegen/naming.js +217 -0
  174. package/dist/codegen/okf-lexicon.js +245 -0
  175. package/dist/codegen/package.js +150 -0
  176. package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
  177. package/dist/codegen/pinned-upgrade.js +494 -0
  178. package/dist/codegen/registry.js +60 -0
  179. package/dist/codegen/rehype-base-url.mjs +68 -0
  180. package/dist/codegen/rolling-upgrade.js +217 -0
  181. package/dist/codegen/surface-snapshot.js +537 -0
  182. package/dist/codegen/testdata/postgres-tags.json +242 -0
  183. package/dist/codegen/topo-sort.js +36 -0
  184. package/dist/codegen/typecheck.js +115 -0
  185. package/dist/codegen/validate.js +200 -0
  186. package/dist/codegen/version-bump.js +35 -0
  187. package/dist/components/auto-release.js +143 -0
  188. package/dist/components/builders.js +47 -0
  189. package/dist/components/capability-plugin-loader.js +175 -0
  190. package/dist/components/capability-plugin-schema.js +46 -0
  191. package/dist/components/capability-plugin.js +99 -0
  192. package/dist/components/capability.js +60 -0
  193. package/dist/components/changed-files.js +72 -0
  194. package/dist/components/cli-support.js +427 -0
  195. package/dist/components/component.js +120 -0
  196. package/dist/components/component.schema.json +271 -0
  197. package/dist/components/config-defaults.js +130 -0
  198. package/dist/components/deploy-units.js +60 -0
  199. package/dist/components/discover.d.ts.map +1 -1
  200. package/dist/components/discover.js +189 -0
  201. package/dist/components/driver-output.js +86 -0
  202. package/dist/components/driver.js +728 -0
  203. package/dist/components/fan-out-output.js +165 -0
  204. package/dist/components/fan-out-record.js +94 -0
  205. package/dist/components/fan-out-run.js +373 -0
  206. package/dist/components/fan-out-support.js +60 -0
  207. package/dist/components/fan-out.js +273 -0
  208. package/dist/components/gate-plan.js +41 -0
  209. package/dist/components/gated-wave-pipeline.js +46 -0
  210. package/dist/components/index.js +24 -0
  211. package/dist/components/layers.js +28 -0
  212. package/dist/components/manifest-persistence.js +108 -0
  213. package/dist/components/pilots/alb-ecs.pilot.js +59 -0
  214. package/dist/components/pilots/dynamodb.pilot.js +51 -0
  215. package/dist/components/pilots/jar-emr.pilot.js +65 -0
  216. package/dist/components/pilots/lambda.pilot.js +52 -0
  217. package/dist/components/pilots/neo4j-fanout.pilot.js +68 -0
  218. package/dist/components/pilots/project.js +12 -0
  219. package/dist/components/pr-pipeline.js +134 -0
  220. package/dist/components/pr-run.js +363 -0
  221. package/dist/components/presets/ecs-fargate.js +72 -0
  222. package/dist/components/presets/index.js +28 -0
  223. package/dist/components/presets/lambda.js +34 -0
  224. package/dist/components/presets/single-host-compose.js +41 -0
  225. package/dist/components/promote.js +549 -0
  226. package/dist/components/registry.js +34 -0
  227. package/dist/components/run-progress.js +33 -0
  228. package/dist/components/sandbox/driver.d.ts.map +1 -1
  229. package/dist/components/sandbox/driver.js +93 -0
  230. package/dist/components/sandbox/run.js +115 -0
  231. package/dist/components/starter-plugin.js +104 -0
  232. package/dist/components/verbs/__tests__/mock-cloud-executor.js +68 -0
  233. package/dist/components/verbs/__tests__/mock-process-runner.js +45 -0
  234. package/dist/components/verbs/__tests__/mock-sbom-generator.js +56 -0
  235. package/dist/components/verbs/bom-writer.js +287 -0
  236. package/dist/components/verbs/build-archive.js +188 -0
  237. package/dist/components/verbs/build.js +142 -0
  238. package/dist/components/verbs/cloud-executor.js +110 -0
  239. package/dist/components/verbs/component-bom.js +125 -0
  240. package/dist/components/verbs/ensure-secret.js +50 -0
  241. package/dist/components/verbs/index.js +61 -0
  242. package/dist/components/verbs/license-policy.js +75 -0
  243. package/dist/components/verbs/lockfile-sbom-generator.js +191 -0
  244. package/dist/components/verbs/process-runner.js +78 -0
  245. package/dist/components/verbs/r2-sync.js +93 -0
  246. package/dist/components/verbs/reproducibility.js +62 -0
  247. package/dist/components/verbs/run-agent.js +577 -0
  248. package/dist/components/verbs/sbom-generator.js +119 -0
  249. package/dist/components/verbs/sbom.js +97 -0
  250. package/dist/components/verbs/shell.js +32 -0
  251. package/dist/components/verbs/sign.js +221 -0
  252. package/dist/components/verbs/stub.js +28 -0
  253. package/dist/components/verbs/tool-sbom-generator.js +154 -0
  254. package/dist/components/verbs/verify.js +112 -0
  255. package/dist/components/verbs/vex.js +131 -0
  256. package/dist/components/verbs/vuln-gate.js +152 -0
  257. package/dist/components/verbs/vuln-scan.js +288 -0
  258. package/dist/components/verbs/wait-verify.js +106 -0
  259. package/dist/components/verbs/wrangler.js +179 -0
  260. package/dist/components/wave-plan.js +102 -0
  261. package/dist/composite.js +305 -0
  262. package/dist/config-import.d.ts.map +1 -1
  263. package/dist/config-import.js +22 -0
  264. package/dist/config-sandbox.js +122 -0
  265. package/dist/config-static.js +206 -0
  266. package/dist/config.js +605 -0
  267. package/dist/content-digest.js +23 -0
  268. package/dist/declarable.js +114 -0
  269. package/dist/deep-observation.js +437 -0
  270. package/dist/detectLexicon.js +54 -0
  271. package/dist/discovery/cache.js +70 -0
  272. package/dist/discovery/collect.js +208 -0
  273. package/dist/discovery/cycles.js +95 -0
  274. package/dist/discovery/entity-wire-codec.js +391 -0
  275. package/dist/discovery/entity-wire.js +42 -0
  276. package/dist/discovery/files.js +121 -0
  277. package/dist/discovery/fold-import.d.ts.map +1 -1
  278. package/dist/discovery/fold-import.js +4178 -0
  279. package/dist/discovery/fold-rank.js +292 -0
  280. package/dist/discovery/graph.js +115 -0
  281. package/dist/discovery/import.d.ts.map +1 -1
  282. package/dist/discovery/import.js +65 -0
  283. package/dist/discovery/index.js +333 -0
  284. package/dist/discovery/param-deps.js +487 -0
  285. package/dist/discovery/resolve.js +39 -0
  286. package/dist/discovery/sandbox/bundle.js +214 -0
  287. package/dist/discovery/sandbox/child-errors.js +26 -0
  288. package/dist/discovery/sandbox/config-run.js +100 -0
  289. package/dist/discovery/sandbox/config-wire.js +183 -0
  290. package/dist/discovery/sandbox/driver.d.ts.map +1 -1
  291. package/dist/discovery/sandbox/driver.js +333 -0
  292. package/dist/discovery/sandbox/fork.js +229 -0
  293. package/dist/discovery/sandbox/policy-run.js +142 -0
  294. package/dist/discovery/sandbox/policy-wire.js +152 -0
  295. package/dist/discovery/sandbox/run.js +77 -0
  296. package/dist/discovery/specifier-resolve.js +320 -0
  297. package/dist/discovery/walk.js +284 -0
  298. package/dist/effect-receipt.js +340 -0
  299. package/dist/env.js +55 -0
  300. package/dist/errors.js +62 -0
  301. package/dist/fold/fold.js +1434 -0
  302. package/dist/fold/foldable-helpers.js +229 -0
  303. package/dist/fold/subset.js +696 -0
  304. package/dist/fold-provenance.js +414 -0
  305. package/dist/gate-decision.d.ts +36 -4
  306. package/dist/gate-decision.d.ts.map +1 -1
  307. package/dist/gate-decision.js +260 -0
  308. package/dist/gate-resume-run.js +154 -0
  309. package/dist/gated-waves.js +165 -0
  310. package/dist/governance.js +43 -0
  311. package/dist/graph-declared.js +45 -0
  312. package/dist/graph-detail.js +207 -0
  313. package/dist/graph-dot.js +54 -0
  314. package/dist/graph-effective.js +107 -0
  315. package/dist/graph-ir.js +623 -0
  316. package/dist/graph-layout.js +184 -0
  317. package/dist/graph-lens.js +105 -0
  318. package/dist/graph-mermaid.js +83 -0
  319. package/dist/graph-ops.js +39 -0
  320. package/dist/graph-refs.js +156 -0
  321. package/dist/held-elsewhere.js +87 -0
  322. package/dist/identity.js +251 -0
  323. package/dist/import/base-parser.js +34 -0
  324. package/dist/import/embedded.js +255 -0
  325. package/dist/import/generator.js +1 -0
  326. package/dist/import/ir-utils.js +85 -0
  327. package/dist/import/parser-options.js +45 -0
  328. package/dist/import/parser.js +1 -0
  329. package/dist/index.js +118 -0
  330. package/dist/intrinsic-interpolation.js +73 -0
  331. package/dist/intrinsic.js +31 -0
  332. package/dist/join-key.js +35 -0
  333. package/dist/kubectl-context.js +150 -0
  334. package/dist/lexicon-config.js +58 -0
  335. package/dist/lexicon-integrity.js +47 -0
  336. package/dist/lexicon-manifest.js +70 -0
  337. package/dist/lexicon-module.d.ts.map +1 -1
  338. package/dist/lexicon-module.js +241 -0
  339. package/dist/lexicon-output.js +218 -0
  340. package/dist/lexicon-plugin-helpers.js +104 -0
  341. package/dist/lexicon-schema.js +136 -0
  342. package/dist/lexicon.js +130 -0
  343. package/dist/lifecycle/affected.js +224 -0
  344. package/dist/lifecycle/assert-live.js +110 -0
  345. package/dist/lifecycle/build-ledger-store.js +160 -0
  346. package/dist/lifecycle/build-ledger.js +155 -0
  347. package/dist/lifecycle/change-set.js +356 -0
  348. package/dist/lifecycle/converge-ledger.js +161 -0
  349. package/dist/lifecycle/deep-diff.js +233 -0
  350. package/dist/lifecycle/deep-observe.js +147 -0
  351. package/dist/lifecycle/digest.js +143 -0
  352. package/dist/lifecycle/disruption.js +135 -0
  353. package/dist/lifecycle/gate-applied.js +113 -0
  354. package/dist/lifecycle/gate-audit.js +341 -0
  355. package/dist/lifecycle/gate-ledger-select.js +89 -0
  356. package/dist/lifecycle/gate-ledger.d.ts +8 -0
  357. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  358. package/dist/lifecycle/gate-ledger.js +193 -0
  359. package/dist/lifecycle/gate-origin.js +117 -0
  360. package/dist/lifecycle/gate-pending.js +58 -0
  361. package/dist/lifecycle/git.js +1182 -0
  362. package/dist/lifecycle/identity.js +58 -0
  363. package/dist/lifecycle/index.js +26 -0
  364. package/dist/lifecycle/lease.js +283 -0
  365. package/dist/lifecycle/ledger-port.js +1 -0
  366. package/dist/lifecycle/legacy-digest.js +91 -0
  367. package/dist/lifecycle/live-diff.js +274 -0
  368. package/dist/lifecycle/local-note.js +15 -0
  369. package/dist/lifecycle/member-ledger.js +122 -0
  370. package/dist/lifecycle/observation-baseline.js +155 -0
  371. package/dist/lifecycle/observe.js +375 -0
  372. package/dist/lifecycle/oras-referrer-lookup.js +82 -0
  373. package/dist/lifecycle/override-ledger.js +54 -0
  374. package/dist/lifecycle/plan-digest.js +110 -0
  375. package/dist/lifecycle/plan-ledger.js +129 -0
  376. package/dist/lifecycle/receipt-plan.js +192 -0
  377. package/dist/lifecycle/release-ledger.js +155 -0
  378. package/dist/lifecycle/release-read.js +64 -0
  379. package/dist/lifecycle/replay.js +193 -0
  380. package/dist/lifecycle/rollback.js +102 -0
  381. package/dist/lifecycle/run-ledger.js +183 -0
  382. package/dist/lifecycle/scenario-eval.js +204 -0
  383. package/dist/lifecycle/scenario.js +214 -0
  384. package/dist/lifecycle/snapshot.js +239 -0
  385. package/dist/lifecycle/status.js +447 -0
  386. package/dist/lifecycle/symptoms.js +117 -0
  387. package/dist/lifecycle/teardown.js +255 -0
  388. package/dist/lifecycle/types.js +1 -0
  389. package/dist/lifecycle/unobserved-gate.js +33 -0
  390. package/dist/lifecycle/wave-plans.js +68 -0
  391. package/dist/lifecycle/work-item-id.js +36 -0
  392. package/dist/lifecycle/work-lease.js +393 -0
  393. package/dist/lint/component-checks.js +87 -0
  394. package/dist/lint/config.js +483 -0
  395. package/dist/lint/declarative.js +122 -0
  396. package/dist/lint/discover.d.ts.map +1 -1
  397. package/dist/lint/discover.js +138 -0
  398. package/dist/lint/engine.js +246 -0
  399. package/dist/lint/knowledge-checks.js +64 -0
  400. package/dist/lint/named-checks.js +22 -0
  401. package/dist/lint/output-checks.js +87 -0
  402. package/dist/lint/output-docs.js +163 -0
  403. package/dist/lint/parser.js +33 -0
  404. package/dist/lint/pipeline-change-gate.js +70 -0
  405. package/dist/lint/policy-import.d.ts +1 -1
  406. package/dist/lint/policy-import.d.ts.map +1 -1
  407. package/dist/lint/policy-import.js +62 -0
  408. package/dist/lint/policy-sandbox.js +86 -0
  409. package/dist/lint/policy.js +122 -0
  410. package/dist/lint/post-synth.js +87 -0
  411. package/dist/lint/presets/relaxed.json +26 -0
  412. package/dist/lint/presets/strict.json +24 -24
  413. package/dist/lint/receipt-checks.js +83 -0
  414. package/dist/lint/rule-loader.d.ts.map +1 -1
  415. package/dist/lint/rule-loader.js +89 -0
  416. package/dist/lint/rule-registry.js +86 -0
  417. package/dist/lint/rule.js +1 -0
  418. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
  419. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
  420. package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
  421. package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
  422. package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
  423. package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
  424. package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
  425. package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
  426. package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
  427. package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
  428. package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
  429. package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
  430. package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
  431. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
  432. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
  433. package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
  434. package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
  435. package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
  436. package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
  437. package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
  438. package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
  439. package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
  440. package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
  441. package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
  442. package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
  443. package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
  444. package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
  445. package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
  446. package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
  447. package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
  448. package/dist/lint/rules/comp/index.js +33 -0
  449. package/dist/lint/rules/comp/support.js +129 -0
  450. package/dist/lint/rules/composite-scope.js +51 -0
  451. package/dist/lint/rules/cor017-composite-name-match.js +93 -0
  452. package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
  453. package/dist/lint/rules/cor021-env-literal-name.js +100 -0
  454. package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
  455. package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
  456. package/dist/lint/rules/declarable-naming-convention.js +62 -0
  457. package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
  458. package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
  459. package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
  460. package/dist/lint/rules/evl004-spread-non-const.js +94 -0
  461. package/dist/lint/rules/evl005-resource-block-body.js +41 -0
  462. package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
  463. package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
  464. package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
  465. package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
  466. package/dist/lint/rules/export-required.js +115 -0
  467. package/dist/lint/rules/file-declarable-limit.js +88 -0
  468. package/dist/lint/rules/flat-declarations.js +62 -0
  469. package/dist/lint/rules/index.js +90 -0
  470. package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
  471. package/dist/lint/rules/no-redundant-type-import.js +76 -0
  472. package/dist/lint/rules/no-redundant-value-cast.js +41 -0
  473. package/dist/lint/rules/no-string-ref.js +59 -0
  474. package/dist/lint/rules/no-unused-declarable-import.js +75 -0
  475. package/dist/lint/rules/no-unused-declarable.js +142 -0
  476. package/dist/lint/rules/op/index.js +28 -0
  477. package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
  478. package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
  479. package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
  480. package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
  481. package/dist/lint/rules/op/support.js +11 -0
  482. package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
  483. package/dist/lint/rules/property-kind.js +56 -0
  484. package/dist/lint/rules/single-concern-file.js +71 -0
  485. package/dist/lint/rules/sys001-no-literal-key.js +60 -0
  486. package/dist/lint/selectors.js +168 -0
  487. package/dist/lint/suppressions.js +129 -0
  488. package/dist/lint/typescript.js +17 -0
  489. package/dist/live-endpoint.js +113 -0
  490. package/dist/live-read-session.js +76 -0
  491. package/dist/lsp/lexicon-providers.js +163 -0
  492. package/dist/lsp/types.js +5 -0
  493. package/dist/managed-fields.js +293 -0
  494. package/dist/mcp/types.js +4 -0
  495. package/dist/notify-verify.js +0 -1
  496. package/dist/notify.js +0 -1
  497. package/dist/notify.schema.json +72 -0
  498. package/dist/observation.js +266 -0
  499. package/dist/okf-read.js +134 -0
  500. package/dist/okf.js +275 -0
  501. package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
  502. package/dist/op/activities/activity-contracts.js +313 -0
  503. package/dist/op/activities/apply.js +582 -0
  504. package/dist/op/activities/build.js +18 -0
  505. package/dist/op/activities/change-coverage.js +40 -0
  506. package/dist/op/activities/change-set.js +64 -0
  507. package/dist/op/activities/converge.js +492 -0
  508. package/dist/op/activities/decide.js +211 -0
  509. package/dist/op/activities/env-teardown.js +110 -0
  510. package/dist/op/activities/factory.js +591 -0
  511. package/dist/op/activities/forge-pull-request.js +82 -0
  512. package/dist/op/activities/gh-host.js +78 -0
  513. package/dist/op/activities/guard-validate.js +165 -0
  514. package/dist/op/activities/http-check.js +40 -0
  515. package/dist/op/activities/index.js +59 -0
  516. package/dist/op/activities/lexicon-upgrade.js +629 -0
  517. package/dist/op/activities/lifecycle.js +109 -0
  518. package/dist/op/activities/pipeline-audit.js +147 -0
  519. package/dist/op/activities/policy.js +26 -0
  520. package/dist/op/activities/predict-behaviour.js +341 -0
  521. package/dist/op/activities/propose-upgrade.js +165 -0
  522. package/dist/op/activities/reconcile.js +997 -0
  523. package/dist/op/activities/shell.js +118 -0
  524. package/dist/op/activities/source-release.js +97 -0
  525. package/dist/op/activities/source-rollback.js +165 -0
  526. package/dist/op/activities/teardown.js +17 -0
  527. package/dist/op/activities/util.js +6 -0
  528. package/dist/op/activities/wait.js +51 -0
  529. package/dist/op/activities/work-evidence.js +35 -0
  530. package/dist/op/activities/workflow-audit.js +133 -0
  531. package/dist/op/activity-contract-registry.js +106 -0
  532. package/dist/op/activity-contract.js +232 -0
  533. package/dist/op/activity-failure.js +31 -0
  534. package/dist/op/activity-profiles.js +129 -0
  535. package/dist/op/activity-registry.js +105 -0
  536. package/dist/op/activity-runtime.js +28 -0
  537. package/dist/op/builders.js +801 -0
  538. package/dist/op/change-signal.js +118 -0
  539. package/dist/op/composites/apply-op.js +151 -0
  540. package/dist/op/composites/behaviour-op.js +65 -0
  541. package/dist/op/composites/converge-op.js +141 -0
  542. package/dist/op/composites/index.js +19 -0
  543. package/dist/op/composites/lexicon-upgrade-op.js +107 -0
  544. package/dist/op/composites/pipeline-audit-op.js +50 -0
  545. package/dist/op/composites/reconcile-op.js +84 -0
  546. package/dist/op/composites/watch-op.js +69 -0
  547. package/dist/op/composites/workflow-audit-op.js +57 -0
  548. package/dist/op/converge-rule.js +205 -0
  549. package/dist/op/cron.js +146 -0
  550. package/dist/op/decide-backend.js +181 -0
  551. package/dist/op/decide-config.js +68 -0
  552. package/dist/op/decide-read-inputs.js +141 -0
  553. package/dist/op/discover.d.ts.map +1 -1
  554. package/dist/op/discover.js +213 -0
  555. package/dist/op/duration.js +21 -0
  556. package/dist/op/emulator-freshness.js +80 -0
  557. package/dist/op/emulator-lifecycle.js +269 -0
  558. package/dist/op/factory.js +83 -0
  559. package/dist/op/gate-approval.js +172 -0
  560. package/dist/op/gate-name.js +86 -0
  561. package/dist/op/gate-plan-context.js +167 -0
  562. package/dist/op/gate-point-run.js +67 -0
  563. package/dist/op/gate-point.js +111 -0
  564. package/dist/op/gate-resume-plan.js +155 -0
  565. package/dist/op/gate-resume.js +31 -0
  566. package/dist/op/gate-review.js +290 -0
  567. package/dist/op/gate-run-locator.js +85 -0
  568. package/dist/op/gate-summary.js +100 -0
  569. package/dist/op/gate-wait.js +56 -0
  570. package/dist/op/gate.js +449 -0
  571. package/dist/op/generate-pipeline.js +124 -0
  572. package/dist/op/index.js +51 -0
  573. package/dist/op/lifecycle-receipt-store.js +45 -0
  574. package/dist/op/local-executor.js +1164 -0
  575. package/dist/op/local-output.js +140 -0
  576. package/dist/op/op-ir.js +317 -0
  577. package/dist/op/op-verb-class.js +131 -0
  578. package/dist/op/op-waves-notify.js +136 -0
  579. package/dist/op/op-waves-run.d.ts +1 -1
  580. package/dist/op/op-waves-run.d.ts.map +1 -1
  581. package/dist/op/op-waves-run.js +1657 -0
  582. package/dist/op/op-waves.js +409 -0
  583. package/dist/op/operator.js +743 -0
  584. package/dist/op/receipt-store.js +94 -0
  585. package/dist/op/resource.js +23 -0
  586. package/dist/op/run-context.js +28 -0
  587. package/dist/op/run-live.js +256 -0
  588. package/dist/op/runtime.js +21 -0
  589. package/dist/op/runtimes/local.js +195 -0
  590. package/dist/op/source-archive.js +131 -0
  591. package/dist/op/step-output-ref.js +397 -0
  592. package/dist/op/steward-beside.js +169 -0
  593. package/dist/op/steward-points.js +138 -0
  594. package/dist/op/steward-turn.js +59 -0
  595. package/dist/op/steward.js +317 -0
  596. package/dist/op/types.js +25 -0
  597. package/dist/op/work-lease-decl.js +81 -0
  598. package/dist/op/work-lease-run.js +393 -0
  599. package/dist/override-gate.js +284 -0
  600. package/dist/owner-chain.js +74 -0
  601. package/dist/ownership.js +92 -0
  602. package/dist/params.js +61 -0
  603. package/dist/plan-summary.js +711 -0
  604. package/dist/point-decision.js +211 -0
  605. package/dist/pr-forge.js +810 -0
  606. package/dist/pr-loop.js +203 -0
  607. package/dist/project-codegen.js +191 -0
  608. package/dist/project-root.js +74 -0
  609. package/dist/project-validation.js +50 -0
  610. package/dist/provenance.js +157 -0
  611. package/dist/pseudo-parameter.js +40 -0
  612. package/dist/reconcile.js +450 -0
  613. package/dist/resource-attributes.js +33 -0
  614. package/dist/runtime-adapter.js +77 -0
  615. package/dist/runtime.js +66 -0
  616. package/dist/secret-materialization.js +153 -0
  617. package/dist/secret-provenance.js +250 -0
  618. package/dist/serializer-walker.js +112 -0
  619. package/dist/serializer.js +1 -0
  620. package/dist/sort.js +45 -0
  621. package/dist/stack-output.js +115 -0
  622. package/dist/telemetry-attribution.js +149 -0
  623. package/dist/terraform/__fixtures__/build-graph.js +63 -0
  624. package/dist/terraform/adopt-state.js +40 -0
  625. package/dist/terraform/aws-resources.js +384 -0
  626. package/dist/terraform/bridge.js +204 -0
  627. package/dist/terraform/carve-provider.js +155 -0
  628. package/dist/terraform/carve.js +138 -0
  629. package/dist/terraform/data-source-shape.js +57 -0
  630. package/dist/terraform/emit-source.js +36 -0
  631. package/dist/terraform/excise.js +123 -0
  632. package/dist/terraform/graduate.js +128 -0
  633. package/dist/terraform/graph.js +435 -0
  634. package/dist/terraform/hcl2json.js +60 -0
  635. package/dist/terraform/manifest.js +149 -0
  636. package/dist/terraform/parse.js +81 -0
  637. package/dist/terraform/providers/aws.js +146 -0
  638. package/dist/terraform/providers/gcp.js +294 -0
  639. package/dist/terraform/providers/index.js +17 -0
  640. package/dist/terraform/providers/kubernetes.js +253 -0
  641. package/dist/terraform/score.js +151 -0
  642. package/dist/terraform/state.js +67 -0
  643. package/dist/terraform/tier-map.js +74 -0
  644. package/dist/terraform/types.js +13 -0
  645. package/dist/terraform/unified-diff.js +132 -0
  646. package/dist/testing.js +295 -0
  647. package/dist/toml-emit.js +153 -0
  648. package/dist/toml-parse.js +355 -0
  649. package/dist/toml-utils.js +60 -0
  650. package/dist/toml.js +428 -0
  651. package/dist/ts-loader.d.ts +46 -0
  652. package/dist/ts-loader.d.ts.map +1 -0
  653. package/dist/ts-loader.js +103 -0
  654. package/dist/types.js +1 -0
  655. package/dist/utils.js +61 -0
  656. package/dist/validation.js +20 -0
  657. package/dist/vendor/js-yaml-load.js +1662 -0
  658. package/dist/workspace/__fixtures__/contract-repo.js +103 -0
  659. package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
  660. package/dist/workspace/__fixtures__/sessions.js +91 -0
  661. package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
  662. package/dist/workspace/agent-cli.js +99 -0
  663. package/dist/workspace/agent.schema.json +390 -0
  664. package/dist/workspace/answers-ledger.js +89 -0
  665. package/dist/workspace/box-cli.js +142 -0
  666. package/dist/workspace/box-factory-write.js +196 -0
  667. package/dist/workspace/box-factory-write.schema.json +342 -0
  668. package/dist/workspace/box-factory.js +88 -0
  669. package/dist/workspace/box-intent.js +126 -0
  670. package/dist/workspace/box-isolation.js +169 -0
  671. package/dist/workspace/box-listing-write.schema.json +204 -0
  672. package/dist/workspace/box-listing.js +298 -0
  673. package/dist/workspace/box-publish.js +352 -0
  674. package/dist/workspace/box-publish.schema.json +498 -0
  675. package/dist/workspace/box-services.js +39 -0
  676. package/dist/workspace/broker-protocol.js +359 -0
  677. package/dist/workspace/broker-protocol.schema.json +228 -0
  678. package/dist/workspace/change-set.schema.json +460 -0
  679. package/dist/workspace/changes-cli.js +56 -0
  680. package/dist/workspace/changes.js +446 -0
  681. package/dist/workspace/changes.schema.json +642 -0
  682. package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
  683. package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
  684. package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
  685. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
  686. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
  687. package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
  688. package/dist/workspace/chant-migrations.js +113 -0
  689. package/dist/workspace/check.schema.json +433 -0
  690. package/dist/workspace/checks/box-isolation.js +62 -0
  691. package/dist/workspace/checks/boxes.js +491 -0
  692. package/dist/workspace/checks/diagrams.js +104 -0
  693. package/dist/workspace/checks/generated.js +419 -0
  694. package/dist/workspace/checks/ledgers.js +212 -0
  695. package/dist/workspace/checks/links.js +191 -0
  696. package/dist/workspace/checks/live.js +100 -0
  697. package/dist/workspace/checks/pipelines.js +188 -0
  698. package/dist/workspace/checks/records.js +169 -0
  699. package/dist/workspace/checks.js +426 -0
  700. package/dist/workspace/ci-green-cli.js +125 -0
  701. package/dist/workspace/ci-green-forge.js +83 -0
  702. package/dist/workspace/ci-green-workflow.js +199 -0
  703. package/dist/workspace/ci-green.js +325 -0
  704. package/dist/workspace/ci-last-green.schema.json +158 -0
  705. package/dist/workspace/compose-graph.js +235 -0
  706. package/dist/workspace/compose-reports.js +146 -0
  707. package/dist/workspace/composites.js +264 -0
  708. package/dist/workspace/composites.schema.json +617 -0
  709. package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
  710. package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
  711. package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
  712. package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
  713. package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
  714. package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
  715. package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
  716. package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
  717. package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
  718. package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
  719. package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
  720. package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
  721. package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
  722. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
  723. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
  724. package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
  725. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
  726. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
  727. package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
  728. package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
  729. package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
  730. package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
  731. package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
  732. package/dist/workspace/conformance/broker.js +736 -0
  733. package/dist/workspace/conformance/index.js +673 -0
  734. package/dist/workspace/conformance/vitest.js +108 -0
  735. package/dist/workspace/conformance/writer.js +1080 -0
  736. package/dist/workspace/decide.js +879 -0
  737. package/dist/workspace/decision-points.schema.json +135 -135
  738. package/dist/workspace/declaration-write-cli.js +74 -0
  739. package/dist/workspace/declaration-write.js +238 -0
  740. package/dist/workspace/declaration.js +938 -0
  741. package/dist/workspace/declaration.schema.json +1413 -1413
  742. package/dist/workspace/declared-kinds.js +106 -0
  743. package/dist/workspace/environments.js +164 -0
  744. package/dist/workspace/evidence.schema.json +279 -0
  745. package/dist/workspace/export-cli.js +185 -0
  746. package/dist/workspace/export.js +499 -0
  747. package/dist/workspace/factory-rules.js +175 -0
  748. package/dist/workspace/generated-files.js +92 -0
  749. package/dist/workspace/glob.js +45 -0
  750. package/dist/workspace/graph-cache.js +352 -0
  751. package/dist/workspace/graph-cli.js +348 -0
  752. package/dist/workspace/graph.schema.json +1338 -0
  753. package/dist/workspace/identity-gate-rule.d.ts +65 -0
  754. package/dist/workspace/identity-gate-rule.d.ts.map +1 -0
  755. package/dist/workspace/identity-gate-rule.js +75 -0
  756. package/dist/workspace/identity.d.ts +4 -2
  757. package/dist/workspace/identity.d.ts.map +1 -1
  758. package/dist/workspace/identity.js +126 -0
  759. package/dist/workspace/import.js +283 -0
  760. package/dist/workspace/init.js +620 -0
  761. package/dist/workspace/intent-cli.js +263 -0
  762. package/dist/workspace/intent-joins.js +201 -0
  763. package/dist/workspace/intent-record.js +352 -0
  764. package/dist/workspace/intent-record.schema.json +864 -0
  765. package/dist/workspace/intent.js +1582 -0
  766. package/dist/workspace/intent.schema.json +2420 -0
  767. package/dist/workspace/json-edit.js +221 -0
  768. package/dist/workspace/jsonc.js +235 -0
  769. package/dist/workspace/kind-readers.js +103 -0
  770. package/dist/workspace/kinds.js +587 -0
  771. package/dist/workspace/lexicon-symbols.js +112 -0
  772. package/dist/workspace/lineage-adopt-cli.js +102 -0
  773. package/dist/workspace/lineage-adopt.js +360 -0
  774. package/dist/workspace/lineage-check.js +282 -0
  775. package/dist/workspace/lineage-cli.js +121 -0
  776. package/dist/workspace/lineage-hash-index.js +284 -0
  777. package/dist/workspace/lineage-init.js +507 -0
  778. package/dist/workspace/lineage-lock.js +387 -0
  779. package/dist/workspace/lineage-merge.js +45 -0
  780. package/dist/workspace/lineage-migrations.d.ts.map +1 -1
  781. package/dist/workspace/lineage-migrations.js +329 -0
  782. package/dist/workspace/lineage-provenance.js +36 -0
  783. package/dist/workspace/lineage-update.js +138 -0
  784. package/dist/workspace/lineage-upgrade-cli.js +131 -0
  785. package/dist/workspace/lineage-upgrade.js +889 -0
  786. package/dist/workspace/lineage-vendor.js +171 -0
  787. package/dist/workspace/lineage-version.js +128 -0
  788. package/dist/workspace/lineage-versions.js +275 -0
  789. package/dist/workspace/links.js +330 -0
  790. package/dist/workspace/ls-generated.js +95 -0
  791. package/dist/workspace/ls.js +277 -0
  792. package/dist/workspace/ls.schema.json +333 -0
  793. package/dist/workspace/member-commands.js +508 -0
  794. package/dist/workspace/member-handles.js +216 -0
  795. package/dist/workspace/member-pipeline.js +258 -0
  796. package/dist/workspace/member-run.js +117 -0
  797. package/dist/workspace/member-write.schema.json +193 -0
  798. package/dist/workspace/nested-graph.js +156 -0
  799. package/dist/workspace/nesting.js +38 -0
  800. package/dist/workspace/patch.js +301 -0
  801. package/dist/workspace/patch.schema.json +321 -0
  802. package/dist/workspace/pin-cli.js +55 -0
  803. package/dist/workspace/pin-integrity.js +100 -0
  804. package/dist/workspace/plan-summary.schema.json +155 -0
  805. package/dist/workspace/point-answer.schema.json +129 -129
  806. package/dist/workspace/points-cli.js +291 -0
  807. package/dist/workspace/points-write.schema.json +660 -0
  808. package/dist/workspace/points.js +521 -0
  809. package/dist/workspace/points.schema.json +916 -0
  810. package/dist/workspace/pr-report.schema.json +108 -0
  811. package/dist/workspace/principal-classes.d.ts +3 -14
  812. package/dist/workspace/principal-classes.d.ts.map +1 -1
  813. package/dist/workspace/principal-classes.js +245 -0
  814. package/dist/workspace/reason-codes.js +326 -0
  815. package/dist/workspace/record-assets.js +151 -0
  816. package/dist/workspace/record-decided.js +105 -0
  817. package/dist/workspace/record-sessions.js +96 -0
  818. package/dist/workspace/record-source.js +114 -0
  819. package/dist/workspace/records-amend.schema.json +284 -0
  820. package/dist/workspace/records-checkout.js +76 -0
  821. package/dist/workspace/records-cli.js +707 -0
  822. package/dist/workspace/records-close.js +116 -0
  823. package/dist/workspace/records-close.schema.json +278 -0
  824. package/dist/workspace/records-new.schema.json +202 -0
  825. package/dist/workspace/records-review.schema.json +367 -0
  826. package/dist/workspace/records-since.js +317 -0
  827. package/dist/workspace/records-since.schema.json +218 -0
  828. package/dist/workspace/records-write.js +1229 -0
  829. package/dist/workspace/records.js +1345 -0
  830. package/dist/workspace/records.schema.json +604 -0
  831. package/dist/workspace/reference-kinds/app/package.json +10 -0
  832. package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
  833. package/dist/workspace/returns.js +303 -0
  834. package/dist/workspace/root-refusal.js +75 -0
  835. package/dist/workspace/run-statement.schema.json +622 -0
  836. package/dist/workspace/runs-cli.js +584 -0
  837. package/dist/workspace/runs-write.schema.json +994 -0
  838. package/dist/workspace/runs.js +708 -0
  839. package/dist/workspace/runs.schema.json +1257 -0
  840. package/dist/workspace/runtimes.js +76 -0
  841. package/dist/workspace/session-kinds.js +83 -0
  842. package/dist/workspace/signers.schema.json +206 -0
  843. package/dist/workspace/source-block.js +125 -0
  844. package/dist/workspace/squash.js +177 -0
  845. package/dist/workspace/status-gates.js +162 -0
  846. package/dist/workspace/status-stewards.js +330 -0
  847. package/dist/workspace/status.js +514 -0
  848. package/dist/workspace/status.schema.json +998 -0
  849. package/dist/workspace/steward-index.js +191 -0
  850. package/dist/workspace/symbols.js +188 -0
  851. package/dist/workspace/template-manifest.js +227 -0
  852. package/dist/workspace/template-pins.js +115 -0
  853. package/dist/workspace/trailer-joins.js +65 -0
  854. package/dist/workspace/trailers.js +111 -0
  855. package/dist/workspace/tree.js +136 -0
  856. package/dist/workspace/trust/attestor.js +63 -0
  857. package/dist/workspace/trust/dsse.js +108 -0
  858. package/dist/workspace/trust/evidence-cli.js +175 -0
  859. package/dist/workspace/trust/evidence.js +161 -0
  860. package/dist/workspace/trust/gate-seal.js +226 -0
  861. package/dist/workspace/trust/policy.js +190 -0
  862. package/dist/workspace/trust/provenance.js +180 -0
  863. package/dist/workspace/trust/rotation.js +298 -0
  864. package/dist/workspace/trust/run-commits.js +101 -0
  865. package/dist/workspace/trust/run-statement.js +182 -0
  866. package/dist/workspace/trust/seal.js +272 -0
  867. package/dist/workspace/trust/signers-cli.js +152 -0
  868. package/dist/workspace/trust/ssh-commit.js +178 -0
  869. package/dist/workspace/trust/test-repo.js +118 -0
  870. package/dist/workspace/trust/trust-files.js +193 -0
  871. package/dist/workspace/trust/verify-cli.js +63 -0
  872. package/dist/workspace/trust/verify.js +192 -0
  873. package/dist/workspace/which-chant.js +141 -0
  874. package/dist/workspace/wip-cli.js +95 -0
  875. package/dist/workspace/wip-write.schema.json +504 -0
  876. package/dist/workspace/wip.js +631 -0
  877. package/dist/workspace/wip.schema.json +334 -0
  878. package/dist/workspace/work-cli.js +448 -0
  879. package/dist/workspace/work-evidence.js +122 -0
  880. package/dist/workspace/work-evidence.schema.json +222 -0
  881. package/dist/workspace/work-history.schema.json +421 -0
  882. package/dist/workspace/work-lease.schema.json +246 -0
  883. package/dist/workspace/work-size.js +77 -0
  884. package/dist/workspace/work.js +283 -0
  885. package/dist/workspace/workspace-kinds.schema.json +259 -259
  886. package/dist/workspace/workspace-principals.schema.json +53 -53
  887. package/dist/workspace/write-lock-cli.js +105 -0
  888. package/dist/workspace/write-lock.js +424 -0
  889. package/dist/workspace/write-lock.schema.json +172 -0
  890. package/dist/workspace/write-scope.js +484 -0
  891. package/dist/yaml.js +459 -0
  892. package/package.json +2 -2
  893. package/src/cli/commands/check-lexicon-plugin.ts +2 -0
  894. package/src/cli/commands/lint.ts +36 -6
  895. package/src/cli/commands/migrate.ts +2 -0
  896. package/src/cli/compiled-cli.e2e.test.ts +165 -0
  897. package/src/cli/main.ts +121 -27
  898. package/src/cli/mcp/workspace-tools.ts +1 -1
  899. package/src/codegen/pinned-upgrade.ts +2 -0
  900. package/src/components/discover.ts +2 -0
  901. package/src/components/sandbox/driver.ts +3 -1
  902. package/src/config-import.ts +3 -0
  903. package/src/discovery/fold-import.ts +23 -14
  904. package/src/discovery/import.ts +2 -0
  905. package/src/discovery/sandbox/driver.ts +3 -1
  906. package/src/gate-decision-bundle.test.ts +3 -2
  907. package/src/gate-decision-identity.test.ts +176 -0
  908. package/src/gate-decision.ts +100 -22
  909. package/src/lexicon-module.ts +3 -0
  910. package/src/lifecycle/gate-ledger.ts +8 -0
  911. package/src/lint/config.ts +1 -1
  912. package/src/lint/discover.ts +28 -8
  913. package/src/lint/policy-import.ts +4 -1
  914. package/src/lint/rule-loader.ts +2 -0
  915. package/src/op/discover.ts +3 -0
  916. package/src/op/op-waves-point.test.ts +1 -0
  917. package/src/op/op-waves-run.ts +5 -4
  918. package/src/op/op-waves.test.ts +14 -0
  919. package/src/ts-loader.test.ts +23 -0
  920. package/src/ts-loader.ts +122 -0
  921. package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
  922. package/src/workspace/declaration.ts +1 -1
  923. package/src/workspace/identity-gate-rule.ts +109 -0
  924. package/src/workspace/identity.ts +8 -18
  925. package/src/workspace/kinds.ts +1 -1
  926. package/src/workspace/lineage-migrations.ts +2 -0
  927. package/src/workspace/points.ts +1 -1
  928. package/src/workspace/principal-classes.ts +5 -30
@@ -0,0 +1,262 @@
1
+ /**
2
+ * Wrangler config audit (#446) — a config format the audit engine could not
3
+ * parse at all before this: `wrangler.toml`, Cloudflare Workers' native
4
+ * declarative deploy file (routes, bindings, vars, observability). Fitting,
5
+ * since chant's own hosted audit path targets the same Workers runtime.
6
+ *
7
+ * Follows `secrets.ts`'s precedent for a format the issue says should ship
8
+ * "only a detector and a set of checks — no authoring surface, no output
9
+ * serializer": no lexicon plugin, no `AuditInput`/`classifyFiles` involvement,
10
+ * no npm package to install. `auditWranglerConfigs` scans the raw candidate
11
+ * files directly (the detector is `isWranglerConfigPath`) and is called
12
+ * alongside `scanForSecrets` from the CLI. `wrangler.toml` is also NOT the
13
+ * `fly` lexicon's `.fly` (this repo already has a `fly` lexicon covering the
14
+ * Machines/flaps REST API with its own `FLY0xx` ids) — this module owns a
15
+ * disjoint namespace (`WRG0xx`) and `AuditFinding.lexicon = "wrangler"`.
16
+ *
17
+ * Pure: no fs, no network, no Node-only global — Workers-safe (epic #350).
18
+ */
19
+ import { parseTOML, TomlParseError } from "../toml.js";
20
+ /** Detector: does this path look like a Wrangler config? (native TOML only — see module doc.) */
21
+ export function isWranglerConfigPath(path) {
22
+ const base = path.split("/").pop() ?? path;
23
+ return base === "wrangler.toml";
24
+ }
25
+ function isRecord(v) {
26
+ return typeof v === "object" && v !== null && !Array.isArray(v);
27
+ }
28
+ function asArray(v) {
29
+ return Array.isArray(v) ? v : [];
30
+ }
31
+ function scopesOf(doc) {
32
+ const scopes = [{ name: "top-level", isTopLevel: true, config: doc }];
33
+ const env = doc.env;
34
+ if (isRecord(env)) {
35
+ for (const [name, cfg] of Object.entries(env)) {
36
+ if (isRecord(cfg))
37
+ scopes.push({ name, isTopLevel: false, config: cfg });
38
+ }
39
+ }
40
+ return scopes;
41
+ }
42
+ const PROD_NAME_RE = /^(prod|production|live)$/i;
43
+ const NON_PROD_NAME_RE = /^(dev|development|staging|stage|preview|test|testing|sandbox|local)$/i;
44
+ /** Best-effort 1-based line number of the first line containing `needle`, or undefined. */
45
+ function lineOf(content, needle) {
46
+ if (!needle)
47
+ return undefined;
48
+ const idx = content.indexOf(needle);
49
+ if (idx === -1)
50
+ return undefined;
51
+ return content.slice(0, idx).split("\n").length;
52
+ }
53
+ // ── WRG001: workers_dev in a production-named environment ──────────────────
54
+ function checkWorkersDevInProd(file, doc) {
55
+ const out = [];
56
+ for (const scope of scopesOf(doc)) {
57
+ if (!PROD_NAME_RE.test(scope.name))
58
+ continue;
59
+ if (scope.config.workers_dev !== true)
60
+ continue;
61
+ out.push({
62
+ checkId: "WRG001",
63
+ severity: "warning",
64
+ message: `Environment "${scope.name}" sets workers_dev = true — the Worker is reachable on the public *.workers.dev subdomain, bypassing whatever access control a custom domain/zone would provide.`,
65
+ file: file.path,
66
+ lexicon: "wrangler",
67
+ entity: scope.name,
68
+ line: lineOf(file.content, "workers_dev"),
69
+ });
70
+ }
71
+ return out;
72
+ }
73
+ // ── WRG002: sensitive-named key stored in [vars] instead of a secret ───────
74
+ const SENSITIVE_VAR_RE = /(SECRET|TOKEN|API[_-]?KEY|PASSWORD|PASSWD|PRIVATE[_-]?KEY|ACCESS[_-]?KEY|CLIENT[_-]?SECRET|\bAUTH\b)/i;
75
+ function checkSecretShapedVars(file, doc) {
76
+ const out = [];
77
+ for (const scope of scopesOf(doc)) {
78
+ const vars = scope.config.vars;
79
+ if (!isRecord(vars))
80
+ continue;
81
+ for (const key of Object.keys(vars)) {
82
+ if (!SENSITIVE_VAR_RE.test(key))
83
+ continue;
84
+ out.push({
85
+ checkId: "WRG002",
86
+ severity: "error",
87
+ message: `"${key}" in [vars] (${scope.name}) looks like a credential name. Plaintext vars are committed to source and visible via 'wrangler dev'/the dashboard — use 'wrangler secret put ${key}' instead.`,
88
+ file: file.path,
89
+ lexicon: "wrangler",
90
+ entity: key,
91
+ line: lineOf(file.content, key),
92
+ });
93
+ }
94
+ }
95
+ return out;
96
+ }
97
+ // ── WRG003: observability explicitly disabled ───────────────────────────────
98
+ function checkObservabilityDisabled(file, doc) {
99
+ const out = [];
100
+ for (const scope of scopesOf(doc)) {
101
+ const obs = scope.config.observability;
102
+ if (!isRecord(obs))
103
+ continue;
104
+ if (obs.enabled !== false)
105
+ continue;
106
+ out.push({
107
+ checkId: "WRG003",
108
+ severity: "info",
109
+ message: `Environment "${scope.name}" explicitly disables observability (observability.enabled = false) — no Workers Logs are recorded for this deployment, which will slow down or block incident investigation.`,
110
+ file: file.path,
111
+ lexicon: "wrangler",
112
+ entity: scope.name,
113
+ line: lineOf(file.content, "observability"),
114
+ });
115
+ }
116
+ return out;
117
+ }
118
+ // ── WRG004: an account-wide wildcard route (unrestricted ingress) ──────────
119
+ function routePatterns(config) {
120
+ const patterns = [];
121
+ for (const r of asArray(config.routes)) {
122
+ if (typeof r === "string")
123
+ patterns.push(r);
124
+ else if (isRecord(r) && typeof r.pattern === "string")
125
+ patterns.push(r.pattern);
126
+ }
127
+ if (typeof config.route === "string")
128
+ patterns.push(config.route);
129
+ return patterns;
130
+ }
131
+ /** A route pattern with no host scoping at all — matches every zone in the account, not just one. */
132
+ function isAccountWildcard(pattern) {
133
+ const p = pattern.trim();
134
+ return p === "*" || p === "*/*";
135
+ }
136
+ function checkWildcardRoute(file, doc) {
137
+ const out = [];
138
+ for (const scope of scopesOf(doc)) {
139
+ for (const pattern of routePatterns(scope.config)) {
140
+ if (!isAccountWildcard(pattern))
141
+ continue;
142
+ out.push({
143
+ checkId: "WRG004",
144
+ severity: "error",
145
+ message: `Environment "${scope.name}" declares route "${pattern}" — an unscoped wildcard that matches every zone/path on the account, not one domain. Scope it to a specific zone (e.g. "example.com/*").`,
146
+ file: file.path,
147
+ lexicon: "wrangler",
148
+ entity: scope.name,
149
+ line: lineOf(file.content, pattern),
150
+ });
151
+ }
152
+ }
153
+ return out;
154
+ }
155
+ const BINDING_KINDS = [
156
+ { key: "kv_namespaces", idField: "id" },
157
+ { key: "r2_buckets", idField: "bucket_name" },
158
+ { key: "d1_databases", idField: "database_id" },
159
+ ];
160
+ function checkCrossEnvSharedResource(file, doc) {
161
+ const out = [];
162
+ const scopes = scopesOf(doc);
163
+ // The top-level scope is the default deploy target (`wrangler deploy` with
164
+ // no `--env`) — treated as "production" only when the file also declares at
165
+ // least one dev/staging-like env, so a single-environment file (top-level
166
+ // only) never trips this on itself.
167
+ const hasNonProdEnv = scopes.some((s) => !s.isTopLevel && NON_PROD_NAME_RE.test(s.name));
168
+ const prodScopeNames = new Set(scopes.filter((s) => (s.isTopLevel && hasNonProdEnv) || PROD_NAME_RE.test(s.name)).map((s) => s.name));
169
+ const nonProdScopes = scopes.filter((s) => NON_PROD_NAME_RE.test(s.name));
170
+ if (prodScopeNames.size === 0 || nonProdScopes.length === 0)
171
+ return out;
172
+ for (const { key, idField } of BINDING_KINDS) {
173
+ // id -> set of scope names that declare a binding with that id
174
+ const byId = new Map();
175
+ for (const scope of scopes) {
176
+ for (const binding of asArray(scope.config[key])) {
177
+ if (!isRecord(binding))
178
+ continue;
179
+ const id = binding[idField];
180
+ if (typeof id !== "string" || id === "")
181
+ continue;
182
+ const owners = byId.get(id) ?? new Set();
183
+ owners.add(scope.name);
184
+ byId.set(id, owners);
185
+ }
186
+ }
187
+ for (const [id, owners] of byId) {
188
+ const prodOwner = [...owners].find((n) => prodScopeNames.has(n));
189
+ const nonProdOwner = [...owners].find((n) => NON_PROD_NAME_RE.test(n));
190
+ if (!prodOwner || !nonProdOwner)
191
+ continue;
192
+ out.push({
193
+ checkId: "WRG005",
194
+ severity: "error",
195
+ message: `"${nonProdOwner}" and "${prodOwner}" both bind ${key} ${idField}="${id}" — the non-production environment has full read/write access to the production data store instead of its own copy.`,
196
+ file: file.path,
197
+ lexicon: "wrangler",
198
+ entity: `${key}:${id}`,
199
+ line: lineOf(file.content, id),
200
+ });
201
+ }
202
+ }
203
+ return out;
204
+ }
205
+ // ── WRG006: static assets/site served from the project root ────────────────
206
+ const ROOT_DIR_RE = /^\.?\/?$/;
207
+ function checkAssetsServeRoot(file, doc) {
208
+ const out = [];
209
+ for (const scope of scopesOf(doc)) {
210
+ const candidates = [];
211
+ if (isRecord(scope.config.site))
212
+ candidates.push({ table: "site", field: "bucket", value: scope.config.site.bucket });
213
+ if (isRecord(scope.config.assets))
214
+ candidates.push({ table: "assets", field: "directory", value: scope.config.assets.directory });
215
+ for (const c of candidates) {
216
+ if (typeof c.value !== "string" || !ROOT_DIR_RE.test(c.value))
217
+ continue;
218
+ out.push({
219
+ checkId: "WRG006",
220
+ severity: "warning",
221
+ message: `Environment "${scope.name}" sets [${c.table}].${c.field} = "${c.value}" — the project root is served as public static assets, including any files not meant to be public (config, source maps, .git).`,
222
+ file: file.path,
223
+ lexicon: "wrangler",
224
+ entity: scope.name,
225
+ line: lineOf(file.content, c.field),
226
+ });
227
+ }
228
+ }
229
+ return out;
230
+ }
231
+ const CHECKS = [
232
+ checkWorkersDevInProd,
233
+ checkSecretShapedVars,
234
+ checkObservabilityDisabled,
235
+ checkWildcardRoute,
236
+ checkCrossEnvSharedResource,
237
+ checkAssetsServeRoot,
238
+ ];
239
+ /**
240
+ * Audit every `wrangler.toml` in `files`. Pure with respect to the filesystem
241
+ * and network. A file that fails to parse contributes no findings — the audit
242
+ * contract is "runs against any repo," never a crash on odd/partial config.
243
+ */
244
+ export function auditWranglerConfigs(files) {
245
+ const findings = [];
246
+ for (const file of files) {
247
+ if (!isWranglerConfigPath(file.path))
248
+ continue;
249
+ let doc;
250
+ try {
251
+ doc = parseTOML(file.content);
252
+ }
253
+ catch (err) {
254
+ if (err instanceof TomlParseError)
255
+ continue;
256
+ throw err;
257
+ }
258
+ for (const check of CHECKS)
259
+ findings.push(...check(file, doc));
260
+ }
261
+ return findings;
262
+ }
@@ -0,0 +1,401 @@
1
+ /**
2
+ * The predicted delta between two behaviour results, and how it is shown
3
+ * (#2358, contract #2356).
4
+ *
5
+ * `behaviour.ts` ships the invariant and deliberately not the presentation:
6
+ * {@link compareFigures} says on which axes two figures fail to be a delta of
7
+ * like things, and binds every consumer to mark such a pair wherever it is
8
+ * shown. This module is the consumer. It takes the base side and the head
9
+ * side of a pull request as two {@link BehaviourResult}s and produces one
10
+ * finding, under four rules that are the contract's and #2358's rather than
11
+ * this file's:
12
+ *
13
+ * 1. A whole-run refusal on either side is a finding that says **no
14
+ * prediction**, with the refusal's own text and remedy. Never a delta and
15
+ * never a partial one: the five refusal causes are the engine being
16
+ * absent, unreachable, out of credit, over quota, or a credential in the
17
+ * request, and none of them is a statement about the estate.
18
+ * 2. A delta is computed only over entities predicted on **both** sides. An
19
+ * entity declined on either side — `unpredicted`, whatever the reason —
20
+ * is a row in the finding saying so, not an absent row and not a zero. An
21
+ * estate that gained an unmapped kind between the two runs did not gain a
22
+ * cost, and a finding that read it as one would be the faked number the
23
+ * epic forbids.
24
+ * 3. Before any two figures are differenced, {@link compareFigures} runs. A
25
+ * non-empty mismatch set means the pair is **marked** with every label in
26
+ * it, in {@link FIGURE_MISMATCHES}' display order, and no number is
27
+ * subtracted. `modeled` minus `validated` is not a change in the estate.
28
+ * 4. Every figure shown carries its provenance — engine, version, tolerance,
29
+ * basis — and a rate is rendered as a rate: so much per hour, at the
30
+ * stated traffic level, never an amount.
31
+ *
32
+ * Resilience has a fifth rule, from #2360's third comment: a verdict is
33
+ * computed over the graph the engine was handed, and the declared path hands
34
+ * over reference edges with no containment. When either side's
35
+ * `meta.edgeCoverage` is `partial` or `unknown`, the two verdicts were reached
36
+ * over graphs of different completeness, and the finding shows each side's
37
+ * verdict and says why they are not compared rather than drawing an arrow
38
+ * between them.
39
+ *
40
+ * Pure: no I/O, no clock, no environment. The Op activity that posts the
41
+ * result (`./op/activities/predict-behaviour.ts`) is where the sides come
42
+ * from.
43
+ */
44
+ import { FIGURE_MISMATCHES, compareFigures, isBehaviourRefusalReport, isBehaviourResult, isBehaviourUnpredictedReason, renderBehaviourRefusal, validateBehaviourBlock, validateEdgeCoverage, } from "./behaviour.js";
45
+ /* -------------------------------------------------------------------------- */
46
+ /* Validating a result on arrival */
47
+ /* -------------------------------------------------------------------------- */
48
+ /**
49
+ * Hold a {@link BehaviourResult} to the contract, on arrival.
50
+ *
51
+ * `behaviourReport` checks a report as the ordinary route builds it, and its
52
+ * own doc says plainly that this is a check and not a proof: the report type
53
+ * is a plain interface, `isBehaviourResult` accepts a hand-built one, and a
54
+ * lexicon calling the builder with `entityNames: Object.keys(entities)`
55
+ * self-certifies. A consumer that needs the guarantee runs this instead, with
56
+ * the names it asked about, and the two consumers that need it are the delta
57
+ * (each side arrives from a plugin) and a scenario's fixture (the block
58
+ * arrives from JSON on disk).
59
+ *
60
+ * Throws, naming what is wrong. The refusals are the builder's, applied to a
61
+ * result rather than to its parts: an entity in neither map or in both, a
62
+ * figure for a name nobody asked about, a block priced at a level the run did
63
+ * not ask for, an unpredicted reason outside the closed set, an edge-coverage
64
+ * claim that names no gap, and any block failing `validateBehaviourBlock`. A
65
+ * refusal arm is held to having a legal cause and a non-empty reason and
66
+ * remedy, since those two strings are what a consumer prints.
67
+ */
68
+ export function validateBehaviourResult(result, askedFor) {
69
+ if (!isBehaviourResult(result)) {
70
+ throw new Error("behaviour result is neither a report nor a refusal: expected `behaviour: \"v1\"` with either " +
71
+ "`refusal` or both `meta` and `entities`.");
72
+ }
73
+ if (isBehaviourRefusalReport(result)) {
74
+ const r = result.refusal;
75
+ if (!isBehaviourUnpredictedReason(r.cause)) {
76
+ throw new Error(`behaviour refusal carries the cause ${JSON.stringify(r.cause)}, which is not a legal reason.`);
77
+ }
78
+ if (typeof r.reason !== "string" || r.reason.trim() === "") {
79
+ throw new Error("behaviour refusal states no reason — the sentence a consumer prints is missing.");
80
+ }
81
+ if (typeof r.remedy !== "string" || r.remedy.trim() === "") {
82
+ throw new Error("behaviour refusal states no remedy — a refusal exists to be acted on.");
83
+ }
84
+ return result;
85
+ }
86
+ const report = result;
87
+ validateEdgeCoverage(report.meta.edgeCoverage);
88
+ if (typeof report.meta.at?.traffic !== "string" || report.meta.at.traffic.trim() === "") {
89
+ throw new Error("behaviour report states no traffic level in meta.at — a figure without its question is a bill in waiting.");
90
+ }
91
+ const asked = new Set(askedFor);
92
+ const unpredicted = report.unpredicted ?? {};
93
+ const holes = new Set(Object.keys(unpredicted));
94
+ for (const name of Object.keys(report.entities)) {
95
+ if (holes.has(name))
96
+ throw new Error(`behaviour report names "${name}" as both predicted and unpredicted.`);
97
+ if (!asked.has(name)) {
98
+ throw new Error(`behaviour report carries a figure for "${name}", which was not asked about.`);
99
+ }
100
+ validateBehaviourBlock(name, report.entities[name]);
101
+ if (report.entities[name].at.traffic !== report.meta.at.traffic) {
102
+ throw new Error(`behaviour report priced "${name}" at ${JSON.stringify(report.entities[name].at.traffic)} in a run ` +
103
+ `whose meta.at.traffic is ${JSON.stringify(report.meta.at.traffic)}.`);
104
+ }
105
+ }
106
+ for (const name of holes) {
107
+ if (!asked.has(name))
108
+ throw new Error(`behaviour report names "${name}" unpredicted, and it was not asked about.`);
109
+ if (!isBehaviourUnpredictedReason(unpredicted[name]?.reason)) {
110
+ throw new Error(`behaviour report gives "${name}" the reason ${JSON.stringify(unpredicted[name]?.reason)}, which is not a legal one.`);
111
+ }
112
+ }
113
+ const missing = askedFor.filter((name) => !Object.prototype.hasOwnProperty.call(report.entities, name) && !holes.has(name));
114
+ if (missing.length > 0) {
115
+ throw new Error(`behaviour report gives no verdict at all for ${missing.map((n) => `"${n}"`).join(", ")}. Every entity ` +
116
+ "asked about lands in `entities` or in `unpredicted`; there is no third position.");
117
+ }
118
+ return report;
119
+ }
120
+ /** Code-unit order, so two runs on two machines sort the rows the same way. */
121
+ function byCodeUnit(a, b) {
122
+ return a < b ? -1 : a > b ? 1 : 0;
123
+ }
124
+ function has(map, key) {
125
+ return map !== undefined && Object.prototype.hasOwnProperty.call(map, key);
126
+ }
127
+ /**
128
+ * Compute the delta. Pure, and never subtracts two figures it has not first
129
+ * put through {@link compareFigures}.
130
+ */
131
+ export function behaviourDelta(base, head) {
132
+ const baseRefused = isBehaviourRefusalReport(base.result);
133
+ const headRefused = isBehaviourRefusalReport(head.result);
134
+ if (baseRefused || headRefused) {
135
+ return {
136
+ kind: "no-prediction",
137
+ base: {
138
+ label: base.label,
139
+ ...(base.ref ? { ref: base.ref } : {}),
140
+ ...(baseRefused ? { refusal: base.result.refusal } : {}),
141
+ },
142
+ head: {
143
+ label: head.label,
144
+ ...(head.ref ? { ref: head.ref } : {}),
145
+ ...(headRefused ? { refusal: head.result.refusal } : {}),
146
+ },
147
+ };
148
+ }
149
+ const b = base.result;
150
+ const h = head.result;
151
+ const names = new Set([
152
+ ...Object.keys(b.entities),
153
+ ...Object.keys(b.unpredicted ?? {}),
154
+ ...Object.keys(h.entities),
155
+ ...Object.keys(h.unpredicted ?? {}),
156
+ ]);
157
+ const rows = [];
158
+ const sumsByCurrency = new Map();
159
+ for (const name of [...names].sort(byCodeUnit)) {
160
+ const baseFigure = has(b.entities, name) ? b.entities[name] : undefined;
161
+ const headFigure = has(h.entities, name) ? h.entities[name] : undefined;
162
+ const baseDeclined = has(b.unpredicted, name) ? b.unpredicted[name] : undefined;
163
+ const headDeclined = has(h.unpredicted, name) ? h.unpredicted[name] : undefined;
164
+ const type = baseDeclined?.type ?? headDeclined?.type;
165
+ const row = {
166
+ name,
167
+ ...(type ? { type } : {}),
168
+ kind: "comparable",
169
+ ...(baseFigure ? { base: baseFigure } : {}),
170
+ ...(headFigure ? { head: headFigure } : {}),
171
+ ...(baseDeclined ? { baseDeclined } : {}),
172
+ ...(headDeclined ? { headDeclined } : {}),
173
+ };
174
+ if (baseDeclined || headDeclined) {
175
+ // Rule 2. A decline on either side is a row, and the row carries no
176
+ // difference — whatever the other side priced, there is nothing to
177
+ // difference it against.
178
+ row.kind = "declined";
179
+ }
180
+ else if (baseFigure && headFigure) {
181
+ // Rule 3. Every axis, not the first; the set is the contract's.
182
+ const found = compareFigures(baseFigure, headFigure);
183
+ if (found.size > 0) {
184
+ row.kind = "marked";
185
+ row.mismatches = FIGURE_MISMATCHES.filter((m) => found.has(m));
186
+ }
187
+ else {
188
+ row.kind = "comparable";
189
+ row.deltaPerHour = headFigure.cost.perHour - baseFigure.cost.perHour;
190
+ row.currency = headFigure.cost.currency;
191
+ const sum = sumsByCurrency.get(row.currency) ?? { currency: row.currency, perHour: 0, pairs: 0 };
192
+ sum.perHour += row.deltaPerHour;
193
+ sum.pairs += 1;
194
+ sumsByCurrency.set(row.currency, sum);
195
+ }
196
+ }
197
+ else if (baseFigure) {
198
+ row.kind = "only-base";
199
+ }
200
+ else {
201
+ row.kind = "only-head";
202
+ }
203
+ rows.push(row);
204
+ }
205
+ return {
206
+ kind: "delta",
207
+ base: { label: base.label, ...(base.ref ? { ref: base.ref } : {}), meta: b.meta },
208
+ head: { label: head.label, ...(head.ref ? { ref: head.ref } : {}), meta: h.meta },
209
+ rows,
210
+ sums: [...sumsByCurrency.values()].sort((x, y) => byCodeUnit(x.currency, y.currency)),
211
+ resilienceComparable: b.meta.edgeCoverage.verdict === "complete" && h.meta.edgeCoverage.verdict === "complete",
212
+ };
213
+ }
214
+ /**
215
+ * Four significant fractional digits at most, trailing zeros dropped. A rate
216
+ * of `0.272` renders as `0.272`, of `3` as `3`, and of `0.00230000001` as
217
+ * `0.0023`. No locale: the finding is the same bytes on every runner.
218
+ */
219
+ export function formatPerHour(n) {
220
+ const fixed = n.toFixed(4);
221
+ return fixed.includes(".") ? fixed.replace(/0+$/, "").replace(/\.$/, "") : fixed;
222
+ }
223
+ /** A rate as a rate: `0.272 USD/hour`, never an amount. */
224
+ export function renderRate(rate) {
225
+ return `${formatPerHour(rate.perHour)} ${rate.currency}/hour`;
226
+ }
227
+ /** A signed difference, `+0.4 USD/hour`, `-0.1 USD/hour`, `0 USD/hour`. */
228
+ function renderDelta(perHour, currency) {
229
+ const sign = perHour > 0 ? "+" : "";
230
+ return `${sign}${formatPerHour(perHour)} ${currency}/hour`;
231
+ }
232
+ /** `acme-sim 1.4.2 · ±15% · modeled` — the four provenance fields, always together. */
233
+ export function renderProvenance(p) {
234
+ return `${p.engine} ${p.version} · ${p.tolerance} · ${p.basis}`;
235
+ }
236
+ function renderCoverage(c) {
237
+ const gaps = [];
238
+ if (c.unresolvedKinds && c.unresolvedKinds.length > 0)
239
+ gaps.push(`unresolved kinds: ${c.unresolvedKinds.join(", ")}`);
240
+ if (c.dangling && c.dangling.length > 0)
241
+ gaps.push(`${c.dangling.length} dangling reference(s)`);
242
+ if (c.containmentEdges && c.containmentEdges.length > 0)
243
+ gaps.push(`${c.containmentEdges.length} containment edge(s)`);
244
+ return gaps.length > 0 ? `${c.verdict} (${gaps.join("; ")})` : c.verdict;
245
+ }
246
+ function renderAxis(name, before, after) {
247
+ const b = before === undefined ? "—" : formatPerHour(before);
248
+ const a = after === undefined ? "—" : formatPerHour(after);
249
+ return `${name} ${b} → ${a}`;
250
+ }
251
+ function renderHeadroom(base, head) {
252
+ const b = (base?.headroom ?? {});
253
+ const h = (head?.headroom ?? {});
254
+ return [renderAxis("cpu", b.cpu, h.cpu), renderAxis("latency", b.latency, h.latency)].join(" · ");
255
+ }
256
+ function renderVerdict(f) {
257
+ return f ? `${f.resilience.verdict} (${f.resilience.failure})` : "—";
258
+ }
259
+ function renderResilience(row, comparable) {
260
+ const { base, head } = row;
261
+ if (!base || !head)
262
+ return base ? `base ${renderVerdict(base)}` : head ? `head ${renderVerdict(head)}` : "—";
263
+ if (comparable && base.resilience.failure === head.resilience.failure) {
264
+ const arrow = base.resilience.verdict === head.resilience.verdict ? "=" : "→";
265
+ return `${base.resilience.verdict} ${arrow} ${head.resilience.verdict} (${base.resilience.failure})`;
266
+ }
267
+ return `base ${renderVerdict(base)}; head ${renderVerdict(head)}`;
268
+ }
269
+ function renderRowProvenance(row) {
270
+ const { base, head } = row;
271
+ if (base && head) {
272
+ const b = renderProvenance(base.provenance);
273
+ const h = renderProvenance(head.provenance);
274
+ return b === h ? b : `base: ${b}; head: ${h}`;
275
+ }
276
+ return base ? renderProvenance(base.provenance) : head ? renderProvenance(head.provenance) : "—";
277
+ }
278
+ function cell(s) {
279
+ return s.replace(/\|/g, "\\|").replace(/\r?\n/g, " ");
280
+ }
281
+ function figureCell(f, declined) {
282
+ if (declined)
283
+ return `declined: ${declined.reason}`;
284
+ if (f)
285
+ return renderRate(f.cost);
286
+ return "—";
287
+ }
288
+ function deltaCell(row) {
289
+ switch (row.kind) {
290
+ case "comparable":
291
+ return renderDelta(row.deltaPerHour, row.currency);
292
+ case "marked":
293
+ return `marked: ${(row.mismatches ?? []).join(", ")}`;
294
+ case "declined":
295
+ return "no delta (declined)";
296
+ case "only-base":
297
+ return "removed";
298
+ case "only-head":
299
+ return "added";
300
+ }
301
+ }
302
+ /**
303
+ * The finding as Markdown, for a pull-request comment or a merge-request
304
+ * note. Deterministic for a given delta.
305
+ *
306
+ * The first paragraph says what the numbers are, before any of them appear:
307
+ * a modeled rate for one hypothetical hour, at the level the run was asked
308
+ * for, from a named engine at a stated tolerance. The paragraph is not
309
+ * decoration; it is rule 1 of the contract applied to prose.
310
+ */
311
+ export function renderBehaviourFinding(delta, ctx) {
312
+ const lines = [];
313
+ if (delta.kind === "no-prediction") {
314
+ lines.push(`## Predicted behaviour for \`${ctx.env}\` — no prediction (Op \`${ctx.op}\`)`, "");
315
+ lines.push("No delta is shown and no figure is guessed locally. A prediction refused on one side is not a " +
316
+ "prediction of zero on that side, so there is nothing to difference the other side against.", "");
317
+ for (const side of [delta.base, delta.head]) {
318
+ if (!side.refusal)
319
+ continue;
320
+ const title = side.ref ? `${side.label} (${side.ref})` : side.label;
321
+ lines.push(`**${title}**`, "", "```", renderBehaviourRefusal(side.refusal, { color: false }), "```", "");
322
+ }
323
+ return lines.join("\n").trimEnd() + "\n";
324
+ }
325
+ const traffic = delta.head.meta.at.traffic;
326
+ lines.push(`## Predicted behaviour for \`${ctx.env}\` at \`${traffic}\` (Op \`${ctx.op}\`)`, "");
327
+ lines.push("A prediction, not a measurement. Every figure below is one engine's modeled rate for one hypothetical " +
328
+ "hour at the stated traffic level, shown with that engine's name, version, stated tolerance and basis " +
329
+ "(`modeled` from list prices, or `validated`). Nothing here is an amount owed for an hour that happened.", "");
330
+ lines.push("| Side | Predicted from | Engine | Traffic level | Edge coverage | Engine's own estate total |");
331
+ lines.push("|---|---|---|---|---|---|");
332
+ for (const side of [delta.base, delta.head]) {
333
+ const total = side.meta.total ? renderRate(side.meta.total) : "not stated";
334
+ lines.push(`| ${side.label} | ${cell(side.ref ?? "—")} | ${cell(`${side.meta.engine} ${side.meta.version}`)} | ` +
335
+ `${cell(side.meta.at.traffic)} | ${cell(renderCoverage(side.meta.edgeCoverage))} | ${total} |`);
336
+ }
337
+ lines.push("");
338
+ if (delta.base.meta.at.traffic !== delta.head.meta.at.traffic) {
339
+ lines.push(`The two sides were predicted at different traffic levels (\`${delta.base.meta.at.traffic}\` and ` +
340
+ `\`${delta.head.meta.at.traffic}\`), so every pair below is marked \`mixed-level\` and none is differenced.`, "");
341
+ }
342
+ if (!delta.resilienceComparable) {
343
+ lines.push("Resilience verdicts are shown per side and **not compared**: edge coverage is " +
344
+ `\`${delta.base.meta.edgeCoverage.verdict}\` on ${delta.base.label} and ` +
345
+ `\`${delta.head.meta.edgeCoverage.verdict}\` on ${delta.head.label}, so the two verdicts were computed ` +
346
+ "over graphs of different completeness, and a difference between them is not a difference in the estate.", "");
347
+ }
348
+ lines.push("| Entity | Type | " +
349
+ `${delta.base.label} | ${delta.head.label} | Delta per hour | Headroom (${delta.base.label} → ${delta.head.label}) | ` +
350
+ "Resilience | Provenance |");
351
+ lines.push("|---|---|---|---|---|---|---|---|");
352
+ for (const row of delta.rows) {
353
+ lines.push(`| ${cell(row.name)} | ${cell(row.type ?? "")} | ${cell(figureCell(row.base, row.baseDeclined))} | ` +
354
+ `${cell(figureCell(row.head, row.headDeclined))} | ${cell(deltaCell(row))} | ` +
355
+ `${cell(renderHeadroom(row.base, row.head))} | ${cell(renderResilience(row, delta.resilienceComparable))} | ` +
356
+ `${cell(renderRowProvenance(row))} |`);
357
+ }
358
+ lines.push("");
359
+ const marked = delta.rows.filter((r) => r.kind === "marked").length;
360
+ const declined = delta.rows.filter((r) => r.kind === "declined").length;
361
+ const oneSided = delta.rows.filter((r) => r.kind === "only-base" || r.kind === "only-head").length;
362
+ if (delta.sums.length > 0) {
363
+ for (const sum of delta.sums) {
364
+ lines.push(`Sum of the comparable deltas: **${renderDelta(sum.perHour, sum.currency)}** over ${sum.pairs} pair(s). ` +
365
+ "This is chant's own arithmetic over the comparable rows above and not an engine figure; it excludes " +
366
+ `${marked} marked pair(s), ${declined} declined entit${declined === 1 ? "y" : "ies"} and ${oneSided} ` +
367
+ "entit" + (oneSided === 1 ? "y" : "ies") + " present on one side only.");
368
+ }
369
+ lines.push("");
370
+ }
371
+ else {
372
+ lines.push("No pair is comparable, so no delta is summed.", "");
373
+ }
374
+ const declinedRows = delta.rows.filter((r) => r.kind === "declined");
375
+ if (declinedRows.length > 0) {
376
+ lines.push("### Declined entities", "");
377
+ lines.push("An entity the engine could not price is reported, not priced at nothing. It carries no delta on either " +
378
+ "side; the reason is the lexicon's own.", "");
379
+ for (const row of declinedRows) {
380
+ for (const [label, d] of [
381
+ [delta.base.label, row.baseDeclined],
382
+ [delta.head.label, row.headDeclined],
383
+ ]) {
384
+ if (!d)
385
+ continue;
386
+ lines.push(`- \`${row.name}\` on ${label}: \`${d.reason}\`${d.detail ? ` — ${d.detail}` : ""}`);
387
+ }
388
+ }
389
+ lines.push("");
390
+ }
391
+ const hints = delta.rows.filter((r) => r.head?.rightSize);
392
+ if (hints.length > 0) {
393
+ lines.push(`### Right-size hints on ${delta.head.label}`, "");
394
+ for (const row of hints) {
395
+ const rs = row.head.rightSize;
396
+ lines.push(`- \`${row.name}\`: ${rs.suggestion}${rs.reason ? ` — ${rs.reason}` : ""}`);
397
+ }
398
+ lines.push("");
399
+ }
400
+ return lines.join("\n").trimEnd() + "\n";
401
+ }