@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,135 @@
1
+ /** Every level, most disruptive last — also the guard core validates a lexicon's answer against. */
2
+ export const DISRUPTION_LEVELS = [
3
+ "in-place",
4
+ "rolling",
5
+ "replace",
6
+ "destroy",
7
+ "unknown",
8
+ ];
9
+ /** Ordering for "the worst thing in this plan", with `unknown` above every confident verdict. */
10
+ const DISRUPTION_RANK = {
11
+ "in-place": 0,
12
+ rolling: 1,
13
+ replace: 2,
14
+ destroy: 3,
15
+ unknown: 4,
16
+ };
17
+ /** The verdict every fallback path produces. */
18
+ export function unknownDisruption(detail) {
19
+ return { disruption: "unknown", detail };
20
+ }
21
+ /**
22
+ * Annotate one lexicon's change set with a disruption verdict per `update`.
23
+ *
24
+ * Only `update` entries are asked about: every other action already carries its
25
+ * blast radius in the action itself. Called once per lexicon, before the plan
26
+ * merges the change sets, so `classify` is always the lexicon that produced the
27
+ * entries — the only party that can map its own observation's attribute paths
28
+ * back onto spec properties.
29
+ *
30
+ * Returns a new change set; the input is not mutated.
31
+ */
32
+ export async function annotateDisruption(cs, environment, classify) {
33
+ const updates = cs.entries.filter((e) => e.action === "update");
34
+ if (updates.length === 0)
35
+ return cs;
36
+ const who = updates[0].lexicon ? `the ${updates[0].lexicon} lexicon` : "this lexicon";
37
+ let verdicts = {};
38
+ let fallback;
39
+ if (!classify) {
40
+ fallback = `${who} does not classify disruption — replacement semantics are spec knowledge it has not published`;
41
+ }
42
+ else {
43
+ try {
44
+ verdicts = (await classify({
45
+ environment,
46
+ changes: updates.map((e) => ({
47
+ name: e.name,
48
+ ...(e.type ? { type: e.type } : {}),
49
+ deltas: e.deltas ?? [],
50
+ })),
51
+ })) ?? {};
52
+ }
53
+ catch (err) {
54
+ // A broken classifier is not evidence of anything. It must not be able to
55
+ // leave a confident verdict behind, and it must not fail the plan either.
56
+ verdicts = {};
57
+ fallback = `${who}'s disruption classifier failed: ${err instanceof Error ? err.message : String(err)}`;
58
+ }
59
+ }
60
+ const entries = cs.entries.map((e) => {
61
+ if (e.action !== "update")
62
+ return e;
63
+ const verdict = resolveVerdict(verdicts[e.name], fallback, who);
64
+ const annotated = {
65
+ ...e,
66
+ disruption: verdict.disruption,
67
+ ...(verdict.because && verdict.because.length > 0 ? { disruptionBecause: verdict.because } : {}),
68
+ ...(verdict.detail ? { disruptionDetail: verdict.detail } : {}),
69
+ };
70
+ return annotated;
71
+ });
72
+ return { ...cs, entries };
73
+ }
74
+ function resolveVerdict(verdict, fallback, who) {
75
+ if (fallback)
76
+ return unknownDisruption(fallback);
77
+ if (!verdict)
78
+ return unknownDisruption(`${who} returned no verdict for this change`);
79
+ if (!DISRUPTION_LEVELS.includes(verdict.disruption)) {
80
+ return unknownDisruption(`${who} returned "${String(verdict.disruption)}", which is not a disruption level`);
81
+ }
82
+ return verdict;
83
+ }
84
+ /** Count `update` entries per level. Entries with no verdict at all are not counted. */
85
+ export function summarizeDisruption(cs) {
86
+ const counts = {
87
+ "in-place": 0,
88
+ rolling: 0,
89
+ replace: 0,
90
+ destroy: 0,
91
+ unknown: 0,
92
+ };
93
+ for (const e of cs.entries) {
94
+ if (e.action === "update" && e.disruption)
95
+ counts[e.disruption]++;
96
+ }
97
+ return counts;
98
+ }
99
+ /** The most disruptive verdict in the set, or undefined when nothing was classified. */
100
+ export function worstDisruption(cs) {
101
+ let worst;
102
+ for (const e of cs.entries) {
103
+ if (e.action !== "update" || !e.disruption)
104
+ continue;
105
+ if (!worst || DISRUPTION_RANK[e.disruption] > DISRUPTION_RANK[worst])
106
+ worst = e.disruption;
107
+ }
108
+ return worst;
109
+ }
110
+ /**
111
+ * Warnings a plan should print on stderr — so a `--json` or `--report gitlab-mr`
112
+ * consumer, whose shape has no column for disruption, still hears about the
113
+ * expensive rows. Same discipline as the unobserved warning (#1089).
114
+ */
115
+ export function disruptionNotices(cs) {
116
+ const counts = summarizeDisruption(cs);
117
+ const notices = [];
118
+ const replacing = counts.replace + counts.destroy;
119
+ if (replacing > 0) {
120
+ notices.push(`${replacing} update(s) replace the resource rather than mutating it in place` +
121
+ (counts.destroy > 0
122
+ ? `, ${counts.destroy} of them by deleting it first — that window has nothing in it.`
123
+ : "."));
124
+ }
125
+ if (counts.unknown > 0) {
126
+ notices.push(`${counts.unknown} update(s) could not be classified — no lexicon could say whether applying them replaces the resource. Unknown is not "in place".`);
127
+ }
128
+ return notices;
129
+ }
130
+ /** Render one entry's verdict for the human plan, or "" when there is none. */
131
+ export function renderDisruption(entry) {
132
+ if (!entry.disruption)
133
+ return "";
134
+ return ` — ${entry.disruption}${entry.disruptionDetail ? `: ${entry.disruptionDetail}` : ""}`;
135
+ }
@@ -0,0 +1,113 @@
1
+ /**
2
+ * The approvals a wave applied under, and the rule that spends them (#3784).
3
+ *
4
+ * terragucci's wave gate writes one line to `_gates/<op>/applied.jsonl` on
5
+ * `chant/lifecycle` before a wave applies under an approval: the gate, the
6
+ * digest, and the approval's own timestamp. From then on that approval is
7
+ * spent. It does not let the same digest through again, and it no longer
8
+ * stands as the approval of another digest either. Op waves write the same
9
+ * line, in the same file, when their spec sets `approvals.spend`, and
10
+ * `decideGateApproval` (`../gate-decision.ts`) and `evaluateGate`
11
+ * (`../op/gate.ts`) take the lines to leave spent approvals out.
12
+ *
13
+ * The file sits in a directory under `_gates/`, so the readers of
14
+ * `_gates/<op>.jsonl` never see its lines. {@link appliedGateApplies} hands
15
+ * them to `gate-audit` as applies, each tied to the approval it ran under.
16
+ *
17
+ * Pure: no git, no clock, no file. It bundles into `@intentius/chant/gate-decision`.
18
+ */
19
+ import { samePlanDigest } from "./plan-digest.js";
20
+ /** Where the applied lines of `op` live on `chant/lifecycle`: the directory and the file, as `writeBlobToPath` takes them. */
21
+ export function appliedGatePath(op) {
22
+ return { dir: `_gates/${op}`, file: "applied.jsonl" };
23
+ }
24
+ /** The applied lines of an `applied.jsonl` file, oldest first. A line that is not one is skipped. */
25
+ export function parseAppliedGateLines(text) {
26
+ const out = [];
27
+ for (const line of text.split("\n").map((l) => l.trim()).filter(Boolean)) {
28
+ let r;
29
+ try {
30
+ r = JSON.parse(line);
31
+ }
32
+ catch {
33
+ continue;
34
+ }
35
+ if (r?.version === 1 && r.kind === "applied" && typeof r.op === "string" && typeof r.gate === "string" &&
36
+ typeof r.planDigest === "string" && typeof r.approvedAt === "string" && typeof r.timestamp === "string") {
37
+ out.push({ approvedBy: "", ...r });
38
+ }
39
+ }
40
+ return out;
41
+ }
42
+ const time = (iso) => new Date(iso).getTime();
43
+ /**
44
+ * Every line of an `applied.jsonl` file a resume reads (#3858): the
45
+ * `applied` and `changes` lines, and the `finished` lines that say how an
46
+ * apply ended. Oldest first; a line that is none of them is skipped.
47
+ */
48
+ export function parseAppliedGateFile(text) {
49
+ const applied = [];
50
+ const finished = [];
51
+ for (const line of text.split("\n").map((l) => l.trim()).filter(Boolean)) {
52
+ let r;
53
+ try {
54
+ r = JSON.parse(line);
55
+ }
56
+ catch {
57
+ continue;
58
+ }
59
+ if (r?.version !== 1 || typeof r.gate !== "string" || typeof r.planDigest !== "string" || typeof r.timestamp !== "string")
60
+ continue;
61
+ if ((r.kind === "applied" || r.kind === "changes") && typeof r.approvedAt === "string") {
62
+ applied.push({ op: "", approvedBy: "", ...r });
63
+ }
64
+ else if (r.kind === "finished" && typeof r.applied === "string" && (r.result === "applied" || r.result === "failed")) {
65
+ finished.push({ op: "", ...r });
66
+ }
67
+ }
68
+ return { applied, finished };
69
+ }
70
+ /** The finished line for the apply `line` names, or undefined while it has none. */
71
+ export function finishedApply(finished, line) {
72
+ return finished.find((f) => f.gate === line.gate && samePlanDigest(f.planDigest, line.planDigest) && time(f.applied) === time(line.timestamp));
73
+ }
74
+ /**
75
+ * Whether an approval is spent: a wave applied under an approval of the same
76
+ * gate and digest made at or after it. One that names no digest is never
77
+ * spent. With `review`, an approval that came from a pull request's review
78
+ * is spent too when a wave applied this digest under a review of the same
79
+ * head, so the review cannot be recorded again to pass the digest twice. A
80
+ * review not yet recorded has no `timestamp`.
81
+ */
82
+ export function isApprovalSpent(applied, approval) {
83
+ const digest = approval.planDigest;
84
+ if (digest === undefined)
85
+ return false;
86
+ return applied.some((a) => a.gate === approval.gate &&
87
+ samePlanDigest(a.planDigest, digest) &&
88
+ ((approval.timestamp !== undefined && time(a.approvedAt) >= time(approval.timestamp)) ||
89
+ (approval.review?.head !== undefined && a.review?.head === approval.review.head)));
90
+ }
91
+ /**
92
+ * The applied lines as `gate-audit` applies: each an `applied` entry tied to
93
+ * the approval it ran under. `ref` names the file, `_gates/<op>/applied.jsonl`
94
+ * by default; each line's index is appended so ids stay stable.
95
+ */
96
+ export function appliedGateApplies(records, ref) {
97
+ return records.map((r, i) => ({
98
+ ref: `${ref ?? `_gates/${r.op}/applied.jsonl`}#${i + 1}`,
99
+ at: r.timestamp,
100
+ gate: r.gate,
101
+ op: r.op,
102
+ digest: r.planDigest,
103
+ approval: "required",
104
+ detail: {
105
+ approvedAt: r.approvedAt,
106
+ approvedBy: r.approvedBy,
107
+ ...(r.wave ? { wave: r.wave } : {}),
108
+ ...(r.review ? { review: r.review } : {}),
109
+ ...(r.runId ? { runId: r.runId } : {}),
110
+ ...(r.commit ? { commit: r.commit } : {}),
111
+ },
112
+ }));
113
+ }
@@ -0,0 +1,341 @@
1
+ /**
2
+ * An audit trail from the gate ledger (#3764, decision #3756). Pure: ledger
3
+ * lines (and, if the product has them, the applies that ran under a gate) go
4
+ * in; typed entries and the gaps they show come out. It reads no git, no
5
+ * clock and no file, so it bundles into a product's single CI file
6
+ * (`gate-audit-bundle.test.ts` holds the import graph).
7
+ *
8
+ * Both products derived this themselves: terragucci's `report/audit.ts` and
9
+ * SQL Yodeler's `report/audit.ts` each parse `_gates/<op>.jsonl`. Storage
10
+ * (an append-only record, a bucket, a history table) and rendering stay with
11
+ * them.
12
+ *
13
+ * ## Entries
14
+ *
15
+ * | kind | source line |
16
+ * |----------------------|------------------------------------------------------------------|
17
+ * | `approval-requested` | a pending fact of a gate that is not an override |
18
+ * | `approved` | a resolution of such a gate (seal, approver, review, relay) |
19
+ * | `override-requested` | a pending fact of an override gate: a denial that waits |
20
+ * | `override-recorded` | a resolution of an override gate (reason in `note`) |
21
+ * | `revoked` | a resolution a commit removed from the file (`subject` says which) |
22
+ * | `applied` | an apply the caller passes in, with the approval it ran under |
23
+ * | `override-spent` | an override an apply the caller passes in cites |
24
+ *
25
+ * An override gate is, by default, any gate of the op `policy-override`
26
+ * (terragucci writes one gate per root) or named `override-<rule>` (SQL
27
+ * Yodeler's `yodel override`). chant's override gate (#3760,
28
+ * `../override-gate.ts`) records under the op `policy-override`, so the
29
+ * default reads it, and its `overrideAuditApplies` turns applied records into
30
+ * applies that cite the override they spent. {@link GateAuditOptions.isOverride}
31
+ * replaces the rule. Anything a line carries beyond the typed fields is kept in
32
+ * `detail`, and `kind` is checked against {@link GATE_AUDIT_KINDS} only by
33
+ * the type, never by the reader.
34
+ *
35
+ * ## Gaps
36
+ *
37
+ * - `approval-without-request`: a resolution with no pending fact of its gate
38
+ * before it (or none for its digest). Overrides are exempt: both products
39
+ * may record one without a denial on file.
40
+ * - `unsealed`: an approval or override with neither a seal nor a pull
41
+ * request review, where {@link GateAuditOptions.sealed} says the gate needs
42
+ * one.
43
+ * - `approval`: an apply with a digest that no approval of its gate holds
44
+ * for that digest, recorded at or before the apply. Needs `approval:
45
+ * "not-required"` to be waived, as a baseline or a policy that asked for
46
+ * no approval does.
47
+ * - `override`: an apply cites an override that no line holds.
48
+ * - `malformed-line`: a line that is not a gate record. Its content is lost
49
+ * to the trail, so it is said.
50
+ *
51
+ * ## Sources and ids
52
+ *
53
+ * Every ledger entry's `source` names the line it came from: `path`, `line`
54
+ * (the line's own `line` when given, which {@link gateLedgerLines} fills
55
+ * with the file's line number, else its 1-based place in `ledger.lines`),
56
+ * and `text`, exactly as passed in, when the line was given as text. When the
57
+ * line came from {@link gateLedgerLinesFromLog}, `source.author` is the
58
+ * author of the commit that added it (or, for a revocation, removed it), and
59
+ * resolutions also carry it as `committedBy`. Under `approval: ledger` that
60
+ * is the only check on who pushed an approval: anyone who can push may write
61
+ * any `resolvedBy`.
62
+ *
63
+ * The default `id` is a digest over the source and the record. A product
64
+ * that already holds ids of its own (an append-only record whose ids
65
+ * customers keep) passes {@link GateAuditOptions.id}, which gets each entry
66
+ * with its default id and returns the id to use. `under` links follow it.
67
+ *
68
+ * ## Seal and review
69
+ *
70
+ * `seal` names how the approval came to be: `review` when the line came
71
+ * through a forge review (`via: "pr-review"`, or a `review` field), else
72
+ * `sealed` when it carries an ssh seal, else `unsigned`. A pull request
73
+ * approval that `chant approve` also sealed is still `review`: the review is
74
+ * what authorised it, and the seal attests who wrote the line. That fact is
75
+ * kept apart as `sealed: true` with its `signer`, on any entry whose line
76
+ * holds a seal. terragucci classifies the same way.
77
+ */
78
+ import { canonicalJson } from "../effect-receipt.js";
79
+ import { contentDigest } from "../content-digest.js";
80
+ import { samePlanDigest } from "./plan-digest.js";
81
+ export const GATE_AUDIT_KINDS = [
82
+ "approval-requested",
83
+ "approved",
84
+ "override-requested",
85
+ "override-recorded",
86
+ "revoked",
87
+ "applied",
88
+ "override-spent",
89
+ ];
90
+ export const POLICY_OVERRIDE_OP = "policy-override";
91
+ /** The default {@link GateAuditOptions.isOverride}. */
92
+ export function isOverrideGate(op, gate) {
93
+ return op === POLICY_OVERRIDE_OP || gate.startsWith("override-");
94
+ }
95
+ const KNOWN = new Set([
96
+ "version", "kind", "op", "gate", "resolvedBy", "relayedBy", "timestamp", "note", "url", "planDigest", "environment",
97
+ "approver", "seal", "review", "runId", "expiresAt", "description", "wave", "rules", "pr", "head", "reviewers",
98
+ ]);
99
+ const waveOf = (v) => {
100
+ const w = v;
101
+ return w && typeof w === "object" && typeof w.number === "number" && typeof w.name === "string" ? { number: w.number, name: w.name, ...(typeof w.op === "string" ? { op: w.op } : {}) } : undefined;
102
+ };
103
+ const str = (v) => (typeof v === "string" && v !== "" ? v : undefined);
104
+ const strings = (v) => (Array.isArray(v) ? v.filter((x) => typeof x === "string") : undefined);
105
+ const time = (iso) => Date.parse(iso) || 0;
106
+ function rowOf(line) {
107
+ let v = line.record;
108
+ if (v === undefined && line.text !== undefined) {
109
+ try {
110
+ v = JSON.parse(line.text);
111
+ }
112
+ catch {
113
+ return undefined;
114
+ }
115
+ }
116
+ return v && typeof v === "object" && !Array.isArray(v) ? v : undefined;
117
+ }
118
+ function sealOf(r) {
119
+ const s = r.seal;
120
+ const signed = s && s.signature ? { sealed: true, ...(str(s.signer) ? { signer: str(s.signer) } : {}) } : undefined;
121
+ if (r.review || r.via === "pr-review")
122
+ return { seal: "review", ...signed };
123
+ return signed ? { seal: "sealed", ...signed } : { seal: "unsigned" };
124
+ }
125
+ function reviewOf(r) {
126
+ const rv = (r.review ?? undefined);
127
+ const pr = typeof rv?.pr === "number" ? rv.pr : typeof r.pr === "number" ? r.pr : undefined;
128
+ const head = str(rv?.head) ?? str(r.head);
129
+ const approvers = strings(rv?.approvers) ?? strings(r.reviewers);
130
+ if (pr === undefined && head === undefined && approvers === undefined)
131
+ return undefined;
132
+ return { ...(pr !== undefined ? { pr } : {}), ...(head ? { head } : {}), ...(approvers ? { approvers } : {}) };
133
+ }
134
+ function approverOf(r) {
135
+ const a = r.approver;
136
+ if (!a || typeof a.kind !== "string")
137
+ return undefined;
138
+ const roles = strings(a.roles);
139
+ return { kind: a.kind, ...(roles ? { roles } : {}) };
140
+ }
141
+ const drop = (o) => Object.fromEntries(Object.entries(o).filter(([, v]) => v !== undefined));
142
+ const idOf = (...parts) => contentDigest(canonicalJson(parts));
143
+ /** Whether two digests, either absent, can be the same plan: absent matches anything, as an old line records none. */
144
+ const compatible = (a, b) => a === undefined || b === undefined || samePlanDigest(a, b);
145
+ /** The entries `input` adds up to, oldest first, and the gaps they show. */
146
+ export function deriveGateAudit(input) {
147
+ const isOverride = input.isOverride ?? isOverrideGate;
148
+ const rekey = input.id;
149
+ const keyed = (e) => (rekey ? { ...e, id: rekey(e) } : e);
150
+ const entries = [];
151
+ const gaps = [];
152
+ for (const ledger of input.ledgers) {
153
+ const path = ledger.path ?? `_gates/${ledger.op}.jsonl`;
154
+ const parsed = [];
155
+ for (const [i, line] of ledger.lines.entries()) {
156
+ const r = rowOf(line);
157
+ const pending = r?.kind === "pending";
158
+ const ok = r && r.version === 1 && typeof r.gate === "string" && typeof r.timestamp === "string" && (pending || typeof r.resolvedBy === "string");
159
+ if (!r || !ok) {
160
+ gaps.push({ kind: "malformed-line", op: ledger.op, detail: `${path} holds a line that is not a gate record${line.commit ? ` (commit ${line.commit})` : ""}: ${(line.text ?? JSON.stringify(line.record) ?? "").slice(0, 80)}` });
161
+ continue;
162
+ }
163
+ parsed.push({ line, n: line.line ?? i + 1, r, pending });
164
+ }
165
+ // Each denial an override answers: the newest pending fact of its gate and digest.
166
+ const denials = new Map();
167
+ const requests = [];
168
+ for (const p of parsed) {
169
+ if (!p.pending || p.line.removed)
170
+ continue;
171
+ const digest = str(p.r.planDigest);
172
+ denials.set(`${String(p.r.gate)}\n${digest ?? ""}`, p.r);
173
+ requests.push({ op: ledger.op, gate: String(p.r.gate), at: time(String(p.r.timestamp)), ...(digest ? { digest } : {}), ...(str(p.r.environment) ? { environment: str(p.r.environment) } : {}) });
174
+ }
175
+ for (const { line, n, r, pending } of parsed) {
176
+ const gate = String(r.gate);
177
+ const override = isOverride(ledger.op, gate);
178
+ const removed = line.removed;
179
+ if (pending && removed)
180
+ continue;
181
+ const digest = str(r.planDigest);
182
+ const author = removed ?? line.added;
183
+ const source = {
184
+ path,
185
+ op: ledger.op,
186
+ line: n,
187
+ ...(line.text !== undefined ? { text: line.text } : {}),
188
+ ...(line.commit ? { commit: line.commit } : {}),
189
+ ...(author ? { author } : {}),
190
+ change: removed ? "removed" : "added",
191
+ };
192
+ const id = idOf(removed ? "removed" : "ledger", path, line.commit ?? null, r);
193
+ const extra = Object.fromEntries(Object.entries(r).filter(([k]) => !KNOWN.has(k)));
194
+ const base = { id, gate, op: ledger.op, ...(digest ? { digest } : {}), source };
195
+ if (pending) {
196
+ entries.push(keyed({
197
+ ...base,
198
+ kind: override ? "override-requested" : "approval-requested",
199
+ at: String(r.timestamp),
200
+ ...drop({ runId: str(r.runId), expiresAt: str(r.expiresAt), description: str(r.description), url: str(r.url), rules: strings(r.rules), wave: waveOf(r.wave) }),
201
+ detail: extra,
202
+ }));
203
+ continue;
204
+ }
205
+ const { seal, sealed, signer } = sealOf(r);
206
+ if (removed) {
207
+ entries.push(keyed({
208
+ ...base,
209
+ kind: "revoked",
210
+ at: removed.at,
211
+ ...(removed.by ? { by: removed.by } : {}),
212
+ subject: override ? "override" : "approval",
213
+ seal,
214
+ ...(sealed ? { sealed } : {}),
215
+ detail: { ...extra, approvedBy: r.resolvedBy, approvedAt: r.timestamp, ...(signer ? { signer } : {}) },
216
+ }));
217
+ continue;
218
+ }
219
+ const denial = override ? denials.get(`${gate}\n${digest ?? ""}`) : undefined;
220
+ const rules = strings(denial?.rules) ?? (override && gate.startsWith("override-") ? [gate.slice("override-".length)] : undefined);
221
+ const entry = keyed({
222
+ ...base,
223
+ kind: override ? "override-recorded" : "approved",
224
+ at: String(r.timestamp),
225
+ by: String(r.resolvedBy),
226
+ seal,
227
+ ...drop({ sealed, signer, committedBy: line.added?.by, relayedBy: str(r.relayedBy), approver: approverOf(r), note: str(r.note), url: str(r.url), review: reviewOf(r), rules }),
228
+ detail: extra,
229
+ });
230
+ entries.push(entry);
231
+ if (!override) {
232
+ const at = time(entry.at);
233
+ const env = str(r.environment);
234
+ const asked = requests.some((q) => q.gate === gate && q.at <= at && compatible(q.digest, digest) && (q.environment === undefined || env === undefined || q.environment === env));
235
+ if (!asked) {
236
+ gaps.push({ kind: "approval-without-request", op: ledger.op, gate, ...(digest ? { digest } : {}), detail: `${path} holds an approval of ${gate} by ${entry.by} at ${entry.at} with no pending fact of that gate${digest ? " and digest" : ""} before it` });
237
+ }
238
+ }
239
+ if (seal === "unsigned" && input.sealed?.(ledger.op, gate)) {
240
+ gaps.push({ kind: "unsealed", op: ledger.op, gate, ...(digest ? { digest } : {}), detail: `${path} holds ${override ? "an override" : "an approval"} of ${gate} by ${entry.by} at ${entry.at} with no seal and no review, and the gate needs one` });
241
+ }
242
+ }
243
+ }
244
+ const held = entries.filter((e) => e.kind === "approved" || e.kind === "override-recorded");
245
+ for (const a of input.applies ?? []) {
246
+ const base = { gate: a.gate, ...(a.op ? { op: a.op } : {}), ...(a.digest ? { digest: a.digest } : {}), source: { path: a.ref, ...(a.op ? { op: a.op } : {}), change: "apply" } };
247
+ const at = time(a.at);
248
+ const find = (kind, gate, digest, before) => held
249
+ .filter((e) => e.kind === kind && e.gate === gate && (a.op === undefined || e.op === a.op) && (digest === undefined ? true : e.digest !== undefined && samePlanDigest(e.digest, digest)) && (!before || time(e.at) <= at))
250
+ .sort((x, y) => time(y.at) - time(x.at))[0];
251
+ const approval = a.digest !== undefined && a.approval !== "not-required" ? find("approved", a.gate, a.digest, true) : undefined;
252
+ if (a.digest !== undefined && a.approval !== "not-required" && !approval) {
253
+ gaps.push({ kind: "approval", ...(a.op ? { op: a.op } : {}), gate: a.gate, digest: a.digest, detail: `${a.ref} applied under ${a.digest}, but the ledger holds no approval of ${a.gate} for that digest before ${a.at}` });
254
+ }
255
+ entries.push(keyed({
256
+ ...base,
257
+ id: idOf("apply", a.ref, a.at, a.gate, a.digest ?? null),
258
+ kind: "applied",
259
+ at: a.at,
260
+ ...(a.by ? { by: a.by } : {}),
261
+ ...(approval ? { under: approval.id } : {}),
262
+ detail: { ...(a.detail ?? {}), approval: a.approval ?? "required" },
263
+ }));
264
+ for (const o of a.overrides ?? []) {
265
+ const recorded = find("override-recorded", o.gate, o.digest, false);
266
+ if (!recorded) {
267
+ gaps.push({ kind: "override", ...(a.op ? { op: a.op } : {}), gate: o.gate, ...(o.digest ? { digest: o.digest } : {}), detail: `${a.ref} cites the override ${o.gate}${o.digest ? ` for ${o.digest}` : ""}, but the ledger holds none` });
268
+ continue;
269
+ }
270
+ entries.push(keyed({
271
+ ...base,
272
+ id: idOf("spent", a.ref, a.at, recorded.id),
273
+ kind: "override-spent",
274
+ gate: o.gate,
275
+ at: a.at,
276
+ ...(recorded.by ? { by: recorded.by } : {}),
277
+ ...(recorded.digest ? { digest: recorded.digest } : {}),
278
+ under: recorded.id,
279
+ detail: {},
280
+ }));
281
+ }
282
+ }
283
+ entries.sort((x, y) => time(x.at) - time(y.at));
284
+ return { entries, gaps };
285
+ }
286
+ /** The lines of one ledger file's text, all added, each with its line number. Blank lines are skipped. */
287
+ export function gateLedgerLines(content) {
288
+ return content.split("\n").flatMap((l, i) => (l.trim() ? [{ text: l.trim(), line: i + 1 }] : []));
289
+ }
290
+ /**
291
+ * The lines each commit added to and removed from a ledger file, oldest first,
292
+ * from `git log -p --unified=0 --no-renames` written with
293
+ * `--format=%x1e%H%x1f%an%x1f%aI` over the file (append `%x1f%ae` for the
294
+ * author's email). The caller runs git; this reads the text. Each line keeps
295
+ * its commit and that commit's date and author, as `added` or `removed`. A
296
+ * line removed and added again in one commit (a newline fixed at the end of
297
+ * the file) is neither. A removed line is what {@link deriveGateAudit}
298
+ * reports as a revocation.
299
+ */
300
+ export function gateLedgerLinesFromLog(log) {
301
+ const out = [];
302
+ for (const block of log.split("\x1e").slice(1)) {
303
+ const [head = "", ...rest] = block.split("\n");
304
+ const [commit = "", author = "", date = "", email = ""] = head.split("\x1f");
305
+ const net = new Map();
306
+ const order = [];
307
+ for (const l of rest) {
308
+ const sign = l[0];
309
+ if ((sign !== "+" && sign !== "-") || l[1] !== "{")
310
+ continue;
311
+ const text = l.slice(1).trim();
312
+ if (!net.has(text))
313
+ order.push(text);
314
+ net.set(text, (net.get(text) ?? 0) + (sign === "+" ? 1 : -1));
315
+ }
316
+ const when = Date.parse(date.trim());
317
+ const at = Number.isNaN(when) ? date.trim() : new Date(when).toISOString();
318
+ const by = { at, ...(author ? { by: author } : {}), ...(email.trim() ? { email: email.trim() } : {}) };
319
+ for (const text of order) {
320
+ const n = net.get(text);
321
+ for (let i = 0; i < Math.abs(n); i++) {
322
+ out.push({ text, commit: commit.trim(), ...(n > 0 ? { added: { ...by } } : { removed: { ...by } }) });
323
+ }
324
+ }
325
+ }
326
+ return out;
327
+ }
328
+ /**
329
+ * The thin reader: each op's ledger through a {@link GateLedgerPort} (the git
330
+ * port, or the in-memory one in a test), as input for {@link deriveGateAudit}.
331
+ * The port holds the file as it stands, so nothing here is revoked; add
332
+ * history through {@link gateLedgerLinesFromLog} for that.
333
+ */
334
+ export async function readGateAuditLedgers(port, ops) {
335
+ const out = [];
336
+ for (const op of ops) {
337
+ const { resolutions, pending } = await port.read(op);
338
+ out.push({ op, lines: [...pending, ...resolutions].map((record) => ({ record })) });
339
+ }
340
+ return out;
341
+ }
@@ -0,0 +1,89 @@
1
+ /**
2
+ * The rules a gate is decided by, over gate ledger lines already read (#2119,
3
+ * #2300): the pending fact a resolution must be newer than, and the
4
+ * resolution that answers a gate for a plan. They read no git, so
5
+ * `@intentius/chant/gate-decision` bundles them without the ledger's git
6
+ * code (#3763). `./gate-ledger.ts` re-exports them.
7
+ */
8
+ import { samePlanDigest } from "./plan-digest.js";
9
+ /** Whether a pending fact has aged out of relevance at `nowIso`. */
10
+ export function isPendingGateExpired(record, nowIso) {
11
+ return new Date(record.expiresAt).getTime() <= new Date(nowIso).getTime();
12
+ }
13
+ /** The most recent pending fact for `gate`, expired or not — the anchor {@link latestResolutionSince} measures a resolution against. `undefined` when the gate has never been recorded pending. */
14
+ export function latestPendingGate(records, gate) {
15
+ let latest;
16
+ for (const r of records) {
17
+ if (r.gate !== gate)
18
+ continue;
19
+ if (!latest || new Date(r.timestamp).getTime() >= new Date(latest.timestamp).getTime())
20
+ latest = r;
21
+ }
22
+ return latest;
23
+ }
24
+ /** The most recent resolution for `gate` recorded after `sinceIso` (a gated tick's own timestamp) — what `chant operator status` uses to tell a resolved gate from a still-pending one. `undefined` when no such resolution exists. */
25
+ export function latestResolutionSince(records, gate, sinceIso) {
26
+ const since = new Date(sinceIso).getTime();
27
+ let latest;
28
+ for (const r of records) {
29
+ if (r.gate !== gate)
30
+ continue;
31
+ if (new Date(r.timestamp).getTime() < since)
32
+ continue;
33
+ if (!latest || new Date(r.timestamp).getTime() >= new Date(latest.timestamp).getTime())
34
+ latest = r;
35
+ }
36
+ return latest;
37
+ }
38
+ /**
39
+ * The resolution that answers `gate` for the plan `planDigest` identifies
40
+ * (#2300).
41
+ *
42
+ * The criterion is the digest; recency is only the tiebreak between several
43
+ * resolutions that all match it. That inversion is the whole point of the
44
+ * issue: {@link latestResolutionSince} asks "is there a newer approval",
45
+ * which a run answers yes to no matter what has changed since, and this asks
46
+ * "is there an approval of *this*".
47
+ *
48
+ * - `planDigest` `undefined` — the gate binds no plan (an Op `gate` step
49
+ * authored with no `plan`). Falls straight through to
50
+ * {@link latestResolutionSince}: gates that never claimed to bind a plan
51
+ * behave exactly as they did before #2300.
52
+ * - A resolution whose `planDigest` equals `planDigest` answers the gate.
53
+ * - A resolution for a different plan does not, and comes back as
54
+ * `mismatched` so the caller can name both digests.
55
+ * - A resolution with no `planDigest` at all — every record written before
56
+ * #2300 — does not either, and comes back as `mismatched` with an absent
57
+ * `planDigest`. This is the safe reading of the migration: such a record
58
+ * proves someone approved something, and nothing about what. Accepting it
59
+ * once would silently apply the very change this check exists to catch, on
60
+ * exactly the estates that have been running longest. The cost is one
61
+ * further `chant approve` per gate after the upgrade, which the refusal
62
+ * says out loud.
63
+ */
64
+ export function latestResolutionForPlan(records, gate, sinceIso, planDigest) {
65
+ if (planDigest === undefined) {
66
+ const resolution = latestResolutionSince(records, gate, sinceIso);
67
+ return resolution ? { resolution } : {};
68
+ }
69
+ const since = new Date(sinceIso).getTime();
70
+ let matched;
71
+ let mismatched;
72
+ for (const r of records) {
73
+ if (r.gate !== gate)
74
+ continue;
75
+ if (new Date(r.timestamp).getTime() < since)
76
+ continue;
77
+ const newest = (best) => !best || new Date(r.timestamp).getTime() >= new Date(best.timestamp).getTime();
78
+ if (samePlanDigest(r.planDigest, planDigest)) {
79
+ if (newest(matched))
80
+ matched = r;
81
+ }
82
+ else if (newest(mismatched)) {
83
+ mismatched = r;
84
+ }
85
+ }
86
+ if (matched)
87
+ return { resolution: matched };
88
+ return mismatched ? { mismatched } : {};
89
+ }