@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,340 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { createHash } from "node:crypto";
4
+ import { AppError } from "../shared/errors.js";
5
+ import { assertUpgradeRunStorageReady } from "./migrations.js";
6
+ import { hybridDigest } from "./hybrid-contracts.js";
7
+ import { appendAudit } from "./audit.js";
8
+ import { restoreMemoryUpgradeSelection, restoreMemoryUpgradeSelectionData, decodeMemoryUpgradeSelection } from "./memory-upgrade-selection.js";
9
+ import { prepareMemoryUpgradeInventory, matchesRetainedMemoryUpgradeInventory } from "./memory-upgrade-inventory.js";
10
+ import { observeDescriptorWorkspace } from "./descriptor-run-start.js";
11
+ import { PreparedMemoryInitRuntimeStorage } from "./memory-init-storage.js";
12
+ import { PreparedMemoryInitResourceStorage } from "./memory-init-resource-storage.js";
13
+ import { resourceHome } from "./managed-processes.js";
14
+ import semver from "semver";
15
+ import { PreparedMemoryLayer } from "./memory-layer.js";
16
+ import { readBoundedReleaseFile } from "./release-source.js";
17
+ import { observeMemoryGitPolicySelection } from "./memory-init-git-policy.js";
18
+ import { readRunStartRequest, hasRunStartTable } from "./run-start-custody.js";
19
+ import { runContextRelocations, projectPacketLocators } from "./stage-context.js";
20
+ // One historical decode per connection. SQL bytes, logical scope and audit
21
+ // custody are still observed on every read; callers receive private copies.
22
+ const retainedDecodes = new WeakMap();
23
+ function refuse(reason) {
24
+ throw new AppError("upgrade_storage_request_invalid", "Upgrade storage readiness must retain its original request", 1, { reason, effect: "no_effect", next_action: "reconcile_exact_request" });
25
+ }
26
+ function project(context, scope) {
27
+ if (!scope || Object.keys(scope).sort().join() !== "projectRoot,requestId,workspaceRoot"
28
+ || typeof scope.requestId !== "string" || !/^[A-Za-z0-9][A-Za-z0-9_.-]{0,95}$/.test(scope.requestId))
29
+ refuse("invalid_scope");
30
+ if ([scope.projectRoot, scope.workspaceRoot].some(root => typeof root !== "string" || !path.isAbsolute(root) || path.resolve(root) !== root))
31
+ refuse("invalid_scope");
32
+ const selected = context.db.get("SELECT id FROM projects WHERE root = ? AND status = 'active'", [scope.projectRoot]);
33
+ if (selected)
34
+ return selected.id;
35
+ const candidates = hasRunStartTable(context) ? context.db.all("SELECT p.id,p.root,s.run_id FROM projects p JOIN run_start_requests s ON s.project_id=p.id WHERE p.status='active' AND s.request_id=? AND json_extract(s.payload_json,'$.project_root')=? AND json_extract(s.payload_json,'$.workspace_root')=?", [scope.requestId, scope.projectRoot, scope.workspaceRoot]) : [];
36
+ const matches = candidates.filter(row => {
37
+ const request = readRunStartRequest(context, row.id, scope.requestId);
38
+ return request?.published && request.payload.initial_index.flow_kind === 'mb-upgrade'
39
+ && projectPacketLocators(scope.projectRoot, runContextRelocations(context, row.id, row.run_id)) === row.root;
40
+ });
41
+ if (matches.length !== 1)
42
+ refuse("project_not_active");
43
+ return matches[0].id;
44
+ }
45
+ /** Physical imports use the source request's immutable logical scope. This is
46
+ * a historical read projection, never new storage/RUN admission. */
47
+ export function resolveUpgradeHistoricalScope(context, scope) {
48
+ const projectId = project(context, scope);
49
+ const row = hasRunStartTable(context) ? context.db.get("SELECT run_id FROM run_start_requests WHERE project_id=? AND request_id=?", [projectId, scope.requestId]) : undefined;
50
+ const relocations = row ? runContextRelocations(context, projectId, row.run_id) : [];
51
+ if (relocations.length) {
52
+ const request = readRunStartRequest(context, projectId, scope.requestId);
53
+ if (request?.published && request.payload.initial_index.flow_kind === 'mb-upgrade') {
54
+ const original = { requestId: scope.requestId, projectRoot: request.payload.project_root, workspaceRoot: request.payload.workspace_root };
55
+ if (projectPacketLocators(original.projectRoot, relocations) === scope.projectRoot && projectPacketLocators(original.workspaceRoot, relocations) === scope.workspaceRoot)
56
+ return { projectId, scope: original };
57
+ }
58
+ }
59
+ return { projectId, scope };
60
+ }
61
+ function scopeDirectories(scope) {
62
+ for (const root of [scope.projectRoot, scope.workspaceRoot]) {
63
+ try {
64
+ if (typeof root !== "string" || fs.realpathSync(root) !== root || !fs.statSync(root).isDirectory())
65
+ refuse("noncanonical_scope");
66
+ }
67
+ catch (error) {
68
+ if (error instanceof AppError)
69
+ throw error;
70
+ refuse("scope_unavailable");
71
+ }
72
+ }
73
+ }
74
+ const key = (projectId, requestId) => `mb-upgrade.storage.${projectId}.${requestId}`;
75
+ /** The selected engine issues these facts; SQL custody preserves them after
76
+ * the pre-context files are retired. Never rebuild historical evidence. */
77
+ export function upgradeStorageMigration(value, selectionSha256) {
78
+ const migration = value, sha = (value) => typeof value === "string" && /^[a-f0-9]{64}$/.test(value);
79
+ if (!migration || !migration.request || !path.isAbsolute(migration.request.path) || !sha(migration.request.sha256)
80
+ || !migration.proof?.reference || migration.proof.reference.path !== migration.request.path + ".result.json"
81
+ || !sha(migration.proof.reference.sha256) || !Array.isArray(migration.proof.evidence) || migration.proof.evidence.length !== 5)
82
+ refuse("invalid_migration_proof");
83
+ const kinds = ["writer-drain", "storage-backup", "storage-plan", "storage-apply", "storage-verification"];
84
+ migration.proof.evidence.forEach((entry, index) => {
85
+ if (!entry || typeof entry.base64 !== "string" || entry.base64.length > 1024 * 1024)
86
+ refuse("invalid_migration_evidence");
87
+ const raw = Buffer.from(entry.base64, "base64");
88
+ if (entry.kind !== kinds[index] || entry.path !== `receipts/${entry.kind}.json` || raw.toString("base64") !== entry.base64
89
+ || createHash("sha256").update(raw).digest("hex") !== entry.sha256)
90
+ refuse("invalid_migration_evidence");
91
+ let evidence;
92
+ try {
93
+ evidence = JSON.parse(raw.toString("utf8"));
94
+ }
95
+ catch {
96
+ return refuse("invalid_migration_evidence");
97
+ }
98
+ if (evidence.schema_id !== "dd-flow/paired-storage-evidence@1" || evidence.kind !== entry.kind
99
+ || evidence.request_sha256 !== migration.request.sha256 || evidence.selection_sha256 !== selectionSha256)
100
+ refuse("foreign_migration_evidence");
101
+ });
102
+ return migration;
103
+ }
104
+ /** Shared read-only project fence before either storage bootstrap or cutover. */
105
+ export function assertMemoryUpgradeProjectCurrent(selected, scope, env) {
106
+ const p = selected.payload;
107
+ if (p.git && createHash("sha256").update(readBoundedReleaseFile(p.git.executable, 64 * 1024 * 1024)).digest("hex") !== p.git.probe.executable_sha256)
108
+ refuse("selected_git_changed");
109
+ if (p.git && hybridDigest(observeMemoryGitPolicySelection(env, { scope, gitExecutable: p.git.executable,
110
+ selection: { route: p.git.policy.route, integrationBranch: p.git.policy.integration_branch } })) !== hybridDigest(p.git.policy))
111
+ refuse("git_policy_changed");
112
+ if (hybridDigest(observeDescriptorWorkspace({ env }, scope.projectRoot, scope.workspaceRoot, p.git?.executable)) !== hybridDigest(p.workspace)
113
+ || !matchesRetainedMemoryUpgradeInventory(prepareMemoryUpgradeInventory(scope.workspaceRoot, selected.layer, selected.baselineLayer ?? undefined), p.current.inventory))
114
+ refuse("current_context_changed");
115
+ }
116
+ /** Current physical admission in the bound engine, separate from historical
117
+ * migration receipts. Shared by initial bootstrap and relocated RUN stages. */
118
+ export function assertUpgradeExecutionStorage(context, engine) {
119
+ if (context.db.isOwnedWriteTransaction?.())
120
+ refuse("preparation_outside_writer_required");
121
+ const proof = engine.admitMemoryUpgradeStorage(context.ddFlowHome, resourceHome(context));
122
+ const stores = [PreparedMemoryInitRuntimeStorage.prepareUpgrade(context).facts(), PreparedMemoryInitResourceStorage.prepare(context).facts()];
123
+ const runProof = proof.facts.run, resourceProof = proof.facts.resource;
124
+ if (stores.some(local => {
125
+ const remote = local.store_kind === "run" ? runProof : resourceProof;
126
+ return local.store_path !== remote.store_path || local.schema_sha256 !== remote.schema_sha256
127
+ || local.executing_writer_version !== remote.executing_writer_version;
128
+ }))
129
+ refuse("executing_store_context_changed");
130
+ return proof;
131
+ }
132
+ /** New bootstrap path: source/target policy comes only from retained input.
133
+ * Physical stores are observed now, not inferred from a project's MB version. */
134
+ function frozenProof(context, scope, retained, retainedMigration) {
135
+ const original = retained ? null : restoreMemoryUpgradeSelection(context.ddFlowHome, scope);
136
+ const selected = original ?? restoreMemoryUpgradeSelectionData(Buffer.from(retained.payload_json, "utf8"), retained.sha256, retained.request_input, scope), p = selected.payload;
137
+ const requestInput = retained?.request_input ?? original.original.input;
138
+ if (p.impact.chain.status !== "ok")
139
+ refuse("incomplete_retained_impact_chain");
140
+ if (!retained && selected.baselineLayer) {
141
+ const baseline = PreparedMemoryLayer.fromCommittedCanon(context.ddFlowHome, JSON.parse(Buffer.from(p.current.manifest_base64, "base64").toString("utf8")), selected.baselineLayer.installationSha256);
142
+ if (!baseline || baseline.sha256 !== selected.baselineLayer.sha256 || baseline.installationSha256 !== selected.baselineLayer.installationSha256)
143
+ refuse("canonical_baseline_changed");
144
+ }
145
+ assertMemoryUpgradeProjectCurrent(selected, scope, context.env);
146
+ const compatibility = JSON.parse(selected.layer.files().get("dd-flow/compatibility.json").toString("utf8"));
147
+ const contract = JSON.parse(selected.layer.files().get("dd-flow/flow-contract.json").toString("utf8"));
148
+ const manifest = selected.engine.manifest();
149
+ if (compatibility.memory_bank_version !== selected.release.canon.version || compatibility.dd_flow_cli.flow_contract !== contract.id
150
+ || compatibility.dd_flow_cli.package_name !== manifest.package_name || compatibility.engine.package_name !== manifest.package_name
151
+ || !semver.valid(compatibility.dd_flow_cli.min_version) || semver.lt(manifest.package_version, compatibility.dd_flow_cli.min_version)
152
+ || !semver.satisfies(manifest.package_version, compatibility.engine.version_range, { includePrerelease: true }))
153
+ refuse("retained_engine_incompatible");
154
+ const proof = assertUpgradeExecutionStorage(context, selected.engine);
155
+ let migration;
156
+ const file = original ? path.join(path.dirname(original.original.candidate.retain().file), "storage-migration.json")
157
+ : retainedMigration ? upgradeStorageMigration(retainedMigration, selected.sha256).request.path : undefined;
158
+ if (file && fs.existsSync(file)) {
159
+ const request = { path: file, sha256: createHash("sha256").update(readBoundedReleaseFile(file, 16 * 1024 * 1024)).digest("hex") };
160
+ const response = selected.engine.transitionMemoryUpgradeStorage({ home: context.ddFlowHome, resourceHome: resourceHome(context), scope,
161
+ selectionSha256: selected.sha256, action: "status", expectedSha256: request.sha256 });
162
+ const result = response.result;
163
+ if (result?.status !== "applied" || !result.proof)
164
+ refuse("migration_evidence_incomplete");
165
+ migration = upgradeStorageMigration({ request, proof: result.proof }, selected.sha256);
166
+ if (retainedMigration && hybridDigest(migration) !== hybridDigest(retainedMigration))
167
+ refuse("migration_evidence_changed");
168
+ }
169
+ else if (retainedMigration)
170
+ refuse("migration_request_unavailable");
171
+ return { selectionSha256: selected.sha256, selection: { sha256: selected.sha256,
172
+ payload_json: selected.bytes.toString("utf8"), request_input: requestInput }, proof: {
173
+ schema_id: migration ? "dd-flow/mb-upgrade-storage-readiness@2" : "dd-flow/mb-upgrade-storage-readiness@1",
174
+ route: migration ? "migration" : "verified-no-op", ...(migration ? { migration } : {}), selection_sha256: selected.sha256,
175
+ source_version: p.current.canon_version, target_version: selected.release.canon.version,
176
+ chain: p.impact.chain.steps, current_provenance: p.current.inventory.inventory.current_manifest,
177
+ target: { canon: selected.source.canonProvenance(), installation_sha256: p.release.manifest_sha256,
178
+ layer_sha256: selected.layer.sha256, pack_sha256: selected.layer.packSha256 }, selected_engine_storage: proof,
179
+ stores: [proof.facts.run, proof.facts.resource].map(store => ({ store_kind: store.store_kind, store_path: store.store_path,
180
+ store_dev: store.store_dev, store_ino: store.store_ino, schema_sha256: store.schema_sha256, executing_writer_version: store.executing_writer_version }))
181
+ } };
182
+ }
183
+ /** Historical evidence, not present-day physical admission. Project sync may
184
+ * change current files without rewriting the original upgrade's storage proof.
185
+ * Workspace/repository eligibility belongs to the upgrade target preflight.
186
+ */
187
+ export function readUpgradeStorageReadiness(context, scope) {
188
+ return context.db.readSnapshot(() => retainedStorage(context, scope));
189
+ }
190
+ function retainedStorage(context, scope) {
191
+ let logical;
192
+ try {
193
+ logical = resolveUpgradeHistoricalScope(context, scope);
194
+ }
195
+ catch (error) {
196
+ // A first upgrade may observe an existing MB in a new runtime Home. This
197
+ // is absence of history, not registration or permission to revive it.
198
+ if (error instanceof AppError && error.details.reason === 'project_not_active'
199
+ && !context.db.get('SELECT 1 FROM projects WHERE root=?', [scope.projectRoot])
200
+ && !(hasRunStartTable(context) && context.db.get("SELECT 1 FROM run_start_requests WHERE request_id=? AND json_extract(payload_json,'$.project_root')=?", [scope.requestId, scope.projectRoot])))
201
+ return null;
202
+ throw error;
203
+ }
204
+ const projectId = logical.projectId;
205
+ scope = logical.scope;
206
+ const row = context.db.get("SELECT value_json FROM runtime_config WHERE key = ?", [key(projectId, scope.requestId)]);
207
+ if (!row) {
208
+ if (context.db.get("SELECT 1 FROM audit_events WHERE project_id=? AND event_type='memory.upgrade_storage_ready' AND json_extract(payload_json,'$.request_id')=? AND json_extract(payload_json,'$.selection_sha256') IS NOT NULL LIMIT 1", [projectId, scope.requestId]))
209
+ refuse("storage_readiness_custody_missing");
210
+ return null;
211
+ }
212
+ if (Buffer.byteLength(row.value_json) > 68 * 1024 * 1024)
213
+ refuse("unbounded_retained_receipt");
214
+ const cached = retainedDecodes.get(context.db);
215
+ if (cached?.raw === row.value_json && cached.value.receipt.project_id === projectId
216
+ && hybridDigest(cached.value.receipt.scope) === hybridDigest(scope)) {
217
+ assertRetainedReadinessAudit(context, projectId, scope, cached.value);
218
+ return structuredClone(cached.value);
219
+ }
220
+ let receipt;
221
+ try {
222
+ receipt = JSON.parse(row.value_json);
223
+ }
224
+ catch {
225
+ return refuse("invalid_retained_receipt");
226
+ }
227
+ const frozen = receipt?.schema_id === "dd-flow/mb-upgrade-storage-request@2" || receipt?.schema_id === "dd-flow/mb-upgrade-storage-request@3";
228
+ const migrated = receipt?.schema_id === "dd-flow/mb-upgrade-storage-request@3";
229
+ if (!receipt || Object.keys(receipt).sort().join() !== (frozen ? "project_id,proof,schema_id,scope,selection" : "project_id,proof,schema_id,scope")
230
+ || !["dd-flow/mb-upgrade-storage-request@1", "dd-flow/mb-upgrade-storage-request@2", "dd-flow/mb-upgrade-storage-request@3"].includes(receipt.schema_id) || receipt.project_id !== projectId
231
+ || hybridDigest(receipt.scope) !== hybridDigest(scope) || !receipt.proof
232
+ || receipt.proof.schema_id !== (migrated ? "dd-flow/mb-upgrade-storage-readiness@2" : "dd-flow/mb-upgrade-storage-readiness@1")
233
+ || receipt.proof.route !== (migrated ? "migration" : "verified-no-op"))
234
+ refuse("changed_request");
235
+ if (receipt.proof.selection_sha256 !== undefined && (typeof receipt.proof.selection_sha256 !== "string"
236
+ || !/^[a-f0-9]{64}$/.test(receipt.proof.selection_sha256)))
237
+ refuse("changed_request");
238
+ const sha256 = hybridDigest(receipt);
239
+ if (!frozen)
240
+ return { receipt, sha256 };
241
+ const retained = receipt.selection;
242
+ if (!retained || Object.keys(retained).sort().join() !== "payload_json,request_input,sha256" || typeof retained.payload_json !== "string"
243
+ || retained.sha256 !== receipt.proof.selection_sha256)
244
+ refuse("invalid_retained_selection");
245
+ const selection = decodeMemoryUpgradeSelection(Buffer.from(retained.payload_json, "utf8"), retained.sha256, retained.request_input, scope);
246
+ if (migrated)
247
+ upgradeStorageMigration(receipt.proof.migration, retained.sha256);
248
+ const value = { receipt, sha256, selection };
249
+ assertRetainedReadinessAudit(context, projectId, scope, value);
250
+ retainedDecodes.set(context.db, { raw: row.value_json, value });
251
+ return structuredClone(value);
252
+ }
253
+ function assertRetainedReadinessAudit(context, projectId, scope, value) {
254
+ const { receipt, sha256 } = value, retained = receipt.selection;
255
+ if (!retained)
256
+ refuse("invalid_retained_selection");
257
+ const audits = context.db.all("SELECT payload_json FROM audit_events WHERE project_id=? AND event_type='memory.upgrade_storage_ready' AND json_extract(payload_json,'$.request_id')=? LIMIT 2", [projectId, scope.requestId]);
258
+ if (audits.length !== 1 || audits.some(event => Buffer.byteLength(event.payload_json) > 16 * 1024)
259
+ || hybridDigest(JSON.parse(audits[0].payload_json)) !== hybridDigest({ request_id: scope.requestId, project_root: scope.projectRoot,
260
+ workspace_root: scope.workspaceRoot, receipt_sha256: sha256, route: receipt.proof.route, selection_sha256: retained.sha256 }))
261
+ refuse("storage_readiness_custody_missing");
262
+ }
263
+ /** Retains physical admission plus selected-engine phase evidence when storage
264
+ * changed. Legacy apply markers are insufficient for migration bootstrap.
265
+ * This is a storage dependency, not complete bootstrap or provider readiness.
266
+ */
267
+ export class PreparedUpgradeStorageReadiness {
268
+ #receipt;
269
+ #engine;
270
+ #selectionSha256;
271
+ constructor(receipt, engine, selectionSha256) {
272
+ if (Buffer.byteLength(JSON.stringify(receipt)) > 68 * 1024 * 1024)
273
+ refuse("unbounded_retained_receipt");
274
+ this.#receipt = structuredClone(receipt);
275
+ this.#engine = engine;
276
+ this.#selectionSha256 = selectionSha256;
277
+ Object.freeze(this);
278
+ }
279
+ static prepareFromSelection(context, scope) {
280
+ if (context.db.isOwnedWriteTransaction?.())
281
+ refuse("preparation_outside_writer_required");
282
+ const projectId = project(context, scope);
283
+ scopeDirectories(scope);
284
+ const prior = readUpgradeStorageReadiness(context, scope);
285
+ const selected = frozenProof(context, scope, prior?.receipt.selection, prior?.receipt.proof.migration);
286
+ const receipt = { schema_id: selected.proof.route === "migration" ? "dd-flow/mb-upgrade-storage-request@3" : "dd-flow/mb-upgrade-storage-request@2", scope: { ...scope }, project_id: projectId,
287
+ proof: selected.proof, selection: selected.selection };
288
+ if (prior && prior.sha256 !== hybridDigest(receipt))
289
+ refuse("changed_request");
290
+ return new PreparedUpgradeStorageReadiness(receipt, undefined, selected.selectionSha256);
291
+ }
292
+ static prepare(context, scope, engine) {
293
+ const projectId = project(context, scope);
294
+ scopeDirectories(scope);
295
+ const proof = assertUpgradeRunStorageReady(context, scope.projectRoot, engine);
296
+ if (proof.route !== "verified-no-op")
297
+ refuse("storage_migration_requires_physical_proof");
298
+ const receipt = { schema_id: "dd-flow/mb-upgrade-storage-request@1", scope: { ...scope }, project_id: projectId, proof };
299
+ const prior = readUpgradeStorageReadiness(context, scope);
300
+ if (prior && prior.sha256 !== hybridDigest(receipt))
301
+ refuse("changed_request");
302
+ return new PreparedUpgradeStorageReadiness(receipt, engine);
303
+ }
304
+ apply(context) {
305
+ const scope = this.#receipt.scope;
306
+ if (this.#selectionSha256 !== undefined) {
307
+ const prior = readUpgradeStorageReadiness(context, scope);
308
+ if (prior) {
309
+ if (prior.sha256 !== hybridDigest(this.#receipt))
310
+ refuse("changed_request");
311
+ // Historical acknowledgement only, never fresh RUN/storage admission.
312
+ return { ...prior, changed: false };
313
+ }
314
+ }
315
+ const proof = this.#selectionSha256 === undefined ? assertUpgradeRunStorageReady(context, scope.projectRoot, this.#engine)
316
+ : frozenProof(context, scope).proof;
317
+ if (project(context, scope) !== this.#receipt.project_id
318
+ || hybridDigest(proof) !== hybridDigest(this.#receipt.proof))
319
+ refuse("changed_after_preparation");
320
+ return context.db.writeTransaction(() => {
321
+ const prior = readUpgradeStorageReadiness(context, scope);
322
+ if (prior) {
323
+ if (prior.sha256 !== hybridDigest(this.#receipt))
324
+ refuse("changed_request");
325
+ return { ...prior, changed: false };
326
+ }
327
+ const now = context.now();
328
+ context.db.run("INSERT INTO runtime_config (key,value_json,created_at,updated_at) VALUES (?,?,?,?)", [key(this.#receipt.project_id, scope.requestId), JSON.stringify(this.#receipt), now, now]);
329
+ appendAudit(context, { projectId: this.#receipt.project_id, eventType: "memory.upgrade_storage_ready", payload: {
330
+ request_id: scope.requestId, project_root: scope.projectRoot, workspace_root: scope.workspaceRoot,
331
+ receipt_sha256: hybridDigest(this.#receipt), route: this.#receipt.proof.route,
332
+ ...(this.#selectionSha256 ? { selection_sha256: this.#selectionSha256 } : {})
333
+ } });
334
+ const accepted = readUpgradeStorageReadiness(context, scope);
335
+ if (!accepted || accepted.sha256 !== hybridDigest(this.#receipt))
336
+ refuse("storage_readiness_readback_failed");
337
+ return { ...accepted, changed: true };
338
+ }, "memoryUpgrade.storageReadiness");
339
+ }
340
+ }
@@ -0,0 +1,156 @@
1
+ import { AppError } from "../shared/errors.js";
2
+ import { hybridDigest } from "./hybrid-contracts.js";
3
+ import { PreparedCheckEvidence } from "./code-checks.js";
4
+ import { PreparedMemoryStageResult, memorySourceKey } from "./memory-stage-results.js";
5
+ import { PreparedAcceptedMemoryComposition } from "./memory-accepted-composition.js";
6
+ function refuse(reason) {
7
+ throw new AppError("memory_verification_acceptance_invalid", "Verification lacks current check proof or accepted per-unit assessments", 2, { reason, effect: "no_effect" });
8
+ }
9
+ /** Check references are a CLI projection of the selected current owner, not
10
+ * agent-generated proof. Admit an optional echo only when it names those bytes. */
11
+ export function projectMemoryVerificationChecks(value, references, directory, resultSha256) {
12
+ if (!value || typeof value !== "object" || Array.isArray(value))
13
+ return value;
14
+ const candidate = value;
15
+ if (!candidate.details || typeof candidate.details !== "object" || Array.isArray(candidate.details))
16
+ return value;
17
+ if (candidate.details.checks !== undefined && (!Array.isArray(candidate.details.checks) || candidate.details.checks.some(reference => {
18
+ if (!reference || typeof reference !== "object" || Array.isArray(reference) || Object.keys(reference).some(key => !["path", "sha256"].includes(key)))
19
+ return true;
20
+ const matches = references.filter(current => current.sha256 === reference.sha256 && (current.path === reference.path
21
+ || current.path.startsWith(`${directory}/checks/`) && current.path.slice(directory.length + 1) === reference.path));
22
+ return new Set(matches.map(current => hybridDigest(current))).size !== 1;
23
+ })))
24
+ throw new AppError("memory_verification_acceptance_invalid", "Use only the selected current CLI check references; correct the proposed result without rerunning settled checks", 2, { reason: "checks_not_selected_current_receipts", phase: "prepare", effect: "no_effect", recoverable: true, check_references: references, result_sha256: resultSha256 });
25
+ return { ...candidate, details: { ...candidate.details, checks: references } };
26
+ }
27
+ /** Pure reference comparison; the caller must obtain admitted outputs from
28
+ * the current accepted composition owner, never from proposed result bytes. */
29
+ export function assertMemoryVerificationArtifactReferences(original, proposed, outputs) {
30
+ const identities = (sources) => sources.map(source => hybridDigest(source));
31
+ const declared = new Set(identities(proposed)), accepted = new Set(identities([...original, ...outputs]));
32
+ if (identities(original).some(identity => !declared.has(identity))
33
+ || [...declared].some(identity => !accepted.has(identity)))
34
+ refuse("changed_composed_artifacts");
35
+ }
36
+ /** Accepted compose owns these associations; the verifier owns assessments. */
37
+ export function projectMemoryVerificationArtifacts(value, units, outputs, resultSha256) {
38
+ if (!value || typeof value !== "object" || Array.isArray(value))
39
+ return value;
40
+ const candidate = value;
41
+ if (!Array.isArray(candidate.units))
42
+ return value;
43
+ const originals = new Map(units.map(unit => [unit.id, unit.artifacts]));
44
+ return { ...candidate, units: candidate.units.map(unit => {
45
+ if (!unit || typeof unit !== "object" || Array.isArray(unit) || unit.artifacts !== undefined && !Array.isArray(unit.artifacts))
46
+ return unit;
47
+ const original = originals.get(unit.id);
48
+ if (!original)
49
+ return unit;
50
+ const allowed = new Set([...original, ...outputs].map(reference => hybridDigest(reference)));
51
+ const provided = unit.artifacts ?? [];
52
+ if (provided.some((reference) => !allowed.has(hybridDigest(reference)))) {
53
+ if (resultSha256 === undefined)
54
+ refuse("changed_composed_artifacts");
55
+ throw new AppError("memory_verification_acceptance_invalid", "Omit units[].artifacts: the CLI preserves accepted compose outputs. Cite preserved source documents in semantic assessment evidence, not as new artifacts; correct the proposal without rerunning settled checks", 2, { reason: "changed_composed_artifacts", phase: "prepare", effect: "no_effect", recoverable: true, unit_id: unit.id,
56
+ output_references: structuredClone(original), result_sha256: resultSha256 });
57
+ }
58
+ const merged = new Map([...original, ...provided].map(reference => [hybridDigest(reference), reference]));
59
+ return { ...unit, artifacts: [...merged.values()] };
60
+ }) };
61
+ }
62
+ /** Admission of the verifier's claims, not an independent judgment of their
63
+ * semantic truth. The handler must independently select and fence accepted
64
+ * compose SQL custody and current output observations; REVIEW/Eval still own
65
+ * their separate gates. Lint alone cannot supply these unit assessments.
66
+ */
67
+ export class PreparedMemoryVerificationAcceptance {
68
+ #resultSha256;
69
+ #checks;
70
+ constructor(result, checks) {
71
+ this.#resultSha256 = result.sha256;
72
+ this.#checks = checks;
73
+ Object.freeze(this);
74
+ }
75
+ static prepare(input) {
76
+ if (!(input.result instanceof PreparedMemoryStageResult) || !(input.compose instanceof PreparedMemoryStageResult)
77
+ || !(input.checks instanceof PreparedCheckEvidence))
78
+ refuse("prepared_authority_required");
79
+ const result = input.result.value(), compose = input.compose.value();
80
+ if (input.composition !== undefined && (!(input.composition instanceof PreparedAcceptedMemoryComposition)
81
+ || input.composition.result().sha256 !== input.compose.sha256))
82
+ refuse("prepared_authority_required");
83
+ const outputs = input.composition?.outputReferences() ?? [];
84
+ const upgrade = compose.stage === "upgrade", authoring = upgrade ? "upgrade" : "compose";
85
+ input.checks.assertOwner({ ...input.scope, scope: "aggregate" });
86
+ const diagnostic = result.outcome === "needs_repair";
87
+ if (!["compose", "upgrade"].includes(compose.stage) || compose.outcome !== "accepted" || result.stage !== "verify" || !["accepted", "needs_repair"].includes(result.outcome)
88
+ || result.run_id !== compose.run_id || result.run_id !== input.scope.runId || result.predecessors.length !== 1 || result.predecessors[0].stage !== authoring
89
+ || result.predecessors[0].input_sha256 !== compose.input_sha256 || result.predecessors[0].result.sha256 !== input.compose.sha256
90
+ || compose.findings.some(finding => finding.severity !== "minor" && finding.status !== "resolved"))
91
+ refuse("unaccepted_or_foreign_predecessor");
92
+ if (!diagnostic && (!input.checks.qualityPassed() || result.findings.some(finding => finding.severity !== "minor" && finding.status !== "resolved")))
93
+ throw new AppError("memory_verification_acceptance_invalid", "Accepted verification requires passed selected checks and no unresolved material findings. For a real gap use needs_repair with an open material finding; a pending later REVIEW is a separate gate, not a current defect. Do not mark unresolved findings resolved or rerun settled checks merely to pass", 2, { reason: "verification_not_accepted", phase: "prepare", effect: "no_effect", recoverable: true, result_sha256: input.proposalSha256 ?? input.result.sha256 });
94
+ const expected = input.checks.resultReferences().map(reference => hybridDigest(reference)), actual = result.details.checks.map(reference => hybridDigest(reference));
95
+ const allowedChecks = new Set(input.checks.sourceReferences().map(({ path, sha256 }) => hybridDigest({ path, sha256 })));
96
+ if (expected.some(reference => !actual.includes(reference))
97
+ || actual.some(reference => !allowedChecks.has(reference)))
98
+ refuse("checks_not_selected_current_receipts");
99
+ const units = new Map(compose.units.map(unit => [unit.id, unit]));
100
+ if (result.units.length !== units.size || new Set(result.units.map(unit => unit.id)).size !== units.size)
101
+ refuse("changed_unit_coverage");
102
+ const selectedAssessments = upgrade ? result.details.preservation_assessments?.map(item => ({ ...item, verdict: item.outcome === "preserved" ? "accepted" : item.outcome })) : result.details.semantic_assessments;
103
+ if (!selectedAssessments)
104
+ refuse("missing_unit_assessments");
105
+ const assessments = new Map();
106
+ for (const assessment of selectedAssessments)
107
+ assessments.set(assessment.unit_id, [...assessments.get(assessment.unit_id) ?? [], assessment]);
108
+ if (!upgrade && assessments.size !== selectedAssessments.length || [...assessments.keys()].some(id => !units.has(id))
109
+ || compose.units.some(unit => unit.applicability !== "not-applicable" && !assessments.has(unit.id)))
110
+ refuse("incomplete_or_duplicate_assessments");
111
+ if (upgrade && hybridDigest(input.result.preservationInvariants()) !== hybridDigest(input.compose.preservationInvariants()))
112
+ refuse("changed_preservation_invariants");
113
+ const key = (source) => memorySourceKey(input.roots && input.roots.projectRoot === input.roots.workspace && source.root === "project" ? "workspace" : source.root, source.path);
114
+ for (const unit of result.units) {
115
+ const original = units.get(unit.id), selected = assessments.get(unit.id) ?? [];
116
+ // IDs bind assessments to accepted units; aspect is descriptive prose.
117
+ // REVIEW derives its assignments from composition, not this wording.
118
+ if (!original || unit.applicability !== original.applicability || unit.applicability === "unknown"
119
+ || (unit.applicability === "not-applicable" ? unit.outcome !== "not-applicable" : !["accepted", ...(diagnostic ? ["needs_repair"] : [])].includes(unit.outcome))
120
+ || selected.some(assessment => !["accepted", ...(diagnostic ? ["needs_repair"] : [])].includes(assessment.verdict) || !assessment.summary.trim()))
121
+ refuse("unit_not_accepted_or_changed");
122
+ assertMemoryVerificationArtifactReferences(original.artifacts, unit.artifacts, outputs);
123
+ for (const assessment of selected) {
124
+ // PreparedMemoryStageResult already binds every evidence reference to
125
+ // admitted bytes. Cross-unit and earlier-stage evidence is useful context,
126
+ // but cannot replace examination of this unit's own composed output.
127
+ if (unit.applicability !== "not-applicable" && !assessment.evidence.some(source => original.artifacts.some(artifact => key(artifact) === key(source) && artifact.sha256 === source.sha256))) {
128
+ throw new AppError("memory_verification_acceptance_invalid", "Assess the composed documents themselves and cite a direct output reference for EACH applicable unit; the listed references identify this unit's outputs. Work result receipts do not replace direct output examination", 2, { reason: "assessment_does_not_examine_composed_output", phase: "prepare", effect: "no_effect", recoverable: true,
129
+ unit_id: unit.id, output_references: structuredClone(original.artifacts), result_sha256: input.result.sha256 });
130
+ }
131
+ if (upgrade) {
132
+ const id = assessment.invariant_id;
133
+ const invariant = input.result.preservationInvariants().find(item => item.id === id);
134
+ const old = invariant?.evidence;
135
+ // A current output alone cannot substantiate old-to-new preservation.
136
+ // Identical old bytes may be examined through the retained RUN copy.
137
+ if (!old?.some(before => assessment.evidence.some(source => source.sha256 === before.sha256 && (key(source) === key(before) || source.root === "run"))))
138
+ throw new AppError("memory_verification_acceptance_invalid", "Compare the retained old evidence as well as the current unit output; correct the assessment without rerunning settled checks", 2, { reason: "preservation_assessment_does_not_examine_old_evidence", phase: "prepare", effect: "no_effect", recoverable: true,
139
+ unit_id: unit.id, invariant_id: id, old_references: structuredClone(old ?? []), result_sha256: input.result.sha256 });
140
+ }
141
+ }
142
+ }
143
+ if (diagnostic && !result.findings.some(finding => finding.severity !== "minor" && finding.status === "open")) {
144
+ throw new AppError("memory_verification_acceptance_invalid", "needs_repair requires an open material finding; correct the proposed outcome and unit assessments without inventing severity", 2, { reason: "repair_requires_material_finding", phase: "prepare", effect: "no_effect", recoverable: true });
145
+ }
146
+ return new PreparedMemoryVerificationAcceptance(input.result, input.checks);
147
+ }
148
+ assertCustody(context, result, checks) {
149
+ if (!(result instanceof PreparedMemoryStageResult) || result.sha256 !== this.#resultSha256)
150
+ refuse("verification_result_changed");
151
+ if (checks !== undefined && checks !== this.#checks)
152
+ refuse("foreign_check_owner");
153
+ this.#checks.assertCustody(context);
154
+ }
155
+ revalidate(context) { this.#checks.revalidate(context); }
156
+ }