@intentius/chant 0.100.0 → 0.102.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (608) hide show
  1. package/dist/agents/checks.d.ts.map +1 -1
  2. package/dist/attrref.d.ts.map +1 -1
  3. package/dist/audit/discover.d.ts.map +1 -1
  4. package/dist/audit/nginx.d.ts.map +1 -1
  5. package/dist/audit/prior-art.d.ts +48 -0
  6. package/dist/audit/prior-art.d.ts.map +1 -1
  7. package/dist/behaviour-kinds.d.ts.map +1 -1
  8. package/dist/build.d.ts +6 -0
  9. package/dist/build.d.ts.map +1 -1
  10. package/dist/builder.d.ts.map +1 -1
  11. package/dist/cli/build-options.d.ts +2 -0
  12. package/dist/cli/build-options.d.ts.map +1 -1
  13. package/dist/cli/commands/build.d.ts.map +1 -1
  14. package/dist/cli/commands/carve-emit.d.ts.map +1 -1
  15. package/dist/cli/commands/check-lexicon.d.ts +16 -0
  16. package/dist/cli/commands/check-lexicon.d.ts.map +1 -1
  17. package/dist/cli/commands/import.d.ts +8 -0
  18. package/dist/cli/commands/import.d.ts.map +1 -1
  19. package/dist/cli/commands/init-lexicon.d.ts.map +1 -1
  20. package/dist/cli/commands/init.d.ts +19 -0
  21. package/dist/cli/commands/init.d.ts.map +1 -1
  22. package/dist/cli/commands/onboard.d.ts +9 -0
  23. package/dist/cli/commands/onboard.d.ts.map +1 -1
  24. package/dist/cli/commands/pinned-upgrade.d.ts +19 -5
  25. package/dist/cli/commands/pinned-upgrade.d.ts.map +1 -1
  26. package/dist/cli/handlers/dev.d.ts.map +1 -1
  27. package/dist/cli/handlers/fan-out.d.ts.map +1 -1
  28. package/dist/cli/handlers/lifecycle.d.ts.map +1 -1
  29. package/dist/cli/handlers/misc.d.ts.map +1 -1
  30. package/dist/cli/handlers/operator.d.ts +9 -0
  31. package/dist/cli/handlers/operator.d.ts.map +1 -1
  32. package/dist/cli/handlers/run.d.ts.map +1 -1
  33. package/dist/cli/lsp/server.d.ts.map +1 -1
  34. package/dist/cli/main.d.ts.map +1 -1
  35. package/dist/cli/mcp/server.d.ts.map +1 -1
  36. package/dist/cli/mcp/tools/build.d.ts.map +1 -1
  37. package/dist/cli/mcp/tools/composites.d.ts.map +1 -1
  38. package/dist/cli/mcp/tools/explain.d.ts.map +1 -1
  39. package/dist/cli/mcp/tools/import.d.ts.map +1 -1
  40. package/dist/cli/mcp/tools/lint.d.ts.map +1 -1
  41. package/dist/cli/mcp/tools/scaffold.d.ts.map +1 -1
  42. package/dist/cli/mcp/tools/search.d.ts.map +1 -1
  43. package/dist/cli/mcp/workspace-tools.d.ts +9 -1
  44. package/dist/cli/mcp/workspace-tools.d.ts.map +1 -1
  45. package/dist/cli/registry.d.ts +33 -2
  46. package/dist/cli/registry.d.ts.map +1 -1
  47. package/dist/codegen/fetch.d.ts.map +1 -1
  48. package/dist/codegen/naming.d.ts.map +1 -1
  49. package/dist/codegen/pinned-upgrade.d.ts +67 -3
  50. package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
  51. package/dist/codegen/registry.d.ts.map +1 -1
  52. package/dist/components/capability-plugin-loader.d.ts.map +1 -1
  53. package/dist/components/capability.d.ts.map +1 -1
  54. package/dist/components/driver.d.ts.map +1 -1
  55. package/dist/components/fan-out.d.ts.map +1 -1
  56. package/dist/components/starter-plugin.d.ts.map +1 -1
  57. package/dist/components/verbs/process-runner.d.ts.map +1 -1
  58. package/dist/components/verbs/r2-sync.d.ts.map +1 -1
  59. package/dist/components/verbs/run-agent.d.ts.map +1 -1
  60. package/dist/components/verbs/sbom-generator.d.ts.map +1 -1
  61. package/dist/components/verbs/sign.d.ts.map +1 -1
  62. package/dist/components/verbs/verify.d.ts.map +1 -1
  63. package/dist/components/verbs/vuln-gate.d.ts.map +1 -1
  64. package/dist/components/verbs/vuln-scan.d.ts.map +1 -1
  65. package/dist/components/verbs/wrangler.d.ts.map +1 -1
  66. package/dist/composite.d.ts.map +1 -1
  67. package/dist/config.d.ts +30 -7
  68. package/dist/config.d.ts.map +1 -1
  69. package/dist/declarable.d.ts +16 -0
  70. package/dist/declarable.d.ts.map +1 -1
  71. package/dist/discovery/cache.d.ts.map +1 -1
  72. package/dist/discovery/fold-import.d.ts +15 -5
  73. package/dist/discovery/fold-import.d.ts.map +1 -1
  74. package/dist/discovery/param-deps.d.ts +16 -0
  75. package/dist/discovery/param-deps.d.ts.map +1 -1
  76. package/dist/discovery/sandbox/policy-wire.d.ts.map +1 -1
  77. package/dist/discovery/specifier-resolve.d.ts +37 -0
  78. package/dist/discovery/specifier-resolve.d.ts.map +1 -0
  79. package/dist/errors.d.ts.map +1 -1
  80. package/dist/fold/fold.d.ts +3 -1
  81. package/dist/fold/fold.d.ts.map +1 -1
  82. package/dist/graph-detail.d.ts.map +1 -1
  83. package/dist/graph-ir.d.ts.map +1 -1
  84. package/dist/graph-layout.d.ts.map +1 -1
  85. package/dist/import/base-parser.d.ts.map +1 -1
  86. package/dist/import/embedded.d.ts +7 -0
  87. package/dist/import/embedded.d.ts.map +1 -1
  88. package/dist/import/parser-options.d.ts +14 -0
  89. package/dist/import/parser-options.d.ts.map +1 -0
  90. package/dist/import/parser.d.ts +17 -0
  91. package/dist/import/parser.d.ts.map +1 -1
  92. package/dist/kubectl-context.d.ts.map +1 -1
  93. package/dist/lexicon-output.d.ts.map +1 -1
  94. package/dist/lexicon-schema.d.ts +3 -3
  95. package/dist/lexicon.d.ts +78 -3
  96. package/dist/lexicon.d.ts.map +1 -1
  97. package/dist/lifecycle/assert-live.d.ts.map +1 -1
  98. package/dist/lifecycle/gate-ledger.d.ts +15 -0
  99. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  100. package/dist/lifecycle/git.d.ts.map +1 -1
  101. package/dist/lifecycle/member-ledger.d.ts.map +1 -1
  102. package/dist/lifecycle/observe.d.ts.map +1 -1
  103. package/dist/lifecycle/plan-digest.d.ts +26 -5
  104. package/dist/lifecycle/plan-digest.d.ts.map +1 -1
  105. package/dist/lifecycle/plan-ledger.d.ts.map +1 -1
  106. package/dist/lifecycle/release-ledger.d.ts.map +1 -1
  107. package/dist/lifecycle/scenario.d.ts.map +1 -1
  108. package/dist/lifecycle/status.d.ts.map +1 -1
  109. package/dist/lifecycle/work-lease.d.ts +61 -2
  110. package/dist/lifecycle/work-lease.d.ts.map +1 -1
  111. package/dist/lint/config.d.ts +4 -4
  112. package/dist/lint/engine.d.ts +6 -0
  113. package/dist/lint/engine.d.ts.map +1 -1
  114. package/dist/lsp/lexicon-providers.d.ts.map +1 -1
  115. package/dist/op/activities/activity-contracts.d.ts +12 -11
  116. package/dist/op/activities/activity-contracts.d.ts.map +1 -1
  117. package/dist/op/activities/apply.d.ts +79 -9
  118. package/dist/op/activities/apply.d.ts.map +1 -1
  119. package/dist/op/activities/decide.d.ts.map +1 -1
  120. package/dist/op/activities/index.d.ts +1 -1
  121. package/dist/op/activities/index.d.ts.map +1 -1
  122. package/dist/op/activities/lexicon-upgrade.d.ts +44 -12
  123. package/dist/op/activities/lexicon-upgrade.d.ts.map +1 -1
  124. package/dist/op/activities/propose-upgrade.d.ts +2 -0
  125. package/dist/op/activities/propose-upgrade.d.ts.map +1 -1
  126. package/dist/op/activity-contract.d.ts +1 -1
  127. package/dist/op/activity-failure.d.ts.map +1 -1
  128. package/dist/op/activity-profiles.d.ts.map +1 -1
  129. package/dist/op/builders.d.ts.map +1 -1
  130. package/dist/op/composites/apply-op.d.ts +12 -5
  131. package/dist/op/composites/apply-op.d.ts.map +1 -1
  132. package/dist/op/composites/lexicon-upgrade-op.d.ts +22 -6
  133. package/dist/op/composites/lexicon-upgrade-op.d.ts.map +1 -1
  134. package/dist/op/decide-backend.d.ts.map +1 -1
  135. package/dist/op/decide-read-inputs.d.ts.map +1 -1
  136. package/dist/op/emulator-lifecycle.d.ts +21 -2
  137. package/dist/op/emulator-lifecycle.d.ts.map +1 -1
  138. package/dist/op/gate-approval.d.ts +5 -1
  139. package/dist/op/gate-approval.d.ts.map +1 -1
  140. package/dist/op/gate-wait.d.ts.map +1 -1
  141. package/dist/op/gate.d.ts +19 -3
  142. package/dist/op/gate.d.ts.map +1 -1
  143. package/dist/op/index.d.ts +3 -1
  144. package/dist/op/index.d.ts.map +1 -1
  145. package/dist/op/local-executor.d.ts +6 -0
  146. package/dist/op/local-executor.d.ts.map +1 -1
  147. package/dist/op/operator.d.ts.map +1 -1
  148. package/dist/op/run-context.d.ts +39 -0
  149. package/dist/op/run-context.d.ts.map +1 -0
  150. package/dist/op/run-live.d.ts.map +1 -1
  151. package/dist/op/runtimes/local.d.ts.map +1 -1
  152. package/dist/op/source-archive.d.ts.map +1 -1
  153. package/dist/op/steward-beside.d.ts.map +1 -1
  154. package/dist/op/steward-points.d.ts.map +1 -1
  155. package/dist/op/steward.d.ts.map +1 -1
  156. package/dist/op/types.d.ts +8 -3
  157. package/dist/op/types.d.ts.map +1 -1
  158. package/dist/op/work-lease-run.d.ts +24 -4
  159. package/dist/op/work-lease-run.d.ts.map +1 -1
  160. package/dist/project-root.d.ts.map +1 -1
  161. package/dist/provenance.d.ts +21 -0
  162. package/dist/provenance.d.ts.map +1 -1
  163. package/dist/pseudo-parameter.d.ts.map +1 -1
  164. package/dist/reconcile.d.ts.map +1 -1
  165. package/dist/secret-materialization.d.ts.map +1 -1
  166. package/dist/serializer.d.ts +8 -0
  167. package/dist/serializer.d.ts.map +1 -1
  168. package/dist/telemetry-attribution.d.ts +77 -0
  169. package/dist/telemetry-attribution.d.ts.map +1 -0
  170. package/dist/terraform/emit-source.d.ts.map +1 -1
  171. package/dist/terraform/parse.d.ts.map +1 -1
  172. package/dist/testing.d.ts.map +1 -1
  173. package/dist/workspace/__fixtures__/contract-repo.d.ts.map +1 -1
  174. package/dist/workspace/__fixtures__/decide-workspace.d.ts +1 -1
  175. package/dist/workspace/__fixtures__/decide-workspace.d.ts.map +1 -1
  176. package/dist/workspace/agent-cli.d.ts +88 -0
  177. package/dist/workspace/agent-cli.d.ts.map +1 -0
  178. package/dist/workspace/box-factory.d.ts +73 -0
  179. package/dist/workspace/box-factory.d.ts.map +1 -0
  180. package/dist/workspace/changes-cli.d.ts.map +1 -1
  181. package/dist/workspace/changes.d.ts +8 -1
  182. package/dist/workspace/changes.d.ts.map +1 -1
  183. package/dist/workspace/chant-migrations/chud-lexicon-exit.d.ts.map +1 -1
  184. package/dist/workspace/checks/boxes.d.ts.map +1 -1
  185. package/dist/workspace/checks/links.d.ts +1 -0
  186. package/dist/workspace/checks/links.d.ts.map +1 -1
  187. package/dist/workspace/checks/live.d.ts +40 -0
  188. package/dist/workspace/checks/live.d.ts.map +1 -0
  189. package/dist/workspace/checks.d.ts +26 -2
  190. package/dist/workspace/checks.d.ts.map +1 -1
  191. package/dist/workspace/compose-graph.d.ts +73 -0
  192. package/dist/workspace/compose-graph.d.ts.map +1 -1
  193. package/dist/workspace/conformance/index.d.ts +67 -6
  194. package/dist/workspace/conformance/index.d.ts.map +1 -1
  195. package/dist/workspace/conformance/vitest.d.ts +12 -3
  196. package/dist/workspace/conformance/vitest.d.ts.map +1 -1
  197. package/dist/workspace/conformance/writer.d.ts +368 -0
  198. package/dist/workspace/conformance/writer.d.ts.map +1 -0
  199. package/dist/workspace/decide.d.ts +1 -1
  200. package/dist/workspace/decide.d.ts.map +1 -1
  201. package/dist/workspace/declaration.d.ts +119 -0
  202. package/dist/workspace/declaration.d.ts.map +1 -1
  203. package/dist/workspace/declaration.schema.json +368 -4
  204. package/dist/workspace/export-cli.d.ts +12 -0
  205. package/dist/workspace/export-cli.d.ts.map +1 -0
  206. package/dist/workspace/export.d.ts +145 -0
  207. package/dist/workspace/export.d.ts.map +1 -0
  208. package/dist/workspace/generated-files.d.ts.map +1 -1
  209. package/dist/workspace/graph-cache.d.ts.map +1 -1
  210. package/dist/workspace/graph-cli.d.ts +2 -0
  211. package/dist/workspace/graph-cli.d.ts.map +1 -1
  212. package/dist/workspace/identity.d.ts +111 -0
  213. package/dist/workspace/identity.d.ts.map +1 -0
  214. package/dist/workspace/import.d.ts +73 -0
  215. package/dist/workspace/import.d.ts.map +1 -0
  216. package/dist/workspace/intent-cli.d.ts +7 -4
  217. package/dist/workspace/intent-cli.d.ts.map +1 -1
  218. package/dist/workspace/intent-record.d.ts +8 -1
  219. package/dist/workspace/intent-record.d.ts.map +1 -1
  220. package/dist/workspace/intent.d.ts +149 -5
  221. package/dist/workspace/intent.d.ts.map +1 -1
  222. package/dist/workspace/kinds.d.ts +24 -6
  223. package/dist/workspace/kinds.d.ts.map +1 -1
  224. package/dist/workspace/lineage-adopt-cli.d.ts +15 -0
  225. package/dist/workspace/lineage-adopt-cli.d.ts.map +1 -0
  226. package/dist/workspace/lineage-adopt.d.ts +106 -0
  227. package/dist/workspace/lineage-adopt.d.ts.map +1 -0
  228. package/dist/workspace/lineage-check.d.ts +9 -2
  229. package/dist/workspace/lineage-check.d.ts.map +1 -1
  230. package/dist/workspace/lineage-cli.d.ts +6 -1
  231. package/dist/workspace/lineage-cli.d.ts.map +1 -1
  232. package/dist/workspace/lineage-hash-index.d.ts +110 -0
  233. package/dist/workspace/lineage-hash-index.d.ts.map +1 -0
  234. package/dist/workspace/lineage-init.d.ts +10 -0
  235. package/dist/workspace/lineage-init.d.ts.map +1 -1
  236. package/dist/workspace/lineage-lock.d.ts +149 -2
  237. package/dist/workspace/lineage-lock.d.ts.map +1 -1
  238. package/dist/workspace/lineage-migrations.d.ts +15 -3
  239. package/dist/workspace/lineage-migrations.d.ts.map +1 -1
  240. package/dist/workspace/lineage-provenance.d.ts +18 -0
  241. package/dist/workspace/lineage-provenance.d.ts.map +1 -0
  242. package/dist/workspace/lineage-upgrade-cli.d.ts +2 -0
  243. package/dist/workspace/lineage-upgrade-cli.d.ts.map +1 -1
  244. package/dist/workspace/lineage-upgrade.d.ts +30 -1
  245. package/dist/workspace/lineage-upgrade.d.ts.map +1 -1
  246. package/dist/workspace/lineage-versions.d.ts +116 -0
  247. package/dist/workspace/lineage-versions.d.ts.map +1 -0
  248. package/dist/workspace/links.d.ts +31 -5
  249. package/dist/workspace/links.d.ts.map +1 -1
  250. package/dist/workspace/ls-generated.d.ts +37 -0
  251. package/dist/workspace/ls-generated.d.ts.map +1 -0
  252. package/dist/workspace/ls.d.ts +4 -0
  253. package/dist/workspace/ls.d.ts.map +1 -1
  254. package/dist/workspace/member-commands.d.ts.map +1 -1
  255. package/dist/workspace/nested-graph.d.ts +56 -0
  256. package/dist/workspace/nested-graph.d.ts.map +1 -0
  257. package/dist/workspace/nesting.d.ts +21 -0
  258. package/dist/workspace/nesting.d.ts.map +1 -0
  259. package/dist/workspace/pin-cli.d.ts +10 -0
  260. package/dist/workspace/pin-cli.d.ts.map +1 -0
  261. package/dist/workspace/pin-integrity.d.ts +51 -0
  262. package/dist/workspace/pin-integrity.d.ts.map +1 -0
  263. package/dist/workspace/points.d.ts.map +1 -1
  264. package/dist/workspace/principal-classes.d.ts +114 -0
  265. package/dist/workspace/principal-classes.d.ts.map +1 -0
  266. package/dist/workspace/reason-codes.d.ts +47 -3
  267. package/dist/workspace/reason-codes.d.ts.map +1 -1
  268. package/dist/workspace/record-assets.d.ts.map +1 -1
  269. package/dist/workspace/record-sessions.d.ts +7 -11
  270. package/dist/workspace/record-sessions.d.ts.map +1 -1
  271. package/dist/workspace/records-checkout.d.ts +54 -0
  272. package/dist/workspace/records-checkout.d.ts.map +1 -0
  273. package/dist/workspace/records-cli.d.ts +57 -2
  274. package/dist/workspace/records-cli.d.ts.map +1 -1
  275. package/dist/workspace/records-close.d.ts +5 -2
  276. package/dist/workspace/records-close.d.ts.map +1 -1
  277. package/dist/workspace/records-since.d.ts.map +1 -1
  278. package/dist/workspace/records-write.d.ts +23 -4
  279. package/dist/workspace/records-write.d.ts.map +1 -1
  280. package/dist/workspace/records.d.ts +58 -5
  281. package/dist/workspace/records.d.ts.map +1 -1
  282. package/dist/workspace/returns.d.ts +129 -0
  283. package/dist/workspace/returns.d.ts.map +1 -0
  284. package/dist/workspace/runs-cli.d.ts +164 -0
  285. package/dist/workspace/runs-cli.d.ts.map +1 -0
  286. package/dist/workspace/runs.d.ts +423 -0
  287. package/dist/workspace/runs.d.ts.map +1 -0
  288. package/dist/workspace/source-block.d.ts +1 -1
  289. package/dist/workspace/source-block.d.ts.map +1 -1
  290. package/dist/workspace/status-gates.d.ts +15 -3
  291. package/dist/workspace/status-gates.d.ts.map +1 -1
  292. package/dist/workspace/status.d.ts +10 -0
  293. package/dist/workspace/status.d.ts.map +1 -1
  294. package/dist/workspace/symbols.d.ts +52 -0
  295. package/dist/workspace/symbols.d.ts.map +1 -0
  296. package/dist/workspace/template-manifest.d.ts +11 -3
  297. package/dist/workspace/template-manifest.d.ts.map +1 -1
  298. package/dist/workspace/trailer-joins.d.ts +46 -0
  299. package/dist/workspace/trailer-joins.d.ts.map +1 -0
  300. package/dist/workspace/trailers.d.ts +89 -0
  301. package/dist/workspace/trailers.d.ts.map +1 -0
  302. package/dist/workspace/trust/attestor.d.ts +8 -0
  303. package/dist/workspace/trust/attestor.d.ts.map +1 -1
  304. package/dist/workspace/trust/dsse.d.ts +58 -0
  305. package/dist/workspace/trust/dsse.d.ts.map +1 -0
  306. package/dist/workspace/trust/evidence-cli.d.ts +66 -0
  307. package/dist/workspace/trust/evidence-cli.d.ts.map +1 -0
  308. package/dist/workspace/trust/evidence.d.ts +93 -0
  309. package/dist/workspace/trust/evidence.d.ts.map +1 -0
  310. package/dist/workspace/trust/policy.d.ts +54 -1
  311. package/dist/workspace/trust/policy.d.ts.map +1 -1
  312. package/dist/workspace/trust/provenance.d.ts +21 -1
  313. package/dist/workspace/trust/provenance.d.ts.map +1 -1
  314. package/dist/workspace/trust/rotation.d.ts +132 -0
  315. package/dist/workspace/trust/rotation.d.ts.map +1 -0
  316. package/dist/workspace/trust/seal.d.ts +33 -0
  317. package/dist/workspace/trust/seal.d.ts.map +1 -1
  318. package/dist/workspace/trust/signers-cli.d.ts +49 -0
  319. package/dist/workspace/trust/signers-cli.d.ts.map +1 -0
  320. package/dist/workspace/trust/ssh-commit.d.ts +12 -0
  321. package/dist/workspace/trust/ssh-commit.d.ts.map +1 -1
  322. package/dist/workspace/trust/test-repo.d.ts +13 -0
  323. package/dist/workspace/trust/test-repo.d.ts.map +1 -1
  324. package/dist/workspace/trust/verify.d.ts +15 -0
  325. package/dist/workspace/trust/verify.d.ts.map +1 -1
  326. package/dist/workspace/work-cli.d.ts +39 -3
  327. package/dist/workspace/work-cli.d.ts.map +1 -1
  328. package/dist/workspace/work-evidence.d.ts +1 -1
  329. package/dist/workspace/work-evidence.d.ts.map +1 -1
  330. package/dist/workspace/work.d.ts +26 -1
  331. package/dist/workspace/work.d.ts.map +1 -1
  332. package/dist/workspace/workspace-principals.schema.json +60 -0
  333. package/dist/workspace/write-scope.d.ts +259 -0
  334. package/dist/workspace/write-scope.d.ts.map +1 -0
  335. package/dist/yaml.d.ts +21 -39
  336. package/dist/yaml.d.ts.map +1 -1
  337. package/package.json +2 -2
  338. package/src/audit/prior-art.ts +15 -0
  339. package/src/build.ts +8 -0
  340. package/src/cli/build-options.ts +4 -1
  341. package/src/cli/commands/__fixtures__/init-lexicon-output/package.json +1 -1
  342. package/src/cli/commands/build.ts +2 -0
  343. package/src/cli/commands/carve-emit-state.test.ts +4 -0
  344. package/src/cli/commands/carve-emit.ts +5 -19
  345. package/src/cli/commands/check-lexicon.test.ts +62 -1
  346. package/src/cli/commands/check-lexicon.ts +36 -6
  347. package/src/cli/commands/import-live.test.ts +87 -1
  348. package/src/cli/commands/import-parser-options.test.ts +133 -0
  349. package/src/cli/commands/import.ts +69 -25
  350. package/src/cli/commands/init-lexicon/templates/project.ts +1 -1
  351. package/src/cli/commands/init.test.ts +8 -1
  352. package/src/cli/commands/init.ts +23 -8
  353. package/src/cli/commands/lint.test.ts +37 -0
  354. package/src/cli/commands/onboard.test.ts +53 -3
  355. package/src/cli/commands/onboard.ts +52 -4
  356. package/src/cli/commands/pinned-upgrade.ts +73 -33
  357. package/src/cli/handlers/__snapshots__/build-member.test.ts.snap +2 -2
  358. package/src/cli/handlers/components.ts +2 -2
  359. package/src/cli/handlers/dev.ts +8 -6
  360. package/src/cli/handlers/fan-out.test.ts +6 -6
  361. package/src/cli/handlers/fan-out.ts +2 -1
  362. package/src/cli/handlers/graph.test.ts +42 -0
  363. package/src/cli/handlers/graph.ts +22 -0
  364. package/src/cli/handlers/lifecycle.test.ts +67 -0
  365. package/src/cli/handlers/lifecycle.ts +6 -5
  366. package/src/cli/handlers/misc.ts +2 -0
  367. package/src/cli/handlers/operator.ts +88 -4
  368. package/src/cli/handlers/run.test.ts +111 -0
  369. package/src/cli/handlers/run.ts +85 -24
  370. package/src/cli/handlers/scenario.ts +2 -2
  371. package/src/cli/main.test.ts +33 -0
  372. package/src/cli/main.ts +168 -17
  373. package/src/cli/mcp/workspace-tools.test.ts +5 -2
  374. package/src/cli/mcp/workspace-tools.ts +62 -4
  375. package/src/cli/registry.ts +33 -2
  376. package/src/cli/serve-mcp-workspace.test.ts +1 -1
  377. package/src/codegen/pinned-upgrade-multi.test.ts +157 -0
  378. package/src/codegen/pinned-upgrade-tags.test.ts +112 -0
  379. package/src/codegen/pinned-upgrade.test.ts +104 -0
  380. package/src/codegen/pinned-upgrade.ts +250 -56
  381. package/src/codegen/release-wiring.test.ts +5 -1
  382. package/src/codegen/testdata/postgres-tags.json +242 -0
  383. package/src/components/fan-out-output.test.ts +1 -1
  384. package/src/components/fan-out.test.ts +1 -1
  385. package/src/components/promote.test.ts +1 -1
  386. package/src/config.test.ts +21 -0
  387. package/src/config.ts +27 -0
  388. package/src/content-digest.test.ts +2 -2
  389. package/src/declarable.test.ts +21 -0
  390. package/src/declarable.ts +19 -0
  391. package/src/discovery/fold-composite.test.ts +41 -5
  392. package/src/discovery/fold-import.test.ts +129 -0
  393. package/src/discovery/fold-import.ts +643 -131
  394. package/src/discovery/fold-package-composite.test.ts +264 -0
  395. package/src/discovery/fold-specifiers.test.ts +191 -0
  396. package/src/discovery/param-deps.test.ts +66 -1
  397. package/src/discovery/param-deps.ts +45 -0
  398. package/src/discovery/specifier-resolve.ts +344 -0
  399. package/src/fold/fold.test.ts +39 -1
  400. package/src/fold/fold.ts +83 -9
  401. package/src/fold-provenance.test.ts +140 -0
  402. package/src/graph-ir.test.ts +83 -0
  403. package/src/graph-ir.ts +29 -0
  404. package/src/import/embedded.test.ts +20 -0
  405. package/src/import/embedded.ts +13 -0
  406. package/src/import/parser-options.ts +46 -0
  407. package/src/import/parser.ts +20 -0
  408. package/src/lexicon.ts +79 -3
  409. package/src/lifecycle/gate-ledger.test.ts +14 -0
  410. package/src/lifecycle/gate-ledger.ts +18 -1
  411. package/src/lifecycle/observe.test.ts +18 -0
  412. package/src/lifecycle/observe.ts +6 -4
  413. package/src/lifecycle/plan-digest.test.ts +54 -3
  414. package/src/lifecycle/plan-digest.ts +38 -8
  415. package/src/lifecycle/snapshot.ts +2 -2
  416. package/src/lifecycle/work-lease.test.ts +1 -1
  417. package/src/lifecycle/work-lease.ts +93 -2
  418. package/src/lint/engine.test.ts +55 -0
  419. package/src/lint/engine.ts +30 -4
  420. package/src/lint/output-docs.test.ts +59 -56
  421. package/src/op/activities/activity-contracts.ts +1 -0
  422. package/src/op/activities/apply.test.ts +189 -5
  423. package/src/op/activities/apply.ts +230 -8
  424. package/src/op/activities/index.ts +3 -0
  425. package/src/op/activities/lexicon-upgrade.test.ts +160 -6
  426. package/src/op/activities/lexicon-upgrade.ts +154 -51
  427. package/src/op/activities/propose-upgrade.ts +8 -5
  428. package/src/op/composites/apply-op.ts +12 -5
  429. package/src/op/composites/composites.test.ts +30 -3
  430. package/src/op/composites/lexicon-upgrade-op.test.ts +7 -2
  431. package/src/op/composites/lexicon-upgrade-op.ts +29 -8
  432. package/src/op/emulator-lifecycle.test.ts +23 -0
  433. package/src/op/emulator-lifecycle.ts +52 -14
  434. package/src/op/gate-approval.test.ts +91 -0
  435. package/src/op/gate-approval.ts +5 -1
  436. package/src/op/gate.ts +34 -8
  437. package/src/op/index.ts +3 -1
  438. package/src/op/local-executor.test.ts +15 -0
  439. package/src/op/local-executor.ts +40 -12
  440. package/src/op/local-output.ts +1 -1
  441. package/src/op/operator.ts +4 -0
  442. package/src/op/run-context.test.ts +141 -0
  443. package/src/op/run-context.ts +51 -0
  444. package/src/op/runtimes/local.test.ts +14 -0
  445. package/src/op/runtimes/local.ts +2 -0
  446. package/src/op/steward-beside.ts +2 -0
  447. package/src/op/types.ts +8 -3
  448. package/src/op/work-lease-run.test.ts +47 -0
  449. package/src/op/work-lease-run.ts +73 -11
  450. package/src/provenance.ts +35 -0
  451. package/src/serializer.ts +9 -0
  452. package/src/telemetry-attribution.test.ts +91 -0
  453. package/src/telemetry-attribution.ts +145 -0
  454. package/src/workspace/__fixtures__/studio-template-84c8b21.json +1 -1
  455. package/src/workspace/agent-cli.ts +138 -0
  456. package/src/workspace/agent.schema.json +378 -0
  457. package/src/workspace/behold-kinds.test.ts +1 -1
  458. package/src/workspace/box-factory.test.ts +320 -0
  459. package/src/workspace/box-factory.ts +103 -0
  460. package/src/workspace/changes-cli.ts +5 -0
  461. package/src/workspace/changes.schema.json +171 -1
  462. package/src/workspace/changes.ts +61 -4
  463. package/src/workspace/check-live.test.ts +192 -0
  464. package/src/workspace/check.schema.json +64 -0
  465. package/src/workspace/checks/boxes.test.ts +2 -0
  466. package/src/workspace/checks/links.ts +23 -2
  467. package/src/workspace/checks/live.ts +113 -0
  468. package/src/workspace/checks.test.ts +2 -2
  469. package/src/workspace/checks.ts +49 -8
  470. package/src/workspace/compose-graph.test.ts +47 -0
  471. package/src/workspace/compose-graph.ts +127 -3
  472. package/src/workspace/conformance/__fixture__/decisions/decision.kind.mjs +7 -1
  473. package/src/workspace/conformance/__fixture__/decisions/decision.schema.json +5 -0
  474. package/src/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +27 -0
  475. package/src/workspace/conformance/__writer_fixture__/answers/answer.schema.json +95 -0
  476. package/src/workspace/conformance/__writer_fixture__/decisions/points.json +132 -0
  477. package/src/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +48 -0
  478. package/src/workspace/conformance/__writer_fixture__/sessions/session.schema.json +108 -0
  479. package/src/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
  480. package/src/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
  481. package/src/workspace/conformance/__writer_fixture__/work/work.schema.json +578 -0
  482. package/src/workspace/conformance/conformance.e2e.test.ts +35 -3
  483. package/src/workspace/conformance/index.mjs +30 -3
  484. package/src/workspace/conformance/index.ts +103 -15
  485. package/src/workspace/conformance/vitest.ts +44 -2
  486. package/src/workspace/conformance/writer-conformance.e2e.test.ts +131 -0
  487. package/src/workspace/conformance/writer.test.ts +156 -0
  488. package/src/workspace/conformance/writer.ts +880 -0
  489. package/src/workspace/decide.ts +7 -1
  490. package/src/workspace/declaration.schema.json +368 -4
  491. package/src/workspace/declaration.ts +270 -1
  492. package/src/workspace/declared-kinds.test.ts +33 -0
  493. package/src/workspace/evidence.schema.json +279 -0
  494. package/src/workspace/export-cli.ts +180 -0
  495. package/src/workspace/export-import.test.ts +282 -0
  496. package/src/workspace/export.ts +486 -0
  497. package/src/workspace/graph-cli.ts +51 -2
  498. package/src/workspace/graph-contract.test.ts +89 -4
  499. package/src/workspace/graph.schema.json +453 -1
  500. package/src/workspace/identity.test.ts +196 -0
  501. package/src/workspace/identity.ts +186 -0
  502. package/src/workspace/import.ts +325 -0
  503. package/src/workspace/intent-cli.ts +64 -10
  504. package/src/workspace/intent-record.schema.json +208 -0
  505. package/src/workspace/intent-record.ts +35 -1
  506. package/src/workspace/intent-why.test.ts +274 -0
  507. package/src/workspace/intent.schema.json +718 -7
  508. package/src/workspace/intent.test.ts +11 -2
  509. package/src/workspace/intent.ts +495 -32
  510. package/src/workspace/kinds.test.ts +5 -5
  511. package/src/workspace/kinds.ts +62 -33
  512. package/src/workspace/lineage-adopt-cli.ts +103 -0
  513. package/src/workspace/lineage-adopt.test.ts +552 -0
  514. package/src/workspace/lineage-adopt.ts +452 -0
  515. package/src/workspace/lineage-check.ts +26 -5
  516. package/src/workspace/lineage-cli.ts +12 -2
  517. package/src/workspace/lineage-hash-index.ts +305 -0
  518. package/src/workspace/lineage-init.test.ts +9 -0
  519. package/src/workspace/lineage-init.ts +29 -9
  520. package/src/workspace/lineage-lock.ts +54 -0
  521. package/src/workspace/lineage-migrations.test.ts +27 -0
  522. package/src/workspace/lineage-migrations.ts +44 -14
  523. package/src/workspace/lineage-provenance.ts +40 -0
  524. package/src/workspace/lineage-upgrade-cli.ts +9 -5
  525. package/src/workspace/lineage-upgrade.test.ts +92 -1
  526. package/src/workspace/lineage-upgrade.ts +111 -16
  527. package/src/workspace/lineage-versions.ts +348 -0
  528. package/src/workspace/links.test.ts +121 -2
  529. package/src/workspace/links.ts +97 -6
  530. package/src/workspace/ls-contract.test.ts +84 -1
  531. package/src/workspace/ls-generated.ts +111 -0
  532. package/src/workspace/ls.schema.json +19 -0
  533. package/src/workspace/ls.ts +8 -1
  534. package/src/workspace/member-commands.ts +3 -1
  535. package/src/workspace/nested-graph.test.ts +176 -0
  536. package/src/workspace/nested-graph.ts +169 -0
  537. package/src/workspace/nesting.ts +37 -0
  538. package/src/workspace/pin-cli.test.ts +71 -0
  539. package/src/workspace/pin-cli.ts +57 -0
  540. package/src/workspace/pin-integrity.test.ts +121 -0
  541. package/src/workspace/pin-integrity.ts +104 -0
  542. package/src/workspace/points-write.schema.json +2 -0
  543. package/src/workspace/principal-classes.test.ts +175 -0
  544. package/src/workspace/principal-classes.ts +307 -0
  545. package/src/workspace/read-contract.test.ts +24 -0
  546. package/src/workspace/reason-codes.test.ts +20 -2
  547. package/src/workspace/reason-codes.ts +53 -3
  548. package/src/workspace/record-sessions.ts +12 -14
  549. package/src/workspace/records-amend.schema.json +6 -0
  550. package/src/workspace/records-checkout.ts +106 -0
  551. package/src/workspace/records-cli.ts +195 -22
  552. package/src/workspace/records-close.schema.json +7 -2
  553. package/src/workspace/records-close.ts +10 -2
  554. package/src/workspace/records-formats.test.ts +13 -5
  555. package/src/workspace/records-new.schema.json +6 -0
  556. package/src/workspace/records-review.schema.json +6 -0
  557. package/src/workspace/records-sessions.test.ts +23 -6
  558. package/src/workspace/records-uncommitted.test.ts +171 -0
  559. package/src/workspace/records-write.test.ts +65 -8
  560. package/src/workspace/records-write.ts +92 -6
  561. package/src/workspace/records.schema.json +127 -4
  562. package/src/workspace/records.ts +123 -5
  563. package/src/workspace/returns.ts +328 -0
  564. package/src/workspace/runs-cli.ts +381 -0
  565. package/src/workspace/runs-write.schema.json +583 -0
  566. package/src/workspace/runs.schema.json +810 -0
  567. package/src/workspace/runs.test.ts +242 -0
  568. package/src/workspace/runs.ts +709 -0
  569. package/src/workspace/signers.schema.json +206 -0
  570. package/src/workspace/status-contract.test.ts +5 -0
  571. package/src/workspace/status-gates.ts +24 -9
  572. package/src/workspace/status.schema.json +127 -2
  573. package/src/workspace/status.ts +21 -1
  574. package/src/workspace/symbols.ts +180 -0
  575. package/src/workspace/template-manifest.ts +22 -4
  576. package/src/workspace/trailer-joins.test.ts +171 -0
  577. package/src/workspace/trailer-joins.ts +82 -0
  578. package/src/workspace/trailers.ts +148 -0
  579. package/src/workspace/trust/attestor.ts +15 -0
  580. package/src/workspace/trust/dsse.ts +134 -0
  581. package/src/workspace/trust/evidence-cli.ts +195 -0
  582. package/src/workspace/trust/evidence.test.ts +241 -0
  583. package/src/workspace/trust/evidence.ts +207 -0
  584. package/src/workspace/trust/policy.ts +110 -3
  585. package/src/workspace/trust/provenance.ts +41 -4
  586. package/src/workspace/trust/record-seal.test.ts +1 -1
  587. package/src/workspace/trust/rotation.test.ts +258 -0
  588. package/src/workspace/trust/rotation.ts +336 -0
  589. package/src/workspace/trust/seal.ts +63 -1
  590. package/src/workspace/trust/signers-cli.ts +178 -0
  591. package/src/workspace/trust/ssh-commit.ts +53 -4
  592. package/src/workspace/trust/test-repo.ts +18 -0
  593. package/src/workspace/trust/trust.test.ts +8 -2
  594. package/src/workspace/trust/verify-cli.ts +1 -0
  595. package/src/workspace/trust/verify.ts +22 -0
  596. package/src/workspace/work-cli.e2e.test.ts +28 -1
  597. package/src/workspace/work-cli.ts +133 -8
  598. package/src/workspace/work-evidence.schema.json +6 -0
  599. package/src/workspace/work-history.schema.json +73 -1
  600. package/src/workspace/work-history.test.ts +48 -5
  601. package/src/workspace/work-kind-fields.test.ts +154 -0
  602. package/src/workspace/work-lease.schema.json +14 -1
  603. package/src/workspace/work.ts +82 -0
  604. package/src/workspace/workspace-principals.schema.json +60 -0
  605. package/src/workspace/write-scope.test.ts +466 -0
  606. package/src/workspace/write-scope.ts +573 -0
  607. package/src/yaml.test.ts +111 -1
  608. package/src/yaml.ts +141 -549
@@ -107,6 +107,72 @@ export interface ChangesPolicy {
107
107
  ignore: string[];
108
108
  }
109
109
 
110
+ /** The core principal classes (#2524 D5). A pinned package may supply domain classes too (#3080, `principal-classes.ts`). */
111
+ export const PRINCIPAL_CLASSES = ["human", "agent", "runner", "service"] as const;
112
+ export type CorePrincipalClass = (typeof PRINCIPAL_CLASSES)[number];
113
+ /** A class name: a core class, or a domain class a pinned package supplies (#3080). */
114
+ export type PrincipalClass = string;
115
+
116
+ /** How a record is written, as the records commands name it (#2548). */
117
+ export const WRITE_VERBS = ["new", "amend", "review", "close"] as const;
118
+ export type WriteVerb = (typeof WRITE_VERBS)[number];
119
+
120
+ /** One principal class's entry in the declaration's `writeScope` (#2548, ws-067). */
121
+ export interface ClassScope {
122
+ /** The members whose files the class may write, or null for every path. Always null for the agent class: a session writes its own member. */
123
+ members: string[] | null;
124
+ /** Kind name to the verbs the class may write it with, or null for every kind in reach with every verb. */
125
+ records: Record<string, WriteVerb[]> | null;
126
+ /** Paths the class may not write even inside a member it may (#3146, ws-077), in file order. Empty when the entry lists none. */
127
+ protected: ProtectedPath[];
128
+ pointer: string;
129
+ }
130
+
131
+ /**
132
+ * A protected path in a write scope (#3146, ws-077): a glob from the
133
+ * workspace root. It protects the files it matches and everything under a
134
+ * directory it matches. `except` names top-level keys of a JSON file a write
135
+ * may still change; empty when the entry allows none.
136
+ */
137
+ export interface ProtectedPath {
138
+ path: string;
139
+ except: string[];
140
+ }
141
+
142
+ /**
143
+ * The declaration's `writeScope` block: an entry per restricted class, in
144
+ * file order. A class with no entry is not restricted. A key may name a
145
+ * domain class a pinned package supplies (#3080); whether one does is known
146
+ * only once the pins are read, so an unknown key is judged where the scope
147
+ * is applied, not here.
148
+ */
149
+ export type WriteScope = Record<PrincipalClass, ClassScope>;
150
+
151
+ /** A gate the declaration's `identity.gates` names (#3163, ws-080): it passes only on a signed approval. */
152
+ export interface SignedGate {
153
+ gate: string;
154
+ /** The class the signer must be in, or null for any signer the signers file at base lists. */
155
+ class: PrincipalClass | null;
156
+ pointer: string;
157
+ }
158
+
159
+ /** The declaration's `identity` block (#3163, ws-080), read at base. */
160
+ export interface IdentityPolicy {
161
+ /** `identified`: a person-attributed write must name a forge identity, a signer at base, or an agent, runner or service principal. */
162
+ attribution: "any" | "identified";
163
+ /** By gate name. */
164
+ gates: Record<string, SignedGate>;
165
+ }
166
+
167
+ /** An agent session the declaration names (#2524 D20, #2548): bound to one member. */
168
+ export interface AgentDeclaration {
169
+ name: string;
170
+ member: string;
171
+ /** Principals that write only as this session. */
172
+ principals: string[];
173
+ pointer: string;
174
+ }
175
+
110
176
  export interface MemberRole {
111
177
  name: string;
112
178
  /** Relative to the member's directory, or null for the whole member. */
@@ -135,6 +201,8 @@ export interface LinkDeclaration {
135
201
  output: string;
136
202
  /** The link kind as written, or null for the default (`output`). */
137
203
  kind: string | null;
204
+ /** A telemetry link's OTLP protocol as written (#2558), or null. */
205
+ protocol: string | null;
138
206
  /** The link's JSON Pointer in the file, for messages. */
139
207
  pointer: string;
140
208
  }
@@ -223,10 +291,63 @@ export interface BoxDeclaration {
223
291
  * `spriteApplyServices` read them with `box: true`.
224
292
  */
225
293
  services: BoxService[];
294
+ /** What the box builds and how (#3146, ws-077), or null when the block declares no factory. */
295
+ factory: BoxFactory | null;
296
+ /** What the box shows of itself on a home site (#3146), or null when the block declares no listing. */
297
+ listing: BoxListing | null;
298
+ /** The block's JSON Pointer in the file, for messages. */
299
+ pointer: string;
300
+ }
301
+
302
+ /** What a check command is (#3146). */
303
+ export const FACTORY_CHECK_KINDS = ["test", "build", "lint", "plan", "conformance"] as const;
304
+ export type FactoryCheckKind = (typeof FACTORY_CHECK_KINDS)[number];
305
+
306
+ /**
307
+ * A box's factory (#3146, ws-077): what it builds, how a build is checked,
308
+ * which member declares the builder agents and where a finished build is
309
+ * published. Defaults are filled in, so a reader never guesses one.
310
+ */
311
+ export interface BoxFactory {
312
+ /** The members the factory builds, in file order; at least one. */
313
+ builds: string[];
314
+ /** The verdict command, run from the workspace root, or null when none is declared. */
315
+ check: { run: string; kind: FactoryCheckKind } | null;
316
+ /** Where a work item's builder writes its check, from the workspace root, or null for the orchestrator's choice. */
317
+ checks: string | null;
318
+ /** The member that declares the builder agents, or null when none is named. */
319
+ builders: string | null;
320
+ /** Where a finished build is published, or null when the factory doesn't publish past the box. */
321
+ publish: FactoryPublish | null;
226
322
  /** The block's JSON Pointer in the file, for messages. */
227
323
  pointer: string;
228
324
  }
229
325
 
326
+ /** Where a finished build goes (#3146): its branch is pushed and a pull request opened against `repo`'s `base`. */
327
+ export interface FactoryPublish {
328
+ forge: "github";
329
+ /** owner/name. */
330
+ repo: string;
331
+ /** The branch the pull request targets, or null for the repository's default branch. */
332
+ base: string | null;
333
+ /** What the published branch's name starts with, before the work item's id. */
334
+ branchPrefix: string;
335
+ /** The repository the branch is pushed to when it isn't `repo` (a fork), as owner/name, or null. */
336
+ head: string | null;
337
+ }
338
+
339
+ /** The branch prefix a publish target uses when it names none: the work lease's own branch. */
340
+ export const DEFAULT_PUBLISH_BRANCH_PREFIX = "chant/work/";
341
+
342
+ /** What a box shows of itself (#3146, #3154). */
343
+ export interface BoxListing {
344
+ published: boolean;
345
+ title: string;
346
+ line: string;
347
+ /** The cover image, from the workspace root, or null. */
348
+ cover: string | null;
349
+ }
350
+
230
351
  /** A service a box runs under its supervisor (#2880). */
231
352
  export interface BoxService {
232
353
  /** Unique in the box. */
@@ -292,6 +413,8 @@ export interface Member {
292
413
  box: BoxDeclaration | null;
293
414
  upstream: string | null;
294
415
  because: string | null;
416
+ /** Whether `chant workspace export` takes the member (#2552, D10). False when the entry does not say. */
417
+ travel: boolean;
295
418
  suppress: Suppression[];
296
419
  /** The entry's JSON Pointer in the file, for messages. */
297
420
  pointer: string;
@@ -338,6 +461,12 @@ export interface Declaration {
338
461
  hosts: Host[];
339
462
  /** The forward coverage check's policy (#2773), or null when the declaration has no `changes` block. */
340
463
  changes: ChangesPolicy | null;
464
+ /** Who may write what (#2548), or null when the declaration has no `writeScope` block. */
465
+ writeScope: WriteScope | null;
466
+ /** The agent sessions, in file order (#2548). */
467
+ agents: AgentDeclaration[];
468
+ /** Who a person-attributed write may name, and which gates need a signed approval (#3163), or null when the declaration has no `identity` block. */
469
+ identity: IdentityPolicy | null;
341
470
  /** The file, relative to the workspace root's tree (`chant.workspace.json` or `.jsonc`). */
342
471
  file: string;
343
472
  }
@@ -543,10 +672,11 @@ export function parseDeclaration(text: string, file: string, reader: string = re
543
672
  handWritten: g.handWritten ? { because: (g.handWritten as { because: string }).because } : null,
544
673
  pointer: `${pointer}/generated/${j}`,
545
674
  }));
546
- const links = ((e.links as { member: string; output: string; kind?: string }[] | undefined) ?? []).map((l, j) => ({
675
+ const links = ((e.links as { member: string; output: string; kind?: string; protocol?: string }[] | undefined) ?? []).map((l, j) => ({
547
676
  member: l.member,
548
677
  output: l.output,
549
678
  kind: l.kind ?? null,
679
+ protocol: l.protocol ?? null,
550
680
  pointer: `${pointer}/links/${j}`,
551
681
  }));
552
682
  const records = recordKindsOf(e.records, e.dir as string, e.name as string, `${pointer}/records`);
@@ -566,6 +696,7 @@ export function parseDeclaration(text: string, file: string, reader: string = re
566
696
  box,
567
697
  upstream: (e.upstream as string | undefined) ?? null,
568
698
  because: (e.because as string | undefined) ?? null,
699
+ travel: e.travel === true,
569
700
  suppress,
570
701
  pointer,
571
702
  };
@@ -660,6 +791,9 @@ export function parseDeclaration(text: string, file: string, reader: string = re
660
791
  const problem = m.box ? boxServicesProblem(m.name, m.box.services) : null;
661
792
  if (problem) throw new WorkspaceReadError("declaration-invalid", problem.message, at(problem.pointer));
662
793
  }
794
+ // One factory, building and naming declared members (#3146).
795
+ const factory = factoryProblem(members);
796
+ if (factory) throw new WorkspaceReadError("declaration-invalid", factory.message, at(factory.pointer));
663
797
 
664
798
  // A diagram name is given once across the declaration (#2764): a reader keys diagrams by name.
665
799
  const ownDiagrams = diagramsOf(obj.diagrams, null, "/diagrams");
@@ -673,6 +807,8 @@ export function parseDeclaration(text: string, file: string, reader: string = re
673
807
  }
674
808
 
675
809
  const hosts = hostsOf(obj, members, at);
810
+ const writeScope = writeScopeOf(obj.writeScope, members, at);
811
+ const agents = agentsOf(obj.agents, members, at);
676
812
 
677
813
  const pins = ((obj.pins as Record<string, string>[] | undefined) ?? []).map((p) => ({
678
814
  package: p.package ?? null,
@@ -695,10 +831,86 @@ export function parseDeclaration(text: string, file: string, reader: string = re
695
831
  diagrams: ownDiagrams,
696
832
  hosts,
697
833
  changes: changesOf(obj.changes as Record<string, unknown> | undefined),
834
+ writeScope,
835
+ agents,
836
+ identity: identityOf(obj.identity),
698
837
  file,
699
838
  };
700
839
  }
701
840
 
841
+ /**
842
+ * The `writeScope` block, already validated, with the rule the schema can't
843
+ * say (#2548): a member it names is a declared member. Its keys are kept in
844
+ * file order: the core classes and any domain class (#3080).
845
+ */
846
+ function writeScopeOf(raw: unknown, members: Member[], at: (pointer: string, key?: boolean) => ErrorLocation): WriteScope | null {
847
+ if (raw === undefined) return null;
848
+ const block = raw as Record<PrincipalClass, { members?: "*" | string[]; records?: Record<string, WriteVerb[]>; protected?: (string | { path: string; except?: string[] })[] }>;
849
+ const out: WriteScope = {};
850
+ for (const [cls, entry] of Object.entries(block)) {
851
+ const pointer = `/writeScope/${cls}`;
852
+ const list = entry.members === undefined || entry.members === "*" ? null : [...entry.members];
853
+ for (const [i, name] of (list ?? []).entries()) {
854
+ if (!members.some((m) => m.name === name)) {
855
+ throw new WorkspaceReadError(
856
+ "declaration-invalid",
857
+ `writeScope.${cls} names the member ${JSON.stringify(name)}, which the declaration does not declare; declared members: ${members.map((m) => m.name).join(", ") || "none"}`,
858
+ at(`${pointer}/members/${i}`),
859
+ );
860
+ }
861
+ }
862
+ const records = entry.records === undefined ? null : Object.fromEntries(Object.entries(entry.records).map(([k, v]) => [k, [...v]]));
863
+ const guarded = (entry.protected ?? []).map((p) => (typeof p === "string" ? { path: p, except: [] } : { path: p.path, except: [...(p.except ?? [])] }));
864
+ out[cls] = { members: list, records, protected: guarded, pointer };
865
+ }
866
+ return out;
867
+ }
868
+
869
+ /**
870
+ * The `agents` list, already validated, with the rules the schema can't say
871
+ * (#2548): names are unique, each names a declared member, and a principal
872
+ * is listed by one session at most.
873
+ */
874
+ /** The `identity` block, already validated by the schema (#3163). */
875
+ function identityOf(raw: unknown): IdentityPolicy | null {
876
+ if (raw === undefined) return null;
877
+ const block = raw as { attribution?: "any" | "identified"; gates?: Record<string, { class?: string }> };
878
+ const gates: Record<string, SignedGate> = {};
879
+ for (const [gate, entry] of Object.entries(block.gates ?? {})) {
880
+ gates[gate] = { gate, class: entry.class ?? null, pointer: `/identity/gates/${gate.replace(/~/g, "~0").replace(/\//g, "~1")}` };
881
+ }
882
+ return { attribution: block.attribution ?? "any", gates };
883
+ }
884
+
885
+ function agentsOf(raw: unknown, members: Member[], at: (pointer: string, key?: boolean) => ErrorLocation): AgentDeclaration[] {
886
+ const agents = ((raw as { name: string; member: string; principals?: string[] }[] | undefined) ?? []).map((a, i) => ({
887
+ name: a.name,
888
+ member: a.member,
889
+ principals: [...(a.principals ?? [])],
890
+ pointer: `/agents/${i}`,
891
+ }));
892
+ const byName = new Map<string, AgentDeclaration>();
893
+ const byPrincipal = new Map<string, AgentDeclaration>();
894
+ for (const a of agents) {
895
+ const first = byName.get(a.name);
896
+ if (first) throw new WorkspaceReadError("declaration-invalid", `the agent name ${JSON.stringify(a.name)} is already used by the agent at ${first.pointer}`, at(`${a.pointer}/name`));
897
+ byName.set(a.name, a);
898
+ if (!members.some((m) => m.name === a.member)) {
899
+ throw new WorkspaceReadError(
900
+ "declaration-invalid",
901
+ `agent ${a.name} is bound to ${JSON.stringify(a.member)}, which is not a declared member; an agent session is bound to one member, not an example group`,
902
+ at(`${a.pointer}/member`),
903
+ );
904
+ }
905
+ for (const [i, p] of a.principals.entries()) {
906
+ const other = byPrincipal.get(p);
907
+ if (other) throw new WorkspaceReadError("declaration-invalid", `the principal ${JSON.stringify(p)} is already listed by agent ${other.name}`, at(`${a.pointer}/principals/${i}`));
908
+ byPrincipal.set(p, a);
909
+ }
910
+ }
911
+ return agents;
912
+ }
913
+
702
914
  /** The `changes` block, already validated, with its defaults (#2773). */
703
915
  function changesOf(block: Record<string, unknown> | undefined): ChangesPolicy | null {
704
916
  if (block === undefined) return null;
@@ -751,7 +963,17 @@ function boxOf(raw: unknown, pointer: string): BoxDeclaration | null {
751
963
  cookies?: string[];
752
964
  intent?: string;
753
965
  services?: { name: string; cmd: string; needs?: string[]; httpPort?: number; duration?: string; health?: string; optional?: boolean }[];
966
+ factory?: {
967
+ builds: string[];
968
+ check?: string | { run: string; kind?: FactoryCheckKind };
969
+ checks?: string;
970
+ builders?: string;
971
+ publish?: { forge?: "github"; repo: string; base?: string; branchPrefix?: string; head?: string };
972
+ };
973
+ listing?: { published?: boolean; title?: string; line?: string; cover?: string };
754
974
  };
975
+ const f = b.factory;
976
+ const l = b.listing;
755
977
  return {
756
978
  capabilities: (b.capabilities ?? []).map((c, i) => ({ name: c.name, broker: c.broker ?? null, scope: [...(c.scope ?? [])], pointer: `${pointer}/capabilities/${i}` })),
757
979
  // The schema requires host and slot together, and host for ports, state and cookies.
@@ -770,10 +992,57 @@ function boxOf(raw: unknown, pointer: string): BoxDeclaration | null {
770
992
  optional: s.optional ?? false,
771
993
  pointer: `${pointer}/services/${i}`,
772
994
  })),
995
+ factory:
996
+ f === undefined
997
+ ? null
998
+ : {
999
+ builds: [...f.builds],
1000
+ check: f.check === undefined ? null : typeof f.check === "string" ? { run: f.check, kind: "test" } : { run: f.check.run, kind: f.check.kind ?? "test" },
1001
+ checks: f.checks ?? null,
1002
+ builders: f.builders ?? null,
1003
+ publish:
1004
+ f.publish === undefined
1005
+ ? null
1006
+ : {
1007
+ forge: f.publish.forge ?? "github",
1008
+ repo: f.publish.repo,
1009
+ base: f.publish.base ?? null,
1010
+ branchPrefix: f.publish.branchPrefix ?? DEFAULT_PUBLISH_BRANCH_PREFIX,
1011
+ head: f.publish.head ?? null,
1012
+ },
1013
+ pointer: `${pointer}/factory`,
1014
+ },
1015
+ listing: l === undefined ? null : { published: l.published ?? true, title: l.title ?? "", line: l.line ?? "", cover: l.cover ?? null },
773
1016
  pointer,
774
1017
  };
775
1018
  }
776
1019
 
1020
+ /**
1021
+ * The rules the schema can't say about the factories (#3146, ws-077): at most
1022
+ * one box block declares one, and the members its builds and builders name
1023
+ * are declared members.
1024
+ */
1025
+ function factoryProblem(members: readonly Member[]): { message: string; pointer: string } | null {
1026
+ const declaring = members.filter((m) => m.box?.factory);
1027
+ if (declaring.length > 1) {
1028
+ return {
1029
+ message: `members ${declaring[0].name} and ${declaring[1].name} both declare a factory in their box block; a workspace has one factory, so an orchestrator reads one`,
1030
+ pointer: declaring[1].box!.factory!.pointer,
1031
+ };
1032
+ }
1033
+ const factory = declaring[0]?.box?.factory;
1034
+ if (!factory) return null;
1035
+ const known = () => members.map((m) => m.name).join(", ");
1036
+ const j = factory.builds.findIndex((name) => !members.some((m) => m.name === name));
1037
+ if (j >= 0) {
1038
+ return { message: `the factory builds ${JSON.stringify(factory.builds[j])}, which is not a declared member; declared members: ${known()}`, pointer: `${factory.pointer}/builds/${j}` };
1039
+ }
1040
+ if (factory.builders !== null && !members.some((m) => m.name === factory.builders)) {
1041
+ return { message: `the factory's builders names ${JSON.stringify(factory.builders)}, which is not a declared member; declared members: ${known()}`, pointer: `${factory.pointer}/builders` };
1042
+ }
1043
+ return null;
1044
+ }
1045
+
777
1046
  /**
778
1047
  * The rules the schema can't say about a box's services (#2880), as a
779
1048
  * message and the pointer to show, or null when they hold: each name is
@@ -5,6 +5,7 @@
5
5
  * `--kind` is not given, while `--kind` still overrides.
6
6
  */
7
7
 
8
+ import { createHash } from "node:crypto";
8
9
  import { readFileSync } from "node:fs";
9
10
  import { join } from "node:path";
10
11
  import { afterAll, afterEach, beforeEach, describe, expect, test, vi } from "vitest";
@@ -199,6 +200,38 @@ describe("records without --kind reads every declared kind (#2680)", () => {
199
200
  expect(printed.kinds.map((k: { records: { id: string }[] }) => k.records.map((r) => r.id))).toEqual([["ref-001"], ["ref-001"]]);
200
201
  });
201
202
 
203
+ test("--current adds the spec: the current records of spec: true kinds, with the files they pin (#2546, #2524 D20)", async () => {
204
+ const server = "export const port = 8080;\n";
205
+ const sha256 = createHash("sha256").update(server).digest("hex");
206
+ // ref-004 supersedes ref-001 and pins the app's server file; the note kind is not part of the spec.
207
+ const ref004 = REF_001.replace('id: "ref-001"', 'id: "ref-004"')
208
+ .replace("supersedes: []", 'supersedes:\n - decision: "ref-001"')
209
+ .replace(/^evidence:\n/m, `evidence:\n - title: "The server"\n path: "app/server.mjs"\n sha256: "${sha256}"\n`);
210
+ const root = workspace({
211
+ "decisions/ref-004-how-the-app-is-deployed-now.md": ref004,
212
+ "design/notes/note.kind.mjs": NOTE_KIND.replace("spec: true", "spec: false"),
213
+ });
214
+ expect(await run(root, "--current", "--json")).toBe(0);
215
+ const printed = JSON.parse(out.join("\n"));
216
+ expectValid(printed);
217
+ expect(printed.kinds.map((k: { kind: { spec: boolean } }) => k.kind.spec)).toEqual([true, false]);
218
+ expect(printed.spec.kinds).toEqual([{ member: null, path: "decisions/decision.kind.mjs", name: null }]);
219
+ expect(printed.spec.records).toEqual([
220
+ expect.objectContaining({
221
+ kind: "decision",
222
+ id: "ref-004",
223
+ path: "decisions/ref-004-how-the-app-is-deployed-now.md",
224
+ state: "decided",
225
+ valid: true,
226
+ assets: [{ path: "app/server.mjs", sha256, actual: sha256, state: "pinned" }],
227
+ }),
228
+ ]);
229
+ // Without --current there is no spec: superseded records are still listed under kinds.
230
+ out.length = 0;
231
+ expect(await run(root, "--json")).toBe(0);
232
+ expect(JSON.parse(out.join("\n")).spec).toBeUndefined();
233
+ });
234
+
202
235
  test("a kind that can't be read is listed with its error, the others are read, and the exit code is 1", async () => {
203
236
  const root = workspace({}, [{ kind: "gone.kind.mjs" }]);
204
237
  expect(await run(root, "--json")).toBe(1);
@@ -0,0 +1,279 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://intentius.io/chant/schemas/workspace/evidence/v1/evidence.schema.json",
4
+ "title": "chant workspace evidence output",
5
+ "description": "What `chant workspace evidence verify --json` prints (#2553), and what a refused `chant workspace evidence sign --json` prints: runner evidence, an in-toto statement over record hashes in a DSSE envelope, checked offline against the runner keys `.chant/trust.json` lists at the base revision. Version 1 of the read contract. Readers ignore fields they do not know; a field is only ever added within a version. The error codes are a closed list, each in the one closed list of `reason-codes.ts`.",
6
+ "oneOf": [
7
+ {
8
+ "$ref": "#/$defs/result"
9
+ },
10
+ {
11
+ "$ref": "#/$defs/failure"
12
+ }
13
+ ],
14
+ "$defs": {
15
+ "result": {
16
+ "type": "object",
17
+ "description": "A runner key the policy at base lists signed the envelope. `status` says whether the records still hash as signed; it exits 1 when they don't.",
18
+ "required": [
19
+ "$schema",
20
+ "contract",
21
+ "chant",
22
+ "at",
23
+ "ok",
24
+ "status",
25
+ "runner",
26
+ "class",
27
+ "keyid",
28
+ "statement",
29
+ "subjects"
30
+ ],
31
+ "properties": {
32
+ "$schema": {
33
+ "const": "https://intentius.io/chant/schemas/workspace/evidence/v1/evidence.schema.json"
34
+ },
35
+ "contract": {
36
+ "const": 1
37
+ },
38
+ "chant": {
39
+ "type": "string"
40
+ },
41
+ "at": {
42
+ "type": "string",
43
+ "pattern": "^(?:[0-9a-f]{40}|[0-9a-f]{64})$",
44
+ "description": "The commit the subjects were compared at."
45
+ },
46
+ "ok": {
47
+ "const": true
48
+ },
49
+ "status": {
50
+ "enum": [
51
+ "current",
52
+ "stale"
53
+ ],
54
+ "description": "current when every subject hashes the same at `at`; stale otherwise. Stale evidence is never reused."
55
+ },
56
+ "runner": {
57
+ "type": "string",
58
+ "description": "The runner principal whose key signed."
59
+ },
60
+ "class": {
61
+ "enum": [
62
+ "runner",
63
+ "service"
64
+ ],
65
+ "description": "A CI runner or a service, as `.chant/trust.json` lists it."
66
+ },
67
+ "keyid": {
68
+ "type": "string",
69
+ "description": "The ssh SHA256 fingerprint of the key that signed."
70
+ },
71
+ "statement": {
72
+ "$ref": "#/$defs/statement"
73
+ },
74
+ "subjects": {
75
+ "type": "array",
76
+ "items": {
77
+ "$ref": "#/$defs/subject"
78
+ }
79
+ }
80
+ }
81
+ },
82
+ "statement": {
83
+ "type": "object",
84
+ "description": "The in-toto Statement v1 the runner signed.",
85
+ "required": [
86
+ "_type",
87
+ "subject",
88
+ "predicateType",
89
+ "predicate"
90
+ ],
91
+ "properties": {
92
+ "_type": {
93
+ "const": "https://in-toto.io/Statement/v1"
94
+ },
95
+ "subject": {
96
+ "type": "array",
97
+ "items": {
98
+ "type": "object",
99
+ "required": [
100
+ "name",
101
+ "digest"
102
+ ],
103
+ "properties": {
104
+ "name": {
105
+ "type": "string"
106
+ },
107
+ "digest": {
108
+ "type": "object",
109
+ "required": [
110
+ "sha256"
111
+ ],
112
+ "properties": {
113
+ "sha256": {
114
+ "type": "string",
115
+ "pattern": "^[0-9a-f]{64}$"
116
+ }
117
+ }
118
+ }
119
+ }
120
+ }
121
+ },
122
+ "predicateType": {
123
+ "const": "https://intentius.io/chant/runner-evidence/v1"
124
+ },
125
+ "predicate": {
126
+ "type": "object",
127
+ "required": [
128
+ "runner",
129
+ "commit",
130
+ "tree",
131
+ "check"
132
+ ],
133
+ "properties": {
134
+ "runner": {
135
+ "type": "string"
136
+ },
137
+ "commit": {
138
+ "type": "string",
139
+ "pattern": "^(?:[0-9a-f]{40}|[0-9a-f]{64})$"
140
+ },
141
+ "tree": {
142
+ "type": "string",
143
+ "pattern": "^(?:[0-9a-f]{40}|[0-9a-f]{64})$"
144
+ },
145
+ "check": {
146
+ "type": "string",
147
+ "description": "The check's id, as given to --check-id."
148
+ },
149
+ "claim": {
150
+ "type": "object",
151
+ "required": [
152
+ "sha256"
153
+ ],
154
+ "properties": {
155
+ "sha256": {
156
+ "type": "string",
157
+ "pattern": "^[0-9a-f]{64}$"
158
+ }
159
+ }
160
+ },
161
+ "environment": {
162
+ "type": "object",
163
+ "required": [
164
+ "sha256"
165
+ ],
166
+ "properties": {
167
+ "sha256": {
168
+ "type": "string",
169
+ "pattern": "^[0-9a-f]{64}$"
170
+ }
171
+ }
172
+ }
173
+ }
174
+ }
175
+ }
176
+ },
177
+ "subject": {
178
+ "type": "object",
179
+ "required": [
180
+ "name",
181
+ "signed",
182
+ "now",
183
+ "matches"
184
+ ],
185
+ "properties": {
186
+ "name": {
187
+ "type": "string",
188
+ "description": "The record's path from the repository root."
189
+ },
190
+ "signed": {
191
+ "type": "string",
192
+ "pattern": "^[0-9a-f]{64}$"
193
+ },
194
+ "now": {
195
+ "oneOf": [
196
+ {
197
+ "type": "null"
198
+ },
199
+ {
200
+ "type": "string",
201
+ "pattern": "^[0-9a-f]{64}$"
202
+ }
203
+ ],
204
+ "description": "The record's hash at `at`, or null when it is not there."
205
+ },
206
+ "matches": {
207
+ "type": "boolean"
208
+ }
209
+ }
210
+ },
211
+ "failure": {
212
+ "type": "object",
213
+ "description": "The evidence was refused, or could not be checked. Exits 1.",
214
+ "required": [
215
+ "$schema",
216
+ "contract",
217
+ "chant",
218
+ "at",
219
+ "error"
220
+ ],
221
+ "properties": {
222
+ "$schema": {
223
+ "const": "https://intentius.io/chant/schemas/workspace/evidence/v1/evidence.schema.json"
224
+ },
225
+ "contract": {
226
+ "const": 1
227
+ },
228
+ "chant": {
229
+ "type": "string"
230
+ },
231
+ "at": {
232
+ "oneOf": [
233
+ {
234
+ "type": "null"
235
+ },
236
+ {
237
+ "type": "string",
238
+ "pattern": "^(?:[0-9a-f]{40}|[0-9a-f]{64})$"
239
+ }
240
+ ]
241
+ },
242
+ "error": {
243
+ "type": "object",
244
+ "required": [
245
+ "code",
246
+ "message"
247
+ ],
248
+ "properties": {
249
+ "code": {
250
+ "enum": [
251
+ "not-a-git-repository",
252
+ "revision-unknown",
253
+ "trust-policy-unreadable",
254
+ "envelope-unreadable",
255
+ "envelope-invalid",
256
+ "envelope-untrusted",
257
+ "evidence-payload-type",
258
+ "evidence-statement-invalid",
259
+ "evidence-runner-mismatch",
260
+ "runner-key-invalid",
261
+ "runner-key-is-signer",
262
+ "runner-key-unlisted",
263
+ "kind-unreadable",
264
+ "kind-invalid",
265
+ "schema-unreadable",
266
+ "schema-id-mismatch",
267
+ "schema-invalid",
268
+ "location-missing"
269
+ ]
270
+ },
271
+ "message": {
272
+ "type": "string"
273
+ }
274
+ }
275
+ }
276
+ }
277
+ }
278
+ }
279
+ }