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

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 (557) hide show
  1. package/CHANGELOG.md +895 -0
  2. package/README.md +140 -6
  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 +58 -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/daemon-observation.d.mts +2 -0
  58. package/dist/harness-runtime/lib/daemon-observation.mjs +163 -0
  59. package/dist/harness-runtime/lib/daemon-operations.d.mts +2 -0
  60. package/dist/harness-runtime/lib/daemon-operations.mjs +462 -0
  61. package/dist/harness-runtime/lib/dd-agy-daemon.d.mts +6 -0
  62. package/dist/harness-runtime/lib/dd-agy-daemon.mjs +1096 -0
  63. package/dist/harness-runtime/lib/dd-agy.mjs +86 -0
  64. package/dist/harness-runtime/lib/dd-codex-daemon.d.mts +1 -0
  65. package/dist/harness-runtime/lib/dd-codex-daemon.mjs +231 -0
  66. package/dist/harness-runtime/lib/dd-codex.d.mts +1 -0
  67. package/dist/harness-runtime/lib/dd-codex.mjs +954 -0
  68. package/dist/harness-runtime/lib/dd-droid-daemon.mjs +141 -0
  69. package/dist/harness-runtime/lib/dd-droid.mjs +626 -0
  70. package/dist/harness-runtime/lib/dd-grok-daemon.mjs +555 -0
  71. package/dist/harness-runtime/lib/dd-grok.mjs +180 -0
  72. package/dist/harness-runtime/lib/dd-opencode-daemon.mjs +622 -0
  73. package/dist/harness-runtime/lib/dd-opencode.mjs +390 -0
  74. package/dist/harness-runtime/lib/dd-zcode-daemon.mjs +752 -0
  75. package/dist/harness-runtime/lib/dd-zcode.mjs +1175 -0
  76. package/dist/harness-runtime/lib/delegation-instructions.d.mts +14 -0
  77. package/dist/harness-runtime/lib/delegation-instructions.mjs +157 -0
  78. package/dist/harness-runtime/lib/dispatch-fence.mjs +14 -0
  79. package/dist/harness-runtime/lib/driver-recovery.mjs +140 -0
  80. package/dist/harness-runtime/lib/droid-observation.mjs +66 -0
  81. package/dist/harness-runtime/lib/entity-references.d.mts +2 -0
  82. package/dist/harness-runtime/lib/entity-references.mjs +9 -0
  83. package/dist/harness-runtime/lib/lease-renewal.d.mts +8 -0
  84. package/dist/harness-runtime/lib/lease-renewal.mjs +37 -0
  85. package/dist/harness-runtime/lib/lifecycle-command.d.mts +20 -0
  86. package/dist/harness-runtime/lib/lifecycle-command.mjs +273 -0
  87. package/dist/harness-runtime/lib/lifecycle-contract.d.mts +10 -0
  88. package/dist/harness-runtime/lib/lifecycle-contract.mjs +19 -0
  89. package/dist/harness-runtime/lib/managed-daemon.d.mts +16 -0
  90. package/dist/harness-runtime/lib/managed-daemon.mjs +698 -0
  91. package/dist/harness-runtime/lib/managed-flow-env.mjs +15 -0
  92. package/dist/harness-runtime/lib/model-observations.mjs +101 -0
  93. package/dist/harness-runtime/lib/native-children.d.mts +23 -0
  94. package/dist/harness-runtime/lib/native-children.mjs +219 -0
  95. package/dist/harness-runtime/lib/native-hook-command.d.mts +7 -0
  96. package/dist/harness-runtime/lib/native-hook-command.mjs +251 -0
  97. package/dist/harness-runtime/lib/native-request-proof.d.mts +2 -0
  98. package/dist/harness-runtime/lib/native-request-proof.mjs +65 -0
  99. package/dist/harness-runtime/lib/native-streams.mjs +45 -0
  100. package/dist/harness-runtime/lib/observation-clock.d.mts +18 -0
  101. package/dist/harness-runtime/lib/observation-clock.mjs +95 -0
  102. package/dist/harness-runtime/lib/opencode-plugin.mjs +85 -0
  103. package/dist/harness-runtime/lib/operation-context.mjs +5 -0
  104. package/dist/harness-runtime/lib/operation-errors.d.mts +16 -0
  105. package/dist/harness-runtime/lib/operation-errors.mjs +127 -0
  106. package/dist/harness-runtime/lib/operation-progress.d.mts +7 -0
  107. package/dist/harness-runtime/lib/operation-progress.mjs +114 -0
  108. package/dist/harness-runtime/lib/process-json.d.mts +5 -0
  109. package/dist/harness-runtime/lib/process-json.mjs +201 -0
  110. package/dist/harness-runtime/lib/process-snapshot.mjs +10 -0
  111. package/dist/harness-runtime/lib/provider-overload-policy.d.mts +15 -0
  112. package/dist/harness-runtime/lib/provider-overload-policy.mjs +151 -0
  113. package/dist/harness-runtime/lib/runner-events.mjs +202 -0
  114. package/dist/harness-runtime/lib/runner-lock.mjs +42 -0
  115. package/dist/harness-runtime/lib/session-settlement.mjs +30 -0
  116. package/dist/harness-runtime/lib/setup-progress.d.mts +9 -0
  117. package/dist/harness-runtime/lib/setup-progress.mjs +53 -0
  118. package/dist/harness-runtime/lib/tool-observations.d.mts +21 -0
  119. package/dist/harness-runtime/lib/tool-observations.mjs +228 -0
  120. package/dist/harness-runtime/lib/zcode-usage.mjs +55 -0
  121. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-1y4a697q.js +81 -0
  122. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-2ny4vxct.js +92 -0
  123. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-6mptkzbc.js +0 -0
  124. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-7x67cf1q.js +52 -0
  125. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-9rqn6x4v.js +16 -0
  126. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-9vdz0zwn.js +1661 -0
  127. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ecs5ftka.js +1466 -0
  128. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-frbwqjmf.js +145 -0
  129. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-gne7h7mq.js +50 -0
  130. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-gx9wnkzr.js +105 -0
  131. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-m2eywc8w.js +0 -0
  132. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-nwcpakzx.js +12 -0
  133. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-q4g3afnw.js +623 -0
  134. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-qav6mfdz.js +0 -0
  135. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-sxt88q69.js +12 -0
  136. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-t1xa31vm.js +39 -0
  137. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ve4aws36.js +103 -0
  138. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vmytr4q8.js +4 -0
  139. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vt9jbch8.js +36 -0
  140. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vyas3vgt.js +0 -0
  141. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-wjyeq25y.js +30 -0
  142. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-xgnj2w4v.js +20 -0
  143. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-y2etg5bs.js +9 -0
  144. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ydhz1zrh.js +238 -0
  145. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-z6qdwcsf.js +62 -0
  146. package/dist/harness-runtime/vendor/opencode-client/contract.d.ts +1 -0
  147. package/dist/harness-runtime/vendor/opencode-client/contract.js +12 -0
  148. package/dist/harness-runtime/vendor/opencode-client/effect/api/api.d.ts +2806 -0
  149. package/dist/harness-runtime/vendor/opencode-client/effect/api/api.js +0 -0
  150. package/dist/harness-runtime/vendor/opencode-client/effect/api.d.ts +4 -0
  151. package/dist/harness-runtime/vendor/opencode-client/effect/api.js +0 -0
  152. package/dist/harness-runtime/vendor/opencode-client/effect/client.d.ts +2530 -0
  153. package/dist/harness-runtime/vendor/opencode-client/effect/client.js +15 -0
  154. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client-error.d.ts +7 -0
  155. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client-error.js +6 -0
  156. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client.d.ts +2529 -0
  157. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client.js +8 -0
  158. package/dist/harness-runtime/vendor/opencode-client/effect/generated/index.d.ts +2 -0
  159. package/dist/harness-runtime/vendor/opencode-client/effect/generated/index.js +12 -0
  160. package/dist/harness-runtime/vendor/opencode-client/effect/index.d.ts +35 -0
  161. package/dist/harness-runtime/vendor/opencode-client/effect/index.js +75 -0
  162. package/dist/harness-runtime/vendor/opencode-client/effect/rpc.d.ts +20 -0
  163. package/dist/harness-runtime/vendor/opencode-client/effect/rpc.js +11 -0
  164. package/dist/harness-runtime/vendor/opencode-client/effect/service.d.ts +90 -0
  165. package/dist/harness-runtime/vendor/opencode-client/effect/service.js +187 -0
  166. package/dist/harness-runtime/vendor/opencode-client/package.json +84 -0
  167. package/dist/harness-runtime/vendor/opencode-client/promise/api.d.ts +21 -0
  168. package/dist/harness-runtime/vendor/opencode-client/promise/api.js +0 -0
  169. package/dist/harness-runtime/vendor/opencode-client/promise/client.d.ts +252 -0
  170. package/dist/harness-runtime/vendor/opencode-client/promise/client.js +14 -0
  171. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client-error.d.ts +8 -0
  172. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client-error.js +6 -0
  173. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client.d.ts +259 -0
  174. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client.js +7 -0
  175. package/dist/harness-runtime/vendor/opencode-client/promise/generated/index.d.ts +3 -0
  176. package/dist/harness-runtime/vendor/opencode-client/promise/generated/index.js +79 -0
  177. package/dist/harness-runtime/vendor/opencode-client/promise/generated/types.d.ts +8932 -0
  178. package/dist/harness-runtime/vendor/opencode-client/promise/generated/types.js +70 -0
  179. package/dist/harness-runtime/vendor/opencode-client/promise/index.d.ts +6 -0
  180. package/dist/harness-runtime/vendor/opencode-client/promise/index.js +83 -0
  181. package/dist/harness-runtime/vendor/opencode-client/promise/rpc.d.ts +32 -0
  182. package/dist/harness-runtime/vendor/opencode-client/promise/rpc.js +7 -0
  183. package/dist/harness-runtime/vendor/opencode-client/promise/service.d.ts +24 -0
  184. package/dist/harness-runtime/vendor/opencode-client/promise/service.js +187 -0
  185. package/dist/harness-runtime/vendor/opencode-client/pty-handoff.d.ts +12 -0
  186. package/dist/harness-runtime/vendor/opencode-client/pty-handoff.js +14 -0
  187. package/dist/harness-runtime/vendor/opencode-client/rpc-runtime.d.ts +20 -0
  188. package/dist/harness-runtime/vendor/opencode-client/rpc-runtime.js +14 -0
  189. package/dist/harness-runtime/vendor/opencode-client/service-contender.d.ts +37 -0
  190. package/dist/harness-runtime/vendor/opencode-client/service-contender.js +10 -0
  191. package/dist/harness-runtime/vendor/opencode-client/service-probe.d.ts +70 -0
  192. package/dist/harness-runtime/vendor/opencode-client/service-probe.js +16 -0
  193. package/dist/harness-runtime/vendor/opencode-client/service-timing.d.ts +12 -0
  194. package/dist/harness-runtime/vendor/opencode-client/service-timing.js +10 -0
  195. package/dist/harness-runtime/vendor/opencode-client/service-version.d.ts +2 -0
  196. package/dist/harness-runtime/vendor/opencode-client/service-version.js +6 -0
  197. package/dist/harness-runtime/vendor/opencode-client/service.d.ts +52 -0
  198. package/dist/harness-runtime/vendor/opencode-client/service.js +1 -0
  199. package/dist/harness-runtime/vendor/opencode-client/shared-events.d.ts +11 -0
  200. package/dist/harness-runtime/vendor/opencode-client/shared-events.js +8 -0
  201. package/dist/harness-runtime/vendor/opencode-client/solid/connection.d.ts +37 -0
  202. package/dist/harness-runtime/vendor/opencode-client/solid/connection.js +10 -0
  203. package/dist/harness-runtime/vendor/opencode-client/solid/data.d.ts +211 -0
  204. package/dist/harness-runtime/vendor/opencode-client/solid/data.js +18 -0
  205. package/dist/harness-runtime/vendor/opencode-client/solid/index.d.ts +3 -0
  206. package/dist/harness-runtime/vendor/opencode-client/solid/index.js +32 -0
  207. package/dist/harness-runtime/vendor/opencode-client/solid/pty.d.ts +22 -0
  208. package/dist/harness-runtime/vendor/opencode-client/solid/pty.js +8 -0
  209. package/dist/harness-runtime/vendor/opencode-plugin.mjs +3 -0
  210. package/dist/protocol/local-files.js +18 -9
  211. package/dist/runtime/context.js +8 -4
  212. package/dist/schemas/agent-profile.schema.json +1 -1
  213. package/dist/schemas/code-review-decision.schema.json +9 -0
  214. package/dist/schemas/code-review-result.schema.json +1 -1
  215. package/dist/schemas/code-verification.schema.json +7 -5
  216. package/dist/schemas/code-work-batch.schema.json +2 -2
  217. package/dist/schemas/diagnostic-stage-result.schema.json +354 -0
  218. package/dist/schemas/diagnostic-work-result.schema.json +296 -0
  219. package/dist/schemas/discovery-result.schema.json +184 -0
  220. package/dist/schemas/execution-bundle.schema.json +211 -0
  221. package/dist/schemas/execution-settings.schema.json +162 -0
  222. package/dist/schemas/flow-descriptor.schema.json +54 -0
  223. package/dist/schemas/flow-run.schema.json +29 -0
  224. package/dist/schemas/harness-catalog.schema.json +80 -0
  225. package/dist/schemas/mb-init-compose-result.schema.json +457 -0
  226. package/dist/schemas/mb-init-discover-result.schema.json +500 -0
  227. package/dist/schemas/mb-init-finish-result.schema.json +422 -0
  228. package/dist/schemas/mb-init-preflight-result.schema.json +367 -0
  229. package/dist/schemas/mb-init-review-result.schema.json +396 -0
  230. package/dist/schemas/mb-init-verify-result.schema.json +391 -0
  231. package/dist/schemas/mb-upgrade-stage-result.schema.json +863 -0
  232. package/dist/schemas/memory-bootstrap-receipt-v2.schema.json +67 -0
  233. package/dist/schemas/memory-bootstrap-receipt.schema.json +354 -0
  234. package/dist/schemas/memory-composition-work-result.schema.json +38 -0
  235. package/dist/schemas/memory-repair-work-result.schema.json +56 -0
  236. package/dist/schemas/memory-review-correction-plan.schema.json +30 -0
  237. package/dist/schemas/memory-review-work-result.schema.json +43 -0
  238. package/dist/schemas/model-catalog.schema.json +153 -0
  239. package/dist/schemas/plan-review-decision.schema.json +12 -3
  240. package/dist/schemas/plan-review-result.schema.json +2 -2
  241. package/dist/schemas/profile-settings.schema.json +122 -0
  242. package/dist/schemas/project-flow-pack-manifest.schema.json +1 -1
  243. package/dist/schemas/release-impact.schema.json +3 -3
  244. package/dist/schemas/release-manifest.schema.json +291 -0
  245. package/dist/schemas/run-control-receipt.schema.json +118 -0
  246. package/dist/schemas/run-control-request.schema.json +36 -0
  247. package/dist/schemas/run-engine-binding.schema.json +1 -1
  248. package/dist/schemas/stage-start-response.schema.json +4 -0
  249. package/dist/schemas/vnext-protocol-plan.schema.json +2 -2
  250. package/dist/services/accepted-intent.js +139 -0
  251. package/dist/services/branch-context.js +3 -3
  252. package/dist/services/canon.js +54 -15
  253. package/dist/services/check-environment.js +21 -0
  254. package/dist/services/check-runner-evidence.js +562 -0
  255. package/dist/services/cleanup.js +133 -40
  256. package/dist/services/cli-operation-classifier.js +26 -63
  257. package/dist/services/cli-upgrade-allowlist.js +27 -0
  258. package/dist/services/code-checks.js +1398 -119
  259. package/dist/services/codex-hook-delivery.js +32 -0
  260. package/dist/services/command-context.js +80 -0
  261. package/dist/services/compatibility-preflight.js +16 -3
  262. package/dist/services/config.js +11 -8
  263. package/dist/services/continuation-outcome.js +20 -0
  264. package/dist/services/controller-child-capacity.js +13 -0
  265. package/dist/services/controller-child-observer.js +115 -0
  266. package/dist/services/controller-execution.js +94 -0
  267. package/dist/services/controller-fanout.js +226 -0
  268. package/dist/services/controller-memory-task.js +45 -0
  269. package/dist/services/controller-memory-worker.js +49 -0
  270. package/dist/services/dashboard.js +143 -58
  271. package/dist/services/descriptor-coordinator-session.js +35 -0
  272. package/dist/services/descriptor-root-work.js +53 -0
  273. package/dist/services/descriptor-run-settlement.js +107 -0
  274. package/dist/services/descriptor-run-start.js +475 -0
  275. package/dist/services/descriptor-stage-coordinator.js +250 -0
  276. package/dist/services/descriptor-stage-settlement.js +223 -0
  277. package/dist/services/descriptor-stage-start.js +175 -0
  278. package/dist/services/diagnostic-evidence.js +73 -0
  279. package/dist/services/diagnostic-report-publication.js +72 -0
  280. package/dist/services/diagnostic-report.js +67 -0
  281. package/dist/services/diagnostic-run-bundle.js +74 -0
  282. package/dist/services/diagnostic-snapshot.js +159 -0
  283. package/dist/services/diagnostic-stage-handlers.js +108 -0
  284. package/dist/services/diagnostic-stage-results.js +132 -0
  285. package/dist/services/diagnostic-start.js +84 -0
  286. package/dist/services/diagnostic-work-batch.js +34 -0
  287. package/dist/services/diagnostic-work-collection.js +97 -0
  288. package/dist/services/diagnostic-work-registration.js +101 -0
  289. package/dist/services/diagnostic-work-results.js +93 -0
  290. package/dist/services/discovery/agy-discovery.js +2 -0
  291. package/dist/services/discovery/codex-discovery.js +2 -0
  292. package/dist/services/discovery/droid-discovery.js +2 -0
  293. package/dist/services/discovery/grok-discovery.js +2 -0
  294. package/dist/services/discovery/opencode-discovery.js +2 -0
  295. package/dist/services/discovery/static.js +31 -0
  296. package/dist/services/discovery/zcode-discovery.js +2 -0
  297. package/dist/services/engines.js +354 -163
  298. package/dist/services/eval-snapshots.js +1316 -150
  299. package/dist/services/execution-bundles.js +275 -0
  300. package/dist/services/execution-policy.js +185 -0
  301. package/dist/services/executor-onboarding.js +56 -0
  302. package/dist/services/external-work-launch.js +310 -0
  303. package/dist/services/flow-catalog.js +30 -0
  304. package/dist/services/flow-descriptors.js +82 -0
  305. package/dist/services/frozen-engine.js +387 -0
  306. package/dist/services/generic-execution.js +164 -0
  307. package/dist/services/harness-adapter.js +355 -36
  308. package/dist/services/harness-config.js +2 -0
  309. package/dist/services/harness-discovery.js +29 -0
  310. package/dist/services/harness-doctor.js +75 -0
  311. package/dist/services/harness-probe-effects.js +51 -0
  312. package/dist/services/harness-version-probe.js +100 -0
  313. package/dist/services/hook-memory-routing.js +188 -0
  314. package/dist/services/hook-recovery-guard.js +14 -0
  315. package/dist/services/hook-session-observation.js +24 -0
  316. package/dist/services/hooks.js +791 -326
  317. package/dist/services/hybrid-contracts.js +474 -0
  318. package/dist/services/hybrid-digest.js +14 -0
  319. package/dist/services/ids.js +29 -1
  320. package/dist/services/installation-lock.js +95 -0
  321. package/dist/services/installed-flow-source.js +226 -0
  322. package/dist/services/lanes.js +78 -65
  323. package/dist/services/lifecycle-command.js +1 -288
  324. package/dist/services/lifecycle-contract.js +1 -0
  325. package/dist/services/lifecycle-invocations.js +2148 -0
  326. package/dist/services/managed-daemon-binding.js +38 -0
  327. package/dist/services/managed-lease-monitor.js +133 -0
  328. package/dist/services/managed-processes.js +449 -69
  329. package/dist/services/memory-accepted-composition.js +78 -0
  330. package/dist/services/memory-baseline-preservation.js +65 -0
  331. package/dist/services/memory-completed-correction-wave.js +328 -0
  332. package/dist/services/memory-compose-handler.js +400 -0
  333. package/dist/services/memory-composition-acceptance.js +375 -0
  334. package/dist/services/memory-composition-graph.js +165 -0
  335. package/dist/services/memory-composition-registration.js +161 -0
  336. package/dist/services/memory-composition-work-custody.js +156 -0
  337. package/dist/services/memory-composition-work-results.js +108 -0
  338. package/dist/services/memory-corrected-review-acceptance.js +129 -0
  339. package/dist/services/memory-corrected-review-batch.js +37 -0
  340. package/dist/services/memory-corrected-review-findings.js +108 -0
  341. package/dist/services/memory-corrected-review-inputs.js +215 -0
  342. package/dist/services/memory-corrected-review-projection.js +78 -0
  343. package/dist/services/memory-corrected-review-receipt.js +178 -0
  344. package/dist/services/memory-corrected-review-registration.js +192 -0
  345. package/dist/services/memory-correction-check-receipt.js +235 -0
  346. package/dist/services/memory-correction-input-owner.js +6 -0
  347. package/dist/services/memory-custody-snapshot.js +36 -0
  348. package/dist/services/memory-discover-handler.js +104 -0
  349. package/dist/services/memory-finish-evidence.js +457 -0
  350. package/dist/services/memory-finish-handler.js +229 -0
  351. package/dist/services/memory-finish-integration.js +450 -0
  352. package/dist/services/memory-finish-readiness.js +169 -0
  353. package/dist/services/memory-git-integration.js +220 -0
  354. package/dist/services/memory-historical-corrected-review.js +212 -0
  355. package/dist/services/memory-historical-original-review.js +143 -0
  356. package/dist/services/memory-historical-repair-registration.js +105 -0
  357. package/dist/services/memory-historical-second-review.js +147 -0
  358. package/dist/services/memory-init-bootstrap-readiness.js +210 -0
  359. package/dist/services/memory-init-contexts.js +131 -0
  360. package/dist/services/memory-init-controller-start.js +103 -0
  361. package/dist/services/memory-init-engine-release.js +223 -0
  362. package/dist/services/memory-init-git-policy.js +165 -0
  363. package/dist/services/memory-init-lint-capability.js +203 -0
  364. package/dist/services/memory-init-native-capacity.js +309 -0
  365. package/dist/services/memory-init-preflight.js +334 -0
  366. package/dist/services/memory-init-project-bootstrap.js +599 -0
  367. package/dist/services/memory-init-request-candidate.js +213 -0
  368. package/dist/services/memory-init-request-input.js +82 -0
  369. package/dist/services/memory-init-resource-storage.js +125 -0
  370. package/dist/services/memory-init-run-allocation.js +81 -0
  371. package/dist/services/memory-init-run-bundle.js +135 -0
  372. package/dist/services/memory-init-start.js +181 -0
  373. package/dist/services/memory-init-startup-custody.js +80 -0
  374. package/dist/services/memory-init-startup-input.js +240 -0
  375. package/dist/services/memory-init-storage.js +91 -0
  376. package/dist/services/memory-init-stores.js +359 -0
  377. package/dist/services/memory-init-worktrunk-capability.js +174 -0
  378. package/dist/services/memory-layer-publication.js +611 -0
  379. package/dist/services/memory-layer.js +221 -0
  380. package/dist/services/memory-lint-config.js +194 -0
  381. package/dist/services/memory-native-review-copy.js +103 -0
  382. package/dist/services/memory-normal-flow-entry.js +87 -0
  383. package/dist/services/memory-ordinary-defaults.js +129 -0
  384. package/dist/services/memory-preflight-bootstrap-custody.js +115 -0
  385. package/dist/services/memory-preflight-handler.js +274 -0
  386. package/dist/services/memory-repair-current-view.js +299 -0
  387. package/dist/services/memory-repair-document-delta.js +488 -0
  388. package/dist/services/memory-repair-history.js +496 -0
  389. package/dist/services/memory-repair-physical-binding.js +194 -0
  390. package/dist/services/memory-repair-publication-files.js +152 -0
  391. package/dist/services/memory-repair-publication-intent.js +27 -0
  392. package/dist/services/memory-repair-publication-plan.js +162 -0
  393. package/dist/services/memory-repair-publication-source.js +225 -0
  394. package/dist/services/memory-repair-publication.js +795 -0
  395. package/dist/services/memory-repair-registration.js +240 -0
  396. package/dist/services/memory-repair-work-baseline.js +415 -0
  397. package/dist/services/memory-repair-work-completion.js +117 -0
  398. package/dist/services/memory-repair-work-custody.js +73 -0
  399. package/dist/services/memory-repair-work-results.js +108 -0
  400. package/dist/services/memory-repair-workspace.js +261 -0
  401. package/dist/services/memory-repair-writer-copy.js +736 -0
  402. package/dist/services/memory-result-binding.js +239 -0
  403. package/dist/services/memory-retained-review-authority.js +138 -0
  404. package/dist/services/memory-retained-review-results.js +70 -0
  405. package/dist/services/memory-retained-second-baseline.js +102 -0
  406. package/dist/services/memory-retained-second-repairs.js +162 -0
  407. package/dist/services/memory-review-acceptance.js +214 -0
  408. package/dist/services/memory-review-correction-plan.js +206 -0
  409. package/dist/services/memory-review-handler.js +585 -0
  410. package/dist/services/memory-review-inputs.js +246 -0
  411. package/dist/services/memory-review-limits.js +10 -0
  412. package/dist/services/memory-review-receipt.js +180 -0
  413. package/dist/services/memory-review-registration.js +117 -0
  414. package/dist/services/memory-review-work-custody.js +126 -0
  415. package/dist/services/memory-review-work-input.js +91 -0
  416. package/dist/services/memory-review-work-results.js +95 -0
  417. package/dist/services/memory-second-corrected-review-inputs.js +167 -0
  418. package/dist/services/memory-second-correction-plan.js +77 -0
  419. package/dist/services/memory-second-repair-baseline.js +91 -0
  420. package/dist/services/memory-second-repair-launch.js +614 -0
  421. package/dist/services/memory-second-repair-registration.js +88 -0
  422. package/dist/services/memory-second-repair-source.js +187 -0
  423. package/dist/services/memory-second-review-acceptance.js +115 -0
  424. package/dist/services/memory-source-observations.js +117 -0
  425. package/dist/services/memory-stage-dispatch.js +65 -0
  426. package/dist/services/memory-stage-results.js +290 -0
  427. package/dist/services/memory-tool-probe.js +25 -0
  428. package/dist/services/memory-upgrade-analysis-handler.js +243 -0
  429. package/dist/services/memory-upgrade-bootstrap-readiness.js +251 -0
  430. package/dist/services/memory-upgrade-evidence.js +100 -0
  431. package/dist/services/memory-upgrade-inventory.js +442 -0
  432. package/dist/services/memory-upgrade-publication-custody.js +73 -0
  433. package/dist/services/memory-upgrade-publication.js +413 -0
  434. package/dist/services/memory-upgrade-selection.js +430 -0
  435. package/dist/services/memory-upgrade-start.js +60 -0
  436. package/dist/services/memory-upgrade-storage-readiness.js +340 -0
  437. package/dist/services/memory-verification-acceptance.js +156 -0
  438. package/dist/services/memory-verification-checks.js +317 -0
  439. package/dist/services/memory-verification-receipt.js +160 -0
  440. package/dist/services/memory-verify-handler.js +137 -0
  441. package/dist/services/memory-work-result-json.js +12 -0
  442. package/dist/services/memory-work-result-preparation.js +64 -0
  443. package/dist/services/merge-queue.js +228 -149
  444. package/dist/services/merge-server.js +163 -35
  445. package/dist/services/migrations.js +164 -114
  446. package/dist/services/model-catalog.js +109 -0
  447. package/dist/services/model-discovery.js +46 -0
  448. package/dist/services/native-daemon-history.js +50 -0
  449. package/dist/services/native-session-control.js +39 -0
  450. package/dist/services/operator-profiles.js +236 -0
  451. package/dist/services/physical-startup.js +45 -0
  452. package/dist/services/plan-runtime.js +26 -11
  453. package/dist/services/plans.js +28 -25
  454. package/dist/services/project-registry.js +97 -0
  455. package/dist/services/project-summary.js +1 -1
  456. package/dist/services/projects.js +17 -87
  457. package/dist/services/prompt-delivery.js +71 -0
  458. package/dist/services/prompts.js +28 -17
  459. package/dist/services/protocols.js +163 -87
  460. package/dist/services/provider-capacity.js +455 -0
  461. package/dist/services/recovery-observation-budget.js +121 -0
  462. package/dist/services/recovery-snapshot-database.js +588 -0
  463. package/dist/services/release-archive-producer.js +52 -0
  464. package/dist/services/release-archive.js +143 -0
  465. package/dist/services/release-cache.js +150 -0
  466. package/dist/services/release-compatibility.js +18 -0
  467. package/dist/services/release-download.js +67 -0
  468. package/dist/services/release-envelope.js +104 -0
  469. package/dist/services/release-manifest.js +45 -0
  470. package/dist/services/release-payload.js +114 -0
  471. package/dist/services/release-producer.js +63 -0
  472. package/dist/services/release-provenance.js +160 -0
  473. package/dist/services/release-registry.js +66 -0
  474. package/dist/services/release-source.js +194 -0
  475. package/dist/services/repair-intents.js +31 -0
  476. package/dist/services/repair-receipt.js +13 -0
  477. package/dist/services/review-copy.js +165 -0
  478. package/dist/services/review-deferral.js +23 -0
  479. package/dist/services/run-control-receipt.js +56 -0
  480. package/dist/services/run-control-worker.js +428 -0
  481. package/dist/services/run-control.js +1092 -0
  482. package/dist/services/run-controller-adapter.js +400 -0
  483. package/dist/services/run-controller-capture.js +186 -0
  484. package/dist/services/run-controller-process.js +205 -0
  485. package/dist/services/run-controller-recovery.js +295 -0
  486. package/dist/services/run-controller-state.js +97 -0
  487. package/dist/services/run-controller.js +1326 -0
  488. package/dist/services/run-engine-bindings.js +1 -1
  489. package/dist/services/run-fork.js +147 -0
  490. package/dist/services/run-health.js +149 -0
  491. package/dist/services/run-observations.js +152 -0
  492. package/dist/services/run-projection.js +22 -64
  493. package/dist/services/run-recovery-guard.js +107 -0
  494. package/dist/services/run-recovery-runtime.js +112 -0
  495. package/dist/services/run-recovery.js +456 -0
  496. package/dist/services/run-start-custody.js +189 -0
  497. package/dist/services/runs.js +1023 -246
  498. package/dist/services/runtime-budget.js +446 -0
  499. package/dist/services/runtime-command.js +43 -0
  500. package/dist/services/runtime-scope-capture.js +52 -0
  501. package/dist/services/runtime-scope-control.js +468 -0
  502. package/dist/services/runtime-scope-resume.js +605 -0
  503. package/dist/services/runtime-scope-stop.js +211 -0
  504. package/dist/services/runtime-scope-worker.js +314 -0
  505. package/dist/services/runtime-service.js +19 -14
  506. package/dist/services/schema-validation.js +10 -8
  507. package/dist/services/scope-writer-cleanup.js +27 -0
  508. package/dist/services/sessions.js +36 -91
  509. package/dist/services/setup.js +427 -0
  510. package/dist/services/stage-blocker.js +17 -7
  511. package/dist/services/stage-context.js +193 -19
  512. package/dist/services/stage-handlers.js +89 -0
  513. package/dist/services/stage-lifecycle.js +152 -116
  514. package/dist/services/stage-pause.js +202 -91
  515. package/dist/services/stage-report-renderer.js +234 -6
  516. package/dist/services/stage-work-graph.js +52 -0
  517. package/dist/services/tooling.js +41 -30
  518. package/dist/services/usage.js +49 -101
  519. package/dist/services/verification-matrix.js +393 -0
  520. package/dist/services/version-status.js +1 -1
  521. package/dist/services/vnext-code-review.js +235 -88
  522. package/dist/services/vnext-code.js +327 -226
  523. package/dist/services/vnext-contracts.js +10 -1
  524. package/dist/services/vnext-execution-profile.js +80 -5
  525. package/dist/services/vnext-fanout.js +355 -21
  526. package/dist/services/vnext-merge.js +332 -111
  527. package/dist/services/vnext-plan-review.js +287 -132
  528. package/dist/services/vnext-plan.js +228 -104
  529. package/dist/services/vnext-protocolize.js +533 -95
  530. package/dist/services/vnext-specify.js +123 -81
  531. package/dist/services/vnext-workspace-policy.js +7 -2
  532. package/dist/services/work-registry.js +1706 -200
  533. package/dist/services/workspace-bootstrap.js +53 -15
  534. package/dist/services/workspace-files.js +85 -0
  535. package/dist/services/worktrees.js +105 -48
  536. package/dist/shared/entity-references.js +1 -0
  537. package/dist/shared/errors.js +27 -0
  538. package/dist/storage/agent-output.js +26 -0
  539. package/dist/storage/data-preservation.js +65 -0
  540. package/dist/storage/database.js +930 -40
  541. package/dist/storage/foreign-key-transaction.js +39 -0
  542. package/dist/storage/immutable-input.js +45 -0
  543. package/dist/storage/import-guard.js +159 -0
  544. package/dist/storage/memory-upgrade-schema-bootstrap.js +38 -0
  545. package/dist/storage/native-cleanup.js +52 -0
  546. package/dist/storage/paired-writer-migration.js +424 -0
  547. package/dist/storage/paths.js +17 -4
  548. package/dist/storage/projection-lock.js +73 -0
  549. package/dist/storage/work-references.js +23 -0
  550. package/dist/storage/writer-contract.js +96 -0
  551. package/dist/storage/writer-migration.js +346 -0
  552. package/dist/storage/writer-restore.js +217 -0
  553. package/package.json +50 -13
  554. package/tools/create-canon-release.mjs +33 -0
  555. package/tools/probe-codex-history.mjs +37 -0
  556. package/tools/produce-hybrid-release.mjs +41 -0
  557. package/tools/repair-paused-run-status.mjs +84 -0
@@ -0,0 +1,290 @@
1
+ import path from "node:path";
2
+ import { createHash } from "node:crypto";
3
+ import { Ajv2020 } from "ajv/dist/2020.js";
4
+ import { AppError } from "../shared/errors.js";
5
+ import { hybridDigest } from "./hybrid-contracts.js";
6
+ import { validateMemoryCompositionGraph, memoryCompositionOutputAllowed } from "./memory-composition-graph.js";
7
+ import { FrozenGenericExecution } from "./generic-execution.js";
8
+ const memoryStages = {
9
+ "mb-init": ["preflight", "discover", "compose", "verify", "review", "finish"],
10
+ "mb-upgrade": ["preflight", "diff-analysis", "upgrade", "verify", "review", "finish"]
11
+ };
12
+ const sha = (value) => /^[a-f0-9]{64}$/.test(value);
13
+ // Proposal relationships/scopes can be corrected before any acceptance or Work
14
+ // allocation. Missing/foreign runtime bindings and identities remain fatal.
15
+ const correctableProposalReasons = new Set([
16
+ "unsafe_reference_path",
17
+ "foreign_predecessor_reference", "duplicate_unit", "changed_unit_coverage", "duplicate_finding", "foreign_finding_unit",
18
+ "duplicate_fact", "foreign_fact_unit", "foreign_unit_reference", "unobserved_or_changed_source",
19
+ "duplicate_preservation_invariant", "weakened_upgrade_mode", "changed_preservation_invariants", "missing_applicable_unit_preservation",
20
+ "duplicate_preservation_assessment", "incomplete_preservation_assessment", "foreign_preservation_unit", "unreviewable_preservation_unit", "unapproved_composition_profile",
21
+ "unresolved_composition_applicability", "duplicate_composition_work", "unknown_composition_dependency", "duplicate_composition_scope",
22
+ "unbounded_composition_write", "foreign_composition_write", "canonical_composition_write", "private_composition_write",
23
+ "authority_composition_write", "foreign_composition_run_write", "cyclic_composition_dependency", "invalid_assembly_membership",
24
+ "mechanical_unit_cannot_allocate_agent_work", "inapplicable_composition_work", "incomplete_composition_coverage",
25
+ "assembly_precedes_unit_writers", "unordered_composition_writers", "unordered_composition_read_write"
26
+ ]);
27
+ function refuse(reason, details = {}) {
28
+ throw new AppError("memory_stage_result_invalid", reason === "missing_applicable_unit_preservation"
29
+ ? "Every applicable upgrade unit requires a source-backed preservation invariant. In preflight add the invariant; in diff-analysis keep the accepted invariants unchanged and assign the planned work to their existing units"
30
+ : "Memory stage result is not bound to its retained input", 2, { ...details, reason, phase: "prepare", effect: "no_effect" });
31
+ }
32
+ function contained(logical, allowRoot = false, proposal = false) {
33
+ if (allowRoot && logical === ".")
34
+ return;
35
+ if (!logical || path.posix.isAbsolute(logical) || path.win32.isAbsolute(logical) || logical.includes("\\")
36
+ || logical.includes("\0") || logical.split("/").some(segment => !segment || segment === "." || segment === ".."))
37
+ refuse("unsafe_reference_path", { recoverable: proposal });
38
+ }
39
+ export function memorySourceKey(root, logical) { return `${root}\0${logical}`; }
40
+ function unique(values, reason) {
41
+ if (new Set(values).size !== values.length)
42
+ refuse(reason);
43
+ return new Set(values);
44
+ }
45
+ /** Read-only result preparation. The stage handler must still establish physical check,
46
+ * Work/reviewer, bootstrap, integration and readiness custody before settlement.
47
+ * Schema validity and source identity are not semantic completeness or finish authority.
48
+ */
49
+ export class PreparedMemoryStageResult {
50
+ sha256;
51
+ #bytes;
52
+ #value;
53
+ #routes;
54
+ #executionSha256;
55
+ #preflight;
56
+ #upgradeWritePaths;
57
+ #mechanicalUnits;
58
+ #preservationInvariants;
59
+ #upgradeEvidenceIndex;
60
+ constructor(bytes, value, routes, executionSha256, preflight, upgradeWritePaths, mechanicalUnits, preservationInvariants, upgradeEvidenceIndex) {
61
+ this.#bytes = Buffer.from(bytes);
62
+ this.#value = structuredClone(value);
63
+ this.#routes = structuredClone(routes);
64
+ this.#executionSha256 = executionSha256;
65
+ this.#preflight = structuredClone(preflight);
66
+ this.#upgradeWritePaths = upgradeWritePaths ? new Set(upgradeWritePaths) : null;
67
+ this.#mechanicalUnits = new Set(mechanicalUnits);
68
+ this.#preservationInvariants = structuredClone(preservationInvariants);
69
+ this.#upgradeEvidenceIndex = structuredClone(upgradeEvidenceIndex);
70
+ this.sha256 = createHash("sha256").update(bytes).digest("hex");
71
+ Object.freeze(this);
72
+ }
73
+ static prepare(input, flow, binding) {
74
+ try {
75
+ const stages = memoryStages[flow.descriptor.id], upgrade = flow.descriptor.id === "mb-upgrade";
76
+ if (input.byteLength < 1 || input.byteLength > 1024 * 1024 || !stages
77
+ || !stages.includes(binding.stage) || !binding.runId || !sha(binding.inputSha256))
78
+ refuse("invalid_input_binding");
79
+ if (upgrade && (!binding.upgrade || !["patch", "targeted_minor", "full_migration"].includes(binding.upgrade.minimumMode)))
80
+ refuse("missing_upgrade_impact_binding");
81
+ if (binding.upgrade?.evidenceIndex && (binding.upgrade.evidenceIndex.path !== "upgrade-baseline.json" || !sha(binding.upgrade.evidenceIndex.sha256)))
82
+ refuse("invalid_upgrade_evidence_binding");
83
+ const bytes = Buffer.from(input), value = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
84
+ const schema = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(flow.stageBlob(binding.stage, "result_schema")));
85
+ if (schema.$id !== (upgrade ? "dd-flow/mb-upgrade-stage-result@1" : `dd-flow/mb-init-${binding.stage}-result@1`))
86
+ refuse("invalid_result_schema");
87
+ const validate = new Ajv2020({ strict: true, strictRequired: false, validateFormats: false }).compile(schema);
88
+ if (!validate(value))
89
+ throw new AppError("memory_stage_result_invalid", "Memory stage result proposal does not match its schema", 2, { reason: "invalid_result_schema", phase: "prepare", effect: "no_effect", recoverable: true,
90
+ errors: structuredClone(validate.errors), result_sha256: createHash("sha256").update(bytes).digest("hex") });
91
+ if (value.run_id !== binding.runId || value.stage !== binding.stage || value.input_sha256 !== binding.inputSha256)
92
+ refuse("foreign_result_identity");
93
+ const isEntry = flow.descriptor.entry_stage === binding.stage;
94
+ if (binding.predecessors.length !== (isEntry ? 0 : 1))
95
+ refuse("incomplete_predecessor_binding");
96
+ for (const predecessor of binding.predecessors) {
97
+ contained(predecessor.result.path);
98
+ if (!sha(predecessor.result.sha256) || !sha(predecessor.input_sha256)
99
+ || flow.successor(predecessor.stage, "accepted") !== binding.stage)
100
+ refuse("foreign_predecessor_binding");
101
+ }
102
+ if (hybridDigest(value.predecessors) !== hybridDigest(binding.predecessors))
103
+ refuse("foreign_predecessor_reference");
104
+ const units = unique(value.units.map(unit => unit.id), "duplicate_unit");
105
+ if (binding.unitIds === null) {
106
+ if (!["preflight", upgrade ? "diff-analysis" : "discover"].includes(binding.stage))
107
+ refuse("missing_unit_inventory");
108
+ }
109
+ else {
110
+ const expected = unique(binding.unitIds, "duplicate_bound_unit");
111
+ if (units.size !== expected.size || [...units].some(id => !expected.has(id)))
112
+ refuse("changed_unit_coverage");
113
+ }
114
+ unique(value.findings.map(finding => finding.id), "duplicate_finding");
115
+ if (value.findings.some(finding => !units.has(finding.unit_id)))
116
+ refuse("foreign_finding_unit");
117
+ const facts = value.details.facts;
118
+ if (binding.stage === "discover") {
119
+ unique(facts.map(fact => fact.id), "duplicate_fact");
120
+ if (facts.some(fact => !units.has(fact.unit_id)))
121
+ refuse("foreign_fact_unit");
122
+ }
123
+ const visit = (node, role = "source") => {
124
+ if (Array.isArray(node)) {
125
+ node.forEach(child => visit(child, role));
126
+ return;
127
+ }
128
+ if (!node || typeof node !== "object")
129
+ return;
130
+ const record = node;
131
+ if (typeof record.unit_id === "string" && !units.has(record.unit_id))
132
+ refuse("foreign_unit_reference", { unit_id: record.unit_id.slice(0, 256) });
133
+ if (Array.isArray(record.unit_ids) && record.unit_ids.some(id => typeof id !== "string" || !units.has(id)))
134
+ refuse("foreign_unit_reference", { unit_ids: record.unit_ids.filter(id => typeof id !== "string" || !units.has(id)).slice(0, 8).map(id => String(id).slice(0, 256)) });
135
+ if (typeof record.path === "string" && (typeof record.root === "string" || typeof record.sha256 === "string"))
136
+ contained(record.path, typeof record.root === "string" && record.sha256 === undefined, true);
137
+ if (typeof record.root === "string" && typeof record.path === "string" && typeof record.sha256 === "string") {
138
+ const key = memorySourceKey(record.root, record.path);
139
+ if (binding.sources.get(key) !== record.sha256 && !(role === "evidence" && binding.historicalEvidence?.has(`${key}\0${record.sha256}`)))
140
+ refuse("unobserved_or_changed_source");
141
+ }
142
+ Object.entries(record).forEach(([key, child]) => visit(child, key === "evidence" || key === "artifacts" ? key : role));
143
+ };
144
+ visit(value);
145
+ if (upgrade) {
146
+ const invariants = value.details.preservation_invariants;
147
+ if (invariants)
148
+ unique(invariants.map(item => String(item.id)), "duplicate_preservation_invariant");
149
+ const expected = binding.upgrade.preservationInvariants;
150
+ if (binding.stage !== "preflight" && !expected)
151
+ refuse("missing_upgrade_preservation_binding");
152
+ if (binding.stage === "diff-analysis") {
153
+ const modes = ["patch", "targeted_minor", "full_migration"];
154
+ if (modes.indexOf(String(value.details.mode)) < modes.indexOf(binding.upgrade.minimumMode))
155
+ refuse("weakened_upgrade_mode");
156
+ const ordered = (items) => [...items].sort((a, b) => String(a.id).localeCompare(String(b.id), "en"));
157
+ if (hybridDigest(ordered(invariants)) !== hybridDigest(ordered(expected)))
158
+ refuse("changed_preservation_invariants");
159
+ for (const change of value.details.path_map) {
160
+ if (change.from !== null)
161
+ contained(change.from, false, true);
162
+ if (change.to !== null)
163
+ contained(change.to, false, true);
164
+ }
165
+ }
166
+ const unreviewable = (invariants ?? expected ?? []).filter(item => !value.units.some(unit => unit.id === item.unit_id && unit.applicability === "applicable"));
167
+ if (unreviewable.length)
168
+ refuse("unreviewable_preservation_unit", {
169
+ unit_ids: [...new Set(unreviewable.map(item => item.unit_id))].slice(0, 8),
170
+ invariant_ids: unreviewable.map(item => item.id).slice(0, 8),
171
+ hint: binding.stage === "preflight"
172
+ ? "Each preservation criterion needs an applicable assessment unit. Bind a no-migration criterion to an applicable provenance/readiness unit; this does not require migration Work or an apply receipt."
173
+ : "Keep each retained preservation criterion assigned to an applicable assessment unit. Correct proposed applicability, not accepted invariant identities or predecessor bytes."
174
+ });
175
+ if (binding.stage === "preflight" || binding.stage === "diff-analysis") {
176
+ const uncovered = value.units.filter(unit => unit.applicability === "applicable" && !invariants.some(item => item.unit_id === unit.id));
177
+ if (uncovered.length)
178
+ refuse("missing_applicable_unit_preservation", { unit_ids: uncovered.map(unit => unit.id).slice(0, 8) });
179
+ }
180
+ if (binding.stage === "verify") {
181
+ const assessments = value.details.preservation_assessments;
182
+ const selected = unique(assessments.map(item => item.invariant_id), "duplicate_preservation_assessment");
183
+ if (selected.size !== expected.length || expected.some(item => !selected.has(String(item.id))))
184
+ refuse("incomplete_preservation_assessment");
185
+ if (assessments.some(item => expected.find(original => original.id === item.invariant_id)?.unit_id !== item.unit_id))
186
+ refuse("foreign_preservation_unit");
187
+ }
188
+ }
189
+ let routes = null;
190
+ const authoringPaths = upgrade && binding.stage === "upgrade" ? binding.upgrade?.authoringPaths : undefined;
191
+ if (binding.stage === "compose" || authoringPaths) {
192
+ validateMemoryCompositionGraph(value, authoringPaths, authoringPaths ? binding.upgrade?.mechanicalUnits : undefined);
193
+ if (!(binding.execution instanceof FrozenGenericExecution) || binding.execution.settings.flow_id !== flow.descriptor.id
194
+ || binding.execution.settings.descriptor_sha256 !== flow.sha256 || binding.execution.sha256 !== binding.executionSha256)
195
+ refuse("missing_or_foreign_composition_execution");
196
+ const works = value.details.works;
197
+ try {
198
+ routes = works.map(work => ({ key: work.key, execution: binding.execution.work(binding.stage, work.profile_id ?? undefined) }));
199
+ }
200
+ catch {
201
+ refuse("unapproved_composition_profile");
202
+ }
203
+ }
204
+ if (binding.preflight) {
205
+ contained(binding.preflight.result.path);
206
+ if (!sha(binding.preflight.result.sha256) || !sha(binding.preflight.input_sha256)
207
+ || typeof binding.preflight.semantic_scope !== "string" || !binding.preflight.semantic_scope.trim()
208
+ || Buffer.byteLength(binding.preflight.semantic_scope) > 16384 || binding.preflight.semantic_scope.includes("\0"))
209
+ refuse("invalid_preflight_binding");
210
+ if (binding.preflight.preserved_paths !== undefined) {
211
+ if (!Array.isArray(binding.preflight.preserved_paths) || binding.preflight.preserved_paths.length > 4096)
212
+ refuse("invalid_preflight_binding");
213
+ unique(binding.preflight.preserved_paths, "duplicate_preserved_path");
214
+ for (const logical of binding.preflight.preserved_paths) {
215
+ if (typeof logical !== "string" || logical.length > 4096)
216
+ refuse("invalid_preflight_binding");
217
+ contained(logical);
218
+ }
219
+ }
220
+ }
221
+ return new PreparedMemoryStageResult(bytes, value, routes, routes ? binding.executionSha256 : null, binding.preflight ?? null, authoringPaths ? new Set([...authoringPaths.values()].flatMap(paths => [...paths])) : null, authoringPaths ? binding.upgrade?.mechanicalUnits ?? new Set() : new Set(), upgrade ? binding.upgrade?.preservationInvariants ?? [] : [], upgrade ? binding.upgrade?.evidenceIndex ?? null : null);
222
+ }
223
+ catch (error) {
224
+ if (error instanceof AppError && error.code === "memory_stage_result_invalid") {
225
+ if (correctableProposalReasons.has(String(error.details.reason)) && error.details.recoverable !== false)
226
+ throw new AppError(error.code, `Correct the proposed result (${error.details.reason}) without changing retained RUN, predecessor or execution bindings`, error.exitCode, { ...error.details, recoverable: true, result_sha256: createHash("sha256").update(input).digest("hex") });
227
+ throw error;
228
+ }
229
+ return refuse("invalid_result_or_binding");
230
+ }
231
+ }
232
+ bytes() { return Buffer.from(this.#bytes); }
233
+ mechanicalUnitIds() { return new Set(this.#mechanicalUnits); }
234
+ preservationInvariants() { return structuredClone(this.#preservationInvariants); }
235
+ value() { return structuredClone(this.#value); }
236
+ authoringStage() {
237
+ if (!this.#routes || !["compose", "upgrade"].includes(this.#value.stage))
238
+ refuse("not_a_composition_result");
239
+ return this.#value.stage;
240
+ }
241
+ allowsCompositionOutput(root, logical) {
242
+ return memoryCompositionOutputAllowed(logical, root === "workspace" && this.#upgradeWritePaths ? this.#upgradeWritePaths : undefined);
243
+ }
244
+ compositionRoutes() {
245
+ if (!this.#routes)
246
+ refuse("not_a_composition_result");
247
+ return structuredClone(this.#routes);
248
+ }
249
+ /** Pure registration input, not allocation, dispatch or stage completion authority.
250
+ * The handler must select a registered result schema and independently bind
251
+ * this result's predecessor/source custody before passing the batch to its writer.
252
+ */
253
+ compositionBatch(binding) {
254
+ const stage = this.authoringStage();
255
+ // Registration assigns unfinished authoring; only final acceptance attests
256
+ // settled outputs. A repairable blueprint is not a blocked dispatch.
257
+ if (this.#value.outcome === "blocked")
258
+ refuse("composition_not_accepted");
259
+ // Unknown facts may survive DISCOVER with a reason/next action. Unknown
260
+ // target applicability must be resolved before immutable Work assignment,
261
+ // rather than dispatching a graph that cannot later accept its own units.
262
+ if (this.#value.units.some(unit => unit.applicability === "unknown"))
263
+ refuse("unresolved_composition_applicability");
264
+ if (binding.runId !== this.#value.run_id || binding.inputSha256 !== this.#value.input_sha256
265
+ || binding.executionSha256 !== this.#executionSha256)
266
+ refuse("foreign_composition_batch_binding");
267
+ if (typeof binding.resultSchema !== "string" || !/^dd-flow\/[A-Za-z0-9][A-Za-z0-9._-]*@[1-9][0-9]*$/.test(binding.resultSchema))
268
+ refuse("invalid_composition_work_schema");
269
+ const routes = new Map(this.#routes.map(route => [route.key, route]));
270
+ const works = this.#value.details.works;
271
+ return { works: works.map(work => {
272
+ // Historical retained schemas can still be read, but cannot invent tasks.
273
+ if (typeof work.task !== "string" || !work.task.trim() || work.task.length > 16384)
274
+ refuse("missing_composition_work_task");
275
+ const packet = { schema_id: "dd-flow/memory-composition-work-packet@1", run_id: binding.runId,
276
+ stage, key: work.key, role: work.role, unit_ids: work.unit_ids,
277
+ task: work.task, depends_on: work.depends_on, result_schema: binding.resultSchema,
278
+ read_scopes: work.read_scopes, write_scopes: work.write_scopes,
279
+ compose_result_sha256: this.sha256, compose_input_sha256: binding.inputSha256,
280
+ execution_sha256: binding.executionSha256, predecessors: this.#value.predecessors };
281
+ const scopedPacket = { ...packet, ...(this.#preflight ? { preflight: structuredClone(this.#preflight) } : {}),
282
+ ...(this.#upgradeEvidenceIndex ? { upgrade_baseline: { root: "run", ...this.#upgradeEvidenceIndex },
283
+ preservation_invariants: this.#preservationInvariants.filter(item => work.unit_ids.includes(String(item.unit_id))) } : {}) };
284
+ return { key: work.key, task: work.task, depends_on: [...work.depends_on],
285
+ launch_policy: "fresh_agent_required", result_schema: binding.resultSchema,
286
+ payload: structuredClone({ memory_composition: { ...scopedPacket, packet_sha256: hybridDigest(scopedPacket) },
287
+ execution_override: { agent_profile_id: routes.get(work.key).execution.worker.id } }) };
288
+ }) };
289
+ }
290
+ }
@@ -0,0 +1,25 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { createHash } from "node:crypto";
3
+ import { SETUP_STARTUP_MS, setupReporter } from "../harness-runtime/lib/setup-progress.mjs";
4
+ /** Silent, local prerequisite tools are not agent Turns. Reuse the CLI setup
5
+ * startup budget; do not invent heartbeat progress or retry a failed probe. */
6
+ export function runMemoryToolProbe(executable, args, options) {
7
+ const started = performance.now();
8
+ const report = setupReporter(options.env.DD_EVAL_OPERATION_ID);
9
+ const step = createHash("sha256").update(JSON.stringify([executable, args])).digest("hex");
10
+ report("probe_started", step);
11
+ const result = spawnSync(executable, args, { ...options, shell: false, windowsHide: true,
12
+ timeout: SETUP_STARTUP_MS, maxBuffer: options.maxBuffer ?? 256 * 1024 });
13
+ report("probe_completed", step);
14
+ const error = result.error?.code ?? null;
15
+ const output = (bytes) => ({ bytes: bytes?.length ?? null,
16
+ sha256: bytes ? createHash("sha256").update(bytes).digest("hex") : null });
17
+ const stdout = output(result.stdout), stderr = output(result.stderr);
18
+ // Arbitrary tool output may contain credentials. Public errors retain typed
19
+ // outcomes and bounded custody facts, never the uncontrolled output itself.
20
+ return { result, diagnostics: { executable, args, timeout_ms: SETUP_STARTUP_MS,
21
+ elapsed_ms: Math.round(performance.now() - started), status: result.status,
22
+ signal: result.signal, error_code: error, timed_out: error === "ETIMEDOUT",
23
+ stdout_bytes: stdout.bytes, stdout_sha256: stdout.sha256,
24
+ stderr_bytes: stderr.bytes, stderr_sha256: stderr.sha256 } };
25
+ }
@@ -0,0 +1,243 @@
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 { requireProjectByRoot } from "./projects.js";
6
+ import { resolveProjectRoot } from "../storage/paths.js";
7
+ import { assertPreparedRunBundleSqlAuthority, readFlowRunExecutionBundle } from "./runs.js";
8
+ import { hybridDigest } from "./hybrid-contracts.js";
9
+ import { PreparedMemoryUpgradeBootstrapReadiness, readMemoryUpgradeBootstrapReadiness } from "./memory-upgrade-bootstrap-readiness.js";
10
+ import { readUpgradeStorageReadiness, resolveUpgradeHistoricalScope } from "./memory-upgrade-storage-readiness.js";
11
+ import { PreparedDescriptorStageStart } from "./descriptor-stage-start.js";
12
+ import { PreparedDescriptorStageCoordinator, readDescriptorStageInput } from "./descriptor-stage-coordinator.js";
13
+ import { assertMemoryOrdinaryUpgradeConfigurationCoverage } from "./memory-ordinary-defaults.js";
14
+ import { PreparedDescriptorStageSettlement } from "./descriptor-stage-settlement.js";
15
+ import { PreparedMemoryResultBinding } from "./memory-result-binding.js";
16
+ import { PreparedMemoryStageResult } from "./memory-stage-results.js";
17
+ import { ObservedMemorySources } from "./memory-source-observations.js";
18
+ import { readAcceptedStageData } from "./stage-report-renderer.js";
19
+ import { localEnvironmentAllowed, workspaceGitFiles } from "./workspace-files.js";
20
+ import { validateUpgradePathMap } from "./memory-upgrade-inventory.js";
21
+ import { readMemoryUpgradeEvidence, readIssuedMemoryUpgradeTarget } from "./memory-upgrade-evidence.js";
22
+ function refuse(reason) {
23
+ throw new AppError("memory_upgrade_analysis_handler_invalid", "Upgrade analysis requires its accepted bootstrap and original project", 2, { reason, effect: "no_effect" });
24
+ }
25
+ function rejectResult(bytes, reason, reference) {
26
+ const message = reason === "missing_impact_checks" ? "Include every required check from the issued adjacent release-impact chain in the proposed analysis result"
27
+ : reason === "symlink_source_reference" ? "Cite the issued run upgrade-baseline.json project_link_metadata for link identity, and a selected regular target file for contents; direct symlink sources are not admitted"
28
+ : reason === "analysis_not_accepted" ? "Accepted analysis cannot carry unresolved major/blocking findings. Represent planned upgrade work in units, path_map and required_checks; for a real blocker use the issued pause command. Do not mark unresolved work resolved merely to pass this gate"
29
+ : "Correct the result evidence using issued stage inputs and old/target references; controller response views and logs are not admitted evidence";
30
+ throw new AppError("memory_stage_result_invalid", message, 2, { reason, phase: "prepare", effect: "no_effect", recoverable: true,
31
+ result_sha256: createHash("sha256").update(bytes).digest("hex"),
32
+ ...(reference ? { reference: { root: String(reference.root).slice(0, 32), path: String(reference.path).slice(0, 1024) } } : {}) });
33
+ }
34
+ function selected(context, input) {
35
+ if (!["preflight", "diff-analysis"].includes(input.stage) || !(input.bytes instanceof Uint8Array) || input.bytes.length > 1024 * 1024)
36
+ refuse("invalid_stage_input");
37
+ const bundle = readFlowRunExecutionBundle(context, input);
38
+ if (!bundle || bundle.descriptor.descriptor.id !== "mb-upgrade"
39
+ || bundle.descriptor.descriptor.entry_stage !== "preflight" || bundle.descriptor.successor("preflight", "accepted") !== "diff-analysis")
40
+ refuse("registered_upgrade_bundle_required");
41
+ const project = requireProjectByRoot(context, resolveProjectRoot(input.projectRoot));
42
+ const scope = { projectId: project.id, runId: input.runId, stage: input.stage };
43
+ const run = assertPreparedRunBundleSqlAuthority(context, scope, bundle), index = JSON.parse(run.index_json);
44
+ const frozen = bundle.execution.snapshot().scope;
45
+ const bootstrapScope = { requestId: frozen.requestId, projectRoot: frozen.projectRoot, workspaceRoot: frozen.workspace };
46
+ const ready = readMemoryUpgradeBootstrapReadiness(context, bootstrapScope);
47
+ if (!ready?.hasPreservationBaseline || ready.projectId !== project.id || ready.authority.binding.execution_sha256 !== bundle.execution.sha256)
48
+ refuse("accepted_upgrade_bootstrap_required");
49
+ const predecessor = input.stage === "diff-analysis" ? readAcceptedStageData(context, { ...scope, stage: "preflight" }) : null;
50
+ const authority = hybridDigest(ready.authority);
51
+ const fence = (writer) => {
52
+ const current = readMemoryUpgradeBootstrapReadiness(writer, bootstrapScope);
53
+ if (!current || hybridDigest(current.authority) !== authority
54
+ || predecessor && readAcceptedStageData(writer, { ...scope, stage: "preflight" }).authority_sha256 !== predecessor.authority_sha256)
55
+ refuse("analysis_dependencies_changed");
56
+ };
57
+ return { bundle, scope, bootstrapScope, predecessor, fence, accepted: index.stage_runs.find((stage) => stage.stage === input.stage)?.status === "done" };
58
+ }
59
+ /** Agent references select current observations from the CLI inventory, not
60
+ * arbitrary local files. Canonical/receipt inputs come from the retained RUN
61
+ * bundle; old document evidence is independently supplied by the SQL binding.
62
+ */
63
+ function sources(context, input, state) {
64
+ let value;
65
+ try {
66
+ value = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(input.bytes));
67
+ }
68
+ catch {
69
+ return rejectResult(input.bytes, "invalid_result_json");
70
+ }
71
+ const storage = readUpgradeStorageReadiness(context, state.bootstrapScope);
72
+ if (!storage?.selection)
73
+ refuse("retained_selection_required");
74
+ const run = assertPreparedRunBundleSqlAuthority(context, state.scope, state.bundle);
75
+ const workspace = run.workspace_root ?? run.project_root;
76
+ const projectIsWorkspace = workspace === run.project_root;
77
+ const allowed = new Set([...(workspaceGitFiles(workspace, ["--cached", "--others", "--exclude-standard"]) ?? []),
78
+ ...storage.selection.payload.current.inventory.inventory.entries.filter(entry => entry.current?.kind === "file" || entry.target).map(entry => `.memory-bank/${entry.path}`)]);
79
+ const allowedRun = new Set(state.bundle.manifest.inventory.map(entry => `execution-bundle/${entry.path}`));
80
+ const oldEvidence = readMemoryUpgradeEvidence(context, state.bootstrapScope);
81
+ const oldRunHashes = new Map([[oldEvidence.reference.path, oldEvidence.reference.sha256],
82
+ ...oldEvidence.index.entries.map(entry => [entry.retained.path, entry.retained.sha256])]);
83
+ const target = readIssuedMemoryUpgradeTarget(context, state.bootstrapScope, state.scope.projectId);
84
+ if (target)
85
+ for (const ref of [target.reference, ...target.index.entries.map(entry => entry.retained)]) {
86
+ allowedRun.add(ref.path);
87
+ oldRunHashes.set(ref.path, ref.sha256);
88
+ }
89
+ const inputStage = JSON.parse(run.index_json).stage_runs.find((stage) => stage.stage === state.scope.stage);
90
+ const inputPath = `${state.bundle.descriptor.stage(state.scope.stage).directory}/stage-input.json`;
91
+ if (typeof inputStage?.input_sha256 === "string")
92
+ allowedRun.add(inputPath);
93
+ allowedRun.add(oldEvidence.reference.path);
94
+ for (const entry of oldEvidence.index.entries)
95
+ allowedRun.add(entry.retained.path);
96
+ if (state.predecessor)
97
+ allowedRun.add(state.predecessor.result.path);
98
+ const position = state.bundle.descriptor.descriptor.stages.findIndex(stage => stage.id === state.scope.stage);
99
+ for (const stage of state.bundle.descriptor.descriptor.stages.slice(0, position)) {
100
+ const accepted = readAcceptedStageData(context, { ...state.scope, stage: stage.id });
101
+ allowedRun.add(accepted.result.path);
102
+ // Accepted invariants can cite the packet that originally established
103
+ // their scope. Retain that exact issued input, not arbitrary RUN files.
104
+ if (typeof accepted.input_sha256 === "string") {
105
+ const logical = `${stage.directory}/stage-input.json`;
106
+ allowedRun.add(logical);
107
+ oldRunHashes.set(logical, accepted.input_sha256);
108
+ }
109
+ }
110
+ const historical = new Set(oldEvidence.index.entries.map(entry => `${entry.source.path}\0${entry.source.sha256}`));
111
+ const locations = new Map(), pending = [{ value, role: "source" }];
112
+ let nodes = 0;
113
+ while (pending.length) {
114
+ if (++nodes > 100_000)
115
+ rejectResult(input.bytes, "unbounded_result_tree");
116
+ const item = pending.pop(), node = item.value;
117
+ if (Array.isArray(node)) {
118
+ for (const child of node)
119
+ pending.push({ value: child, role: item.role });
120
+ continue;
121
+ }
122
+ if (!node || typeof node !== "object")
123
+ continue;
124
+ const ref = node;
125
+ if (typeof ref.root === "string" && typeof ref.path === "string" && typeof ref.sha256 === "string") {
126
+ if (ref.root === "workspace" || ref.root === "project" && projectIsWorkspace) {
127
+ if (!allowed.has(ref.path) || ref.path.split("/").some(part => [".git", "node_modules", ".dd-flow"].includes(part) || !localEnvironmentAllowed(part)))
128
+ rejectResult(input.bytes, "unselected_project_source", ref);
129
+ if (!(item.role === "evidence" && historical.has(`${ref.path}\0${ref.sha256}`))) {
130
+ // Historical retained bytes need not exist in today's tree.
131
+ let parent = workspace;
132
+ for (const part of ref.path.split("/").slice(0, -1)) {
133
+ parent = path.join(parent, part);
134
+ if (!fs.lstatSync(parent).isDirectory())
135
+ rejectResult(input.bytes, "symlink_source_reference", ref);
136
+ }
137
+ if (fs.lstatSync(path.join(workspace, ref.path), { throwIfNoEntry: false })?.isSymbolicLink())
138
+ rejectResult(input.bytes, "symlink_source_reference", ref);
139
+ }
140
+ }
141
+ else if (ref.root === "run") {
142
+ if (!allowedRun.has(ref.path))
143
+ rejectResult(input.bytes, "unselected_run_source", ref);
144
+ if (ref.path === inputPath && ref.sha256 !== inputStage?.input_sha256)
145
+ rejectResult(input.bytes, "changed_stage_input", ref);
146
+ if (oldRunHashes.has(ref.path) && oldRunHashes.get(ref.path) !== ref.sha256)
147
+ rejectResult(input.bytes, "changed_old_evidence", ref);
148
+ }
149
+ else
150
+ rejectResult(input.bytes, "unselected_source_root", ref);
151
+ // The accepted old tree remains evidence after a canonical path is
152
+ // replaced or archived. It never qualifies a current output artifact.
153
+ if (!(item.role === "evidence" && ["workspace", "project"].includes(ref.root) && historical.has(`${ref.path}\0${ref.sha256}`)))
154
+ locations.set(`${ref.root}\0${ref.path}`, { root: ref.root, path: ref.path });
155
+ }
156
+ for (const [key, child] of Object.entries(ref))
157
+ pending.push({ value: child, role: key === "evidence" || key === "artifacts" ? key : item.role });
158
+ }
159
+ return ObservedMemorySources.capture({ workspace, ...(projectIsWorkspace ? { project: workspace } : {}), run: run.run_root ?? run.run_dir }, [...locations.values()]);
160
+ }
161
+ /** Shared upgrade observation path for registered authoring/review consumers.
162
+ * The source witness grants no Stage, Work or canonical-write authority. */
163
+ export function captureMemoryUpgradeSources(context, bundle, stage, bytes) {
164
+ if (bundle.descriptor.descriptor.id !== "mb-upgrade" || !(bytes instanceof Uint8Array) || bytes.length > 1024 * 1024)
165
+ refuse("invalid_stage_input");
166
+ bundle.descriptor.stage(stage);
167
+ const frozen = bundle.execution.snapshot().scope;
168
+ const bootstrapScope = { requestId: frozen.requestId, projectRoot: frozen.projectRoot, workspaceRoot: frozen.workspace };
169
+ const { projectId } = resolveUpgradeHistoricalScope(context, bootstrapScope);
170
+ const scope = { projectId, runId: bundle.manifest.run_id, stage };
171
+ const ready = readMemoryUpgradeBootstrapReadiness(context, bootstrapScope);
172
+ if (!ready?.hasPreservationBaseline || ready.projectId !== projectId || ready.authority.binding.execution_sha256 !== bundle.execution.sha256)
173
+ refuse("accepted_upgrade_bootstrap_required");
174
+ const edges = bundle.descriptor.descriptor.edges.filter(edge => edge.to === stage && edge.on === "accepted");
175
+ if (edges.length !== (stage === bundle.descriptor.descriptor.entry_stage ? 0 : 1))
176
+ refuse("invalid_stage_predecessor");
177
+ const predecessor = edges.length ? readAcceptedStageData(context, { ...scope, stage: edges[0].from }) : null;
178
+ return sources(context, { bytes }, { bundle, scope, bootstrapScope, predecessor });
179
+ }
180
+ /** Upgrade analysis uses the registered six-stage group. Generic lifecycle
181
+ * owns Work, prompts and dispatch; RUN admission still owns bootstrap readiness.
182
+ */
183
+ export function startMemoryUpgradeAnalysis(context, input) {
184
+ const state = selected(context, input);
185
+ if (state.accepted)
186
+ refuse("use_accepted_finish_replay");
187
+ PreparedMemoryUpgradeBootstrapReadiness.assertForRetainedRun(context, state.bundle);
188
+ const start = PreparedDescriptorStageStart.prepare(context, input);
189
+ const stage = start.apply(context, state.fence);
190
+ const coordinator = PreparedDescriptorStageCoordinator.prepare(context, input);
191
+ PreparedMemoryUpgradeBootstrapReadiness.assertForRetainedRun(context, state.bundle);
192
+ return { ...stage, ...coordinator.apply(context, state.fence) };
193
+ }
194
+ export function finishMemoryUpgradeAnalysis(context, input) {
195
+ const state = selected(context, input);
196
+ if (state.accepted) {
197
+ // Historical acknowledgement must not reinterpret old artifacts after the
198
+ // upgrade has intentionally changed them. SQL settlement owns acceptance.
199
+ const binding = PreparedMemoryResultBinding.prepare(context, { ...state.scope, flow: state.bundle.descriptor,
200
+ execution: state.bundle.execution, bundle: state.bundle, sources: ObservedMemorySources.capture({}, []), acceptedReplay: true });
201
+ if (!binding.acceptedBytes()?.equals(input.bytes))
202
+ refuse("accepted_result_changed");
203
+ const settlement = PreparedDescriptorStageSettlement.prepare(context, input);
204
+ return settlement.apply(context, writer => { state.fence(writer); binding.assertCustody(writer); });
205
+ }
206
+ const observed = sources(context, input, state);
207
+ const binding = PreparedMemoryResultBinding.prepare(context, { ...state.scope, flow: state.bundle.descriptor,
208
+ execution: state.bundle.execution, bundle: state.bundle, sources: observed, acceptedReplay: state.accepted });
209
+ const accepted = binding.acceptedBytes();
210
+ if (accepted && !accepted.equals(input.bytes))
211
+ refuse("accepted_result_changed");
212
+ const result = PreparedMemoryStageResult.prepare(input.bytes, state.bundle.descriptor, binding.binding()), value = result.value();
213
+ if (value.outcome !== "accepted" || value.findings.some(finding => finding.severity !== "minor" && finding.status !== "resolved"))
214
+ rejectResult(input.bytes, "analysis_not_accepted");
215
+ const details = value.details;
216
+ if (input.stage === "diff-analysis") {
217
+ const defaults = readDescriptorStageInput(context, state.scope, state.bundle).input.ordinary_defaults;
218
+ if (defaults) {
219
+ assertMemoryOrdinaryUpgradeConfigurationCoverage(value, defaults);
220
+ if (defaults.missing.length && !context.db.get("SELECT 1 FROM audit_events WHERE project_id=? AND event_type='flow_run.stage_resumed' AND json_extract(payload_json,'$.run_id')=? AND json_extract(payload_json,'$.stage')='diff-analysis' LIMIT 1", [state.scope.projectId, state.scope.runId])) {
221
+ throw new AppError("memory_stage_result_invalid", "Resolve the ordinary configuration choice through the existing diff-analysis pause/answer path before accepting the upgrade plan", 2, { phase: "prepare", effect: "no_effect", recoverable: true, reason: "ordinary_configuration_choice_required", missing: defaults.missing });
222
+ }
223
+ }
224
+ const storage = readUpgradeStorageReadiness(context, state.bootstrapScope);
225
+ const checks = details.required_checks;
226
+ if (!storage?.selection || storage.selection.payload.impact.chain.steps.some(step => !Array.isArray(step.required_checks)
227
+ || step.required_checks.some(check => typeof check !== "string" || !checks.includes(check))))
228
+ rejectResult(input.bytes, "missing_impact_checks");
229
+ try {
230
+ validateUpgradePathMap(storage.selection.payload.current.inventory.inventory, details.path_map);
231
+ }
232
+ catch (error) {
233
+ if (!(error instanceof AppError) || error.code !== "upgrade_inventory_invalid")
234
+ throw error;
235
+ throw new AppError("memory_stage_result_invalid", "Correct the proposed upgrade path map before it becomes an immutable accepted plan", 2, { reason: "invalid_upgrade_path_map", cause: error.details.reason, pointer: "/details/path_map", phase: "prepare", effect: "no_effect",
236
+ recoverable: true, result_sha256: result.sha256 });
237
+ }
238
+ }
239
+ const settlement = PreparedDescriptorStageSettlement.prepare(context, { ...input, bytes: result.bytes() });
240
+ PreparedMemoryUpgradeBootstrapReadiness.assertForRetainedRun(context, state.bundle);
241
+ binding.revalidate(context);
242
+ return settlement.apply(context, writer => { state.fence(writer); binding.assertCustody(writer); });
243
+ }