pi-daddy 0.27.4 → 0.32.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 (1000) hide show
  1. package/CHANGELOG.md +108 -124
  2. package/README.md +18 -896
  3. package/THIRD_PARTY_NOTICES.md +1 -1
  4. package/contracts/ledger-record/v1/README.md +44 -0
  5. package/contracts/ledger-record/v1/fixtures/child-lifecycle.json +45 -0
  6. package/contracts/ledger-record/v1/fixtures/ledger-record.jsonl +3 -0
  7. package/contracts/ledger-record/v1/governance-event.schema.json +747 -0
  8. package/contracts/ledger-record/v1/record.schema.json +91 -0
  9. package/dist/cli.d.ts +6 -4
  10. package/dist/cli.d.ts.map +1 -1
  11. package/dist/cli.js +108 -103
  12. package/dist/cli.js.map +1 -1
  13. package/dist/executors/activity-session.d.ts +12 -0
  14. package/dist/executors/activity-session.d.ts.map +1 -0
  15. package/dist/executors/activity-session.js +43 -0
  16. package/dist/executors/activity-session.js.map +1 -0
  17. package/dist/executors/executor.d.ts +39 -0
  18. package/dist/executors/executor.d.ts.map +1 -0
  19. package/dist/executors/executor.js +95 -0
  20. package/dist/executors/executor.js.map +1 -0
  21. package/dist/executors/herdr-cli.d.ts +78 -0
  22. package/dist/executors/herdr-cli.d.ts.map +1 -0
  23. package/dist/executors/herdr-cli.js +114 -0
  24. package/dist/executors/herdr-cli.js.map +1 -0
  25. package/dist/executors/herdr-name.d.ts.map +1 -0
  26. package/dist/executors/herdr-name.js.map +1 -0
  27. package/dist/executors/herdr-pi-lifecycle.d.ts.map +1 -0
  28. package/dist/executors/herdr-pi-lifecycle.js +22 -0
  29. package/dist/executors/herdr-pi-lifecycle.js.map +1 -0
  30. package/dist/executors/herdr-poll.d.ts +140 -0
  31. package/dist/executors/herdr-poll.d.ts.map +1 -0
  32. package/dist/executors/herdr-poll.js +252 -0
  33. package/dist/executors/herdr-poll.js.map +1 -0
  34. package/dist/executors/herdr-stage.d.ts +40 -0
  35. package/dist/executors/herdr-stage.d.ts.map +1 -0
  36. package/dist/executors/herdr-stage.js +54 -0
  37. package/dist/executors/herdr-stage.js.map +1 -0
  38. package/dist/executors/herdr-start.d.ts.map +1 -0
  39. package/dist/executors/herdr-start.js.map +1 -0
  40. package/dist/executors/native-session-target.d.ts +9 -0
  41. package/dist/executors/native-session-target.d.ts.map +1 -0
  42. package/dist/executors/native-session-target.js +30 -0
  43. package/dist/executors/native-session-target.js.map +1 -0
  44. package/dist/executors/pane-reaper.d.ts +111 -0
  45. package/dist/executors/pane-reaper.d.ts.map +1 -0
  46. package/dist/executors/pane-reaper.js +242 -0
  47. package/dist/executors/pane-reaper.js.map +1 -0
  48. package/dist/executors/process-activity.d.ts +3 -0
  49. package/dist/executors/process-activity.d.ts.map +1 -0
  50. package/dist/executors/process-activity.js +59 -0
  51. package/dist/executors/process-activity.js.map +1 -0
  52. package/dist/executors/run-herdr.d.ts +122 -0
  53. package/dist/executors/run-herdr.d.ts.map +1 -0
  54. package/dist/executors/run-herdr.js +341 -0
  55. package/dist/executors/run-herdr.js.map +1 -0
  56. package/dist/executors/vendor/herdr-pi-lifecycle.d.ts.map +1 -0
  57. package/dist/executors/vendor/herdr-pi-lifecycle.js.map +1 -0
  58. package/dist/governance/approval-prompt.d.ts +119 -0
  59. package/dist/governance/approval-prompt.d.ts.map +1 -0
  60. package/dist/governance/approval-prompt.js +133 -0
  61. package/dist/governance/approval-prompt.js.map +1 -0
  62. package/dist/governance/approval-store.d.ts +149 -0
  63. package/dist/governance/approval-store.d.ts.map +1 -0
  64. package/dist/governance/approval-store.js +309 -0
  65. package/dist/governance/approval-store.js.map +1 -0
  66. package/dist/governance/execution-retention.d.ts +90 -0
  67. package/dist/governance/execution-retention.d.ts.map +1 -0
  68. package/dist/governance/execution-retention.js +317 -0
  69. package/dist/governance/execution-retention.js.map +1 -0
  70. package/dist/governance/file-lock.d.ts.map +1 -0
  71. package/dist/governance/file-lock.js +205 -0
  72. package/dist/governance/file-lock.js.map +1 -0
  73. package/dist/governance/finalization.d.ts.map +1 -0
  74. package/dist/governance/finalization.js.map +1 -0
  75. package/dist/governance/grant-store.d.ts +96 -0
  76. package/dist/governance/grant-store.d.ts.map +1 -0
  77. package/dist/governance/grant-store.js +186 -0
  78. package/dist/governance/grant-store.js.map +1 -0
  79. package/dist/governance/init.d.ts +129 -0
  80. package/dist/governance/init.d.ts.map +1 -0
  81. package/dist/governance/init.js +360 -0
  82. package/dist/governance/init.js.map +1 -0
  83. package/dist/governance/lease-helper.d.ts.map +1 -0
  84. package/dist/governance/lease-helper.js +121 -0
  85. package/dist/governance/lease-helper.js.map +1 -0
  86. package/dist/governance/lease-record.d.ts +90 -0
  87. package/dist/governance/lease-record.d.ts.map +1 -0
  88. package/dist/governance/lease-record.js.map +1 -0
  89. package/dist/governance/ledger-events.d.ts +111 -0
  90. package/dist/governance/ledger-events.d.ts.map +1 -0
  91. package/dist/governance/ledger-events.js +129 -0
  92. package/dist/governance/ledger-events.js.map +1 -0
  93. package/dist/governance/ledger-report.d.ts +134 -0
  94. package/dist/governance/ledger-report.d.ts.map +1 -0
  95. package/dist/governance/ledger-report.js +294 -0
  96. package/dist/governance/ledger-report.js.map +1 -0
  97. package/dist/governance/ledger-v3-validation.d.ts +21 -0
  98. package/dist/governance/ledger-v3-validation.d.ts.map +1 -0
  99. package/dist/governance/ledger-v3-validation.js +353 -0
  100. package/dist/governance/ledger-v3-validation.js.map +1 -0
  101. package/dist/governance/ledger.d.ts +258 -0
  102. package/dist/governance/ledger.d.ts.map +1 -0
  103. package/dist/governance/ledger.js +201 -0
  104. package/dist/governance/ledger.js.map +1 -0
  105. package/dist/governance/native-session.d.ts +59 -0
  106. package/dist/governance/native-session.d.ts.map +1 -0
  107. package/dist/governance/native-session.js +208 -0
  108. package/dist/governance/native-session.js.map +1 -0
  109. package/dist/governance/record.d.ts +65 -0
  110. package/dist/governance/record.d.ts.map +1 -0
  111. package/dist/governance/record.js +259 -0
  112. package/dist/governance/record.js.map +1 -0
  113. package/dist/governance/retention-contract.d.ts.map +1 -0
  114. package/dist/governance/retention-contract.js +187 -0
  115. package/dist/governance/retention-contract.js.map +1 -0
  116. package/dist/governance/retention-json.d.ts.map +1 -0
  117. package/dist/governance/retention-json.js.map +1 -0
  118. package/dist/governance/workspace-lease.d.ts +40 -0
  119. package/dist/governance/workspace-lease.d.ts.map +1 -0
  120. package/dist/governance/workspace-lease.js +357 -0
  121. package/dist/governance/workspace-lease.js.map +1 -0
  122. package/dist/index.d.ts +59 -42
  123. package/dist/index.d.ts.map +1 -1
  124. package/dist/index.js +61 -42
  125. package/dist/index.js.map +1 -1
  126. package/dist/kernel/approval.d.ts +241 -0
  127. package/dist/kernel/approval.d.ts.map +1 -0
  128. package/dist/kernel/approval.js +270 -0
  129. package/dist/kernel/approval.js.map +1 -0
  130. package/dist/kernel/capabilities.d.ts +136 -0
  131. package/dist/kernel/capabilities.d.ts.map +1 -0
  132. package/dist/kernel/capabilities.js +199 -0
  133. package/dist/kernel/capabilities.js.map +1 -0
  134. package/dist/kernel/catalog.d.ts +98 -0
  135. package/dist/kernel/catalog.d.ts.map +1 -0
  136. package/dist/kernel/catalog.js +280 -0
  137. package/dist/kernel/catalog.js.map +1 -0
  138. package/dist/kernel/chain.d.ts.map +1 -0
  139. package/dist/kernel/chain.js.map +1 -0
  140. package/dist/kernel/correlation.d.ts.map +1 -0
  141. package/dist/kernel/correlation.js +267 -0
  142. package/dist/kernel/correlation.js.map +1 -0
  143. package/dist/kernel/definitions.d.ts.map +1 -0
  144. package/dist/kernel/definitions.js +164 -0
  145. package/dist/kernel/definitions.js.map +1 -0
  146. package/dist/kernel/delegate-types.d.ts +160 -0
  147. package/dist/kernel/delegate-types.d.ts.map +1 -0
  148. package/dist/kernel/delegate-types.js +9 -0
  149. package/dist/kernel/delegate-types.js.map +1 -0
  150. package/dist/kernel/delegate.d.ts.map +1 -0
  151. package/dist/kernel/delegate.js +314 -0
  152. package/dist/kernel/delegate.js.map +1 -0
  153. package/dist/kernel/delegation-approval.d.ts.map +1 -0
  154. package/dist/kernel/delegation-approval.js +93 -0
  155. package/dist/kernel/delegation-approval.js.map +1 -0
  156. package/dist/kernel/env-names.d.ts +51 -0
  157. package/dist/kernel/env-names.d.ts.map +1 -0
  158. package/dist/kernel/env-names.js +112 -0
  159. package/dist/kernel/env-names.js.map +1 -0
  160. package/dist/kernel/execution-id.d.ts.map +1 -0
  161. package/dist/kernel/execution-id.js.map +1 -0
  162. package/dist/kernel/fanout.d.ts.map +1 -0
  163. package/dist/kernel/fanout.js +93 -0
  164. package/dist/kernel/fanout.js.map +1 -0
  165. package/dist/kernel/grant-env.d.ts +118 -0
  166. package/dist/kernel/grant-env.d.ts.map +1 -0
  167. package/dist/kernel/grant-env.js +104 -0
  168. package/dist/kernel/grant-env.js.map +1 -0
  169. package/dist/kernel/ledger-identifiers.d.ts.map +1 -0
  170. package/dist/kernel/ledger-identifiers.js.map +1 -0
  171. package/dist/kernel/model-preflight.d.ts +13 -0
  172. package/dist/kernel/model-preflight.d.ts.map +1 -0
  173. package/dist/kernel/model-preflight.js +30 -0
  174. package/dist/kernel/model-preflight.js.map +1 -0
  175. package/dist/kernel/pi-tools.d.ts.map +1 -0
  176. package/dist/kernel/pi-tools.js +29 -0
  177. package/dist/kernel/pi-tools.js.map +1 -0
  178. package/dist/kernel/progress.d.ts.map +1 -0
  179. package/dist/kernel/progress.js.map +1 -0
  180. package/dist/kernel/project-paths.d.ts +43 -0
  181. package/dist/kernel/project-paths.d.ts.map +1 -0
  182. package/dist/kernel/project-paths.js +81 -0
  183. package/dist/kernel/project-paths.js.map +1 -0
  184. package/dist/kernel/propagation.d.ts +195 -0
  185. package/dist/kernel/propagation.d.ts.map +1 -0
  186. package/dist/kernel/propagation.js +275 -0
  187. package/dist/kernel/propagation.js.map +1 -0
  188. package/dist/kernel/refusals.d.ts +16 -0
  189. package/dist/kernel/refusals.d.ts.map +1 -0
  190. package/dist/kernel/refusals.js +53 -0
  191. package/dist/kernel/refusals.js.map +1 -0
  192. package/dist/kernel/resolve.d.ts.map +1 -0
  193. package/dist/kernel/resolve.js +201 -0
  194. package/dist/kernel/resolve.js.map +1 -0
  195. package/dist/kernel/routing-authority.d.ts.map +1 -0
  196. package/dist/kernel/routing-authority.js.map +1 -0
  197. package/dist/kernel/run-child.d.ts +111 -0
  198. package/dist/kernel/run-child.d.ts.map +1 -0
  199. package/dist/kernel/run-child.js +324 -0
  200. package/dist/kernel/run-child.js.map +1 -0
  201. package/dist/kernel/skill-packages.d.ts +116 -0
  202. package/dist/kernel/skill-packages.d.ts.map +1 -0
  203. package/dist/kernel/skill-packages.js +300 -0
  204. package/dist/kernel/skill-packages.js.map +1 -0
  205. package/dist/kernel/skill-resources.d.ts.map +1 -0
  206. package/dist/kernel/skill-resources.js +56 -0
  207. package/dist/kernel/skill-resources.js.map +1 -0
  208. package/dist/kernel/spawn.d.ts.map +1 -0
  209. package/dist/kernel/spawn.js.map +1 -0
  210. package/dist/kernel/workspace.d.ts +51 -0
  211. package/dist/kernel/workspace.d.ts.map +1 -0
  212. package/dist/kernel/workspace.js +223 -0
  213. package/dist/kernel/workspace.js.map +1 -0
  214. package/dist/products/activity-timeline.d.ts +126 -0
  215. package/dist/products/activity-timeline.d.ts.map +1 -0
  216. package/dist/products/activity-timeline.js +542 -0
  217. package/dist/products/activity-timeline.js.map +1 -0
  218. package/dist/products/dashboard-cli.d.ts +26 -0
  219. package/dist/products/dashboard-cli.d.ts.map +1 -0
  220. package/dist/products/dashboard-cli.js +224 -0
  221. package/dist/products/dashboard-cli.js.map +1 -0
  222. package/dist/products/dashboard-display-controls.d.ts +17 -0
  223. package/dist/products/dashboard-display-controls.d.ts.map +1 -0
  224. package/dist/products/dashboard-display-controls.js +38 -0
  225. package/dist/products/dashboard-display-controls.js.map +1 -0
  226. package/dist/products/dashboard-handshake.d.ts +42 -0
  227. package/dist/products/dashboard-handshake.d.ts.map +1 -0
  228. package/dist/products/dashboard-handshake.js +158 -0
  229. package/dist/products/dashboard-handshake.js.map +1 -0
  230. package/dist/products/dashboard-herdr.d.ts +55 -0
  231. package/dist/products/dashboard-herdr.d.ts.map +1 -0
  232. package/dist/products/dashboard-herdr.js +324 -0
  233. package/dist/products/dashboard-herdr.js.map +1 -0
  234. package/dist/products/dashboard-projection.d.ts +62 -0
  235. package/dist/products/dashboard-projection.d.ts.map +1 -0
  236. package/dist/products/dashboard-projection.js +305 -0
  237. package/dist/products/dashboard-projection.js.map +1 -0
  238. package/dist/products/dashboard-render.d.ts.map +1 -0
  239. package/dist/products/dashboard-render.js +208 -0
  240. package/dist/products/dashboard-render.js.map +1 -0
  241. package/extensions/activity-timeline.ts +196 -0
  242. package/extensions/approval-banking.ts +3 -3
  243. package/extensions/approvals.ts +18 -12
  244. package/extensions/chain-approval-facts.ts +9 -6
  245. package/extensions/chain-ledger.ts +4 -4
  246. package/extensions/chain-plan.ts +6 -6
  247. package/extensions/correlation-shape.ts +42 -33
  248. package/extensions/delegate-chain.ts +93 -45
  249. package/extensions/delegation-authority.ts +7 -3
  250. package/extensions/delegation-ledger.ts +2 -2
  251. package/extensions/delegation-native.ts +24 -7
  252. package/extensions/delegation.ts +91 -80
  253. package/extensions/execute-child.ts +440 -293
  254. package/extensions/execution-occurrence.ts +2 -2
  255. package/extensions/executor-session.ts +5 -5
  256. package/extensions/fanout-outcome.ts +8 -6
  257. package/extensions/grant-store-refusal.ts +24 -12
  258. package/extensions/grants-command.ts +41 -33
  259. package/extensions/grants-connected-command.ts +29 -15
  260. package/extensions/grants.ts +78 -77
  261. package/extensions/init-command.ts +18 -12
  262. package/extensions/reload-environment.ts +12 -5
  263. package/extensions/run-delegation.ts +29 -19
  264. package/extensions/session-environment.ts +31 -14
  265. package/extensions/session-report.ts +60 -10
  266. package/extensions/session.ts +76 -66
  267. package/extensions/spawn-summary.ts +5 -5
  268. package/extensions/stored-grant-session.ts +5 -5
  269. package/extensions/tripwire.ts +1 -1
  270. package/extensions/workspace-runtime.ts +26 -24
  271. package/herdr-plugin/herdr-plugin.toml +1 -1
  272. package/package.json +5 -212
  273. package/src/cli.ts +136 -89
  274. package/src/executors/activity-session.ts +54 -0
  275. package/src/executors/executor.ts +123 -0
  276. package/src/executors/herdr-cli.ts +132 -0
  277. package/src/executors/herdr-pi-lifecycle.ts +21 -0
  278. package/src/executors/herdr-poll.ts +305 -0
  279. package/src/executors/herdr-stage.ts +55 -0
  280. package/src/executors/native-session-target.ts +31 -0
  281. package/src/executors/pane-reaper.ts +270 -0
  282. package/src/executors/process-activity.ts +54 -0
  283. package/src/executors/run-herdr.ts +426 -0
  284. package/src/governance/approval-prompt.ts +225 -0
  285. package/src/governance/approval-store.ts +385 -0
  286. package/src/governance/execution-retention.ts +372 -0
  287. package/src/governance/file-lock.ts +210 -0
  288. package/src/governance/finalization.ts +82 -0
  289. package/src/governance/grant-store.ts +235 -0
  290. package/src/governance/init.ts +447 -0
  291. package/src/governance/lease-helper.ts +124 -0
  292. package/src/governance/lease-record.ts +131 -0
  293. package/src/governance/ledger-events.ts +222 -0
  294. package/src/governance/ledger-report.ts +396 -0
  295. package/src/governance/ledger-v3-validation.ts +384 -0
  296. package/src/governance/ledger.ts +419 -0
  297. package/src/governance/native-session.ts +264 -0
  298. package/src/governance/record.ts +294 -0
  299. package/src/governance/retention-contract.ts +201 -0
  300. package/src/governance/retention-json.ts +24 -0
  301. package/src/governance/workspace-lease.ts +429 -0
  302. package/src/index.ts +82 -92
  303. package/src/kernel/approval.ts +406 -0
  304. package/src/kernel/capabilities.ts +216 -0
  305. package/src/kernel/catalog.ts +313 -0
  306. package/src/kernel/correlation.ts +351 -0
  307. package/src/kernel/definitions.ts +215 -0
  308. package/src/kernel/delegate-types.ts +162 -0
  309. package/src/kernel/delegate.ts +370 -0
  310. package/src/kernel/delegation-approval.ts +126 -0
  311. package/src/kernel/env-names.ts +119 -0
  312. package/src/kernel/fanout.ts +106 -0
  313. package/src/kernel/grant-env.ts +174 -0
  314. package/src/kernel/model-preflight.ts +44 -0
  315. package/src/kernel/pi-tools.ts +32 -0
  316. package/src/kernel/project-paths.ts +97 -0
  317. package/src/kernel/propagation.ts +341 -0
  318. package/src/kernel/refusals.ts +64 -0
  319. package/src/kernel/resolve.ts +258 -0
  320. package/src/kernel/run-child.ts +418 -0
  321. package/src/kernel/skill-packages.ts +329 -0
  322. package/src/kernel/skill-resources.ts +64 -0
  323. package/src/kernel/workspace.ts +336 -0
  324. package/src/products/activity-timeline.ts +679 -0
  325. package/src/products/dashboard-cli.ts +250 -0
  326. package/src/products/dashboard-display-controls.ts +44 -0
  327. package/src/products/dashboard-handshake.ts +222 -0
  328. package/src/products/dashboard-herdr.ts +427 -0
  329. package/src/products/dashboard-projection.ts +389 -0
  330. package/src/products/dashboard-render.ts +260 -0
  331. package/PRODUCT-GUIDE.md +0 -136
  332. package/REQUIREMENTS.md +0 -41
  333. package/contracts/daily-view/v1/README.md +0 -114
  334. package/contracts/daily-view/v1/fixtures/view.json +0 -525
  335. package/contracts/daily-view/v1/fixtures/view.txt +0 -75
  336. package/contracts/daily-view/v1/fixtures/work.jsonl +0 -17
  337. package/contracts/daily-view/v1/p03/README.md +0 -26
  338. package/contracts/daily-view/v1/p03/fixtures/retained-executions.json +0 -241
  339. package/contracts/daily-view/v1/p03/projection.schema.json +0 -194
  340. package/contracts/daily-view/v1/p03/provenance.json +0 -21
  341. package/contracts/dashboard-host/v1/README.md +0 -176
  342. package/contracts/debrief/v1/README.md +0 -146
  343. package/contracts/debrief/v1/intervention/README.md +0 -32
  344. package/contracts/debrief/v1/intervention/fixtures/artifact-3ee11136beb864f518252e5024dae9197421fbf97b6e981d3243c782b5c44bd0.txt +0 -1
  345. package/contracts/debrief/v1/intervention/fixtures/artifact-58905d872dd3c54a9705f67b05fa82edbad7af6476ae8993faf1a7b9fadfb905.txt +0 -1
  346. package/contracts/debrief/v1/intervention/fixtures/assessment.json +0 -29
  347. package/contracts/debrief/v1/intervention/fixtures/blind-view.json +0 -20
  348. package/contracts/debrief/v1/intervention/fixtures/choice.json +0 -7
  349. package/contracts/debrief/v1/intervention/fixtures/manifest.json +0 -57
  350. package/contracts/debrief/v1/intervention/fixtures/reveal.json +0 -39
  351. package/contracts/debrief/v1/provenance.json +0 -89
  352. package/contracts/debrief/v1/work-capture/README.md +0 -38
  353. package/contracts/debrief/v1/work-capture/fixtures/batch.json +0 -17
  354. package/contracts/debrief/v1/work-capture/fixtures/cases.json +0 -184
  355. package/contracts/debrief/v1/work-capture/fixtures/review.json +0 -184
  356. package/contracts/debrief/v1/work-capture/review-request.schema.json +0 -41
  357. package/contracts/debrief/v1/work-capture/work-case.schema.json +0 -190
  358. package/contracts/debrief/v2/README.md +0 -71
  359. package/contracts/debrief/v2/input-pin.json +0 -66
  360. package/contracts/debrief/v2/intervention-upstream.md +0 -40
  361. package/contracts/debrief/v2/work-signals-upstream.md +0 -22
  362. package/contracts/dispatch-control/v1/README.md +0 -109
  363. package/contracts/dispatch-control/v1/request.schema.json +0 -19
  364. package/contracts/effect-profile/v1/README.md +0 -124
  365. package/contracts/execution-retention/v1/README.md +0 -109
  366. package/contracts/execution-retention/v2/README.md +0 -148
  367. package/contracts/execution-retention/v2/fixtures/interrupted-native-bytes.json +0 -91
  368. package/contracts/execution-retention/v2/fixtures/missing-native-session.json +0 -91
  369. package/contracts/execution-retention/v2/fixtures/native-file-unknown-branch.json +0 -91
  370. package/contracts/execution-retention/v2/fixtures/native-id-without-bytes.json +0 -91
  371. package/contracts/execution-retention/v2/fixtures/native-live-branch.json +0 -90
  372. package/contracts/execution-retention/v2/fixtures/replaced-native-session.json +0 -92
  373. package/contracts/execution-retention/v2/fixtures/result-82c620cdfeb8ca6b858cf653d7f5e2eedca5315d6244216d60e8b36f03223d6a.bin +0 -1
  374. package/contracts/execution-retention/v2/fixtures/session-2ec1f134bc739984434f7fca689e1c3d1c39fce2dcadae709e9b6faedfcc4ac7.bin +0 -3
  375. package/contracts/execution-retention/v2/fixtures/session-9bdb4bd16a901da31580acf056bda525225259e15ec409e0410480109011772f.bin +0 -3
  376. package/contracts/execution-retention/v2/manifest.schema.json +0 -858
  377. package/contracts/experiment/v1/README.md +0 -164
  378. package/contracts/factory-order/v1/README.md +0 -151
  379. package/contracts/factory-order/v1/adoption-pin.json +0 -8
  380. package/contracts/intent-control/v1/README.md +0 -135
  381. package/contracts/intent-control/v1/request.schema.json +0 -1096
  382. package/contracts/intent-control/v2/README.md +0 -34
  383. package/contracts/intent-control/v2/request.schema.json +0 -1070
  384. package/contracts/ledger/v2/README.md +0 -59
  385. package/contracts/ledger/v2/fixtures/capability-decision.json +0 -95
  386. package/contracts/ledger/v2/fixtures/check-receipt.json +0 -40
  387. package/contracts/ledger/v2/fixtures/child-lifecycle.json +0 -42
  388. package/contracts/ledger/v2/fixtures/workspace-lease.json +0 -41
  389. package/contracts/ledger/v2/ledger-event.schema.json +0 -633
  390. package/contracts/ledger/v3/README.md +0 -36
  391. package/contracts/ledger/v3/fixtures/check-receipt.json +0 -41
  392. package/contracts/ledger/v3/fixtures/child-lifecycle.json +0 -44
  393. package/contracts/ledger/v3/fixtures/workflow-fact.json +0 -40
  394. package/contracts/ledger/v3/ledger-event.schema.json +0 -955
  395. package/contracts/ledger/v4/README.md +0 -241
  396. package/contracts/ledger/v4/fixtures/layout-options.json +0 -428
  397. package/contracts/ledger/v4/fixtures/work-acceptance.json +0 -57
  398. package/contracts/ledger/v4/fixtures/work-occurrence.json +0 -44
  399. package/contracts/ledger/v4/fixtures/work-revision.json +0 -26
  400. package/contracts/ledger/v4/fixtures/work-snapshot.json +0 -73
  401. package/contracts/ledger/v4/ledger-event.schema.json +0 -162
  402. package/contracts/ordinary-control/v1/README.md +0 -59
  403. package/contracts/producer-ipc/v1/README.md +0 -137
  404. package/dist/approval-prompt.d.ts +0 -119
  405. package/dist/approval-prompt.d.ts.map +0 -1
  406. package/dist/approval-prompt.js +0 -133
  407. package/dist/approval-prompt.js.map +0 -1
  408. package/dist/approval-store.d.ts +0 -149
  409. package/dist/approval-store.d.ts.map +0 -1
  410. package/dist/approval-store.js +0 -314
  411. package/dist/approval-store.js.map +0 -1
  412. package/dist/approval.d.ts +0 -241
  413. package/dist/approval.d.ts.map +0 -1
  414. package/dist/approval.js +0 -268
  415. package/dist/approval.js.map +0 -1
  416. package/dist/capabilities.d.ts +0 -136
  417. package/dist/capabilities.d.ts.map +0 -1
  418. package/dist/capabilities.js +0 -203
  419. package/dist/capabilities.js.map +0 -1
  420. package/dist/catalog.d.ts +0 -98
  421. package/dist/catalog.d.ts.map +0 -1
  422. package/dist/catalog.js +0 -273
  423. package/dist/catalog.js.map +0 -1
  424. package/dist/chain.d.ts.map +0 -1
  425. package/dist/chain.js.map +0 -1
  426. package/dist/check-runner.d.ts +0 -66
  427. package/dist/check-runner.d.ts.map +0 -1
  428. package/dist/check-runner.js +0 -275
  429. package/dist/check-runner.js.map +0 -1
  430. package/dist/control-journal.d.ts +0 -20
  431. package/dist/control-journal.d.ts.map +0 -1
  432. package/dist/control-journal.js +0 -73
  433. package/dist/control-journal.js.map +0 -1
  434. package/dist/correlation.d.ts.map +0 -1
  435. package/dist/correlation.js +0 -231
  436. package/dist/correlation.js.map +0 -1
  437. package/dist/daily-dashboard-host.d.ts +0 -136
  438. package/dist/daily-dashboard-host.d.ts.map +0 -1
  439. package/dist/daily-dashboard-host.js +0 -164
  440. package/dist/daily-dashboard-host.js.map +0 -1
  441. package/dist/daily-panel.d.ts +0 -36
  442. package/dist/daily-panel.d.ts.map +0 -1
  443. package/dist/daily-panel.js +0 -84
  444. package/dist/daily-panel.js.map +0 -1
  445. package/dist/daily-view-input.d.ts +0 -44
  446. package/dist/daily-view-input.d.ts.map +0 -1
  447. package/dist/daily-view-input.js +0 -68
  448. package/dist/daily-view-input.js.map +0 -1
  449. package/dist/daily-view-render.d.ts +0 -5
  450. package/dist/daily-view-render.d.ts.map +0 -1
  451. package/dist/daily-view-render.js +0 -42
  452. package/dist/daily-view-render.js.map +0 -1
  453. package/dist/daily-view.d.ts +0 -77
  454. package/dist/daily-view.d.ts.map +0 -1
  455. package/dist/daily-view.js +0 -176
  456. package/dist/daily-view.js.map +0 -1
  457. package/dist/dashboard-cli.d.ts +0 -48
  458. package/dist/dashboard-cli.d.ts.map +0 -1
  459. package/dist/dashboard-cli.js +0 -331
  460. package/dist/dashboard-cli.js.map +0 -1
  461. package/dist/dashboard-display-controls.d.ts +0 -10
  462. package/dist/dashboard-display-controls.d.ts.map +0 -1
  463. package/dist/dashboard-display-controls.js +0 -25
  464. package/dist/dashboard-display-controls.js.map +0 -1
  465. package/dist/dashboard-handshake.d.ts +0 -37
  466. package/dist/dashboard-handshake.d.ts.map +0 -1
  467. package/dist/dashboard-handshake.js +0 -136
  468. package/dist/dashboard-handshake.js.map +0 -1
  469. package/dist/dashboard-harness.d.ts +0 -22
  470. package/dist/dashboard-harness.d.ts.map +0 -1
  471. package/dist/dashboard-harness.js +0 -89
  472. package/dist/dashboard-harness.js.map +0 -1
  473. package/dist/dashboard-herdr.d.ts +0 -55
  474. package/dist/dashboard-herdr.d.ts.map +0 -1
  475. package/dist/dashboard-herdr.js +0 -293
  476. package/dist/dashboard-herdr.js.map +0 -1
  477. package/dist/dashboard-host-contract.d.ts +0 -127
  478. package/dist/dashboard-host-contract.d.ts.map +0 -1
  479. package/dist/dashboard-host-contract.js +0 -14
  480. package/dist/dashboard-host-contract.js.map +0 -1
  481. package/dist/dashboard-host-transport.d.ts +0 -16
  482. package/dist/dashboard-host-transport.d.ts.map +0 -1
  483. package/dist/dashboard-host-transport.js +0 -127
  484. package/dist/dashboard-host-transport.js.map +0 -1
  485. package/dist/dashboard-host.d.ts +0 -239
  486. package/dist/dashboard-host.d.ts.map +0 -1
  487. package/dist/dashboard-host.js +0 -474
  488. package/dist/dashboard-host.js.map +0 -1
  489. package/dist/dashboard-menu.d.ts +0 -16
  490. package/dist/dashboard-menu.d.ts.map +0 -1
  491. package/dist/dashboard-menu.js +0 -33
  492. package/dist/dashboard-menu.js.map +0 -1
  493. package/dist/dashboard-observation.d.ts +0 -28
  494. package/dist/dashboard-observation.d.ts.map +0 -1
  495. package/dist/dashboard-observation.js +0 -87
  496. package/dist/dashboard-observation.js.map +0 -1
  497. package/dist/dashboard-projection.d.ts +0 -73
  498. package/dist/dashboard-projection.d.ts.map +0 -1
  499. package/dist/dashboard-projection.js +0 -294
  500. package/dist/dashboard-projection.js.map +0 -1
  501. package/dist/dashboard-render.d.ts.map +0 -1
  502. package/dist/dashboard-render.js +0 -212
  503. package/dist/dashboard-render.js.map +0 -1
  504. package/dist/debrief-contract.d.ts +0 -65
  505. package/dist/debrief-contract.d.ts.map +0 -1
  506. package/dist/debrief-contract.js +0 -151
  507. package/dist/debrief-contract.js.map +0 -1
  508. package/dist/debrief-fixture.d.ts +0 -16
  509. package/dist/debrief-fixture.d.ts.map +0 -1
  510. package/dist/debrief-fixture.js +0 -41
  511. package/dist/debrief-fixture.js.map +0 -1
  512. package/dist/debrief-host.d.ts +0 -59
  513. package/dist/debrief-host.d.ts.map +0 -1
  514. package/dist/debrief-host.js +0 -49
  515. package/dist/debrief-host.js.map +0 -1
  516. package/dist/debrief-render.d.ts +0 -5
  517. package/dist/debrief-render.d.ts.map +0 -1
  518. package/dist/debrief-render.js +0 -65
  519. package/dist/debrief-render.js.map +0 -1
  520. package/dist/debrief.d.ts +0 -90
  521. package/dist/debrief.d.ts.map +0 -1
  522. package/dist/debrief.js +0 -263
  523. package/dist/debrief.js.map +0 -1
  524. package/dist/definitions.d.ts.map +0 -1
  525. package/dist/definitions.js +0 -164
  526. package/dist/definitions.js.map +0 -1
  527. package/dist/delegate-types.d.ts +0 -146
  528. package/dist/delegate-types.d.ts.map +0 -1
  529. package/dist/delegate-types.js +0 -8
  530. package/dist/delegate-types.js.map +0 -1
  531. package/dist/delegate.d.ts.map +0 -1
  532. package/dist/delegate.js +0 -305
  533. package/dist/delegate.js.map +0 -1
  534. package/dist/delegation-approval.d.ts.map +0 -1
  535. package/dist/delegation-approval.js +0 -94
  536. package/dist/delegation-approval.js.map +0 -1
  537. package/dist/dispatch-control.d.ts +0 -45
  538. package/dist/dispatch-control.d.ts.map +0 -1
  539. package/dist/dispatch-control.js +0 -76
  540. package/dist/dispatch-control.js.map +0 -1
  541. package/dist/effect-profile-runtime.d.ts +0 -40
  542. package/dist/effect-profile-runtime.d.ts.map +0 -1
  543. package/dist/effect-profile-runtime.js +0 -51
  544. package/dist/effect-profile-runtime.js.map +0 -1
  545. package/dist/effect-profile.d.ts +0 -40
  546. package/dist/effect-profile.d.ts.map +0 -1
  547. package/dist/effect-profile.js +0 -152
  548. package/dist/effect-profile.js.map +0 -1
  549. package/dist/execution-id.d.ts.map +0 -1
  550. package/dist/execution-id.js.map +0 -1
  551. package/dist/execution-retention.d.ts +0 -90
  552. package/dist/execution-retention.d.ts.map +0 -1
  553. package/dist/execution-retention.js +0 -247
  554. package/dist/execution-retention.js.map +0 -1
  555. package/dist/executor.d.ts +0 -39
  556. package/dist/executor.d.ts.map +0 -1
  557. package/dist/executor.js +0 -94
  558. package/dist/executor.js.map +0 -1
  559. package/dist/experiment-contract.d.ts +0 -56
  560. package/dist/experiment-contract.d.ts.map +0 -1
  561. package/dist/experiment-contract.js +0 -80
  562. package/dist/experiment-contract.js.map +0 -1
  563. package/dist/experiment-state.d.ts +0 -22
  564. package/dist/experiment-state.d.ts.map +0 -1
  565. package/dist/experiment-state.js +0 -79
  566. package/dist/experiment-state.js.map +0 -1
  567. package/dist/experiment-store.d.ts +0 -30
  568. package/dist/experiment-store.d.ts.map +0 -1
  569. package/dist/experiment-store.js +0 -147
  570. package/dist/experiment-store.js.map +0 -1
  571. package/dist/experiment.d.ts +0 -65
  572. package/dist/experiment.d.ts.map +0 -1
  573. package/dist/experiment.js +0 -362
  574. package/dist/experiment.js.map +0 -1
  575. package/dist/factory-contract.d.ts +0 -79
  576. package/dist/factory-contract.d.ts.map +0 -1
  577. package/dist/factory-contract.js +0 -89
  578. package/dist/factory-contract.js.map +0 -1
  579. package/dist/factory-migration.d.ts +0 -20
  580. package/dist/factory-migration.d.ts.map +0 -1
  581. package/dist/factory-migration.js +0 -55
  582. package/dist/factory-migration.js.map +0 -1
  583. package/dist/factory-order.d.ts +0 -848
  584. package/dist/factory-order.d.ts.map +0 -1
  585. package/dist/factory-order.js +0 -83
  586. package/dist/factory-order.js.map +0 -1
  587. package/dist/factory-registry.d.ts +0 -121
  588. package/dist/factory-registry.d.ts.map +0 -1
  589. package/dist/factory-registry.js +0 -133
  590. package/dist/factory-registry.js.map +0 -1
  591. package/dist/fanout.d.ts.map +0 -1
  592. package/dist/fanout.js +0 -93
  593. package/dist/fanout.js.map +0 -1
  594. package/dist/file-lock.d.ts.map +0 -1
  595. package/dist/file-lock.js +0 -201
  596. package/dist/file-lock.js.map +0 -1
  597. package/dist/finalization.d.ts.map +0 -1
  598. package/dist/finalization.js.map +0 -1
  599. package/dist/git-identity.d.ts +0 -13
  600. package/dist/git-identity.d.ts.map +0 -1
  601. package/dist/git-identity.js +0 -47
  602. package/dist/git-identity.js.map +0 -1
  603. package/dist/grant-env.d.ts +0 -75
  604. package/dist/grant-env.d.ts.map +0 -1
  605. package/dist/grant-env.js +0 -154
  606. package/dist/grant-env.js.map +0 -1
  607. package/dist/grant-store.d.ts +0 -96
  608. package/dist/grant-store.d.ts.map +0 -1
  609. package/dist/grant-store.js +0 -188
  610. package/dist/grant-store.js.map +0 -1
  611. package/dist/herdr-cli.d.ts +0 -78
  612. package/dist/herdr-cli.d.ts.map +0 -1
  613. package/dist/herdr-cli.js +0 -113
  614. package/dist/herdr-cli.js.map +0 -1
  615. package/dist/herdr-name.d.ts.map +0 -1
  616. package/dist/herdr-name.js.map +0 -1
  617. package/dist/herdr-pi-lifecycle.d.ts.map +0 -1
  618. package/dist/herdr-pi-lifecycle.js +0 -22
  619. package/dist/herdr-pi-lifecycle.js.map +0 -1
  620. package/dist/herdr-poll.d.ts +0 -133
  621. package/dist/herdr-poll.d.ts.map +0 -1
  622. package/dist/herdr-poll.js +0 -222
  623. package/dist/herdr-poll.js.map +0 -1
  624. package/dist/herdr-stage.d.ts +0 -40
  625. package/dist/herdr-stage.d.ts.map +0 -1
  626. package/dist/herdr-stage.js +0 -54
  627. package/dist/herdr-stage.js.map +0 -1
  628. package/dist/herdr-start.d.ts.map +0 -1
  629. package/dist/herdr-start.js.map +0 -1
  630. package/dist/init.d.ts +0 -117
  631. package/dist/init.d.ts.map +0 -1
  632. package/dist/init.js +0 -323
  633. package/dist/init.js.map +0 -1
  634. package/dist/intent-application.d.ts +0 -17
  635. package/dist/intent-application.d.ts.map +0 -1
  636. package/dist/intent-application.js +0 -114
  637. package/dist/intent-application.js.map +0 -1
  638. package/dist/intent-control.d.ts +0 -201
  639. package/dist/intent-control.d.ts.map +0 -1
  640. package/dist/intent-control.js +0 -110
  641. package/dist/intent-control.js.map +0 -1
  642. package/dist/intent-scheduling.d.ts +0 -9
  643. package/dist/intent-scheduling.d.ts.map +0 -1
  644. package/dist/intent-scheduling.js +0 -15
  645. package/dist/intent-scheduling.js.map +0 -1
  646. package/dist/learning-connection.d.ts +0 -127
  647. package/dist/learning-connection.d.ts.map +0 -1
  648. package/dist/learning-connection.js +0 -54
  649. package/dist/learning-connection.js.map +0 -1
  650. package/dist/lease-helper.d.ts.map +0 -1
  651. package/dist/lease-helper.js +0 -94
  652. package/dist/lease-helper.js.map +0 -1
  653. package/dist/lease-record.d.ts +0 -90
  654. package/dist/lease-record.d.ts.map +0 -1
  655. package/dist/lease-record.js.map +0 -1
  656. package/dist/ledger-append.d.ts +0 -15
  657. package/dist/ledger-append.d.ts.map +0 -1
  658. package/dist/ledger-append.js +0 -94
  659. package/dist/ledger-append.js.map +0 -1
  660. package/dist/ledger-events.d.ts +0 -131
  661. package/dist/ledger-events.d.ts.map +0 -1
  662. package/dist/ledger-events.js +0 -107
  663. package/dist/ledger-events.js.map +0 -1
  664. package/dist/ledger-identifiers.d.ts.map +0 -1
  665. package/dist/ledger-identifiers.js.map +0 -1
  666. package/dist/ledger-report.d.ts +0 -134
  667. package/dist/ledger-report.d.ts.map +0 -1
  668. package/dist/ledger-report.js +0 -271
  669. package/dist/ledger-report.js.map +0 -1
  670. package/dist/ledger-v3-validation.d.ts +0 -11
  671. package/dist/ledger-v3-validation.d.ts.map +0 -1
  672. package/dist/ledger-v3-validation.js +0 -265
  673. package/dist/ledger-v3-validation.js.map +0 -1
  674. package/dist/ledger.d.ts +0 -242
  675. package/dist/ledger.d.ts.map +0 -1
  676. package/dist/ledger.js +0 -142
  677. package/dist/ledger.js.map +0 -1
  678. package/dist/measured-order.d.ts +0 -249
  679. package/dist/measured-order.d.ts.map +0 -1
  680. package/dist/measured-order.js +0 -309
  681. package/dist/measured-order.js.map +0 -1
  682. package/dist/measured-session.d.ts +0 -97
  683. package/dist/measured-session.d.ts.map +0 -1
  684. package/dist/measured-session.js +0 -134
  685. package/dist/measured-session.js.map +0 -1
  686. package/dist/model-preflight.d.ts +0 -13
  687. package/dist/model-preflight.d.ts.map +0 -1
  688. package/dist/model-preflight.js +0 -29
  689. package/dist/model-preflight.js.map +0 -1
  690. package/dist/native-session-target.d.ts +0 -9
  691. package/dist/native-session-target.d.ts.map +0 -1
  692. package/dist/native-session-target.js +0 -29
  693. package/dist/native-session-target.js.map +0 -1
  694. package/dist/native-session.d.ts +0 -59
  695. package/dist/native-session.d.ts.map +0 -1
  696. package/dist/native-session.js +0 -154
  697. package/dist/native-session.js.map +0 -1
  698. package/dist/order-schedule.d.ts +0 -37
  699. package/dist/order-schedule.d.ts.map +0 -1
  700. package/dist/order-schedule.js +0 -81
  701. package/dist/order-schedule.js.map +0 -1
  702. package/dist/ordinary-children.d.ts +0 -52
  703. package/dist/ordinary-children.d.ts.map +0 -1
  704. package/dist/ordinary-children.js +0 -93
  705. package/dist/ordinary-children.js.map +0 -1
  706. package/dist/pane-reaper.d.ts +0 -111
  707. package/dist/pane-reaper.d.ts.map +0 -1
  708. package/dist/pane-reaper.js +0 -242
  709. package/dist/pane-reaper.js.map +0 -1
  710. package/dist/pi-tools.d.ts.map +0 -1
  711. package/dist/pi-tools.js +0 -21
  712. package/dist/pi-tools.js.map +0 -1
  713. package/dist/producer-ipc-contract.d.ts +0 -29
  714. package/dist/producer-ipc-contract.d.ts.map +0 -1
  715. package/dist/producer-ipc-contract.js +0 -29
  716. package/dist/producer-ipc-contract.js.map +0 -1
  717. package/dist/producer-ipc.d.ts +0 -55
  718. package/dist/producer-ipc.d.ts.map +0 -1
  719. package/dist/producer-ipc.js +0 -143
  720. package/dist/producer-ipc.js.map +0 -1
  721. package/dist/product-files.d.ts +0 -6
  722. package/dist/product-files.d.ts.map +0 -1
  723. package/dist/product-files.js +0 -55
  724. package/dist/product-files.js.map +0 -1
  725. package/dist/progress.d.ts.map +0 -1
  726. package/dist/progress.js.map +0 -1
  727. package/dist/propagation.d.ts +0 -203
  728. package/dist/propagation.d.ts.map +0 -1
  729. package/dist/propagation.js +0 -279
  730. package/dist/propagation.js.map +0 -1
  731. package/dist/refusals.d.ts +0 -16
  732. package/dist/refusals.d.ts.map +0 -1
  733. package/dist/refusals.js +0 -55
  734. package/dist/refusals.js.map +0 -1
  735. package/dist/resolve.d.ts.map +0 -1
  736. package/dist/resolve.js +0 -211
  737. package/dist/resolve.js.map +0 -1
  738. package/dist/resource-budget.d.ts +0 -334
  739. package/dist/resource-budget.d.ts.map +0 -1
  740. package/dist/resource-budget.js +0 -415
  741. package/dist/resource-budget.js.map +0 -1
  742. package/dist/retention-contract.d.ts.map +0 -1
  743. package/dist/retention-contract.js +0 -104
  744. package/dist/retention-contract.js.map +0 -1
  745. package/dist/retention-json.d.ts.map +0 -1
  746. package/dist/retention-json.js.map +0 -1
  747. package/dist/routing-authority.d.ts.map +0 -1
  748. package/dist/routing-authority.js.map +0 -1
  749. package/dist/run-child.d.ts +0 -87
  750. package/dist/run-child.d.ts.map +0 -1
  751. package/dist/run-child.js +0 -248
  752. package/dist/run-child.js.map +0 -1
  753. package/dist/run-herdr.d.ts +0 -119
  754. package/dist/run-herdr.d.ts.map +0 -1
  755. package/dist/run-herdr.js +0 -335
  756. package/dist/run-herdr.js.map +0 -1
  757. package/dist/skill-packages.d.ts +0 -116
  758. package/dist/skill-packages.d.ts.map +0 -1
  759. package/dist/skill-packages.js +0 -295
  760. package/dist/skill-packages.js.map +0 -1
  761. package/dist/skill-resources.d.ts.map +0 -1
  762. package/dist/skill-resources.js +0 -52
  763. package/dist/skill-resources.js.map +0 -1
  764. package/dist/spawn.d.ts.map +0 -1
  765. package/dist/spawn.js.map +0 -1
  766. package/dist/vendor/adoption.d.ts +0 -129
  767. package/dist/vendor/adoption.d.ts.map +0 -1
  768. package/dist/vendor/adoption.js +0 -102
  769. package/dist/vendor/adoption.js.map +0 -1
  770. package/dist/vendor/herdr-pi-lifecycle.d.ts.map +0 -1
  771. package/dist/vendor/herdr-pi-lifecycle.js.map +0 -1
  772. package/dist/work-command.d.ts +0 -32
  773. package/dist/work-command.d.ts.map +0 -1
  774. package/dist/work-command.js +0 -179
  775. package/dist/work-command.js.map +0 -1
  776. package/dist/work-ledger-destination.d.ts +0 -20
  777. package/dist/work-ledger-destination.d.ts.map +0 -1
  778. package/dist/work-ledger-destination.js +0 -131
  779. package/dist/work-ledger-destination.js.map +0 -1
  780. package/dist/work-ledger-json.d.ts +0 -25
  781. package/dist/work-ledger-json.d.ts.map +0 -1
  782. package/dist/work-ledger-json.js +0 -267
  783. package/dist/work-ledger-json.js.map +0 -1
  784. package/dist/work-ledger-occurrences.d.ts +0 -227
  785. package/dist/work-ledger-occurrences.d.ts.map +0 -1
  786. package/dist/work-ledger-occurrences.js +0 -115
  787. package/dist/work-ledger-occurrences.js.map +0 -1
  788. package/dist/work-ledger-projection.d.ts +0 -295
  789. package/dist/work-ledger-projection.d.ts.map +0 -1
  790. package/dist/work-ledger-projection.js +0 -237
  791. package/dist/work-ledger-projection.js.map +0 -1
  792. package/dist/work-ledger-snapshot.d.ts +0 -29
  793. package/dist/work-ledger-snapshot.d.ts.map +0 -1
  794. package/dist/work-ledger-snapshot.js +0 -267
  795. package/dist/work-ledger-snapshot.js.map +0 -1
  796. package/dist/work-ledger-types.d.ts +0 -261
  797. package/dist/work-ledger-types.d.ts.map +0 -1
  798. package/dist/work-ledger-types.js +0 -13
  799. package/dist/work-ledger-types.js.map +0 -1
  800. package/dist/work-ledger-validation.d.ts +0 -14
  801. package/dist/work-ledger-validation.d.ts.map +0 -1
  802. package/dist/work-ledger-validation.js +0 -226
  803. package/dist/work-ledger-validation.js.map +0 -1
  804. package/dist/work-ledger.d.ts +0 -43
  805. package/dist/work-ledger.d.ts.map +0 -1
  806. package/dist/work-ledger.js +0 -225
  807. package/dist/work-ledger.js.map +0 -1
  808. package/dist/work-policy-registry.d.ts +0 -133
  809. package/dist/work-policy-registry.d.ts.map +0 -1
  810. package/dist/work-policy-registry.js +0 -128
  811. package/dist/work-policy-registry.js.map +0 -1
  812. package/dist/work-run.d.ts +0 -56
  813. package/dist/work-run.d.ts.map +0 -1
  814. package/dist/work-run.js +0 -102
  815. package/dist/work-run.js.map +0 -1
  816. package/dist/work-setup.d.ts +0 -40
  817. package/dist/work-setup.d.ts.map +0 -1
  818. package/dist/work-setup.js +0 -174
  819. package/dist/work-setup.js.map +0 -1
  820. package/dist/workflow-fact-id.d.ts +0 -4
  821. package/dist/workflow-fact-id.d.ts.map +0 -1
  822. package/dist/workflow-fact-id.js +0 -14
  823. package/dist/workflow-fact-id.js.map +0 -1
  824. package/dist/workflow-facts.d.ts +0 -34
  825. package/dist/workflow-facts.d.ts.map +0 -1
  826. package/dist/workflow-facts.js +0 -43
  827. package/dist/workflow-facts.js.map +0 -1
  828. package/dist/workspace-lease.d.ts +0 -40
  829. package/dist/workspace-lease.d.ts.map +0 -1
  830. package/dist/workspace-lease.js +0 -333
  831. package/dist/workspace-lease.js.map +0 -1
  832. package/dist/workspace.d.ts +0 -57
  833. package/dist/workspace.d.ts.map +0 -1
  834. package/dist/workspace.js +0 -216
  835. package/dist/workspace.js.map +0 -1
  836. package/extensions/daily-dashboard-session.ts +0 -48
  837. package/extensions/daily-work-session.ts +0 -20
  838. package/extensions/learning-outcome-session.ts +0 -38
  839. package/extensions/learning-session.ts +0 -59
  840. package/extensions/ordinary-runtime.ts +0 -14
  841. package/extensions/primary-shadow.ts +0 -11
  842. package/extensions/work-policy-session.ts +0 -139
  843. package/extensions/work-run-session.ts +0 -75
  844. package/extensions/work-runtime.ts +0 -44
  845. package/extensions/work-session.ts +0 -132
  846. package/src/approval-prompt.ts +0 -225
  847. package/src/approval-store.ts +0 -386
  848. package/src/approval.ts +0 -399
  849. package/src/capabilities.ts +0 -220
  850. package/src/catalog.ts +0 -306
  851. package/src/check-runner.ts +0 -387
  852. package/src/control-journal.ts +0 -26
  853. package/src/correlation.ts +0 -320
  854. package/src/daily-dashboard-host.ts +0 -105
  855. package/src/daily-panel.ts +0 -80
  856. package/src/daily-view-input.ts +0 -59
  857. package/src/daily-view-render.ts +0 -45
  858. package/src/daily-view.ts +0 -160
  859. package/src/dashboard-cli.ts +0 -315
  860. package/src/dashboard-display-controls.ts +0 -18
  861. package/src/dashboard-handshake.ts +0 -194
  862. package/src/dashboard-harness.ts +0 -37
  863. package/src/dashboard-herdr.ts +0 -363
  864. package/src/dashboard-host-contract.ts +0 -50
  865. package/src/dashboard-host-transport.ts +0 -43
  866. package/src/dashboard-host.ts +0 -244
  867. package/src/dashboard-menu.ts +0 -28
  868. package/src/dashboard-observation.ts +0 -46
  869. package/src/dashboard-projection.ts +0 -390
  870. package/src/dashboard-render.ts +0 -259
  871. package/src/debrief-contract.ts +0 -127
  872. package/src/debrief-fixture.ts +0 -29
  873. package/src/debrief-host.ts +0 -53
  874. package/src/debrief-render.ts +0 -49
  875. package/src/debrief.ts +0 -198
  876. package/src/definitions.ts +0 -211
  877. package/src/delegate-types.ts +0 -150
  878. package/src/delegate.ts +0 -341
  879. package/src/delegation-approval.ts +0 -126
  880. package/src/dispatch-control.ts +0 -81
  881. package/src/effect-profile-runtime.ts +0 -46
  882. package/src/effect-profile.ts +0 -129
  883. package/src/execution-retention.ts +0 -230
  884. package/src/executor.ts +0 -123
  885. package/src/experiment-contract.ts +0 -66
  886. package/src/experiment-state.ts +0 -44
  887. package/src/experiment-store.ts +0 -98
  888. package/src/experiment.ts +0 -236
  889. package/src/factory-contract.ts +0 -47
  890. package/src/factory-migration.ts +0 -29
  891. package/src/factory-order.ts +0 -56
  892. package/src/factory-registry.ts +0 -60
  893. package/src/fanout.ts +0 -106
  894. package/src/file-lock.ts +0 -178
  895. package/src/finalization.ts +0 -79
  896. package/src/git-identity.ts +0 -56
  897. package/src/grant-env.ts +0 -221
  898. package/src/grant-store.ts +0 -235
  899. package/src/herdr-cli.ts +0 -125
  900. package/src/herdr-pi-lifecycle.ts +0 -21
  901. package/src/herdr-poll.ts +0 -253
  902. package/src/herdr-stage.ts +0 -55
  903. package/src/init.ts +0 -389
  904. package/src/intent-application.ts +0 -91
  905. package/src/intent-control.ts +0 -107
  906. package/src/intent-scheduling.ts +0 -14
  907. package/src/learning-connection.ts +0 -70
  908. package/src/lease-helper.ts +0 -97
  909. package/src/lease-record.ts +0 -131
  910. package/src/ledger-append.ts +0 -72
  911. package/src/ledger-events.ts +0 -226
  912. package/src/ledger-report.ts +0 -357
  913. package/src/ledger-v3-validation.ts +0 -266
  914. package/src/ledger.ts +0 -369
  915. package/src/measured-order.ts +0 -72
  916. package/src/measured-session.ts +0 -70
  917. package/src/model-preflight.ts +0 -41
  918. package/src/native-session-target.ts +0 -23
  919. package/src/native-session.ts +0 -139
  920. package/src/order-schedule.ts +0 -42
  921. package/src/ordinary-children.ts +0 -59
  922. package/src/pane-reaper.ts +0 -270
  923. package/src/pi-tools.ts +0 -25
  924. package/src/producer-ipc-contract.ts +0 -26
  925. package/src/producer-ipc.ts +0 -107
  926. package/src/product-files.ts +0 -34
  927. package/src/propagation.ts +0 -333
  928. package/src/refusals.ts +0 -70
  929. package/src/resolve.ts +0 -267
  930. package/src/resource-budget.ts +0 -349
  931. package/src/retention-contract.ts +0 -84
  932. package/src/retention-json.ts +0 -20
  933. package/src/run-child.ts +0 -303
  934. package/src/run-herdr.ts +0 -386
  935. package/src/skill-packages.ts +0 -314
  936. package/src/skill-resources.ts +0 -48
  937. package/src/vendor/adoption.ts +0 -109
  938. package/src/work-command.ts +0 -197
  939. package/src/work-ledger-destination.ts +0 -113
  940. package/src/work-ledger-json.ts +0 -228
  941. package/src/work-ledger-occurrences.ts +0 -99
  942. package/src/work-ledger-projection.ts +0 -262
  943. package/src/work-ledger-snapshot.ts +0 -246
  944. package/src/work-ledger-types.ts +0 -229
  945. package/src/work-ledger-validation.ts +0 -174
  946. package/src/work-ledger.ts +0 -186
  947. package/src/work-policy-registry.ts +0 -81
  948. package/src/work-run.ts +0 -79
  949. package/src/work-setup.ts +0 -141
  950. package/src/workflow-fact-id.ts +0 -16
  951. package/src/workflow-facts.ts +0 -65
  952. package/src/workspace-lease.ts +0 -363
  953. package/src/workspace.ts +0 -308
  954. /package/contracts/{ledger/v3 → ledger-record/v1}/fixtures/capability-decision.json +0 -0
  955. /package/contracts/{ledger/v3 → ledger-record/v1}/fixtures/workspace-lease.json +0 -0
  956. /package/dist/{herdr-name.d.ts → executors/herdr-name.d.ts} +0 -0
  957. /package/dist/{herdr-name.js → executors/herdr-name.js} +0 -0
  958. /package/dist/{herdr-pi-lifecycle.d.ts → executors/herdr-pi-lifecycle.d.ts} +0 -0
  959. /package/dist/{herdr-start.d.ts → executors/herdr-start.d.ts} +0 -0
  960. /package/dist/{herdr-start.js → executors/herdr-start.js} +0 -0
  961. /package/dist/{vendor → executors/vendor}/herdr-pi-lifecycle.d.ts +0 -0
  962. /package/dist/{vendor → executors/vendor}/herdr-pi-lifecycle.js +0 -0
  963. /package/dist/{file-lock.d.ts → governance/file-lock.d.ts} +0 -0
  964. /package/dist/{finalization.d.ts → governance/finalization.d.ts} +0 -0
  965. /package/dist/{finalization.js → governance/finalization.js} +0 -0
  966. /package/dist/{lease-helper.d.ts → governance/lease-helper.d.ts} +0 -0
  967. /package/dist/{lease-record.js → governance/lease-record.js} +0 -0
  968. /package/dist/{retention-contract.d.ts → governance/retention-contract.d.ts} +0 -0
  969. /package/dist/{retention-json.d.ts → governance/retention-json.d.ts} +0 -0
  970. /package/dist/{retention-json.js → governance/retention-json.js} +0 -0
  971. /package/dist/{chain.d.ts → kernel/chain.d.ts} +0 -0
  972. /package/dist/{chain.js → kernel/chain.js} +0 -0
  973. /package/dist/{correlation.d.ts → kernel/correlation.d.ts} +0 -0
  974. /package/dist/{definitions.d.ts → kernel/definitions.d.ts} +0 -0
  975. /package/dist/{delegate.d.ts → kernel/delegate.d.ts} +0 -0
  976. /package/dist/{delegation-approval.d.ts → kernel/delegation-approval.d.ts} +0 -0
  977. /package/dist/{execution-id.d.ts → kernel/execution-id.d.ts} +0 -0
  978. /package/dist/{execution-id.js → kernel/execution-id.js} +0 -0
  979. /package/dist/{fanout.d.ts → kernel/fanout.d.ts} +0 -0
  980. /package/dist/{ledger-identifiers.d.ts → kernel/ledger-identifiers.d.ts} +0 -0
  981. /package/dist/{ledger-identifiers.js → kernel/ledger-identifiers.js} +0 -0
  982. /package/dist/{pi-tools.d.ts → kernel/pi-tools.d.ts} +0 -0
  983. /package/dist/{progress.d.ts → kernel/progress.d.ts} +0 -0
  984. /package/dist/{progress.js → kernel/progress.js} +0 -0
  985. /package/dist/{resolve.d.ts → kernel/resolve.d.ts} +0 -0
  986. /package/dist/{routing-authority.d.ts → kernel/routing-authority.d.ts} +0 -0
  987. /package/dist/{routing-authority.js → kernel/routing-authority.js} +0 -0
  988. /package/dist/{skill-resources.d.ts → kernel/skill-resources.d.ts} +0 -0
  989. /package/dist/{spawn.d.ts → kernel/spawn.d.ts} +0 -0
  990. /package/dist/{spawn.js → kernel/spawn.js} +0 -0
  991. /package/dist/{dashboard-render.d.ts → products/dashboard-render.d.ts} +0 -0
  992. /package/src/{herdr-name.ts → executors/herdr-name.ts} +0 -0
  993. /package/src/{herdr-start.ts → executors/herdr-start.ts} +0 -0
  994. /package/src/{vendor → executors/vendor}/herdr-pi-lifecycle.ts +0 -0
  995. /package/src/{chain.ts → kernel/chain.ts} +0 -0
  996. /package/src/{execution-id.ts → kernel/execution-id.ts} +0 -0
  997. /package/src/{ledger-identifiers.ts → kernel/ledger-identifiers.ts} +0 -0
  998. /package/src/{progress.ts → kernel/progress.ts} +0 -0
  999. /package/src/{routing-authority.ts → kernel/routing-authority.ts} +0 -0
  1000. /package/src/{spawn.ts → kernel/spawn.ts} +0 -0
@@ -1,98 +0,0 @@
1
- import { constants } from "node:fs";
2
- import { lstat, mkdir, open, realpath } from "node:fs/promises";
3
- import { dirname, join, resolve } from "node:path";
4
- import { withFileLock } from "./file-lock.ts";
5
- import { runWithFinalizers } from "./finalization.ts";
6
- import { parseWorkJson, freezeWork } from "./work-ledger-json.ts";
7
- import { resourceBindingDigest, type ExperimentBudgetBinding } from "./resource-budget.ts";
8
- import { byteHash, cloneExperiment, closed, experimentCharter, experimentHash, type ExperimentCharter } from "./experiment-contract.ts";
9
- export interface ExperimentBinding { version: "experiment-binding-v1"; directory: string; device: string; inode: string; journalDevice: string; journalInode: string; budget: ExperimentBudgetBinding; charter: ExperimentCharter }
10
- export const experimentBindingDigest = (b: ExperimentBinding) => experimentHash(b);
11
- export async function ownedDirectory(path: string) {
12
- const s = await lstat(path, { bigint: true });
13
- if (!s.isDirectory() || s.isSymbolicLink() || s.uid !== BigInt(process.getuid!()) || (s.mode & 0o077n) !== 0n || await realpath(path) !== path) throw new Error("canonical private experiment directory required");
14
- return s;
15
- }
16
- export async function readExperimentFile(path: string, max: number, options: { appendOnly?: true } = {}): Promise<Buffer> {
17
- if (Object.keys(options).some(key => key !== "appendOnly") || options.appendOnly !== undefined && options.appendOnly !== true) throw new TypeError("invalid experiment read mode");
18
- const file = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
19
- return runWithFinalizers(async () => {
20
- const s = await file.stat({ bigint: true });
21
- if (!s.isFile() || s.nlink !== 1n || s.uid !== BigInt(process.getuid!()) || (s.mode & 0o077n) !== 0n || s.size > BigInt(max)) throw new Error("unsafe experiment file");
22
- const data = Buffer.alloc(Number(s.size)); let offset = 0;
23
- while (offset < data.length) { const n = (await file.read(data, offset, data.length - offset, offset)).bytesRead; if (!n) throw new Error("short experiment read"); offset += n; }
24
- const end = await file.stat({ bigint: true }), current = await lstat(path, { bigint: true });
25
- const identityChanged = current.dev !== s.dev || current.ino !== s.ino || current.nlink !== 1n;
26
- if (!options.appendOnly && (end.size !== s.size || end.mtimeNs !== s.mtimeNs || identityChanged)) throw new Error("experiment source changed");
27
- if (options.appendOnly) {
28
- if (end.size < s.size || identityChanged) throw new Error("experiment source changed");
29
- const verify = Buffer.alloc(data.length); let checked = 0;
30
- while (checked < verify.length) { const n = (await file.read(verify, checked, verify.length - checked, checked)).bytesRead; if (!n) throw new Error("short experiment read"); checked += n; }
31
- if (!verify.equals(data)) throw new Error("experiment source changed");
32
- }
33
- return data;
34
- }, [{ label: "experiment read close failed", run: () => file.close() }]);
35
- }
36
- export async function writeExperimentFile(path: string, bytes: Uint8Array) {
37
- const f = await open(path, "wx", 0o600);
38
- await runWithFinalizers(async () => { await f.writeFile(bytes); await f.sync(); await f.chmod(0o400); }, [{ label: "experiment artifact close failed", run: () => f.close() }]);
39
- const dir = await open(dirname(path), constants.O_RDONLY | constants.O_DIRECTORY);
40
- await runWithFinalizers(() => dir.sync(), [{ label: "experiment artifact directory close failed", run: () => dir.close() }]);
41
- }
42
- export function validateExperimentBinding(value: ExperimentBinding): ExperimentBinding {
43
- const b = cloneExperiment(value); closed(b, ["version", "directory", "device", "inode", "journalDevice", "journalInode", "budget", "charter"]);
44
- if (b.version !== "experiment-binding-v1" || typeof b.directory !== "string" || b.directory !== resolve(b.directory) || b.directory.length > 1024 || b.directory.split("/").includes(".pi") || [b.device, b.inode, b.journalDevice, b.journalInode].some(v => typeof v !== "string" || !/^\d+$/.test(v)) || b.budget.version !== "4.0") throw new TypeError("independent experiment binding required");
45
- b.charter = experimentCharter(b.charter);
46
- if (resourceBindingDigest(b.budget) !== b.charter.budgetDigest) throw new TypeError("experiment budget mismatch");
47
- return freezeWork(b) as ExperimentBinding;
48
- }
49
- export async function createExperimentStore(directory: string, budget: ExperimentBudgetBinding, charter: ExperimentCharter, bytes: Uint8Array): Promise<ExperimentBinding> {
50
- if (directory !== resolve(directory) || directory.split("/").includes(".pi")) throw new Error("explicit unprotected absolute destination required");
51
- await ownedDirectory(dirname(directory)); await mkdir(directory, { mode: 0o700 }); const s = await ownedDirectory(directory);
52
- await writeExperimentFile(join(directory, "common.bin"), bytes);
53
- for (const v of charter.variants) await mkdir(join(directory, "variant-" + byteHash(v.executionId)), { mode: 0o700 });
54
- const journal = await open(join(directory, "experiment.jsonl"), "wx", 0o600);
55
- const b = await runWithFinalizers(async () => {
56
- const st = await journal.stat({ bigint: true });
57
- const value = validateExperimentBinding({ version: "experiment-binding-v1", directory, device: String(s.dev), inode: String(s.ino), journalDevice: String(st.dev), journalInode: String(st.ino), budget, charter });
58
- await journal.writeFile(JSON.stringify(value) + "\n"); await journal.sync(); return value;
59
- }, [{ label: "experiment creation close failed", run: () => journal.close() }]);
60
- const dir = await open(directory, constants.O_RDONLY | constants.O_DIRECTORY);
61
- await runWithFinalizers(() => dir.sync(), [{ label: "experiment creation directory close failed", run: () => dir.close() }]); return b;
62
- }
63
- export function experimentStore(value: ExperimentBinding) {
64
- const b = validateExperimentBinding(value), path = join(b.directory, "experiment.jsonl");
65
- const check = async () => {
66
- const root = await ownedDirectory(b.directory), file = await lstat(path, { bigint: true });
67
- if (String(root.dev) !== b.device || String(root.ino) !== b.inode || String(file.dev) !== b.journalDevice || String(file.ino) !== b.journalInode) throw new Error("experiment identity replaced");
68
- };
69
- const read = async () => {
70
- await check(); const bytes = await readExperimentFile(path, 256 * 1024, { appendOnly: true }); await check();
71
- const text = new TextDecoder("utf8", { fatal: true }).decode(bytes); if (!text.endsWith("\n")) throw new Error("torn experiment journal");
72
- const lines = text.slice(0, -1).split("\n"); if (lines.length > 260 || experimentHash(parseWorkJson(lines[0])) !== experimentHash(b)) throw new Error("experiment header/bound mismatch");
73
- let previous = experimentHash(b); const events: Record<string, unknown>[] = [];
74
- for (const line of lines.slice(1)) {
75
- const record = parseWorkJson(line) as Record<string, unknown>; closed(record, ["seq", "previous", "event"]);
76
- if (record.seq !== events.length || record.previous !== previous || !record.event || typeof record.event !== "object" || Array.isArray(record.event)) throw new Error("invalid experiment sequence");
77
- previous = experimentHash(record); events.push(record.event as Record<string, unknown>);
78
- }
79
- return { events, previous, bytes: bytes.length };
80
- };
81
- return { binding: b, read, async transaction<T>(fn: (events: Record<string, unknown>[], append: (event: unknown) => Promise<void>) => Promise<T>) {
82
- await check(); return withFileLock(path, "experiment", async () => {
83
- const state = await read(); let size = state.bytes;
84
- return fn(state.events, async event => {
85
- if (state.events.length >= 258) throw new Error("experiment record bound reached");
86
- const record = { seq: state.events.length, previous: state.previous, event }, data = Buffer.from(JSON.stringify(record) + "\n");
87
- if (size + data.length > 256 * 1024) throw new Error("experiment journal byte bound reached");
88
- await check(); const f = await open(path, constants.O_WRONLY | constants.O_APPEND | constants.O_NOFOLLOW | constants.O_NONBLOCK);
89
- await runWithFinalizers(async () => {
90
- const s = await f.stat({ bigint: true });
91
- if (!s.isFile() || s.nlink !== 1n || String(s.dev) !== b.journalDevice || String(s.ino) !== b.journalInode || s.size !== BigInt(size) || (s.mode & 0o077n) !== 0n) throw new Error("journal changed under lock");
92
- await f.writeFile(data); await f.sync();
93
- }, [{ label: "experiment append close failed", run: () => f.close() }]);
94
- size += data.length; await check(); state.previous = experimentHash(record); state.events.push(cloneExperiment(event) as Record<string, unknown>);
95
- });
96
- }, { staleRecovery: "disabled" });
97
- } };
98
- }
package/src/experiment.ts DELETED
@@ -1,236 +0,0 @@
1
- import { randomUUID } from "node:crypto";
2
- import { join } from "node:path";
3
- import { MAX_CHILDREN_PER_CALL } from "./fanout.ts";
4
- import { openResourceBudget, resourceBindingDigest, type ExperimentBudgetBinding, type BudgetSnapshot } from "./resource-budget.ts";
5
- import { isDigestProfile, reserveDigestProfileBatch, type DigestProfile, type ReservedDigestRun } from "./effect-profile.ts";
6
- import { readIntentWork, resolveIntent } from "./intent-application.ts";
7
- import { freezeWork } from "./work-ledger-json.ts";
8
- import { byteHash, cloneExperiment, experimentAuthority, experimentCancellation, experimentCancellationDigest, experimentCharter, experimentCharterDigest,
9
- type ExperimentAuthority, type ExperimentCancellation, type ExperimentCharter } from "./experiment-contract.ts";
10
- import { createExperimentStore, experimentBindingDigest, experimentStore, ownedDirectory, readExperimentFile, writeExperimentFile, type ExperimentBinding } from "./experiment-store.ts";
11
- import { evaluateOrder, factoryDecision, factoryDecisionDigest, type FactoryDecision } from "./order-schedule.ts";
12
- import { replayExperiment, type VariantRecord } from "./experiment-state.ts";
13
- export { experimentCharterDigest, experimentCancellationDigest, parseExperimentCharter, type ExperimentCharter, type ExperimentAuthority, type ExperimentCancellation } from "./experiment-contract.ts";
14
- export { experimentBindingDigest, type ExperimentBinding } from "./experiment-store.ts";
15
- export interface ExperimentView {
16
- version: "experiment-view-v1"; experimentId: string; mode: ExperimentCharter["mode"]; variants: readonly VariantRecord[];
17
- budget: Readonly<BudgetSnapshot> | null; cancellations: readonly { request: ExperimentCancellation; outcome: "requested-or-unknown" | "observed-cancelled" | "finished-without-cancel" }[];
18
- control: "not-assessed" | "failed" | "unknown"; diagnostics: readonly string[]; acceptance: "not-assessed"; configuration: { model: null; effort: null; skills: null }; freshness: "snapshot-unknown";
19
- }
20
- function approved(a: ExperimentAuthority | null, b: ExperimentBudgetBinding, c: ExperimentCharter) {
21
- if (!a || a.authorityDigest !== b.authorityDigest || !a.charterDigests.includes(experimentCharterDigest(c))) throw new Error("independent exact experiment authority unavailable");
22
- }
23
- async function common(c: ExperimentCharter, bytes: Uint8Array) {
24
- if (bytes.length !== c.common.bytes || byteHash(bytes) !== c.common.sha256) throw new Error("common input drift");
25
- if (c.common.work) {
26
- const text = await readIntentWork(c.common.work);
27
- if (byteHash(text) !== c.common.workTextDigest) throw new Error("common P01 work drift");
28
- resolveIntent(text, c.common.work.selection, c.common.work.priorities);
29
- }
30
- }
31
- export async function createExperiment(input: { directory: string; budget: ExperimentBudgetBinding; charter: ExperimentCharter; bytes: Uint8Array; authority: ExperimentAuthority | null }): Promise<ExperimentBinding> {
32
- if (!(input.bytes instanceof Uint8Array) || input.bytes.length > 16384) throw new TypeError("bounded common bytes required");
33
- const c = experimentCharter(input.charter), budget = openResourceBudget(input.budget).binding, a = experimentAuthority(input.authority), bytes = Buffer.from(input.bytes), directory = input.directory;
34
- if (budget.version !== "4.0" || resourceBindingDigest(budget) !== c.budgetDigest) throw new Error("explicit experiment budget required");
35
- approved(a, budget, c); await common(c, bytes); await openResourceBudget(budget).inspect();
36
- return createExperimentStore(directory, budget, c, bytes);
37
- }
38
- export interface ExperimentRun { readonly primary: Promise<VariantRecord>; readonly completion: Promise<ExperimentView>; readonly boundary: Promise<ExperimentView>; readonly started: readonly Promise<"spawned" | "settled-without-spawn">[] }
39
- const controllers = new WeakSet<object>();
40
- export const isExperimentController = (value: unknown): value is ReturnType<typeof openExperiment> => typeof value === "object" && value !== null && controllers.has(value);
41
- /** A separate owned controller, not delegate_all and not a model-facing launch/callback loader. */
42
- export function openExperiment(input: ExperimentBinding, hostAuthority: ExperimentAuthority | null) {
43
- const store = experimentStore(input), b = store.binding, c = b.charter, a = experimentAuthority(hostAuthority), owner = randomUUID(), digest = experimentBindingDigest(b);
44
- const budget = openResourceBudget(b.budget), handles = new Map<string, AbortController>();
45
- let live: ExperimentRun | null = null, starting = false, wake: (() => void) | null = null, epoch = 0;
46
- let fault = false, failureAcknowledged: boolean | null = null;
47
- const notify = () => { epoch++; wake?.(); wake = null; };
48
- const artifact = (id: string) => join(b.directory, "variant-" + byteHash(id), "result.json");
49
- const load = async () => {
50
- const data = await store.read(), state = replayExperiment(c, data.events);
51
- if (state.cancellations.some(r => r.bindingDigest !== digest)) throw new Error("cancellation binding mismatch");
52
- return state;
53
- };
54
- const append = (event: unknown) => store.transaction(async (events, write) => { replayExperiment(c, [...events, cloneExperiment(event) as Record<string, unknown>]); await write(event); });
55
- const unknown = (): ExperimentView => ({ version: "experiment-view-v1", experimentId: c.experimentId, mode: c.mode,
56
- variants: c.variants.map(v => ({ variantId: v.variantId, kind: v.kind, operation: v.operation, executionId: v.executionId, state: "unknown", artifactDigest: null, spawned: false })), budget: null, cancellations: [], control: "unknown", diagnostics: ["controller-or-storage-unknown", ...(fault ? ["controller-failure-observed"] : [])], acceptance: "not-assessed", configuration: { model: null, effort: null, skills: null }, freshness: "snapshot-unknown" });
57
- const inspect = async (control = false): Promise<ExperimentView> => {
58
- const state = await load(), diagnostics: string[] = [], accounting = await (control ? budget.controlSnapshot() : budget.inspect());
59
- if (state.controllerFailed) diagnostics.push("controller-failure-record-observed");
60
- if (fault) diagnostics.push("controller-failure-observed");
61
- if (failureAcknowledged === false) diagnostics.push("controller-failure-recording-unacknowledged");
62
- for (const v of state.variants) {
63
- if (v.artifactDigest) {
64
- try { await ownedDirectory(join(b.directory, "variant-" + byteHash(v.executionId))); if (byteHash(await readExperimentFile(artifact(v.executionId), 16384)) !== v.artifactDigest) throw new Error("artifact mismatch"); }
65
- catch { diagnostics.push("artifact-unavailable:" + v.executionId); v.state = "unknown"; v.artifactDigest = null; }
66
- } else if (state.claim && (!handles.has(v.executionId) || state.claim.owner !== owner)) v.state = "unknown";
67
- }
68
- return freezeWork({ version: "experiment-view-v1", experimentId: c.experimentId, mode: c.mode, variants: state.variants, budget: accounting,
69
- cancellations: state.cancellations.map(request => { const v = state.variants.find(v => v.executionId === request.executionId)!; return { request,
70
- outcome: v.state === "cancelled" ? "observed-cancelled" : v.artifactDigest ? "finished-without-cancel" : "requested-or-unknown" }; }),
71
- control: state.controllerFailed || fault ? "failed" : "not-assessed", diagnostics, acceptance: "not-assessed", configuration: { model: null, effort: null, skills: null }, freshness: "snapshot-unknown" }) as ExperimentView;
72
- };
73
- const computeOrder = async (control = false) => {
74
- if (!c.order) throw new Error("not an order controller");
75
- const view = await inspect(control), state = await load(), digests = new Map<string,string|null>();
76
- for (const v of view.variants) if (v.artifactDigest) {
77
- try { const bytes=await readExperimentFile(artifact(v.executionId),16384); if(byteHash(bytes)!==v.artifactDigest)throw new Error("changed artifact");const result=JSON.parse(bytes.toString());
78
- if(result.attemptId!==v.executionId)throw new Error("wrong execution artifact"); digests.set(v.executionId, typeof result.digest==="string"&&result.output?.code===0&&!result.output.aborted&&!result.output.timedOut&&!result.output.spawnError?result.digest:null);
79
- } catch { /* frozen view: use a detached unknown row below */ digests.set(v.executionId,"unavailable"); }
80
- }
81
- const variants=view.variants.map(v=>digests.get(v.executionId)==="unavailable"?{...v,state:"unknown" as const}:v);
82
- return { view, nodes:evaluateOrder(c.order,variants,digests,state.decisions).map(n => view.control === "not-assessed" ? n : {...n, action:"stakeholder" as const}), superseded:state.superseded };
83
- };
84
- const orderView = () => computeOrder(false);
85
- const api = Object.freeze({ binding: b, inspect: () => inspect(false), reconcile: () => inspect(false), orderView,
86
- async decideOrder(input: FactoryDecision, authority: { id: string; digests: readonly string[] } | null) {
87
- const request=factoryDecision(input); approved(a,b.budget,c);
88
- if(!authority||authority.id!==request.authorityId||!authority.digests.includes(factoryDecisionDigest(request))||request.bindingDigest!==digest)throw new Error("independent decision authority required");
89
- const fresh=await store.transaction(async(events,write)=>{
90
- const state=replayExperiment(c,events),old=state.decisions.find(d=>d.requestId===request.requestId);
91
- if(old){if(factoryDecisionDigest(old)!==factoryDecisionDigest(request))throw new Error("conflicting decision ID");return false;}
92
- await common(c,await readExperimentFile(join(b.directory,"common.bin"),16384));
93
- const row=(await computeOrder(true)).nodes.find(n=>n.nodeId===request.nodeId);
94
- if(!row||row.state!=="decision-required"||row.evidenceDigest!==request.evidenceDigest)throw new Error("stale decision or unavailable evidence");
95
- replayExperiment(c,[...events,{type:"order-decision",request}]);await write({type:"order-decision",request});return true;
96
- });if(fresh)notify();return orderView();
97
- },
98
- async readArtifact(executionId: string): Promise<Uint8Array> {
99
- const row = (await load()).variants.find(v => v.executionId === executionId);
100
- if (!row?.artifactDigest) throw new Error("exact byte-backed artifact unavailable");
101
- await ownedDirectory(join(b.directory, "variant-" + byteHash(executionId)));
102
- const bytes = await readExperimentFile(artifact(executionId), 16384);
103
- if (byteHash(bytes) !== row.artifactDigest) throw new Error("artifact digest mismatch");
104
- return Uint8Array.from(bytes);
105
- },
106
- async cancel(input: ExperimentCancellation, hostAuthority?: ExperimentAuthority | null): Promise<ExperimentView> {
107
- const request = experimentCancellation(input), cancellationAuthority = hostAuthority === undefined ? a : experimentAuthority(hostAuthority);
108
- approved(cancellationAuthority, b.budget, c);
109
- if (request.bindingDigest !== digest || !c.variants.some(v => v.executionId === request.executionId) || !cancellationAuthority!.cancellationDigests.includes(experimentCancellationDigest(request))) throw new Error("independent exact cancellation authority unavailable");
110
- const fresh = await store.transaction(async (events, write) => {
111
- const state = replayExperiment(c, events), old = state.cancellations.find(r => r.requestId === request.requestId);
112
- if (old) { if (experimentCancellationDigest(old) !== experimentCancellationDigest(request)) throw new Error("conflicting cancellation ID"); return false; }
113
- replayExperiment(c, [...events, { type: "cancel", request }]); await write({ type: "cancel", request }); return true;
114
- });
115
- if (fresh) handles.get(request.executionId)?.abort("operator-cancellation"); // Only an original live handle; no PID/idle/pane lookup.
116
- // Cancellation is a control operation: serialize its readback with controller appends
117
- // and original budget settlement. Public inspect/reconcile remain unlocked, fallible reads.
118
- return store.transaction(async () => inspect(true));
119
- },
120
- async start(profile: DigestProfile): Promise<ExperimentRun> {
121
- approved(a, b.budget, c);
122
- if (!isDigestProfile(profile) || profile.bindingDigest !== c.budgetDigest) throw new Error("profile budget mismatch");
123
- if (live) return live;
124
- if (starting) throw new Error("controller start pending; inspect, do not retry effects"); starting = true;
125
- let reserved: readonly ReservedDigestRun[] = [];
126
- try {
127
- const bytes = await readExperimentFile(join(b.directory, "common.bin"), 16384); await common(c, bytes);
128
- const claimed = await store.transaction(async (events, write) => {
129
- const state = replayExperiment(c, events); if (state.superseded) throw new Error("order migrated; no old dispatch"); if (state.claim) return false;
130
- await write({ type: "claim", owner, deadlineAt: Date.now() + c.deadlineMs }); return true;
131
- });
132
- if (!claimed) {
133
- const view = await inspect(); return Object.freeze({ primary: Promise.resolve(view.variants[0]), completion: Promise.resolve(view), boundary: Promise.resolve(view), started: [] });
134
- }
135
- reserved = await reserveDigestProfileBatch(profile, c.variants.map(v => ({ attempt: { attemptId: v.executionId, orderId: c.orderId, experimentId: c.experimentId, kind: v.kind, parentAttemptId: v.parentExecutionId }, bytes: Buffer.concat([bytes, Buffer.from(v.suffixBase64, "base64")]), operation: v.operation })));
136
- await append({ type: "admitted" });
137
- const state = await load(), used = new Set<number>();
138
- let resolvePrimary!: (value: VariantRecord) => void;
139
- const primary = { promise: new Promise<VariantRecord>(resolve => { resolvePrimary = resolve; }), resolve: (value: VariantRecord) => resolvePrimary(value) };
140
- for (const v of c.variants) { const handle = new AbortController(); handles.set(v.executionId, handle); if (state.cancellations.some(r => r.executionId === v.executionId)) handle.abort("operator-cancellation"); }
141
- // Close the read-to-handle-install race without adding a control/observation transport.
142
- for (const request of (await load()).cancellations) handles.get(request.executionId)?.abort("operator-cancellation");
143
- const abort = (reason = "controller-failure") => { handles.forEach(h => h.abort(reason)); notify(); };
144
- const timer = setTimeout(() => abort("deadline"), Math.max(1, state.claim!.deadlineAt - Date.now()));
145
- const settled = c.variants.map(() => {
146
- let resolve!: (success: boolean) => void;
147
- return { promise: new Promise<boolean>(done => { resolve = done; }), done: (success: boolean) => resolve(success) };
148
- });
149
- // Public readiness includes the durable spawn observation, not merely process creation.
150
- // This closes the process-start -> spawn-ledger race for inspect and cancellation callers.
151
- const observedStarted = reserved.map((run, i) => run.started.then(async value => {
152
- if (value === "spawned") await append({ type: "spawn", executionId: c.variants[i].executionId });
153
- return value;
154
- }));
155
- const one = async (i: number) => {
156
- const v = c.variants[i]; let success = false, launched = false, primaryResult: VariantRecord | null = null;
157
- try {
158
- if (!c.order && v.kind === "retry" && await settled[c.variants.findIndex(p => p.executionId === v.parentExecutionId)].promise) handles.get(v.executionId)!.abort("retry-not-needed");
159
- await append({ type: "dispatch", executionId: v.executionId });
160
- used.add(i);
161
- launched = true;
162
- const running = reserved[i].run(handles.get(v.executionId)!.signal);
163
- // Consume both promises even on bookkeeping failure. No untracked rejection or worker.
164
- const [result, observation] = await Promise.allSettled([running, observedStarted[i]]);
165
- if (result.status === "rejected" || observation.status === "rejected") throw new Error("runtime/accounting/observation unknown");
166
- const data = Buffer.from(JSON.stringify(result.value) + "\n"), out = result.value.output;
167
- const cancelled = out.aborted && (Boolean(out.signal) || await reserved[i].started === "settled-without-spawn");
168
- await ownedDirectory(join(b.directory, "variant-" + byteHash(v.executionId))); await writeExperimentFile(artifact(v.executionId), data);
169
- const state = out.timedOut || cancelled && handles.get(v.executionId)?.signal.reason === "deadline" ? "timed-out" : cancelled ? "cancelled" : result.value.digest ? "completed" : "failed";
170
- // Original worker/artifact outcome, NOT a successful controller acknowledgement.
171
- primaryResult = {variantId:v.variantId,kind:v.kind,operation:v.operation,executionId:v.executionId,state,artifactDigest:byteHash(data),spawned:await reserved[i].started === "spawned"};
172
- await append({ type: "result", executionId: v.executionId, artifactDigest: byteHash(data), state });
173
- success = Boolean(result.value.digest);
174
- } catch {
175
- fault = true; abort();
176
- // Failed dispatch acknowledgement still consumes the ORIGINAL unused permit without
177
- // spawning and resolves started, including when the control journal stays locked.
178
- if (!launched) { used.add(i); await reserved[i].run(AbortSignal.abort()).catch(() => {}); }
179
- }
180
- finally {
181
- settled[i].done(success); handles.delete(v.executionId);
182
- if (i === 0) primary.resolve(primaryResult ? freezeWork(primaryResult) : unknown().variants[0]);
183
- }
184
- };
185
- let resolveBoundary!: (view: ExperimentView) => void;
186
- const boundary = new Promise<ExperimentView>(resolve => { resolveBoundary = resolve; });
187
- const orderRunning = new Set<Promise<void>>();
188
- const completion = (async () => {
189
- try {
190
- if(c.order) {
191
- const running=orderRunning;
192
- while(true) {
193
- const before=epoch; await common(c,await readExperimentFile(join(b.directory,"common.bin"),16384));
194
- const status=await store.transaction(async()=>computeOrder(true));
195
- if(fault || Date.now()>=state.claim!.deadlineAt) { abort("deadline"); await Promise.all(running); break; }
196
- const eligible=status.nodes.filter(n=>n.action==="dispatch").map(n=>c.variants.findIndex(v=>v.executionId===n.executionId)).filter(i=>!used.has(i));
197
- for(const i of eligible.slice(0,MAX_CHILDREN_PER_CALL-running.size)) {
198
- used.add(i); const task=one(i); running.add(task); void task.then(()=>{running.delete(task);notify();},()=>{running.delete(task);notify();});
199
- }
200
- if(running.size){await Promise.race(running);continue;}
201
- if(!status.nodes.some(n=>n.state==="decision-required"))break;
202
- resolveBoundary(status.view);
203
- if(epoch!==before)continue;
204
- await new Promise<void>(resolve=>{wake=resolve;});
205
- }
206
- } else for (let i = 0; i < c.variants.length; i += MAX_CHILDREN_PER_CALL) {
207
- await common(c, await readExperimentFile(join(b.directory, "common.bin"), 16384));
208
- await Promise.all(c.variants.slice(i, i + MAX_CHILDREN_PER_CALL).map((_, n) => one(i + n)));
209
- if (fault) break;
210
- }
211
- } catch { fault = true; abort(); }
212
- finally {
213
- clearTimeout(timer); abort(); await Promise.allSettled(orderRunning);
214
- for (let i = 0; i < reserved.length; i++) if (!used.has(i)) {
215
- if(c.order) { handles.get(c.variants[i].executionId)?.abort("unused-order-reservation"); await one(i); }
216
- else { used.add(i); await reserved[i].run(AbortSignal.abort()).catch(() => { fault = true; }); }
217
- }
218
- handles.clear();
219
- if (fault) {
220
- try { await append({ type: "controller-unknown" }); failureAcknowledged = true; }
221
- catch { failureAcknowledged = false; } // No fabricated durable acknowledgement.
222
- }
223
- }
224
- const view = await inspect().catch(unknown); primary.resolve(view.variants[0]); resolveBoundary(view); return view;
225
- })();
226
- live = Object.freeze({ primary: primary.promise, completion, boundary: c.order ? boundary : completion, started: Object.freeze(observedStarted) }); return live;
227
- } catch (error) {
228
- fault = true;
229
- for (const run of reserved) await run.run(AbortSignal.abort()).catch(() => {});
230
- const state = await load().catch(() => null); if (state?.claim?.owner === owner) await append({ type: "controller-unknown" }).catch(() => {});
231
- throw error;
232
- } finally { starting = false; }
233
- },
234
- });
235
- controllers.add(api); return api;
236
- }
@@ -1,47 +0,0 @@
1
- import { cloneExperiment, closed, experimentHash, experimentCharter, byteHash, type ExperimentCharter } from "./experiment-contract.ts";
2
- import { resourceBindingDigest, type ExperimentBudgetBinding } from "./resource-budget.ts";
3
- import { workIntentBinding, readIntentWork, resolveIntent } from "./intent-application.ts";
4
- import type { WorkIntentBinding } from "./intent-control.ts";
5
- import type { WorkFrozen, RevisionRef } from "./work-ledger-types.ts";
6
- import type { AdoptionAuthority, AdoptionFacts, AdoptionBinding, AdoptionReceipt } from "./vendor/adoption.ts";
7
- import { parseWorkJson } from "./work-ledger-json.ts";
8
- import { orderSchedule } from "./order-schedule.ts";
9
- export { factoryDecisionDigest, type FactoryDecision } from "./order-schedule.ts";
10
- export interface FixedPolicy {version:"fixed-policy-v1";suffixBase64:string;acceptancePolicyDigest:string;grants:readonly string[];effects:readonly "fixed-digest"[];model:null;effort:null;skills:readonly string[]}
11
- export const fixedPolicyDigest=(p:FixedPolicy)=>experimentHash(fixedPolicy(p));
12
- const hex=(x:unknown)=>typeof x==="string"&&/^[a-f0-9]{64}$/.test(x);
13
- export function fixedPolicy(value:FixedPolicy):FixedPolicy{const p=cloneExperiment(value);closed(p,["version","suffixBase64","acceptancePolicyDigest","grants","effects","model","effort","skills"]);
14
- if(p.version!=="fixed-policy-v1"||!hex(p.acceptancePolicyDigest)||typeof p.suffixBase64!=="string"||p.suffixBase64.length>2048||Buffer.from(p.suffixBase64,"base64").toString("base64")!==p.suffixBase64||JSON.stringify(p.grants)!=="[]"||JSON.stringify(p.effects)!=='["fixed-digest"]'||p.model!==null||p.effort!==null||JSON.stringify(p.skills)!=="[]")throw new Error("unsupported policy or grant expansion");return p;}
15
- export interface FactoryOrderCharter {version:"factory-order-v1";orderId:string;directory:string;budget:ExperimentBudgetBinding;work:WorkFrozen<WorkIntentBinding>;workTextDigest:string;scopeDigest:string;commonBase64:string;deadlineMs:number;pin:{revision:number;candidateDigest:string};nodes:readonly {nodeId:string;obligation:RevisionRef;dependencies:readonly string[];attempts:readonly {executionId:string;suffixBase64:string;operation:"digest"|"hold"}[];expectedDigest:string;decision:{decisionId:string;authorityId:string}|null}[]}
16
- /** Digest of the entire bounded proposal; validation at application is separate. */
17
- export const factoryOrderDigest=(c:FactoryOrderCharter)=>experimentHash(c);
18
- export interface FactoryAuthority {id:string;orderDigests:readonly string[];decisionDigests:readonly string[];cancellationDigests?:readonly string[];activationDigests:readonly string[];migrationDigests:readonly string[];adoption:AdoptionAuthority|null;facts:readonly {bindingId:string;facts:AdoptionFacts}[]}
19
- export function factoryAuthority(value:FactoryAuthority|null):FactoryAuthority|null{if(value===null)return null;const a=cloneExperiment(value);closed(a,["id","orderDigests","decisionDigests","activationDigests","migrationDigests","adoption","facts",...(Object.hasOwn(a,"cancellationDigests")?["cancellationDigests"]:[])]);
20
- if(typeof a.id!=="string"||!/^[a-zA-Z0-9:_-]{1,128}$/.test(a.id)||[a.orderDigests,a.decisionDigests,a.activationDigests,a.migrationDigests,...(Object.hasOwn(a,"cancellationDigests")?[a.cancellationDigests!]:[])].some(xs=>!Array.isArray(xs)||xs.length>128||xs.some(x=>!hex(x)))||!Array.isArray(a.facts)||a.facts.length>128)throw new Error("invalid independent factory authority");
21
- const ids=new Set<string>();for(const f of a.facts as FactoryAuthority["facts"]){closed(f,["bindingId","facts"]);if(!hex(f.bindingId)||ids.has(f.bindingId))throw new Error("ambiguous independent facts");ids.add(f.bindingId);}
22
- if(a.adoption!==null){closed(a.adoption,["id","adoptions","rollbacks"]);if(a.adoption.id!==a.id)throw new Error("independent authority identity mismatch");}
23
- return a;}
24
- export function requireFactoryAuthority(a:FactoryAuthority|null,id:string){if(!a||a.id!==id)throw new Error("independent factory authority required");return a;}
25
- export interface ActivationRequest {version:"factory-activation-v1";requestId:string;expectedRevision:number;expectedCandidateDigest:string;candidate:FixedPolicy;binding:AdoptionBinding;receipt:AdoptionReceipt}
26
- export const activationRequestDigest=(r:ActivationRequest)=>experimentHash(r);
27
- export function factoryCharter(value:FactoryOrderCharter):FactoryOrderCharter{
28
- const c=cloneExperiment(value);closed(c,["version","orderId","directory","budget","work","workTextDigest","scopeDigest","commonBase64","deadlineMs","pin","nodes"]);closed(c.pin,["revision","candidateDigest"]);
29
- if(c.version!=="factory-order-v1"||!/^[a-zA-Z0-9:_-]{1,128}$/.test(c.orderId)||typeof c.directory!=="string"||!hex(c.workTextDigest)||!hex(c.scopeDigest)||!hex(c.pin.candidateDigest)||!Number.isSafeInteger(c.pin.revision)||c.pin.revision<0||typeof c.commonBase64!=="string"||c.commonBase64.length>22000||Buffer.from(c.commonBase64,"base64").toString("base64")!==c.commonBase64||Buffer.byteLength(JSON.stringify(c))>48000||c.budget.version!=="4.0")throw new Error("invalid bounded factory charter");
30
- c.work=workIntentBinding(JSON.parse(JSON.stringify(c.work)));if(c.scopeDigest!==experimentHash(c.work.selection.snapshot))throw new Error("changed scope");
31
- if(!Array.isArray(c.nodes)||!c.nodes.length||c.nodes.length>16)throw new Error("bounded nodes required");
32
- for(const n of c.nodes as FactoryOrderCharter["nodes"]){closed(n,["nodeId","obligation","dependencies","attempts","expectedDigest","decision"]);if(!Array.isArray(n.attempts)||!n.attempts.length||n.attempts.length>3)throw new Error("bounded recovery required");for(const a of n.attempts){closed(a,["executionId","suffixBase64","operation"]);if(typeof a.suffixBase64!=="string"||a.suffixBase64.length>22000||Buffer.from(a.suffixBase64,"base64").toString("base64")!==a.suffixBase64)throw new Error("invalid attempt byte suffix");}}
33
- orderSchedule({version:"order-schedule-v1",policyDigest:c.pin.candidateDigest,nodes:(c.nodes as FactoryOrderCharter["nodes"]).map(n=>({nodeId:n.nodeId,dependencies:n.dependencies,executions:n.attempts.map(a=>a.executionId),expectedDigest:n.expectedDigest,decision:n.decision}))},(c.nodes as FactoryOrderCharter["nodes"]).flatMap(n=>n.attempts.map(a=>a.executionId)));
34
- return c;
35
- }
36
- export const parseFactoryOrder = (text:string) => factoryCharter(parseWorkJson(text) as unknown as FactoryOrderCharter);
37
- export async function compileFactoryOrder(value:FactoryOrderCharter,candidate:FixedPolicy):Promise<ExperimentCharter>{
38
- const c=factoryCharter(value),p=fixedPolicy(candidate),text=await readIntentWork(c.work);
39
- if(byteHash(text)!==c.workTextDigest||fixedPolicyDigest(p)!==c.pin.candidateDigest)throw new Error("work or candidate drift");
40
- const intent=resolveIntent(text,c.work.selection,c.work.priorities),refs=intent.snapshot!.bindings.map(b=>experimentHash(b.obligation)).sort();
41
- if(JSON.stringify(refs)!==JSON.stringify(c.nodes.map(n=>experimentHash(n.obligation)).sort()))throw new Error("order must cover exact selected obligations");
42
- for(const n of c.nodes){const rev=intent.revisions.find(r=>experimentHash({kind:r.kind,id:r.id,revision:r.revision,digest:r.digest})===experimentHash(n.obligation));if(!rev||!rev.permittedEffects.includes("read"))throw new Error("unsupported obligation effects");for(const dep of rev.dependencies.filter(d=>d.kind==="obligation")){const parent=c.nodes.find(m=>experimentHash(m.obligation)===experimentHash(dep));if(!parent||!n.dependencies.includes(parent.nodeId))throw new Error("required intent dependency omitted");}}
43
- const bytes=Buffer.from(c.commonBase64,"base64");
44
- return experimentCharter({version:"fixed-experiment-v2",experimentId:c.orderId,orderId:c.orderId,budgetDigest:resourceBindingDigest(c.budget),profile:"linux-bwrap-digest-v1",common:{bytes:bytes.length,sha256:byteHash(bytes),work:c.work,workTextDigest:c.workTextDigest},mode:"bounded-waves",deadlineMs:c.deadlineMs,
45
- variants:c.nodes.flatMap(n=>n.attempts.map((a,i)=>({variantId:a.executionId,executionId:a.executionId,kind:i?"retry" as const:"primary" as const,parentExecutionId:i?n.attempts[i-1].executionId:null,suffixBase64:Buffer.concat([Buffer.from(p.suffixBase64,"base64"),Buffer.from(a.suffixBase64,"base64")]).toString("base64"),operation:a.operation,configuration:{model:null,effort:null,skills:null}}))),
46
- order:{version:"order-schedule-v1",policyDigest:p.acceptancePolicyDigest,nodes:c.nodes.map(n=>({nodeId:n.nodeId,dependencies:n.dependencies,executions:n.attempts.map(a=>a.executionId),expectedDigest:n.expectedDigest,decision:n.decision}))}});
47
- }
@@ -1,29 +0,0 @@
1
- import { cloneExperiment, closed, experimentHash } from "./experiment-contract.ts";
2
- import { experimentStore } from "./experiment-store.ts";
3
- import { replayExperiment } from "./experiment-state.ts";
4
- import { factoryAuthority, factoryCharter, factoryOrderDigest, requireFactoryAuthority, type FactoryAuthority, type FactoryOrderCharter } from "./factory-contract.ts";
5
- import { factoryRegistryStore, replayRegistry, type FactoryRegistryBinding } from "./factory-registry.ts";
6
- import { createFactoryOrder } from "./factory-order.ts";
7
- export interface FactoryMigration {version:"factory-migration-v1";requestId:string;sourceOrderId:string;successor:FactoryOrderCharter}
8
- export const factoryMigrationDigest=(request:FactoryMigration)=>experimentHash(request);
9
- /** Only unstarted controllers can be superseded. An original claim is a refusal, never an idle/PID guess. */
10
- export async function migrateFactoryOrder(inputRegistry:FactoryRegistryBinding,input:FactoryMigration,host:FactoryAuthority|null){
11
- const b=factoryRegistryStore(inputRegistry).binding;
12
- const r=cloneExperiment(input),a=requireFactoryAuthority(factoryAuthority(host),b.initial.authorityId);closed(r,["version","requestId","sourceOrderId","successor"]);
13
- if(r.version!=="factory-migration-v1"||!/^[a-zA-Z0-9:_-]{1,128}$/.test(r.requestId)||r.sourceOrderId===r.successor.orderId||!a.migrationDigests.includes(factoryMigrationDigest(r)))throw new Error("independent migration authority required");
14
- r.successor=factoryCharter(r.successor);if(!a.orderDigests.includes(factoryOrderDigest(r.successor)))throw new Error("successor order authority required");
15
- const store=factoryRegistryStore(b);let fresh=false;
16
- await store.transaction(async(events,append)=>{const s=replayRegistry(b,events),old=s.changes.get(r.requestId);if(old){if(old!==factoryMigrationDigest(r))throw new Error("conflicting migration ID");return;}
17
- const source=s.orders.get(r.sourceOrderId);if(!source?.binding||!a.orderDigests.includes(factoryOrderDigest(source.charter)))throw new Error("source order authority unavailable");
18
- if(r.successor.scopeDigest!==b.initial.scopeDigest||r.successor.pin.revision!==s.revision||r.successor.pin.candidateDigest!==s.candidateDigest||s.orders.has(r.successor.orderId))throw new Error("stale migration target");
19
- const e={type:"migration-request",requestId:r.requestId,sourceOrderId:r.sourceOrderId,targetOrderId:r.successor.orderId,requestDigest:factoryMigrationDigest(r)};replayRegistry(b,[...events,e]);await append(e);fresh=true;
20
- });
21
- if(fresh){const s=replayRegistry(b,(await store.read()).events),source=s.orders.get(r.sourceOrderId)!,binding=source.binding!,old=experimentStore(binding);
22
- const applied=await old.transaction(async(events,append)=>{const state=replayExperiment(binding.charter,events);if(state.claim||state.superseded)return false;
23
- const e={type:"order-migrated",requestId:r.requestId,successorDigest:factoryOrderDigest(r.successor)};replayExperiment(binding.charter,[...events,e]);await append(e);return true;});
24
- if(applied)await createFactoryOrder(b,r.successor,a);
25
- await store.transaction(async(events,append)=>{const e={type:"migration-receipt",requestId:r.requestId,application:applied?"applied":"refused-active",renewedObligations:applied?source.charter.nodes.map(n=>n.obligation):[]};replayRegistry(b,[...events,e]);await append(e);});
26
- }
27
- const m=replayRegistry(b,(await store.read()).events).migrations.get(r.requestId)!;
28
- return {...m,requestId:r.requestId,grantExpansion:false,acceptanceTransfer:"none" as const};
29
- }
@@ -1,56 +0,0 @@
1
- import { byteHash, cloneExperiment, experimentCharterDigest, experimentHash } from "./experiment-contract.ts";
2
- import { createExperiment, openExperiment, type ExperimentView } from "./experiment.ts";
3
- import { experimentBindingDigest, experimentStore } from "./experiment-store.ts";
4
- import { readIntentWork } from "./intent-application.ts";
5
- import { freezeWork } from "./work-ledger-json.ts";
6
- import { compileFactoryOrder, factoryAuthority, factoryCharter, factoryOrderDigest, fixedPolicyDigest, requireFactoryAuthority, type FactoryOrderCharter, type FactoryAuthority } from "./factory-contract.ts";
7
- import { factoryRegistryStore, replayRegistry, validateActivePolicy, type FactoryRegistryBinding, type PinnedOrder } from "./factory-registry.ts";
8
- import type { ExperimentCancellation } from "./experiment-contract.ts";
9
- import type { FactoryDecision } from "./order-schedule.ts";
10
- import type { DigestProfile } from "./effect-profile.ts";
11
- export { migrateFactoryOrder, factoryMigrationDigest, type FactoryMigration } from "./factory-migration.ts";
12
- export { createFactoryRegistry, openFactoryRegistry, type FactoryRegistryBinding } from "./factory-registry.ts";
13
- export { parseFactoryOrder, factoryOrderDigest, fixedPolicyDigest, factoryDecisionDigest, activationRequestDigest, type FactoryOrderCharter, type FactoryAuthority, type FixedPolicy, type ActivationRequest } from "./factory-contract.ts";
14
- function lowerAuthority(p:PinnedOrder,a:FactoryAuthority|null){return a?.orderDigests.includes(factoryOrderDigest(p.charter))?{authorityDigest:p.charter.budget.authorityDigest,charterDigests:[p.compiledDigest],cancellationDigests:a.cancellationDigests??[]}:null;}
15
- export async function createFactoryOrder(inputRegistry:FactoryRegistryBinding,input:FactoryOrderCharter,host:FactoryAuthority|null){
16
- const registry=factoryRegistryStore(inputRegistry).binding;
17
- const c=factoryCharter(input),a=requireFactoryAuthority(factoryAuthority(host),registry.initial.authorityId),store=factoryRegistryStore(registry);
18
- if(!a.orderDigests.includes(factoryOrderDigest(c)))throw new Error("independent order authority required");
19
- let pinned!:PinnedOrder,existing=false;
20
- await store.transaction(async(events,append)=>{
21
- const state=replayRegistry(registry,events),old=state.orders.get(c.orderId);
22
- if(old){if(factoryOrderDigest(old.charter)!==factoryOrderDigest(c))throw new Error("conflicting order identity");pinned=old;existing=true;return;}
23
- if(c.scopeDigest!==registry.initial.scopeDigest)throw new Error("changed registry scope");
24
- if(c.pin.revision!==state.revision||c.pin.candidateDigest!==state.candidateDigest)throw new Error("stale order policy pin");validateActivePolicy(state,a);
25
- const compiled=await compileFactoryOrder(c,state.candidate),event={type:"order-pin",charter:c,candidate:state.candidate,compiledDigest:experimentCharterDigest(compiled),adoptionId:state.activation?.receipt.id??null};
26
- replayRegistry(registry,[...events,event]);await append(event);pinned={charter:c,candidate:state.candidate,compiledDigest:event.compiledDigest,adoptionId:event.adoptionId,binding:null};
27
- });
28
- if(existing){if(!pinned.binding)throw new Error("order materialization pending-or-unknown; no retry effects");await experimentStore(pinned.binding).read();return pinned.binding;}
29
- const charter=await compileFactoryOrder(c,pinned.candidate);
30
- const binding=await createExperiment({directory:c.directory,budget:c.budget,charter,bytes:Buffer.from(c.commonBase64,"base64"),authority:lowerAuthority(pinned,a)});
31
- await store.transaction(async(events,append)=>{const event={type:"order-materialized",orderId:c.orderId,binding};replayRegistry(registry,[...events,event]);await append(event);});return binding;
32
- }
33
- export async function openFactoryOrder(inputRegistry:FactoryRegistryBinding,orderId:string,host:FactoryAuthority|null){
34
- const registry=factoryRegistryStore(inputRegistry).binding;
35
- const a=factoryAuthority(host),store=factoryRegistryStore(registry),state=replayRegistry(registry,(await store.read()).events),p=state.orders.get(orderId);
36
- if(!p?.binding)throw new Error("order materialization missing or unknown");
37
- const binding=p.binding;await experimentStore(binding).read();
38
- if(experimentCharterDigest(binding.charter)!==p.compiledDigest)throw new Error("compiled order identity mismatch");
39
- const admitted=a?.id===registry.initial.authorityId?lowerAuthority(p,a):null,controller=openExperiment(binding,admitted);
40
- const inspect=async()=>{
41
- const result=await controller.orderView();let scope:"pinned"|"changed-or-unavailable"="pinned";
42
- try{if(byteHash(await readIntentWork(p.charter.work))!==p.charter.workTextDigest)scope="changed-or-unavailable";}catch{scope="changed-or-unavailable";}
43
- const nodes=result.superseded?result.nodes.map(n=>({...n,state:"superseded" as const,action:"none" as const})):scope==="pinned"?result.nodes:result.nodes.map(n=>({...n,state:"unknown" as const,action:"stakeholder" as const}));
44
- return freezeWork({version:"factory-order-view-v1",orderId,scope,policyPin:{revision:p.charter.pin.revision,candidateDigest:fixedPolicyDigest(p.candidate),adoptionId:p.adoptionId},orderDigest:factoryOrderDigest(p.charter),nodes:nodes.map(n=>({...n,obligation:p.charter.nodes.find(o=>o.nodeId===n.nodeId)!.obligation})),resources:result.view.budget,control:result.view.control,diagnostics:result.view.diagnostics,superseded:result.superseded,dispatchAuthorized:Boolean(admitted)&&result.view.control==="not-assessed",modelTransport:"not-used-fixed-profile",acceptance:"not-assessed",freshness:"snapshot-unknown"});
45
- };
46
- const settledView = async (completed: ExperimentView) => { const view = await inspect().catch(() => freezeWork({version:"factory-order-view-v1",orderId,scope:"changed-or-unavailable",policyPin:{revision:p.charter.pin.revision,candidateDigest:fixedPolicyDigest(p.candidate),adoptionId:p.adoptionId},orderDigest:factoryOrderDigest(p.charter),nodes:p.charter.nodes.map(n=>({nodeId:n.nodeId,obligation:n.obligation,state:"unknown",action:"stakeholder",executionId:null,evidenceDigest:null})),resources:null,superseded:null,dispatchAuthorized:false,modelTransport:"not-used-fixed-profile",acceptance:"not-assessed",freshness:"snapshot-unknown",control:"unknown"}));
47
- return completed.control === "not-assessed" ? view : freezeWork({...view,control:completed.control,diagnostics:completed.diagnostics,dispatchAuthorized:false,nodes:view.nodes.map(n=>({...n,action:"stakeholder" as const}))});
48
- };
49
- return Object.freeze({bindingDigest:experimentBindingDigest(binding),binding,pin:freezeWork({revision:p.charter.pin.revision,candidateDigest:fixedPolicyDigest(p.candidate),adoptionId:p.adoptionId}),inspect,reconcile:inspect,
50
- async advance(profile:DigestProfile){if(!admitted)throw new Error("independent order authority required");const run=await controller.start(profile);return Object.freeze({boundary:run.boundary.then(settledView),completion:run.completion.then(settledView),started:run.started});},
51
- async decide(request:FactoryDecision,host:FactoryAuthority|null){const current=requireFactoryAuthority(factoryAuthority(host),registry.initial.authorityId);if(!current.orderDigests.includes(factoryOrderDigest(p.charter)))throw new Error("order authority required");await controller.decideOrder(request,{id:current.id,digests:current.decisionDigests});return inspect();},
52
- async cancel(request:ExperimentCancellation,host:FactoryAuthority|null){const current=requireFactoryAuthority(factoryAuthority(host),registry.initial.authorityId);await controller.cancel(request,lowerAuthority(p,current));return inspect();},
53
- readArtifact:controller.readArtifact,
54
- });
55
- }
56
- export type FactoryOrderView=Awaited<ReturnType<Awaited<ReturnType<typeof openFactoryOrder>>["inspect"]>>;
@@ -1,60 +0,0 @@
1
- import { createControlJournal, controlJournal, type ControlBinding } from "./control-journal.ts";
2
- import { cloneExperiment, closed, experimentHash, experimentCharterDigest } from "./experiment-contract.ts";
3
- import { validateExperimentBinding, type ExperimentBinding } from "./experiment-store.ts";
4
- import { fixedPolicy, fixedPolicyDigest, factoryCharter, factoryOrderDigest, factoryAuthority, requireFactoryAuthority, activationRequestDigest, type FixedPolicy, type FactoryAuthority, type FactoryOrderCharter, type ActivationRequest } from "./factory-contract.ts";
5
- import { validateAdoptionReceipt, authorizeRollback, buildRollbackRequest, buildAdoptionBinding, type RollbackRequest } from "./vendor/adoption.ts";
6
- export interface RegistryInitial {version:"factory-registry-v1";authorityId:string;scopeDigest:string;baseline:FixedPolicy}
7
- export type FactoryRegistryBinding=ControlBinding<RegistryInitial>;
8
- export interface PinnedOrder {charter:FactoryOrderCharter;candidate:FixedPolicy;compiledDigest:string;adoptionId:string|null;binding:ExperimentBinding|null}
9
- export function registryInitial(value:RegistryInitial){const v=cloneExperiment(value);closed(v,["version","authorityId","scopeDigest","baseline"]);if(v.version!=="factory-registry-v1"||!/^[a-zA-Z0-9:_-]{1,128}$/.test(v.authorityId)||!/^[a-f0-9]{64}$/.test(v.scopeDigest))throw new Error("invalid registry initial binding");v.baseline=fixedPolicy(v.baseline);return v;}
10
- export function replayRegistry(b:FactoryRegistryBinding,events:Record<string,unknown>[]){
11
- const initial=registryInitial(b.initial);let revision=0,candidate=initial.baseline,activation:ActivationRequest|null=null;
12
- const changes=new Map<string,string>(),orders=new Map<string,PinnedOrder>(),migrations=new Map<string,{digest:string;sourceOrderId:string;targetOrderId:string;application:string}>();
13
- const candidates=new Map([[fixedPolicyDigest(candidate),candidate]]), lineage:(ActivationRequest|null)[]=[];
14
- for(const e of events){
15
- if(e.type==="activate"){
16
- closed(e,["type","request"]);const r=cloneExperiment(e.request) as ActivationRequest;closed(r,["version","requestId","expectedRevision","expectedCandidateDigest","candidate","binding","receipt"]);
17
- const {id,version,...input}=r.binding;
18
- if(r.version!=="factory-activation-v1"||typeof r.requestId!=="string"||!/^[a-zA-Z0-9:_-]{1,128}$/.test(r.requestId)||version!=="adoption-binding-v1"||buildAdoptionBinding(input).id!==id||r.expectedRevision!==revision||r.expectedCandidateDigest!==fixedPolicyDigest(candidate)||r.binding.scopeDigest!==initial.scopeDigest||r.binding.rollbackCandidateDigest!==fixedPolicyDigest(candidate)||r.binding.candidateDigest!==fixedPolicyDigest(r.candidate)||r.binding.assessmentPolicyDigest!==r.candidate.acceptancePolicyDigest||changes.has(r.requestId))throw new Error("invalid activation sequence");
19
- changes.set(r.requestId,activationRequestDigest(r));lineage.push(activation);candidate=fixedPolicy(r.candidate);candidates.set(fixedPolicyDigest(candidate),candidate);activation=r;revision++;
20
- }else if(e.type==="rollback"){
21
- closed(e,["type","request","fromRevision"]);const r=e.request as RollbackRequest;
22
- if(!activation||e.fromRevision!==revision||changes.has(r.id)||buildRollbackRequest(activation.receipt,r.reason,[...r.evidence],r.expiresAt).id!==r.id||r.restoreCandidateDigest!==activation.binding.rollbackCandidateDigest)throw new Error("invalid rollback sequence");
23
- const restored=candidates.get(r.restoreCandidateDigest);if(!restored)throw new Error("rollback bytes not registered");changes.set(r.id,experimentHash(r));candidate=restored;if(!lineage.length)throw new Error("missing rollback lineage");activation=lineage.pop()!;
24
- if((activation?.binding.candidateDigest??fixedPolicyDigest(initial.baseline))!==r.restoreCandidateDigest)throw new Error("rollback lineage mismatch");revision++;
25
- }else if(e.type==="order-pin"){
26
- closed(e,["type","charter","candidate","compiledDigest","adoptionId"]);const charter=factoryCharter(e.charter as FactoryOrderCharter),policy=fixedPolicy(e.candidate as FixedPolicy);
27
- if(orders.size>=32||orders.has(charter.orderId)||charter.scopeDigest!==initial.scopeDigest||charter.pin.revision!==revision||charter.pin.candidateDigest!==fixedPolicyDigest(candidate)||fixedPolicyDigest(policy)!==fixedPolicyDigest(candidate)||e.adoptionId!==(activation?.receipt.id??null)||typeof e.compiledDigest!=="string"||!/^[a-f0-9]{64}$/.test(e.compiledDigest))throw new Error("invalid order pin sequence");
28
- orders.set(charter.orderId,{charter,candidate:policy,compiledDigest:e.compiledDigest,adoptionId:e.adoptionId as string|null,binding:null});
29
- }else if(e.type==="order-materialized"){
30
- closed(e,["type","orderId","binding"]);const p=orders.get(String(e.orderId)),binding=validateExperimentBinding(e.binding as ExperimentBinding);
31
- if(!p||p.binding||binding.directory!==p.charter.directory||experimentCharterDigest(binding.charter)!==p.compiledDigest)throw new Error("invalid order materialization");p.binding=binding;
32
- }else if(e.type==="migration-request"){
33
- closed(e,["type","requestId","sourceOrderId","targetOrderId","requestDigest"]);
34
- if(typeof e.requestId!=="string"||changes.has(e.requestId)||!orders.has(String(e.sourceOrderId))||e.sourceOrderId===e.targetOrderId||typeof e.requestDigest!=="string"||!/^[a-f0-9]{64}$/.test(e.requestDigest))throw new Error("invalid migration request");
35
- changes.set(e.requestId,e.requestDigest);migrations.set(e.requestId,{digest:e.requestDigest,sourceOrderId:String(e.sourceOrderId),targetOrderId:String(e.targetOrderId),application:"pending-or-unknown"});
36
- }else if(e.type==="migration-receipt"){
37
- closed(e,["type","requestId","application","renewedObligations"]);const m=migrations.get(String(e.requestId));
38
- if(!m||m.application!=="pending-or-unknown"||!["applied","refused-active"].includes(String(e.application))||!Array.isArray(e.renewedObligations)||e.renewedObligations.length>16||e.application==="applied"&&!orders.get(m.targetOrderId)?.binding)throw new Error("invalid migration receipt");m.application=String(e.application);
39
- }else throw new Error("unknown factory control event");
40
- }
41
- return{revision,candidate,candidateDigest:fixedPolicyDigest(candidate),activation,changes,orders,migrations};
42
- }
43
- export const factoryRegistryStore=(b:FactoryRegistryBinding)=>{registryInitial(b.initial);return controlJournal(b);};
44
- export async function createFactoryRegistry(input:{directory:string;authorityId:string;scopeDigest:string;baseline:FixedPolicy}):Promise<FactoryRegistryBinding>{const {directory,...rest}=cloneExperiment(input);return createControlJournal(directory,registryInitial({version:"factory-registry-v1",...rest}));}
45
- export function validateActivePolicy(state:ReturnType<typeof replayRegistry>,a:FactoryAuthority){if(state.activation){const r=state.activation,facts=a.facts.find(f=>f.bindingId===r.binding.id)?.facts;if(!facts)throw new Error("current independent eligibility facts required");validateAdoptionReceipt(r.receipt,r.binding,a.adoption,facts,Date.now());}}
46
- export function openFactoryRegistry(input:FactoryRegistryBinding){const store=factoryRegistryStore(input),b=store.binding;
47
- const inspect=async()=>{const s=replayRegistry(b,(await store.read()).events);return{version:"factory-registry-view-v1" as const,revision:s.revision,candidateDigest:s.candidateDigest,candidate:cloneExperiment(s.candidate),scopeDigest:b.initial.scopeDigest,migrations:[...s.migrations].map(([requestId,m])=>({requestId,...m})),orders:[...s.orders].map(([orderId,p])=>({orderId,orderDigest:factoryOrderDigest(p.charter),candidateDigest:fixedPolicyDigest(p.candidate),revision:p.charter.pin.revision,materialization:p.binding?"recorded":"pending-or-unknown"})),acceptance:"not-assessed" as const};};
48
- return{inspect,async activate(input:ActivationRequest,host:FactoryAuthority|null){const r=cloneExperiment(input),a=requireFactoryAuthority(factoryAuthority(host),b.initial.authorityId);closed(r,["version","requestId","expectedRevision","expectedCandidateDigest","candidate","binding","receipt"]);
49
- if(!a.activationDigests.includes(activationRequestDigest(r)))throw new Error("independent activation authority required");
50
- await store.transaction(async(events,append)=>{const s=replayRegistry(b,events),old=s.changes.get(r.requestId);if(old){if(old!==activationRequestDigest(r))throw new Error("conflicting activation ID");return;}
51
- if(r.expectedRevision!==s.revision||r.expectedCandidateDigest!==s.candidateDigest)throw new Error("stale activation");
52
- if(r.binding.scopeDigest!==b.initial.scopeDigest||r.binding.candidateDigest!==fixedPolicyDigest(r.candidate)||r.binding.assessmentPolicyDigest!==r.candidate.acceptancePolicyDigest||r.binding.rollbackCandidateDigest!==s.candidateDigest)throw new Error("activation scope/candidate/policy mismatch");
53
- const facts=a.facts.find(f=>f.bindingId===r.binding.id)?.facts;if(!facts)throw new Error("independent eligibility facts required");validateAdoptionReceipt(r.receipt,r.binding,a.adoption,facts,Date.now());
54
- replayRegistry(b,[...events,{type:"activate",request:r}]);await append({type:"activate",request:r});});return inspect();
55
- },async rollback(input:RollbackRequest,host:FactoryAuthority|null){const r=cloneExperiment(input),a=requireFactoryAuthority(factoryAuthority(host),b.initial.authorityId);closed(r,["version","id","adoptionId","scopeDigest","restoreCandidateDigest","reason","evidence","expiresAt"]);
56
- await store.transaction(async(events,append)=>{const s=replayRegistry(b,events),old=s.changes.get(r.id);if(old){if(old!==experimentHash(r)||!a.adoption?.rollbacks.includes(r.id))throw new Error("rollback authority/identity mismatch");return;}
57
- if(!s.activation)throw new Error("stale rollback");authorizeRollback(s.activation.receipt,r,a.adoption,Date.now(),{adoptionId:s.activation.receipt.id,candidateDigest:s.candidateDigest,scopeDigest:b.initial.scopeDigest});
58
- const event={type:"rollback",request:r,fromRevision:s.revision};replayRegistry(b,[...events,event]);await append(event);});return{...await inspect(),application:"applied" as const,requestId:r.id,grantExpansion:false};
59
- }};
60
- }