pi-daddy 0.28.0 → 0.32.1

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 (1012) 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 +10 -4
  10. package/dist/cli.d.ts.map +1 -1
  11. package/dist/cli.js +120 -106
  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 +125 -0
  135. package/dist/kernel/catalog.d.ts.map +1 -0
  136. package/dist/kernel/catalog.js +338 -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 +320 -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 +120 -0
  193. package/dist/kernel/resolve.d.ts.map +1 -0
  194. package/dist/kernel/resolve.js +201 -0
  195. package/dist/kernel/resolve.js.map +1 -0
  196. package/dist/kernel/routing-authority.d.ts +71 -0
  197. package/dist/kernel/routing-authority.d.ts.map +1 -0
  198. package/dist/kernel/routing-authority.js +100 -0
  199. package/dist/kernel/routing-authority.js.map +1 -0
  200. package/dist/kernel/run-child.d.ts +111 -0
  201. package/dist/kernel/run-child.d.ts.map +1 -0
  202. package/dist/kernel/run-child.js +324 -0
  203. package/dist/kernel/run-child.js.map +1 -0
  204. package/dist/kernel/skill-packages.d.ts +116 -0
  205. package/dist/kernel/skill-packages.d.ts.map +1 -0
  206. package/dist/kernel/skill-packages.js +300 -0
  207. package/dist/kernel/skill-packages.js.map +1 -0
  208. package/dist/kernel/skill-resources.d.ts.map +1 -0
  209. package/dist/kernel/skill-resources.js +56 -0
  210. package/dist/kernel/skill-resources.js.map +1 -0
  211. package/dist/kernel/spawn.d.ts +60 -0
  212. package/dist/kernel/spawn.d.ts.map +1 -0
  213. package/dist/kernel/spawn.js +116 -0
  214. package/dist/kernel/spawn.js.map +1 -0
  215. package/dist/kernel/workspace.d.ts +51 -0
  216. package/dist/kernel/workspace.d.ts.map +1 -0
  217. package/dist/kernel/workspace.js +223 -0
  218. package/dist/kernel/workspace.js.map +1 -0
  219. package/dist/products/activity-timeline.d.ts +126 -0
  220. package/dist/products/activity-timeline.d.ts.map +1 -0
  221. package/dist/products/activity-timeline.js +542 -0
  222. package/dist/products/activity-timeline.js.map +1 -0
  223. package/dist/products/dashboard-cli.d.ts +26 -0
  224. package/dist/products/dashboard-cli.d.ts.map +1 -0
  225. package/dist/products/dashboard-cli.js +224 -0
  226. package/dist/products/dashboard-cli.js.map +1 -0
  227. package/dist/products/dashboard-display-controls.d.ts +17 -0
  228. package/dist/products/dashboard-display-controls.d.ts.map +1 -0
  229. package/dist/products/dashboard-display-controls.js +38 -0
  230. package/dist/products/dashboard-display-controls.js.map +1 -0
  231. package/dist/products/dashboard-handshake.d.ts +42 -0
  232. package/dist/products/dashboard-handshake.d.ts.map +1 -0
  233. package/dist/products/dashboard-handshake.js +158 -0
  234. package/dist/products/dashboard-handshake.js.map +1 -0
  235. package/dist/products/dashboard-herdr.d.ts +55 -0
  236. package/dist/products/dashboard-herdr.d.ts.map +1 -0
  237. package/dist/products/dashboard-herdr.js +324 -0
  238. package/dist/products/dashboard-herdr.js.map +1 -0
  239. package/dist/products/dashboard-projection.d.ts +62 -0
  240. package/dist/products/dashboard-projection.d.ts.map +1 -0
  241. package/dist/products/dashboard-projection.js +305 -0
  242. package/dist/products/dashboard-projection.js.map +1 -0
  243. package/dist/products/dashboard-render.d.ts.map +1 -0
  244. package/dist/products/dashboard-render.js +208 -0
  245. package/dist/products/dashboard-render.js.map +1 -0
  246. package/extensions/activity-timeline.ts +134 -28
  247. package/extensions/approval-banking.ts +3 -3
  248. package/extensions/approvals.ts +18 -12
  249. package/extensions/chain-approval-facts.ts +9 -6
  250. package/extensions/chain-ledger.ts +4 -4
  251. package/extensions/chain-plan.ts +6 -6
  252. package/extensions/correlation-shape.ts +42 -33
  253. package/extensions/delegate-chain.ts +93 -45
  254. package/extensions/delegation-authority.ts +7 -3
  255. package/extensions/delegation-ledger.ts +2 -2
  256. package/extensions/delegation-native.ts +24 -7
  257. package/extensions/delegation.ts +91 -80
  258. package/extensions/execute-child.ts +440 -293
  259. package/extensions/execution-occurrence.ts +2 -2
  260. package/extensions/executor-session.ts +5 -5
  261. package/extensions/fanout-outcome.ts +8 -6
  262. package/extensions/grant-store-refusal.ts +24 -12
  263. package/extensions/grants-command.ts +42 -34
  264. package/extensions/grants-connected-command.ts +29 -15
  265. package/extensions/grants.ts +73 -73
  266. package/extensions/init-command.ts +18 -12
  267. package/extensions/reload-environment.ts +12 -5
  268. package/extensions/run-delegation.ts +29 -19
  269. package/extensions/session-environment.ts +25 -11
  270. package/extensions/session-report.ts +61 -12
  271. package/extensions/session.ts +58 -34
  272. package/extensions/spawn-summary.ts +5 -5
  273. package/extensions/stored-grant-session.ts +5 -5
  274. package/extensions/tripwire.ts +1 -1
  275. package/extensions/workspace-runtime.ts +26 -24
  276. package/herdr-plugin/herdr-plugin.toml +1 -1
  277. package/package.json +4 -211
  278. package/src/cli.ts +149 -92
  279. package/src/executors/activity-session.ts +54 -0
  280. package/src/executors/executor.ts +123 -0
  281. package/src/executors/herdr-cli.ts +132 -0
  282. package/src/executors/herdr-pi-lifecycle.ts +21 -0
  283. package/src/executors/herdr-poll.ts +305 -0
  284. package/src/executors/herdr-stage.ts +55 -0
  285. package/src/executors/native-session-target.ts +31 -0
  286. package/src/executors/pane-reaper.ts +270 -0
  287. package/src/executors/process-activity.ts +54 -0
  288. package/src/executors/run-herdr.ts +426 -0
  289. package/src/governance/approval-prompt.ts +225 -0
  290. package/src/governance/approval-store.ts +385 -0
  291. package/src/governance/execution-retention.ts +372 -0
  292. package/src/governance/file-lock.ts +210 -0
  293. package/src/governance/finalization.ts +82 -0
  294. package/src/governance/grant-store.ts +235 -0
  295. package/src/governance/init.ts +447 -0
  296. package/src/governance/lease-helper.ts +124 -0
  297. package/src/governance/lease-record.ts +131 -0
  298. package/src/governance/ledger-events.ts +222 -0
  299. package/src/governance/ledger-report.ts +396 -0
  300. package/src/governance/ledger-v3-validation.ts +384 -0
  301. package/src/governance/ledger.ts +419 -0
  302. package/src/governance/native-session.ts +264 -0
  303. package/src/governance/record.ts +294 -0
  304. package/src/governance/retention-contract.ts +201 -0
  305. package/src/governance/retention-json.ts +24 -0
  306. package/src/governance/workspace-lease.ts +429 -0
  307. package/src/index.ts +82 -92
  308. package/src/kernel/approval.ts +406 -0
  309. package/src/kernel/capabilities.ts +216 -0
  310. package/src/kernel/catalog.ts +373 -0
  311. package/src/kernel/correlation.ts +351 -0
  312. package/src/kernel/definitions.ts +215 -0
  313. package/src/kernel/delegate-types.ts +162 -0
  314. package/src/kernel/delegate.ts +375 -0
  315. package/src/kernel/delegation-approval.ts +126 -0
  316. package/src/kernel/env-names.ts +119 -0
  317. package/src/kernel/fanout.ts +106 -0
  318. package/src/kernel/grant-env.ts +174 -0
  319. package/src/kernel/model-preflight.ts +44 -0
  320. package/src/kernel/pi-tools.ts +32 -0
  321. package/src/kernel/project-paths.ts +97 -0
  322. package/src/kernel/propagation.ts +341 -0
  323. package/src/kernel/refusals.ts +64 -0
  324. package/src/kernel/resolve.ts +258 -0
  325. package/src/kernel/routing-authority.ts +121 -0
  326. package/src/kernel/run-child.ts +418 -0
  327. package/src/kernel/skill-packages.ts +329 -0
  328. package/src/kernel/skill-resources.ts +64 -0
  329. package/src/kernel/spawn.ts +156 -0
  330. package/src/kernel/workspace.ts +336 -0
  331. package/src/products/activity-timeline.ts +679 -0
  332. package/src/products/dashboard-cli.ts +250 -0
  333. package/src/products/dashboard-display-controls.ts +44 -0
  334. package/src/products/dashboard-handshake.ts +222 -0
  335. package/src/products/dashboard-herdr.ts +427 -0
  336. package/src/products/dashboard-projection.ts +389 -0
  337. package/src/products/dashboard-render.ts +260 -0
  338. package/PRODUCT-GUIDE.md +0 -155
  339. package/REQUIREMENTS.md +0 -41
  340. package/contracts/daily-view/v1/README.md +0 -114
  341. package/contracts/daily-view/v1/fixtures/view.json +0 -525
  342. package/contracts/daily-view/v1/fixtures/view.txt +0 -75
  343. package/contracts/daily-view/v1/fixtures/work.jsonl +0 -17
  344. package/contracts/daily-view/v1/p03/README.md +0 -26
  345. package/contracts/daily-view/v1/p03/fixtures/retained-executions.json +0 -241
  346. package/contracts/daily-view/v1/p03/projection.schema.json +0 -194
  347. package/contracts/daily-view/v1/p03/provenance.json +0 -21
  348. package/contracts/dashboard-host/v1/README.md +0 -176
  349. package/contracts/debrief/v1/README.md +0 -146
  350. package/contracts/debrief/v1/intervention/README.md +0 -32
  351. package/contracts/debrief/v1/intervention/fixtures/artifact-3ee11136beb864f518252e5024dae9197421fbf97b6e981d3243c782b5c44bd0.txt +0 -1
  352. package/contracts/debrief/v1/intervention/fixtures/artifact-58905d872dd3c54a9705f67b05fa82edbad7af6476ae8993faf1a7b9fadfb905.txt +0 -1
  353. package/contracts/debrief/v1/intervention/fixtures/assessment.json +0 -29
  354. package/contracts/debrief/v1/intervention/fixtures/blind-view.json +0 -20
  355. package/contracts/debrief/v1/intervention/fixtures/choice.json +0 -7
  356. package/contracts/debrief/v1/intervention/fixtures/manifest.json +0 -57
  357. package/contracts/debrief/v1/intervention/fixtures/reveal.json +0 -39
  358. package/contracts/debrief/v1/provenance.json +0 -89
  359. package/contracts/debrief/v1/work-capture/README.md +0 -38
  360. package/contracts/debrief/v1/work-capture/fixtures/batch.json +0 -17
  361. package/contracts/debrief/v1/work-capture/fixtures/cases.json +0 -184
  362. package/contracts/debrief/v1/work-capture/fixtures/review.json +0 -184
  363. package/contracts/debrief/v1/work-capture/review-request.schema.json +0 -41
  364. package/contracts/debrief/v1/work-capture/work-case.schema.json +0 -190
  365. package/contracts/debrief/v2/README.md +0 -71
  366. package/contracts/debrief/v2/input-pin.json +0 -66
  367. package/contracts/debrief/v2/intervention-upstream.md +0 -40
  368. package/contracts/debrief/v2/work-signals-upstream.md +0 -22
  369. package/contracts/dispatch-control/v1/README.md +0 -109
  370. package/contracts/dispatch-control/v1/request.schema.json +0 -19
  371. package/contracts/effect-profile/v1/README.md +0 -124
  372. package/contracts/execution-retention/v1/README.md +0 -109
  373. package/contracts/execution-retention/v2/README.md +0 -148
  374. package/contracts/execution-retention/v2/fixtures/interrupted-native-bytes.json +0 -91
  375. package/contracts/execution-retention/v2/fixtures/missing-native-session.json +0 -91
  376. package/contracts/execution-retention/v2/fixtures/native-file-unknown-branch.json +0 -91
  377. package/contracts/execution-retention/v2/fixtures/native-id-without-bytes.json +0 -91
  378. package/contracts/execution-retention/v2/fixtures/native-live-branch.json +0 -90
  379. package/contracts/execution-retention/v2/fixtures/replaced-native-session.json +0 -92
  380. package/contracts/execution-retention/v2/fixtures/result-82c620cdfeb8ca6b858cf653d7f5e2eedca5315d6244216d60e8b36f03223d6a.bin +0 -1
  381. package/contracts/execution-retention/v2/fixtures/session-2ec1f134bc739984434f7fca689e1c3d1c39fce2dcadae709e9b6faedfcc4ac7.bin +0 -3
  382. package/contracts/execution-retention/v2/fixtures/session-9bdb4bd16a901da31580acf056bda525225259e15ec409e0410480109011772f.bin +0 -3
  383. package/contracts/execution-retention/v2/manifest.schema.json +0 -858
  384. package/contracts/experiment/v1/README.md +0 -164
  385. package/contracts/factory-order/v1/README.md +0 -151
  386. package/contracts/factory-order/v1/adoption-pin.json +0 -8
  387. package/contracts/intent-control/v1/README.md +0 -135
  388. package/contracts/intent-control/v1/request.schema.json +0 -1096
  389. package/contracts/intent-control/v2/README.md +0 -34
  390. package/contracts/intent-control/v2/request.schema.json +0 -1070
  391. package/contracts/ledger/v2/README.md +0 -59
  392. package/contracts/ledger/v2/fixtures/capability-decision.json +0 -95
  393. package/contracts/ledger/v2/fixtures/check-receipt.json +0 -40
  394. package/contracts/ledger/v2/fixtures/child-lifecycle.json +0 -42
  395. package/contracts/ledger/v2/fixtures/workspace-lease.json +0 -41
  396. package/contracts/ledger/v2/ledger-event.schema.json +0 -633
  397. package/contracts/ledger/v3/README.md +0 -36
  398. package/contracts/ledger/v3/fixtures/check-receipt.json +0 -41
  399. package/contracts/ledger/v3/fixtures/child-lifecycle.json +0 -44
  400. package/contracts/ledger/v3/fixtures/workflow-fact.json +0 -40
  401. package/contracts/ledger/v3/ledger-event.schema.json +0 -955
  402. package/contracts/ledger/v4/README.md +0 -241
  403. package/contracts/ledger/v4/fixtures/layout-options.json +0 -428
  404. package/contracts/ledger/v4/fixtures/work-acceptance.json +0 -57
  405. package/contracts/ledger/v4/fixtures/work-occurrence.json +0 -44
  406. package/contracts/ledger/v4/fixtures/work-revision.json +0 -26
  407. package/contracts/ledger/v4/fixtures/work-snapshot.json +0 -73
  408. package/contracts/ledger/v4/ledger-event.schema.json +0 -162
  409. package/contracts/ordinary-control/v1/README.md +0 -59
  410. package/contracts/producer-ipc/v1/README.md +0 -137
  411. package/dist/activity-timeline.d.ts +0 -109
  412. package/dist/activity-timeline.d.ts.map +0 -1
  413. package/dist/activity-timeline.js +0 -208
  414. package/dist/activity-timeline.js.map +0 -1
  415. package/dist/approval-prompt.d.ts +0 -119
  416. package/dist/approval-prompt.d.ts.map +0 -1
  417. package/dist/approval-prompt.js +0 -133
  418. package/dist/approval-prompt.js.map +0 -1
  419. package/dist/approval-store.d.ts +0 -149
  420. package/dist/approval-store.d.ts.map +0 -1
  421. package/dist/approval-store.js +0 -314
  422. package/dist/approval-store.js.map +0 -1
  423. package/dist/approval.d.ts +0 -241
  424. package/dist/approval.d.ts.map +0 -1
  425. package/dist/approval.js +0 -268
  426. package/dist/approval.js.map +0 -1
  427. package/dist/capabilities.d.ts +0 -136
  428. package/dist/capabilities.d.ts.map +0 -1
  429. package/dist/capabilities.js +0 -203
  430. package/dist/capabilities.js.map +0 -1
  431. package/dist/catalog.d.ts +0 -98
  432. package/dist/catalog.d.ts.map +0 -1
  433. package/dist/catalog.js +0 -273
  434. package/dist/catalog.js.map +0 -1
  435. package/dist/chain.d.ts.map +0 -1
  436. package/dist/chain.js.map +0 -1
  437. package/dist/check-runner.d.ts +0 -66
  438. package/dist/check-runner.d.ts.map +0 -1
  439. package/dist/check-runner.js +0 -275
  440. package/dist/check-runner.js.map +0 -1
  441. package/dist/control-journal.d.ts +0 -20
  442. package/dist/control-journal.d.ts.map +0 -1
  443. package/dist/control-journal.js +0 -73
  444. package/dist/control-journal.js.map +0 -1
  445. package/dist/correlation.d.ts.map +0 -1
  446. package/dist/correlation.js +0 -231
  447. package/dist/correlation.js.map +0 -1
  448. package/dist/daily-dashboard-host.d.ts +0 -136
  449. package/dist/daily-dashboard-host.d.ts.map +0 -1
  450. package/dist/daily-dashboard-host.js +0 -164
  451. package/dist/daily-dashboard-host.js.map +0 -1
  452. package/dist/daily-panel.d.ts +0 -36
  453. package/dist/daily-panel.d.ts.map +0 -1
  454. package/dist/daily-panel.js +0 -84
  455. package/dist/daily-panel.js.map +0 -1
  456. package/dist/daily-view-input.d.ts +0 -44
  457. package/dist/daily-view-input.d.ts.map +0 -1
  458. package/dist/daily-view-input.js +0 -68
  459. package/dist/daily-view-input.js.map +0 -1
  460. package/dist/daily-view-render.d.ts +0 -5
  461. package/dist/daily-view-render.d.ts.map +0 -1
  462. package/dist/daily-view-render.js +0 -42
  463. package/dist/daily-view-render.js.map +0 -1
  464. package/dist/daily-view.d.ts +0 -77
  465. package/dist/daily-view.d.ts.map +0 -1
  466. package/dist/daily-view.js +0 -176
  467. package/dist/daily-view.js.map +0 -1
  468. package/dist/dashboard-cli.d.ts +0 -54
  469. package/dist/dashboard-cli.d.ts.map +0 -1
  470. package/dist/dashboard-cli.js +0 -367
  471. package/dist/dashboard-cli.js.map +0 -1
  472. package/dist/dashboard-display-controls.d.ts +0 -15
  473. package/dist/dashboard-display-controls.d.ts.map +0 -1
  474. package/dist/dashboard-display-controls.js +0 -34
  475. package/dist/dashboard-display-controls.js.map +0 -1
  476. package/dist/dashboard-handshake.d.ts +0 -42
  477. package/dist/dashboard-handshake.d.ts.map +0 -1
  478. package/dist/dashboard-handshake.js +0 -147
  479. package/dist/dashboard-handshake.js.map +0 -1
  480. package/dist/dashboard-harness.d.ts +0 -22
  481. package/dist/dashboard-harness.d.ts.map +0 -1
  482. package/dist/dashboard-harness.js +0 -89
  483. package/dist/dashboard-harness.js.map +0 -1
  484. package/dist/dashboard-herdr.d.ts +0 -55
  485. package/dist/dashboard-herdr.d.ts.map +0 -1
  486. package/dist/dashboard-herdr.js +0 -293
  487. package/dist/dashboard-herdr.js.map +0 -1
  488. package/dist/dashboard-host-contract.d.ts +0 -127
  489. package/dist/dashboard-host-contract.d.ts.map +0 -1
  490. package/dist/dashboard-host-contract.js +0 -14
  491. package/dist/dashboard-host-contract.js.map +0 -1
  492. package/dist/dashboard-host-transport.d.ts +0 -16
  493. package/dist/dashboard-host-transport.d.ts.map +0 -1
  494. package/dist/dashboard-host-transport.js +0 -127
  495. package/dist/dashboard-host-transport.js.map +0 -1
  496. package/dist/dashboard-host.d.ts +0 -239
  497. package/dist/dashboard-host.d.ts.map +0 -1
  498. package/dist/dashboard-host.js +0 -474
  499. package/dist/dashboard-host.js.map +0 -1
  500. package/dist/dashboard-menu.d.ts +0 -16
  501. package/dist/dashboard-menu.d.ts.map +0 -1
  502. package/dist/dashboard-menu.js +0 -33
  503. package/dist/dashboard-menu.js.map +0 -1
  504. package/dist/dashboard-observation.d.ts +0 -28
  505. package/dist/dashboard-observation.d.ts.map +0 -1
  506. package/dist/dashboard-observation.js +0 -87
  507. package/dist/dashboard-observation.js.map +0 -1
  508. package/dist/dashboard-projection.d.ts +0 -73
  509. package/dist/dashboard-projection.d.ts.map +0 -1
  510. package/dist/dashboard-projection.js +0 -294
  511. package/dist/dashboard-projection.js.map +0 -1
  512. package/dist/dashboard-render.d.ts.map +0 -1
  513. package/dist/dashboard-render.js +0 -212
  514. package/dist/dashboard-render.js.map +0 -1
  515. package/dist/debrief-contract.d.ts +0 -65
  516. package/dist/debrief-contract.d.ts.map +0 -1
  517. package/dist/debrief-contract.js +0 -151
  518. package/dist/debrief-contract.js.map +0 -1
  519. package/dist/debrief-fixture.d.ts +0 -16
  520. package/dist/debrief-fixture.d.ts.map +0 -1
  521. package/dist/debrief-fixture.js +0 -41
  522. package/dist/debrief-fixture.js.map +0 -1
  523. package/dist/debrief-host.d.ts +0 -59
  524. package/dist/debrief-host.d.ts.map +0 -1
  525. package/dist/debrief-host.js +0 -49
  526. package/dist/debrief-host.js.map +0 -1
  527. package/dist/debrief-render.d.ts +0 -5
  528. package/dist/debrief-render.d.ts.map +0 -1
  529. package/dist/debrief-render.js +0 -65
  530. package/dist/debrief-render.js.map +0 -1
  531. package/dist/debrief.d.ts +0 -90
  532. package/dist/debrief.d.ts.map +0 -1
  533. package/dist/debrief.js +0 -263
  534. package/dist/debrief.js.map +0 -1
  535. package/dist/definitions.d.ts.map +0 -1
  536. package/dist/definitions.js +0 -164
  537. package/dist/definitions.js.map +0 -1
  538. package/dist/delegate-types.d.ts +0 -154
  539. package/dist/delegate-types.d.ts.map +0 -1
  540. package/dist/delegate-types.js +0 -8
  541. package/dist/delegate-types.js.map +0 -1
  542. package/dist/delegate.d.ts.map +0 -1
  543. package/dist/delegate.js +0 -313
  544. package/dist/delegate.js.map +0 -1
  545. package/dist/delegation-approval.d.ts.map +0 -1
  546. package/dist/delegation-approval.js +0 -94
  547. package/dist/delegation-approval.js.map +0 -1
  548. package/dist/dispatch-control.d.ts +0 -45
  549. package/dist/dispatch-control.d.ts.map +0 -1
  550. package/dist/dispatch-control.js +0 -76
  551. package/dist/dispatch-control.js.map +0 -1
  552. package/dist/effect-profile-runtime.d.ts +0 -40
  553. package/dist/effect-profile-runtime.d.ts.map +0 -1
  554. package/dist/effect-profile-runtime.js +0 -51
  555. package/dist/effect-profile-runtime.js.map +0 -1
  556. package/dist/effect-profile.d.ts +0 -40
  557. package/dist/effect-profile.d.ts.map +0 -1
  558. package/dist/effect-profile.js +0 -152
  559. package/dist/effect-profile.js.map +0 -1
  560. package/dist/execution-id.d.ts.map +0 -1
  561. package/dist/execution-id.js.map +0 -1
  562. package/dist/execution-retention.d.ts +0 -90
  563. package/dist/execution-retention.d.ts.map +0 -1
  564. package/dist/execution-retention.js +0 -247
  565. package/dist/execution-retention.js.map +0 -1
  566. package/dist/executor.d.ts +0 -39
  567. package/dist/executor.d.ts.map +0 -1
  568. package/dist/executor.js +0 -94
  569. package/dist/executor.js.map +0 -1
  570. package/dist/experiment-contract.d.ts +0 -56
  571. package/dist/experiment-contract.d.ts.map +0 -1
  572. package/dist/experiment-contract.js +0 -80
  573. package/dist/experiment-contract.js.map +0 -1
  574. package/dist/experiment-state.d.ts +0 -22
  575. package/dist/experiment-state.d.ts.map +0 -1
  576. package/dist/experiment-state.js +0 -79
  577. package/dist/experiment-state.js.map +0 -1
  578. package/dist/experiment-store.d.ts +0 -30
  579. package/dist/experiment-store.d.ts.map +0 -1
  580. package/dist/experiment-store.js +0 -147
  581. package/dist/experiment-store.js.map +0 -1
  582. package/dist/experiment.d.ts +0 -65
  583. package/dist/experiment.d.ts.map +0 -1
  584. package/dist/experiment.js +0 -362
  585. package/dist/experiment.js.map +0 -1
  586. package/dist/factory-contract.d.ts +0 -79
  587. package/dist/factory-contract.d.ts.map +0 -1
  588. package/dist/factory-contract.js +0 -89
  589. package/dist/factory-contract.js.map +0 -1
  590. package/dist/factory-migration.d.ts +0 -20
  591. package/dist/factory-migration.d.ts.map +0 -1
  592. package/dist/factory-migration.js +0 -55
  593. package/dist/factory-migration.js.map +0 -1
  594. package/dist/factory-order.d.ts +0 -848
  595. package/dist/factory-order.d.ts.map +0 -1
  596. package/dist/factory-order.js +0 -83
  597. package/dist/factory-order.js.map +0 -1
  598. package/dist/factory-registry.d.ts +0 -121
  599. package/dist/factory-registry.d.ts.map +0 -1
  600. package/dist/factory-registry.js +0 -133
  601. package/dist/factory-registry.js.map +0 -1
  602. package/dist/fanout.d.ts.map +0 -1
  603. package/dist/fanout.js +0 -93
  604. package/dist/fanout.js.map +0 -1
  605. package/dist/file-lock.d.ts.map +0 -1
  606. package/dist/file-lock.js +0 -201
  607. package/dist/file-lock.js.map +0 -1
  608. package/dist/finalization.d.ts.map +0 -1
  609. package/dist/finalization.js.map +0 -1
  610. package/dist/git-identity.d.ts +0 -13
  611. package/dist/git-identity.d.ts.map +0 -1
  612. package/dist/git-identity.js +0 -47
  613. package/dist/git-identity.js.map +0 -1
  614. package/dist/grant-env.d.ts +0 -75
  615. package/dist/grant-env.d.ts.map +0 -1
  616. package/dist/grant-env.js +0 -154
  617. package/dist/grant-env.js.map +0 -1
  618. package/dist/grant-store.d.ts +0 -96
  619. package/dist/grant-store.d.ts.map +0 -1
  620. package/dist/grant-store.js +0 -188
  621. package/dist/grant-store.js.map +0 -1
  622. package/dist/herdr-cli.d.ts +0 -78
  623. package/dist/herdr-cli.d.ts.map +0 -1
  624. package/dist/herdr-cli.js +0 -113
  625. package/dist/herdr-cli.js.map +0 -1
  626. package/dist/herdr-name.d.ts.map +0 -1
  627. package/dist/herdr-name.js.map +0 -1
  628. package/dist/herdr-pi-lifecycle.d.ts.map +0 -1
  629. package/dist/herdr-pi-lifecycle.js +0 -22
  630. package/dist/herdr-pi-lifecycle.js.map +0 -1
  631. package/dist/herdr-poll.d.ts +0 -133
  632. package/dist/herdr-poll.d.ts.map +0 -1
  633. package/dist/herdr-poll.js +0 -222
  634. package/dist/herdr-poll.js.map +0 -1
  635. package/dist/herdr-stage.d.ts +0 -40
  636. package/dist/herdr-stage.d.ts.map +0 -1
  637. package/dist/herdr-stage.js +0 -54
  638. package/dist/herdr-stage.js.map +0 -1
  639. package/dist/herdr-start.d.ts.map +0 -1
  640. package/dist/herdr-start.js.map +0 -1
  641. package/dist/init.d.ts +0 -117
  642. package/dist/init.d.ts.map +0 -1
  643. package/dist/init.js +0 -323
  644. package/dist/init.js.map +0 -1
  645. package/dist/intent-application.d.ts +0 -17
  646. package/dist/intent-application.d.ts.map +0 -1
  647. package/dist/intent-application.js +0 -114
  648. package/dist/intent-application.js.map +0 -1
  649. package/dist/intent-control.d.ts +0 -201
  650. package/dist/intent-control.d.ts.map +0 -1
  651. package/dist/intent-control.js +0 -110
  652. package/dist/intent-control.js.map +0 -1
  653. package/dist/intent-scheduling.d.ts +0 -9
  654. package/dist/intent-scheduling.d.ts.map +0 -1
  655. package/dist/intent-scheduling.js +0 -15
  656. package/dist/intent-scheduling.js.map +0 -1
  657. package/dist/learning-connection.d.ts +0 -127
  658. package/dist/learning-connection.d.ts.map +0 -1
  659. package/dist/learning-connection.js +0 -54
  660. package/dist/learning-connection.js.map +0 -1
  661. package/dist/lease-helper.d.ts.map +0 -1
  662. package/dist/lease-helper.js +0 -94
  663. package/dist/lease-helper.js.map +0 -1
  664. package/dist/lease-record.d.ts +0 -90
  665. package/dist/lease-record.d.ts.map +0 -1
  666. package/dist/lease-record.js.map +0 -1
  667. package/dist/ledger-append.d.ts +0 -15
  668. package/dist/ledger-append.d.ts.map +0 -1
  669. package/dist/ledger-append.js +0 -94
  670. package/dist/ledger-append.js.map +0 -1
  671. package/dist/ledger-events.d.ts +0 -131
  672. package/dist/ledger-events.d.ts.map +0 -1
  673. package/dist/ledger-events.js +0 -107
  674. package/dist/ledger-events.js.map +0 -1
  675. package/dist/ledger-identifiers.d.ts.map +0 -1
  676. package/dist/ledger-identifiers.js.map +0 -1
  677. package/dist/ledger-report.d.ts +0 -134
  678. package/dist/ledger-report.d.ts.map +0 -1
  679. package/dist/ledger-report.js +0 -271
  680. package/dist/ledger-report.js.map +0 -1
  681. package/dist/ledger-v3-validation.d.ts +0 -11
  682. package/dist/ledger-v3-validation.d.ts.map +0 -1
  683. package/dist/ledger-v3-validation.js +0 -265
  684. package/dist/ledger-v3-validation.js.map +0 -1
  685. package/dist/ledger.d.ts +0 -242
  686. package/dist/ledger.d.ts.map +0 -1
  687. package/dist/ledger.js +0 -142
  688. package/dist/ledger.js.map +0 -1
  689. package/dist/measured-order.d.ts +0 -249
  690. package/dist/measured-order.d.ts.map +0 -1
  691. package/dist/measured-order.js +0 -309
  692. package/dist/measured-order.js.map +0 -1
  693. package/dist/measured-session.d.ts +0 -97
  694. package/dist/measured-session.d.ts.map +0 -1
  695. package/dist/measured-session.js +0 -134
  696. package/dist/measured-session.js.map +0 -1
  697. package/dist/model-preflight.d.ts +0 -13
  698. package/dist/model-preflight.d.ts.map +0 -1
  699. package/dist/model-preflight.js +0 -29
  700. package/dist/model-preflight.js.map +0 -1
  701. package/dist/native-session-target.d.ts +0 -9
  702. package/dist/native-session-target.d.ts.map +0 -1
  703. package/dist/native-session-target.js +0 -29
  704. package/dist/native-session-target.js.map +0 -1
  705. package/dist/native-session.d.ts +0 -59
  706. package/dist/native-session.d.ts.map +0 -1
  707. package/dist/native-session.js +0 -154
  708. package/dist/native-session.js.map +0 -1
  709. package/dist/order-schedule.d.ts +0 -37
  710. package/dist/order-schedule.d.ts.map +0 -1
  711. package/dist/order-schedule.js +0 -81
  712. package/dist/order-schedule.js.map +0 -1
  713. package/dist/ordinary-children.d.ts +0 -52
  714. package/dist/ordinary-children.d.ts.map +0 -1
  715. package/dist/ordinary-children.js +0 -93
  716. package/dist/ordinary-children.js.map +0 -1
  717. package/dist/pane-reaper.d.ts +0 -111
  718. package/dist/pane-reaper.d.ts.map +0 -1
  719. package/dist/pane-reaper.js +0 -242
  720. package/dist/pane-reaper.js.map +0 -1
  721. package/dist/pi-tools.d.ts.map +0 -1
  722. package/dist/pi-tools.js +0 -21
  723. package/dist/pi-tools.js.map +0 -1
  724. package/dist/producer-ipc-contract.d.ts +0 -29
  725. package/dist/producer-ipc-contract.d.ts.map +0 -1
  726. package/dist/producer-ipc-contract.js +0 -29
  727. package/dist/producer-ipc-contract.js.map +0 -1
  728. package/dist/producer-ipc.d.ts +0 -55
  729. package/dist/producer-ipc.d.ts.map +0 -1
  730. package/dist/producer-ipc.js +0 -143
  731. package/dist/producer-ipc.js.map +0 -1
  732. package/dist/product-files.d.ts +0 -6
  733. package/dist/product-files.d.ts.map +0 -1
  734. package/dist/product-files.js +0 -55
  735. package/dist/product-files.js.map +0 -1
  736. package/dist/progress.d.ts.map +0 -1
  737. package/dist/progress.js.map +0 -1
  738. package/dist/propagation.d.ts +0 -203
  739. package/dist/propagation.d.ts.map +0 -1
  740. package/dist/propagation.js +0 -279
  741. package/dist/propagation.js.map +0 -1
  742. package/dist/refusals.d.ts +0 -16
  743. package/dist/refusals.d.ts.map +0 -1
  744. package/dist/refusals.js +0 -55
  745. package/dist/refusals.js.map +0 -1
  746. package/dist/resolve.d.ts +0 -120
  747. package/dist/resolve.d.ts.map +0 -1
  748. package/dist/resolve.js +0 -211
  749. package/dist/resolve.js.map +0 -1
  750. package/dist/resource-budget.d.ts +0 -334
  751. package/dist/resource-budget.d.ts.map +0 -1
  752. package/dist/resource-budget.js +0 -415
  753. package/dist/resource-budget.js.map +0 -1
  754. package/dist/retention-contract.d.ts.map +0 -1
  755. package/dist/retention-contract.js +0 -104
  756. package/dist/retention-contract.js.map +0 -1
  757. package/dist/retention-json.d.ts.map +0 -1
  758. package/dist/retention-json.js.map +0 -1
  759. package/dist/routing-authority.d.ts +0 -71
  760. package/dist/routing-authority.d.ts.map +0 -1
  761. package/dist/routing-authority.js +0 -100
  762. package/dist/routing-authority.js.map +0 -1
  763. package/dist/run-child.d.ts +0 -87
  764. package/dist/run-child.d.ts.map +0 -1
  765. package/dist/run-child.js +0 -248
  766. package/dist/run-child.js.map +0 -1
  767. package/dist/run-herdr.d.ts +0 -119
  768. package/dist/run-herdr.d.ts.map +0 -1
  769. package/dist/run-herdr.js +0 -335
  770. package/dist/run-herdr.js.map +0 -1
  771. package/dist/skill-packages.d.ts +0 -116
  772. package/dist/skill-packages.d.ts.map +0 -1
  773. package/dist/skill-packages.js +0 -295
  774. package/dist/skill-packages.js.map +0 -1
  775. package/dist/skill-resources.d.ts.map +0 -1
  776. package/dist/skill-resources.js +0 -52
  777. package/dist/skill-resources.js.map +0 -1
  778. package/dist/spawn.d.ts +0 -60
  779. package/dist/spawn.d.ts.map +0 -1
  780. package/dist/spawn.js +0 -116
  781. package/dist/spawn.js.map +0 -1
  782. package/dist/vendor/adoption.d.ts +0 -129
  783. package/dist/vendor/adoption.d.ts.map +0 -1
  784. package/dist/vendor/adoption.js +0 -102
  785. package/dist/vendor/adoption.js.map +0 -1
  786. package/dist/vendor/herdr-pi-lifecycle.d.ts.map +0 -1
  787. package/dist/vendor/herdr-pi-lifecycle.js.map +0 -1
  788. package/dist/work-command.d.ts +0 -32
  789. package/dist/work-command.d.ts.map +0 -1
  790. package/dist/work-command.js +0 -179
  791. package/dist/work-command.js.map +0 -1
  792. package/dist/work-ledger-destination.d.ts +0 -20
  793. package/dist/work-ledger-destination.d.ts.map +0 -1
  794. package/dist/work-ledger-destination.js +0 -131
  795. package/dist/work-ledger-destination.js.map +0 -1
  796. package/dist/work-ledger-json.d.ts +0 -25
  797. package/dist/work-ledger-json.d.ts.map +0 -1
  798. package/dist/work-ledger-json.js +0 -267
  799. package/dist/work-ledger-json.js.map +0 -1
  800. package/dist/work-ledger-occurrences.d.ts +0 -227
  801. package/dist/work-ledger-occurrences.d.ts.map +0 -1
  802. package/dist/work-ledger-occurrences.js +0 -115
  803. package/dist/work-ledger-occurrences.js.map +0 -1
  804. package/dist/work-ledger-projection.d.ts +0 -295
  805. package/dist/work-ledger-projection.d.ts.map +0 -1
  806. package/dist/work-ledger-projection.js +0 -237
  807. package/dist/work-ledger-projection.js.map +0 -1
  808. package/dist/work-ledger-snapshot.d.ts +0 -29
  809. package/dist/work-ledger-snapshot.d.ts.map +0 -1
  810. package/dist/work-ledger-snapshot.js +0 -267
  811. package/dist/work-ledger-snapshot.js.map +0 -1
  812. package/dist/work-ledger-types.d.ts +0 -261
  813. package/dist/work-ledger-types.d.ts.map +0 -1
  814. package/dist/work-ledger-types.js +0 -13
  815. package/dist/work-ledger-types.js.map +0 -1
  816. package/dist/work-ledger-validation.d.ts +0 -14
  817. package/dist/work-ledger-validation.d.ts.map +0 -1
  818. package/dist/work-ledger-validation.js +0 -226
  819. package/dist/work-ledger-validation.js.map +0 -1
  820. package/dist/work-ledger.d.ts +0 -43
  821. package/dist/work-ledger.d.ts.map +0 -1
  822. package/dist/work-ledger.js +0 -225
  823. package/dist/work-ledger.js.map +0 -1
  824. package/dist/work-policy-registry.d.ts +0 -133
  825. package/dist/work-policy-registry.d.ts.map +0 -1
  826. package/dist/work-policy-registry.js +0 -128
  827. package/dist/work-policy-registry.js.map +0 -1
  828. package/dist/work-run.d.ts +0 -56
  829. package/dist/work-run.d.ts.map +0 -1
  830. package/dist/work-run.js +0 -102
  831. package/dist/work-run.js.map +0 -1
  832. package/dist/work-setup.d.ts +0 -40
  833. package/dist/work-setup.d.ts.map +0 -1
  834. package/dist/work-setup.js +0 -174
  835. package/dist/work-setup.js.map +0 -1
  836. package/dist/workflow-fact-id.d.ts +0 -4
  837. package/dist/workflow-fact-id.d.ts.map +0 -1
  838. package/dist/workflow-fact-id.js +0 -14
  839. package/dist/workflow-fact-id.js.map +0 -1
  840. package/dist/workflow-facts.d.ts +0 -34
  841. package/dist/workflow-facts.d.ts.map +0 -1
  842. package/dist/workflow-facts.js +0 -43
  843. package/dist/workflow-facts.js.map +0 -1
  844. package/dist/workspace-lease.d.ts +0 -40
  845. package/dist/workspace-lease.d.ts.map +0 -1
  846. package/dist/workspace-lease.js +0 -333
  847. package/dist/workspace-lease.js.map +0 -1
  848. package/dist/workspace.d.ts +0 -57
  849. package/dist/workspace.d.ts.map +0 -1
  850. package/dist/workspace.js +0 -216
  851. package/dist/workspace.js.map +0 -1
  852. package/extensions/daily-dashboard-session.ts +0 -48
  853. package/extensions/daily-work-session.ts +0 -20
  854. package/extensions/learning-outcome-session.ts +0 -38
  855. package/extensions/learning-session.ts +0 -59
  856. package/extensions/ordinary-runtime.ts +0 -14
  857. package/extensions/primary-shadow.ts +0 -11
  858. package/extensions/work-policy-session.ts +0 -139
  859. package/extensions/work-run-session.ts +0 -75
  860. package/extensions/work-runtime.ts +0 -44
  861. package/extensions/work-session.ts +0 -132
  862. package/src/activity-timeline.ts +0 -133
  863. package/src/approval-prompt.ts +0 -225
  864. package/src/approval-store.ts +0 -386
  865. package/src/approval.ts +0 -399
  866. package/src/capabilities.ts +0 -220
  867. package/src/catalog.ts +0 -306
  868. package/src/check-runner.ts +0 -387
  869. package/src/control-journal.ts +0 -26
  870. package/src/correlation.ts +0 -320
  871. package/src/daily-dashboard-host.ts +0 -105
  872. package/src/daily-panel.ts +0 -80
  873. package/src/daily-view-input.ts +0 -59
  874. package/src/daily-view-render.ts +0 -45
  875. package/src/daily-view.ts +0 -160
  876. package/src/dashboard-cli.ts +0 -340
  877. package/src/dashboard-display-controls.ts +0 -21
  878. package/src/dashboard-handshake.ts +0 -199
  879. package/src/dashboard-harness.ts +0 -37
  880. package/src/dashboard-herdr.ts +0 -363
  881. package/src/dashboard-host-contract.ts +0 -50
  882. package/src/dashboard-host-transport.ts +0 -43
  883. package/src/dashboard-host.ts +0 -244
  884. package/src/dashboard-menu.ts +0 -28
  885. package/src/dashboard-observation.ts +0 -46
  886. package/src/dashboard-projection.ts +0 -390
  887. package/src/dashboard-render.ts +0 -259
  888. package/src/debrief-contract.ts +0 -127
  889. package/src/debrief-fixture.ts +0 -29
  890. package/src/debrief-host.ts +0 -53
  891. package/src/debrief-render.ts +0 -49
  892. package/src/debrief.ts +0 -198
  893. package/src/definitions.ts +0 -211
  894. package/src/delegate-types.ts +0 -154
  895. package/src/delegate.ts +0 -348
  896. package/src/delegation-approval.ts +0 -126
  897. package/src/dispatch-control.ts +0 -81
  898. package/src/effect-profile-runtime.ts +0 -46
  899. package/src/effect-profile.ts +0 -129
  900. package/src/execution-retention.ts +0 -230
  901. package/src/executor.ts +0 -123
  902. package/src/experiment-contract.ts +0 -66
  903. package/src/experiment-state.ts +0 -44
  904. package/src/experiment-store.ts +0 -98
  905. package/src/experiment.ts +0 -236
  906. package/src/factory-contract.ts +0 -47
  907. package/src/factory-migration.ts +0 -29
  908. package/src/factory-order.ts +0 -56
  909. package/src/factory-registry.ts +0 -60
  910. package/src/fanout.ts +0 -106
  911. package/src/file-lock.ts +0 -178
  912. package/src/finalization.ts +0 -79
  913. package/src/git-identity.ts +0 -56
  914. package/src/grant-env.ts +0 -221
  915. package/src/grant-store.ts +0 -235
  916. package/src/herdr-cli.ts +0 -125
  917. package/src/herdr-pi-lifecycle.ts +0 -21
  918. package/src/herdr-poll.ts +0 -253
  919. package/src/herdr-stage.ts +0 -55
  920. package/src/init.ts +0 -389
  921. package/src/intent-application.ts +0 -91
  922. package/src/intent-control.ts +0 -107
  923. package/src/intent-scheduling.ts +0 -14
  924. package/src/learning-connection.ts +0 -70
  925. package/src/lease-helper.ts +0 -97
  926. package/src/lease-record.ts +0 -131
  927. package/src/ledger-append.ts +0 -72
  928. package/src/ledger-events.ts +0 -226
  929. package/src/ledger-report.ts +0 -357
  930. package/src/ledger-v3-validation.ts +0 -266
  931. package/src/ledger.ts +0 -369
  932. package/src/measured-order.ts +0 -72
  933. package/src/measured-session.ts +0 -70
  934. package/src/model-preflight.ts +0 -41
  935. package/src/native-session-target.ts +0 -23
  936. package/src/native-session.ts +0 -139
  937. package/src/order-schedule.ts +0 -42
  938. package/src/ordinary-children.ts +0 -59
  939. package/src/pane-reaper.ts +0 -270
  940. package/src/pi-tools.ts +0 -25
  941. package/src/producer-ipc-contract.ts +0 -26
  942. package/src/producer-ipc.ts +0 -107
  943. package/src/product-files.ts +0 -34
  944. package/src/propagation.ts +0 -333
  945. package/src/refusals.ts +0 -70
  946. package/src/resolve.ts +0 -267
  947. package/src/resource-budget.ts +0 -349
  948. package/src/retention-contract.ts +0 -84
  949. package/src/retention-json.ts +0 -20
  950. package/src/routing-authority.ts +0 -121
  951. package/src/run-child.ts +0 -303
  952. package/src/run-herdr.ts +0 -386
  953. package/src/skill-packages.ts +0 -314
  954. package/src/skill-resources.ts +0 -48
  955. package/src/spawn.ts +0 -156
  956. package/src/vendor/adoption.ts +0 -109
  957. package/src/work-command.ts +0 -197
  958. package/src/work-ledger-destination.ts +0 -113
  959. package/src/work-ledger-json.ts +0 -228
  960. package/src/work-ledger-occurrences.ts +0 -99
  961. package/src/work-ledger-projection.ts +0 -262
  962. package/src/work-ledger-snapshot.ts +0 -246
  963. package/src/work-ledger-types.ts +0 -229
  964. package/src/work-ledger-validation.ts +0 -174
  965. package/src/work-ledger.ts +0 -186
  966. package/src/work-policy-registry.ts +0 -81
  967. package/src/work-run.ts +0 -79
  968. package/src/work-setup.ts +0 -141
  969. package/src/workflow-fact-id.ts +0 -16
  970. package/src/workflow-facts.ts +0 -65
  971. package/src/workspace-lease.ts +0 -363
  972. package/src/workspace.ts +0 -308
  973. /package/contracts/{ledger/v3 → ledger-record/v1}/fixtures/capability-decision.json +0 -0
  974. /package/contracts/{ledger/v3 → ledger-record/v1}/fixtures/workspace-lease.json +0 -0
  975. /package/dist/{herdr-name.d.ts → executors/herdr-name.d.ts} +0 -0
  976. /package/dist/{herdr-name.js → executors/herdr-name.js} +0 -0
  977. /package/dist/{herdr-pi-lifecycle.d.ts → executors/herdr-pi-lifecycle.d.ts} +0 -0
  978. /package/dist/{herdr-start.d.ts → executors/herdr-start.d.ts} +0 -0
  979. /package/dist/{herdr-start.js → executors/herdr-start.js} +0 -0
  980. /package/dist/{vendor → executors/vendor}/herdr-pi-lifecycle.d.ts +0 -0
  981. /package/dist/{vendor → executors/vendor}/herdr-pi-lifecycle.js +0 -0
  982. /package/dist/{file-lock.d.ts → governance/file-lock.d.ts} +0 -0
  983. /package/dist/{finalization.d.ts → governance/finalization.d.ts} +0 -0
  984. /package/dist/{finalization.js → governance/finalization.js} +0 -0
  985. /package/dist/{lease-helper.d.ts → governance/lease-helper.d.ts} +0 -0
  986. /package/dist/{lease-record.js → governance/lease-record.js} +0 -0
  987. /package/dist/{retention-contract.d.ts → governance/retention-contract.d.ts} +0 -0
  988. /package/dist/{retention-json.d.ts → governance/retention-json.d.ts} +0 -0
  989. /package/dist/{retention-json.js → governance/retention-json.js} +0 -0
  990. /package/dist/{chain.d.ts → kernel/chain.d.ts} +0 -0
  991. /package/dist/{chain.js → kernel/chain.js} +0 -0
  992. /package/dist/{correlation.d.ts → kernel/correlation.d.ts} +0 -0
  993. /package/dist/{definitions.d.ts → kernel/definitions.d.ts} +0 -0
  994. /package/dist/{delegate.d.ts → kernel/delegate.d.ts} +0 -0
  995. /package/dist/{delegation-approval.d.ts → kernel/delegation-approval.d.ts} +0 -0
  996. /package/dist/{execution-id.d.ts → kernel/execution-id.d.ts} +0 -0
  997. /package/dist/{execution-id.js → kernel/execution-id.js} +0 -0
  998. /package/dist/{fanout.d.ts → kernel/fanout.d.ts} +0 -0
  999. /package/dist/{ledger-identifiers.d.ts → kernel/ledger-identifiers.d.ts} +0 -0
  1000. /package/dist/{ledger-identifiers.js → kernel/ledger-identifiers.js} +0 -0
  1001. /package/dist/{pi-tools.d.ts → kernel/pi-tools.d.ts} +0 -0
  1002. /package/dist/{progress.d.ts → kernel/progress.d.ts} +0 -0
  1003. /package/dist/{progress.js → kernel/progress.js} +0 -0
  1004. /package/dist/{skill-resources.d.ts → kernel/skill-resources.d.ts} +0 -0
  1005. /package/dist/{dashboard-render.d.ts → products/dashboard-render.d.ts} +0 -0
  1006. /package/src/{herdr-name.ts → executors/herdr-name.ts} +0 -0
  1007. /package/src/{herdr-start.ts → executors/herdr-start.ts} +0 -0
  1008. /package/src/{vendor → executors/vendor}/herdr-pi-lifecycle.ts +0 -0
  1009. /package/src/{chain.ts → kernel/chain.ts} +0 -0
  1010. /package/src/{execution-id.ts → kernel/execution-id.ts} +0 -0
  1011. /package/src/{ledger-identifiers.ts → kernel/ledger-identifiers.ts} +0 -0
  1012. /package/src/{progress.ts → kernel/progress.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
- }