@deksden-com/dd-flow-cli 0.9.0-beta.16 → 0.9.0-beta.161

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 (670) hide show
  1. package/CHANGELOG.md +965 -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 +417 -0
  6. package/dist/cli/command-metadata.js +303 -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/delivery.js +108 -0
  11. package/dist/cli/diagnostic-invocation.js +62 -0
  12. package/dist/cli/diagnostic.js +131 -0
  13. package/dist/cli/error-output.js +62 -0
  14. package/dist/cli/executor-onboarding.js +76 -0
  15. package/dist/cli/flows.js +29 -0
  16. package/dist/cli/harnesses.js +84 -0
  17. package/dist/cli/help.js +521 -19
  18. package/dist/cli/hook-ingress.js +89 -0
  19. package/dist/cli/input-preparation.js +193 -0
  20. package/dist/cli/interactive-invocation.js +33 -0
  21. package/dist/cli/interactive.js +114 -0
  22. package/dist/cli/memory-fix-invocation.js +52 -0
  23. package/dist/cli/memory-fix.js +100 -0
  24. package/dist/cli/memory-flow-admission.js +54 -0
  25. package/dist/cli/memory-init-invocation.js +85 -0
  26. package/dist/cli/memory-init.js +250 -0
  27. package/dist/cli/memory-storage-admission.js +54 -0
  28. package/dist/cli/memory-storage-qualification.js +105 -0
  29. package/dist/cli/memory-storage-transition.js +123 -0
  30. package/dist/cli/memory-upgrade.js +189 -0
  31. package/dist/cli/models.js +39 -0
  32. package/dist/cli/native-hook-ingress.js +94 -0
  33. package/dist/cli/native-hook-preparation.js +82 -0
  34. package/dist/cli/operator-profiles.js +61 -0
  35. package/dist/cli/output-options.js +35 -0
  36. package/dist/cli/response-file.js +72 -0
  37. package/dist/cli/run-cli.js +2020 -555
  38. package/dist/cli/runtime-maintenance-diagnostics.js +46 -0
  39. package/dist/cli/runtime-maintenance-ingress.js +52 -0
  40. package/dist/cli/runtime-process.js +153 -0
  41. package/dist/cli/setup.js +150 -0
  42. package/dist/cli.js +103 -2
  43. package/dist/domain/delivery-flows.js +8 -0
  44. package/dist/domain/diagnostic-aspects.js +103 -0
  45. package/dist/domain/diagnostic-flows.js +8 -0
  46. package/dist/domain/distill-flow.js +20 -0
  47. package/dist/domain/interactive-flow.js +1 -0
  48. package/dist/domain/memory-fix-flow.js +2 -0
  49. package/dist/domain/review-fix-flow.js +2 -0
  50. package/dist/domain/source-snapshot-flows.js +4 -0
  51. package/dist/domain/stage-catalog.js +1 -1
  52. package/dist/domain/stage-handler-identities.js +28 -0
  53. package/dist/harness-runtime/DD-ZCODE.md +112 -0
  54. package/dist/harness-runtime/OPENCODE-LICENSE.txt +24 -0
  55. package/dist/harness-runtime/bin/dd-agy.mjs +71 -0
  56. package/dist/harness-runtime/bin/dd-codex.mjs +27 -0
  57. package/dist/harness-runtime/bin/dd-droid.mjs +34 -0
  58. package/dist/harness-runtime/bin/dd-grok.mjs +50 -0
  59. package/dist/harness-runtime/bin/dd-opencode.mjs +22 -0
  60. package/dist/harness-runtime/bin/dd-zcode.mjs +95 -0
  61. package/dist/harness-runtime/lib/adapter-timeouts.d.mts +5 -0
  62. package/dist/harness-runtime/lib/adapter-timeouts.mjs +34 -0
  63. package/dist/harness-runtime/lib/agy-error-boundary.mjs +87 -0
  64. package/dist/harness-runtime/lib/agy-hooks.d.mts +1 -0
  65. package/dist/harness-runtime/lib/agy-hooks.mjs +9 -0
  66. package/dist/harness-runtime/lib/agy-native-inspection.mjs +225 -0
  67. package/dist/harness-runtime/lib/agy-native-inventory.mjs +19 -0
  68. package/dist/harness-runtime/lib/agy-native_pb.js +117 -0
  69. package/dist/harness-runtime/lib/agy-terminal-envelope.mjs +74 -0
  70. package/dist/harness-runtime/lib/agy-transcript-stream.mjs +54 -0
  71. package/dist/harness-runtime/lib/daemon-observation.d.mts +3 -0
  72. package/dist/harness-runtime/lib/daemon-observation.mjs +171 -0
  73. package/dist/harness-runtime/lib/daemon-operations.d.mts +2 -0
  74. package/dist/harness-runtime/lib/daemon-operations.mjs +512 -0
  75. package/dist/harness-runtime/lib/dd-agy-daemon.d.mts +7 -0
  76. package/dist/harness-runtime/lib/dd-agy-daemon.mjs +1362 -0
  77. package/dist/harness-runtime/lib/dd-agy.mjs +105 -0
  78. package/dist/harness-runtime/lib/dd-codex-daemon.d.mts +1 -0
  79. package/dist/harness-runtime/lib/dd-codex-daemon.mjs +271 -0
  80. package/dist/harness-runtime/lib/dd-codex.d.mts +1 -0
  81. package/dist/harness-runtime/lib/dd-codex.mjs +986 -0
  82. package/dist/harness-runtime/lib/dd-droid-daemon.mjs +155 -0
  83. package/dist/harness-runtime/lib/dd-droid.mjs +739 -0
  84. package/dist/harness-runtime/lib/dd-grok-daemon.d.mts +1 -0
  85. package/dist/harness-runtime/lib/dd-grok-daemon.mjs +667 -0
  86. package/dist/harness-runtime/lib/dd-grok.mjs +182 -0
  87. package/dist/harness-runtime/lib/dd-opencode-daemon.mjs +772 -0
  88. package/dist/harness-runtime/lib/dd-opencode.mjs +411 -0
  89. package/dist/harness-runtime/lib/dd-zcode-daemon.d.mts +1 -0
  90. package/dist/harness-runtime/lib/dd-zcode-daemon.mjs +845 -0
  91. package/dist/harness-runtime/lib/dd-zcode.mjs +1239 -0
  92. package/dist/harness-runtime/lib/delegation-instructions.d.mts +16 -0
  93. package/dist/harness-runtime/lib/delegation-instructions.mjs +179 -0
  94. package/dist/harness-runtime/lib/delivery-command.mjs +84 -0
  95. package/dist/harness-runtime/lib/dispatch-fence.mjs +14 -0
  96. package/dist/harness-runtime/lib/driver-recovery.mjs +121 -0
  97. package/dist/harness-runtime/lib/droid-observation.mjs +70 -0
  98. package/dist/harness-runtime/lib/entity-references.d.mts +2 -0
  99. package/dist/harness-runtime/lib/entity-references.mjs +9 -0
  100. package/dist/harness-runtime/lib/lease-renewal.d.mts +8 -0
  101. package/dist/harness-runtime/lib/lease-renewal.mjs +37 -0
  102. package/dist/harness-runtime/lib/lifecycle-command.d.mts +20 -0
  103. package/dist/harness-runtime/lib/lifecycle-command.mjs +273 -0
  104. package/dist/harness-runtime/lib/lifecycle-contract.d.mts +11 -0
  105. package/dist/harness-runtime/lib/lifecycle-contract.mjs +20 -0
  106. package/dist/harness-runtime/lib/managed-daemon.d.mts +16 -0
  107. package/dist/harness-runtime/lib/managed-daemon.mjs +698 -0
  108. package/dist/harness-runtime/lib/managed-flow-env.mjs +15 -0
  109. package/dist/harness-runtime/lib/model-observations.mjs +113 -0
  110. package/dist/harness-runtime/lib/native-children.d.mts +34 -0
  111. package/dist/harness-runtime/lib/native-children.mjs +265 -0
  112. package/dist/harness-runtime/lib/native-hook-command.d.mts +8 -0
  113. package/dist/harness-runtime/lib/native-hook-command.mjs +306 -0
  114. package/dist/harness-runtime/lib/native-request-proof.d.mts +2 -0
  115. package/dist/harness-runtime/lib/native-request-proof.mjs +65 -0
  116. package/dist/harness-runtime/lib/native-streams.mjs +38 -0
  117. package/dist/harness-runtime/lib/observation-clock.d.mts +18 -0
  118. package/dist/harness-runtime/lib/observation-clock.mjs +95 -0
  119. package/dist/harness-runtime/lib/opencode-plugin.mjs +112 -0
  120. package/dist/harness-runtime/lib/operation-context.mjs +5 -0
  121. package/dist/harness-runtime/lib/operation-errors.d.mts +16 -0
  122. package/dist/harness-runtime/lib/operation-errors.mjs +140 -0
  123. package/dist/harness-runtime/lib/operation-progress.d.mts +7 -0
  124. package/dist/harness-runtime/lib/operation-progress.mjs +118 -0
  125. package/dist/harness-runtime/lib/process-json.d.mts +5 -0
  126. package/dist/harness-runtime/lib/process-json.mjs +200 -0
  127. package/dist/harness-runtime/lib/process-snapshot.mjs +10 -0
  128. package/dist/harness-runtime/lib/provider-overload-policy.d.mts +23 -0
  129. package/dist/harness-runtime/lib/provider-overload-policy.mjs +242 -0
  130. package/dist/harness-runtime/lib/runner-events.mjs +202 -0
  131. package/dist/harness-runtime/lib/runner-lock.mjs +42 -0
  132. package/dist/harness-runtime/lib/session-settlement.mjs +30 -0
  133. package/dist/harness-runtime/lib/setup-progress.d.mts +9 -0
  134. package/dist/harness-runtime/lib/setup-progress.mjs +53 -0
  135. package/dist/harness-runtime/lib/tool-observations.d.mts +21 -0
  136. package/dist/harness-runtime/lib/tool-observations.mjs +238 -0
  137. package/dist/harness-runtime/lib/zcode-native-hook-ownership.mjs +109 -0
  138. package/dist/harness-runtime/lib/zcode-usage.mjs +55 -0
  139. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-1y4a697q.js +81 -0
  140. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-2ny4vxct.js +92 -0
  141. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-6mptkzbc.js +0 -0
  142. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-7x67cf1q.js +52 -0
  143. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-9rqn6x4v.js +16 -0
  144. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-9vdz0zwn.js +1661 -0
  145. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ecs5ftka.js +1466 -0
  146. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-frbwqjmf.js +145 -0
  147. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-gne7h7mq.js +50 -0
  148. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-gx9wnkzr.js +105 -0
  149. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-m2eywc8w.js +0 -0
  150. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-nwcpakzx.js +12 -0
  151. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-q4g3afnw.js +623 -0
  152. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-qav6mfdz.js +0 -0
  153. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-sxt88q69.js +12 -0
  154. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-t1xa31vm.js +39 -0
  155. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ve4aws36.js +103 -0
  156. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vmytr4q8.js +4 -0
  157. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vt9jbch8.js +36 -0
  158. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vyas3vgt.js +0 -0
  159. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-wjyeq25y.js +30 -0
  160. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-xgnj2w4v.js +20 -0
  161. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-y2etg5bs.js +9 -0
  162. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ydhz1zrh.js +238 -0
  163. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-z6qdwcsf.js +62 -0
  164. package/dist/harness-runtime/vendor/opencode-client/contract.d.ts +1 -0
  165. package/dist/harness-runtime/vendor/opencode-client/contract.js +12 -0
  166. package/dist/harness-runtime/vendor/opencode-client/effect/api/api.d.ts +2806 -0
  167. package/dist/harness-runtime/vendor/opencode-client/effect/api/api.js +0 -0
  168. package/dist/harness-runtime/vendor/opencode-client/effect/api.d.ts +4 -0
  169. package/dist/harness-runtime/vendor/opencode-client/effect/api.js +0 -0
  170. package/dist/harness-runtime/vendor/opencode-client/effect/client.d.ts +2530 -0
  171. package/dist/harness-runtime/vendor/opencode-client/effect/client.js +15 -0
  172. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client-error.d.ts +7 -0
  173. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client-error.js +6 -0
  174. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client.d.ts +2529 -0
  175. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client.js +8 -0
  176. package/dist/harness-runtime/vendor/opencode-client/effect/generated/index.d.ts +2 -0
  177. package/dist/harness-runtime/vendor/opencode-client/effect/generated/index.js +12 -0
  178. package/dist/harness-runtime/vendor/opencode-client/effect/index.d.ts +35 -0
  179. package/dist/harness-runtime/vendor/opencode-client/effect/index.js +75 -0
  180. package/dist/harness-runtime/vendor/opencode-client/effect/rpc.d.ts +20 -0
  181. package/dist/harness-runtime/vendor/opencode-client/effect/rpc.js +11 -0
  182. package/dist/harness-runtime/vendor/opencode-client/effect/service.d.ts +90 -0
  183. package/dist/harness-runtime/vendor/opencode-client/effect/service.js +187 -0
  184. package/dist/harness-runtime/vendor/opencode-client/package.json +84 -0
  185. package/dist/harness-runtime/vendor/opencode-client/promise/api.d.ts +21 -0
  186. package/dist/harness-runtime/vendor/opencode-client/promise/api.js +0 -0
  187. package/dist/harness-runtime/vendor/opencode-client/promise/client.d.ts +252 -0
  188. package/dist/harness-runtime/vendor/opencode-client/promise/client.js +14 -0
  189. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client-error.d.ts +8 -0
  190. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client-error.js +6 -0
  191. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client.d.ts +259 -0
  192. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client.js +7 -0
  193. package/dist/harness-runtime/vendor/opencode-client/promise/generated/index.d.ts +3 -0
  194. package/dist/harness-runtime/vendor/opencode-client/promise/generated/index.js +79 -0
  195. package/dist/harness-runtime/vendor/opencode-client/promise/generated/types.d.ts +8932 -0
  196. package/dist/harness-runtime/vendor/opencode-client/promise/generated/types.js +70 -0
  197. package/dist/harness-runtime/vendor/opencode-client/promise/index.d.ts +6 -0
  198. package/dist/harness-runtime/vendor/opencode-client/promise/index.js +83 -0
  199. package/dist/harness-runtime/vendor/opencode-client/promise/rpc.d.ts +32 -0
  200. package/dist/harness-runtime/vendor/opencode-client/promise/rpc.js +7 -0
  201. package/dist/harness-runtime/vendor/opencode-client/promise/service.d.ts +24 -0
  202. package/dist/harness-runtime/vendor/opencode-client/promise/service.js +187 -0
  203. package/dist/harness-runtime/vendor/opencode-client/pty-handoff.d.ts +12 -0
  204. package/dist/harness-runtime/vendor/opencode-client/pty-handoff.js +14 -0
  205. package/dist/harness-runtime/vendor/opencode-client/rpc-runtime.d.ts +20 -0
  206. package/dist/harness-runtime/vendor/opencode-client/rpc-runtime.js +14 -0
  207. package/dist/harness-runtime/vendor/opencode-client/service-contender.d.ts +37 -0
  208. package/dist/harness-runtime/vendor/opencode-client/service-contender.js +10 -0
  209. package/dist/harness-runtime/vendor/opencode-client/service-probe.d.ts +70 -0
  210. package/dist/harness-runtime/vendor/opencode-client/service-probe.js +16 -0
  211. package/dist/harness-runtime/vendor/opencode-client/service-timing.d.ts +12 -0
  212. package/dist/harness-runtime/vendor/opencode-client/service-timing.js +10 -0
  213. package/dist/harness-runtime/vendor/opencode-client/service-version.d.ts +2 -0
  214. package/dist/harness-runtime/vendor/opencode-client/service-version.js +6 -0
  215. package/dist/harness-runtime/vendor/opencode-client/service.d.ts +52 -0
  216. package/dist/harness-runtime/vendor/opencode-client/service.js +1 -0
  217. package/dist/harness-runtime/vendor/opencode-client/shared-events.d.ts +11 -0
  218. package/dist/harness-runtime/vendor/opencode-client/shared-events.js +8 -0
  219. package/dist/harness-runtime/vendor/opencode-client/solid/connection.d.ts +37 -0
  220. package/dist/harness-runtime/vendor/opencode-client/solid/connection.js +10 -0
  221. package/dist/harness-runtime/vendor/opencode-client/solid/data.d.ts +211 -0
  222. package/dist/harness-runtime/vendor/opencode-client/solid/data.js +18 -0
  223. package/dist/harness-runtime/vendor/opencode-client/solid/index.d.ts +3 -0
  224. package/dist/harness-runtime/vendor/opencode-client/solid/index.js +32 -0
  225. package/dist/harness-runtime/vendor/opencode-client/solid/pty.d.ts +22 -0
  226. package/dist/harness-runtime/vendor/opencode-client/solid/pty.js +8 -0
  227. package/dist/harness-runtime/vendor/opencode-plugin.mjs +3 -0
  228. package/dist/protocol/local-files.js +18 -9
  229. package/dist/runtime/context.js +8 -4
  230. package/dist/schemas/agent-profile.schema.json +1 -1
  231. package/dist/schemas/code-review-decision.schema.json +9 -0
  232. package/dist/schemas/code-review-result.schema.json +1 -1
  233. package/dist/schemas/code-verification.schema.json +7 -5
  234. package/dist/schemas/code-work-batch.schema.json +2 -2
  235. package/dist/schemas/code-work-result.schema.json +2 -1
  236. package/dist/schemas/delivery-stage-result.schema.json +286 -0
  237. package/dist/schemas/diagnostic-stage-result.schema.json +354 -0
  238. package/dist/schemas/diagnostic-work-result.schema.json +296 -0
  239. package/dist/schemas/discovery-result.schema.json +184 -0
  240. package/dist/schemas/distill-stage-result.schema.json +667 -0
  241. package/dist/schemas/distill-work-result.schema.json +428 -0
  242. package/dist/schemas/execution-bundle.schema.json +215 -0
  243. package/dist/schemas/execution-settings.schema.json +162 -0
  244. package/dist/schemas/flow-descriptor.schema.json +54 -0
  245. package/dist/schemas/flow-run.schema.json +29 -0
  246. package/dist/schemas/harness-catalog.schema.json +80 -0
  247. package/dist/schemas/interactive-stage-result.schema.json +47 -0
  248. package/dist/schemas/interactive-work-result.schema.json +63 -0
  249. package/dist/schemas/mb-fix-stage-result.schema.json +93 -0
  250. package/dist/schemas/mb-init-compose-result.schema.json +457 -0
  251. package/dist/schemas/mb-init-discover-result.schema.json +500 -0
  252. package/dist/schemas/mb-init-finish-result.schema.json +422 -0
  253. package/dist/schemas/mb-init-preflight-result.schema.json +367 -0
  254. package/dist/schemas/mb-init-review-result.schema.json +396 -0
  255. package/dist/schemas/mb-init-verify-result.schema.json +391 -0
  256. package/dist/schemas/mb-upgrade-stage-result.schema.json +863 -0
  257. package/dist/schemas/memory-bootstrap-receipt-v2.schema.json +67 -0
  258. package/dist/schemas/memory-bootstrap-receipt.schema.json +354 -0
  259. package/dist/schemas/memory-composition-work-result.schema.json +38 -0
  260. package/dist/schemas/memory-repair-work-result.schema.json +56 -0
  261. package/dist/schemas/memory-review-correction-plan.schema.json +30 -0
  262. package/dist/schemas/memory-review-work-result.schema.json +43 -0
  263. package/dist/schemas/model-catalog.schema.json +153 -0
  264. package/dist/schemas/plan-review-decision.schema.json +12 -3
  265. package/dist/schemas/plan-review-result.schema.json +2 -2
  266. package/dist/schemas/profile-settings.schema.json +122 -0
  267. package/dist/schemas/project-flow-pack-manifest.schema.json +2 -2
  268. package/dist/schemas/release-impact.schema.json +3 -3
  269. package/dist/schemas/release-manifest.schema.json +291 -0
  270. package/dist/schemas/review-fix-stage-result.schema.json +210 -0
  271. package/dist/schemas/run-control-receipt.schema.json +119 -0
  272. package/dist/schemas/run-control-request.schema.json +36 -0
  273. package/dist/schemas/run-engine-binding.schema.json +1 -1
  274. package/dist/schemas/stage-start-response.schema.json +4 -0
  275. package/dist/schemas/vnext-protocol-plan.schema.json +3 -3
  276. package/dist/services/accepted-intent.js +139 -0
  277. package/dist/services/assigned-lifecycle.js +382 -0
  278. package/dist/services/branch-context.js +3 -3
  279. package/dist/services/canon.js +54 -15
  280. package/dist/services/check-environment.js +21 -0
  281. package/dist/services/check-runner-evidence.js +344 -0
  282. package/dist/services/check-runner-proof.js +373 -0
  283. package/dist/services/cleanup.js +133 -40
  284. package/dist/services/cli-operation-classifier.js +32 -64
  285. package/dist/services/cli-upgrade-allowlist.js +27 -0
  286. package/dist/services/code-checks.js +1426 -121
  287. package/dist/services/codex-capacity.js +367 -0
  288. package/dist/services/codex-hook-delivery.js +41 -0
  289. package/dist/services/command-context.js +80 -0
  290. package/dist/services/compatibility-preflight.js +16 -3
  291. package/dist/services/config.js +11 -8
  292. package/dist/services/continuation-outcome.js +25 -0
  293. package/dist/services/controller-child-capacity.js +71 -0
  294. package/dist/services/controller-child-observer.js +121 -0
  295. package/dist/services/controller-child-repair.js +117 -0
  296. package/dist/services/controller-execution.js +97 -0
  297. package/dist/services/controller-fanout.js +277 -0
  298. package/dist/services/controller-memory-task.js +45 -0
  299. package/dist/services/controller-memory-worker.js +51 -0
  300. package/dist/services/controller-result-authority.js +127 -0
  301. package/dist/services/controller-work-failure.js +198 -0
  302. package/dist/services/dashboard.js +145 -58
  303. package/dist/services/delivery-access.js +123 -0
  304. package/dist/services/delivery-approval.js +68 -0
  305. package/dist/services/delivery-artifact.js +86 -0
  306. package/dist/services/delivery-checks.js +178 -0
  307. package/dist/services/delivery-execution.js +181 -0
  308. package/dist/services/delivery-intents.js +212 -0
  309. package/dist/services/delivery-operation.js +81 -0
  310. package/dist/services/delivery-policy.js +91 -0
  311. package/dist/services/delivery-procedures.js +43 -0
  312. package/dist/services/delivery-request.js +99 -0
  313. package/dist/services/delivery-result.js +144 -0
  314. package/dist/services/delivery-stage-commands.js +26 -0
  315. package/dist/services/delivery-stage-entry.js +56 -0
  316. package/dist/services/delivery-stage-handlers.js +135 -0
  317. package/dist/services/delivery-stage-results.js +94 -0
  318. package/dist/services/descriptor-coordinator-session.js +37 -0
  319. package/dist/services/descriptor-root-work.js +53 -0
  320. package/dist/services/descriptor-run-settlement.js +107 -0
  321. package/dist/services/descriptor-run-start.js +495 -0
  322. package/dist/services/descriptor-stage-coordinator.js +318 -0
  323. package/dist/services/descriptor-stage-settlement.js +268 -0
  324. package/dist/services/descriptor-stage-start.js +175 -0
  325. package/dist/services/diagnostic-evidence.js +73 -0
  326. package/dist/services/diagnostic-repair-intake.js +123 -0
  327. package/dist/services/diagnostic-repair-source-intake.js +102 -0
  328. package/dist/services/diagnostic-report-publication.js +72 -0
  329. package/dist/services/diagnostic-report.js +97 -0
  330. package/dist/services/diagnostic-run-bundle.js +113 -0
  331. package/dist/services/diagnostic-snapshot.js +159 -0
  332. package/dist/services/diagnostic-stage-handlers.js +109 -0
  333. package/dist/services/diagnostic-stage-results.js +158 -0
  334. package/dist/services/diagnostic-start.js +134 -0
  335. package/dist/services/diagnostic-work-batch.js +34 -0
  336. package/dist/services/diagnostic-work-collection.js +97 -0
  337. package/dist/services/diagnostic-work-registration.js +101 -0
  338. package/dist/services/diagnostic-work-results.js +93 -0
  339. package/dist/services/discovery/agy-discovery.js +2 -0
  340. package/dist/services/discovery/codex-discovery.js +2 -0
  341. package/dist/services/discovery/droid-discovery.js +2 -0
  342. package/dist/services/discovery/grok-discovery.js +2 -0
  343. package/dist/services/discovery/opencode-discovery.js +2 -0
  344. package/dist/services/discovery/static.js +31 -0
  345. package/dist/services/discovery/zcode-discovery.js +2 -0
  346. package/dist/services/distill-document-publication.js +280 -0
  347. package/dist/services/distill-promotion.js +197 -0
  348. package/dist/services/distill-publication-custody.js +162 -0
  349. package/dist/services/distill-stage-handlers.js +249 -0
  350. package/dist/services/distill-stage-results.js +105 -0
  351. package/dist/services/distill-user-inputs.js +4 -0
  352. package/dist/services/distill-work-batch.js +42 -0
  353. package/dist/services/distill-work-collection.js +74 -0
  354. package/dist/services/distill-work-registration.js +93 -0
  355. package/dist/services/distill-work-results.js +98 -0
  356. package/dist/services/engines.js +354 -163
  357. package/dist/services/eval-snapshots.js +1326 -150
  358. package/dist/services/execution-bundles.js +275 -0
  359. package/dist/services/execution-policy.js +185 -0
  360. package/dist/services/executor-onboarding.js +56 -0
  361. package/dist/services/external-work-launch.js +316 -0
  362. package/dist/services/flow-catalog.js +54 -0
  363. package/dist/services/flow-descriptors.js +82 -0
  364. package/dist/services/frozen-engine.js +404 -0
  365. package/dist/services/generic-execution.js +165 -0
  366. package/dist/services/harness-adapter.js +342 -35
  367. package/dist/services/harness-config.js +2 -0
  368. package/dist/services/harness-discovery.js +29 -0
  369. package/dist/services/harness-doctor.js +75 -0
  370. package/dist/services/harness-probe-effects.js +51 -0
  371. package/dist/services/harness-version-probe.js +100 -0
  372. package/dist/services/hook-memory-routing.js +188 -0
  373. package/dist/services/hook-recovery-guard.js +14 -0
  374. package/dist/services/hook-session-observation.js +24 -0
  375. package/dist/services/hooks.js +813 -327
  376. package/dist/services/hybrid-contracts.js +479 -0
  377. package/dist/services/hybrid-digest.js +14 -0
  378. package/dist/services/ids.js +29 -1
  379. package/dist/services/installation-lock.js +95 -0
  380. package/dist/services/installed-flow-source.js +261 -0
  381. package/dist/services/interactive-attached-session.js +215 -0
  382. package/dist/services/interactive-baseline-custody.js +54 -0
  383. package/dist/services/interactive-before-versions.js +148 -0
  384. package/dist/services/interactive-bundle-data.js +85 -0
  385. package/dist/services/interactive-checks.js +179 -0
  386. package/dist/services/interactive-execution.js +33 -0
  387. package/dist/services/interactive-finish-integration.js +236 -0
  388. package/dist/services/interactive-git-baseline.js +230 -0
  389. package/dist/services/interactive-git-dispatch.js +278 -0
  390. package/dist/services/interactive-input-delivery.js +82 -0
  391. package/dist/services/interactive-mutation-scope.js +231 -0
  392. package/dist/services/interactive-request.js +287 -0
  393. package/dist/services/interactive-run-bundle.js +109 -0
  394. package/dist/services/interactive-stage-entry.js +41 -0
  395. package/dist/services/interactive-stage-handlers.js +289 -0
  396. package/dist/services/interactive-stage-observation.js +136 -0
  397. package/dist/services/interactive-stage-results.js +111 -0
  398. package/dist/services/interactive-user-inputs.js +142 -0
  399. package/dist/services/interactive-work-batch.js +43 -0
  400. package/dist/services/interactive-work-collection.js +119 -0
  401. package/dist/services/interactive-work-completion.js +180 -0
  402. package/dist/services/interactive-work-context.js +249 -0
  403. package/dist/services/interactive-work-history.js +112 -0
  404. package/dist/services/interactive-work-registration.js +124 -0
  405. package/dist/services/interactive-work-results.js +115 -0
  406. package/dist/services/interactive-work-start.js +155 -0
  407. package/dist/services/lanes.js +78 -65
  408. package/dist/services/lifecycle-command.js +1 -288
  409. package/dist/services/lifecycle-contract.js +1 -0
  410. package/dist/services/lifecycle-invocations.js +2549 -0
  411. package/dist/services/managed-daemon-binding.js +129 -0
  412. package/dist/services/managed-lease-monitor.js +133 -0
  413. package/dist/services/managed-processes.js +449 -69
  414. package/dist/services/memory-accepted-composition.js +78 -0
  415. package/dist/services/memory-baseline-preservation.js +65 -0
  416. package/dist/services/memory-completed-correction-wave.js +328 -0
  417. package/dist/services/memory-compose-handler.js +380 -0
  418. package/dist/services/memory-composition-acceptance.js +375 -0
  419. package/dist/services/memory-composition-graph.js +165 -0
  420. package/dist/services/memory-composition-registration.js +161 -0
  421. package/dist/services/memory-composition-work-custody.js +156 -0
  422. package/dist/services/memory-composition-work-results.js +108 -0
  423. package/dist/services/memory-corrected-review-acceptance.js +129 -0
  424. package/dist/services/memory-corrected-review-batch.js +37 -0
  425. package/dist/services/memory-corrected-review-findings.js +108 -0
  426. package/dist/services/memory-corrected-review-inputs.js +215 -0
  427. package/dist/services/memory-corrected-review-projection.js +78 -0
  428. package/dist/services/memory-corrected-review-receipt.js +178 -0
  429. package/dist/services/memory-corrected-review-registration.js +192 -0
  430. package/dist/services/memory-correction-check-receipt.js +235 -0
  431. package/dist/services/memory-correction-input-owner.js +6 -0
  432. package/dist/services/memory-custody-snapshot.js +36 -0
  433. package/dist/services/memory-discover-handler.js +104 -0
  434. package/dist/services/memory-finish-evidence.js +457 -0
  435. package/dist/services/memory-finish-handler.js +229 -0
  436. package/dist/services/memory-finish-integration.js +491 -0
  437. package/dist/services/memory-finish-readiness.js +169 -0
  438. package/dist/services/memory-fix-finish-integration.js +129 -0
  439. package/dist/services/memory-fix-git-dispatch.js +139 -0
  440. package/dist/services/memory-fix-intake-custody.js +11 -0
  441. package/dist/services/memory-fix-intake-settlement.js +127 -0
  442. package/dist/services/memory-fix-publication.js +196 -0
  443. package/dist/services/memory-fix-repair-admission.js +116 -0
  444. package/dist/services/memory-fix-request.js +141 -0
  445. package/dist/services/memory-fix-run-bundle.js +83 -0
  446. package/dist/services/memory-fix-scope.js +78 -0
  447. package/dist/services/memory-fix-sources.js +85 -0
  448. package/dist/services/memory-fix-stage-entry.js +24 -0
  449. package/dist/services/memory-fix-stage-handlers.js +282 -0
  450. package/dist/services/memory-fix-stage-results.js +106 -0
  451. package/dist/services/memory-fix-workspace.js +127 -0
  452. package/dist/services/memory-flow-user-inputs.js +88 -0
  453. package/dist/services/memory-git-integration.js +220 -0
  454. package/dist/services/memory-historical-corrected-review.js +212 -0
  455. package/dist/services/memory-historical-original-review.js +143 -0
  456. package/dist/services/memory-historical-repair-registration.js +105 -0
  457. package/dist/services/memory-historical-second-review.js +147 -0
  458. package/dist/services/memory-init-bootstrap-readiness.js +210 -0
  459. package/dist/services/memory-init-contexts.js +181 -0
  460. package/dist/services/memory-init-controller-start.js +119 -0
  461. package/dist/services/memory-init-engine-release.js +223 -0
  462. package/dist/services/memory-init-git-policy.js +165 -0
  463. package/dist/services/memory-init-lint-capability.js +203 -0
  464. package/dist/services/memory-init-native-capacity.js +309 -0
  465. package/dist/services/memory-init-preflight.js +334 -0
  466. package/dist/services/memory-init-project-bootstrap.js +599 -0
  467. package/dist/services/memory-init-request-candidate.js +213 -0
  468. package/dist/services/memory-init-request-input.js +82 -0
  469. package/dist/services/memory-init-resource-storage.js +125 -0
  470. package/dist/services/memory-init-run-allocation.js +81 -0
  471. package/dist/services/memory-init-run-bundle.js +135 -0
  472. package/dist/services/memory-init-start.js +181 -0
  473. package/dist/services/memory-init-startup-custody.js +80 -0
  474. package/dist/services/memory-init-startup-input.js +240 -0
  475. package/dist/services/memory-init-storage.js +91 -0
  476. package/dist/services/memory-init-stores.js +359 -0
  477. package/dist/services/memory-init-worktrunk-capability.js +174 -0
  478. package/dist/services/memory-layer-publication.js +611 -0
  479. package/dist/services/memory-layer.js +225 -0
  480. package/dist/services/memory-lint-config.js +194 -0
  481. package/dist/services/memory-native-review-copy.js +127 -0
  482. package/dist/services/memory-normal-flow-entry.js +87 -0
  483. package/dist/services/memory-ordinary-defaults.js +129 -0
  484. package/dist/services/memory-preflight-bootstrap-custody.js +115 -0
  485. package/dist/services/memory-preflight-handler.js +274 -0
  486. package/dist/services/memory-repair-current-view.js +299 -0
  487. package/dist/services/memory-repair-document-delta.js +489 -0
  488. package/dist/services/memory-repair-history.js +496 -0
  489. package/dist/services/memory-repair-physical-binding.js +194 -0
  490. package/dist/services/memory-repair-publication-files.js +152 -0
  491. package/dist/services/memory-repair-publication-intent.js +27 -0
  492. package/dist/services/memory-repair-publication-plan.js +162 -0
  493. package/dist/services/memory-repair-publication-source.js +225 -0
  494. package/dist/services/memory-repair-publication.js +795 -0
  495. package/dist/services/memory-repair-registration.js +240 -0
  496. package/dist/services/memory-repair-work-baseline.js +415 -0
  497. package/dist/services/memory-repair-work-completion.js +117 -0
  498. package/dist/services/memory-repair-work-custody.js +73 -0
  499. package/dist/services/memory-repair-work-results.js +108 -0
  500. package/dist/services/memory-repair-workspace.js +261 -0
  501. package/dist/services/memory-repair-writer-copy.js +736 -0
  502. package/dist/services/memory-result-binding.js +239 -0
  503. package/dist/services/memory-retained-review-authority.js +138 -0
  504. package/dist/services/memory-retained-review-results.js +70 -0
  505. package/dist/services/memory-retained-second-baseline.js +102 -0
  506. package/dist/services/memory-retained-second-repairs.js +162 -0
  507. package/dist/services/memory-review-acceptance.js +214 -0
  508. package/dist/services/memory-review-correction-plan.js +206 -0
  509. package/dist/services/memory-review-handler.js +585 -0
  510. package/dist/services/memory-review-inputs.js +246 -0
  511. package/dist/services/memory-review-limits.js +10 -0
  512. package/dist/services/memory-review-receipt.js +180 -0
  513. package/dist/services/memory-review-registration.js +117 -0
  514. package/dist/services/memory-review-work-custody.js +126 -0
  515. package/dist/services/memory-review-work-input.js +91 -0
  516. package/dist/services/memory-review-work-results.js +95 -0
  517. package/dist/services/memory-second-corrected-review-inputs.js +167 -0
  518. package/dist/services/memory-second-correction-plan.js +77 -0
  519. package/dist/services/memory-second-repair-baseline.js +91 -0
  520. package/dist/services/memory-second-repair-launch.js +614 -0
  521. package/dist/services/memory-second-repair-registration.js +88 -0
  522. package/dist/services/memory-second-repair-source.js +187 -0
  523. package/dist/services/memory-second-review-acceptance.js +115 -0
  524. package/dist/services/memory-source-observations.js +117 -0
  525. package/dist/services/memory-stage-dispatch.js +65 -0
  526. package/dist/services/memory-stage-results.js +290 -0
  527. package/dist/services/memory-tool-probe.js +25 -0
  528. package/dist/services/memory-upgrade-analysis-handler.js +243 -0
  529. package/dist/services/memory-upgrade-bootstrap-readiness.js +251 -0
  530. package/dist/services/memory-upgrade-evidence.js +100 -0
  531. package/dist/services/memory-upgrade-inventory.js +442 -0
  532. package/dist/services/memory-upgrade-publication-custody.js +73 -0
  533. package/dist/services/memory-upgrade-publication.js +413 -0
  534. package/dist/services/memory-upgrade-selection.js +430 -0
  535. package/dist/services/memory-upgrade-start.js +60 -0
  536. package/dist/services/memory-upgrade-storage-readiness.js +340 -0
  537. package/dist/services/memory-verification-acceptance.js +156 -0
  538. package/dist/services/memory-verification-checks.js +317 -0
  539. package/dist/services/memory-verification-receipt.js +160 -0
  540. package/dist/services/memory-verify-handler.js +137 -0
  541. package/dist/services/memory-work-result-json.js +12 -0
  542. package/dist/services/memory-work-result-preparation.js +64 -0
  543. package/dist/services/merge-queue.js +228 -149
  544. package/dist/services/merge-server.js +163 -35
  545. package/dist/services/migrations.js +164 -114
  546. package/dist/services/model-catalog.js +109 -0
  547. package/dist/services/model-discovery.js +46 -0
  548. package/dist/services/native-daemon-history.js +50 -0
  549. package/dist/services/native-session-control.js +39 -0
  550. package/dist/services/operator-profiles.js +236 -0
  551. package/dist/services/physical-startup.js +45 -0
  552. package/dist/services/plan-runtime.js +26 -11
  553. package/dist/services/plans.js +28 -25
  554. package/dist/services/project-flow-source.js +195 -0
  555. package/dist/services/project-git-integration.js +92 -0
  556. package/dist/services/project-registry.js +97 -0
  557. package/dist/services/project-summary.js +1 -1
  558. package/dist/services/projects.js +17 -87
  559. package/dist/services/prompt-delivery.js +71 -0
  560. package/dist/services/prompts.js +28 -17
  561. package/dist/services/protocols.js +163 -87
  562. package/dist/services/provider-capacity.js +463 -0
  563. package/dist/services/recovery-observation-budget.js +121 -0
  564. package/dist/services/recovery-snapshot-database.js +588 -0
  565. package/dist/services/release-archive-producer.js +52 -0
  566. package/dist/services/release-archive.js +143 -0
  567. package/dist/services/release-cache.js +150 -0
  568. package/dist/services/release-compatibility.js +18 -0
  569. package/dist/services/release-download.js +67 -0
  570. package/dist/services/release-envelope.js +104 -0
  571. package/dist/services/release-manifest.js +45 -0
  572. package/dist/services/release-payload.js +114 -0
  573. package/dist/services/release-producer.js +63 -0
  574. package/dist/services/release-provenance.js +160 -0
  575. package/dist/services/release-registry.js +66 -0
  576. package/dist/services/release-source.js +194 -0
  577. package/dist/services/repair-intents.js +29 -0
  578. package/dist/services/repair-receipt.js +13 -0
  579. package/dist/services/retained-native-hook.js +274 -0
  580. package/dist/services/review-copy.js +165 -0
  581. package/dist/services/review-deferral.js +23 -0
  582. package/dist/services/review-fix-handoff.js +82 -0
  583. package/dist/services/review-fix-intake-custody.js +17 -0
  584. package/dist/services/review-fix-stage-entry.js +43 -0
  585. package/dist/services/review-fix-stage-handlers.js +176 -0
  586. package/dist/services/review-fix-stage-results.js +86 -0
  587. package/dist/services/run-control-receipt.js +56 -0
  588. package/dist/services/run-control-worker.js +469 -0
  589. package/dist/services/run-control.js +1109 -0
  590. package/dist/services/run-controller-adapter.js +434 -0
  591. package/dist/services/run-controller-capture.js +186 -0
  592. package/dist/services/run-controller-process.js +226 -0
  593. package/dist/services/run-controller-recovery.js +335 -0
  594. package/dist/services/run-controller-state.js +106 -0
  595. package/dist/services/run-controller.js +1717 -0
  596. package/dist/services/run-engine-bindings.js +1 -1
  597. package/dist/services/run-fork.js +147 -0
  598. package/dist/services/run-health.js +149 -0
  599. package/dist/services/run-observations.js +152 -0
  600. package/dist/services/run-projection.js +22 -64
  601. package/dist/services/run-recovery-guard.js +107 -0
  602. package/dist/services/run-recovery-runtime.js +112 -0
  603. package/dist/services/run-recovery.js +485 -0
  604. package/dist/services/run-start-custody.js +189 -0
  605. package/dist/services/run-timeline.js +59 -0
  606. package/dist/services/runs.js +996 -271
  607. package/dist/services/runtime-budget.js +446 -0
  608. package/dist/services/runtime-command.js +43 -0
  609. package/dist/services/runtime-scope-capture.js +52 -0
  610. package/dist/services/runtime-scope-control.js +468 -0
  611. package/dist/services/runtime-scope-resume.js +605 -0
  612. package/dist/services/runtime-scope-stop.js +211 -0
  613. package/dist/services/runtime-scope-worker.js +314 -0
  614. package/dist/services/runtime-service.js +19 -14
  615. package/dist/services/schema-validation.js +10 -8
  616. package/dist/services/scope-writer-cleanup.js +27 -0
  617. package/dist/services/sessions.js +37 -91
  618. package/dist/services/setup.js +427 -0
  619. package/dist/services/stage-blocker.js +17 -7
  620. package/dist/services/stage-context.js +240 -18
  621. package/dist/services/stage-handlers.js +141 -0
  622. package/dist/services/stage-lifecycle.js +156 -119
  623. package/dist/services/stage-pause.js +222 -94
  624. package/dist/services/stage-report-renderer.js +230 -6
  625. package/dist/services/stage-work-graph.js +52 -0
  626. package/dist/services/technical-notes.js +31 -0
  627. package/dist/services/tooling.js +111 -44
  628. package/dist/services/usage.js +49 -101
  629. package/dist/services/verification-matrix.js +393 -0
  630. package/dist/services/version-status.js +1 -1
  631. package/dist/services/vnext-code-review.js +302 -91
  632. package/dist/services/vnext-code.js +325 -251
  633. package/dist/services/vnext-contracts.js +10 -1
  634. package/dist/services/vnext-execution-profile.js +80 -5
  635. package/dist/services/vnext-fanout.js +399 -20
  636. package/dist/services/vnext-merge.js +336 -114
  637. package/dist/services/vnext-plan-review.js +288 -133
  638. package/dist/services/vnext-plan.js +257 -110
  639. package/dist/services/vnext-protocolize.js +534 -96
  640. package/dist/services/vnext-specify.js +131 -84
  641. package/dist/services/vnext-workspace-policy.js +7 -2
  642. package/dist/services/work-registry.js +1950 -215
  643. package/dist/services/work-retry-context.js +55 -0
  644. package/dist/services/workspace-bootstrap.js +53 -15
  645. package/dist/services/workspace-files.js +85 -0
  646. package/dist/services/worktrees.js +108 -48
  647. package/dist/shared/entity-references.js +1 -0
  648. package/dist/shared/errors.js +27 -0
  649. package/dist/storage/agent-output.js +26 -0
  650. package/dist/storage/data-preservation.js +65 -0
  651. package/dist/storage/database.js +931 -40
  652. package/dist/storage/foreign-key-transaction.js +39 -0
  653. package/dist/storage/immutable-input.js +45 -0
  654. package/dist/storage/import-guard.js +159 -0
  655. package/dist/storage/memory-upgrade-schema-bootstrap.js +38 -0
  656. package/dist/storage/native-cleanup.js +52 -0
  657. package/dist/storage/paired-writer-migration.js +424 -0
  658. package/dist/storage/paths.js +17 -4
  659. package/dist/storage/projection-lock.js +73 -0
  660. package/dist/storage/work-references.js +23 -0
  661. package/dist/storage/writer-contract.js +96 -0
  662. package/dist/storage/writer-migration.js +346 -0
  663. package/dist/storage/writer-restore.js +217 -0
  664. package/dist/verification-components.json +384 -0
  665. package/package.json +52 -13
  666. package/tools/create-canon-release.mjs +33 -0
  667. package/tools/probe-codex-history.mjs +37 -0
  668. package/tools/produce-hybrid-release.mjs +41 -0
  669. package/tools/repair-paused-run-status.mjs +84 -0
  670. package/tools/verification-jobs.mjs +342 -0
@@ -0,0 +1,375 @@
1
+ import path from "node:path";
2
+ import { createHash } from "node:crypto";
3
+ import { AppError } from "../shared/errors.js";
4
+ import { hybridDigest } from "./hybrid-contracts.js";
5
+ import { runtimeHarness } from "./execution-policy.js";
6
+ import { PreparedMemoryStageResult, memorySourceKey } from "./memory-stage-results.js";
7
+ import { ObservedMemorySources } from "./memory-source-observations.js";
8
+ import { readWorkBatchCustody } from "./work-registry.js";
9
+ import { readMemoryCompositionRegistration, readRegisteredMemoryComposition } from "./memory-composition-registration.js";
10
+ import { validateMemoryCompositionWorkResult } from "./memory-composition-work-results.js";
11
+ import { readMemoryUpgradePublication } from "./memory-upgrade-publication-custody.js";
12
+ import { readMemoryUpgradeBootstrapReadiness } from "./memory-upgrade-bootstrap-readiness.js";
13
+ import { readUpgradeStorageReadiness } from "./memory-upgrade-storage-readiness.js";
14
+ import { readAcceptedStageData } from "./stage-report-renderer.js";
15
+ import { getProjectVersionStatus } from "./version-status.js";
16
+ const hash = (bytes) => createHash("sha256").update(bytes).digest("hex");
17
+ function refuse(reason) {
18
+ throw new AppError("memory_composition_acceptance_invalid", "Composition lacks registered, settled and current output custody", 2, { reason, effect: "no_effect" });
19
+ }
20
+ function object(bytes, reason) {
21
+ try {
22
+ const value = JSON.parse(bytes);
23
+ if (!value || typeof value !== "object" || Array.isArray(value))
24
+ refuse(reason);
25
+ return value;
26
+ }
27
+ catch {
28
+ return refuse(reason);
29
+ }
30
+ }
31
+ function roots(context, scope) {
32
+ const row = context.db.get("SELECT workspace_root,run_root,run_dir FROM runs WHERE project_id=? AND id=?", [scope.project_id, scope.run_id]);
33
+ if (!row || !path.isAbsolute(row.workspace_root) || !path.isAbsolute(row.run_root ?? row.run_dir))
34
+ refuse("assigned_roots_missing");
35
+ return { workspace: row.workspace_root, run: row.run_root ?? row.run_dir };
36
+ }
37
+ /** SQL-only selection. Neither a completed status nor a mutable result file
38
+ * can substitute for the output-preparation receipt committed by the memory
39
+ * Work writer together with its result and WorkSession.
40
+ */
41
+ function settled(context, scope, workId, harness, registrationSha256, assigned) {
42
+ const allocation = readWorkBatchCustody(context, workId);
43
+ if (hybridDigest(allocation.scope) !== hybridDigest(scope))
44
+ refuse("foreign_work_allocation");
45
+ const work = context.db.get("SELECT status,result,result_schema FROM works WHERE project_id=? AND run_id=? AND work_id=?", [scope.project_id, scope.run_id, workId]);
46
+ if (!work || work.status !== "completed" || work.result_schema !== "dd-flow/memory-composition-work-result@1"
47
+ || typeof work.result !== "string" || !work.result.length || Buffer.byteLength(work.result) > 1024 * 1024)
48
+ refuse("work_not_settled");
49
+ const rows = context.db.all("SELECT payload_json FROM audit_events WHERE project_id=? AND event_type='memory.composition_work_settlement' AND json_extract(payload_json,'$.run_id')=? AND json_extract(payload_json,'$.work_id')=? LIMIT 2", [scope.project_id, scope.run_id, workId]);
50
+ if (rows.length !== 1 || Buffer.byteLength(rows[0].payload_json) > 32768)
51
+ refuse("work_settlement_receipt_missing");
52
+ const receipt = object(rows[0].payload_json, "invalid_work_settlement_receipt");
53
+ const links = context.db.all("SELECT id,session_id,status,result_path,result_receipt_json FROM work_sessions WHERE work_id=? AND status='completed' LIMIT 2", [workId]);
54
+ if (links.length !== 1 || !links[0].result_receipt_json || Buffer.byteLength(links[0].result_receipt_json) > 32768
55
+ || context.db.get("SELECT 1 FROM work_sessions WHERE work_id=? AND status='running'", [workId]))
56
+ refuse("completed_work_session_missing");
57
+ const link = links[0], publication = object(link.result_receipt_json, "invalid_work_result_receipt");
58
+ const session = context.db.get("SELECT provider_session_id FROM sessions WHERE project_id=? AND session_id=? AND run_id=? AND harness=?", [scope.project_id, link.session_id, scope.run_id, harness]);
59
+ if (!session)
60
+ refuse("work_session_identity_changed");
61
+ const bytes = Buffer.from(work.result), resultSha256 = hash(bytes);
62
+ if (hybridDigest(receipt) !== hybridDigest({ schema_id: "dd-flow/memory-composition-work-settlement@1", run_id: scope.run_id, work_id: workId,
63
+ work_session_id: link.id, session_id: link.session_id, harness, provider_session_id: session.provider_session_id,
64
+ scope, registration_sha256: registrationSha256, allocation_sha256: hybridDigest(allocation), roots: assigned, result_sha256: resultSha256 }))
65
+ refuse("work_settlement_custody_changed");
66
+ if (publication.work_id !== workId || publication.work_session_id !== link.id || publication.status !== "completed" || publication.result_sha256 !== resultSha256
67
+ || publication.previous_sha256 !== null && (typeof publication.previous_sha256 !== "string" || !/^[a-f0-9]{64}$/.test(publication.previous_sha256)))
68
+ refuse("work_result_receipt_changed");
69
+ if (link.result_path !== path.join(assigned.run, "works", workId, "result.json"))
70
+ refuse("work_result_path_changed");
71
+ return { bytes, authority: hybridDigest({ receipt, publication }), assigned,
72
+ evidence: { root: "run", path: `works/${workId}/result.json`, sha256: resultSha256 } };
73
+ }
74
+ /** Final compose output custody, not semantic verification/review/finish.
75
+ * The blueprint is restored from registration; it is never rewritten using
76
+ * the final result. Historical worker bytes are schema-checked without
77
+ * asserting that a dependent assembly left their artifacts untouched.
78
+ */
79
+ export class PreparedMemoryCompositionAcceptance {
80
+ #scope;
81
+ #original;
82
+ #registrationSha256;
83
+ #workers;
84
+ #artifacts;
85
+ #semanticArtifacts;
86
+ #publication = null;
87
+ #migrationRecord = null;
88
+ #historicalEvidence = new Set();
89
+ #observed;
90
+ constructor(scope, original, registrationSha256, workers, artifacts, observed) {
91
+ this.#scope = structuredClone(scope);
92
+ this.#original = original;
93
+ this.#registrationSha256 = registrationSha256;
94
+ this.#workers = workers;
95
+ this.#artifacts = structuredClone(artifacts);
96
+ this.#semanticArtifacts = structuredClone(artifacts);
97
+ this.#observed = observed;
98
+ Object.freeze(this);
99
+ }
100
+ static prepare(context, input) {
101
+ return this.#prepare(context, input, true);
102
+ }
103
+ /** Restore settled semantic Work independently of today's possibly partly
104
+ * published marker bytes. The publication owner still checks the before view
105
+ * before retaining its intent; this method does not accept current artifacts.
106
+ */
107
+ static prepareForUpgradePublication(context, input) {
108
+ if (input.scope.stage !== "upgrade")
109
+ refuse("upgrade_publication_scope_required");
110
+ return this.#prepare(context, input, false);
111
+ }
112
+ static #prepare(context, input, observe) {
113
+ const registration = readMemoryCompositionRegistration(context, input.scope);
114
+ const original = readRegisteredMemoryComposition(context, input), value = original.value();
115
+ const works = value.details.works;
116
+ const batch = original.compositionBatch({ runId: input.scope.run_id, inputSha256: input.binding.inputSha256, executionSha256: input.binding.executionSha256, resultSchema: "dd-flow/memory-composition-work-result@1" });
117
+ const routes = new Map(original.compositionRoutes().map(route => [route.key, runtimeHarness(route.execution.worker)]));
118
+ const registrationSha256 = hybridDigest(registration), assigned = roots(context, input.scope);
119
+ const selected = context.db.readSnapshot(() => works.map(work => {
120
+ const id = registration.work_ids[work.key], harness = routes.get(work.key);
121
+ return { key: work.key, id, harness, ...settled(context, input.scope, id, harness, registrationSha256, assigned) };
122
+ }));
123
+ const outputs = new Map(selected.map(item => [item.key, validateMemoryCompositionWorkResult(item.bytes, input.engine, {
124
+ runId: input.scope.run_id, inputSha256: input.binding.inputSha256, executionSha256: input.binding.executionSha256,
125
+ workId: item.id, workKey: item.key, composition: original, compositionSha256: original.sha256
126
+ })]));
127
+ // The admitted graph has ordered all overlapping writers. Use its real
128
+ // dependencies, not array order, wall-clock timestamps or agent claims.
129
+ const remaining = new Map(works.map(work => [work.key, work.depends_on.length])), children = new Map();
130
+ for (const work of works)
131
+ for (const dependency of work.depends_on)
132
+ children.set(dependency, [...(children.get(dependency) ?? []), work.key]);
133
+ const ready = works.filter(work => !work.depends_on.length).map(work => work.key);
134
+ const current = new Map(), aliases = new Map();
135
+ for (let index = 0; index < ready.length; index++) {
136
+ const key = ready[index], output = outputs.get(key), emitted = new Map();
137
+ for (const unit of output.units)
138
+ for (const artifact of unit.artifacts) {
139
+ const identity = memorySourceKey(artifact.root, artifact.path), alias = memorySourceKey(artifact.root, artifact.path.normalize("NFC").toLowerCase());
140
+ if (aliases.has(alias) && aliases.get(alias) !== identity)
141
+ refuse("aliased_output_paths");
142
+ aliases.set(alias, identity);
143
+ const record = emitted.get(identity) ?? { artifact, units: new Set() };
144
+ record.units.add(unit.id);
145
+ emitted.set(identity, record);
146
+ }
147
+ for (const [identity, record] of emitted)
148
+ current.set(identity, record);
149
+ for (const child of children.get(key) ?? []) {
150
+ const count = remaining.get(child) - 1;
151
+ remaining.set(child, count);
152
+ if (!count)
153
+ ready.push(child);
154
+ }
155
+ }
156
+ if (ready.length !== batch.works.length)
157
+ refuse("registered_graph_changed");
158
+ const artifacts = new Map();
159
+ for (const record of current.values())
160
+ for (const id of record.units)
161
+ artifacts.set(id, [...(artifacts.get(id) ?? []), record.artifact]);
162
+ const prepared = new PreparedMemoryCompositionAcceptance(input.scope, original, registrationSha256, selected.map(item => ({ id: item.id, harness: item.harness, authority: item.authority, evidence: item.evidence })), artifacts, null);
163
+ if (input.scope.stage === "upgrade")
164
+ prepared.#historicalEvidence = new Set(input.binding.historicalEvidence);
165
+ if (observe) {
166
+ if (input.scope.stage === "upgrade")
167
+ prepared.#includePublication(context, input.binding);
168
+ prepared.#observed = ObservedMemorySources.capture(assigned, prepared.outputLocations());
169
+ const hashes = prepared.#observed.hashes();
170
+ if ([...prepared.#artifacts.values()].flat().some(artifact => hashes.get(memorySourceKey(artifact.root, artifact.path)) !== artifact.sha256))
171
+ refuse("current_output_bytes_changed");
172
+ }
173
+ prepared.assertCustody(context);
174
+ return prepared;
175
+ }
176
+ #includePublication(context, binding) {
177
+ const frozen = binding.execution?.snapshot().scope;
178
+ if (!frozen)
179
+ refuse("upgrade_execution_required");
180
+ const scope = { requestId: frozen.requestId, projectRoot: frozen.projectRoot, workspaceRoot: frozen.workspace };
181
+ const ready = readMemoryUpgradeBootstrapReadiness(context, scope), storage = readUpgradeStorageReadiness(context, scope);
182
+ if (!ready || !storage?.selection || ready.authority.binding.storage_sha256 !== storage.sha256)
183
+ refuse("upgrade_bootstrap_required");
184
+ const identity = { scope: this.#scope, selection_sha256: storage.selection.sha256, execution_sha256: binding.executionSha256,
185
+ registration_sha256: this.#registrationSha256, bootstrap_sha256: hybridDigest(ready.authority), work_custody_sha256: this.custodySha256() };
186
+ const publication = readMemoryUpgradePublication(context, identity);
187
+ if (!publication?.completed)
188
+ refuse("completed_upgrade_publication_required");
189
+ const state = publication.plan.classify();
190
+ if (state.completed !== state.total)
191
+ refuse("upgrade_publication_not_current");
192
+ const actions = new Map(publication.plan.actions().map(action => [`.memory-bank/${action.path}`, action]));
193
+ for (const artifacts of this.#artifacts.values())
194
+ for (const artifact of artifacts) {
195
+ const action = artifact.root === "workspace" ? actions.get(artifact.path) : undefined;
196
+ if (!action)
197
+ continue;
198
+ // Only the exact CLI transition can advance a settled worker hash. No
199
+ // caller-provided allowlist may excuse an arbitrary changed document.
200
+ if (action.before?.sha256 !== artifact.sha256 || action.after?.kind !== "file")
201
+ refuse("unbound_semantic_output_transition");
202
+ artifact.sha256 = action.after.sha256;
203
+ }
204
+ const outputs = new Map(publication.plan.outputs().map(output => [`.memory-bank/${output.path}`, output]));
205
+ const recordPath = `.memory-bank/archive/mb-upgrade/${identity.selection_sha256}/migration.json`, record = outputs.get(recordPath);
206
+ if (!record)
207
+ refuse("upgrade_migration_record_missing");
208
+ this.#migrationRecord = { path: recordPath, sha256: record.sha256 };
209
+ const add = (unit, path, sha256) => {
210
+ const values = this.#artifacts.get(unit) ?? [], artifact = { root: "workspace", path, sha256 };
211
+ const prior = values.find(value => value.root === artifact.root && value.path === path);
212
+ if (prior && prior.sha256 !== sha256)
213
+ refuse("conflicting_mechanical_artifact");
214
+ if (!prior)
215
+ values.push(artifact);
216
+ this.#artifacts.set(unit, values);
217
+ };
218
+ const diff = readAcceptedStageData(context, { projectId: this.#scope.project_id, runId: this.#scope.run_id, stage: "diff-analysis" });
219
+ const changes = JSON.parse(diff.bytes.toString("utf8")).details.path_map;
220
+ const old = new Map(storage.selection.payload.current.inventory.inventory.entries.map(entry => [`.memory-bank/${entry.path}`, entry]));
221
+ const final = new Map(publication.plan.beforeFiles().map(entry => [entry.path, entry]));
222
+ for (const action of publication.plan.actions()) {
223
+ if (action.after)
224
+ final.set(action.path, action.after);
225
+ else
226
+ final.delete(action.path);
227
+ }
228
+ for (const entry of storage.selection.payload.current.inventory.inventory.entries) {
229
+ const name = `.memory-bank/${entry.path}`, actual = final.get(entry.path);
230
+ const semantic = changes.some(change => change.to === name && change.action === "semantic-work");
231
+ if (entry.target && (entry.ownership === "generated" || entry.ownership === "canonical" && !semantic)
232
+ && (actual?.kind !== "file" || actual.sha256 !== entry.target.sha256))
233
+ refuse("incomplete_canonical_publication");
234
+ if (entry.ownership === "canonical" && entry.action === "archive" && actual)
235
+ refuse("obsolete_canonical_path_active");
236
+ }
237
+ const status = getProjectVersionStatus({ projectRoot: frozen.workspace, rootSource: "explicit", canon: null });
238
+ if (status?.memory_bank.version !== storage.selection.release.canon.version
239
+ || status.flow_pack.canon_version_at_source_commit !== storage.selection.release.canon.version
240
+ || status.flow_pack.source_commit !== storage.selection.release.canon.commit)
241
+ refuse("upgrade_versions_inconsistent");
242
+ for (const change of changes) {
243
+ if (change.action === "retain" && change.from) {
244
+ const source = old.get(change.from)?.current;
245
+ if (source?.kind === "file")
246
+ add(change.unit_id, change.from, outputs.get(change.from)?.sha256 ?? source.sha256);
247
+ }
248
+ else if (["canonical", "generated"].includes(change.ownership) && change.action !== "semantic-work") {
249
+ if (change.to) {
250
+ const output = outputs.get(change.to) ?? final.get(change.to.slice(13));
251
+ if (!output || output.kind !== "file")
252
+ refuse("missing_mechanical_artifact");
253
+ add(change.unit_id, change.to, output.sha256);
254
+ }
255
+ if (change.from) {
256
+ const archive = `.memory-bank/archive/mb-upgrade/${identity.selection_sha256}/files/${change.from.slice(13)}.bin`, output = outputs.get(archive);
257
+ if (!output)
258
+ refuse("missing_recovery_artifact");
259
+ add(change.unit_id, archive, output.sha256);
260
+ }
261
+ }
262
+ }
263
+ for (const unit of this.#original.value().units)
264
+ if (unit.applicability === "applicable")
265
+ add(unit.id, recordPath, record.sha256);
266
+ this.#publication = { binding: identity, sha256: publication.plan.sha256 };
267
+ }
268
+ /** Only these independently settled output locations may supplement baseline
269
+ * evidence in the final result binding. The returned map is a defensive copy.
270
+ */
271
+ outputHashes() { if (!this.#observed)
272
+ refuse("current_output_observation_required"); return this.#observed.hashes(); }
273
+ /** SQL-settled before-publication facts, not current filesystem witnesses. */
274
+ settledArtifacts() {
275
+ return [...this.#semanticArtifacts].flatMap(([unit_id, artifacts]) => artifacts.map(artifact => ({ unit_id, artifact: structuredClone(artifact) })));
276
+ }
277
+ custodySha256() {
278
+ return hybridDigest({ scope: this.#scope, registration_sha256: this.#registrationSha256, workers: this.#workers, artifacts: [...this.#semanticArtifacts] });
279
+ }
280
+ historicalEvidence() {
281
+ const units = this.#original.value().units;
282
+ return new Set([...this.#historicalEvidence, ...units.flatMap(unit => unit.evidence.map(ref => `${memorySourceKey(ref.root, ref.path)}\0${ref.sha256}`))]);
283
+ }
284
+ resultEvidence() { return this.#workers.map(worker => structuredClone(worker.evidence)); }
285
+ outputLocations() {
286
+ const selected = new Map();
287
+ for (const artifacts of this.#artifacts.values())
288
+ for (const artifact of artifacts)
289
+ selected.set(memorySourceKey(artifact.root, artifact.path), { root: artifact.root, path: artifact.path });
290
+ return [...selected.values()];
291
+ }
292
+ /** Runtime projection from completed SQL publication, never an agent map.
293
+ * Keep substantive fields and immutable graph intact. Existing invented
294
+ * references are rejected rather than silently overwritten by this helper.
295
+ */
296
+ projectResult(bytes) {
297
+ if (!this.#migrationRecord)
298
+ return Buffer.from(bytes);
299
+ const value = object(Buffer.from(bytes).toString("utf8"), "invalid_result_json");
300
+ const reject = (pointer) => {
301
+ throw new AppError("memory_stage_result_invalid", "Use the selected upgrade outputs; do not invent or rerun publication", 2, { reason: "unselected_upgrade_output", phase: "prepare", effect: "no_effect", recoverable: true, result_sha256: hash(bytes), pointer });
302
+ };
303
+ if (Array.isArray(value.units))
304
+ for (const [index, unit] of value.units.entries()) {
305
+ if (!unit || typeof unit !== "object" || typeof unit.id !== "string" || !this.#original.mechanicalUnitIds().has(unit.id) && !this.#artifacts.has(unit.id))
306
+ continue;
307
+ const expected = this.#artifacts.get(unit.id) ?? [], before = this.#semanticArtifacts.get(unit.id) ?? [];
308
+ if (unit.artifacts !== undefined && !Array.isArray(unit.artifacts))
309
+ continue;
310
+ for (const reference of unit.artifacts ?? [])
311
+ if (![...expected, ...before].some(artifact => hybridDigest(artifact) === hybridDigest(reference)))
312
+ reject(`/units/${index}/artifacts`);
313
+ unit.artifacts = structuredClone(expected);
314
+ }
315
+ if (value.details && typeof value.details === "object" && !Array.isArray(value.details)) {
316
+ const details = value.details, original = this.#original.value().details;
317
+ if (details.migration_record !== undefined && ![original.migration_record, this.#migrationRecord].some(reference => hybridDigest(reference) === hybridDigest(details.migration_record)))
318
+ reject("/details/migration_record");
319
+ details.migration_record = { ...this.#migrationRecord };
320
+ }
321
+ return Buffer.from(JSON.stringify(value));
322
+ }
323
+ assertResult(result) {
324
+ if (!(result instanceof PreparedMemoryStageResult))
325
+ refuse("prepared_result_required");
326
+ if (this.#scope.stage === "upgrade" && !this.#publication)
327
+ refuse("completed_upgrade_publication_required");
328
+ const original = this.#original.value(), final = result.value(), value = final;
329
+ const identity = ["schema_id", "run_id", "input_sha256", "predecessors"];
330
+ if (hybridDigest(identity.map(field => original[field])) !== hybridDigest(identity.map(field => final[field])))
331
+ refuse("foreign_result_identity");
332
+ const details = this.#migrationRecord ? { ...original.details, migration_record: this.#migrationRecord } : original.details;
333
+ if (value.stage !== this.#original.authoringStage() || value.outcome !== "accepted" || hybridDigest(value.details) !== hybridDigest(details)
334
+ || value.findings.some(finding => finding.severity !== "minor" && finding.status !== "resolved"))
335
+ refuse("composition_not_accepted_or_plan_changed");
336
+ const inventory = new Map(original.units.map(unit => [unit.id, unit]));
337
+ if (value.units.length !== inventory.size || new Set(value.units.map(unit => unit.id)).size !== inventory.size)
338
+ refuse("changed_unit_coverage");
339
+ for (const unit of value.units) {
340
+ const initial = inventory.get(unit.id);
341
+ if (!initial || unit.aspect !== initial.aspect || unit.applicability !== initial.applicability || unit.applicability === "unknown"
342
+ || unit.outcome !== (unit.applicability === "not-applicable" ? "not-applicable" : "accepted"))
343
+ refuse("unaccepted_unit_or_changed_assignment");
344
+ const expected = this.#artifacts.get(unit.id) ?? [], identities = new Set(unit.artifacts.map(artifact => hybridDigest(artifact)));
345
+ if (unit.applicability !== "not-applicable" && !expected.length || identities.size !== expected.length
346
+ || expected.some(artifact => !identities.has(hybridDigest(artifact))))
347
+ refuse("unit_outputs_not_settled");
348
+ }
349
+ }
350
+ assertCustody(context) {
351
+ context.db.readSnapshot(() => {
352
+ if (hybridDigest(readMemoryCompositionRegistration(context, this.#scope)) !== this.#registrationSha256)
353
+ refuse("registration_changed");
354
+ const assigned = roots(context, this.#scope);
355
+ for (const worker of this.#workers)
356
+ if (settled(context, this.#scope, worker.id, worker.harness, this.#registrationSha256, assigned).authority !== worker.authority)
357
+ refuse("work_settlement_changed");
358
+ if (this.#publication) {
359
+ const publication = readMemoryUpgradePublication(context, this.#publication.binding);
360
+ if (!publication?.completed || publication.plan.sha256 !== this.#publication.sha256)
361
+ refuse("publication_custody_changed");
362
+ }
363
+ });
364
+ }
365
+ revalidate(context) {
366
+ if (this.#observed)
367
+ this.#observed.revalidate();
368
+ else {
369
+ const hashes = ObservedMemorySources.capture(roots(context, this.#scope), this.outputLocations()).hashes();
370
+ if (this.settledArtifacts().some(({ artifact }) => hashes.get(memorySourceKey(artifact.root, artifact.path)) !== artifact.sha256))
371
+ refuse("current_output_bytes_changed");
372
+ }
373
+ this.assertCustody(context);
374
+ }
375
+ }
@@ -0,0 +1,165 @@
1
+ import { AppError } from "../shared/errors.js";
2
+ import { localEnvironmentAllowed } from "./workspace-files.js";
3
+ function refuse(reason, details = {}) {
4
+ throw new AppError("memory_stage_result_invalid", "Memory composition graph cannot be dispatched", 2, { ...details, reason, phase: "prepare", effect: "no_effect" });
5
+ }
6
+ // Portable scopes must remain safe on case-insensitive/normalizing filesystems.
7
+ const physicalPath = (value) => value.normalize("NFC").toLowerCase();
8
+ const projectConfigurationPaths = [".memory-bank/dd-flow/project-execution.json", ".memory-bank/dd-flow/project-workspace.json"];
9
+ /** Exact project-owned defaults, never directory or case aliases of canon. */
10
+ export function memoryProjectConfigurationPath(value) { return projectConfigurationPaths.includes(value); }
11
+ /** Check both assigned directories and their concrete output descendants. */
12
+ export function memoryCompositionOutputAllowed(value, upgradeWritePaths) {
13
+ if (upgradeWritePaths && !upgradeWritePaths.has(value))
14
+ return false;
15
+ if (!upgradeWritePaths && overlaps(value, ".memory-bank/dd-flow") && !memoryProjectConfigurationPath(value))
16
+ return false;
17
+ return value.split("/").every(part => localEnvironmentAllowed(part)
18
+ && ![".git", "node_modules", ".dd-flow"].includes(physicalPath(part)));
19
+ }
20
+ function overlaps(left, right) {
21
+ const a = physicalPath(left), b = physicalPath(right);
22
+ return a === "." || b === "." || a === b || a.startsWith(`${b}/`) || b.startsWith(`${a}/`);
23
+ }
24
+ /** Called only after strict result-schema and contained-path admission. These
25
+ * semantic graph checks precede Work allocation, not merely worker dispatch.
26
+ * They do not grant filesystem access or replace frozen profile/Work custody.
27
+ */
28
+ export function validateMemoryCompositionGraph(value, upgradePaths, mechanicalUnits) {
29
+ if (mechanicalUnits && !upgradePaths)
30
+ refuse("missing_upgrade_authority");
31
+ const result = value;
32
+ const unresolved = result.units.findIndex(unit => unit.applicability === "unknown");
33
+ if (unresolved !== -1)
34
+ throw new AppError("memory_stage_result_invalid", "Resolve the composition target before assigning Work; missing facts may remain explicit in its content", 2, { reason: "unresolved_composition_applicability", phase: "prepare", effect: "no_effect", unit_id: result.units[unresolved].id,
35
+ pointer: `/units/${unresolved}/applicability`, hint: "Choose applicable for an intended document or compact shelf, or not-applicable with a reason and no assigned writer. Do not invent missing project facts." });
36
+ const works = result.details.works;
37
+ const byKey = new Map(works.map(work => [work.key, work]));
38
+ if (byKey.size !== works.length || new Set(works.map(work => physicalPath(work.key))).size !== works.length)
39
+ refuse("duplicate_composition_work");
40
+ for (const work of works) {
41
+ if (work.depends_on.some(key => !byKey.has(key)))
42
+ refuse("unknown_composition_dependency");
43
+ for (const scopes of [work.read_scopes, work.write_scopes]) {
44
+ if (new Set(scopes.map(scope => `${scope.root}\0${physicalPath(scope.path)}`)).size !== scopes.length)
45
+ refuse("duplicate_composition_scope");
46
+ }
47
+ for (const scope of work.write_scopes) {
48
+ if (scope.path === ".")
49
+ refuse("unbounded_composition_write");
50
+ if (scope.root === "workspace" && (scope.path !== ".memory-bank" && !scope.path.startsWith(".memory-bank/")))
51
+ refuse("foreign_composition_write");
52
+ // These exact files are project-owned defaults consumed by ordinary
53
+ // entry, not selected canon. Never grant their enclosing directory or
54
+ // case/normalization aliases; the installed prompt/schema pack is sealed.
55
+ const projectConfig = memoryProjectConfigurationPath(scope.path);
56
+ if (!upgradePaths && scope.root === "workspace" && !projectConfig && [".memory-bank/mbb", ".memory-bank/dd-flow"].some(canonical => overlaps(scope.path, canonical)))
57
+ refuse("canonical_composition_write");
58
+ const selectedPaths = upgradePaths && scope.root === "workspace" ? new Set(work.unit_ids.flatMap(id => [...upgradePaths.get(id) ?? []])) : undefined;
59
+ // A contained semantic scope is not permission to alter credentials,
60
+ // repository metadata, installed dependencies or runtime state.
61
+ if (!memoryCompositionOutputAllowed(scope.path, selectedPaths))
62
+ refuse("private_composition_write", {
63
+ work_key: work.key, scope: { ...scope },
64
+ hint: selectedPaths && work.unit_ids.every(id => mechanicalUnits?.has(id))
65
+ ? "These units are mechanical: remove their agent Work and use memory upgrade publish after graph registration. Do not change accepted predecessor or ownership files."
66
+ : selectedPaths ? "This path is outside this Work's accepted upgrade authoring paths. Mechanical canonical/generated changes use memory upgrade publish, not agent workspace writes. Correct only the proposed scopes; keep accepted predecessor and ownership files unchanged."
67
+ : "Remove the private filesystem scope from the proposed Work; credentials, repository metadata and runtime state are not semantic outputs."
68
+ });
69
+ if (scope.root === "run" && ["execution-bundle", "run.json"].some(authority => overlaps(scope.path, authority)))
70
+ refuse("authority_composition_write");
71
+ // Mechanical RUN files and another Work's evidence are never semantic outputs.
72
+ if (scope.root === "run") {
73
+ const namespace = `memory-artifacts/${upgradePaths ? "upgrade" : "compose"}/${work.key}`;
74
+ if (scope.path !== namespace && !scope.path.startsWith(`${namespace}/`))
75
+ refuse("foreign_composition_run_write");
76
+ }
77
+ }
78
+ }
79
+ // Iterative topological order avoids recursion on an agent-sized graph.
80
+ const remaining = new Map(works.map(work => [work.key, work.depends_on.length]));
81
+ const children = new Map();
82
+ for (const work of works)
83
+ for (const dependency of work.depends_on) {
84
+ const list = children.get(dependency) ?? [];
85
+ list.push(work.key);
86
+ children.set(dependency, list);
87
+ }
88
+ const ready = works.filter(work => !work.depends_on.length).map(work => work.key);
89
+ const positions = new Map(works.map((work, index) => [work.key, index]));
90
+ const ancestors = new Map();
91
+ const dependsOn = (work, dependency) => {
92
+ const position = positions.get(dependency);
93
+ return Boolean(ancestors.get(work)[position >>> 5] & (1 << (position & 31)));
94
+ };
95
+ for (let cursor = 0; cursor < ready.length; cursor++) {
96
+ const key = ready[cursor], work = byKey.get(key);
97
+ const inherited = new Uint32Array(Math.ceil(works.length / 32));
98
+ for (const dependency of work.depends_on) {
99
+ const position = positions.get(dependency);
100
+ inherited[position >>> 5] |= 1 << (position & 31);
101
+ const prior = ancestors.get(dependency);
102
+ for (let word = 0; word < prior.length; word++)
103
+ inherited[word] |= prior[word];
104
+ }
105
+ ancestors.set(key, inherited);
106
+ for (const child of children.get(key) ?? []) {
107
+ const count = remaining.get(child) - 1;
108
+ remaining.set(child, count);
109
+ if (!count)
110
+ ready.push(child);
111
+ }
112
+ }
113
+ if (ready.length !== works.length)
114
+ refuse("cyclic_composition_dependency");
115
+ const assemblies = works.filter(work => work.role === "index-assembly");
116
+ const declared = new Set(result.details.assembly_work_keys);
117
+ if (declared.size !== result.details.assembly_work_keys.length || declared.size !== assemblies.length
118
+ || assemblies.some(work => !declared.has(work.key)))
119
+ refuse("invalid_assembly_membership");
120
+ const applicable = new Set(result.units.filter(unit => unit.applicability !== "not-applicable").map(unit => unit.id));
121
+ for (const unit of mechanicalUnits ?? []) {
122
+ if (!applicable.has(unit) || upgradePaths?.has(unit))
123
+ refuse("invalid_mechanical_unit");
124
+ const assigned = works.filter(work => work.unit_ids.includes(unit));
125
+ if (assigned.length)
126
+ refuse("mechanical_unit_cannot_allocate_agent_work", {
127
+ unit_id: unit, work_keys: assigned.map(work => work.key).slice(0, 8),
128
+ hint: "Remove this unit from agent Work assignments, but keep the unit in the result inventory. CLI owns its mechanical publication through memory upgrade publish."
129
+ });
130
+ }
131
+ for (const work of works)
132
+ if (work.unit_ids.some(id => !applicable.has(id)))
133
+ refuse("inapplicable_composition_work");
134
+ for (const unit of applicable) {
135
+ if (mechanicalUnits?.has(unit))
136
+ continue;
137
+ const authors = works.filter(work => work.unit_ids.includes(unit));
138
+ const writers = authors.filter(work => work.role === "writer");
139
+ const collectors = assemblies.filter(work => work.unit_ids.includes(unit));
140
+ // Init assembles a new knowledge shelf. Upgrade may reconcile one existing
141
+ // document without changing its navigation; do not invent a collector Work.
142
+ // Explicit collectors still depend on every writer, in either flow.
143
+ if (!authors.length || !upgradePaths && !collectors.length)
144
+ refuse("incomplete_composition_coverage", {
145
+ unit_id: unit,
146
+ hint: upgradePaths
147
+ ? "Assign this applicable non-mechanical unit to Work. For preservation evidence only, group it into an existing evidence Work with its RUN-local output; keep accepted unit identities and workspace write scopes unchanged."
148
+ : "Assign this applicable unit to composition Work and its index-assembly collector. Keep accepted unit identities unchanged."
149
+ });
150
+ if (collectors.some(collector => writers.some(writer => !dependsOn(collector.key, writer.key))))
151
+ refuse("assembly_precedes_unit_writers");
152
+ }
153
+ for (let index = 0; index < works.length; index++) {
154
+ const left = works[index];
155
+ for (const right of works.slice(index + 1)) {
156
+ if (dependsOn(left.key, right.key) || dependsOn(right.key, left.key))
157
+ continue;
158
+ if (left.write_scopes.some(a => right.write_scopes.some(b => a.root === b.root && overlaps(a.path, b.path))))
159
+ refuse("unordered_composition_writers");
160
+ if (left.write_scopes.some(a => right.read_scopes.some(b => a.root === b.root && overlaps(a.path, b.path)))
161
+ || right.write_scopes.some(a => left.read_scopes.some(b => a.root === b.root && overlaps(a.path, b.path))))
162
+ refuse("unordered_composition_read_write");
163
+ }
164
+ }
165
+ }