@deksden-com/dd-flow-cli 0.9.0-beta.15 → 0.9.0-beta.151

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 (560) hide show
  1. package/CHANGELOG.md +907 -0
  2. package/README.md +139 -10
  3. package/dist/build-info.json +8 -8
  4. package/dist/cli/argument-values.js +38 -0
  5. package/dist/cli/command-inputs.js +386 -0
  6. package/dist/cli/command-metadata.js +232 -0
  7. package/dist/cli/command-option-descriptions.js +192 -0
  8. package/dist/cli/completion-cli.js +70 -0
  9. package/dist/cli/completion.js +57 -0
  10. package/dist/cli/diagnostic-invocation.js +46 -0
  11. package/dist/cli/diagnostic.js +120 -0
  12. package/dist/cli/error-output.js +52 -0
  13. package/dist/cli/executor-onboarding.js +76 -0
  14. package/dist/cli/flows.js +29 -0
  15. package/dist/cli/harnesses.js +84 -0
  16. package/dist/cli/help.js +396 -19
  17. package/dist/cli/hook-ingress.js +102 -0
  18. package/dist/cli/input-preparation.js +165 -0
  19. package/dist/cli/memory-flow-admission.js +50 -0
  20. package/dist/cli/memory-init-invocation.js +85 -0
  21. package/dist/cli/memory-init.js +249 -0
  22. package/dist/cli/memory-storage-admission.js +54 -0
  23. package/dist/cli/memory-storage-qualification.js +105 -0
  24. package/dist/cli/memory-storage-transition.js +123 -0
  25. package/dist/cli/memory-upgrade.js +189 -0
  26. package/dist/cli/models.js +39 -0
  27. package/dist/cli/native-hook-ingress.js +90 -0
  28. package/dist/cli/native-hook-preparation.js +55 -0
  29. package/dist/cli/operator-profiles.js +61 -0
  30. package/dist/cli/output-options.js +35 -0
  31. package/dist/cli/response-file.js +72 -0
  32. package/dist/cli/run-cli.js +1734 -550
  33. package/dist/cli/runtime-maintenance-diagnostics.js +46 -0
  34. package/dist/cli/runtime-maintenance-ingress.js +52 -0
  35. package/dist/cli/runtime-process.js +153 -0
  36. package/dist/cli/setup.js +150 -0
  37. package/dist/cli.js +89 -2
  38. package/dist/domain/diagnostic-aspects.js +103 -0
  39. package/dist/domain/diagnostic-flows.js +8 -0
  40. package/dist/domain/stage-catalog.js +1 -1
  41. package/dist/domain/stage-handler-identities.js +28 -0
  42. package/dist/harness-runtime/DD-ZCODE.md +112 -0
  43. package/dist/harness-runtime/OPENCODE-LICENSE.txt +24 -0
  44. package/dist/harness-runtime/bin/dd-agy.mjs +56 -0
  45. package/dist/harness-runtime/bin/dd-codex.mjs +27 -0
  46. package/dist/harness-runtime/bin/dd-droid.mjs +34 -0
  47. package/dist/harness-runtime/bin/dd-grok.mjs +40 -0
  48. package/dist/harness-runtime/bin/dd-opencode.mjs +22 -0
  49. package/dist/harness-runtime/bin/dd-zcode.mjs +87 -0
  50. package/dist/harness-runtime/lib/adapter-timeouts.d.mts +5 -0
  51. package/dist/harness-runtime/lib/adapter-timeouts.mjs +34 -0
  52. package/dist/harness-runtime/lib/agy-error-boundary.mjs +79 -0
  53. package/dist/harness-runtime/lib/agy-hooks.d.mts +1 -0
  54. package/dist/harness-runtime/lib/agy-hooks.mjs +9 -0
  55. package/dist/harness-runtime/lib/agy-native-inspection.mjs +216 -0
  56. package/dist/harness-runtime/lib/agy-native_pb.js +117 -0
  57. package/dist/harness-runtime/lib/agy-terminal-envelope.mjs +67 -0
  58. package/dist/harness-runtime/lib/daemon-observation.d.mts +2 -0
  59. package/dist/harness-runtime/lib/daemon-observation.mjs +163 -0
  60. package/dist/harness-runtime/lib/daemon-operations.d.mts +2 -0
  61. package/dist/harness-runtime/lib/daemon-operations.mjs +462 -0
  62. package/dist/harness-runtime/lib/dd-agy-daemon.d.mts +6 -0
  63. package/dist/harness-runtime/lib/dd-agy-daemon.mjs +1092 -0
  64. package/dist/harness-runtime/lib/dd-agy.mjs +86 -0
  65. package/dist/harness-runtime/lib/dd-codex-daemon.d.mts +1 -0
  66. package/dist/harness-runtime/lib/dd-codex-daemon.mjs +231 -0
  67. package/dist/harness-runtime/lib/dd-codex.d.mts +1 -0
  68. package/dist/harness-runtime/lib/dd-codex.mjs +954 -0
  69. package/dist/harness-runtime/lib/dd-droid-daemon.mjs +141 -0
  70. package/dist/harness-runtime/lib/dd-droid.mjs +626 -0
  71. package/dist/harness-runtime/lib/dd-grok-daemon.mjs +555 -0
  72. package/dist/harness-runtime/lib/dd-grok.mjs +180 -0
  73. package/dist/harness-runtime/lib/dd-opencode-daemon.mjs +627 -0
  74. package/dist/harness-runtime/lib/dd-opencode.mjs +390 -0
  75. package/dist/harness-runtime/lib/dd-zcode-daemon.mjs +752 -0
  76. package/dist/harness-runtime/lib/dd-zcode.mjs +1200 -0
  77. package/dist/harness-runtime/lib/delegation-instructions.d.mts +14 -0
  78. package/dist/harness-runtime/lib/delegation-instructions.mjs +166 -0
  79. package/dist/harness-runtime/lib/dispatch-fence.mjs +14 -0
  80. package/dist/harness-runtime/lib/driver-recovery.mjs +140 -0
  81. package/dist/harness-runtime/lib/droid-observation.mjs +66 -0
  82. package/dist/harness-runtime/lib/entity-references.d.mts +2 -0
  83. package/dist/harness-runtime/lib/entity-references.mjs +9 -0
  84. package/dist/harness-runtime/lib/lease-renewal.d.mts +8 -0
  85. package/dist/harness-runtime/lib/lease-renewal.mjs +37 -0
  86. package/dist/harness-runtime/lib/lifecycle-command.d.mts +20 -0
  87. package/dist/harness-runtime/lib/lifecycle-command.mjs +273 -0
  88. package/dist/harness-runtime/lib/lifecycle-contract.d.mts +10 -0
  89. package/dist/harness-runtime/lib/lifecycle-contract.mjs +19 -0
  90. package/dist/harness-runtime/lib/managed-daemon.d.mts +16 -0
  91. package/dist/harness-runtime/lib/managed-daemon.mjs +698 -0
  92. package/dist/harness-runtime/lib/managed-flow-env.mjs +15 -0
  93. package/dist/harness-runtime/lib/model-observations.mjs +113 -0
  94. package/dist/harness-runtime/lib/native-children.d.mts +34 -0
  95. package/dist/harness-runtime/lib/native-children.mjs +265 -0
  96. package/dist/harness-runtime/lib/native-hook-command.d.mts +7 -0
  97. package/dist/harness-runtime/lib/native-hook-command.mjs +251 -0
  98. package/dist/harness-runtime/lib/native-request-proof.d.mts +2 -0
  99. package/dist/harness-runtime/lib/native-request-proof.mjs +65 -0
  100. package/dist/harness-runtime/lib/native-streams.mjs +45 -0
  101. package/dist/harness-runtime/lib/observation-clock.d.mts +18 -0
  102. package/dist/harness-runtime/lib/observation-clock.mjs +95 -0
  103. package/dist/harness-runtime/lib/opencode-plugin.mjs +85 -0
  104. package/dist/harness-runtime/lib/operation-context.mjs +5 -0
  105. package/dist/harness-runtime/lib/operation-errors.d.mts +16 -0
  106. package/dist/harness-runtime/lib/operation-errors.mjs +127 -0
  107. package/dist/harness-runtime/lib/operation-progress.d.mts +7 -0
  108. package/dist/harness-runtime/lib/operation-progress.mjs +114 -0
  109. package/dist/harness-runtime/lib/process-json.d.mts +5 -0
  110. package/dist/harness-runtime/lib/process-json.mjs +201 -0
  111. package/dist/harness-runtime/lib/process-snapshot.mjs +10 -0
  112. package/dist/harness-runtime/lib/provider-overload-policy.d.mts +23 -0
  113. package/dist/harness-runtime/lib/provider-overload-policy.mjs +242 -0
  114. package/dist/harness-runtime/lib/runner-events.mjs +202 -0
  115. package/dist/harness-runtime/lib/runner-lock.mjs +42 -0
  116. package/dist/harness-runtime/lib/session-settlement.mjs +30 -0
  117. package/dist/harness-runtime/lib/setup-progress.d.mts +9 -0
  118. package/dist/harness-runtime/lib/setup-progress.mjs +53 -0
  119. package/dist/harness-runtime/lib/tool-observations.d.mts +21 -0
  120. package/dist/harness-runtime/lib/tool-observations.mjs +228 -0
  121. package/dist/harness-runtime/lib/zcode-usage.mjs +55 -0
  122. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-1y4a697q.js +81 -0
  123. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-2ny4vxct.js +92 -0
  124. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-6mptkzbc.js +0 -0
  125. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-7x67cf1q.js +52 -0
  126. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-9rqn6x4v.js +16 -0
  127. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-9vdz0zwn.js +1661 -0
  128. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ecs5ftka.js +1466 -0
  129. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-frbwqjmf.js +145 -0
  130. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-gne7h7mq.js +50 -0
  131. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-gx9wnkzr.js +105 -0
  132. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-m2eywc8w.js +0 -0
  133. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-nwcpakzx.js +12 -0
  134. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-q4g3afnw.js +623 -0
  135. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-qav6mfdz.js +0 -0
  136. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-sxt88q69.js +12 -0
  137. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-t1xa31vm.js +39 -0
  138. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ve4aws36.js +103 -0
  139. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vmytr4q8.js +4 -0
  140. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vt9jbch8.js +36 -0
  141. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vyas3vgt.js +0 -0
  142. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-wjyeq25y.js +30 -0
  143. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-xgnj2w4v.js +20 -0
  144. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-y2etg5bs.js +9 -0
  145. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ydhz1zrh.js +238 -0
  146. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-z6qdwcsf.js +62 -0
  147. package/dist/harness-runtime/vendor/opencode-client/contract.d.ts +1 -0
  148. package/dist/harness-runtime/vendor/opencode-client/contract.js +12 -0
  149. package/dist/harness-runtime/vendor/opencode-client/effect/api/api.d.ts +2806 -0
  150. package/dist/harness-runtime/vendor/opencode-client/effect/api/api.js +0 -0
  151. package/dist/harness-runtime/vendor/opencode-client/effect/api.d.ts +4 -0
  152. package/dist/harness-runtime/vendor/opencode-client/effect/api.js +0 -0
  153. package/dist/harness-runtime/vendor/opencode-client/effect/client.d.ts +2530 -0
  154. package/dist/harness-runtime/vendor/opencode-client/effect/client.js +15 -0
  155. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client-error.d.ts +7 -0
  156. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client-error.js +6 -0
  157. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client.d.ts +2529 -0
  158. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client.js +8 -0
  159. package/dist/harness-runtime/vendor/opencode-client/effect/generated/index.d.ts +2 -0
  160. package/dist/harness-runtime/vendor/opencode-client/effect/generated/index.js +12 -0
  161. package/dist/harness-runtime/vendor/opencode-client/effect/index.d.ts +35 -0
  162. package/dist/harness-runtime/vendor/opencode-client/effect/index.js +75 -0
  163. package/dist/harness-runtime/vendor/opencode-client/effect/rpc.d.ts +20 -0
  164. package/dist/harness-runtime/vendor/opencode-client/effect/rpc.js +11 -0
  165. package/dist/harness-runtime/vendor/opencode-client/effect/service.d.ts +90 -0
  166. package/dist/harness-runtime/vendor/opencode-client/effect/service.js +187 -0
  167. package/dist/harness-runtime/vendor/opencode-client/package.json +84 -0
  168. package/dist/harness-runtime/vendor/opencode-client/promise/api.d.ts +21 -0
  169. package/dist/harness-runtime/vendor/opencode-client/promise/api.js +0 -0
  170. package/dist/harness-runtime/vendor/opencode-client/promise/client.d.ts +252 -0
  171. package/dist/harness-runtime/vendor/opencode-client/promise/client.js +14 -0
  172. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client-error.d.ts +8 -0
  173. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client-error.js +6 -0
  174. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client.d.ts +259 -0
  175. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client.js +7 -0
  176. package/dist/harness-runtime/vendor/opencode-client/promise/generated/index.d.ts +3 -0
  177. package/dist/harness-runtime/vendor/opencode-client/promise/generated/index.js +79 -0
  178. package/dist/harness-runtime/vendor/opencode-client/promise/generated/types.d.ts +8932 -0
  179. package/dist/harness-runtime/vendor/opencode-client/promise/generated/types.js +70 -0
  180. package/dist/harness-runtime/vendor/opencode-client/promise/index.d.ts +6 -0
  181. package/dist/harness-runtime/vendor/opencode-client/promise/index.js +83 -0
  182. package/dist/harness-runtime/vendor/opencode-client/promise/rpc.d.ts +32 -0
  183. package/dist/harness-runtime/vendor/opencode-client/promise/rpc.js +7 -0
  184. package/dist/harness-runtime/vendor/opencode-client/promise/service.d.ts +24 -0
  185. package/dist/harness-runtime/vendor/opencode-client/promise/service.js +187 -0
  186. package/dist/harness-runtime/vendor/opencode-client/pty-handoff.d.ts +12 -0
  187. package/dist/harness-runtime/vendor/opencode-client/pty-handoff.js +14 -0
  188. package/dist/harness-runtime/vendor/opencode-client/rpc-runtime.d.ts +20 -0
  189. package/dist/harness-runtime/vendor/opencode-client/rpc-runtime.js +14 -0
  190. package/dist/harness-runtime/vendor/opencode-client/service-contender.d.ts +37 -0
  191. package/dist/harness-runtime/vendor/opencode-client/service-contender.js +10 -0
  192. package/dist/harness-runtime/vendor/opencode-client/service-probe.d.ts +70 -0
  193. package/dist/harness-runtime/vendor/opencode-client/service-probe.js +16 -0
  194. package/dist/harness-runtime/vendor/opencode-client/service-timing.d.ts +12 -0
  195. package/dist/harness-runtime/vendor/opencode-client/service-timing.js +10 -0
  196. package/dist/harness-runtime/vendor/opencode-client/service-version.d.ts +2 -0
  197. package/dist/harness-runtime/vendor/opencode-client/service-version.js +6 -0
  198. package/dist/harness-runtime/vendor/opencode-client/service.d.ts +52 -0
  199. package/dist/harness-runtime/vendor/opencode-client/service.js +1 -0
  200. package/dist/harness-runtime/vendor/opencode-client/shared-events.d.ts +11 -0
  201. package/dist/harness-runtime/vendor/opencode-client/shared-events.js +8 -0
  202. package/dist/harness-runtime/vendor/opencode-client/solid/connection.d.ts +37 -0
  203. package/dist/harness-runtime/vendor/opencode-client/solid/connection.js +10 -0
  204. package/dist/harness-runtime/vendor/opencode-client/solid/data.d.ts +211 -0
  205. package/dist/harness-runtime/vendor/opencode-client/solid/data.js +18 -0
  206. package/dist/harness-runtime/vendor/opencode-client/solid/index.d.ts +3 -0
  207. package/dist/harness-runtime/vendor/opencode-client/solid/index.js +32 -0
  208. package/dist/harness-runtime/vendor/opencode-client/solid/pty.d.ts +22 -0
  209. package/dist/harness-runtime/vendor/opencode-client/solid/pty.js +8 -0
  210. package/dist/harness-runtime/vendor/opencode-plugin.mjs +3 -0
  211. package/dist/protocol/local-files.js +18 -9
  212. package/dist/runtime/context.js +8 -4
  213. package/dist/schemas/agent-profile.schema.json +1 -1
  214. package/dist/schemas/code-review-decision.schema.json +9 -0
  215. package/dist/schemas/code-review-result.schema.json +1 -1
  216. package/dist/schemas/code-verification.schema.json +7 -5
  217. package/dist/schemas/code-work-batch.schema.json +2 -2
  218. package/dist/schemas/diagnostic-stage-result.schema.json +354 -0
  219. package/dist/schemas/diagnostic-work-result.schema.json +296 -0
  220. package/dist/schemas/discovery-result.schema.json +184 -0
  221. package/dist/schemas/execution-bundle.schema.json +211 -0
  222. package/dist/schemas/execution-settings.schema.json +162 -0
  223. package/dist/schemas/flow-descriptor.schema.json +54 -0
  224. package/dist/schemas/flow-run.schema.json +29 -0
  225. package/dist/schemas/harness-catalog.schema.json +80 -0
  226. package/dist/schemas/mb-init-compose-result.schema.json +457 -0
  227. package/dist/schemas/mb-init-discover-result.schema.json +500 -0
  228. package/dist/schemas/mb-init-finish-result.schema.json +422 -0
  229. package/dist/schemas/mb-init-preflight-result.schema.json +367 -0
  230. package/dist/schemas/mb-init-review-result.schema.json +396 -0
  231. package/dist/schemas/mb-init-verify-result.schema.json +391 -0
  232. package/dist/schemas/mb-upgrade-stage-result.schema.json +863 -0
  233. package/dist/schemas/memory-bootstrap-receipt-v2.schema.json +67 -0
  234. package/dist/schemas/memory-bootstrap-receipt.schema.json +354 -0
  235. package/dist/schemas/memory-composition-work-result.schema.json +38 -0
  236. package/dist/schemas/memory-repair-work-result.schema.json +56 -0
  237. package/dist/schemas/memory-review-correction-plan.schema.json +30 -0
  238. package/dist/schemas/memory-review-work-result.schema.json +43 -0
  239. package/dist/schemas/model-catalog.schema.json +153 -0
  240. package/dist/schemas/plan-review-decision.schema.json +12 -3
  241. package/dist/schemas/plan-review-result.schema.json +2 -2
  242. package/dist/schemas/profile-settings.schema.json +122 -0
  243. package/dist/schemas/project-flow-pack-manifest.schema.json +1 -1
  244. package/dist/schemas/release-impact.schema.json +3 -3
  245. package/dist/schemas/release-manifest.schema.json +291 -0
  246. package/dist/schemas/run-control-receipt.schema.json +118 -0
  247. package/dist/schemas/run-control-request.schema.json +36 -0
  248. package/dist/schemas/run-engine-binding.schema.json +1 -1
  249. package/dist/schemas/stage-start-response.schema.json +4 -0
  250. package/dist/schemas/vnext-protocol-plan.schema.json +2 -2
  251. package/dist/services/accepted-intent.js +139 -0
  252. package/dist/services/branch-context.js +3 -3
  253. package/dist/services/canon.js +54 -15
  254. package/dist/services/check-environment.js +21 -0
  255. package/dist/services/check-runner-evidence.js +277 -0
  256. package/dist/services/check-runner-proof.js +305 -0
  257. package/dist/services/cleanup.js +133 -40
  258. package/dist/services/cli-operation-classifier.js +26 -63
  259. package/dist/services/cli-upgrade-allowlist.js +27 -0
  260. package/dist/services/code-checks.js +1401 -119
  261. package/dist/services/codex-hook-delivery.js +32 -0
  262. package/dist/services/command-context.js +80 -0
  263. package/dist/services/compatibility-preflight.js +16 -3
  264. package/dist/services/config.js +11 -8
  265. package/dist/services/continuation-outcome.js +20 -0
  266. package/dist/services/controller-child-capacity.js +71 -0
  267. package/dist/services/controller-child-observer.js +121 -0
  268. package/dist/services/controller-execution.js +94 -0
  269. package/dist/services/controller-fanout.js +226 -0
  270. package/dist/services/controller-memory-task.js +45 -0
  271. package/dist/services/controller-memory-worker.js +49 -0
  272. package/dist/services/dashboard.js +143 -58
  273. package/dist/services/descriptor-coordinator-session.js +35 -0
  274. package/dist/services/descriptor-root-work.js +53 -0
  275. package/dist/services/descriptor-run-settlement.js +107 -0
  276. package/dist/services/descriptor-run-start.js +475 -0
  277. package/dist/services/descriptor-stage-coordinator.js +250 -0
  278. package/dist/services/descriptor-stage-settlement.js +223 -0
  279. package/dist/services/descriptor-stage-start.js +175 -0
  280. package/dist/services/diagnostic-evidence.js +73 -0
  281. package/dist/services/diagnostic-report-publication.js +72 -0
  282. package/dist/services/diagnostic-report.js +67 -0
  283. package/dist/services/diagnostic-run-bundle.js +74 -0
  284. package/dist/services/diagnostic-snapshot.js +159 -0
  285. package/dist/services/diagnostic-stage-handlers.js +108 -0
  286. package/dist/services/diagnostic-stage-results.js +132 -0
  287. package/dist/services/diagnostic-start.js +84 -0
  288. package/dist/services/diagnostic-work-batch.js +34 -0
  289. package/dist/services/diagnostic-work-collection.js +97 -0
  290. package/dist/services/diagnostic-work-registration.js +101 -0
  291. package/dist/services/diagnostic-work-results.js +93 -0
  292. package/dist/services/discovery/agy-discovery.js +2 -0
  293. package/dist/services/discovery/codex-discovery.js +2 -0
  294. package/dist/services/discovery/droid-discovery.js +2 -0
  295. package/dist/services/discovery/grok-discovery.js +2 -0
  296. package/dist/services/discovery/opencode-discovery.js +2 -0
  297. package/dist/services/discovery/static.js +31 -0
  298. package/dist/services/discovery/zcode-discovery.js +2 -0
  299. package/dist/services/engines.js +354 -163
  300. package/dist/services/eval-snapshots.js +1316 -150
  301. package/dist/services/execution-bundles.js +275 -0
  302. package/dist/services/execution-policy.js +185 -0
  303. package/dist/services/executor-onboarding.js +56 -0
  304. package/dist/services/external-work-launch.js +310 -0
  305. package/dist/services/flow-catalog.js +30 -0
  306. package/dist/services/flow-descriptors.js +82 -0
  307. package/dist/services/frozen-engine.js +387 -0
  308. package/dist/services/generic-execution.js +164 -0
  309. package/dist/services/harness-adapter.js +355 -36
  310. package/dist/services/harness-config.js +2 -0
  311. package/dist/services/harness-discovery.js +29 -0
  312. package/dist/services/harness-doctor.js +75 -0
  313. package/dist/services/harness-probe-effects.js +51 -0
  314. package/dist/services/harness-version-probe.js +100 -0
  315. package/dist/services/hook-memory-routing.js +188 -0
  316. package/dist/services/hook-recovery-guard.js +14 -0
  317. package/dist/services/hook-session-observation.js +24 -0
  318. package/dist/services/hooks.js +791 -326
  319. package/dist/services/hybrid-contracts.js +474 -0
  320. package/dist/services/hybrid-digest.js +14 -0
  321. package/dist/services/ids.js +29 -1
  322. package/dist/services/installation-lock.js +95 -0
  323. package/dist/services/installed-flow-source.js +226 -0
  324. package/dist/services/lanes.js +78 -65
  325. package/dist/services/lifecycle-command.js +1 -288
  326. package/dist/services/lifecycle-contract.js +1 -0
  327. package/dist/services/lifecycle-invocations.js +2148 -0
  328. package/dist/services/managed-daemon-binding.js +38 -0
  329. package/dist/services/managed-lease-monitor.js +133 -0
  330. package/dist/services/managed-processes.js +449 -69
  331. package/dist/services/memory-accepted-composition.js +78 -0
  332. package/dist/services/memory-baseline-preservation.js +65 -0
  333. package/dist/services/memory-completed-correction-wave.js +328 -0
  334. package/dist/services/memory-compose-handler.js +400 -0
  335. package/dist/services/memory-composition-acceptance.js +375 -0
  336. package/dist/services/memory-composition-graph.js +165 -0
  337. package/dist/services/memory-composition-registration.js +161 -0
  338. package/dist/services/memory-composition-work-custody.js +156 -0
  339. package/dist/services/memory-composition-work-results.js +108 -0
  340. package/dist/services/memory-corrected-review-acceptance.js +129 -0
  341. package/dist/services/memory-corrected-review-batch.js +37 -0
  342. package/dist/services/memory-corrected-review-findings.js +108 -0
  343. package/dist/services/memory-corrected-review-inputs.js +215 -0
  344. package/dist/services/memory-corrected-review-projection.js +78 -0
  345. package/dist/services/memory-corrected-review-receipt.js +178 -0
  346. package/dist/services/memory-corrected-review-registration.js +192 -0
  347. package/dist/services/memory-correction-check-receipt.js +235 -0
  348. package/dist/services/memory-correction-input-owner.js +6 -0
  349. package/dist/services/memory-custody-snapshot.js +36 -0
  350. package/dist/services/memory-discover-handler.js +104 -0
  351. package/dist/services/memory-finish-evidence.js +457 -0
  352. package/dist/services/memory-finish-handler.js +229 -0
  353. package/dist/services/memory-finish-integration.js +450 -0
  354. package/dist/services/memory-finish-readiness.js +169 -0
  355. package/dist/services/memory-git-integration.js +220 -0
  356. package/dist/services/memory-historical-corrected-review.js +212 -0
  357. package/dist/services/memory-historical-original-review.js +143 -0
  358. package/dist/services/memory-historical-repair-registration.js +105 -0
  359. package/dist/services/memory-historical-second-review.js +147 -0
  360. package/dist/services/memory-init-bootstrap-readiness.js +210 -0
  361. package/dist/services/memory-init-contexts.js +131 -0
  362. package/dist/services/memory-init-controller-start.js +103 -0
  363. package/dist/services/memory-init-engine-release.js +223 -0
  364. package/dist/services/memory-init-git-policy.js +165 -0
  365. package/dist/services/memory-init-lint-capability.js +203 -0
  366. package/dist/services/memory-init-native-capacity.js +309 -0
  367. package/dist/services/memory-init-preflight.js +334 -0
  368. package/dist/services/memory-init-project-bootstrap.js +599 -0
  369. package/dist/services/memory-init-request-candidate.js +213 -0
  370. package/dist/services/memory-init-request-input.js +82 -0
  371. package/dist/services/memory-init-resource-storage.js +125 -0
  372. package/dist/services/memory-init-run-allocation.js +81 -0
  373. package/dist/services/memory-init-run-bundle.js +135 -0
  374. package/dist/services/memory-init-start.js +181 -0
  375. package/dist/services/memory-init-startup-custody.js +80 -0
  376. package/dist/services/memory-init-startup-input.js +240 -0
  377. package/dist/services/memory-init-storage.js +91 -0
  378. package/dist/services/memory-init-stores.js +359 -0
  379. package/dist/services/memory-init-worktrunk-capability.js +174 -0
  380. package/dist/services/memory-layer-publication.js +611 -0
  381. package/dist/services/memory-layer.js +221 -0
  382. package/dist/services/memory-lint-config.js +194 -0
  383. package/dist/services/memory-native-review-copy.js +103 -0
  384. package/dist/services/memory-normal-flow-entry.js +87 -0
  385. package/dist/services/memory-ordinary-defaults.js +129 -0
  386. package/dist/services/memory-preflight-bootstrap-custody.js +115 -0
  387. package/dist/services/memory-preflight-handler.js +274 -0
  388. package/dist/services/memory-repair-current-view.js +299 -0
  389. package/dist/services/memory-repair-document-delta.js +488 -0
  390. package/dist/services/memory-repair-history.js +496 -0
  391. package/dist/services/memory-repair-physical-binding.js +194 -0
  392. package/dist/services/memory-repair-publication-files.js +152 -0
  393. package/dist/services/memory-repair-publication-intent.js +27 -0
  394. package/dist/services/memory-repair-publication-plan.js +162 -0
  395. package/dist/services/memory-repair-publication-source.js +225 -0
  396. package/dist/services/memory-repair-publication.js +795 -0
  397. package/dist/services/memory-repair-registration.js +240 -0
  398. package/dist/services/memory-repair-work-baseline.js +415 -0
  399. package/dist/services/memory-repair-work-completion.js +117 -0
  400. package/dist/services/memory-repair-work-custody.js +73 -0
  401. package/dist/services/memory-repair-work-results.js +108 -0
  402. package/dist/services/memory-repair-workspace.js +261 -0
  403. package/dist/services/memory-repair-writer-copy.js +736 -0
  404. package/dist/services/memory-result-binding.js +239 -0
  405. package/dist/services/memory-retained-review-authority.js +138 -0
  406. package/dist/services/memory-retained-review-results.js +70 -0
  407. package/dist/services/memory-retained-second-baseline.js +102 -0
  408. package/dist/services/memory-retained-second-repairs.js +162 -0
  409. package/dist/services/memory-review-acceptance.js +214 -0
  410. package/dist/services/memory-review-correction-plan.js +206 -0
  411. package/dist/services/memory-review-handler.js +585 -0
  412. package/dist/services/memory-review-inputs.js +246 -0
  413. package/dist/services/memory-review-limits.js +10 -0
  414. package/dist/services/memory-review-receipt.js +180 -0
  415. package/dist/services/memory-review-registration.js +117 -0
  416. package/dist/services/memory-review-work-custody.js +126 -0
  417. package/dist/services/memory-review-work-input.js +91 -0
  418. package/dist/services/memory-review-work-results.js +95 -0
  419. package/dist/services/memory-second-corrected-review-inputs.js +167 -0
  420. package/dist/services/memory-second-correction-plan.js +77 -0
  421. package/dist/services/memory-second-repair-baseline.js +91 -0
  422. package/dist/services/memory-second-repair-launch.js +614 -0
  423. package/dist/services/memory-second-repair-registration.js +88 -0
  424. package/dist/services/memory-second-repair-source.js +187 -0
  425. package/dist/services/memory-second-review-acceptance.js +115 -0
  426. package/dist/services/memory-source-observations.js +117 -0
  427. package/dist/services/memory-stage-dispatch.js +65 -0
  428. package/dist/services/memory-stage-results.js +290 -0
  429. package/dist/services/memory-tool-probe.js +25 -0
  430. package/dist/services/memory-upgrade-analysis-handler.js +243 -0
  431. package/dist/services/memory-upgrade-bootstrap-readiness.js +251 -0
  432. package/dist/services/memory-upgrade-evidence.js +100 -0
  433. package/dist/services/memory-upgrade-inventory.js +442 -0
  434. package/dist/services/memory-upgrade-publication-custody.js +73 -0
  435. package/dist/services/memory-upgrade-publication.js +413 -0
  436. package/dist/services/memory-upgrade-selection.js +430 -0
  437. package/dist/services/memory-upgrade-start.js +60 -0
  438. package/dist/services/memory-upgrade-storage-readiness.js +340 -0
  439. package/dist/services/memory-verification-acceptance.js +156 -0
  440. package/dist/services/memory-verification-checks.js +317 -0
  441. package/dist/services/memory-verification-receipt.js +160 -0
  442. package/dist/services/memory-verify-handler.js +137 -0
  443. package/dist/services/memory-work-result-json.js +12 -0
  444. package/dist/services/memory-work-result-preparation.js +64 -0
  445. package/dist/services/merge-queue.js +228 -149
  446. package/dist/services/merge-server.js +163 -35
  447. package/dist/services/migrations.js +164 -114
  448. package/dist/services/model-catalog.js +109 -0
  449. package/dist/services/model-discovery.js +46 -0
  450. package/dist/services/native-daemon-history.js +50 -0
  451. package/dist/services/native-session-control.js +39 -0
  452. package/dist/services/operator-profiles.js +236 -0
  453. package/dist/services/physical-startup.js +45 -0
  454. package/dist/services/plan-runtime.js +26 -11
  455. package/dist/services/plans.js +28 -25
  456. package/dist/services/project-registry.js +97 -0
  457. package/dist/services/project-summary.js +1 -1
  458. package/dist/services/projects.js +17 -87
  459. package/dist/services/prompt-delivery.js +71 -0
  460. package/dist/services/prompts.js +28 -17
  461. package/dist/services/protocols.js +163 -87
  462. package/dist/services/provider-capacity.js +463 -0
  463. package/dist/services/recovery-observation-budget.js +121 -0
  464. package/dist/services/recovery-snapshot-database.js +588 -0
  465. package/dist/services/release-archive-producer.js +52 -0
  466. package/dist/services/release-archive.js +143 -0
  467. package/dist/services/release-cache.js +150 -0
  468. package/dist/services/release-compatibility.js +18 -0
  469. package/dist/services/release-download.js +67 -0
  470. package/dist/services/release-envelope.js +104 -0
  471. package/dist/services/release-manifest.js +45 -0
  472. package/dist/services/release-payload.js +114 -0
  473. package/dist/services/release-producer.js +63 -0
  474. package/dist/services/release-provenance.js +160 -0
  475. package/dist/services/release-registry.js +66 -0
  476. package/dist/services/release-source.js +194 -0
  477. package/dist/services/repair-intents.js +31 -0
  478. package/dist/services/repair-receipt.js +13 -0
  479. package/dist/services/review-copy.js +165 -0
  480. package/dist/services/review-deferral.js +23 -0
  481. package/dist/services/run-control-receipt.js +56 -0
  482. package/dist/services/run-control-worker.js +428 -0
  483. package/dist/services/run-control.js +1092 -0
  484. package/dist/services/run-controller-adapter.js +400 -0
  485. package/dist/services/run-controller-capture.js +186 -0
  486. package/dist/services/run-controller-process.js +205 -0
  487. package/dist/services/run-controller-recovery.js +295 -0
  488. package/dist/services/run-controller-state.js +97 -0
  489. package/dist/services/run-controller.js +1395 -0
  490. package/dist/services/run-engine-bindings.js +1 -1
  491. package/dist/services/run-fork.js +147 -0
  492. package/dist/services/run-health.js +149 -0
  493. package/dist/services/run-observations.js +152 -0
  494. package/dist/services/run-projection.js +22 -64
  495. package/dist/services/run-recovery-guard.js +107 -0
  496. package/dist/services/run-recovery-runtime.js +112 -0
  497. package/dist/services/run-recovery.js +456 -0
  498. package/dist/services/run-start-custody.js +189 -0
  499. package/dist/services/runs.js +1023 -246
  500. package/dist/services/runtime-budget.js +446 -0
  501. package/dist/services/runtime-command.js +43 -0
  502. package/dist/services/runtime-scope-capture.js +52 -0
  503. package/dist/services/runtime-scope-control.js +468 -0
  504. package/dist/services/runtime-scope-resume.js +605 -0
  505. package/dist/services/runtime-scope-stop.js +211 -0
  506. package/dist/services/runtime-scope-worker.js +314 -0
  507. package/dist/services/runtime-service.js +19 -14
  508. package/dist/services/schema-validation.js +10 -8
  509. package/dist/services/scope-writer-cleanup.js +27 -0
  510. package/dist/services/sessions.js +36 -91
  511. package/dist/services/setup.js +427 -0
  512. package/dist/services/stage-blocker.js +17 -7
  513. package/dist/services/stage-context.js +240 -18
  514. package/dist/services/stage-handlers.js +89 -0
  515. package/dist/services/stage-lifecycle.js +152 -116
  516. package/dist/services/stage-pause.js +202 -91
  517. package/dist/services/stage-report-renderer.js +234 -6
  518. package/dist/services/stage-work-graph.js +52 -0
  519. package/dist/services/tooling.js +41 -30
  520. package/dist/services/usage.js +49 -101
  521. package/dist/services/verification-matrix.js +393 -0
  522. package/dist/services/version-status.js +1 -1
  523. package/dist/services/vnext-code-review.js +235 -88
  524. package/dist/services/vnext-code.js +327 -226
  525. package/dist/services/vnext-contracts.js +10 -1
  526. package/dist/services/vnext-execution-profile.js +80 -5
  527. package/dist/services/vnext-fanout.js +355 -21
  528. package/dist/services/vnext-merge.js +332 -111
  529. package/dist/services/vnext-plan-review.js +287 -132
  530. package/dist/services/vnext-plan.js +228 -104
  531. package/dist/services/vnext-protocolize.js +533 -95
  532. package/dist/services/vnext-specify.js +123 -81
  533. package/dist/services/vnext-workspace-policy.js +7 -2
  534. package/dist/services/work-registry.js +1706 -200
  535. package/dist/services/workspace-bootstrap.js +53 -15
  536. package/dist/services/workspace-files.js +85 -0
  537. package/dist/services/worktrees.js +105 -48
  538. package/dist/shared/entity-references.js +1 -0
  539. package/dist/shared/errors.js +27 -0
  540. package/dist/storage/agent-output.js +26 -0
  541. package/dist/storage/data-preservation.js +65 -0
  542. package/dist/storage/database.js +930 -40
  543. package/dist/storage/foreign-key-transaction.js +39 -0
  544. package/dist/storage/immutable-input.js +45 -0
  545. package/dist/storage/import-guard.js +159 -0
  546. package/dist/storage/memory-upgrade-schema-bootstrap.js +38 -0
  547. package/dist/storage/native-cleanup.js +52 -0
  548. package/dist/storage/paired-writer-migration.js +424 -0
  549. package/dist/storage/paths.js +17 -4
  550. package/dist/storage/projection-lock.js +73 -0
  551. package/dist/storage/work-references.js +23 -0
  552. package/dist/storage/writer-contract.js +96 -0
  553. package/dist/storage/writer-migration.js +346 -0
  554. package/dist/storage/writer-restore.js +217 -0
  555. package/dist/verification-components.json +299 -0
  556. package/package.json +51 -13
  557. package/tools/create-canon-release.mjs +33 -0
  558. package/tools/probe-codex-history.mjs +37 -0
  559. package/tools/produce-hybrid-release.mjs +41 -0
  560. package/tools/repair-paused-run-status.mjs +84 -0
@@ -0,0 +1,192 @@
1
+ import { Buffer } from "node:buffer";
2
+ import { AppError } from "../shared/errors.js";
3
+ import { appendAudit } from "./audit.js";
4
+ import { hybridDigest } from "./hybrid-contracts.js";
5
+ import { isMemoryCorrectionInputOwner } from "./memory-correction-input-owner.js";
6
+ import { PreparedMemoryCorrectionCheckReceipt } from "./memory-correction-check-receipt.js";
7
+ import { memoryCorrectedReviewBatch } from "./memory-corrected-review-batch.js";
8
+ import { addWorkBatch, prepareWorkBatch, readWorkBatchCustody } from "./work-registry.js";
9
+ import { memoryReviewRegistrationByteLimit } from "./memory-review-limits.js";
10
+ const token = Symbol("registered-corrected-memory-review");
11
+ const event = "memory.corrected_review_registration";
12
+ function refuse(reason) {
13
+ throw new AppError("memory_corrected_review_registration_invalid", "Corrected reviewers lack independent current-view, checks and allocation custody", 2, { reason, effect: "no_effect" });
14
+ }
15
+ function batchScope(view) {
16
+ return { project_id: view.scope.project_id, run_id: view.scope.run_id, stage: "review", attempt: view.scope.attempt,
17
+ cycle: "", parent_work_id: view.scope.parent_work_id, request_key: `memory-review-wave-${view.wave}` };
18
+ }
19
+ function selected(context, inputs, checks) {
20
+ inputs.assertCustody(context);
21
+ checks.assertOwner(inputs);
22
+ checks.assertRegisteredCustody(context);
23
+ const view = inputs.value(), scope = view.scope;
24
+ const receipt = readRetainedRegistration(context, scope, inputs.sha256, checks.sha256, view.wave);
25
+ if (receipt && hybridDigest(receipt.view) !== hybridDigest(view))
26
+ refuse("changed_registration");
27
+ return receipt;
28
+ }
29
+ /** SQL-only retained allocation proof. Expected identities must be pinned by
30
+ * an independent accepted receipt. This reader never grants current-view or
31
+ * new allocation rights and does not inspect an obsolete private copy. */
32
+ export function readRetainedCorrectedMemoryReviewRegistration(context, scope, inputSha256, checkReceiptSha256) {
33
+ return readRetainedRegistration(context, scope, inputSha256, checkReceiptSha256, 1);
34
+ }
35
+ /** Second historical metadata only, pinned by independent accepted hashes.
36
+ * This is not a current input owner or allocation admission. */
37
+ export function readRetainedSecondCorrectedMemoryReviewRegistration(context, scope, inputSha256, checkReceiptSha256) {
38
+ return readRetainedRegistration(context, scope, inputSha256, checkReceiptSha256, 2);
39
+ }
40
+ function readRetainedRegistration(context, scope, inputSha256, checkReceiptSha256, wave) {
41
+ const rows = context.db.all("SELECT payload_json FROM audit_events WHERE project_id=? AND event_type=? AND json_extract(payload_json,'$.run_id')=? AND json_extract(payload_json,'$.scope.attempt')=? AND json_extract(payload_json,'$.scope.parent_work_id')=? AND json_extract(payload_json,'$.wave')=? LIMIT 2", [scope.project_id, event, scope.run_id, scope.attempt, scope.parent_work_id, wave]);
42
+ if (!rows.length)
43
+ return null;
44
+ if (rows.length !== 1 || Buffer.byteLength(rows[0].payload_json) > memoryReviewRegistrationByteLimit)
45
+ refuse("ambiguous_or_unbounded_registration");
46
+ let receipt;
47
+ try {
48
+ receipt = JSON.parse(rows[0].payload_json);
49
+ }
50
+ catch {
51
+ return refuse("invalid_registration");
52
+ }
53
+ const view = receipt?.view;
54
+ if (!view || hybridDigest(view.scope) !== hybridDigest(scope) || view.wave !== wave
55
+ || hybridDigest(view) !== inputSha256 || !/^[a-f0-9]{64}$/.test(inputSha256)
56
+ || !/^[a-f0-9]{64}$/.test(checkReceiptSha256))
57
+ refuse("changed_retained_view");
58
+ const batch = memoryCorrectedReviewBatch(view), ids = receipt?.work_ids;
59
+ if (!ids || typeof ids !== "object" || Array.isArray(ids)
60
+ || Object.keys(ids).length !== batch.works.length || Object.values(ids).some(id => typeof id !== "string" || !id)
61
+ || new Set(Object.values(ids)).size !== batch.works.length)
62
+ refuse("invalid_work_ids");
63
+ const expected = { schema_id: "dd-flow/memory-corrected-review-registration@1", run_id: scope.run_id, scope, wave: view.wave,
64
+ input_sha256: inputSha256, view, check_receipt_sha256: checkReceiptSha256, batch_sha256: hybridDigest(batch.works), work_ids: ids };
65
+ if (hybridDigest(receipt) !== hybridDigest(expected))
66
+ refuse("changed_registration");
67
+ for (const item of batch.works) {
68
+ const id = ids[item.key];
69
+ if (!id)
70
+ refuse("missing_review_work");
71
+ const custody = readWorkBatchCustody(context, id);
72
+ if (custody.item_key !== item.key || custody.batch_sha256 !== expected.batch_sha256
73
+ || hybridDigest(custody.scope) !== hybridDigest(batchScope(view))
74
+ || hybridDigest(custody.work_ids) !== hybridDigest(ids))
75
+ refuse("changed_work_custody");
76
+ const work = context.db.get("SELECT parent_work_id,task,launch_policy,result_schema,payload_json,depends_on_json FROM works WHERE project_id=? AND run_id=? AND work_id=?", [scope.project_id, scope.run_id, id]);
77
+ let payload, dependencies;
78
+ try {
79
+ payload = JSON.parse(work?.payload_json ?? "null");
80
+ dependencies = JSON.parse(work?.depends_on_json ?? "null");
81
+ }
82
+ catch {
83
+ return refuse("invalid_review_work");
84
+ }
85
+ if (!work || work.parent_work_id !== scope.parent_work_id || work.task !== item.task
86
+ || work.launch_policy !== item.launch_policy || work.result_schema !== item.result_schema
87
+ || hybridDigest(dependencies) !== hybridDigest([])
88
+ || hybridDigest(payload) !== hybridDigest({ ...item.payload, _dd_flow_batch_request: {
89
+ request_sha256: custody.request_sha256, batch_sha256: custody.batch_sha256, item_key: item.key
90
+ } }))
91
+ refuse("changed_review_work");
92
+ }
93
+ return structuredClone(receipt);
94
+ }
95
+ /** A selective wave is allocated only after independent current-view checks.
96
+ * The generic batch and this receipt commit together. Replay never allocates
97
+ * replacements after receipt loss and never grants provider or Session scope. */
98
+ export class PreparedRegisteredCorrectedMemoryReview {
99
+ static isPrepared(value) {
100
+ return typeof value === "object" && value !== null && #inputs in value;
101
+ }
102
+ sha256;
103
+ #inputs;
104
+ #checks;
105
+ #receipt;
106
+ constructor(key, inputs, checks, receipt) {
107
+ if (key !== token)
108
+ refuse("registration_token_required");
109
+ this.#inputs = inputs;
110
+ this.#checks = checks;
111
+ this.#receipt = structuredClone(receipt);
112
+ this.sha256 = hybridDigest(receipt);
113
+ Object.freeze(this);
114
+ }
115
+ static restore(context, inputs, checks) {
116
+ if (!isMemoryCorrectionInputOwner(inputs) || !PreparedMemoryCorrectionCheckReceipt.isPrepared(checks))
117
+ refuse("prepared_registration_owners_required");
118
+ if (context.db.isOwnedWriteTransaction?.())
119
+ refuse("preparation_outside_writer_required");
120
+ checks.assertOwner(inputs);
121
+ checks.revalidate(context);
122
+ checks.assertRegisteredCustody(context);
123
+ const receipt = context.db.readSnapshot(() => selected(context, inputs, checks));
124
+ if (!receipt)
125
+ refuse("registered_corrected_review_required");
126
+ const prepared = new PreparedRegisteredCorrectedMemoryReview(token, inputs, checks, receipt);
127
+ prepared.assertCustody(context);
128
+ return prepared;
129
+ }
130
+ receipt() { return structuredClone(this.#receipt); }
131
+ inputs() { return this.#inputs; }
132
+ batch() { return memoryCorrectedReviewBatch(this.#inputs.value()); }
133
+ assertCustody(context) {
134
+ if (hybridDigest(selected(context, this.#inputs, this.#checks)) !== this.sha256)
135
+ refuse("registered_review_custody_changed");
136
+ }
137
+ revalidate(context) {
138
+ this.#checks.revalidate(context);
139
+ this.assertCustody(context);
140
+ }
141
+ }
142
+ export function registerCorrectedMemoryReview(context, inputs, checks) {
143
+ if (!isMemoryCorrectionInputOwner(inputs) || !PreparedMemoryCorrectionCheckReceipt.isPrepared(checks))
144
+ refuse("prepared_registration_owners_required");
145
+ if (context.db.isOwnedWriteTransaction?.())
146
+ refuse("preparation_outside_writer_required");
147
+ checks.assertOwner(inputs);
148
+ checks.assertRegisteredCustody(context);
149
+ const view = inputs.value(), batch = memoryCorrectedReviewBatch(view), scope = batchScope(view);
150
+ const batchInput = { parentWorkId: scope.parent_work_id, requestKey: scope.request_key, stage: "review", value: batch };
151
+ const prepared = prepareWorkBatch(context, batchInput);
152
+ inputs.revalidate(context);
153
+ checks.revalidate(context);
154
+ const result = context.db.writeTransaction(() => {
155
+ if (!context.db.isOwnedWriteTransaction?.())
156
+ refuse("owned_registration_writer_required");
157
+ const prior = selected(context, inputs, checks);
158
+ if (!prior) {
159
+ // If allocation committed without this receipt, do not manufacture a
160
+ // new wave or adopt an orphaned Work graph from its status alone.
161
+ if (context.db.get("SELECT 1 FROM works w JOIN stage_work_memberships m ON m.work_id=w.work_id AND m.project_id=w.project_id AND m.run_id=w.run_id WHERE w.project_id=? AND w.run_id=? AND w.parent_work_id=? AND m.stage='review' AND m.attempt=? AND json_extract(w.payload_json,'$.kind')='memory-review' AND json_extract(w.payload_json,'$.memory_review.wave')=? LIMIT 1", [scope.project_id, scope.run_id, scope.parent_work_id, scope.attempt, view.wave]))
162
+ refuse("review_registration_missing");
163
+ inputs.assertAllocationAllowed(context);
164
+ }
165
+ const allocated = addWorkBatch(context, { ...batchInput, prepared }), ids = allocated.work_ids;
166
+ if (prior) {
167
+ if (!allocated.replayed || hybridDigest(ids) !== hybridDigest(prior.work_ids))
168
+ refuse("changed_allocation");
169
+ }
170
+ else {
171
+ if (allocated.replayed)
172
+ refuse("review_registration_missing");
173
+ const receipt = { schema_id: "dd-flow/memory-corrected-review-registration@1", run_id: scope.run_id, scope: view.scope, wave: view.wave,
174
+ input_sha256: inputs.sha256, view, check_receipt_sha256: checks.sha256, batch_sha256: hybridDigest(batch.works), work_ids: ids };
175
+ if (Buffer.byteLength(JSON.stringify(receipt)) > memoryReviewRegistrationByteLimit)
176
+ refuse("unbounded_registration");
177
+ appendAudit(context, { projectId: scope.project_id, eventType: event, payload: receipt });
178
+ }
179
+ const retained = selected(context, inputs, checks);
180
+ if (!retained)
181
+ refuse("registration_readback_missing");
182
+ return { input_sha256: retained.input_sha256, wave: view.wave, work_ids: { ...retained.work_ids }, replayed: Boolean(prior) };
183
+ }, "memory.registerCorrectedReview");
184
+ try {
185
+ inputs.revalidate(context);
186
+ checks.revalidate(context);
187
+ }
188
+ catch (error) {
189
+ throw new AppError("memory_corrected_review_registration_pending", "Reviewer allocation committed but current-view revalidation needs recovery", 1, { effect: "committed", input_sha256: inputs.sha256, work_ids: result.work_ids, cause: error instanceof Error ? error.message : String(error) });
190
+ }
191
+ return result;
192
+ }
@@ -0,0 +1,235 @@
1
+ import { Buffer } from "node:buffer";
2
+ import { AppError } from "../shared/errors.js";
3
+ import { hybridDigest } from "./hybrid-contracts.js";
4
+ import { appendAudit } from "./audit.js";
5
+ import { PreparedRetainedCheckEvidence } from "./code-checks.js";
6
+ import { isMemoryCorrectionInputOwner } from "./memory-correction-input-owner.js";
7
+ import { PreparedMemoryVerificationChecks } from "./memory-verification-checks.js";
8
+ import { runtimeCommand } from "./runtime-command.js";
9
+ const token = Symbol("memory-correction-check-receipt");
10
+ const event = "memory.correction_checks";
11
+ function refuse(reason) {
12
+ throw new AppError("memory_correction_checks_invalid", "Correction checks lack independent current-view and policy custody", 2, { reason, effect: "no_effect" });
13
+ }
14
+ function stored(context, corrected) {
15
+ corrected.assertCustody(context);
16
+ const view = corrected.value();
17
+ const rows = context.db.all("SELECT payload_json FROM audit_events WHERE project_id=? AND event_type=? AND json_extract(payload_json,'$.run_id')=? AND json_extract(payload_json,'$.wave')=? LIMIT 2", [view.scope.project_id, event, view.scope.run_id, view.wave]);
18
+ if (!rows.length)
19
+ return null;
20
+ if (rows.length !== 1 || Buffer.byteLength(rows[0].payload_json) > 2 * 1024 * 1024)
21
+ refuse("ambiguous_or_unbounded_check_receipt");
22
+ let value;
23
+ try {
24
+ value = JSON.parse(rows[0].payload_json);
25
+ }
26
+ catch {
27
+ return refuse("invalid_check_receipt");
28
+ }
29
+ if (!value || typeof value !== "object" || Array.isArray(value))
30
+ refuse("invalid_check_receipt");
31
+ return value;
32
+ }
33
+ /** Independent finite-check acceptance, not reviewer or Stage acceptance.
34
+ * Registration and reconnect use exact current-view evidence. They never
35
+ * execute a command, allocate Work or declare semantic completeness. */
36
+ export class PreparedMemoryCorrectionCheckReceipt {
37
+ static isPrepared(value) {
38
+ return typeof value === "object" && value !== null && #corrected in value;
39
+ }
40
+ sha256;
41
+ #corrected;
42
+ #policy;
43
+ #evidence;
44
+ #receipt;
45
+ #registered;
46
+ constructor(key, corrected, policy, evidence, receipt, registered) {
47
+ if (key !== token)
48
+ refuse("check_receipt_token_required");
49
+ this.#corrected = corrected;
50
+ this.#policy = policy;
51
+ this.#evidence = evidence;
52
+ this.#receipt = structuredClone(receipt);
53
+ this.#registered = registered;
54
+ this.sha256 = hybridDigest(receipt);
55
+ Object.freeze(this);
56
+ }
57
+ static prepare(context, corrected, policy) {
58
+ if (!isMemoryCorrectionInputOwner(corrected) || !PreparedMemoryVerificationChecks.isPrepared(policy))
59
+ refuse("prepared_check_owners_required");
60
+ if (context.db.isOwnedWriteTransaction?.())
61
+ refuse("preparation_outside_writer_required");
62
+ policy.assertCorrectionOwner(corrected);
63
+ // evidence() revalidates the policy and its exact bound correction owner.
64
+ const view = corrected.value(), evidence = policy.evidence(context);
65
+ evidence.assertOwner({ projectId: view.scope.project_id, runId: view.scope.run_id, scope: "aggregate" });
66
+ const receipt = { schema_id: "dd-flow/memory-correction-checks@1", project_id: view.scope.project_id, run_id: view.scope.run_id,
67
+ wave: view.wave, review_input_sha256: view.scope.input_sha256, corrected_input_sha256: corrected.sha256,
68
+ completed_correction_sha256: view.completed_correction_sha256, profile_sha256: policy.profileHash(),
69
+ declarations_sha256: hybridDigest(policy.declarations()), checks: evidence.retainedReferences(context) };
70
+ if (!receipt.checks.length || receipt.checks.length > 4096 || Buffer.byteLength(JSON.stringify(receipt)) > 2 * 1024 * 1024)
71
+ refuse("unbounded_check_receipt");
72
+ const existing = context.db.readSnapshot(() => stored(context, corrected));
73
+ if (existing && hybridDigest(existing) !== hybridDigest(receipt))
74
+ refuse("registered_check_receipt_changed");
75
+ const prepared = new PreparedMemoryCorrectionCheckReceipt(token, corrected, policy, evidence, receipt, Boolean(existing));
76
+ prepared.assertCustody(context);
77
+ return prepared;
78
+ }
79
+ static restore(context, corrected) {
80
+ if (!isMemoryCorrectionInputOwner(corrected))
81
+ refuse("prepared_check_owners_required");
82
+ if (context.db.isOwnedWriteTransaction?.())
83
+ refuse("preparation_outside_writer_required");
84
+ const existing = context.db.readSnapshot(() => stored(context, corrected));
85
+ if (!existing) {
86
+ const view = corrected.value(), projectRoot = corrected.bundle().execution.snapshot().scope.projectRoot;
87
+ const args = ["--run", view.scope.run_id, "--project-root", projectRoot, "--wave", String(view.wave), "--json"];
88
+ throw new AppError("memory_correction_checks_invalid", "Correction checks have not been registered for the settled corrected view", 2, { reason: "registered_check_receipt_required", phase: "prepare", effect: "no_effect", recoverable: true,
89
+ correction_instruction: `Run ${runtimeCommand(context, ["memory", "corrections", "checks", ...args])}, then ${runtimeCommand(context, ["memory", "review", "selective-register", ...args])}. End this Turn so the controller can dispatch the independent reviewers. Use retry_command only after their selective review completes; do not retry Finish before checks and selective review.` });
90
+ }
91
+ const bundle = corrected.bundle(), scope = corrected.value().scope;
92
+ const policy = PreparedMemoryVerificationChecks.prepare(context, { projectId: scope.project_id, runId: scope.run_id,
93
+ execution: bundle.execution, flow: bundle.descriptor, corrected });
94
+ // Registered execution belongs to its original environment, not the
95
+ // controller/reviewer's current shell. Keep exact current document and
96
+ // policy custody, then restore the sealed execution instead of selecting
97
+ // fresh evidence using the observer's environment.
98
+ const view = corrected.value(), receipt = historicalReceipt(context, { projectId: scope.project_id, runId: scope.run_id,
99
+ wave: view.wave, receiptSha256: hybridDigest(existing), correctedInputSha256: corrected.sha256 });
100
+ const expected = { schema_id: "dd-flow/memory-correction-checks@1", project_id: scope.project_id, run_id: scope.run_id,
101
+ wave: view.wave, review_input_sha256: scope.input_sha256, corrected_input_sha256: corrected.sha256,
102
+ completed_correction_sha256: view.completed_correction_sha256, profile_sha256: policy.profileHash(),
103
+ declarations_sha256: hybridDigest(policy.declarations()), checks: receipt.checks };
104
+ if (hybridDigest(receipt) !== hybridDigest(expected))
105
+ refuse("registered_check_receipt_changed");
106
+ const evidence = PreparedRetainedCheckEvidence.prepare(context, { projectId: scope.project_id, runId: scope.run_id, references: receipt.checks });
107
+ const prepared = new PreparedMemoryCorrectionCheckReceipt(token, corrected, policy, evidence, receipt, true);
108
+ prepared.revalidate(context);
109
+ return prepared;
110
+ }
111
+ value() {
112
+ return structuredClone(this.#receipt);
113
+ }
114
+ assertOwner(corrected) {
115
+ if (!isMemoryCorrectionInputOwner(corrected) || corrected.sha256 !== this.#corrected.sha256)
116
+ refuse("foreign_corrected_check_receipt");
117
+ }
118
+ assertRegisteredCustody(context) {
119
+ if (!this.#registered)
120
+ refuse("registered_check_receipt_required");
121
+ this.assertCustody(context);
122
+ }
123
+ assertCustody(context) {
124
+ this.#corrected.assertCustody(context);
125
+ this.#policy.assertCustody(context);
126
+ this.#evidence.assertCustody(context);
127
+ const existing = stored(context, this.#corrected);
128
+ if ((this.#registered && !existing) || (existing && hybridDigest(existing) !== this.sha256))
129
+ refuse("registered_check_receipt_changed");
130
+ if ("retainedReferences" in this.#evidence && hybridDigest(this.#evidence.retainedReferences(context)) !== hybridDigest(this.#receipt.checks))
131
+ refuse("selected_check_evidence_changed");
132
+ }
133
+ revalidate(context) {
134
+ this.#policy.revalidate(context);
135
+ this.#evidence.revalidate(context);
136
+ this.assertCustody(context);
137
+ }
138
+ register(context) {
139
+ this.revalidate(context);
140
+ const replay = context.db.writeTransaction(() => {
141
+ if (!context.db.isOwnedWriteTransaction?.())
142
+ refuse("owned_check_writer_required");
143
+ this.assertCustody(context);
144
+ const existing = stored(context, this.#corrected);
145
+ if (existing)
146
+ return true;
147
+ appendAudit(context, { projectId: this.#receipt.project_id, eventType: event, payload: this.#receipt });
148
+ return false;
149
+ }, "memory.registerCorrectionChecks");
150
+ this.#registered = true;
151
+ this.assertCustody(context);
152
+ try {
153
+ this.revalidate(context);
154
+ }
155
+ catch (error) {
156
+ throw new AppError("memory_correction_checks_pending", "Check receipt committed but current-view revalidation needs recovery", 1, { effect: "committed", receipt_sha256: this.sha256, cause: error instanceof Error ? error.message : String(error) });
157
+ }
158
+ return { receipt: this.value(), receipt_sha256: this.sha256, replay };
159
+ }
160
+ }
161
+ function historicalReceipt(context, scope) {
162
+ const rows = context.db.all("SELECT payload_json FROM audit_events WHERE project_id=? AND event_type=? AND json_extract(payload_json,'$.run_id')=? AND json_extract(payload_json,'$.wave')=? LIMIT 2", [scope.projectId, event, scope.runId, scope.wave]);
163
+ if (rows.length !== 1 || Buffer.byteLength(rows[0].payload_json) > 2 * 1024 * 1024)
164
+ refuse("historical_check_receipt_missing");
165
+ let value;
166
+ try {
167
+ value = JSON.parse(rows[0].payload_json);
168
+ }
169
+ catch {
170
+ return refuse("invalid_check_receipt");
171
+ }
172
+ if (!value || typeof value !== "object" || Array.isArray(value)
173
+ || value.schema_id !== "dd-flow/memory-correction-checks@1" || value.project_id !== scope.projectId
174
+ || value.run_id !== scope.runId || value.wave !== scope.wave || value.corrected_input_sha256 !== scope.correctedInputSha256
175
+ || hybridDigest(value) !== scope.receiptSha256
176
+ || [value.review_input_sha256, value.corrected_input_sha256, value.completed_correction_sha256, value.declarations_sha256]
177
+ .some(hash => typeof hash !== "string" || !/^[a-f0-9]{64}$/.test(hash))
178
+ || (value.profile_sha256 !== null && (typeof value.profile_sha256 !== "string" || !/^[a-f0-9]{64}$/.test(value.profile_sha256)))
179
+ || Object.keys(value).some(key => !["schema_id", "project_id", "run_id", "wave", "review_input_sha256", "corrected_input_sha256",
180
+ "completed_correction_sha256", "profile_sha256", "declarations_sha256", "checks"].includes(key))
181
+ || !Array.isArray(value.checks) || !value.checks.length || value.checks.length > 4096
182
+ || value.checks.some(ref => !ref || typeof ref !== "object" || Array.isArray(ref)
183
+ || typeof ref.id !== "string" || !ref.id || typeof ref.path !== "string"
184
+ || Object.keys(ref).some(key => !["id", "path", "sha256", "sql_sha256"].includes(key))
185
+ || [ref.sha256, ref.sql_sha256].some(hash => typeof hash !== "string" || !/^[a-f0-9]{64}$/.test(hash))))
186
+ refuse("historical_check_receipt_changed");
187
+ for (const reference of value.checks) {
188
+ const row = context.db.get("SELECT profile_hash FROM check_receipts WHERE project_id=? AND run_id=? AND id=?", [scope.projectId, scope.runId, reference?.id]);
189
+ if (!row || row.profile_hash !== value.profile_sha256)
190
+ refuse("historical_check_policy_changed");
191
+ }
192
+ return value;
193
+ }
194
+ /** Retained finite-check proof for accepted-review replay. Expected hashes
195
+ * must come from the independent reviewer/Stage receipt, not a caller claim.
196
+ * This owner proves only the scoped historical check receipt and executions;
197
+ * it grants no current-view, reviewer allocation or Stage acceptance rights. */
198
+ export class PreparedRetainedMemoryCorrectionChecks {
199
+ #scope;
200
+ #checks;
201
+ constructor(key, scope, checks) {
202
+ if (key !== token)
203
+ refuse("check_receipt_token_required");
204
+ this.#scope = { ...scope };
205
+ this.#checks = checks;
206
+ Object.freeze(this);
207
+ }
208
+ static prepare(context, scope) {
209
+ return this.prepareWave(context, scope, 1);
210
+ }
211
+ static prepareSecond(context, scope) {
212
+ return this.prepareWave(context, scope, 2);
213
+ }
214
+ static prepareWave(context, scope, wave) {
215
+ if (wave !== 1 && wave !== 2)
216
+ refuse("historical_check_wave_required");
217
+ if (!scope || typeof scope.projectId !== "string" || !scope.projectId || typeof scope.runId !== "string" || !scope.runId
218
+ || [scope.receiptSha256, scope.correctedInputSha256].some(hash => typeof hash !== "string" || !/^[a-f0-9]{64}$/.test(hash)))
219
+ refuse("historical_check_scope_required");
220
+ if (context.db.isOwnedWriteTransaction?.())
221
+ refuse("preparation_outside_writer_required");
222
+ const selectedScope = { ...scope, wave };
223
+ const receipt = context.db.readSnapshot(() => historicalReceipt(context, selectedScope));
224
+ const checks = PreparedRetainedCheckEvidence.prepare(context, { projectId: scope.projectId, runId: scope.runId, references: receipt.checks });
225
+ const prepared = new PreparedRetainedMemoryCorrectionChecks(token, selectedScope, checks);
226
+ prepared.assertCustody(context);
227
+ return prepared;
228
+ }
229
+ assertCustody(context) {
230
+ historicalReceipt(context, this.#scope);
231
+ this.#checks.assertCustody(context);
232
+ }
233
+ value(context) { this.assertCustody(context); return structuredClone(historicalReceipt(context, this.#scope)); }
234
+ revalidate(context) { this.#checks.revalidate(context); this.assertCustody(context); }
235
+ }
@@ -0,0 +1,6 @@
1
+ import { PreparedCorrectedMemoryReviewInputs } from "./memory-corrected-review-inputs.js";
2
+ import { PreparedSecondCorrectedMemoryReviewInputs } from "./memory-second-corrected-review-inputs.js";
3
+ /** Only the two sealed wave owners, never a structural evidence interface. */
4
+ export function isMemoryCorrectionInputOwner(value) {
5
+ return PreparedCorrectedMemoryReviewInputs.isPrepared(value) || PreparedSecondCorrectedMemoryReviewInputs.isPrepared(value);
6
+ }
@@ -0,0 +1,36 @@
1
+ import { AppError } from "../shared/errors.js";
2
+ const snapshots = new WeakMap();
3
+ function synchronous(read) {
4
+ const value = read();
5
+ if (value && typeof value.then === "function") {
6
+ void Promise.resolve(value).catch(() => { });
7
+ throw new AppError("read_snapshot_async", "Memory custody traversal must be synchronous", 1);
8
+ }
9
+ return value;
10
+ }
11
+ export function withMemoryCustodySnapshot(context, read) {
12
+ if (snapshots.has(context))
13
+ return synchronous(read);
14
+ return context.db.readSnapshot(() => {
15
+ snapshots.set(context, new Set());
16
+ try {
17
+ return synchronous(read);
18
+ }
19
+ finally {
20
+ snapshots.delete(context);
21
+ }
22
+ });
23
+ }
24
+ /** Only SQL custody may share a completed proof within this synchronous
25
+ * snapshot. Physical revalidation stays outside this memo, and the next
26
+ * traversal always rereads SQL. Failed checks never become reusable proof.
27
+ * Prepared owners supply private keys, never their externally visible object. */
28
+ export function assertMemorySqlCustody(context, owner, validate) {
29
+ withMemoryCustodySnapshot(context, () => {
30
+ const checked = snapshots.get(context);
31
+ if (checked.has(owner))
32
+ return;
33
+ synchronous(validate);
34
+ checked.add(owner);
35
+ });
36
+ }
@@ -0,0 +1,104 @@
1
+ import { AppError } from "../shared/errors.js";
2
+ import { PreparedMemoryStageResult, memorySourceKey } from "./memory-stage-results.js";
3
+ import { PreparedMemoryResultBinding } from "./memory-result-binding.js";
4
+ import { PreparedMemoryBaselinePreservation } from "./memory-baseline-preservation.js";
5
+ import { captureMemoryPreflightSources } from "./memory-preflight-handler.js";
6
+ import { PreparedDescriptorStageStart } from "./descriptor-stage-start.js";
7
+ import { PreparedDescriptorStageCoordinator } from "./descriptor-stage-coordinator.js";
8
+ import { PreparedDescriptorStageSettlement } from "./descriptor-stage-settlement.js";
9
+ import { readAcceptedStageData } from "./stage-report-renderer.js";
10
+ import { assertPreparedRunBundleSqlAuthority, readFlowRunExecutionBundle } from "./runs.js";
11
+ import { requireProjectByRoot } from "./projects.js";
12
+ import { resolveProjectRoot } from "../storage/paths.js";
13
+ function refuse(reason) {
14
+ throw new AppError("memory_discover_handler_invalid", "Memory discovery lacks accepted scope or bounded evidence", 2, { reason, effect: "no_effect" });
15
+ }
16
+ function selected(context, input) {
17
+ if (!(input.bytes instanceof Uint8Array) || input.bytes.length > 1024 * 1024)
18
+ refuse("invalid_input_bytes");
19
+ const bundle = readFlowRunExecutionBundle(context, input);
20
+ if (!bundle || bundle.descriptor.descriptor.id !== "mb-init" || bundle.descriptor.successor("preflight", "accepted") !== "discover")
21
+ refuse("registered_memory_bundle_required");
22
+ const project = requireProjectByRoot(context, resolveProjectRoot(input.projectRoot)), scope = { projectId: project.id, runId: input.runId, stage: "discover" };
23
+ const run = assertPreparedRunBundleSqlAuthority(context, scope, bundle), index = JSON.parse(run.index_json);
24
+ return { bundle, scope, accepted: index.stage_runs.find((stage) => stage.stage === "discover")?.status === "done" };
25
+ }
26
+ /** Result-level discovery checks, not physical/RUN or semantic completeness
27
+ * authority. The handler separately supplies independently selected SQL scope
28
+ * and physical baseline observations. Unknown facts remain valid with their
29
+ * frozen-schema reason/next-action rather than being converted to confirmations.
30
+ */
31
+ export class PreparedMemoryDiscoveryAcceptance {
32
+ #sha256;
33
+ constructor(result) { this.#sha256 = result.sha256; Object.freeze(this); }
34
+ static prepare(result) {
35
+ if (!(result instanceof PreparedMemoryStageResult))
36
+ refuse("prepared_result_required");
37
+ const value = JSON.parse(result.bytes().toString("utf8"));
38
+ if (value.stage !== "discover" || value.outcome !== "accepted"
39
+ || value.findings.some((finding) => finding.severity !== "minor" && finding.status !== "resolved"))
40
+ refuse("discovery_not_accepted");
41
+ const inventory = new Map();
42
+ for (const source of value.details.inventory) {
43
+ const key = memorySourceKey(source.root, source.path);
44
+ if (inventory.has(key))
45
+ refuse("duplicate_inventory_source");
46
+ inventory.set(key, source.sha256);
47
+ }
48
+ const exclusions = new Set();
49
+ for (const exclusion of value.details.exclusions) {
50
+ if (!exclusion.reason.trim() || exclusions.has(exclusion.path))
51
+ refuse("invalid_or_duplicate_exclusion");
52
+ exclusions.add(exclusion.path);
53
+ const excluded = exclusion.path.replace(/\/+$/, "");
54
+ if (value.details.inventory.some((source) => source.path === excluded || source.path.startsWith(`${excluded}/`)))
55
+ refuse("observed_source_excluded");
56
+ }
57
+ return new PreparedMemoryDiscoveryAcceptance(result);
58
+ }
59
+ assertResult(result) {
60
+ if (!(result instanceof PreparedMemoryStageResult) || result.sha256 !== this.#sha256)
61
+ refuse("discovery_result_changed");
62
+ }
63
+ }
64
+ /** Unregistered implementation until the complete memory registry is ready.
65
+ * Entry inherits accepted preflight and preserves its independent bootstrap
66
+ * baseline through Stage/coordinator writers, without dispatching a provider.
67
+ */
68
+ export function startMemoryDiscovery(context, input) {
69
+ const { bundle, scope, accepted } = selected(context, input);
70
+ if (accepted)
71
+ refuse("use_accepted_finish_replay");
72
+ const preservation = PreparedMemoryBaselinePreservation.prepare(context, bundle.execution);
73
+ const preflight = context.db.readSnapshot(() => readAcceptedStageData(context, { ...scope, stage: "preflight" }));
74
+ const value = JSON.parse(preflight.bytes.toString("utf8"));
75
+ if (value.schema_id !== "dd-flow/mb-init-preflight-result@1" || value.outcome !== "accepted" || value.run_id !== input.runId)
76
+ refuse("foreign_preflight_baseline");
77
+ const fence = (writer) => {
78
+ preservation.assertCustody(writer);
79
+ if (readAcceptedStageData(writer, { ...scope, stage: "preflight" }).authority_sha256 !== preflight.authority_sha256)
80
+ refuse("preflight_custody_changed");
81
+ };
82
+ const start = PreparedDescriptorStageStart.prepare(context, { ...input, stage: "discover" });
83
+ preservation.revalidate(context);
84
+ const stage = start.apply(context, fence);
85
+ const coordinator = PreparedDescriptorStageCoordinator.prepare(context, { ...input, stage: "discover" });
86
+ preservation.revalidate(context);
87
+ return { ...stage, ...coordinator.apply(context, fence) };
88
+ }
89
+ export function finishMemoryDiscovery(context, input) {
90
+ const { bundle, scope, accepted } = selected(context, input);
91
+ const sources = captureMemoryPreflightSources(context, bundle, input.bytes);
92
+ const binding = PreparedMemoryResultBinding.prepare(context, { ...scope, flow: bundle.descriptor, execution: bundle.execution, bundle, sources, acceptedReplay: accepted });
93
+ const replay = binding.acceptedBytes();
94
+ if (replay && !replay.equals(input.bytes))
95
+ refuse("accepted_result_changed");
96
+ const result = PreparedMemoryStageResult.prepare(input.bytes, bundle.descriptor, binding.binding());
97
+ const acceptance = PreparedMemoryDiscoveryAcceptance.prepare(result);
98
+ const settlement = PreparedDescriptorStageSettlement.prepare(context, { ...input, stage: "discover", bytes: result.bytes() });
99
+ binding.revalidate(context);
100
+ return settlement.apply(context, writer => {
101
+ binding.assertCustody(writer);
102
+ acceptance.assertResult(result);
103
+ });
104
+ }