@intentius/chant 0.102.0 → 0.104.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 (464) hide show
  1. package/dist/audit/core.d.ts +2 -0
  2. package/dist/audit/core.d.ts.map +1 -1
  3. package/dist/audit/discover.d.ts.map +1 -1
  4. package/dist/change-set.d.ts +232 -0
  5. package/dist/change-set.d.ts.map +1 -0
  6. package/dist/cli/commands/audit.d.ts +7 -0
  7. package/dist/cli/commands/audit.d.ts.map +1 -1
  8. package/dist/cli/commands/build.d.ts.map +1 -1
  9. package/dist/cli/handlers/build.d.ts.map +1 -1
  10. package/dist/cli/handlers/change-set.d.ts +11 -0
  11. package/dist/cli/handlers/change-set.d.ts.map +1 -0
  12. package/dist/cli/handlers/fan-out.d.ts +33 -0
  13. package/dist/cli/handlers/fan-out.d.ts.map +1 -1
  14. package/dist/cli/handlers/operator.d.ts +7 -0
  15. package/dist/cli/handlers/operator.d.ts.map +1 -1
  16. package/dist/cli/handlers/pr.d.ts +31 -0
  17. package/dist/cli/handlers/pr.d.ts.map +1 -0
  18. package/dist/cli/handlers/run.d.ts.map +1 -1
  19. package/dist/cli/main.d.ts.map +1 -1
  20. package/dist/cli/mcp/op-tools.d.ts.map +1 -1
  21. package/dist/cli/mcp/workspace-tools.d.ts +3 -2
  22. package/dist/cli/mcp/workspace-tools.d.ts.map +1 -1
  23. package/dist/cli/registry.d.ts +63 -1
  24. package/dist/cli/registry.d.ts.map +1 -1
  25. package/dist/components/auto-release.d.ts +16 -0
  26. package/dist/components/auto-release.d.ts.map +1 -1
  27. package/dist/components/capability.d.ts +53 -0
  28. package/dist/components/capability.d.ts.map +1 -1
  29. package/dist/components/changed-files.d.ts +31 -0
  30. package/dist/components/changed-files.d.ts.map +1 -0
  31. package/dist/components/cli-support.d.ts +9 -1
  32. package/dist/components/cli-support.d.ts.map +1 -1
  33. package/dist/components/component.d.ts +24 -0
  34. package/dist/components/component.d.ts.map +1 -1
  35. package/dist/components/deploy-units.d.ts.map +1 -1
  36. package/dist/components/driver.d.ts +13 -0
  37. package/dist/components/driver.d.ts.map +1 -1
  38. package/dist/components/fan-out-output.d.ts +6 -0
  39. package/dist/components/fan-out-output.d.ts.map +1 -1
  40. package/dist/components/fan-out-record.d.ts +41 -0
  41. package/dist/components/fan-out-record.d.ts.map +1 -0
  42. package/dist/components/fan-out-run.d.ts +65 -0
  43. package/dist/components/fan-out-run.d.ts.map +1 -1
  44. package/dist/components/fan-out-support.d.ts +2 -0
  45. package/dist/components/fan-out-support.d.ts.map +1 -1
  46. package/dist/components/fan-out.d.ts +6 -0
  47. package/dist/components/fan-out.d.ts.map +1 -1
  48. package/dist/components/gated-wave-pipeline.d.ts +50 -0
  49. package/dist/components/gated-wave-pipeline.d.ts.map +1 -0
  50. package/dist/components/index.d.ts +1 -1
  51. package/dist/components/index.d.ts.map +1 -1
  52. package/dist/components/layers.d.ts +25 -0
  53. package/dist/components/layers.d.ts.map +1 -0
  54. package/dist/components/pr-pipeline.d.ts +61 -0
  55. package/dist/components/pr-pipeline.d.ts.map +1 -0
  56. package/dist/components/pr-run.d.ts +119 -0
  57. package/dist/components/pr-run.d.ts.map +1 -0
  58. package/dist/components/promote.d.ts.map +1 -1
  59. package/dist/components/verbs/shell.d.ts.map +1 -1
  60. package/dist/components/wave-plan.d.ts +49 -0
  61. package/dist/components/wave-plan.d.ts.map +1 -0
  62. package/dist/gated-waves.d.ts +147 -0
  63. package/dist/gated-waves.d.ts.map +1 -0
  64. package/dist/index.d.ts +1 -0
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/lexicon.d.ts +48 -0
  67. package/dist/lexicon.d.ts.map +1 -1
  68. package/dist/lifecycle/gate-ledger.d.ts +7 -0
  69. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  70. package/dist/lifecycle/git.d.ts +46 -1
  71. package/dist/lifecycle/git.d.ts.map +1 -1
  72. package/dist/lint/post-synth.d.ts +18 -0
  73. package/dist/lint/post-synth.d.ts.map +1 -1
  74. package/dist/op/activities/activity-contracts.d.ts +126 -0
  75. package/dist/op/activities/activity-contracts.d.ts.map +1 -1
  76. package/dist/op/activities/change-set.d.ts +62 -0
  77. package/dist/op/activities/change-set.d.ts.map +1 -0
  78. package/dist/op/activities/decide.d.ts +2 -0
  79. package/dist/op/activities/decide.d.ts.map +1 -1
  80. package/dist/op/activities/factory.d.ts +137 -0
  81. package/dist/op/activities/factory.d.ts.map +1 -0
  82. package/dist/op/activities/index.d.ts +4 -0
  83. package/dist/op/activities/index.d.ts.map +1 -1
  84. package/dist/op/activity-contract.d.ts.map +1 -1
  85. package/dist/op/builders.d.ts +11 -0
  86. package/dist/op/builders.d.ts.map +1 -1
  87. package/dist/op/decide-backend.d.ts +5 -1
  88. package/dist/op/decide-backend.d.ts.map +1 -1
  89. package/dist/op/decide-read-inputs.d.ts +4 -2
  90. package/dist/op/decide-read-inputs.d.ts.map +1 -1
  91. package/dist/op/factory.d.ts +83 -0
  92. package/dist/op/factory.d.ts.map +1 -0
  93. package/dist/op/index.d.ts +4 -1
  94. package/dist/op/index.d.ts.map +1 -1
  95. package/dist/op/op-ir.d.ts +2 -0
  96. package/dist/op/op-ir.d.ts.map +1 -1
  97. package/dist/op/op-verb-class.d.ts.map +1 -1
  98. package/dist/op/types.d.ts +8 -0
  99. package/dist/op/types.d.ts.map +1 -1
  100. package/dist/op/work-lease-run.d.ts.map +1 -1
  101. package/dist/plan-summary.d.ts +207 -0
  102. package/dist/plan-summary.d.ts.map +1 -0
  103. package/dist/pr-forge.d.ts +105 -0
  104. package/dist/pr-forge.d.ts.map +1 -0
  105. package/dist/pr-loop.d.ts +178 -0
  106. package/dist/pr-loop.d.ts.map +1 -0
  107. package/dist/telemetry-attribution.d.ts +31 -0
  108. package/dist/telemetry-attribution.d.ts.map +1 -1
  109. package/dist/terraform/hcl2json.d.ts +45 -0
  110. package/dist/terraform/hcl2json.d.ts.map +1 -0
  111. package/dist/terraform/parse.d.ts +4 -40
  112. package/dist/terraform/parse.d.ts.map +1 -1
  113. package/dist/workspace/box-cli.d.ts +12 -0
  114. package/dist/workspace/box-cli.d.ts.map +1 -0
  115. package/dist/workspace/box-factory.d.ts +27 -3
  116. package/dist/workspace/box-factory.d.ts.map +1 -1
  117. package/dist/workspace/box-listing.d.ts +85 -0
  118. package/dist/workspace/box-listing.d.ts.map +1 -0
  119. package/dist/workspace/box-publish.d.ts +147 -0
  120. package/dist/workspace/box-publish.d.ts.map +1 -0
  121. package/dist/workspace/broker-protocol.d.ts +190 -0
  122. package/dist/workspace/broker-protocol.d.ts.map +1 -0
  123. package/dist/workspace/checks.d.ts.map +1 -1
  124. package/dist/workspace/composites.d.ts +2 -2
  125. package/dist/workspace/composites.d.ts.map +1 -1
  126. package/dist/workspace/conformance/__fixtures__/reference-broker.d.ts +17 -0
  127. package/dist/workspace/conformance/__fixtures__/reference-broker.d.ts.map +1 -0
  128. package/dist/workspace/conformance/broker.d.ts +202 -0
  129. package/dist/workspace/conformance/broker.d.ts.map +1 -0
  130. package/dist/workspace/conformance/index.d.ts +2 -1
  131. package/dist/workspace/conformance/index.d.ts.map +1 -1
  132. package/dist/workspace/conformance/vitest.d.ts +9 -2
  133. package/dist/workspace/conformance/vitest.d.ts.map +1 -1
  134. package/dist/workspace/conformance/writer.d.ts +108 -14
  135. package/dist/workspace/conformance/writer.d.ts.map +1 -1
  136. package/dist/workspace/decide.d.ts +126 -12
  137. package/dist/workspace/decide.d.ts.map +1 -1
  138. package/dist/workspace/decision-points.schema.json +11 -4
  139. package/dist/workspace/declaration.d.ts +65 -0
  140. package/dist/workspace/declaration.d.ts.map +1 -1
  141. package/dist/workspace/declaration.schema.json +153 -4
  142. package/dist/workspace/environments.d.ts +36 -10
  143. package/dist/workspace/environments.d.ts.map +1 -1
  144. package/dist/workspace/factory-rules.d.ts +180 -0
  145. package/dist/workspace/factory-rules.d.ts.map +1 -0
  146. package/dist/workspace/init.d.ts +21 -0
  147. package/dist/workspace/init.d.ts.map +1 -1
  148. package/dist/workspace/intent-cli.d.ts +1 -1
  149. package/dist/workspace/intent-cli.d.ts.map +1 -1
  150. package/dist/workspace/intent-record.d.ts +28 -1
  151. package/dist/workspace/intent-record.d.ts.map +1 -1
  152. package/dist/workspace/intent.d.ts +102 -5
  153. package/dist/workspace/intent.d.ts.map +1 -1
  154. package/dist/workspace/json-edit.d.ts +24 -0
  155. package/dist/workspace/json-edit.d.ts.map +1 -0
  156. package/dist/workspace/jsonc.d.ts +11 -0
  157. package/dist/workspace/jsonc.d.ts.map +1 -1
  158. package/dist/workspace/kinds.d.ts +48 -0
  159. package/dist/workspace/kinds.d.ts.map +1 -1
  160. package/dist/workspace/lexicon-symbols.d.ts +29 -0
  161. package/dist/workspace/lexicon-symbols.d.ts.map +1 -0
  162. package/dist/workspace/lineage-upgrade.d.ts +31 -2
  163. package/dist/workspace/lineage-upgrade.d.ts.map +1 -1
  164. package/dist/workspace/point-answer.schema.json +42 -2
  165. package/dist/workspace/points-cli.d.ts +10 -3
  166. package/dist/workspace/points-cli.d.ts.map +1 -1
  167. package/dist/workspace/points.d.ts +66 -5
  168. package/dist/workspace/points.d.ts.map +1 -1
  169. package/dist/workspace/reason-codes.d.ts +33 -4
  170. package/dist/workspace/reason-codes.d.ts.map +1 -1
  171. package/dist/workspace/record-sessions.d.ts +5 -7
  172. package/dist/workspace/record-sessions.d.ts.map +1 -1
  173. package/dist/workspace/records-cli.d.ts +7 -0
  174. package/dist/workspace/records-cli.d.ts.map +1 -1
  175. package/dist/workspace/records-close.d.ts +7 -3
  176. package/dist/workspace/records-close.d.ts.map +1 -1
  177. package/dist/workspace/records-write.d.ts +66 -6
  178. package/dist/workspace/records-write.d.ts.map +1 -1
  179. package/dist/workspace/records.d.ts +28 -9
  180. package/dist/workspace/records.d.ts.map +1 -1
  181. package/dist/workspace/runs-cli.d.ts +138 -6
  182. package/dist/workspace/runs-cli.d.ts.map +1 -1
  183. package/dist/workspace/runs.d.ts +132 -11
  184. package/dist/workspace/runs.d.ts.map +1 -1
  185. package/dist/workspace/session-kinds.d.ts +1 -1
  186. package/dist/workspace/session-kinds.d.ts.map +1 -1
  187. package/dist/workspace/squash.d.ts +80 -0
  188. package/dist/workspace/squash.d.ts.map +1 -0
  189. package/dist/workspace/status-gates.d.ts +2 -0
  190. package/dist/workspace/status-gates.d.ts.map +1 -1
  191. package/dist/workspace/status.d.ts +54 -0
  192. package/dist/workspace/status.d.ts.map +1 -1
  193. package/dist/workspace/symbols.d.ts +16 -5
  194. package/dist/workspace/symbols.d.ts.map +1 -1
  195. package/dist/workspace/trust/run-commits.d.ts +46 -0
  196. package/dist/workspace/trust/run-commits.d.ts.map +1 -0
  197. package/dist/workspace/trust/run-statement.d.ts +128 -0
  198. package/dist/workspace/trust/run-statement.d.ts.map +1 -0
  199. package/dist/workspace/trust/seal.d.ts +6 -1
  200. package/dist/workspace/trust/seal.d.ts.map +1 -1
  201. package/dist/workspace/trust/verify-cli.d.ts +1 -1
  202. package/dist/workspace/trust/verify.d.ts +16 -2
  203. package/dist/workspace/trust/verify.d.ts.map +1 -1
  204. package/dist/workspace/wip-cli.d.ts +21 -0
  205. package/dist/workspace/wip-cli.d.ts.map +1 -0
  206. package/dist/workspace/wip.d.ts +268 -0
  207. package/dist/workspace/wip.d.ts.map +1 -0
  208. package/dist/workspace/work-cli.d.ts.map +1 -1
  209. package/dist/workspace/work-evidence.d.ts +1 -1
  210. package/dist/workspace/work-evidence.d.ts.map +1 -1
  211. package/dist/workspace/work-size.d.ts +55 -0
  212. package/dist/workspace/work-size.d.ts.map +1 -0
  213. package/dist/workspace/workspace-kinds.schema.json +122 -0
  214. package/dist/workspace/write-lock-cli.d.ts +60 -0
  215. package/dist/workspace/write-lock-cli.d.ts.map +1 -0
  216. package/dist/workspace/write-lock.d.ts +152 -0
  217. package/dist/workspace/write-lock.d.ts.map +1 -0
  218. package/dist/workspace/write-scope.d.ts +6 -2
  219. package/dist/workspace/write-scope.d.ts.map +1 -1
  220. package/package.json +6 -1
  221. package/src/__fixtures__/change-set/lifecycle-plan.floci.json +59 -0
  222. package/src/__fixtures__/change-set/lifecycle-v1.ts.txt +4 -0
  223. package/src/__fixtures__/change-set/lifecycle-v2.ts.txt +4 -0
  224. package/src/__fixtures__/change-set/lifecycle.change-set.golden.json +95 -0
  225. package/src/__fixtures__/change-set/warden.change-set.golden.json +106 -0
  226. package/src/__fixtures__/change-set/warden.plan.json +44 -0
  227. package/src/__fixtures__/plan-summary/normalization-vectors.json +1593 -0
  228. package/src/__fixtures__/pr-loop/pr-apply-applied.note.golden.md +31 -0
  229. package/src/__fixtures__/pr-loop/pr-apply-refused.note.golden.md +31 -0
  230. package/src/__fixtures__/pr-loop/pr-plan.golden.json +127 -0
  231. package/src/__fixtures__/pr-loop/pr-plan.note.golden.md +37 -0
  232. package/src/audit/core.test.ts +15 -0
  233. package/src/audit/core.ts +8 -2
  234. package/src/audit/discover.test.ts +11 -0
  235. package/src/audit/discover.ts +7 -2
  236. package/src/change-set-bundle.test.ts +57 -0
  237. package/src/change-set.test.ts +215 -0
  238. package/src/change-set.ts +445 -0
  239. package/src/cli/commands/audit-opt-in.test.ts +54 -0
  240. package/src/cli/commands/audit.ts +29 -2
  241. package/src/cli/commands/build.test.ts +19 -0
  242. package/src/cli/commands/build.ts +3 -2
  243. package/src/cli/handlers/build.ts +13 -1
  244. package/src/cli/handlers/change-set.test.ts +56 -0
  245. package/src/cli/handlers/change-set.ts +44 -0
  246. package/src/cli/handlers/fan-out.test.ts +221 -2
  247. package/src/cli/handlers/fan-out.ts +165 -75
  248. package/src/cli/handlers/graph.ts +3 -0
  249. package/src/cli/handlers/operator.test.ts +21 -0
  250. package/src/cli/handlers/operator.ts +34 -3
  251. package/src/cli/handlers/pr.ts +373 -0
  252. package/src/cli/handlers/run.ts +1 -0
  253. package/src/cli/main.test.ts +20 -0
  254. package/src/cli/main.ts +185 -23
  255. package/src/cli/mcp/never-over-mcp.test.ts +101 -0
  256. package/src/cli/mcp/op-tools.ts +24 -2
  257. package/src/cli/mcp/workspace-tools.test.ts +1 -1
  258. package/src/cli/mcp/workspace-tools.ts +34 -6
  259. package/src/cli/registry.ts +63 -1
  260. package/src/components/auto-release.ts +1 -1
  261. package/src/components/capability.ts +55 -0
  262. package/src/components/changed-files.ts +66 -0
  263. package/src/components/cli-support.ts +28 -5
  264. package/src/components/component.schema.json +17 -0
  265. package/src/components/component.ts +25 -0
  266. package/src/components/deploy-units.ts +3 -0
  267. package/src/components/driver.test.ts +52 -0
  268. package/src/components/driver.ts +31 -13
  269. package/src/components/fan-out-output.ts +42 -1
  270. package/src/components/fan-out-record.ts +69 -0
  271. package/src/components/fan-out-run.test.ts +17 -0
  272. package/src/components/fan-out-run.ts +304 -1
  273. package/src/components/fan-out-support.ts +3 -0
  274. package/src/components/fan-out-waves.test.ts +375 -0
  275. package/src/components/fan-out.ts +18 -17
  276. package/src/components/gated-wave-pipeline.ts +82 -0
  277. package/src/components/index.ts +1 -0
  278. package/src/components/layers.ts +30 -0
  279. package/src/components/pr-pipeline.ts +91 -0
  280. package/src/components/pr-run.test.ts +205 -0
  281. package/src/components/pr-run.ts +280 -0
  282. package/src/components/promote.ts +5 -0
  283. package/src/components/verbs/shell.test.ts +11 -0
  284. package/src/components/verbs/shell.ts +7 -3
  285. package/src/components/wave-plan.ts +124 -0
  286. package/src/discovery/sandbox/bundle.ts +1 -1
  287. package/src/gated-waves-bundle.test.ts +62 -0
  288. package/src/gated-waves.test.ts +118 -0
  289. package/src/gated-waves.ts +240 -0
  290. package/src/index.ts +1 -0
  291. package/src/lexicon.ts +51 -0
  292. package/src/lifecycle/gate-ledger.ts +7 -0
  293. package/src/lifecycle/git.ts +102 -16
  294. package/src/lint/post-synth.test.ts +19 -0
  295. package/src/lint/post-synth.ts +19 -1
  296. package/src/meta/declared-imports.test.ts +1 -1
  297. package/src/op/activities/activity-contracts.ts +84 -0
  298. package/src/op/activities/change-set.ts +114 -0
  299. package/src/op/activities/decide.ts +3 -0
  300. package/src/op/activities/factory.ts +675 -0
  301. package/src/op/activities/index.ts +6 -0
  302. package/src/op/activity-contract.test.ts +21 -1
  303. package/src/op/activity-contract.ts +19 -9
  304. package/src/op/builders.ts +23 -0
  305. package/src/op/decide-backend.ts +5 -1
  306. package/src/op/decide-read-inputs.ts +33 -5
  307. package/src/op/factory.e2e.test.ts +232 -0
  308. package/src/op/factory.ts +118 -0
  309. package/src/op/index.ts +9 -1
  310. package/src/op/op-ir.test.ts +9 -0
  311. package/src/op/op-ir.ts +4 -0
  312. package/src/op/op-verb-class.ts +3 -0
  313. package/src/op/types.ts +8 -0
  314. package/src/op/work-lease-run.ts +3 -0
  315. package/src/plan-summary.test.ts +263 -0
  316. package/src/plan-summary.ts +845 -0
  317. package/src/pr-forge.test.ts +237 -0
  318. package/src/pr-forge.ts +332 -0
  319. package/src/pr-loop-bundle.test.ts +46 -0
  320. package/src/pr-loop.test.ts +171 -0
  321. package/src/pr-loop.ts +324 -0
  322. package/src/telemetry-attribution.test.ts +23 -1
  323. package/src/telemetry-attribution.ts +51 -0
  324. package/src/terraform/hcl2json.test.ts +21 -0
  325. package/src/terraform/hcl2json.ts +81 -0
  326. package/src/terraform/parse.ts +11 -74
  327. package/src/workspace/__fixtures__/studio-template-84c8b21.json +1 -1
  328. package/src/workspace/app-kind.test.ts +196 -0
  329. package/src/workspace/box-cli.ts +113 -0
  330. package/src/workspace/box-factory.test.ts +4 -1
  331. package/src/workspace/box-factory.ts +37 -4
  332. package/src/workspace/box-listing-write.schema.json +204 -0
  333. package/src/workspace/box-listing.test.ts +234 -0
  334. package/src/workspace/box-listing.ts +324 -0
  335. package/src/workspace/box-publish.schema.json +498 -0
  336. package/src/workspace/box-publish.test.ts +204 -0
  337. package/src/workspace/box-publish.ts +420 -0
  338. package/src/workspace/box-ship.test.ts +96 -0
  339. package/src/workspace/broker-protocol.schema.json +186 -0
  340. package/src/workspace/broker-protocol.test.ts +122 -0
  341. package/src/workspace/broker-protocol.ts +317 -0
  342. package/src/workspace/builder-tiers.test.ts +146 -0
  343. package/src/workspace/change-set.schema.json +460 -0
  344. package/src/workspace/chant-migrations.e2e.test.ts +17 -5
  345. package/src/workspace/checks/boxes.test.ts +3 -0
  346. package/src/workspace/checks.ts +10 -3
  347. package/src/workspace/component-environments.test.ts +105 -0
  348. package/src/workspace/composites.schema.json +23 -4
  349. package/src/workspace/composites.test.ts +8 -8
  350. package/src/workspace/composites.ts +13 -2
  351. package/src/workspace/conformance/__fixture__/decisions/decision.schema.json +2 -2
  352. package/src/workspace/conformance/__fixtures__/reference-broker.ts +207 -0
  353. package/src/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +7 -2
  354. package/src/workspace/conformance/__writer_fixture__/answers/answer.schema.json +42 -2
  355. package/src/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
  356. package/src/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
  357. package/src/workspace/conformance/__writer_fixture__/decisions/points.json +96 -0
  358. package/src/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
  359. package/src/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
  360. package/src/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +14 -8
  361. package/src/workspace/conformance/__writer_fixture__/sessions/session.schema.json +187 -6
  362. package/src/workspace/conformance/__writer_fixture__/work/work.schema.json +25 -0
  363. package/src/workspace/conformance/broker.test.ts +122 -0
  364. package/src/workspace/conformance/broker.ts +792 -0
  365. package/src/workspace/conformance/conformance.e2e.test.ts +2 -1
  366. package/src/workspace/conformance/index.mjs +22 -1
  367. package/src/workspace/conformance/index.ts +5 -1
  368. package/src/workspace/conformance/vitest.ts +33 -1
  369. package/src/workspace/conformance/writer-conformance.e2e.test.ts +49 -3
  370. package/src/workspace/conformance/writer.test.ts +32 -2
  371. package/src/workspace/conformance/writer.ts +339 -28
  372. package/src/workspace/decide.test.ts +208 -4
  373. package/src/workspace/decide.ts +427 -73
  374. package/src/workspace/decision-points.schema.json +11 -4
  375. package/src/workspace/declaration.schema.json +153 -4
  376. package/src/workspace/declaration.ts +141 -0
  377. package/src/workspace/environments.ts +66 -14
  378. package/src/workspace/factory-rules.test.ts +62 -0
  379. package/src/workspace/factory-rules.ts +218 -0
  380. package/src/workspace/graph-cli.ts +2 -2
  381. package/src/workspace/graph.schema.json +67 -0
  382. package/src/workspace/identity.test.ts +23 -0
  383. package/src/workspace/init.ts +82 -2
  384. package/src/workspace/intent-cli.ts +26 -9
  385. package/src/workspace/intent-patch-id.test.ts +162 -0
  386. package/src/workspace/intent-record.schema.json +130 -3
  387. package/src/workspace/intent-record.ts +74 -28
  388. package/src/workspace/intent-reviews.test.ts +76 -0
  389. package/src/workspace/intent-squash.test.ts +213 -0
  390. package/src/workspace/intent-why.test.ts +5 -5
  391. package/src/workspace/intent.schema.json +234 -4
  392. package/src/workspace/intent.ts +260 -66
  393. package/src/workspace/json-edit.test.ts +121 -0
  394. package/src/workspace/json-edit.ts +142 -0
  395. package/src/workspace/jsonc.ts +20 -0
  396. package/src/workspace/kinds.ts +157 -2
  397. package/src/workspace/lexicon-symbols.test.ts +148 -0
  398. package/src/workspace/lexicon-symbols.ts +125 -0
  399. package/src/workspace/lineage-upgrade.test.ts +63 -0
  400. package/src/workspace/lineage-upgrade.ts +146 -5
  401. package/src/workspace/plan-summary.schema.json +155 -0
  402. package/src/workspace/point-answer.schema.json +42 -2
  403. package/src/workspace/points-cli.ts +42 -16
  404. package/src/workspace/points-write.schema.json +162 -4
  405. package/src/workspace/points.schema.json +157 -2
  406. package/src/workspace/points.test.ts +13 -1
  407. package/src/workspace/points.ts +118 -12
  408. package/src/workspace/pr-report.schema.json +95 -0
  409. package/src/workspace/profiles.test.ts +159 -0
  410. package/src/workspace/read-contract.test.ts +2 -2
  411. package/src/workspace/reason-codes.test.ts +13 -1
  412. package/src/workspace/reason-codes.ts +38 -4
  413. package/src/workspace/record-sessions.ts +9 -8
  414. package/src/workspace/records-amend.schema.json +78 -0
  415. package/src/workspace/records-cli.ts +20 -6
  416. package/src/workspace/records-close.schema.json +78 -0
  417. package/src/workspace/records-close.ts +31 -7
  418. package/src/workspace/records-concurrent.e2e.test.ts +135 -0
  419. package/src/workspace/records-concurrent.test.ts +145 -0
  420. package/src/workspace/records-formats.test.ts +46 -10
  421. package/src/workspace/records-new.schema.json +7 -0
  422. package/src/workspace/records-review.schema.json +78 -0
  423. package/src/workspace/records-sessions-write.test.ts +69 -0
  424. package/src/workspace/records-sessions.test.ts +22 -0
  425. package/src/workspace/records-write.ts +192 -25
  426. package/src/workspace/records.schema.json +16 -0
  427. package/src/workspace/records.ts +50 -9
  428. package/src/workspace/reference-kinds/app/package.json +10 -0
  429. package/src/workspace/reference-kinds/app/workspace-kinds.json +45 -0
  430. package/src/workspace/run-statement.schema.json +622 -0
  431. package/src/workspace/runs-cli.ts +343 -14
  432. package/src/workspace/runs-statement.test.ts +239 -0
  433. package/src/workspace/runs-write.schema.json +416 -5
  434. package/src/workspace/runs.schema.json +451 -4
  435. package/src/workspace/runs.test.ts +39 -0
  436. package/src/workspace/runs.ts +296 -35
  437. package/src/workspace/session-kinds.ts +3 -3
  438. package/src/workspace/squash.ts +198 -0
  439. package/src/workspace/status-contract.test.ts +5 -2
  440. package/src/workspace/status-gates.ts +3 -1
  441. package/src/workspace/status.schema.json +126 -3
  442. package/src/workspace/status.ts +90 -1
  443. package/src/workspace/symbols.ts +20 -9
  444. package/src/workspace/trust/run-commits.ts +115 -0
  445. package/src/workspace/trust/run-statement.ts +226 -0
  446. package/src/workspace/trust/seal.ts +8 -2
  447. package/src/workspace/trust/verify-cli.ts +6 -5
  448. package/src/workspace/trust/verify.ts +39 -6
  449. package/src/workspace/wip-cli.ts +97 -0
  450. package/src/workspace/wip-write.schema.json +504 -0
  451. package/src/workspace/wip.schema.json +334 -0
  452. package/src/workspace/wip.test.ts +294 -0
  453. package/src/workspace/wip.ts +753 -0
  454. package/src/workspace/work-cli.ts +3 -0
  455. package/src/workspace/work-evidence.schema.json +3 -0
  456. package/src/workspace/work-size.test.ts +77 -0
  457. package/src/workspace/work-size.ts +93 -0
  458. package/src/workspace/workspace-kinds.schema.json +122 -0
  459. package/src/workspace/write-lock-cli.ts +131 -0
  460. package/src/workspace/write-lock.schema.json +172 -0
  461. package/src/workspace/write-lock.test.ts +189 -0
  462. package/src/workspace/write-lock.ts +474 -0
  463. package/src/workspace/write-scope.test.ts +16 -1
  464. package/src/workspace/write-scope.ts +33 -11
@@ -2,9 +2,12 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "$id": "urn:intentius:chant:session:1",
4
4
  "title": "Review session",
5
- "description": "The front matter of a review-session file (#2673, #2650 C10): a group walking an agenda of records together, who attended, and the verdicts the session produced. Each verdict is also an entry in the judged record's reviews list, whose session field names this session. A closed session is sealed: closed_digest is sha256: and the lowercase hex SHA-256 of the JCS form of the whole session without closed_digest (its front matter as core and the text below it as body, line endings LF, #2546), and chant workspace records checks it on every read (session-seal-mismatch).",
5
+ "description": "The front matter of a review-session file (#2673, #2650 C10): a group walking an agenda of records together, who attended, and the verdicts the session produced. Its verdicts judge decisions, contracts and drivers, the kinds the session kind names as subjects (#3148, ws-082). A comment-mode review of the app's UI is a session too, one per review batch, with its comments, the agent's answers and the rounds of replies (#3350, ws-083). Each verdict is also an entry in the judged record's reviews list, whose session field names this session. A closed session is sealed: closed_digest is sha256: and the lowercase hex SHA-256 of the JCS form of the whole session without closed_digest (its front matter as core and the text below it as body, line endings LF, #2546), and chant workspace records checks it on every read (session-seal-mismatch).",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
+ "patternProperties": {
9
+ "^x-": {}
10
+ },
8
11
  "required": ["schema", "id", "title", "state", "agenda", "attendance", "opened", "closed", "verdicts"],
9
12
  "properties": {
10
13
  "schema": { "const": 1 },
@@ -16,7 +19,7 @@
16
19
  "title": { "type": "string", "minLength": 1 },
17
20
  "state": { "enum": ["open", "closed"] },
18
21
  "agenda": {
19
- "description": "What the session walks, in order: a record by its id, or an item of free text.",
22
+ "description": "What the session walks, in order: a record by its id, or an item of free text. A record may say what it was when it was put up (digest), the evidence records reviewed with it and any screenshot or recording (#3148).",
20
23
  "type": "array",
21
24
  "minItems": 1,
22
25
  "items": {
@@ -25,7 +28,33 @@
25
28
  "type": "object",
26
29
  "additionalProperties": false,
27
30
  "required": ["record"],
28
- "properties": { "record": { "type": "string", "minLength": 1 } }
31
+ "properties": {
32
+ "record": { "type": "string", "minLength": 1 },
33
+ "digest": {
34
+ "description": "The record's digest when it was put up for review, as chant workspace records --json prints it.",
35
+ "type": "string",
36
+ "pattern": "^[0-9a-f]{64}$"
37
+ },
38
+ "evidence": {
39
+ "description": "The evidence records reviewed with it, by id: the SHA-256 each evidence file is named for.",
40
+ "type": "array",
41
+ "uniqueItems": true,
42
+ "items": { "type": "string", "pattern": "^[0-9a-f]{64}$" }
43
+ },
44
+ "media": {
45
+ "description": "Screenshots and recordings shown with it, each a workspace path or an https link.",
46
+ "type": "array",
47
+ "items": {
48
+ "type": "object",
49
+ "additionalProperties": false,
50
+ "required": ["kind", "ref"],
51
+ "properties": {
52
+ "kind": { "enum": ["screenshot", "recording"] },
53
+ "ref": { "type": "string", "minLength": 1 }
54
+ }
55
+ }
56
+ }
57
+ }
29
58
  },
30
59
  {
31
60
  "type": "object",
@@ -46,11 +75,22 @@
46
75
  "properties": {
47
76
  "principal": { "type": "string", "minLength": 1 },
48
77
  "class": { "enum": ["person", "agent"] },
49
- "roles": { "type": "array", "uniqueItems": true, "items": { "type": "string", "minLength": 1 } }
78
+ "roles": {
79
+ "description": "The roles the principal holds in the session, such as reviewer or facilitator. A quorum that names roles counts only verdicts by principals holding one.",
80
+ "type": "array",
81
+ "uniqueItems": true,
82
+ "items": { "type": "string", "minLength": 1 }
83
+ },
84
+ "joined": { "description": "When the principal joined. Optional.", "$ref": "#/definitions/dateTime" }
50
85
  }
51
86
  }
52
87
  },
53
88
  "opened": { "$ref": "#/definitions/dateTime" },
89
+ "opened_by": {
90
+ "description": "Who opened the session. Optional.",
91
+ "type": "string",
92
+ "minLength": 1
93
+ },
54
94
  "opened_rev": {
55
95
  "description": "The commit HEAD named when chant workspace records new wrote the session (#2693), or null when the repository had no commit yet; the next records amend, review --session or close fills it. chant writes it, and records --since <session id> reads it. Optional, so a session written before #2693 stays valid.",
56
96
  "oneOf": [{ "type": "null" }, { "$ref": "#/definitions/rev" }]
@@ -63,8 +103,13 @@
63
103
  "description": "The commit HEAD named when chant workspace records close closed the session (#2693), or null when the repository had no commit. Only a closed session has it. Optional, so a session closed before #2693 stays valid.",
64
104
  "oneOf": [{ "type": "null" }, { "$ref": "#/definitions/rev" }]
65
105
  },
106
+ "closed_by": {
107
+ "description": "Who closes or closed the session, set by an amendment before chant workspace records close seals it. Optional.",
108
+ "type": "string",
109
+ "minLength": 1
110
+ },
66
111
  "verdicts": {
67
- "description": "The verdicts the session produced, in the order they were given.",
112
+ "description": "The verdicts the session produced, in the order they were given. Each names a record of one of the session kind's subject kinds: a decision, a contract or a driver.",
68
113
  "type": "array",
69
114
  "items": {
70
115
  "type": "object",
@@ -78,10 +123,34 @@
78
123
  "description": "The digest of the record text the verdict judged, as the review entry carries it.",
79
124
  "type": "string",
80
125
  "pattern": "^[0-9a-f]{64}$"
81
- }
126
+ },
127
+ "roles": {
128
+ "description": "The roles the principal gave the verdict in, which a quorum that names roles counts. Optional.",
129
+ "type": "array",
130
+ "uniqueItems": true,
131
+ "items": { "type": "string", "minLength": 1 }
132
+ },
133
+ "at": { "description": "When the verdict was given. Optional.", "$ref": "#/definitions/dateTime" },
134
+ "note": { "description": "Why, in the principal's words. Optional.", "type": "string" }
82
135
  }
83
136
  }
84
137
  },
138
+ "follow_ups": {
139
+ "description": "Records the session started for later, as <kind>:<id> with kind the record kind's name, the form a Chant-Record trailer uses (ws-075): contracts drafted, work items proposed, decisions opened. Optional.",
140
+ "type": "array",
141
+ "uniqueItems": true,
142
+ "items": { "$ref": "#/definitions/recordRef" }
143
+ },
144
+ "comments": {
145
+ "description": "What people said in the session, in order (#3350, ws-083). A comment-mode review of the app's UI is one session per review batch: each comment is anchored to the page and elements it was made on, the agent that worked the batch answers each one, and a person may reply in later rounds. The comments are numbered from 1 by their position, as hud numbers them. Optional.",
146
+ "type": "array",
147
+ "items": { "$ref": "#/definitions/comment" }
148
+ },
149
+ "rounds": {
150
+ "description": "The rounds of a review batch (#3350, ws-083): round 0 is the batch as it was sent, with its note; each later round is a person's replies, which send the batch back for another turn. ended is when the agent's turn for the round ended, null while it is working. Optional.",
151
+ "type": "array",
152
+ "items": { "$ref": "#/definitions/round" }
153
+ },
85
154
  "closed_digest": {
86
155
  "description": "The seal, written when the session closes.",
87
156
  "type": "string",
@@ -90,6 +159,118 @@
90
159
  },
91
160
  "definitions": {
92
161
  "rev": { "type": "string", "pattern": "^[0-9a-f]{40,64}$" },
162
+ "comment": {
163
+ "type": "object",
164
+ "additionalProperties": false,
165
+ "required": ["text"],
166
+ "properties": {
167
+ "text": {
168
+ "description": "What the person wrote. Empty when the comment only marks its elements for the round's note.",
169
+ "type": "string"
170
+ },
171
+ "by": { "description": "Who wrote it. Optional; a review batch's reviewer is in attendance.", "type": "string", "minLength": 1 },
172
+ "at": { "description": "When it was written. Optional.", "$ref": "#/definitions/dateTime" },
173
+ "anchor": {
174
+ "description": "Where in the app the comment was made: the page's route and the elements it points at.",
175
+ "type": "object",
176
+ "additionalProperties": false,
177
+ "required": ["route", "elements"],
178
+ "properties": {
179
+ "route": {
180
+ "description": "The page, as its path with any query and hash.",
181
+ "type": "string",
182
+ "minLength": 1
183
+ },
184
+ "elements": {
185
+ "type": "array",
186
+ "minItems": 1,
187
+ "items": {
188
+ "type": "object",
189
+ "additionalProperties": false,
190
+ "required": ["selector", "state"],
191
+ "properties": {
192
+ "selector": { "description": "A CSS selector for the element.", "type": "string", "minLength": 1 },
193
+ "tag": { "description": "The element's tag name.", "type": "string", "minLength": 1 },
194
+ "text": { "description": "The element's text when the comment was made, cut short.", "type": "string" },
195
+ "state": {
196
+ "description": "anchored: the selector found exactly the element. ambiguous: it found more than one. lost: it found none.",
197
+ "enum": ["anchored", "ambiguous", "lost"]
198
+ },
199
+ "basis": {
200
+ "description": "What the selector was built from: an authored anchor (data-hud-id), the element's id, a test id, or its path in the page. Optional.",
201
+ "enum": ["authored", "id", "testid", "path"]
202
+ }
203
+ }
204
+ }
205
+ }
206
+ }
207
+ },
208
+ "answers": {
209
+ "description": "The agent's answers to the comment, one per round it answered in, oldest first; the last is the current one. handled: it changed something, and note says what. skipped: it did not, and note says why. needs-discussion: note is the question a person has to settle, by replying in a later round.",
210
+ "type": "array",
211
+ "items": {
212
+ "type": "object",
213
+ "additionalProperties": false,
214
+ "required": ["round", "disposition", "note"],
215
+ "properties": {
216
+ "round": { "type": "integer", "minimum": 0 },
217
+ "disposition": { "enum": ["handled", "skipped", "needs-discussion"] },
218
+ "note": { "type": "string", "pattern": "\\S" },
219
+ "by": { "description": "The agent that answered. Optional.", "type": "string", "minLength": 1 },
220
+ "at": { "$ref": "#/definitions/dateTime" }
221
+ }
222
+ }
223
+ },
224
+ "replies": {
225
+ "description": "A person's replies to the comment, one per round from round 1.",
226
+ "type": "array",
227
+ "items": {
228
+ "type": "object",
229
+ "additionalProperties": false,
230
+ "required": ["round", "text"],
231
+ "properties": {
232
+ "round": { "type": "integer", "minimum": 1 },
233
+ "text": { "type": "string", "pattern": "\\S" },
234
+ "by": { "type": "string", "minLength": 1 },
235
+ "at": { "$ref": "#/definitions/dateTime" }
236
+ }
237
+ }
238
+ },
239
+ "exit": {
240
+ "description": "How the comment left the box, once a person decided (hud#703, studio-039): kept, its record stays in the repository as the source of the work its changes are; sent, it went out with Send; dismissed, it was let go. Absent until then.",
241
+ "enum": ["kept", "sent", "dismissed"]
242
+ },
243
+ "follow_ups": {
244
+ "description": "Records the comment led to, as <kind>:<id>, such as the work item that carries its change. Optional.",
245
+ "type": "array",
246
+ "uniqueItems": true,
247
+ "items": { "$ref": "#/definitions/recordRef" }
248
+ }
249
+ }
250
+ },
251
+ "round": {
252
+ "type": "object",
253
+ "additionalProperties": false,
254
+ "required": ["round", "note", "at"],
255
+ "properties": {
256
+ "round": { "type": "integer", "minimum": 0 },
257
+ "note": {
258
+ "description": "The note sent with the round, or null when there was none. A reply round needs a reply or a note.",
259
+ "type": ["string", "null"]
260
+ },
261
+ "by": { "description": "Who sent the round. Optional.", "type": "string", "minLength": 1 },
262
+ "at": { "description": "When the round was sent.", "$ref": "#/definitions/dateTime" },
263
+ "ended": {
264
+ "description": "When the agent's turn for the round ended, or null while it is working. Optional.",
265
+ "oneOf": [{ "type": "null" }, { "$ref": "#/definitions/dateTime" }]
266
+ }
267
+ }
268
+ },
269
+ "recordRef": {
270
+ "description": "A record as <kind>:<id>, such as contract:C-002 or work:W-004.",
271
+ "type": "string",
272
+ "pattern": "^[a-z][a-z0-9-]*:[A-Za-z0-9][A-Za-z0-9._-]*$"
273
+ },
93
274
  "dateTime": {
94
275
  "type": "string",
95
276
  "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}(:[0-9]{2}(\\.[0-9]+)?)?(Z|[+-][0-9]{2}:[0-9]{2})$"
@@ -138,6 +138,30 @@
138
138
  ],
139
139
  "minimum": 1
140
140
  },
141
+ "retry": {
142
+ "description": "A person's request to build the item again after a failed build (#3406, ws-087, arugula-salad/studio#232): after names the lease token of the failed build it follows, so one request starts one run. Written through chant workspace records amend; a factory never retries a failed build without it.",
143
+ "type": "object",
144
+ "additionalProperties": false,
145
+ "required": ["after", "by"],
146
+ "properties": {
147
+ "after": { "type": "string", "minLength": 1, "description": "The fencing token of the failed build this request follows." },
148
+ "by": { "type": "string", "minLength": 1, "description": "Who asked." },
149
+ "at": { "type": "string", "description": "When, as an ISO 8601 timestamp." }
150
+ }
151
+ },
152
+ "implements_proposed": {
153
+ "description": "The decisions the factory proposed this item implements when it recorded the build done (#3406, arugula-salad/studio#243): each a decision in force that constrains, by path, a path the build changed, with those paths. They are also added to implements, and listed here so a reader tells them from links a person wrote.",
154
+ "type": "array",
155
+ "items": {
156
+ "type": "object",
157
+ "additionalProperties": false,
158
+ "required": ["decision", "paths"],
159
+ "properties": {
160
+ "decision": { "type": "string", "minLength": 1 },
161
+ "paths": { "type": "array", "items": { "type": "string" } }
162
+ }
163
+ }
164
+ },
141
165
  "result": {
142
166
  "description": "What the last build of the item ran under (#3147): only the lease token, which joins the item to the run record and to the commits carrying it. Build provenance (agent, model, harness, session, cost) is the run record's, never the item's.",
143
167
  "type": "object",
@@ -370,6 +394,7 @@
370
394
  "intent-decision-unimplemented",
371
395
  "intent-work-blocked",
372
396
  "intent-work-open-decided-code",
397
+ "intent-commit-join-conflict",
373
398
  "change-uncovered",
374
399
  "change-out-of-scope"
375
400
  ]
@@ -0,0 +1,122 @@
1
+ /**
2
+ * The broker suite (#3164) against the reference broker, which serves every
3
+ * standard capability and must pass, and against two brokers that break the
4
+ * protocol, which the suite must catch.
5
+ */
6
+
7
+ import { createServer } from "node:http";
8
+ import type { AddressInfo } from "node:net";
9
+ import { describe, expect, test } from "vitest";
10
+ import { BROKER_ROUTES } from "../broker-protocol";
11
+ import { describeBrokerConformance } from "./vitest";
12
+ import { startReferenceBroker } from "./__fixtures__/reference-broker";
13
+ import { BROKER_CONFORMANCE_CAPABILITIES, runBrokerConformance, schemaInstance, type BrokerConformanceEnv, type BrokerListen, type StartedBroker } from "./index";
14
+
15
+ /** The suite's upstreams on loopback ports, as a broker's test serves them. */
16
+ const listen: BrokerListen = (handler) =>
17
+ new Promise((resolve) => {
18
+ const server = createServer(handler);
19
+ server.listen(0, "127.0.0.1", () =>
20
+ resolve({ url: `http://127.0.0.1:${(server.address() as AddressInfo).port}`, close: () => new Promise<void>((r) => server.close(() => r())) }),
21
+ );
22
+ });
23
+
24
+ describeBrokerConformance({ name: "the reference broker", start: startReferenceBroker, listen, capabilities: BROKER_CONFORMANCE_CAPABILITIES });
25
+
26
+ /**
27
+ * The reference broker behind a proxy that changes each request with
28
+ * `rewrite` on the way in, so a test makes a broker that breaks one rule.
29
+ */
30
+ async function behind(
31
+ env: BrokerConformanceEnv,
32
+ rewrite: (path: string, headers: Record<string, string>, body: string) => { headers: Record<string, string>; body: string },
33
+ answered: (path: string, headers: Record<string, string>) => void = () => {},
34
+ ): Promise<StartedBroker> {
35
+ const inner = await startReferenceBroker(env);
36
+ const server = createServer(async (req, res) => {
37
+ let body = "";
38
+ for await (const chunk of req) body += chunk;
39
+ const headers: Record<string, string> = {};
40
+ for (const [k, v] of Object.entries(req.headers)) if (v !== undefined && k !== "host" && k !== "content-length" && k !== "connection") headers[k] = [v].flat().join(", ");
41
+ const changed = rewrite(req.url ?? "/", headers, body);
42
+ const answer = await fetch(`${inner.url}${req.url}`, { method: req.method, headers: changed.headers, body: req.method === "GET" || req.method === "HEAD" ? undefined : changed.body });
43
+ const out: Record<string, string> = {};
44
+ answer.headers.forEach((v, k) => {
45
+ if (!["content-length", "content-encoding", "transfer-encoding", "connection", "keep-alive"].includes(k)) out[k] = v;
46
+ });
47
+ answered(req.url ?? "/", out);
48
+ res.writeHead(answer.status, out);
49
+ res.end(Buffer.from(await answer.arrayBuffer()));
50
+ });
51
+ await new Promise<void>((r) => server.listen(0, "127.0.0.1", () => r()));
52
+ return {
53
+ url: `http://127.0.0.1:${(server.address() as AddressInfo).port}`,
54
+ tokens: inner.tokens,
55
+ close: async () => {
56
+ await new Promise<void>((r) => server.close(() => r()));
57
+ await inner.close?.();
58
+ },
59
+ };
60
+ }
61
+
62
+ describe("the broker suite catches a broker that breaks the protocol", () => {
63
+ test("a broker that grants every scope whatever the box declared fails each refusal check", async () => {
64
+ const all = (broker: string) => ({
65
+ capabilities: [
66
+ { name: "inference", broker, scope: ["agent", "decide"] },
67
+ { name: "egress", broker, scope: ["CONFORMANCE", "CONFORMANCE_UNHELD"] },
68
+ { name: "feedback", broker, scope: ["agent", "passive"] },
69
+ { name: "fountain", broker, scope: ["agent", "conversations", "sandboxes", "vault"] },
70
+ ],
71
+ });
72
+ const report = await runBrokerConformance({
73
+ name: "grants everything",
74
+ listen,
75
+ capabilities: BROKER_CONFORMANCE_CAPABILITIES,
76
+ start: (env) => behind(env, (path, headers, body) => ({ headers, body: path === BROKER_ROUTES.declaration && body.includes('"capabilities"') ? JSON.stringify(all(env.broker)) : body })),
77
+ });
78
+ const failed = new Set(report.results.filter((r) => r.problems.length > 0).map((r) => r.id));
79
+ for (const id of ["inference-agent-refused", "decide-refused", "egress-refused", "feedback-refused", "fountain-refused"]) expect(failed, id).toContain(id);
80
+ expect(failed).not.toContain("inference-forwards");
81
+ expect(failed).not.toContain("unreported-refused");
82
+ }, 60_000);
83
+
84
+ test("a broker that passes a box's token upstream fails token-isolation", async () => {
85
+ const report = await runBrokerConformance({
86
+ name: "leaks the token",
87
+ listen,
88
+ start: (env) => behind(env, (_path, headers, body) => ({ headers: { ...headers, "x-box-token": headers.authorization ?? headers["x-api-key"] ?? "" }, body })),
89
+ });
90
+ const isolation = report.results.find((r) => r.id === "token-isolation");
91
+ expect(isolation?.problems.length).toBeGreaterThan(0);
92
+ expect(report.problems.every((p) => p.startsWith("token-isolation:"))).toBe(true);
93
+ }, 60_000);
94
+
95
+ test("a broker whose payer differs between the report's answer and a Messages answer, or is said on one only, fails payer-consistent (#3474)", async () => {
96
+ for (const change of [(h: Record<string, string>) => (h["chant-payer"] = "visitor github:someone"), (h: Record<string, string>) => delete h["chant-payer"]]) {
97
+ const report = await runBrokerConformance({
98
+ name: "payer disagrees",
99
+ listen,
100
+ start: (env) => behind(env, (_path, headers, body) => ({ headers, body }), (path, headers) => path.startsWith(BROKER_ROUTES.inference) && change(headers)),
101
+ });
102
+ expect(report.problems.length).toBeGreaterThan(0);
103
+ expect(report.problems.every((p) => p.startsWith("payer-consistent:"))).toBe(true);
104
+ }
105
+ }, 60_000);
106
+
107
+ test("the default capabilities are the lobby's, and fountain's checks are skipped", async () => {
108
+ const report = await runBrokerConformance({ name: "the reference broker as a lobby", start: startReferenceBroker, listen });
109
+ expect(report.problems).toEqual([]);
110
+ expect(report.results.filter((r) => r.skipped).map((r) => r.id)).toEqual(["fountain-forwards", "fountain-refused"]);
111
+ }, 60_000);
112
+ });
113
+
114
+ describe("schemaInstance", () => {
115
+ test("answers a structured-output schema with the first option and an even split", () => {
116
+ const schema = {
117
+ type: "object",
118
+ properties: { reason: { type: "string" }, choice: { type: "string", enum: ["small", "large"] }, probabilities: { type: "object", properties: { small: { type: "number" }, large: { type: "number" } } } },
119
+ };
120
+ expect(schemaInstance(schema)).toEqual({ reason: "The conformance upstream's reason.", choice: "small", probabilities: { small: 0.5, large: 0.5 } });
121
+ });
122
+ });