@deksden-com/dd-flow-cli 0.9.0-beta.14 → 0.9.0-beta.140

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 (493) hide show
  1. package/CHANGELOG.md +733 -0
  2. package/README.md +143 -1
  3. package/dist/build-info.json +8 -8
  4. package/dist/cli/argument-values.js +38 -0
  5. package/dist/cli/command-inputs.js +376 -0
  6. package/dist/cli/command-metadata.js +197 -0
  7. package/dist/cli/command-option-descriptions.js +191 -0
  8. package/dist/cli/completion-cli.js +70 -0
  9. package/dist/cli/completion.js +57 -0
  10. package/dist/cli/error-output.js +52 -0
  11. package/dist/cli/executor-onboarding.js +76 -0
  12. package/dist/cli/flows.js +29 -0
  13. package/dist/cli/harnesses.js +84 -0
  14. package/dist/cli/help.js +328 -18
  15. package/dist/cli/hook-ingress.js +78 -0
  16. package/dist/cli/input-preparation.js +165 -0
  17. package/dist/cli/memory-flow-admission.js +44 -0
  18. package/dist/cli/memory-init-invocation.js +78 -0
  19. package/dist/cli/memory-init.js +240 -0
  20. package/dist/cli/memory-storage-admission.js +53 -0
  21. package/dist/cli/models.js +39 -0
  22. package/dist/cli/native-hook-ingress.js +80 -0
  23. package/dist/cli/operator-profiles.js +61 -0
  24. package/dist/cli/output-options.js +35 -0
  25. package/dist/cli/response-file.js +71 -0
  26. package/dist/cli/run-cli.js +1689 -545
  27. package/dist/cli/runtime-maintenance-diagnostics.js +46 -0
  28. package/dist/cli/runtime-maintenance-ingress.js +52 -0
  29. package/dist/cli/runtime-process.js +153 -0
  30. package/dist/cli/setup.js +149 -0
  31. package/dist/cli.js +71 -2
  32. package/dist/domain/stage-catalog.js +1 -1
  33. package/dist/domain/stage-handler-identities.js +20 -0
  34. package/dist/harness-runtime/DD-ZCODE.md +112 -0
  35. package/dist/harness-runtime/OPENCODE-LICENSE.txt +24 -0
  36. package/dist/harness-runtime/bin/dd-agy.mjs +56 -0
  37. package/dist/harness-runtime/bin/dd-codex.mjs +27 -0
  38. package/dist/harness-runtime/bin/dd-droid.mjs +34 -0
  39. package/dist/harness-runtime/bin/dd-grok.mjs +40 -0
  40. package/dist/harness-runtime/bin/dd-opencode.mjs +22 -0
  41. package/dist/harness-runtime/bin/dd-zcode.mjs +87 -0
  42. package/dist/harness-runtime/lib/adapter-timeouts.d.mts +5 -0
  43. package/dist/harness-runtime/lib/adapter-timeouts.mjs +34 -0
  44. package/dist/harness-runtime/lib/agy-hooks.d.mts +1 -0
  45. package/dist/harness-runtime/lib/agy-hooks.mjs +9 -0
  46. package/dist/harness-runtime/lib/daemon-observation.d.mts +2 -0
  47. package/dist/harness-runtime/lib/daemon-observation.mjs +163 -0
  48. package/dist/harness-runtime/lib/daemon-operations.d.mts +1 -0
  49. package/dist/harness-runtime/lib/daemon-operations.mjs +371 -0
  50. package/dist/harness-runtime/lib/dd-agy-daemon.d.mts +6 -0
  51. package/dist/harness-runtime/lib/dd-agy-daemon.mjs +724 -0
  52. package/dist/harness-runtime/lib/dd-agy.mjs +70 -0
  53. package/dist/harness-runtime/lib/dd-codex-daemon.d.mts +1 -0
  54. package/dist/harness-runtime/lib/dd-codex-daemon.mjs +196 -0
  55. package/dist/harness-runtime/lib/dd-codex.d.mts +1 -0
  56. package/dist/harness-runtime/lib/dd-codex.mjs +817 -0
  57. package/dist/harness-runtime/lib/dd-droid-daemon.mjs +129 -0
  58. package/dist/harness-runtime/lib/dd-droid.mjs +584 -0
  59. package/dist/harness-runtime/lib/dd-grok-daemon.mjs +498 -0
  60. package/dist/harness-runtime/lib/dd-grok.mjs +177 -0
  61. package/dist/harness-runtime/lib/dd-opencode-daemon.mjs +507 -0
  62. package/dist/harness-runtime/lib/dd-opencode.mjs +354 -0
  63. package/dist/harness-runtime/lib/dd-zcode-daemon.mjs +750 -0
  64. package/dist/harness-runtime/lib/dd-zcode.mjs +1145 -0
  65. package/dist/harness-runtime/lib/delegation-instructions.d.mts +14 -0
  66. package/dist/harness-runtime/lib/delegation-instructions.mjs +157 -0
  67. package/dist/harness-runtime/lib/dispatch-fence.mjs +14 -0
  68. package/dist/harness-runtime/lib/driver-recovery.mjs +139 -0
  69. package/dist/harness-runtime/lib/droid-observation.mjs +66 -0
  70. package/dist/harness-runtime/lib/lease-renewal.d.mts +8 -0
  71. package/dist/harness-runtime/lib/lease-renewal.mjs +37 -0
  72. package/dist/harness-runtime/lib/lifecycle-command.d.mts +20 -0
  73. package/dist/harness-runtime/lib/lifecycle-command.mjs +273 -0
  74. package/dist/harness-runtime/lib/lifecycle-contract.d.mts +10 -0
  75. package/dist/harness-runtime/lib/lifecycle-contract.mjs +19 -0
  76. package/dist/harness-runtime/lib/managed-daemon.d.mts +13 -0
  77. package/dist/harness-runtime/lib/managed-daemon.mjs +654 -0
  78. package/dist/harness-runtime/lib/managed-flow-env.mjs +15 -0
  79. package/dist/harness-runtime/lib/model-observations.mjs +101 -0
  80. package/dist/harness-runtime/lib/native-children.d.mts +16 -0
  81. package/dist/harness-runtime/lib/native-children.mjs +113 -0
  82. package/dist/harness-runtime/lib/native-hook-command.d.mts +7 -0
  83. package/dist/harness-runtime/lib/native-hook-command.mjs +251 -0
  84. package/dist/harness-runtime/lib/native-request-proof.d.mts +2 -0
  85. package/dist/harness-runtime/lib/native-request-proof.mjs +65 -0
  86. package/dist/harness-runtime/lib/native-streams.mjs +45 -0
  87. package/dist/harness-runtime/lib/observation-clock.d.mts +18 -0
  88. package/dist/harness-runtime/lib/observation-clock.mjs +92 -0
  89. package/dist/harness-runtime/lib/opencode-plugin.mjs +85 -0
  90. package/dist/harness-runtime/lib/operation-context.mjs +5 -0
  91. package/dist/harness-runtime/lib/operation-errors.d.mts +14 -0
  92. package/dist/harness-runtime/lib/operation-errors.mjs +116 -0
  93. package/dist/harness-runtime/lib/operation-progress.d.mts +7 -0
  94. package/dist/harness-runtime/lib/operation-progress.mjs +114 -0
  95. package/dist/harness-runtime/lib/process-json.d.mts +5 -0
  96. package/dist/harness-runtime/lib/process-json.mjs +201 -0
  97. package/dist/harness-runtime/lib/process-snapshot.mjs +10 -0
  98. package/dist/harness-runtime/lib/provider-overload-policy.d.mts +13 -0
  99. package/dist/harness-runtime/lib/provider-overload-policy.mjs +138 -0
  100. package/dist/harness-runtime/lib/runner-events.mjs +200 -0
  101. package/dist/harness-runtime/lib/runner-lock.mjs +42 -0
  102. package/dist/harness-runtime/lib/session-settlement.mjs +30 -0
  103. package/dist/harness-runtime/lib/setup-progress.d.mts +9 -0
  104. package/dist/harness-runtime/lib/setup-progress.mjs +51 -0
  105. package/dist/harness-runtime/lib/tool-observations.d.mts +21 -0
  106. package/dist/harness-runtime/lib/tool-observations.mjs +228 -0
  107. package/dist/harness-runtime/lib/zcode-usage.mjs +55 -0
  108. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-1y4a697q.js +81 -0
  109. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-2ny4vxct.js +92 -0
  110. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-6mptkzbc.js +0 -0
  111. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-7x67cf1q.js +52 -0
  112. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-9rqn6x4v.js +16 -0
  113. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-9vdz0zwn.js +1661 -0
  114. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ecs5ftka.js +1466 -0
  115. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-frbwqjmf.js +145 -0
  116. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-gne7h7mq.js +50 -0
  117. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-gx9wnkzr.js +105 -0
  118. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-m2eywc8w.js +0 -0
  119. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-nwcpakzx.js +12 -0
  120. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-q4g3afnw.js +623 -0
  121. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-qav6mfdz.js +0 -0
  122. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-sxt88q69.js +12 -0
  123. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-t1xa31vm.js +39 -0
  124. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ve4aws36.js +103 -0
  125. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vmytr4q8.js +4 -0
  126. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vt9jbch8.js +36 -0
  127. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vyas3vgt.js +0 -0
  128. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-wjyeq25y.js +30 -0
  129. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-xgnj2w4v.js +20 -0
  130. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-y2etg5bs.js +9 -0
  131. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ydhz1zrh.js +238 -0
  132. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-z6qdwcsf.js +62 -0
  133. package/dist/harness-runtime/vendor/opencode-client/contract.d.ts +1 -0
  134. package/dist/harness-runtime/vendor/opencode-client/contract.js +12 -0
  135. package/dist/harness-runtime/vendor/opencode-client/effect/api/api.d.ts +2806 -0
  136. package/dist/harness-runtime/vendor/opencode-client/effect/api/api.js +0 -0
  137. package/dist/harness-runtime/vendor/opencode-client/effect/api.d.ts +4 -0
  138. package/dist/harness-runtime/vendor/opencode-client/effect/api.js +0 -0
  139. package/dist/harness-runtime/vendor/opencode-client/effect/client.d.ts +2530 -0
  140. package/dist/harness-runtime/vendor/opencode-client/effect/client.js +15 -0
  141. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client-error.d.ts +7 -0
  142. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client-error.js +6 -0
  143. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client.d.ts +2529 -0
  144. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client.js +8 -0
  145. package/dist/harness-runtime/vendor/opencode-client/effect/generated/index.d.ts +2 -0
  146. package/dist/harness-runtime/vendor/opencode-client/effect/generated/index.js +12 -0
  147. package/dist/harness-runtime/vendor/opencode-client/effect/index.d.ts +35 -0
  148. package/dist/harness-runtime/vendor/opencode-client/effect/index.js +75 -0
  149. package/dist/harness-runtime/vendor/opencode-client/effect/rpc.d.ts +20 -0
  150. package/dist/harness-runtime/vendor/opencode-client/effect/rpc.js +11 -0
  151. package/dist/harness-runtime/vendor/opencode-client/effect/service.d.ts +90 -0
  152. package/dist/harness-runtime/vendor/opencode-client/effect/service.js +187 -0
  153. package/dist/harness-runtime/vendor/opencode-client/package.json +84 -0
  154. package/dist/harness-runtime/vendor/opencode-client/promise/api.d.ts +21 -0
  155. package/dist/harness-runtime/vendor/opencode-client/promise/api.js +0 -0
  156. package/dist/harness-runtime/vendor/opencode-client/promise/client.d.ts +252 -0
  157. package/dist/harness-runtime/vendor/opencode-client/promise/client.js +14 -0
  158. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client-error.d.ts +8 -0
  159. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client-error.js +6 -0
  160. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client.d.ts +259 -0
  161. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client.js +7 -0
  162. package/dist/harness-runtime/vendor/opencode-client/promise/generated/index.d.ts +3 -0
  163. package/dist/harness-runtime/vendor/opencode-client/promise/generated/index.js +79 -0
  164. package/dist/harness-runtime/vendor/opencode-client/promise/generated/types.d.ts +8932 -0
  165. package/dist/harness-runtime/vendor/opencode-client/promise/generated/types.js +70 -0
  166. package/dist/harness-runtime/vendor/opencode-client/promise/index.d.ts +6 -0
  167. package/dist/harness-runtime/vendor/opencode-client/promise/index.js +83 -0
  168. package/dist/harness-runtime/vendor/opencode-client/promise/rpc.d.ts +32 -0
  169. package/dist/harness-runtime/vendor/opencode-client/promise/rpc.js +7 -0
  170. package/dist/harness-runtime/vendor/opencode-client/promise/service.d.ts +24 -0
  171. package/dist/harness-runtime/vendor/opencode-client/promise/service.js +187 -0
  172. package/dist/harness-runtime/vendor/opencode-client/pty-handoff.d.ts +12 -0
  173. package/dist/harness-runtime/vendor/opencode-client/pty-handoff.js +14 -0
  174. package/dist/harness-runtime/vendor/opencode-client/rpc-runtime.d.ts +20 -0
  175. package/dist/harness-runtime/vendor/opencode-client/rpc-runtime.js +14 -0
  176. package/dist/harness-runtime/vendor/opencode-client/service-contender.d.ts +37 -0
  177. package/dist/harness-runtime/vendor/opencode-client/service-contender.js +10 -0
  178. package/dist/harness-runtime/vendor/opencode-client/service-probe.d.ts +70 -0
  179. package/dist/harness-runtime/vendor/opencode-client/service-probe.js +16 -0
  180. package/dist/harness-runtime/vendor/opencode-client/service-timing.d.ts +12 -0
  181. package/dist/harness-runtime/vendor/opencode-client/service-timing.js +10 -0
  182. package/dist/harness-runtime/vendor/opencode-client/service-version.d.ts +2 -0
  183. package/dist/harness-runtime/vendor/opencode-client/service-version.js +6 -0
  184. package/dist/harness-runtime/vendor/opencode-client/service.d.ts +52 -0
  185. package/dist/harness-runtime/vendor/opencode-client/service.js +1 -0
  186. package/dist/harness-runtime/vendor/opencode-client/shared-events.d.ts +11 -0
  187. package/dist/harness-runtime/vendor/opencode-client/shared-events.js +8 -0
  188. package/dist/harness-runtime/vendor/opencode-client/solid/connection.d.ts +37 -0
  189. package/dist/harness-runtime/vendor/opencode-client/solid/connection.js +10 -0
  190. package/dist/harness-runtime/vendor/opencode-client/solid/data.d.ts +211 -0
  191. package/dist/harness-runtime/vendor/opencode-client/solid/data.js +18 -0
  192. package/dist/harness-runtime/vendor/opencode-client/solid/index.d.ts +3 -0
  193. package/dist/harness-runtime/vendor/opencode-client/solid/index.js +32 -0
  194. package/dist/harness-runtime/vendor/opencode-client/solid/pty.d.ts +22 -0
  195. package/dist/harness-runtime/vendor/opencode-client/solid/pty.js +8 -0
  196. package/dist/harness-runtime/vendor/opencode-plugin.mjs +3 -0
  197. package/dist/protocol/local-files.js +18 -9
  198. package/dist/runtime/context.js +8 -4
  199. package/dist/schemas/agent-profile.schema.json +1 -1
  200. package/dist/schemas/code-review-result.schema.json +1 -1
  201. package/dist/schemas/code-verification.schema.json +7 -5
  202. package/dist/schemas/code-work-batch.schema.json +2 -2
  203. package/dist/schemas/discovery-result.schema.json +184 -0
  204. package/dist/schemas/execution-bundle.schema.json +205 -0
  205. package/dist/schemas/execution-settings.schema.json +162 -0
  206. package/dist/schemas/flow-descriptor.schema.json +54 -0
  207. package/dist/schemas/flow-run.schema.json +28 -0
  208. package/dist/schemas/harness-catalog.schema.json +80 -0
  209. package/dist/schemas/mb-init-compose-result.schema.json +457 -0
  210. package/dist/schemas/mb-init-discover-result.schema.json +500 -0
  211. package/dist/schemas/mb-init-finish-result.schema.json +422 -0
  212. package/dist/schemas/mb-init-preflight-result.schema.json +367 -0
  213. package/dist/schemas/mb-init-review-result.schema.json +396 -0
  214. package/dist/schemas/mb-init-verify-result.schema.json +391 -0
  215. package/dist/schemas/memory-bootstrap-receipt-v2.schema.json +67 -0
  216. package/dist/schemas/memory-bootstrap-receipt.schema.json +354 -0
  217. package/dist/schemas/memory-composition-work-result.schema.json +38 -0
  218. package/dist/schemas/memory-repair-work-result.schema.json +49 -0
  219. package/dist/schemas/memory-review-correction-plan.schema.json +30 -0
  220. package/dist/schemas/memory-review-work-result.schema.json +43 -0
  221. package/dist/schemas/model-catalog.schema.json +153 -0
  222. package/dist/schemas/plan-review-decision.schema.json +3 -3
  223. package/dist/schemas/plan-review-result.schema.json +2 -2
  224. package/dist/schemas/profile-settings.schema.json +122 -0
  225. package/dist/schemas/release-manifest.schema.json +291 -0
  226. package/dist/schemas/run-control-receipt.schema.json +118 -0
  227. package/dist/schemas/run-control-request.schema.json +36 -0
  228. package/dist/schemas/run-engine-binding.schema.json +1 -1
  229. package/dist/schemas/vnext-protocol-plan.schema.json +2 -2
  230. package/dist/services/branch-context.js +3 -3
  231. package/dist/services/canon.js +11 -8
  232. package/dist/services/check-runner-evidence.js +168 -0
  233. package/dist/services/cleanup.js +133 -40
  234. package/dist/services/cli-operation-classifier.js +25 -62
  235. package/dist/services/cli-upgrade-allowlist.js +27 -0
  236. package/dist/services/code-checks.js +1156 -107
  237. package/dist/services/codex-hook-delivery.js +32 -0
  238. package/dist/services/command-context.js +80 -0
  239. package/dist/services/compatibility-preflight.js +13 -3
  240. package/dist/services/config.js +11 -8
  241. package/dist/services/continuation-outcome.js +20 -0
  242. package/dist/services/controller-child-capacity.js +13 -0
  243. package/dist/services/controller-child-observer.js +115 -0
  244. package/dist/services/controller-execution.js +88 -0
  245. package/dist/services/controller-fanout.js +202 -0
  246. package/dist/services/dashboard.js +143 -58
  247. package/dist/services/descriptor-coordinator-session.js +35 -0
  248. package/dist/services/descriptor-root-work.js +53 -0
  249. package/dist/services/descriptor-run-settlement.js +105 -0
  250. package/dist/services/descriptor-run-start.js +449 -0
  251. package/dist/services/descriptor-stage-coordinator.js +197 -0
  252. package/dist/services/descriptor-stage-settlement.js +222 -0
  253. package/dist/services/descriptor-stage-start.js +139 -0
  254. package/dist/services/discovery/agy-discovery.js +2 -0
  255. package/dist/services/discovery/codex-discovery.js +2 -0
  256. package/dist/services/discovery/droid-discovery.js +2 -0
  257. package/dist/services/discovery/grok-discovery.js +2 -0
  258. package/dist/services/discovery/opencode-discovery.js +2 -0
  259. package/dist/services/discovery/static.js +31 -0
  260. package/dist/services/discovery/zcode-discovery.js +2 -0
  261. package/dist/services/engines.js +294 -153
  262. package/dist/services/eval-snapshots.js +1215 -116
  263. package/dist/services/execution-bundles.js +263 -0
  264. package/dist/services/execution-policy.js +185 -0
  265. package/dist/services/executor-onboarding.js +56 -0
  266. package/dist/services/external-work-launch.js +308 -0
  267. package/dist/services/flow-catalog.js +21 -0
  268. package/dist/services/flow-descriptors.js +82 -0
  269. package/dist/services/frozen-engine.js +250 -0
  270. package/dist/services/generic-execution.js +164 -0
  271. package/dist/services/harness-adapter.js +355 -36
  272. package/dist/services/harness-config.js +2 -0
  273. package/dist/services/harness-discovery.js +29 -0
  274. package/dist/services/harness-doctor.js +75 -0
  275. package/dist/services/harness-probe-effects.js +51 -0
  276. package/dist/services/harness-version-probe.js +100 -0
  277. package/dist/services/hooks.js +771 -325
  278. package/dist/services/hybrid-contracts.js +483 -0
  279. package/dist/services/ids.js +29 -1
  280. package/dist/services/installation-lock.js +95 -0
  281. package/dist/services/installed-flow-source.js +183 -0
  282. package/dist/services/lanes.js +78 -65
  283. package/dist/services/lifecycle-command.js +1 -288
  284. package/dist/services/lifecycle-contract.js +1 -0
  285. package/dist/services/lifecycle-invocations.js +2007 -0
  286. package/dist/services/managed-daemon-binding.js +38 -0
  287. package/dist/services/managed-lease-monitor.js +133 -0
  288. package/dist/services/managed-processes.js +475 -55
  289. package/dist/services/memory-accepted-composition.js +77 -0
  290. package/dist/services/memory-baseline-preservation.js +65 -0
  291. package/dist/services/memory-completed-correction-wave.js +320 -0
  292. package/dist/services/memory-compose-handler.js +258 -0
  293. package/dist/services/memory-composition-acceptance.js +199 -0
  294. package/dist/services/memory-composition-graph.js +134 -0
  295. package/dist/services/memory-composition-registration.js +146 -0
  296. package/dist/services/memory-composition-work-custody.js +151 -0
  297. package/dist/services/memory-composition-work-results.js +96 -0
  298. package/dist/services/memory-corrected-review-acceptance.js +129 -0
  299. package/dist/services/memory-corrected-review-batch.js +30 -0
  300. package/dist/services/memory-corrected-review-findings.js +106 -0
  301. package/dist/services/memory-corrected-review-inputs.js +210 -0
  302. package/dist/services/memory-corrected-review-projection.js +78 -0
  303. package/dist/services/memory-corrected-review-receipt.js +170 -0
  304. package/dist/services/memory-corrected-review-registration.js +191 -0
  305. package/dist/services/memory-correction-check-receipt.js +219 -0
  306. package/dist/services/memory-correction-input-owner.js +6 -0
  307. package/dist/services/memory-discover-handler.js +104 -0
  308. package/dist/services/memory-finish-evidence.js +435 -0
  309. package/dist/services/memory-finish-handler.js +215 -0
  310. package/dist/services/memory-finish-integration.js +280 -0
  311. package/dist/services/memory-finish-readiness.js +122 -0
  312. package/dist/services/memory-git-integration.js +151 -0
  313. package/dist/services/memory-historical-corrected-review.js +206 -0
  314. package/dist/services/memory-historical-original-review.js +130 -0
  315. package/dist/services/memory-historical-repair-registration.js +99 -0
  316. package/dist/services/memory-historical-second-review.js +128 -0
  317. package/dist/services/memory-init-bootstrap-readiness.js +210 -0
  318. package/dist/services/memory-init-contexts.js +89 -0
  319. package/dist/services/memory-init-controller-start.js +84 -0
  320. package/dist/services/memory-init-engine-release.js +223 -0
  321. package/dist/services/memory-init-git-policy.js +136 -0
  322. package/dist/services/memory-init-lint-capability.js +185 -0
  323. package/dist/services/memory-init-native-capacity.js +296 -0
  324. package/dist/services/memory-init-preflight.js +330 -0
  325. package/dist/services/memory-init-project-bootstrap.js +599 -0
  326. package/dist/services/memory-init-request-candidate.js +157 -0
  327. package/dist/services/memory-init-request-input.js +66 -0
  328. package/dist/services/memory-init-resource-storage.js +125 -0
  329. package/dist/services/memory-init-run-allocation.js +81 -0
  330. package/dist/services/memory-init-run-bundle.js +98 -0
  331. package/dist/services/memory-init-start.js +181 -0
  332. package/dist/services/memory-init-startup-custody.js +80 -0
  333. package/dist/services/memory-init-startup-input.js +240 -0
  334. package/dist/services/memory-init-storage.js +81 -0
  335. package/dist/services/memory-init-stores.js +359 -0
  336. package/dist/services/memory-init-worktrunk-capability.js +178 -0
  337. package/dist/services/memory-layer-publication.js +611 -0
  338. package/dist/services/memory-layer.js +156 -0
  339. package/dist/services/memory-lint-config.js +85 -0
  340. package/dist/services/memory-native-review-copy.js +165 -0
  341. package/dist/services/memory-normal-flow-entry.js +75 -0
  342. package/dist/services/memory-ordinary-defaults.js +112 -0
  343. package/dist/services/memory-preflight-bootstrap-custody.js +115 -0
  344. package/dist/services/memory-preflight-handler.js +259 -0
  345. package/dist/services/memory-repair-current-view.js +299 -0
  346. package/dist/services/memory-repair-document-delta.js +451 -0
  347. package/dist/services/memory-repair-history.js +491 -0
  348. package/dist/services/memory-repair-physical-binding.js +312 -0
  349. package/dist/services/memory-repair-publication-files.js +152 -0
  350. package/dist/services/memory-repair-publication-intent.js +27 -0
  351. package/dist/services/memory-repair-publication-plan.js +160 -0
  352. package/dist/services/memory-repair-publication-source.js +225 -0
  353. package/dist/services/memory-repair-publication.js +794 -0
  354. package/dist/services/memory-repair-registration.js +239 -0
  355. package/dist/services/memory-repair-work-baseline.js +413 -0
  356. package/dist/services/memory-repair-work-completion.js +97 -0
  357. package/dist/services/memory-repair-work-custody.js +73 -0
  358. package/dist/services/memory-repair-work-results.js +89 -0
  359. package/dist/services/memory-repair-workspace.js +252 -0
  360. package/dist/services/memory-repair-writer-copy.js +735 -0
  361. package/dist/services/memory-result-binding.js +173 -0
  362. package/dist/services/memory-retained-review-authority.js +129 -0
  363. package/dist/services/memory-retained-review-results.js +70 -0
  364. package/dist/services/memory-retained-second-baseline.js +102 -0
  365. package/dist/services/memory-retained-second-repairs.js +156 -0
  366. package/dist/services/memory-review-acceptance.js +214 -0
  367. package/dist/services/memory-review-correction-plan.js +171 -0
  368. package/dist/services/memory-review-handler.js +585 -0
  369. package/dist/services/memory-review-inputs.js +200 -0
  370. package/dist/services/memory-review-receipt.js +180 -0
  371. package/dist/services/memory-review-registration.js +108 -0
  372. package/dist/services/memory-review-work-custody.js +124 -0
  373. package/dist/services/memory-review-work-input.js +72 -0
  374. package/dist/services/memory-review-work-results.js +73 -0
  375. package/dist/services/memory-second-corrected-review-inputs.js +165 -0
  376. package/dist/services/memory-second-correction-plan.js +76 -0
  377. package/dist/services/memory-second-repair-baseline.js +91 -0
  378. package/dist/services/memory-second-repair-launch.js +614 -0
  379. package/dist/services/memory-second-repair-registration.js +88 -0
  380. package/dist/services/memory-second-repair-source.js +187 -0
  381. package/dist/services/memory-second-review-acceptance.js +115 -0
  382. package/dist/services/memory-source-observations.js +117 -0
  383. package/dist/services/memory-stage-dispatch.js +28 -0
  384. package/dist/services/memory-stage-results.js +199 -0
  385. package/dist/services/memory-verification-acceptance.js +135 -0
  386. package/dist/services/memory-verification-checks.js +252 -0
  387. package/dist/services/memory-verification-receipt.js +159 -0
  388. package/dist/services/memory-verify-handler.js +135 -0
  389. package/dist/services/memory-work-result-preparation.js +63 -0
  390. package/dist/services/merge-queue.js +228 -149
  391. package/dist/services/merge-server.js +161 -35
  392. package/dist/services/migrations.js +37 -16
  393. package/dist/services/model-catalog.js +109 -0
  394. package/dist/services/model-discovery.js +46 -0
  395. package/dist/services/native-daemon-history.js +49 -0
  396. package/dist/services/native-session-control.js +39 -0
  397. package/dist/services/operator-profiles.js +236 -0
  398. package/dist/services/plan-runtime.js +26 -11
  399. package/dist/services/plans.js +28 -25
  400. package/dist/services/projects.js +37 -17
  401. package/dist/services/prompts.js +28 -17
  402. package/dist/services/protocols.js +163 -87
  403. package/dist/services/provider-capacity.js +385 -0
  404. package/dist/services/recovery-observation-budget.js +121 -0
  405. package/dist/services/recovery-snapshot-database.js +560 -0
  406. package/dist/services/release-archive-producer.js +52 -0
  407. package/dist/services/release-archive.js +143 -0
  408. package/dist/services/release-cache.js +142 -0
  409. package/dist/services/release-compatibility.js +18 -0
  410. package/dist/services/release-download.js +67 -0
  411. package/dist/services/release-envelope.js +104 -0
  412. package/dist/services/release-manifest.js +45 -0
  413. package/dist/services/release-payload.js +114 -0
  414. package/dist/services/release-producer.js +63 -0
  415. package/dist/services/release-provenance.js +160 -0
  416. package/dist/services/release-registry.js +66 -0
  417. package/dist/services/release-source.js +194 -0
  418. package/dist/services/repair-intents.js +42 -0
  419. package/dist/services/review-copy.js +165 -0
  420. package/dist/services/review-deferral.js +23 -0
  421. package/dist/services/run-control-receipt.js +56 -0
  422. package/dist/services/run-control-worker.js +411 -0
  423. package/dist/services/run-control.js +1056 -0
  424. package/dist/services/run-controller-adapter.js +399 -0
  425. package/dist/services/run-controller-capture.js +186 -0
  426. package/dist/services/run-controller-process.js +208 -0
  427. package/dist/services/run-controller-recovery.js +289 -0
  428. package/dist/services/run-controller-state.js +97 -0
  429. package/dist/services/run-controller.js +1205 -0
  430. package/dist/services/run-engine-bindings.js +1 -1
  431. package/dist/services/run-fork.js +147 -0
  432. package/dist/services/run-health.js +149 -0
  433. package/dist/services/run-observations.js +152 -0
  434. package/dist/services/run-projection.js +22 -64
  435. package/dist/services/run-recovery-guard.js +77 -0
  436. package/dist/services/run-recovery-runtime.js +112 -0
  437. package/dist/services/run-recovery.js +489 -0
  438. package/dist/services/run-start-custody.js +177 -0
  439. package/dist/services/runs.js +1019 -247
  440. package/dist/services/runtime-budget.js +430 -0
  441. package/dist/services/runtime-command.js +43 -0
  442. package/dist/services/runtime-scope-capture.js +52 -0
  443. package/dist/services/runtime-scope-control.js +468 -0
  444. package/dist/services/runtime-scope-resume.js +599 -0
  445. package/dist/services/runtime-scope-stop.js +210 -0
  446. package/dist/services/runtime-scope-worker.js +287 -0
  447. package/dist/services/runtime-service.js +96 -0
  448. package/dist/services/schema-validation.js +10 -8
  449. package/dist/services/scope-writer-cleanup.js +27 -0
  450. package/dist/services/sessions.js +35 -69
  451. package/dist/services/setup.js +377 -0
  452. package/dist/services/stage-blocker.js +17 -7
  453. package/dist/services/stage-context.js +193 -19
  454. package/dist/services/stage-handlers.js +74 -0
  455. package/dist/services/stage-lifecycle.js +100 -108
  456. package/dist/services/stage-pause.js +89 -75
  457. package/dist/services/stage-report-renderer.js +234 -6
  458. package/dist/services/stage-work-graph.js +52 -0
  459. package/dist/services/tooling.js +32 -23
  460. package/dist/services/usage.js +49 -101
  461. package/dist/services/verification-matrix.js +374 -0
  462. package/dist/services/vnext-code-review.js +223 -88
  463. package/dist/services/vnext-code.js +327 -226
  464. package/dist/services/vnext-contracts.js +10 -1
  465. package/dist/services/vnext-execution-profile.js +80 -5
  466. package/dist/services/vnext-fanout.js +311 -19
  467. package/dist/services/vnext-merge.js +332 -111
  468. package/dist/services/vnext-plan-review.js +279 -127
  469. package/dist/services/vnext-plan.js +229 -104
  470. package/dist/services/vnext-protocolize.js +411 -86
  471. package/dist/services/vnext-specify.js +119 -81
  472. package/dist/services/vnext-workspace-policy.js +7 -2
  473. package/dist/services/work-registry.js +1627 -199
  474. package/dist/services/workspace-bootstrap.js +52 -15
  475. package/dist/services/workspace-files.js +85 -0
  476. package/dist/services/worktrees.js +98 -44
  477. package/dist/shared/entity-references.js +8 -0
  478. package/dist/shared/errors.js +17 -0
  479. package/dist/storage/agent-output.js +26 -0
  480. package/dist/storage/database.js +891 -39
  481. package/dist/storage/foreign-key-transaction.js +39 -0
  482. package/dist/storage/immutable-input.js +45 -0
  483. package/dist/storage/import-guard.js +102 -0
  484. package/dist/storage/native-cleanup.js +52 -0
  485. package/dist/storage/paths.js +17 -4
  486. package/dist/storage/projection-lock.js +73 -0
  487. package/dist/storage/work-references.js +23 -0
  488. package/dist/storage/writer-contract.js +89 -0
  489. package/dist/storage/writer-migration.js +85 -0
  490. package/package.json +43 -13
  491. package/tools/create-canon-release.mjs +33 -0
  492. package/tools/produce-hybrid-release.mjs +41 -0
  493. package/tools/repair-paused-run-status.mjs +84 -0
@@ -0,0 +1,560 @@
1
+ import { DatabaseSync } from "node:sqlite";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { AppError, errorRecord } from "../shared/errors.js";
5
+ import { registerStoreWriter } from "../storage/writer-contract.js";
6
+ import { managedProcessRuntimeHome } from "./managed-processes.js";
7
+ import { cleanupScopeWriters } from "./scope-writer-cleanup.js";
8
+ import { hybridDigest } from "./hybrid-contracts.js";
9
+ import { readRunStartRequest } from "./run-start-custody.js";
10
+ import { readMemoryInitRunAllocation } from "./memory-init-run-allocation.js";
11
+ import { readMemoryInitStartupInput } from "./memory-init-startup-custody.js";
12
+ /** Export one RUN's relational evidence, never mutate the live authority. */
13
+ export function captureRecoveryDatabase(source, output, projectId, runId, protocolIds = []) {
14
+ source.exec(`VACUUM INTO '${output.replace(/'/g, "''")}'`);
15
+ const db = new DatabaseSync(output);
16
+ let complete = false, held = false, failed = false, primary;
17
+ try {
18
+ registerStoreWriter(db);
19
+ db.exec("PRAGMA foreign_keys = OFF; PRAGMA secure_delete = ON; BEGIN IMMEDIATE");
20
+ held = true;
21
+ db.exec("CREATE TEMP TABLE capture_scope (project_id TEXT, run_id TEXT)");
22
+ db.prepare("INSERT INTO capture_scope VALUES (?, ?)").run(projectId, runId);
23
+ db.exec("CREATE TEMP TABLE capture_protocols (id TEXT)");
24
+ for (const id of protocolIds)
25
+ db.prepare("INSERT INTO capture_protocols VALUES (?)").run(id);
26
+ if (!db.prepare("SELECT 1 FROM runs WHERE (project_id, id) IN (SELECT * FROM capture_scope)").get())
27
+ throw new AppError("snapshot_run_missing", "Recovery export requires the selected RUN", 1);
28
+ assertCapturedBundleAuthority(db, projectId, runId);
29
+ assertCapturedStartAuthority(db, projectId, runId);
30
+ const ownRun = "(project_id, run_id) IN (SELECT * FROM capture_scope)";
31
+ const ownProject = "project_id IN (SELECT project_id FROM capture_scope)";
32
+ const works = `SELECT work_id FROM works WHERE ${ownRun}`;
33
+ if (db.prepare(`SELECT 1 FROM sessions WHERE ${ownProject} AND run_id IS NOT NULL AND run_id NOT IN (SELECT run_id FROM capture_scope) AND session_id IN (SELECT session_id FROM work_sessions WHERE work_id IN (${works})) LIMIT 1`).get())
34
+ throw new AppError("snapshot_scope_conflict", "Selected Work refers to a Session currently bound to another RUN", 1);
35
+ const sessions = `SELECT session_id FROM sessions WHERE ${ownProject} AND (run_id IN (SELECT run_id FROM capture_scope) OR session_id IN (SELECT session_id FROM work_sessions WHERE work_id IN (${works})))`;
36
+ const nativeSessions = `SELECT harness, provider_session_id FROM sessions WHERE ${ownProject} AND session_id IN (${sessions})`;
37
+ const invocations = "json_extract(scope_json, '$.runId') IN (SELECT run_id FROM capture_scope) AND json_extract(scope_json, '$.projectRoot') IN (SELECT root FROM projects WHERE id IN (SELECT project_id FROM capture_scope))";
38
+ const invocationReceipts = db.prepare("SELECT 1 FROM sqlite_schema WHERE type = 'table' AND name = 'lifecycle_invocations'").get()
39
+ ? ` OR event_key IN (SELECT event_key FROM lifecycle_invocations WHERE ${invocations})` : "";
40
+ const protocols = `SELECT id FROM capture_protocols UNION SELECT subject_id FROM runs WHERE (project_id, id) IN (SELECT * FROM capture_scope) UNION SELECT value FROM merge_requests, json_each(merge_requests.protocol_ids_json) WHERE ${ownRun} UNION SELECT protocol_id FROM flow_jobs WHERE ${ownRun}`;
41
+ const rules = {
42
+ dd_flow_writer_contract: "1",
43
+ dd_flow_writer_migrations: "0",
44
+ projects: "id IN (SELECT project_id FROM capture_scope)",
45
+ runs: "(project_id, id) IN (SELECT * FROM capture_scope)",
46
+ sessions: `${ownProject} AND session_id IN (${sessions})`,
47
+ work_sessions: `work_id IN (${works})`, work_launches: `work_id IN (${works})`,
48
+ work_recovery_segments: `work_id IN (${works})`,
49
+ run_recovery_bindings: `recovery_id IN (SELECT recovery_id FROM run_recovery_guards WHERE ${ownRun})`,
50
+ lifecycle_invocations: invocations,
51
+ lifecycle_packet_assignments: `invocation_id IN (SELECT id FROM lifecycle_invocations WHERE ${invocations})`,
52
+ hook_events: `${ownProject} AND (session_id IN (${sessions}) OR (harness, provider_session_id) IN (${nativeSessions})${invocationReceipts})`,
53
+ harness_usage_snapshots: `${ownProject} AND (harness, provider_session_id) IN (${nativeSessions})`,
54
+ protocols: `${ownProject} AND id IN (${protocols})`,
55
+ project_config: ownProject,
56
+ // Host installations, caches, queue owners and leases are not portable RUN authority.
57
+ runtime_config: "0", hook_installations: "0", codex_home_profiles: "0", codex_session_bindings: "0",
58
+ merge_servers: "0", merge_sessions: "0", merge_queue: "0", lanes: "0", lane_locks: "0", lane_waiters: "0",
59
+ sqlite_sequence: "0"
60
+ };
61
+ for (const table of ["works", "stage_work_memberships", "repair_intents", "check_receipts", "merge_requests", "flow_run_flag_mutations", "usage", "flow_session_segments", "flow_jobs", "run_recovery_guards", "run_controllers", "run_controls", "run_bundle_authorities", "run_start_requests"])
62
+ rules[table] = ownRun;
63
+ for (const table of ["plan_bindings", "plan_progress", "worktree_records", "audit_events"])
64
+ rules[table] = `${ownProject} AND protocol_id IN (${protocols})`;
65
+ // Relocation proofs are RUN-owned provenance needed to map unchanged context
66
+ // bytes through subsequent recovery generations, not portable live authority.
67
+ rules.audit_events = `${ownProject} AND (protocol_id IN (${protocols}) OR (event_type IN ('flow_run.publication_relocation', 'flow_run.workspace_rebound') AND json_extract(payload_json, '$.run_id') IN (SELECT run_id FROM capture_scope)))`;
68
+ // Bootstrap precedes RUN/project allocation: some owning receipts have
69
+ // NULL project_id. Select only the captured MB bundle's independently
70
+ // anchored request/roots, never all bootstrap receipts for this project.
71
+ // This preserves bytes; the bootstrap readers still validate the complete
72
+ // release/target/policy/engine/readiness chain before admitting recovery.
73
+ if (db.prepare("SELECT 1 FROM sqlite_schema WHERE type='table' AND name='run_bundle_authorities'").get()) {
74
+ const bootstrapReceipts = `EXISTS (SELECT 1 FROM run_bundle_authorities b JOIN runs r
75
+ ON r.project_id=b.project_id AND r.id=b.run_id
76
+ WHERE (b.project_id,b.run_id) IN (SELECT * FROM capture_scope)
77
+ AND json_extract(r.index_json,'$.execution_bundle.flow_id')='mb-init'
78
+ AND (audit_events.project_id IS NULL OR audit_events.project_id=b.project_id)
79
+ AND (
80
+ (event_type IN ('memory.init_git_policy','memory.init_release_selection','memory.init_startup_input','memory.init_startup_input_intent','memory.init_project_bootstrap_intent',
81
+ 'memory.init_project_bootstrap','memory.init_engine_admission','memory.init_engine_bootstrap')
82
+ AND json_extract(payload_json,'$.scope.requestId')=json_extract(b.admission_json,'$.executionScope.requestId')
83
+ AND json_extract(payload_json,'$.scope.projectRoot')=json_extract(b.admission_json,'$.executionScope.projectRoot')
84
+ AND json_extract(payload_json,'$.scope.workspaceRoot')=json_extract(b.admission_json,'$.executionScope.workspace')
85
+ AND (
86
+ (event_type='memory.init_git_policy' AND json_extract(payload_json,'$.schema_id')='dd-flow/memory-init-git-policy@1')
87
+ OR (event_type='memory.init_release_selection' AND json_extract(payload_json,'$.schema_id')='dd-flow/memory-init-release-selection@1')
88
+ OR (audit_events.project_id IS NULL AND event_type='memory.init_startup_input' AND json_extract(payload_json,'$.schema_id') IN ('dd-flow/memory-init-startup-input@1','dd-flow/memory-init-startup-input@2','dd-flow/memory-init-startup-input@3'))
89
+ OR (audit_events.project_id IS NULL AND event_type='memory.init_startup_input_intent' AND json_extract(payload_json,'$.schema_id')='dd-flow/memory-init-startup-input-intent@1')
90
+ OR (event_type='memory.init_project_bootstrap_intent' AND json_extract(payload_json,'$.schema_id') IN
91
+ ('dd-flow/memory-init-project-bootstrap-intent@1','dd-flow/memory-init-project-bootstrap-intent@2','dd-flow/memory-init-project-bootstrap-intent@3','dd-flow/memory-init-project-bootstrap-intent@4'))
92
+ OR (event_type='memory.init_project_bootstrap' AND json_extract(payload_json,'$.receipt.schema_id') IN
93
+ ('dd-flow/memory-init-project-bootstrap@1','dd-flow/memory-init-project-bootstrap@2','dd-flow/memory-init-project-bootstrap@3','dd-flow/memory-init-project-bootstrap@4'))
94
+ OR (event_type='memory.init_engine_admission' AND json_extract(payload_json,'$.schema_id') IN
95
+ ('dd-flow/memory-init-engine-admission@1','dd-flow/memory-init-engine-admission@2'))
96
+ OR (event_type='memory.init_engine_bootstrap' AND json_extract(payload_json,'$.schema_id')='dd-flow/memory-init-engine-bootstrap@1')))
97
+ OR (audit_events.project_id=b.project_id
98
+ AND event_type IN ('memory.init_run_allocation','memory.init_run_allocation_intent')
99
+ AND json_extract(payload_json,'$.run_id')=b.run_id
100
+ AND json_extract(payload_json,'$.scope.requestId')=json_extract(b.admission_json,'$.executionScope.requestId')
101
+ AND json_extract(payload_json,'$.scope.projectRoot')=json_extract(b.admission_json,'$.executionScope.projectRoot')
102
+ AND json_extract(payload_json,'$.scope.workspaceRoot')=json_extract(b.admission_json,'$.executionScope.workspace')
103
+ AND ((event_type='memory.init_run_allocation' AND json_extract(payload_json,'$.schema_id')='dd-flow/memory-init-run-allocation@1')
104
+ OR (event_type='memory.init_run_allocation_intent' AND json_extract(payload_json,'$.schema_id')='dd-flow/memory-init-run-allocation-intent@1')))
105
+ OR (event_type IN ('memory.bootstrap_ready','memory.bootstrap_readiness_intent')
106
+ AND json_extract(payload_json,'$.request_id')=json_extract(b.admission_json,'$.executionScope.requestId')
107
+ AND json_extract(payload_json,'$.project_root')=json_extract(b.admission_json,'$.executionScope.projectRoot')
108
+ AND json_extract(payload_json,'$.workspace_root')=json_extract(b.admission_json,'$.executionScope.workspace')
109
+ AND ((event_type='memory.bootstrap_ready' AND json_extract(payload_json,'$.schema_id')='dd-flow/memory-bootstrap-authority@1')
110
+ OR (event_type='memory.bootstrap_readiness_intent' AND json_extract(payload_json,'$.schema_id')='dd-flow/memory-bootstrap-readiness-intent@1')))))`;
111
+ rules.audit_events = `(${rules.audit_events}) OR (${bootstrapReceipts})`;
112
+ }
113
+ // Batch and composition registration are portable RUN evidence, not a host lease. Keep their
114
+ // independent receipt alongside the selected Works, never a neighboring
115
+ // RUN's receipt merely because it shares the project or names this RUN.
116
+ const batchReceipt = `event_type IN ('work.batch_registration', 'memory.composition_registration', 'memory.review_registration', 'memory.repair_registration', 'memory.second_repair_registration', 'memory.corrected_review_registration')
117
+ AND json_extract(payload_json, '$.run_id') IN (SELECT run_id FROM capture_scope)
118
+ AND json_extract(payload_json, '$.scope.run_id') IN (SELECT run_id FROM capture_scope)
119
+ AND json_extract(payload_json, '$.scope.project_id') IN (SELECT project_id FROM capture_scope)
120
+ AND json_extract(payload_json, '$.scope.parent_work_id') IN (${works})
121
+ AND json_type(payload_json, '$.work_ids') = 'object'
122
+ AND NOT EXISTS (SELECT 1 FROM json_each(payload_json, '$.work_ids') WHERE value NOT IN (${works}))`;
123
+ rules.audit_events = `(${rules.audit_events}) OR (${ownProject} AND (${batchReceipt}))`;
124
+ // Preserve independently admitted repair baselines by actual assigned
125
+ // Work/packet identity. Preservation never substitutes for owner admission.
126
+ const repairBaselineReceipt = `event_type = 'memory.repair_work_baseline'
127
+ AND json_extract(payload_json, '$.schema_id') IN ('dd-flow/memory-repair-work-baseline@2', 'dd-flow/memory-repair-work-baseline@3', 'dd-flow/memory-repair-work-baseline@4', 'dd-flow/memory-repair-work-baseline@5')
128
+ AND json_extract(payload_json, '$.project_id') = project_id
129
+ AND json_extract(payload_json, '$.run_id') IN (SELECT run_id FROM capture_scope)
130
+ AND EXISTS (SELECT 1 FROM works w WHERE w.project_id=audit_events.project_id
131
+ AND w.run_id=json_extract(audit_events.payload_json, '$.run_id')
132
+ AND w.work_id=json_extract(audit_events.payload_json, '$.work_id')
133
+ AND json_extract(w.payload_json, '$.kind')='memory-repair'
134
+ AND json_extract(w.payload_json, '$.memory_repair.packet_sha256')=json_extract(audit_events.payload_json, '$.packet_sha256'))`;
135
+ rules.audit_events = `(${rules.audit_events}) OR (${ownProject} AND (${repairBaselineReceipt}))`;
136
+ // A consumed dependency/peer view is part of the baseline's history. It
137
+ // predates WorkSession start, so do not require a start receipt here.
138
+ const repairCurrentViewReceipt = `event_type='memory.repair_current_view'
139
+ AND json_extract(payload_json,'$.schema_id')='dd-flow/memory-repair-current-view@1'
140
+ AND json_extract(payload_json,'$.project_id')=project_id
141
+ AND json_extract(payload_json,'$.run_id') IN (SELECT run_id FROM capture_scope)
142
+ AND EXISTS (SELECT 1 FROM audit_events b WHERE (${repairBaselineReceipt.replaceAll("audit_events.", "b.")})
143
+ AND b.project_id=audit_events.project_id
144
+ AND json_extract(b.payload_json,'$.schema_id') IN ('dd-flow/memory-repair-work-baseline@3', 'dd-flow/memory-repair-work-baseline@5')
145
+ AND json_extract(b.payload_json,'$.run_id')=json_extract(audit_events.payload_json,'$.run_id')
146
+ AND json_extract(b.payload_json,'$.work_id')=json_extract(audit_events.payload_json,'$.work_id')
147
+ AND json_extract(b.payload_json,'$.generation')=json_extract(audit_events.payload_json,'$.generation')
148
+ AND json_extract(b.payload_json,'$.registration_sha256')=json_extract(audit_events.payload_json,'$.registration_sha256')
149
+ AND json_extract(b.payload_json,'$.current_view_sha256')=json_extract(audit_events.payload_json,'$.view_sha256'))`;
150
+ rules.audit_events = `(${rules.audit_events}) OR (${ownProject} AND (${repairCurrentViewReceipt}))`;
151
+ const repairCopyReceipt = `event_type IN ('memory.repair_writer_copy_intent', 'memory.repair_writer_copy_build', 'memory.repair_writer_copy_ready')
152
+ AND json_extract(payload_json, '$.schema_id')='dd-flow/memory-repair-writer-copy-intent@1'
153
+ AND json_extract(payload_json, '$.project_id')=project_id
154
+ AND json_extract(payload_json, '$.run_id') IN (SELECT run_id FROM capture_scope)
155
+ AND json_extract(payload_json, '$.work_id') IN (${works})
156
+ AND EXISTS (SELECT 1 FROM audit_events b JOIN works w
157
+ ON w.project_id=b.project_id AND w.run_id=json_extract(b.payload_json, '$.run_id')
158
+ AND w.work_id=json_extract(b.payload_json, '$.work_id')
159
+ WHERE b.project_id=audit_events.project_id AND b.event_type='memory.repair_work_baseline'
160
+ AND json_extract(b.payload_json, '$.schema_id') IN ('dd-flow/memory-repair-work-baseline@2', 'dd-flow/memory-repair-work-baseline@3', 'dd-flow/memory-repair-work-baseline@4', 'dd-flow/memory-repair-work-baseline@5')
161
+ AND json_extract(b.payload_json, '$.project_id')=b.project_id
162
+ AND json_extract(b.payload_json, '$.run_id')=json_extract(audit_events.payload_json, '$.run_id')
163
+ AND json_extract(b.payload_json, '$.work_id')=json_extract(audit_events.payload_json, '$.work_id')
164
+ AND json_extract(b.payload_json, '$.generation')=json_extract(audit_events.payload_json, '$.generation')
165
+ AND json_extract(b.payload_json, '$.workspace_root')=json_extract(audit_events.payload_json, '$.source_root')
166
+ AND json_extract(w.payload_json, '$.kind')='memory-repair'
167
+ AND json_extract(w.payload_json, '$.memory_repair.packet_sha256')=json_extract(b.payload_json, '$.packet_sha256'))`;
168
+ rules.audit_events = `(${rules.audit_events}) OR (${ownProject} AND (${repairCopyReceipt}))`;
169
+ // Retain start evidence by relational WorkSession/physical Session and
170
+ // baseline generation. Export is preservation, never start admission.
171
+ const repairStartReceipt = `event_type='memory.repair_work_start'
172
+ AND json_extract(payload_json, '$.schema_id')='dd-flow/memory-repair-start@1'
173
+ AND json_extract(payload_json, '$.project_id')=project_id
174
+ AND json_extract(payload_json, '$.run_id') IN (SELECT run_id FROM capture_scope)
175
+ AND EXISTS (SELECT 1 FROM works w JOIN work_sessions ws ON ws.work_id=w.work_id
176
+ JOIN sessions s ON s.project_id=w.project_id AND s.session_id=ws.session_id
177
+ JOIN audit_events b ON b.project_id=w.project_id AND b.event_type='memory.repair_work_baseline'
178
+ WHERE w.project_id=audit_events.project_id AND w.run_id=json_extract(audit_events.payload_json, '$.run_id')
179
+ AND w.work_id=json_extract(audit_events.payload_json, '$.work_id')
180
+ AND json_extract(w.payload_json, '$.kind')='memory-repair'
181
+ AND ws.id=json_extract(audit_events.payload_json, '$.work_session_id')
182
+ AND ws.session_id=json_extract(audit_events.payload_json, '$.session_id')
183
+ AND ws.hook_event_id=json_extract(audit_events.payload_json, '$.hook_event_id')
184
+ AND s.harness=json_extract(audit_events.payload_json, '$.harness')
185
+ AND s.provider_session_id=json_extract(audit_events.payload_json, '$.provider_session_id')
186
+ AND json_extract(b.payload_json, '$.schema_id') IN ('dd-flow/memory-repair-work-baseline@2', 'dd-flow/memory-repair-work-baseline@3', 'dd-flow/memory-repair-work-baseline@4', 'dd-flow/memory-repair-work-baseline@5')
187
+ AND json_extract(b.payload_json, '$.project_id')=w.project_id
188
+ AND json_extract(b.payload_json, '$.run_id')=w.run_id
189
+ AND json_extract(b.payload_json, '$.work_id')=w.work_id
190
+ AND json_extract(b.payload_json, '$.generation')=json_extract(audit_events.payload_json, '$.generation')
191
+ AND json_extract(b.payload_json, '$.packet_sha256')=json_extract(w.payload_json, '$.memory_repair.packet_sha256'))`;
192
+ rules.audit_events = `(${rules.audit_events}) OR (${ownProject} AND (${repairStartReceipt}))`;
193
+ const nativeRepairBinding = `event_type='memory.repair_native_binding'
194
+ AND json_extract(payload_json,'$.schema_id')='dd-flow/memory-repair-native-binding@1'
195
+ AND json_extract(payload_json,'$.project_id')=project_id
196
+ AND json_extract(payload_json,'$.run_id') IN (SELECT run_id FROM capture_scope)
197
+ AND EXISTS (SELECT 1 FROM works w JOIN work_sessions ws ON ws.work_id=w.work_id
198
+ JOIN sessions s ON s.project_id=w.project_id AND s.session_id=ws.session_id
199
+ JOIN hook_events he ON he.project_id=w.project_id AND he.event_key=ws.hook_event_id
200
+ WHERE w.project_id=audit_events.project_id AND w.run_id=json_extract(audit_events.payload_json,'$.run_id')
201
+ AND w.work_id=json_extract(audit_events.payload_json,'$.work_id')
202
+ AND json_extract(w.payload_json,'$.kind')='memory-repair'
203
+ AND ws.id=json_extract(audit_events.payload_json,'$.work_session_id')
204
+ AND he.event_key=json_extract(audit_events.payload_json,'$.hook_event_key') AND he.status='claimed'
205
+ AND he.session_id=ws.session_id AND s.provider_session_id=json_extract(audit_events.payload_json,'$.binding.provider_session_id')
206
+ AND he.parent_session_id=json_extract(audit_events.payload_json,'$.parent_session_id'))`;
207
+ rules.audit_events = `(${rules.audit_events}) OR (${ownProject} AND (${nativeRepairBinding}))`;
208
+ const nativeReviewCopy = `event_type IN ('memory.native_review_copy_intent','memory.native_review_copy_ready')
209
+ AND COALESCE(json_extract(payload_json,'$.run_id'),json_extract(payload_json,'$.intent.run_id')) IN (SELECT run_id FROM capture_scope)
210
+ AND EXISTS (SELECT 1 FROM works w WHERE w.project_id=audit_events.project_id
211
+ AND w.run_id=COALESCE(json_extract(audit_events.payload_json,'$.run_id'),json_extract(audit_events.payload_json,'$.intent.run_id'))
212
+ AND w.work_id=COALESCE(json_extract(audit_events.payload_json,'$.work_id'),json_extract(audit_events.payload_json,'$.intent.work_id'))
213
+ AND json_extract(w.payload_json,'$.kind')='memory-review')`;
214
+ const nativeReviewBinding = `event_type='memory.native_review_binding'
215
+ AND json_extract(payload_json,'$.run_id') IN (SELECT run_id FROM capture_scope)
216
+ AND EXISTS (SELECT 1 FROM works w JOIN work_sessions ws ON ws.work_id=w.work_id
217
+ JOIN sessions s ON s.project_id=w.project_id AND s.session_id=ws.session_id
218
+ JOIN hook_events he ON he.project_id=w.project_id AND he.event_key=ws.hook_event_id
219
+ WHERE w.project_id=audit_events.project_id AND w.run_id=json_extract(audit_events.payload_json,'$.run_id')
220
+ AND w.work_id=json_extract(audit_events.payload_json,'$.work_id') AND json_extract(w.payload_json,'$.kind')='memory-review'
221
+ AND ws.id=json_extract(audit_events.payload_json,'$.work_session_id') AND he.status='claimed'
222
+ AND he.event_key=json_extract(audit_events.payload_json,'$.hook_event_key') AND he.session_id=ws.session_id
223
+ AND s.provider_session_id=json_extract(audit_events.payload_json,'$.provider_session_id'))`;
224
+ rules.audit_events = `(${rules.audit_events}) OR (${ownProject} AND ((${nativeReviewCopy}) OR (${nativeReviewBinding})))`;
225
+ // Keep publication/settlement evidence only with the selected relational
226
+ // start and baseline. Export preserves bytes, never admits their hashes,
227
+ // physical effects or semantic correctness on restoration.
228
+ const repairPublicationSchemas = [
229
+ ["memory.repair_publication_source", "dd-flow/memory-repair-publication-source@1"],
230
+ ["memory.repair_publication_intent", "dd-flow/memory-repair-publication-intent@1"],
231
+ ["memory.repair_publication_intent", "dd-flow/memory-repair-publication-intent@2"],
232
+ ["memory.repair_publication_action_intent", "dd-flow/memory-repair-publication-action-intent@1"],
233
+ ["memory.repair_publication_staging_build", "dd-flow/memory-repair-publication-staging@1"],
234
+ ["memory.repair_publication_staging_ready", "dd-flow/memory-repair-publication-staging@1"],
235
+ ["memory.repair_publication_file_ready", "dd-flow/memory-repair-publication-file-ready@1"],
236
+ ["memory.repair_publication_directory_ready", "dd-flow/memory-repair-publication-directory-ready@1"],
237
+ ["memory.repair_publication_action_complete", "dd-flow/memory-repair-publication-action-complete@1"],
238
+ ["memory.repair_publication_complete", "dd-flow/memory-repair-publication-complete@1"],
239
+ ["memory.repair_work_settlement", "dd-flow/memory-repair-work-settlement@1"],
240
+ ];
241
+ const repairPublicationReceipt = `(${repairPublicationSchemas.map(([event, schema]) => `(event_type='${event}' AND json_extract(payload_json,'$.schema_id')='${schema}')`).join(" OR ")})
242
+ AND json_extract(payload_json,'$.project_id')=project_id
243
+ AND json_extract(payload_json,'$.run_id') IN (SELECT run_id FROM capture_scope)
244
+ AND EXISTS (SELECT 1 FROM audit_events a WHERE (${repairStartReceipt.replaceAll("audit_events.", "a.")})
245
+ AND a.project_id=audit_events.project_id
246
+ AND json_extract(a.payload_json,'$.run_id')=json_extract(audit_events.payload_json,'$.run_id')
247
+ AND json_extract(a.payload_json,'$.work_id')=json_extract(audit_events.payload_json,'$.work_id')
248
+ AND json_extract(a.payload_json,'$.generation')=json_extract(audit_events.payload_json,'$.generation')
249
+ AND json_extract(a.payload_json,'$.work_session_id')=json_extract(audit_events.payload_json,'$.work_session_id'))`;
250
+ rules.audit_events = `(${rules.audit_events}) OR (${ownProject} AND (${repairPublicationReceipt}))`;
251
+ const coordinatorReceipt = `event_type = 'stage.coordinator_binding'
252
+ AND json_extract(payload_json, '$.run_id') IN (SELECT run_id FROM capture_scope)
253
+ AND json_extract(payload_json, '$.scope.run_id') = json_extract(payload_json, '$.run_id')
254
+ AND json_extract(payload_json, '$.scope.project_id') = project_id
255
+ AND json_extract(payload_json, '$.work_id') IN (${works})
256
+ AND EXISTS (SELECT 1 FROM work_sessions ws WHERE ws.id = json_extract(payload_json, '$.work_session_id')
257
+ AND ws.work_id = json_extract(payload_json, '$.work_id') AND ws.session_id = json_extract(payload_json, '$.session_id'))
258
+ AND json_extract(payload_json, '$.session_id') IN (${sessions})`;
259
+ rules.audit_events = `(${rules.audit_events}) OR (${ownProject} AND (${coordinatorReceipt}))`;
260
+ const descriptorRootReceipt = `event_type = 'flow_run.descriptor_root_work'
261
+ AND json_extract(payload_json, '$.run_id') IN (SELECT run_id FROM capture_scope)
262
+ AND json_extract(payload_json, '$.binding.runId') = json_extract(payload_json, '$.run_id')
263
+ AND json_extract(payload_json, '$.binding.projectId') = project_id
264
+ AND json_extract(payload_json, '$.work_id') IN (${works})
265
+ AND EXISTS (SELECT 1 FROM runs r JOIN works w ON w.project_id=r.project_id AND w.run_id=r.id
266
+ WHERE r.project_id=audit_events.project_id AND r.id=json_extract(audit_events.payload_json, '$.run_id')
267
+ AND w.work_id=json_extract(audit_events.payload_json, '$.work_id') AND w.parent_work_id IS NULL
268
+ AND json_extract(r.index_json, '$.root_work_id')=w.work_id)`;
269
+ const descriptorCoordinatorReceipt = `event_type = 'flow_run.descriptor_coordinator'
270
+ AND json_extract(payload_json, '$.run_id') IN (SELECT run_id FROM capture_scope)
271
+ AND json_extract(payload_json, '$.binding.runId') = json_extract(payload_json, '$.run_id')
272
+ AND json_extract(payload_json, '$.binding.projectId') = project_id
273
+ AND json_extract(payload_json, '$.work_id') IN (${works})
274
+ AND EXISTS (SELECT 1 FROM stage_work_memberships m WHERE m.project_id=audit_events.project_id
275
+ AND m.run_id=json_extract(audit_events.payload_json, '$.run_id') AND m.work_id=json_extract(audit_events.payload_json, '$.work_id')
276
+ AND m.stage=json_extract(audit_events.payload_json, '$.stage') AND m.attempt=json_extract(audit_events.payload_json, '$.binding.attempt'))`;
277
+ rules.audit_events = `(${rules.audit_events}) OR (${ownProject} AND ((${descriptorRootReceipt}) OR (${descriptorCoordinatorReceipt})))`;
278
+ const descriptorSettlementReceipt = `event_type = 'flow_run.descriptor_stage_settlement'
279
+ AND json_extract(payload_json, '$.run_id') IN (SELECT run_id FROM capture_scope)
280
+ AND json_extract(payload_json, '$.work_id') IN (${works})
281
+ AND EXISTS (SELECT 1 FROM stage_work_memberships m JOIN work_sessions ws ON ws.work_id=m.work_id
282
+ WHERE m.project_id=audit_events.project_id AND m.run_id=json_extract(audit_events.payload_json, '$.run_id')
283
+ AND m.work_id=json_extract(audit_events.payload_json, '$.work_id') AND m.stage=json_extract(audit_events.payload_json, '$.stage')
284
+ AND m.attempt=json_extract(audit_events.payload_json, '$.binding.attempt')
285
+ AND ws.id=json_extract(audit_events.payload_json, '$.work_session_id'))`;
286
+ rules.audit_events = `(${rules.audit_events}) OR (${ownProject} AND (${descriptorSettlementReceipt}))`;
287
+ const memoryVerificationReceipt = `event_type = 'memory.verification_acceptance'
288
+ AND json_extract(payload_json, '$.run_id') IN (SELECT run_id FROM capture_scope)
289
+ AND json_extract(payload_json, '$.project_id') = project_id
290
+ AND json_extract(payload_json, '$.schema_id') = 'dd-flow/memory-verification-acceptance@1'
291
+ AND json_extract(payload_json, '$.stage') = 'verify'
292
+ AND EXISTS (SELECT 1 FROM runs r, json_each(r.index_json, '$.stage_runs') s
293
+ WHERE r.project_id=audit_events.project_id AND r.id=json_extract(payload_json, '$.run_id')
294
+ AND json_extract(s.value, '$.stage')='verify' AND json_extract(s.value, '$.status')='done'
295
+ AND json_extract(s.value, '$.attempt')=json_extract(payload_json, '$.attempt')
296
+ AND json_extract(s.value, '$.input_sha256')=json_extract(payload_json, '$.input_sha256')
297
+ AND json_extract(s.value, '$.data_sha256')=json_extract(payload_json, '$.result_sha256'))`;
298
+ rules.audit_events = `(${rules.audit_events}) OR (${ownProject} AND (${memoryVerificationReceipt}))`;
299
+ // Preservation only, not admission: reconnect independently restores the
300
+ // corrected view, owning policy and exact passed check rows.
301
+ const memoryCorrectionCheckReceipt = `event_type = 'memory.correction_checks'
302
+ AND json_extract(payload_json, '$.run_id') IN (SELECT run_id FROM capture_scope)
303
+ AND json_extract(payload_json, '$.project_id') = project_id
304
+ AND json_extract(payload_json, '$.schema_id') = 'dd-flow/memory-correction-checks@1'
305
+ AND json_extract(payload_json, '$.wave') IN (1, 2)
306
+ AND json_type(payload_json, '$.checks') = 'array'
307
+ AND json_array_length(payload_json, '$.checks') BETWEEN 1 AND 4096
308
+ AND EXISTS (SELECT 1 FROM runs r, json_each(r.index_json, '$.stage_runs') s
309
+ WHERE r.project_id=audit_events.project_id AND r.id=json_extract(payload_json, '$.run_id')
310
+ AND json_extract(s.value, '$.stage')='review'
311
+ AND json_extract(s.value, '$.input_sha256')=json_extract(payload_json, '$.review_input_sha256'))
312
+ AND NOT EXISTS (SELECT 1 FROM json_each(payload_json, '$.checks') c
313
+ WHERE NOT EXISTS (SELECT 1 FROM check_receipts cr WHERE cr.project_id=audit_events.project_id
314
+ AND cr.run_id=json_extract(audit_events.payload_json, '$.run_id') AND cr.id=json_extract(c.value, '$.id')))`;
315
+ rules.audit_events = `(${rules.audit_events}) OR (${ownProject} AND (${memoryCorrectionCheckReceipt}))`;
316
+ // Retain independently accepted review receipts only for the exact closed
317
+ // Stage and allocated reviewers. This is preservation, not replay admission.
318
+ const memoryReviewReceipt = `((event_type = 'memory.review_acceptance'
319
+ AND json_extract(payload_json, '$.schema_id') = 'dd-flow/memory-review-acceptance@1'
320
+ AND json_extract(payload_json, '$.wave') = 0)
321
+ OR (event_type = 'memory.corrected_review_acceptance'
322
+ AND json_extract(payload_json, '$.schema_id') = 'dd-flow/memory-corrected-review-acceptance@1'
323
+ AND (json_extract(payload_json, '$.wave') = 1
324
+ OR (json_extract(payload_json, '$.wave') = 2
325
+ AND json_type(payload_json, '$.first_review_proof_sha256') = 'text'
326
+ AND length(json_extract(payload_json, '$.first_review_proof_sha256')) = 64
327
+ AND json_extract(payload_json, '$.first_review_proof_sha256') NOT GLOB '*[^0-9a-f]*'))))
328
+ AND json_extract(payload_json, '$.run_id') IN (SELECT run_id FROM capture_scope)
329
+ AND json_extract(payload_json, '$.project_id') = project_id
330
+ AND json_extract(payload_json, '$.stage') = 'review'
331
+ AND json_extract(payload_json, '$.registration_scope.project_id') = project_id
332
+ AND json_extract(payload_json, '$.registration_scope.run_id') = json_extract(payload_json, '$.run_id')
333
+ AND json_extract(payload_json, '$.registration_scope.stage') = 'review'
334
+ AND json_extract(payload_json, '$.registration_scope.attempt') = json_extract(payload_json, '$.attempt')
335
+ AND json_extract(payload_json, '$.registration_scope.input_sha256') = json_extract(payload_json, '$.input_sha256')
336
+ AND json_extract(payload_json, '$.registration_scope.parent_work_id') IN (${works})
337
+ AND json_type(payload_json, '$.workers') = 'array'
338
+ AND json_array_length(payload_json, '$.workers') BETWEEN 0 AND 256
339
+ AND (json_extract(payload_json, '$.wave') = 0 OR json_array_length(payload_json, '$.workers') > 0)
340
+ AND NOT EXISTS (SELECT 1 FROM json_each(payload_json, '$.workers') worker
341
+ WHERE NOT EXISTS (SELECT 1 FROM works w WHERE w.project_id=audit_events.project_id
342
+ AND w.run_id=json_extract(audit_events.payload_json, '$.run_id')
343
+ AND w.work_id=json_extract(worker.value, '$.work_id')))
344
+ AND EXISTS (SELECT 1 FROM runs r, json_each(r.index_json, '$.stage_runs') s
345
+ WHERE r.project_id=audit_events.project_id AND r.id=json_extract(payload_json, '$.run_id')
346
+ AND json_extract(s.value, '$.stage')='review' AND json_extract(s.value, '$.status')='done'
347
+ AND json_extract(s.value, '$.attempt')=json_extract(payload_json, '$.attempt')
348
+ AND json_extract(s.value, '$.input_sha256')=json_extract(payload_json, '$.input_sha256')
349
+ AND json_extract(s.value, '$.data_sha256')=json_extract(payload_json, '$.result_sha256'))`;
350
+ rules.audit_events = `(${rules.audit_events}) OR (${ownProject} AND (${memoryReviewReceipt}))`;
351
+ // Terminal evidence precedes Stage/RUN acceptance. Preserve only the
352
+ // selected MB bundle, exact finish input and independently closed review.
353
+ // Packet bytes remain under the existing Stage packet preservation rule.
354
+ const memoryFinishEvidence = `event_type='memory.finish_evidence'
355
+ AND json_extract(payload_json,'$.schema_id')='dd-flow/memory-finish-evidence@1'
356
+ AND json_extract(payload_json,'$.project_id')=project_id
357
+ AND json_extract(payload_json,'$.run_id') IN (SELECT run_id FROM capture_scope)
358
+ AND json_extract(payload_json,'$.stage')='finish'
359
+ AND json_type(payload_json,'$.readiness_sha256')='text'
360
+ AND length(json_extract(payload_json,'$.readiness_sha256'))=64
361
+ AND json_extract(payload_json,'$.readiness_sha256') NOT GLOB '*[^0-9a-f]*'
362
+ AND EXISTS (SELECT 1 FROM runs r,json_each(r.index_json,'$.stage_runs') f,json_each(r.index_json,'$.stage_runs') v
363
+ WHERE r.project_id=audit_events.project_id AND r.id=json_extract(audit_events.payload_json,'$.run_id')
364
+ AND json_extract(r.index_json,'$.execution_bundle.flow_id')='mb-init'
365
+ AND json_extract(r.index_json,'$.execution_bundle.manifest_sha256')=json_extract(audit_events.payload_json,'$.bundle_sha256')
366
+ AND json_extract(f.value,'$.stage')='finish'
367
+ AND json_extract(f.value,'$.attempt')=json_extract(audit_events.payload_json,'$.attempt')
368
+ AND json_extract(f.value,'$.input_sha256')=json_extract(audit_events.payload_json,'$.input_sha256')
369
+ AND json_extract(v.value,'$.stage')='review' AND json_extract(v.value,'$.status')='done'
370
+ AND json_extract(v.value,'$.data_sha256')=json_extract(audit_events.payload_json,'$.review_sha256'))`;
371
+ rules.audit_events = `(${rules.audit_events}) OR (${ownProject} AND (${memoryFinishEvidence}))`;
372
+ const memoryFinishAcceptance = `event_type='memory.finish_acceptance'
373
+ AND json_extract(payload_json,'$.schema_id')='dd-flow/memory-finish-acceptance@1'
374
+ AND json_extract(payload_json,'$.project_id')=project_id
375
+ AND json_extract(payload_json,'$.run_id') IN (SELECT run_id FROM capture_scope)
376
+ AND json_extract(payload_json,'$.stage')='finish'
377
+ AND json_type(payload_json,'$.evidence_sha256')='text'
378
+ AND length(json_extract(payload_json,'$.evidence_sha256'))=64
379
+ AND json_extract(payload_json,'$.evidence_sha256') NOT GLOB '*[^0-9a-f]*'
380
+ AND EXISTS (SELECT 1 FROM runs r,json_each(r.index_json,'$.stage_runs') f
381
+ WHERE r.project_id=audit_events.project_id AND r.id=json_extract(audit_events.payload_json,'$.run_id')
382
+ AND json_extract(r.index_json,'$.execution_bundle.flow_id')='mb-init'
383
+ AND json_extract(r.index_json,'$.execution_bundle.manifest_sha256')=json_extract(audit_events.payload_json,'$.bundle_sha256')
384
+ AND json_extract(f.value,'$.stage')='finish' AND json_extract(f.value,'$.status')='done'
385
+ AND json_extract(f.value,'$.attempt')=json_extract(audit_events.payload_json,'$.attempt')
386
+ AND json_extract(f.value,'$.input_sha256')=json_extract(audit_events.payload_json,'$.input_sha256')
387
+ AND json_extract(f.value,'$.data_schema_id')='dd-flow/mb-init-finish-result@1'
388
+ AND json_extract(f.value,'$.data_sha256')=json_extract(audit_events.payload_json,'$.result_sha256'))`;
389
+ rules.audit_events = `(${rules.audit_events}) OR (${ownProject} AND (${memoryFinishAcceptance}))`;
390
+ const descriptorRunSettlementReceipt = `event_type = 'flow_run.descriptor_run_settlement'
391
+ AND json_extract(payload_json, '$.run_id') IN (SELECT run_id FROM capture_scope)
392
+ AND EXISTS (SELECT 1 FROM works w WHERE w.project_id=audit_events.project_id
393
+ AND w.run_id=json_extract(audit_events.payload_json, '$.run_id')
394
+ AND w.work_id=json_extract(audit_events.payload_json, '$.work_id') AND w.parent_work_id IS NULL)`;
395
+ rules.audit_events = `(${rules.audit_events}) OR (${ownProject} AND (${descriptorRunSettlementReceipt}))`;
396
+ // Exact packet/report bytes remain predecessor and restart custody. A
397
+ // selected RUN's receipts have no protocol_id and must not be discarded.
398
+ const stageReceipt = `event_type IN ('flow_run.stage_packet', 'flow_run.stage_report', 'flow_run.descriptor_stage_start')
399
+ AND json_extract(payload_json, '$.run_id') IN (SELECT run_id FROM capture_scope)
400
+ AND EXISTS (SELECT 1 FROM runs r, json_each(r.index_json, '$.stage_runs') s
401
+ WHERE r.project_id = audit_events.project_id AND r.id = json_extract(payload_json, '$.run_id')
402
+ AND json_extract(s.value, '$.stage') = json_extract(payload_json, '$.stage'))`;
403
+ rules.audit_events = `(${rules.audit_events}) OR (${ownProject} AND (${stageReceipt}))`;
404
+ const startReceipt = `event_type IN ('flow_run.start_request', 'flow_run.start_root_owned', 'flow_run.start_published')
405
+ AND json_extract(payload_json, '$.run_id') IN (SELECT run_id FROM capture_scope)
406
+ AND EXISTS (SELECT 1 FROM runs r WHERE r.project_id = audit_events.project_id AND r.id = json_extract(payload_json, '$.run_id')
407
+ AND json_extract(r.index_json, '$.start_request.request_id') = json_extract(payload_json, '$.request_id'))`;
408
+ rules.audit_events = `(${rules.audit_events}) OR (${ownProject} AND (${startReceipt}))`;
409
+ for (const table of ["run_controller_events", "run_controller_operations"])
410
+ rules[table] = `controller_id IN (SELECT controller_id FROM run_controllers WHERE ${ownRun})`;
411
+ for (const table of ["run_control_admissions", "run_control_stage_admissions", "run_control_operations", "run_control_workers"])
412
+ rules[table] = `control_id IN (SELECT control_id FROM run_controls WHERE ${ownRun})`;
413
+ const tables = db.prepare("SELECT name FROM sqlite_schema WHERE type = 'table'").all();
414
+ const quote = (name) => `"${name.replaceAll('"', '""')}"`;
415
+ // Evaluate every relationship before deleting parents, including historical bindings.
416
+ for (const { name } of tables) {
417
+ const predicate = rules[name];
418
+ if (predicate === undefined && db.prepare(`SELECT 1 FROM ${quote(name)} LIMIT 1`).get())
419
+ throw new AppError("snapshot_scope_unknown", "Recovery export has no scope rule for a populated table", 1, { table: name });
420
+ db.exec(`CREATE TEMP TABLE ${quote(`keep_${name}`)} AS SELECT rowid AS retained_id FROM ${quote(name)} WHERE ${predicate ?? "0"}`);
421
+ }
422
+ for (const { name } of tables)
423
+ db.exec(`DELETE FROM ${quote(name)} WHERE rowid NOT IN (SELECT retained_id FROM ${quote(`keep_${name}`)})`);
424
+ const issues = db.prepare("PRAGMA foreign_key_check").all();
425
+ if (issues.length)
426
+ throw new AppError("snapshot_scope_inconsistent", "Scoped recovery export has unresolved relational references", 1, { issues });
427
+ db.exec("COMMIT");
428
+ held = false;
429
+ db.exec("VACUUM");
430
+ complete = true;
431
+ }
432
+ catch (error) {
433
+ primary = error;
434
+ failed = true;
435
+ }
436
+ const cleanup = cleanupScopeWriters([{ name: output, db, rollback: held, close: "always" }]);
437
+ if (!complete) {
438
+ try {
439
+ fs.rmSync(output, { force: true });
440
+ }
441
+ catch (error) {
442
+ cleanup.push({ target: output, phase: "remove_incomplete_output", message: String(error), error: errorRecord(error) });
443
+ }
444
+ }
445
+ if (failed || cleanup.length) {
446
+ if (primary instanceof AppError) {
447
+ if (cleanup.length)
448
+ primary.details.snapshot_cleanup_errors = cleanup;
449
+ throw primary;
450
+ }
451
+ throw new AppError("snapshot_database_failed", primary instanceof Error ? primary.message : "Snapshot database cleanup failed", 1, { ...(failed ? { cause: errorRecord(primary) } : {}), snapshot_cleanup_errors: cleanup });
452
+ }
453
+ }
454
+ /** Validate retained allocation against the same consistent SQL copy. This
455
+ * preserves evidence only; absolute filesystem/engine paths are not relocated.
456
+ */
457
+ function assertCapturedStartAuthority(db, projectId, runId) {
458
+ const marker = JSON.parse(db.prepare("SELECT index_json FROM runs WHERE project_id = ? AND id = ?").get(projectId, runId).index_json)?.start_request;
459
+ const hasTable = db.prepare("SELECT 1 FROM sqlite_schema WHERE type = 'table' AND name = 'run_start_requests'").get();
460
+ const row = hasTable ? db.prepare("SELECT request_id FROM run_start_requests WHERE project_id = ? AND run_id = ?").get(projectId, runId) : undefined;
461
+ const audit = db.prepare("SELECT json_extract(payload_json, '$.request_id') AS request_id FROM audit_events WHERE project_id = ? AND event_type = 'flow_run.start_request' AND json_extract(payload_json, '$.run_id') = ? LIMIT 1").get(projectId, runId);
462
+ if (!marker && !row && !audit)
463
+ return;
464
+ if (!marker || !row || !audit || marker.request_id !== row.request_id || row.request_id !== audit.request_id)
465
+ throw new AppError("snapshot_start_authority_invalid", "Captured RUN is missing its independent allocation evidence", 1);
466
+ // Adapt the read-only query surface, never open or migrate another store.
467
+ const context = { db: {
468
+ readSnapshot: (operation) => operation(), // The copied database writer already pins this snapshot.
469
+ get: (sql, parameters = []) => db.prepare(sql).get(...parameters),
470
+ all: (sql, parameters = []) => db.prepare(sql).all(...parameters)
471
+ } };
472
+ const retained = readRunStartRequest(context, projectId, row.request_id);
473
+ if (retained?.payload.initial_index.execution_bundle?.flow_id === "mb-init") {
474
+ const p = retained.payload;
475
+ // This adapter supplies only SQL reads; the reservation/readiness readers
476
+ // must not access a host home or physical engine during capture.
477
+ const allocation = readMemoryInitRunAllocation(context, { requestId: p.request_id, projectRoot: p.project_root, workspaceRoot: p.workspace_root });
478
+ if (!allocation || allocation.project_id !== projectId || allocation.run_id !== runId)
479
+ throw new AppError("snapshot_start_authority_invalid", "Captured memory RUN is missing its request-bound identity reservation", 1);
480
+ if (db.prepare(`SELECT 1 FROM audit_events WHERE event_type IN ('memory.init_startup_input','memory.init_startup_input_intent')
481
+ AND json_extract(payload_json,'$.scope.requestId')=? AND json_extract(payload_json,'$.scope.projectRoot')=? LIMIT 1`).get(p.request_id, p.project_root)) {
482
+ readMemoryInitStartupInput(context, { requestId: p.request_id, projectRoot: p.project_root, workspaceRoot: p.workspace_root });
483
+ }
484
+ }
485
+ }
486
+ /** Check the consistent copied database, not a racy earlier read of the live
487
+ * store. Legacy evidence gains no descriptor or filesystem admission here.
488
+ */
489
+ function assertCapturedBundleAuthority(db, projectId, runId) {
490
+ const run = db.prepare("SELECT index_json FROM runs WHERE project_id = ? AND id = ?").get(projectId, runId);
491
+ const hasTable = db.prepare("SELECT 1 FROM sqlite_schema WHERE type = 'table' AND name = 'run_bundle_authorities'").get();
492
+ const row = hasTable ? db.prepare("SELECT manifest_sha256, admission_json FROM run_bundle_authorities WHERE project_id = ? AND run_id = ?").get(projectId, runId) : undefined;
493
+ const invalid = () => { throw new AppError("snapshot_bundle_authority_invalid", "Captured RUN bundle anchor and independent authority disagree", 1); };
494
+ let anchor;
495
+ try {
496
+ anchor = JSON.parse(run.index_json)?.execution_bundle;
497
+ }
498
+ catch {
499
+ if (row)
500
+ invalid();
501
+ return;
502
+ }
503
+ if (anchor === undefined) {
504
+ if (row)
505
+ invalid();
506
+ return;
507
+ }
508
+ if (!anchor || anchor.schema_id !== "dd-flow/run-execution-bundle@1" || !row
509
+ || [anchor.manifest_sha256, anchor.descriptor_sha256, anchor.admission_sha256].some(value => typeof value !== "string" || !/^[a-f0-9]{64}$/.test(value))
510
+ || typeof anchor.flow_id !== "string" || !anchor.flow_id || row.manifest_sha256 !== anchor.manifest_sha256
511
+ || Buffer.byteLength(row.admission_json, "utf8") > 1024 * 1024)
512
+ invalid();
513
+ try {
514
+ const retained = JSON.parse(row.admission_json);
515
+ if (retained.runId !== runId || hybridDigest(retained) !== anchor.admission_sha256)
516
+ invalid();
517
+ }
518
+ catch {
519
+ invalid();
520
+ }
521
+ }
522
+ /** Physical leases are evidence, not authority to resurrect on another host. */
523
+ export function readRecoveryResourceEvidence(resourceHome, projectId, runId, authority) {
524
+ const file = path.join(resourceHome, "runtime.sqlite");
525
+ const scope = { schema_id: "dd-flow/recovery-resource-evidence@1", source_home: resourceHome, dd_flow_home: authority.ddFlowHome, project_id: projectId, run_id: runId };
526
+ if (!fs.existsSync(file))
527
+ return { ...scope, database_present: false, processes: [], resources: [] };
528
+ const db = new DatabaseSync(file, { readOnly: true });
529
+ let held = false, failed = false, primary, result;
530
+ try {
531
+ db.exec("PRAGMA busy_timeout = 4000; BEGIN");
532
+ held = true;
533
+ const candidates = db.prepare("SELECT * FROM managed_processes WHERE project_id = ? AND run_id = ? ORDER BY id").all(projectId, runId).map(record => ({ record, home: managedProcessRuntimeHome(record, authority) }));
534
+ if (candidates.some(item => item.home === null))
535
+ throw new AppError("snapshot_resource_scope_unproven", "A retained process has no proven runtime-home identity", 1, { resource_home: resourceHome });
536
+ const processes = candidates.filter(item => item.home === authority.ddFlowHome).map(item => item.record);
537
+ const ids = new Set(processes.map(record => record.id)), owners = new Set(processes.map(record => record.owner_id));
538
+ const resources = db.prepare("SELECT r.* FROM managed_resources r JOIN managed_processes p ON p.id = r.process_id WHERE p.project_id = ? AND p.run_id = ? ORDER BY r.resource_kind, r.resource_key").all(projectId, runId).filter(row => typeof row.process_id === "string" && ids.has(row.process_id));
539
+ const unbound = db.prepare("SELECT owner_id FROM managed_resources WHERE process_id IS NULL AND owner_id IN (SELECT owner_id FROM managed_processes WHERE project_id = ? AND run_id = ?)").all(projectId, runId).some(row => typeof row.owner_id === "string" && owners.has(row.owner_id));
540
+ if (unbound)
541
+ throw new AppError("snapshot_resource_scope_unproven", "A retained resource has no process binding proving its RUN scope", 1, { resource_home: resourceHome });
542
+ db.exec("COMMIT");
543
+ held = false;
544
+ result = { ...scope, database_present: true, processes, resources };
545
+ }
546
+ catch (error) {
547
+ primary = error;
548
+ failed = true;
549
+ }
550
+ const cleanup = cleanupScopeWriters([{ name: file, db, rollback: held, close: "always" }]);
551
+ if (failed || cleanup.length) {
552
+ if (primary instanceof AppError) {
553
+ if (cleanup.length)
554
+ primary.details.snapshot_cleanup_errors = cleanup;
555
+ throw primary;
556
+ }
557
+ throw new AppError("snapshot_resource_evidence_failed", primary instanceof Error ? primary.message : "Resource evidence cleanup failed", 1, { ...(failed ? { cause: errorRecord(primary) } : {}), snapshot_cleanup_errors: cleanup });
558
+ }
559
+ return result;
560
+ }
@@ -0,0 +1,52 @@
1
+ import { gzipSync } from "node:zlib";
2
+ import { createHash } from "node:crypto";
3
+ import { AppError } from "../shared/errors.js";
4
+ import { inspectReleaseArchive } from "./release-archive.js";
5
+ /** Deterministic regular-file-only tar/gzip. Extraction admission is also applied
6
+ * to producer output; producing bytes never grants them installation authority.
7
+ */
8
+ export function produceReleaseArchive(files) {
9
+ const refuse = () => { throw new AppError("release_producer", "Archive production refused", 1, { reason: "invalid_archive_input", effect: "no_effect" }); };
10
+ if (!files.length || files.length > 100_000)
11
+ refuse();
12
+ const chunks = [];
13
+ let expanded = 1024;
14
+ const append = (name, bytes, mode, type) => {
15
+ expanded += 512 + Math.ceil(bytes.length / 512) * 512;
16
+ if (expanded > 512 * 1024 * 1024)
17
+ refuse();
18
+ const header = Buffer.alloc(512);
19
+ header.write(name);
20
+ header.write(mode.toString(8).padStart(7, "0") + "\0", 100);
21
+ header.write("0000000\0", 108);
22
+ header.write("0000000\0", 116);
23
+ header.write(bytes.length.toString(8).padStart(11, "0") + "\0", 124);
24
+ header.write("00000000000\0", 136);
25
+ header.fill(32, 148, 156);
26
+ header[156] = type;
27
+ header.write("ustar\0", 257);
28
+ header.write("00", 263);
29
+ header.write(header.reduce((sum, byte) => sum + byte, 0).toString(8).padStart(6, "0") + "\0 ", 148);
30
+ chunks.push(header, bytes, Buffer.alloc((512 - bytes.length % 512) % 512));
31
+ };
32
+ let index = 0;
33
+ for (const file of [...files].sort((a, b) => Buffer.compare(Buffer.from(a.path), Buffer.from(b.path)))) {
34
+ const length = Buffer.byteLength(file.path);
35
+ if (!length || length > 4096 || !Buffer.isBuffer(file.bytes) || typeof file.executable !== "boolean")
36
+ refuse();
37
+ let name = file.path;
38
+ if (length > 100) {
39
+ const record = `path=${file.path}\n`;
40
+ let size = Buffer.byteLength(record) + 2;
41
+ while (size !== Buffer.byteLength(record) + String(size).length + 1)
42
+ size = Buffer.byteLength(record) + String(size).length + 1;
43
+ append(`PaxHeaders/${index}`, Buffer.from(`${size} ${record}`), 0o644, 120);
44
+ name = `entries/${index}`;
45
+ }
46
+ append(name, file.bytes, file.executable ? 0o755 : 0o644, 48);
47
+ index++;
48
+ }
49
+ const bytes = gzipSync(Buffer.concat([...chunks, Buffer.alloc(1024)]), { level: 9 });
50
+ inspectReleaseArchive({ url: "https://producer.invalid/archive", bytes: bytes.length, sha256: createHash("sha256").update(bytes).digest("hex") }, bytes);
51
+ return bytes;
52
+ }