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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (560) hide show
  1. package/CHANGELOG.md +907 -0
  2. package/README.md +139 -10
  3. package/dist/build-info.json +8 -8
  4. package/dist/cli/argument-values.js +38 -0
  5. package/dist/cli/command-inputs.js +386 -0
  6. package/dist/cli/command-metadata.js +232 -0
  7. package/dist/cli/command-option-descriptions.js +192 -0
  8. package/dist/cli/completion-cli.js +70 -0
  9. package/dist/cli/completion.js +57 -0
  10. package/dist/cli/diagnostic-invocation.js +46 -0
  11. package/dist/cli/diagnostic.js +120 -0
  12. package/dist/cli/error-output.js +52 -0
  13. package/dist/cli/executor-onboarding.js +76 -0
  14. package/dist/cli/flows.js +29 -0
  15. package/dist/cli/harnesses.js +84 -0
  16. package/dist/cli/help.js +396 -19
  17. package/dist/cli/hook-ingress.js +102 -0
  18. package/dist/cli/input-preparation.js +165 -0
  19. package/dist/cli/memory-flow-admission.js +50 -0
  20. package/dist/cli/memory-init-invocation.js +85 -0
  21. package/dist/cli/memory-init.js +249 -0
  22. package/dist/cli/memory-storage-admission.js +54 -0
  23. package/dist/cli/memory-storage-qualification.js +105 -0
  24. package/dist/cli/memory-storage-transition.js +123 -0
  25. package/dist/cli/memory-upgrade.js +189 -0
  26. package/dist/cli/models.js +39 -0
  27. package/dist/cli/native-hook-ingress.js +90 -0
  28. package/dist/cli/native-hook-preparation.js +55 -0
  29. package/dist/cli/operator-profiles.js +61 -0
  30. package/dist/cli/output-options.js +35 -0
  31. package/dist/cli/response-file.js +72 -0
  32. package/dist/cli/run-cli.js +1734 -550
  33. package/dist/cli/runtime-maintenance-diagnostics.js +46 -0
  34. package/dist/cli/runtime-maintenance-ingress.js +52 -0
  35. package/dist/cli/runtime-process.js +153 -0
  36. package/dist/cli/setup.js +150 -0
  37. package/dist/cli.js +89 -2
  38. package/dist/domain/diagnostic-aspects.js +103 -0
  39. package/dist/domain/diagnostic-flows.js +8 -0
  40. package/dist/domain/stage-catalog.js +1 -1
  41. package/dist/domain/stage-handler-identities.js +28 -0
  42. package/dist/harness-runtime/DD-ZCODE.md +112 -0
  43. package/dist/harness-runtime/OPENCODE-LICENSE.txt +24 -0
  44. package/dist/harness-runtime/bin/dd-agy.mjs +56 -0
  45. package/dist/harness-runtime/bin/dd-codex.mjs +27 -0
  46. package/dist/harness-runtime/bin/dd-droid.mjs +34 -0
  47. package/dist/harness-runtime/bin/dd-grok.mjs +40 -0
  48. package/dist/harness-runtime/bin/dd-opencode.mjs +22 -0
  49. package/dist/harness-runtime/bin/dd-zcode.mjs +87 -0
  50. package/dist/harness-runtime/lib/adapter-timeouts.d.mts +5 -0
  51. package/dist/harness-runtime/lib/adapter-timeouts.mjs +34 -0
  52. package/dist/harness-runtime/lib/agy-error-boundary.mjs +79 -0
  53. package/dist/harness-runtime/lib/agy-hooks.d.mts +1 -0
  54. package/dist/harness-runtime/lib/agy-hooks.mjs +9 -0
  55. package/dist/harness-runtime/lib/agy-native-inspection.mjs +216 -0
  56. package/dist/harness-runtime/lib/agy-native_pb.js +117 -0
  57. package/dist/harness-runtime/lib/agy-terminal-envelope.mjs +67 -0
  58. package/dist/harness-runtime/lib/daemon-observation.d.mts +2 -0
  59. package/dist/harness-runtime/lib/daemon-observation.mjs +163 -0
  60. package/dist/harness-runtime/lib/daemon-operations.d.mts +2 -0
  61. package/dist/harness-runtime/lib/daemon-operations.mjs +462 -0
  62. package/dist/harness-runtime/lib/dd-agy-daemon.d.mts +6 -0
  63. package/dist/harness-runtime/lib/dd-agy-daemon.mjs +1092 -0
  64. package/dist/harness-runtime/lib/dd-agy.mjs +86 -0
  65. package/dist/harness-runtime/lib/dd-codex-daemon.d.mts +1 -0
  66. package/dist/harness-runtime/lib/dd-codex-daemon.mjs +231 -0
  67. package/dist/harness-runtime/lib/dd-codex.d.mts +1 -0
  68. package/dist/harness-runtime/lib/dd-codex.mjs +954 -0
  69. package/dist/harness-runtime/lib/dd-droid-daemon.mjs +141 -0
  70. package/dist/harness-runtime/lib/dd-droid.mjs +626 -0
  71. package/dist/harness-runtime/lib/dd-grok-daemon.mjs +555 -0
  72. package/dist/harness-runtime/lib/dd-grok.mjs +180 -0
  73. package/dist/harness-runtime/lib/dd-opencode-daemon.mjs +627 -0
  74. package/dist/harness-runtime/lib/dd-opencode.mjs +390 -0
  75. package/dist/harness-runtime/lib/dd-zcode-daemon.mjs +752 -0
  76. package/dist/harness-runtime/lib/dd-zcode.mjs +1200 -0
  77. package/dist/harness-runtime/lib/delegation-instructions.d.mts +14 -0
  78. package/dist/harness-runtime/lib/delegation-instructions.mjs +166 -0
  79. package/dist/harness-runtime/lib/dispatch-fence.mjs +14 -0
  80. package/dist/harness-runtime/lib/driver-recovery.mjs +140 -0
  81. package/dist/harness-runtime/lib/droid-observation.mjs +66 -0
  82. package/dist/harness-runtime/lib/entity-references.d.mts +2 -0
  83. package/dist/harness-runtime/lib/entity-references.mjs +9 -0
  84. package/dist/harness-runtime/lib/lease-renewal.d.mts +8 -0
  85. package/dist/harness-runtime/lib/lease-renewal.mjs +37 -0
  86. package/dist/harness-runtime/lib/lifecycle-command.d.mts +20 -0
  87. package/dist/harness-runtime/lib/lifecycle-command.mjs +273 -0
  88. package/dist/harness-runtime/lib/lifecycle-contract.d.mts +10 -0
  89. package/dist/harness-runtime/lib/lifecycle-contract.mjs +19 -0
  90. package/dist/harness-runtime/lib/managed-daemon.d.mts +16 -0
  91. package/dist/harness-runtime/lib/managed-daemon.mjs +698 -0
  92. package/dist/harness-runtime/lib/managed-flow-env.mjs +15 -0
  93. package/dist/harness-runtime/lib/model-observations.mjs +113 -0
  94. package/dist/harness-runtime/lib/native-children.d.mts +34 -0
  95. package/dist/harness-runtime/lib/native-children.mjs +265 -0
  96. package/dist/harness-runtime/lib/native-hook-command.d.mts +7 -0
  97. package/dist/harness-runtime/lib/native-hook-command.mjs +251 -0
  98. package/dist/harness-runtime/lib/native-request-proof.d.mts +2 -0
  99. package/dist/harness-runtime/lib/native-request-proof.mjs +65 -0
  100. package/dist/harness-runtime/lib/native-streams.mjs +45 -0
  101. package/dist/harness-runtime/lib/observation-clock.d.mts +18 -0
  102. package/dist/harness-runtime/lib/observation-clock.mjs +95 -0
  103. package/dist/harness-runtime/lib/opencode-plugin.mjs +85 -0
  104. package/dist/harness-runtime/lib/operation-context.mjs +5 -0
  105. package/dist/harness-runtime/lib/operation-errors.d.mts +16 -0
  106. package/dist/harness-runtime/lib/operation-errors.mjs +127 -0
  107. package/dist/harness-runtime/lib/operation-progress.d.mts +7 -0
  108. package/dist/harness-runtime/lib/operation-progress.mjs +114 -0
  109. package/dist/harness-runtime/lib/process-json.d.mts +5 -0
  110. package/dist/harness-runtime/lib/process-json.mjs +201 -0
  111. package/dist/harness-runtime/lib/process-snapshot.mjs +10 -0
  112. package/dist/harness-runtime/lib/provider-overload-policy.d.mts +23 -0
  113. package/dist/harness-runtime/lib/provider-overload-policy.mjs +242 -0
  114. package/dist/harness-runtime/lib/runner-events.mjs +202 -0
  115. package/dist/harness-runtime/lib/runner-lock.mjs +42 -0
  116. package/dist/harness-runtime/lib/session-settlement.mjs +30 -0
  117. package/dist/harness-runtime/lib/setup-progress.d.mts +9 -0
  118. package/dist/harness-runtime/lib/setup-progress.mjs +53 -0
  119. package/dist/harness-runtime/lib/tool-observations.d.mts +21 -0
  120. package/dist/harness-runtime/lib/tool-observations.mjs +228 -0
  121. package/dist/harness-runtime/lib/zcode-usage.mjs +55 -0
  122. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-1y4a697q.js +81 -0
  123. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-2ny4vxct.js +92 -0
  124. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-6mptkzbc.js +0 -0
  125. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-7x67cf1q.js +52 -0
  126. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-9rqn6x4v.js +16 -0
  127. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-9vdz0zwn.js +1661 -0
  128. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ecs5ftka.js +1466 -0
  129. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-frbwqjmf.js +145 -0
  130. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-gne7h7mq.js +50 -0
  131. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-gx9wnkzr.js +105 -0
  132. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-m2eywc8w.js +0 -0
  133. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-nwcpakzx.js +12 -0
  134. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-q4g3afnw.js +623 -0
  135. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-qav6mfdz.js +0 -0
  136. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-sxt88q69.js +12 -0
  137. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-t1xa31vm.js +39 -0
  138. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ve4aws36.js +103 -0
  139. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vmytr4q8.js +4 -0
  140. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vt9jbch8.js +36 -0
  141. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-vyas3vgt.js +0 -0
  142. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-wjyeq25y.js +30 -0
  143. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-xgnj2w4v.js +20 -0
  144. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-y2etg5bs.js +9 -0
  145. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-ydhz1zrh.js +238 -0
  146. package/dist/harness-runtime/vendor/opencode-client/chunks/service-probe-z6qdwcsf.js +62 -0
  147. package/dist/harness-runtime/vendor/opencode-client/contract.d.ts +1 -0
  148. package/dist/harness-runtime/vendor/opencode-client/contract.js +12 -0
  149. package/dist/harness-runtime/vendor/opencode-client/effect/api/api.d.ts +2806 -0
  150. package/dist/harness-runtime/vendor/opencode-client/effect/api/api.js +0 -0
  151. package/dist/harness-runtime/vendor/opencode-client/effect/api.d.ts +4 -0
  152. package/dist/harness-runtime/vendor/opencode-client/effect/api.js +0 -0
  153. package/dist/harness-runtime/vendor/opencode-client/effect/client.d.ts +2530 -0
  154. package/dist/harness-runtime/vendor/opencode-client/effect/client.js +15 -0
  155. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client-error.d.ts +7 -0
  156. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client-error.js +6 -0
  157. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client.d.ts +2529 -0
  158. package/dist/harness-runtime/vendor/opencode-client/effect/generated/client.js +8 -0
  159. package/dist/harness-runtime/vendor/opencode-client/effect/generated/index.d.ts +2 -0
  160. package/dist/harness-runtime/vendor/opencode-client/effect/generated/index.js +12 -0
  161. package/dist/harness-runtime/vendor/opencode-client/effect/index.d.ts +35 -0
  162. package/dist/harness-runtime/vendor/opencode-client/effect/index.js +75 -0
  163. package/dist/harness-runtime/vendor/opencode-client/effect/rpc.d.ts +20 -0
  164. package/dist/harness-runtime/vendor/opencode-client/effect/rpc.js +11 -0
  165. package/dist/harness-runtime/vendor/opencode-client/effect/service.d.ts +90 -0
  166. package/dist/harness-runtime/vendor/opencode-client/effect/service.js +187 -0
  167. package/dist/harness-runtime/vendor/opencode-client/package.json +84 -0
  168. package/dist/harness-runtime/vendor/opencode-client/promise/api.d.ts +21 -0
  169. package/dist/harness-runtime/vendor/opencode-client/promise/api.js +0 -0
  170. package/dist/harness-runtime/vendor/opencode-client/promise/client.d.ts +252 -0
  171. package/dist/harness-runtime/vendor/opencode-client/promise/client.js +14 -0
  172. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client-error.d.ts +8 -0
  173. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client-error.js +6 -0
  174. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client.d.ts +259 -0
  175. package/dist/harness-runtime/vendor/opencode-client/promise/generated/client.js +7 -0
  176. package/dist/harness-runtime/vendor/opencode-client/promise/generated/index.d.ts +3 -0
  177. package/dist/harness-runtime/vendor/opencode-client/promise/generated/index.js +79 -0
  178. package/dist/harness-runtime/vendor/opencode-client/promise/generated/types.d.ts +8932 -0
  179. package/dist/harness-runtime/vendor/opencode-client/promise/generated/types.js +70 -0
  180. package/dist/harness-runtime/vendor/opencode-client/promise/index.d.ts +6 -0
  181. package/dist/harness-runtime/vendor/opencode-client/promise/index.js +83 -0
  182. package/dist/harness-runtime/vendor/opencode-client/promise/rpc.d.ts +32 -0
  183. package/dist/harness-runtime/vendor/opencode-client/promise/rpc.js +7 -0
  184. package/dist/harness-runtime/vendor/opencode-client/promise/service.d.ts +24 -0
  185. package/dist/harness-runtime/vendor/opencode-client/promise/service.js +187 -0
  186. package/dist/harness-runtime/vendor/opencode-client/pty-handoff.d.ts +12 -0
  187. package/dist/harness-runtime/vendor/opencode-client/pty-handoff.js +14 -0
  188. package/dist/harness-runtime/vendor/opencode-client/rpc-runtime.d.ts +20 -0
  189. package/dist/harness-runtime/vendor/opencode-client/rpc-runtime.js +14 -0
  190. package/dist/harness-runtime/vendor/opencode-client/service-contender.d.ts +37 -0
  191. package/dist/harness-runtime/vendor/opencode-client/service-contender.js +10 -0
  192. package/dist/harness-runtime/vendor/opencode-client/service-probe.d.ts +70 -0
  193. package/dist/harness-runtime/vendor/opencode-client/service-probe.js +16 -0
  194. package/dist/harness-runtime/vendor/opencode-client/service-timing.d.ts +12 -0
  195. package/dist/harness-runtime/vendor/opencode-client/service-timing.js +10 -0
  196. package/dist/harness-runtime/vendor/opencode-client/service-version.d.ts +2 -0
  197. package/dist/harness-runtime/vendor/opencode-client/service-version.js +6 -0
  198. package/dist/harness-runtime/vendor/opencode-client/service.d.ts +52 -0
  199. package/dist/harness-runtime/vendor/opencode-client/service.js +1 -0
  200. package/dist/harness-runtime/vendor/opencode-client/shared-events.d.ts +11 -0
  201. package/dist/harness-runtime/vendor/opencode-client/shared-events.js +8 -0
  202. package/dist/harness-runtime/vendor/opencode-client/solid/connection.d.ts +37 -0
  203. package/dist/harness-runtime/vendor/opencode-client/solid/connection.js +10 -0
  204. package/dist/harness-runtime/vendor/opencode-client/solid/data.d.ts +211 -0
  205. package/dist/harness-runtime/vendor/opencode-client/solid/data.js +18 -0
  206. package/dist/harness-runtime/vendor/opencode-client/solid/index.d.ts +3 -0
  207. package/dist/harness-runtime/vendor/opencode-client/solid/index.js +32 -0
  208. package/dist/harness-runtime/vendor/opencode-client/solid/pty.d.ts +22 -0
  209. package/dist/harness-runtime/vendor/opencode-client/solid/pty.js +8 -0
  210. package/dist/harness-runtime/vendor/opencode-plugin.mjs +3 -0
  211. package/dist/protocol/local-files.js +18 -9
  212. package/dist/runtime/context.js +8 -4
  213. package/dist/schemas/agent-profile.schema.json +1 -1
  214. package/dist/schemas/code-review-decision.schema.json +9 -0
  215. package/dist/schemas/code-review-result.schema.json +1 -1
  216. package/dist/schemas/code-verification.schema.json +7 -5
  217. package/dist/schemas/code-work-batch.schema.json +2 -2
  218. package/dist/schemas/diagnostic-stage-result.schema.json +354 -0
  219. package/dist/schemas/diagnostic-work-result.schema.json +296 -0
  220. package/dist/schemas/discovery-result.schema.json +184 -0
  221. package/dist/schemas/execution-bundle.schema.json +211 -0
  222. package/dist/schemas/execution-settings.schema.json +162 -0
  223. package/dist/schemas/flow-descriptor.schema.json +54 -0
  224. package/dist/schemas/flow-run.schema.json +29 -0
  225. package/dist/schemas/harness-catalog.schema.json +80 -0
  226. package/dist/schemas/mb-init-compose-result.schema.json +457 -0
  227. package/dist/schemas/mb-init-discover-result.schema.json +500 -0
  228. package/dist/schemas/mb-init-finish-result.schema.json +422 -0
  229. package/dist/schemas/mb-init-preflight-result.schema.json +367 -0
  230. package/dist/schemas/mb-init-review-result.schema.json +396 -0
  231. package/dist/schemas/mb-init-verify-result.schema.json +391 -0
  232. package/dist/schemas/mb-upgrade-stage-result.schema.json +863 -0
  233. package/dist/schemas/memory-bootstrap-receipt-v2.schema.json +67 -0
  234. package/dist/schemas/memory-bootstrap-receipt.schema.json +354 -0
  235. package/dist/schemas/memory-composition-work-result.schema.json +38 -0
  236. package/dist/schemas/memory-repair-work-result.schema.json +56 -0
  237. package/dist/schemas/memory-review-correction-plan.schema.json +30 -0
  238. package/dist/schemas/memory-review-work-result.schema.json +43 -0
  239. package/dist/schemas/model-catalog.schema.json +153 -0
  240. package/dist/schemas/plan-review-decision.schema.json +12 -3
  241. package/dist/schemas/plan-review-result.schema.json +2 -2
  242. package/dist/schemas/profile-settings.schema.json +122 -0
  243. package/dist/schemas/project-flow-pack-manifest.schema.json +1 -1
  244. package/dist/schemas/release-impact.schema.json +3 -3
  245. package/dist/schemas/release-manifest.schema.json +291 -0
  246. package/dist/schemas/run-control-receipt.schema.json +118 -0
  247. package/dist/schemas/run-control-request.schema.json +36 -0
  248. package/dist/schemas/run-engine-binding.schema.json +1 -1
  249. package/dist/schemas/stage-start-response.schema.json +4 -0
  250. package/dist/schemas/vnext-protocol-plan.schema.json +2 -2
  251. package/dist/services/accepted-intent.js +139 -0
  252. package/dist/services/branch-context.js +3 -3
  253. package/dist/services/canon.js +54 -15
  254. package/dist/services/check-environment.js +21 -0
  255. package/dist/services/check-runner-evidence.js +277 -0
  256. package/dist/services/check-runner-proof.js +305 -0
  257. package/dist/services/cleanup.js +133 -40
  258. package/dist/services/cli-operation-classifier.js +26 -63
  259. package/dist/services/cli-upgrade-allowlist.js +27 -0
  260. package/dist/services/code-checks.js +1401 -119
  261. package/dist/services/codex-hook-delivery.js +32 -0
  262. package/dist/services/command-context.js +80 -0
  263. package/dist/services/compatibility-preflight.js +16 -3
  264. package/dist/services/config.js +11 -8
  265. package/dist/services/continuation-outcome.js +20 -0
  266. package/dist/services/controller-child-capacity.js +71 -0
  267. package/dist/services/controller-child-observer.js +121 -0
  268. package/dist/services/controller-execution.js +94 -0
  269. package/dist/services/controller-fanout.js +226 -0
  270. package/dist/services/controller-memory-task.js +45 -0
  271. package/dist/services/controller-memory-worker.js +49 -0
  272. package/dist/services/dashboard.js +143 -58
  273. package/dist/services/descriptor-coordinator-session.js +35 -0
  274. package/dist/services/descriptor-root-work.js +53 -0
  275. package/dist/services/descriptor-run-settlement.js +107 -0
  276. package/dist/services/descriptor-run-start.js +475 -0
  277. package/dist/services/descriptor-stage-coordinator.js +250 -0
  278. package/dist/services/descriptor-stage-settlement.js +223 -0
  279. package/dist/services/descriptor-stage-start.js +175 -0
  280. package/dist/services/diagnostic-evidence.js +73 -0
  281. package/dist/services/diagnostic-report-publication.js +72 -0
  282. package/dist/services/diagnostic-report.js +67 -0
  283. package/dist/services/diagnostic-run-bundle.js +74 -0
  284. package/dist/services/diagnostic-snapshot.js +159 -0
  285. package/dist/services/diagnostic-stage-handlers.js +108 -0
  286. package/dist/services/diagnostic-stage-results.js +132 -0
  287. package/dist/services/diagnostic-start.js +84 -0
  288. package/dist/services/diagnostic-work-batch.js +34 -0
  289. package/dist/services/diagnostic-work-collection.js +97 -0
  290. package/dist/services/diagnostic-work-registration.js +101 -0
  291. package/dist/services/diagnostic-work-results.js +93 -0
  292. package/dist/services/discovery/agy-discovery.js +2 -0
  293. package/dist/services/discovery/codex-discovery.js +2 -0
  294. package/dist/services/discovery/droid-discovery.js +2 -0
  295. package/dist/services/discovery/grok-discovery.js +2 -0
  296. package/dist/services/discovery/opencode-discovery.js +2 -0
  297. package/dist/services/discovery/static.js +31 -0
  298. package/dist/services/discovery/zcode-discovery.js +2 -0
  299. package/dist/services/engines.js +354 -163
  300. package/dist/services/eval-snapshots.js +1316 -150
  301. package/dist/services/execution-bundles.js +275 -0
  302. package/dist/services/execution-policy.js +185 -0
  303. package/dist/services/executor-onboarding.js +56 -0
  304. package/dist/services/external-work-launch.js +310 -0
  305. package/dist/services/flow-catalog.js +30 -0
  306. package/dist/services/flow-descriptors.js +82 -0
  307. package/dist/services/frozen-engine.js +387 -0
  308. package/dist/services/generic-execution.js +164 -0
  309. package/dist/services/harness-adapter.js +355 -36
  310. package/dist/services/harness-config.js +2 -0
  311. package/dist/services/harness-discovery.js +29 -0
  312. package/dist/services/harness-doctor.js +75 -0
  313. package/dist/services/harness-probe-effects.js +51 -0
  314. package/dist/services/harness-version-probe.js +100 -0
  315. package/dist/services/hook-memory-routing.js +188 -0
  316. package/dist/services/hook-recovery-guard.js +14 -0
  317. package/dist/services/hook-session-observation.js +24 -0
  318. package/dist/services/hooks.js +791 -326
  319. package/dist/services/hybrid-contracts.js +474 -0
  320. package/dist/services/hybrid-digest.js +14 -0
  321. package/dist/services/ids.js +29 -1
  322. package/dist/services/installation-lock.js +95 -0
  323. package/dist/services/installed-flow-source.js +226 -0
  324. package/dist/services/lanes.js +78 -65
  325. package/dist/services/lifecycle-command.js +1 -288
  326. package/dist/services/lifecycle-contract.js +1 -0
  327. package/dist/services/lifecycle-invocations.js +2148 -0
  328. package/dist/services/managed-daemon-binding.js +38 -0
  329. package/dist/services/managed-lease-monitor.js +133 -0
  330. package/dist/services/managed-processes.js +449 -69
  331. package/dist/services/memory-accepted-composition.js +78 -0
  332. package/dist/services/memory-baseline-preservation.js +65 -0
  333. package/dist/services/memory-completed-correction-wave.js +328 -0
  334. package/dist/services/memory-compose-handler.js +400 -0
  335. package/dist/services/memory-composition-acceptance.js +375 -0
  336. package/dist/services/memory-composition-graph.js +165 -0
  337. package/dist/services/memory-composition-registration.js +161 -0
  338. package/dist/services/memory-composition-work-custody.js +156 -0
  339. package/dist/services/memory-composition-work-results.js +108 -0
  340. package/dist/services/memory-corrected-review-acceptance.js +129 -0
  341. package/dist/services/memory-corrected-review-batch.js +37 -0
  342. package/dist/services/memory-corrected-review-findings.js +108 -0
  343. package/dist/services/memory-corrected-review-inputs.js +215 -0
  344. package/dist/services/memory-corrected-review-projection.js +78 -0
  345. package/dist/services/memory-corrected-review-receipt.js +178 -0
  346. package/dist/services/memory-corrected-review-registration.js +192 -0
  347. package/dist/services/memory-correction-check-receipt.js +235 -0
  348. package/dist/services/memory-correction-input-owner.js +6 -0
  349. package/dist/services/memory-custody-snapshot.js +36 -0
  350. package/dist/services/memory-discover-handler.js +104 -0
  351. package/dist/services/memory-finish-evidence.js +457 -0
  352. package/dist/services/memory-finish-handler.js +229 -0
  353. package/dist/services/memory-finish-integration.js +450 -0
  354. package/dist/services/memory-finish-readiness.js +169 -0
  355. package/dist/services/memory-git-integration.js +220 -0
  356. package/dist/services/memory-historical-corrected-review.js +212 -0
  357. package/dist/services/memory-historical-original-review.js +143 -0
  358. package/dist/services/memory-historical-repair-registration.js +105 -0
  359. package/dist/services/memory-historical-second-review.js +147 -0
  360. package/dist/services/memory-init-bootstrap-readiness.js +210 -0
  361. package/dist/services/memory-init-contexts.js +131 -0
  362. package/dist/services/memory-init-controller-start.js +103 -0
  363. package/dist/services/memory-init-engine-release.js +223 -0
  364. package/dist/services/memory-init-git-policy.js +165 -0
  365. package/dist/services/memory-init-lint-capability.js +203 -0
  366. package/dist/services/memory-init-native-capacity.js +309 -0
  367. package/dist/services/memory-init-preflight.js +334 -0
  368. package/dist/services/memory-init-project-bootstrap.js +599 -0
  369. package/dist/services/memory-init-request-candidate.js +213 -0
  370. package/dist/services/memory-init-request-input.js +82 -0
  371. package/dist/services/memory-init-resource-storage.js +125 -0
  372. package/dist/services/memory-init-run-allocation.js +81 -0
  373. package/dist/services/memory-init-run-bundle.js +135 -0
  374. package/dist/services/memory-init-start.js +181 -0
  375. package/dist/services/memory-init-startup-custody.js +80 -0
  376. package/dist/services/memory-init-startup-input.js +240 -0
  377. package/dist/services/memory-init-storage.js +91 -0
  378. package/dist/services/memory-init-stores.js +359 -0
  379. package/dist/services/memory-init-worktrunk-capability.js +174 -0
  380. package/dist/services/memory-layer-publication.js +611 -0
  381. package/dist/services/memory-layer.js +221 -0
  382. package/dist/services/memory-lint-config.js +194 -0
  383. package/dist/services/memory-native-review-copy.js +103 -0
  384. package/dist/services/memory-normal-flow-entry.js +87 -0
  385. package/dist/services/memory-ordinary-defaults.js +129 -0
  386. package/dist/services/memory-preflight-bootstrap-custody.js +115 -0
  387. package/dist/services/memory-preflight-handler.js +274 -0
  388. package/dist/services/memory-repair-current-view.js +299 -0
  389. package/dist/services/memory-repair-document-delta.js +488 -0
  390. package/dist/services/memory-repair-history.js +496 -0
  391. package/dist/services/memory-repair-physical-binding.js +194 -0
  392. package/dist/services/memory-repair-publication-files.js +152 -0
  393. package/dist/services/memory-repair-publication-intent.js +27 -0
  394. package/dist/services/memory-repair-publication-plan.js +162 -0
  395. package/dist/services/memory-repair-publication-source.js +225 -0
  396. package/dist/services/memory-repair-publication.js +795 -0
  397. package/dist/services/memory-repair-registration.js +240 -0
  398. package/dist/services/memory-repair-work-baseline.js +415 -0
  399. package/dist/services/memory-repair-work-completion.js +117 -0
  400. package/dist/services/memory-repair-work-custody.js +73 -0
  401. package/dist/services/memory-repair-work-results.js +108 -0
  402. package/dist/services/memory-repair-workspace.js +261 -0
  403. package/dist/services/memory-repair-writer-copy.js +736 -0
  404. package/dist/services/memory-result-binding.js +239 -0
  405. package/dist/services/memory-retained-review-authority.js +138 -0
  406. package/dist/services/memory-retained-review-results.js +70 -0
  407. package/dist/services/memory-retained-second-baseline.js +102 -0
  408. package/dist/services/memory-retained-second-repairs.js +162 -0
  409. package/dist/services/memory-review-acceptance.js +214 -0
  410. package/dist/services/memory-review-correction-plan.js +206 -0
  411. package/dist/services/memory-review-handler.js +585 -0
  412. package/dist/services/memory-review-inputs.js +246 -0
  413. package/dist/services/memory-review-limits.js +10 -0
  414. package/dist/services/memory-review-receipt.js +180 -0
  415. package/dist/services/memory-review-registration.js +117 -0
  416. package/dist/services/memory-review-work-custody.js +126 -0
  417. package/dist/services/memory-review-work-input.js +91 -0
  418. package/dist/services/memory-review-work-results.js +95 -0
  419. package/dist/services/memory-second-corrected-review-inputs.js +167 -0
  420. package/dist/services/memory-second-correction-plan.js +77 -0
  421. package/dist/services/memory-second-repair-baseline.js +91 -0
  422. package/dist/services/memory-second-repair-launch.js +614 -0
  423. package/dist/services/memory-second-repair-registration.js +88 -0
  424. package/dist/services/memory-second-repair-source.js +187 -0
  425. package/dist/services/memory-second-review-acceptance.js +115 -0
  426. package/dist/services/memory-source-observations.js +117 -0
  427. package/dist/services/memory-stage-dispatch.js +65 -0
  428. package/dist/services/memory-stage-results.js +290 -0
  429. package/dist/services/memory-tool-probe.js +25 -0
  430. package/dist/services/memory-upgrade-analysis-handler.js +243 -0
  431. package/dist/services/memory-upgrade-bootstrap-readiness.js +251 -0
  432. package/dist/services/memory-upgrade-evidence.js +100 -0
  433. package/dist/services/memory-upgrade-inventory.js +442 -0
  434. package/dist/services/memory-upgrade-publication-custody.js +73 -0
  435. package/dist/services/memory-upgrade-publication.js +413 -0
  436. package/dist/services/memory-upgrade-selection.js +430 -0
  437. package/dist/services/memory-upgrade-start.js +60 -0
  438. package/dist/services/memory-upgrade-storage-readiness.js +340 -0
  439. package/dist/services/memory-verification-acceptance.js +156 -0
  440. package/dist/services/memory-verification-checks.js +317 -0
  441. package/dist/services/memory-verification-receipt.js +160 -0
  442. package/dist/services/memory-verify-handler.js +137 -0
  443. package/dist/services/memory-work-result-json.js +12 -0
  444. package/dist/services/memory-work-result-preparation.js +64 -0
  445. package/dist/services/merge-queue.js +228 -149
  446. package/dist/services/merge-server.js +163 -35
  447. package/dist/services/migrations.js +164 -114
  448. package/dist/services/model-catalog.js +109 -0
  449. package/dist/services/model-discovery.js +46 -0
  450. package/dist/services/native-daemon-history.js +50 -0
  451. package/dist/services/native-session-control.js +39 -0
  452. package/dist/services/operator-profiles.js +236 -0
  453. package/dist/services/physical-startup.js +45 -0
  454. package/dist/services/plan-runtime.js +26 -11
  455. package/dist/services/plans.js +28 -25
  456. package/dist/services/project-registry.js +97 -0
  457. package/dist/services/project-summary.js +1 -1
  458. package/dist/services/projects.js +17 -87
  459. package/dist/services/prompt-delivery.js +71 -0
  460. package/dist/services/prompts.js +28 -17
  461. package/dist/services/protocols.js +163 -87
  462. package/dist/services/provider-capacity.js +463 -0
  463. package/dist/services/recovery-observation-budget.js +121 -0
  464. package/dist/services/recovery-snapshot-database.js +588 -0
  465. package/dist/services/release-archive-producer.js +52 -0
  466. package/dist/services/release-archive.js +143 -0
  467. package/dist/services/release-cache.js +150 -0
  468. package/dist/services/release-compatibility.js +18 -0
  469. package/dist/services/release-download.js +67 -0
  470. package/dist/services/release-envelope.js +104 -0
  471. package/dist/services/release-manifest.js +45 -0
  472. package/dist/services/release-payload.js +114 -0
  473. package/dist/services/release-producer.js +63 -0
  474. package/dist/services/release-provenance.js +160 -0
  475. package/dist/services/release-registry.js +66 -0
  476. package/dist/services/release-source.js +194 -0
  477. package/dist/services/repair-intents.js +31 -0
  478. package/dist/services/repair-receipt.js +13 -0
  479. package/dist/services/review-copy.js +165 -0
  480. package/dist/services/review-deferral.js +23 -0
  481. package/dist/services/run-control-receipt.js +56 -0
  482. package/dist/services/run-control-worker.js +428 -0
  483. package/dist/services/run-control.js +1092 -0
  484. package/dist/services/run-controller-adapter.js +400 -0
  485. package/dist/services/run-controller-capture.js +186 -0
  486. package/dist/services/run-controller-process.js +205 -0
  487. package/dist/services/run-controller-recovery.js +295 -0
  488. package/dist/services/run-controller-state.js +97 -0
  489. package/dist/services/run-controller.js +1395 -0
  490. package/dist/services/run-engine-bindings.js +1 -1
  491. package/dist/services/run-fork.js +147 -0
  492. package/dist/services/run-health.js +149 -0
  493. package/dist/services/run-observations.js +152 -0
  494. package/dist/services/run-projection.js +22 -64
  495. package/dist/services/run-recovery-guard.js +107 -0
  496. package/dist/services/run-recovery-runtime.js +112 -0
  497. package/dist/services/run-recovery.js +456 -0
  498. package/dist/services/run-start-custody.js +189 -0
  499. package/dist/services/runs.js +1023 -246
  500. package/dist/services/runtime-budget.js +446 -0
  501. package/dist/services/runtime-command.js +43 -0
  502. package/dist/services/runtime-scope-capture.js +52 -0
  503. package/dist/services/runtime-scope-control.js +468 -0
  504. package/dist/services/runtime-scope-resume.js +605 -0
  505. package/dist/services/runtime-scope-stop.js +211 -0
  506. package/dist/services/runtime-scope-worker.js +314 -0
  507. package/dist/services/runtime-service.js +19 -14
  508. package/dist/services/schema-validation.js +10 -8
  509. package/dist/services/scope-writer-cleanup.js +27 -0
  510. package/dist/services/sessions.js +36 -91
  511. package/dist/services/setup.js +427 -0
  512. package/dist/services/stage-blocker.js +17 -7
  513. package/dist/services/stage-context.js +240 -18
  514. package/dist/services/stage-handlers.js +89 -0
  515. package/dist/services/stage-lifecycle.js +152 -116
  516. package/dist/services/stage-pause.js +202 -91
  517. package/dist/services/stage-report-renderer.js +234 -6
  518. package/dist/services/stage-work-graph.js +52 -0
  519. package/dist/services/tooling.js +41 -30
  520. package/dist/services/usage.js +49 -101
  521. package/dist/services/verification-matrix.js +393 -0
  522. package/dist/services/version-status.js +1 -1
  523. package/dist/services/vnext-code-review.js +235 -88
  524. package/dist/services/vnext-code.js +327 -226
  525. package/dist/services/vnext-contracts.js +10 -1
  526. package/dist/services/vnext-execution-profile.js +80 -5
  527. package/dist/services/vnext-fanout.js +355 -21
  528. package/dist/services/vnext-merge.js +332 -111
  529. package/dist/services/vnext-plan-review.js +287 -132
  530. package/dist/services/vnext-plan.js +228 -104
  531. package/dist/services/vnext-protocolize.js +533 -95
  532. package/dist/services/vnext-specify.js +123 -81
  533. package/dist/services/vnext-workspace-policy.js +7 -2
  534. package/dist/services/work-registry.js +1706 -200
  535. package/dist/services/workspace-bootstrap.js +53 -15
  536. package/dist/services/workspace-files.js +85 -0
  537. package/dist/services/worktrees.js +105 -48
  538. package/dist/shared/entity-references.js +1 -0
  539. package/dist/shared/errors.js +27 -0
  540. package/dist/storage/agent-output.js +26 -0
  541. package/dist/storage/data-preservation.js +65 -0
  542. package/dist/storage/database.js +930 -40
  543. package/dist/storage/foreign-key-transaction.js +39 -0
  544. package/dist/storage/immutable-input.js +45 -0
  545. package/dist/storage/import-guard.js +159 -0
  546. package/dist/storage/memory-upgrade-schema-bootstrap.js +38 -0
  547. package/dist/storage/native-cleanup.js +52 -0
  548. package/dist/storage/paired-writer-migration.js +424 -0
  549. package/dist/storage/paths.js +17 -4
  550. package/dist/storage/projection-lock.js +73 -0
  551. package/dist/storage/work-references.js +23 -0
  552. package/dist/storage/writer-contract.js +96 -0
  553. package/dist/storage/writer-migration.js +346 -0
  554. package/dist/storage/writer-restore.js +217 -0
  555. package/dist/verification-components.json +299 -0
  556. package/package.json +51 -13
  557. package/tools/create-canon-release.mjs +33 -0
  558. package/tools/probe-codex-history.mjs +37 -0
  559. package/tools/produce-hybrid-release.mjs +41 -0
  560. package/tools/repair-paused-run-status.mjs +84 -0
@@ -2,22 +2,26 @@ import crypto from "node:crypto";
2
2
  import fs from "node:fs";
3
3
  import path from "node:path";
4
4
  import { spawnSync } from "node:child_process";
5
+ import { commandResult } from '../harness-runtime/lib/process-json.mjs';
6
+ import { SETUP_STARTUP_MS } from '../harness-runtime/lib/setup-progress.mjs';
5
7
  import { requireProjectByRoot } from "./projects.js";
6
8
  import { appendAudit } from "./audit.js";
7
9
  import { persistProtocolState, requireProtocol, readProtocolRuntimeState } from "./protocols.js";
8
- import { attachFlowRunStage, completeFlowRunStage, getFlowRunStatus, startFlowRun } from "./runs.js";
10
+ import { attachFlowRunStage, prepareFlowRunStart, prepareFlowRunStageAttachment, prepareStageDirectory, completeFlowRunStage, getFlowRunStatus, startFlowRun } from "./runs.js";
9
11
  import { validateSchema } from "./schema-validation.js";
10
12
  import { reconcileSessionCoverage, registerFlowSession } from "./sessions.js";
11
13
  import { usageForRun } from "./usage.js";
12
- import { boundCanonicalPlan } from "./plan-runtime.js";
13
- import { AppError } from "../shared/errors.js";
14
- import { planJsonPath, resolveProjectRoot } from "../storage/paths.js";
14
+ import { boundCanonicalPlan, prepareCanonicalPlan } from "./plan-runtime.js";
15
+ import { prepareJsonFile, prepareJsonSchema, prepareOutputDirectory, prepareOutputFile, prepareTextFile } from "../cli/input-preparation.js";
16
+ import { AppError, errorRecord, processEvidence, diagnosticJson } from "../shared/errors.js";
17
+ import { planJsonPath, projectHome, resolveProjectRoot } from "../storage/paths.js";
15
18
  import { resolveCanonRoot } from "./canon.js";
16
19
  import { preflightMemoryPermissions } from "./memory-permissions.js";
17
20
  import { registerProject } from "./projects.js";
18
21
  import { registerProtocol } from "./protocols.js";
19
22
  import { previewNextEntityId } from "./ids.js";
20
23
  import { hookSessionIdentity, sessionIdForHookEvent } from "./hooks.js";
24
+ import { assertRunMutationAllowed } from "./run-recovery.js";
21
25
  const stagePromptSections = [
22
26
  "stage_identity",
23
27
  "authoritative_runtime_facts",
@@ -28,63 +32,30 @@ const stagePromptSections = [
28
32
  "work_contract",
29
33
  "completion_contract"
30
34
  ];
31
- function bootstrapStageRun(context, projectRoot, input) {
32
- if (input.stage !== "specify") {
33
- throw new AppError("validation", "--bootstrap currently starts the initial specify stage only", 2, { stage: input.stage });
34
- }
35
- const subject = input.bootstrap?.subject.trim();
36
- if (!subject)
37
- throw new AppError("usage", "--bootstrap requires --subject", 2);
35
+ function bootstrapStageRun(context, projectRoot, bootstrap, intakeMarkdown) {
38
36
  registerProject(context, { root: projectRoot });
39
- const preview = previewNextEntityId(context, { projectRoot, type: "protocol", slug: subject });
40
- const protocolId = preview.entity.id;
41
- registerProtocol(context, { handshakeId: protocolId, projectRoot });
42
- const started = startFlowRun(context, {
43
- projectRoot,
44
- flowKind: "mb_sdlc",
45
- subjectType: "protocol",
46
- subjectId: protocolId,
47
- slug: subject,
48
- nextAction: "run_specify"
49
- });
50
- const intakeFile = input.bootstrap?.intakeFile;
51
- if (intakeFile) {
52
- const source = path.resolve(intakeFile);
53
- if (!fs.existsSync(source) || !fs.statSync(source).isFile()) {
54
- throw new AppError("not_found", "--intake-file must point to an existing file", 1, { intake_file: intakeFile });
55
- }
37
+ registerProtocol(context, { handshakeId: bootstrap.protocolId, projectRoot });
38
+ const started = startFlowRun(context, bootstrap.startInput, bootstrap.start);
39
+ if (intakeMarkdown !== undefined) {
56
40
  if (!started.run.run_root)
57
41
  throw new AppError("runtime_missing", "New RUN has no artifact root", 1, { run_id: started.run.id });
58
42
  const intakeDir = path.join(started.run.run_root, "intake");
59
43
  fs.mkdirSync(intakeDir, { recursive: true });
60
- fs.copyFileSync(source, path.join(intakeDir, "user-request.md"));
44
+ fs.writeFileSync(path.join(intakeDir, "user-request.md"), intakeMarkdown);
61
45
  }
62
46
  return started.run.id;
63
47
  }
64
- function stagePreflight(projectRoot, stageRoot) {
48
+ function stagePreflight(projectRoot) {
65
49
  const memoryBank = preflightMemoryPermissions({
66
50
  root: projectRoot,
67
51
  memoryBank: ".memory-bank",
68
52
  flow: "custom",
69
- mode: "write",
53
+ mode: "read",
70
54
  targets: [{ path: ".memory-bank", mode: "read" }]
71
55
  });
72
- const probe = path.join(stageRoot, `.dd-flow-permission-${crypto.randomUUID()}`);
73
- try {
74
- fs.writeFileSync(probe, "");
75
- fs.renameSync(probe, `${probe}.renamed`);
76
- fs.rmSync(`${probe}.renamed`);
77
- return { ...memoryBank, ok: memoryBank.ok === true, stage_workspace: { path: stageRoot, status: "passed" } };
78
- }
79
- catch (error) {
80
- for (const candidate of [probe, `${probe}.renamed`]) {
81
- try {
82
- fs.rmSync(candidate, { force: true });
83
- }
84
- catch { /* best effort */ }
85
- }
86
- return { ...memoryBank, ok: false, stage_workspace: { path: stageRoot, status: "failed", message: String(error) } };
87
- }
56
+ if (memoryBank.ok !== true)
57
+ throw new AppError("permission_preflight_failed", "Stage project context is not readable", 1, { preflight: memoryBank });
58
+ return memoryBank;
88
59
  }
89
60
  function flowKindForStage(stage) {
90
61
  return ["code", "implementation", "readiness", "merge"].includes(stage) ? "implementation" : "planning";
@@ -103,23 +74,57 @@ function runtimeFacts(view, projectRoot) {
103
74
  git: view.index.execution?.git ?? { branch: null, head: null, status: "unavailable" }
104
75
  };
105
76
  }
106
- export function startStage(context, input) {
77
+ export function prepareLegacyStageStart(context, input, intakeMarkdown) {
78
+ if (input.bootstrap && input.stage !== "specify")
79
+ throw new AppError("validation", "--bootstrap currently starts the initial specify stage only", 2);
80
+ if (input.bootstrap && !input.bootstrap.subject?.trim())
81
+ throw new AppError("usage", "--bootstrap requires --subject", 2);
82
+ if (!input.bootstrap && !input.runId)
83
+ throw new AppError("usage", "stage start requires a RUN id or --bootstrap", 2);
84
+ if (input.dir !== undefined)
85
+ prepareStageDirectory(input.dir);
86
+ const intake = intakeMarkdown ?? (input.bootstrap?.intakeFile ? prepareTextFile(input.bootstrap.intakeFile, "SPECIFY intake").text : undefined);
87
+ const projectRoot = resolveProjectRoot(input.projectRoot);
88
+ const retained = !input.bootstrap && input.runId ? runView(getFlowRunStatus(context, { projectRoot, runId: input.runId })) : null;
89
+ const dir = input.dir ?? defaultStageDir(input.stage, retained?.run.flow_kind ?? "mb_sdlc");
90
+ if (retained) {
91
+ prepareFlowRunStageAttachment(context, { projectRoot, runId: retained.run.id, stage: input.stage, dir, status: "running", dataSchemaId: dataSchemaForStage(input.stage) });
92
+ const root = path.join(runHomePath(retained.run), dir);
93
+ for (const name of ["stage-prompt.md", "stage-prompt.json", "stage-start.json", "stage-input.json"])
94
+ prepareOutputFile(path.join(root, name));
95
+ if (retained.run.subject.type === "protocol")
96
+ readProtocolRuntimeState(context, requireProtocol(context, retained.run.subject.id, retained.run.project_id));
97
+ }
98
+ const preflight = stagePreflight(projectRoot);
99
+ const sources = stageInstructionSources(context, projectRoot, retained?.run.flow_kind ?? "mb_sdlc", input.stage).map(source => ({ ...source, text: fs.existsSync(source.absolute) ? fs.readFileSync(source.absolute, "utf8").trim() : "(unavailable)" }));
100
+ let bootstrap;
101
+ if (input.bootstrap) {
102
+ const project = context.db.get("SELECT id FROM projects WHERE root = ?", [projectRoot]);
103
+ prepareOutputDirectory(project ? projectHome(context.ddFlowHome, project.id) : path.join(context.ddFlowHome, "projects"));
104
+ const preview = previewNextEntityId(context, { projectRoot, type: "protocol", slug: input.bootstrap.subject });
105
+ const startInput = { projectRoot, flowKind: "mb_sdlc", subjectType: "protocol", subjectId: preview.entity.id, slug: input.bootstrap.subject, nextAction: "run_specify" };
106
+ bootstrap = { protocolId: preview.entity.id, startInput, start: prepareFlowRunStart(context, startInput) };
107
+ }
108
+ return { intakeMarkdown: intake, projectRoot, retained, dir, preflight, sources, bootstrap };
109
+ }
110
+ export function startStage(context, input, prepared = prepareLegacyStageStart(context, input)) {
107
111
  if (input.requireSessionBinding && !input.hookEventId) {
108
112
  throw new AppError("trusted_session_binding_required", "This stage requires a trusted harness lifecycle binding; run it from a controlled Session with the dd-flow adapter enabled", 1);
109
113
  }
110
- const projectRoot = resolveProjectRoot(input.projectRoot);
114
+ const { projectRoot, retained, dir, preflight, sources } = prepared;
115
+ if (retained)
116
+ prepareFlowRunStageAttachment(context, { projectRoot, runId: retained.run.id, stage: input.stage, dir: input.dir ?? defaultStageDir(input.stage, retained.run.flow_kind), status: "running", dataSchemaId: dataSchemaForStage(input.stage) });
111
117
  let requiredSessionId = null;
112
118
  let requiredIdentity = null;
113
119
  if (input.requireSessionBinding) {
114
- registerProject(context, { root: projectRoot });
115
120
  requiredIdentity = hookSessionIdentity(context, requireProjectByRoot(context, projectRoot).id, input.hookEventId);
116
121
  requiredSessionId = requiredIdentity.sessionId;
117
122
  }
118
- const runId = input.bootstrap ? bootstrapStageRun(context, projectRoot, input) : input.runId;
123
+ const runId = prepared.bootstrap ? bootstrapStageRun(context, projectRoot, prepared.bootstrap, prepared.intakeMarkdown) : input.runId;
119
124
  if (!runId)
120
125
  throw new AppError("usage", "stage start requires a RUN id or --bootstrap", 2);
121
- const before = runView(getFlowRunStatus(context, { projectRoot, runId }));
122
- const dir = input.dir ?? defaultStageDir(input.stage, before.run.flow_kind);
126
+ const before = retained ?? runView(getFlowRunStatus(context, { projectRoot, runId }));
127
+ assertRunMutationAllowed(context, before.run.project_id, before.run.id);
123
128
  const attached = runView(attachFlowRunStage(context, {
124
129
  projectRoot,
125
130
  runId,
@@ -132,9 +137,6 @@ export function startStage(context, input) {
132
137
  const stageRoot = path.join(runHome, dir);
133
138
  ensureWithin(runHome, stageRoot, "stage root");
134
139
  fs.mkdirSync(stageRoot, { recursive: true });
135
- const preflight = stagePreflight(projectRoot, stageRoot);
136
- if (preflight.ok !== true)
137
- throw new AppError("permission_preflight_failed", "Stage workspace is not writable", 1, { preflight });
138
140
  if (attached.run.subject.type === "protocol") {
139
141
  syncProtocolLifecycle(context, attached.run.project_id, attached.run.subject.id, input.stage, "running");
140
142
  }
@@ -142,7 +144,7 @@ export function startStage(context, input) {
142
144
  if (sessionId) {
143
145
  const identity = requiredIdentity ?? (input.hookEventId ? hookSessionIdentity(context, attached.run.project_id, input.hookEventId) : null);
144
146
  registerFlowSession(context, {
145
- sessionId,
147
+ hookEventId: input.hookEventId,
146
148
  payloadJson: JSON.stringify({
147
149
  project_root: projectRoot,
148
150
  harness: identity?.harness ?? "codex-desktop",
@@ -162,12 +164,12 @@ export function startStage(context, input) {
162
164
  continuation_policy: "go_router",
163
165
  session_kind: "orchestrator",
164
166
  current_stage: input.stage,
165
- cwd: attached.run.workspace_root
167
+ cwd: identity?.cwd ?? null
166
168
  })
167
169
  });
168
170
  }
169
171
  const promptPath = path.join(stageRoot, "stage-prompt.md");
170
- const prompt = composeStagePrompt(context, projectRoot, before, attached, input.stage, dir, preflight);
172
+ const prompt = composeStagePrompt(context, projectRoot, before, attached, input.stage, dir, preflight, sources);
171
173
  atomicWrite(promptPath, prompt);
172
174
  const semanticInputPath = path.join(stageRoot, "stage-input.json");
173
175
  if (!fs.existsSync(semanticInputPath)) {
@@ -178,7 +180,6 @@ export function startStage(context, input) {
178
180
  const aspectMapPath = path.join(stageRoot, "aspect-map.json");
179
181
  const attempt = attached.index.stage_runs?.find((stage) => stage.stage === input.stage)?.attempt ?? "try-001";
180
182
  const attemptNumber = Number(attempt.replace("try-", "")) || 1;
181
- const sources = stageInstructionSources(context, projectRoot, attached.run.flow_kind, input.stage);
182
183
  atomicWrite(promptDataPath, {
183
184
  schema_id: "dd-flow/stage-prompt@2",
184
185
  run_id: attached.run.id,
@@ -257,12 +258,13 @@ export function startStage(context, input) {
257
258
  lifecycle: "stage start -> semantic work -> stage finish"
258
259
  };
259
260
  }
260
- export function finishStage(context, input) {
261
+ export function prepareStageFinish(context, input) {
261
262
  const projectRoot = resolveProjectRoot(input.projectRoot);
262
263
  if (!input.runId)
263
264
  throw new AppError("usage", "stage finish requires a RUN id", 2);
264
265
  const runId = input.runId;
265
266
  const view = runView(getFlowRunStatus(context, { projectRoot, runId }));
267
+ assertRunMutationAllowed(context, view.run.project_id, view.run.id);
266
268
  const existing = view.index.stage_runs?.find((stage) => stage.stage === input.stage);
267
269
  if (!existing) {
268
270
  throw new AppError("not_found", `Run stage is not attached: ${input.stage}`, 1, { run_id: view.run.id, stage: input.stage });
@@ -271,31 +273,37 @@ export function finishStage(context, input) {
271
273
  const runHome = runHomePath(view.run);
272
274
  const stageRoot = path.join(runHome, dir);
273
275
  ensureWithin(runHome, stageRoot, "stage root");
274
- fs.mkdirSync(stageRoot, { recursive: true });
275
276
  const semanticFile = resolveStageFile(input.semanticFile ?? "@stage/stage-input.json", stageRoot, runHome);
276
- const receipt = beginFinishReceipt(context, stageRoot, semanticFile, view.run.id, input.stage);
277
+ ensureWithin(runHome, semanticFile, "semantic file");
278
+ const source = prepareJsonSchema(semanticFile, "Stage finish input", { schemaName: "stage-finish-input", projectRoot, runId, runRoot: runHome, ddFlowHome: context.ddFlowHome });
279
+ const semantic = source.value;
280
+ const status = stringValue(semantic.status) ?? "done";
281
+ if (!["done", "waiting_for_user", "blocked", "failed"].includes(status)) {
282
+ throw new AppError("validation", "Stage finish status must be done, waiting_for_user, blocked, or failed", 2, { status });
283
+ }
284
+ validateStageOutcome(input.stage, status, semantic);
285
+ const planFinish = input.stage === "plan" ? preparePlanFinish(context, projectRoot, view, stageRoot) : undefined;
286
+ return { projectRoot, runId, view, existing, runHome, stageRoot, semanticFile, semantic, status, source, planFinish };
287
+ }
288
+ export async function finishStage(context, input, prepared = prepareStageFinish(context, input)) {
289
+ const { projectRoot, runId, view, runHome, stageRoot, semanticFile, semantic, status, source, planFinish } = prepared;
290
+ assertRunMutationAllowed(context, view.run.project_id, view.run.id);
291
+ fs.mkdirSync(stageRoot, { recursive: true });
292
+ const receipt = beginFinishReceipt(context, stageRoot, semanticFile, view.run.id, input.stage, source.text);
277
293
  try {
278
- validateSchema({ schemaName: "stage-finish-input", file: semanticFile, projectRoot, runId, runRoot: runHome, ddFlowHome: context.ddFlowHome });
279
- const semantic = readSemanticFile(semanticFile, runHome);
280
- const status = stringValue(semantic.status) ?? "done";
281
- if (!["done", "waiting_for_user", "blocked", "failed"].includes(status)) {
282
- throw new AppError("validation", "Stage finish status must be done, waiting_for_user, blocked, or failed", 2, { status });
283
- }
284
- validateStageOutcome(input.stage, status, semantic);
285
294
  const coverage = workerCoverage(context, view.run.project_id, view.run.id);
286
295
  if (coverage.jobs.missing?.length) {
287
296
  throw new AppError("worker_jobs_incomplete", "Stage finish requires all declared worker jobs", 1, { coverage });
288
297
  }
289
- const lint = runTargetedMemoryBankLint(projectRoot);
290
- const planFinish = input.stage === "plan"
291
- ? preparePlanFinish(context, projectRoot, view, stageRoot)
292
- : undefined;
298
+ const lint = await runTargetedMemoryBankLint(projectRoot, undefined, path.join(stageRoot, "diagnostics"));
299
+ if (planFinish)
300
+ boundCanonicalPlan(context, { projectId: view.run.project_id, protocolId: view.run.subject.id, planPath: planFinish.plan_path }, planFinish.canonical);
293
301
  const report = buildStageReport(context, view, input.stage, status, semantic, stageRoot, lint, planFinish);
294
302
  const dataPath = path.join(stageRoot, "stage-report.json");
295
303
  const reportPath = path.join(stageRoot, "stage-report.md");
296
304
  const htmlPath = path.join(stageRoot, "stage-report.html");
305
+ validateSchema({ schemaName: stageReportSchemaName(input.stage, planFinish), file: dataPath, data: report, projectRoot, runId, runRoot: runHome, ddFlowHome: context.ddFlowHome });
297
306
  atomicWrite(dataPath, report);
298
- validateSchema({ schemaName: stageReportSchemaName(input.stage, planFinish), file: dataPath, projectRoot, runId, runRoot: runHome, ddFlowHome: context.ddFlowHome });
299
307
  atomicWrite(reportPath, renderMarkdown(report));
300
308
  atomicWrite(htmlPath, renderHtml(projectRoot, report));
301
309
  if (view.run.subject.type === "protocol") {
@@ -480,12 +488,10 @@ function semanticInputTemplate(stage) {
480
488
  next_action: waiting ? "waiting_for_user: obtain the clarification packet" : "Continue to the next approved stage."
481
489
  };
482
490
  }
483
- function composeStagePrompt(context, projectRoot, before, current, stage, dir, preflight) {
491
+ function composeStagePrompt(context, projectRoot, before, current, stage, dir, preflight, sources) {
484
492
  const project = requireProjectByRoot(context, projectRoot);
485
493
  const runHome = runHomePath(current.run);
486
- const instructions = stageInstructionSources(context, projectRoot, current.run.flow_kind, stage).map(({ label, absolute }) => {
487
- return fs.existsSync(absolute) ? `### ${label}\n\n${fs.readFileSync(absolute, "utf8").trim()}` : `### ${label}\n\n(unavailable)`;
488
- }).join("\n\n");
494
+ const instructions = sources.map(({ label, text }) => `### ${label}\n\n${text}`).join("\n\n");
489
495
  const protocol = safeProtocolState(context, current.run.project_id, current.run.subject.id);
490
496
  return [
491
497
  "<stage_identity>",
@@ -508,7 +514,7 @@ function composeStagePrompt(context, projectRoot, before, current, stage, dir, p
508
514
  "</authoritative_runtime_facts>",
509
515
  "",
510
516
  "<preflight>",
511
- `- Permission probe: ${String(preflight.ok === true ? "passed" : "failed")}.`,
517
+ `- Read-only permission check: ${String(preflight.ok === true ? "passed" : "failed")}.`,
512
518
  "- CLI compatibility was checked before this state-changing command.",
513
519
  "</preflight>",
514
520
  "",
@@ -581,16 +587,6 @@ function safeProtocolState(context, projectId, protocolId) {
581
587
  return undefined;
582
588
  }
583
589
  }
584
- function readSemanticFile(file, runHome) {
585
- const resolved = path.resolve(file);
586
- ensureWithin(runHome, resolved, "semantic file");
587
- if (!fs.existsSync(resolved))
588
- throw new AppError("not_found", "Semantic input file is missing", 1, { path: file });
589
- const value = JSON.parse(fs.readFileSync(resolved, "utf8"));
590
- if (!value || typeof value !== "object" || Array.isArray(value))
591
- throw new AppError("validation", "Semantic input must be a JSON object", 2);
592
- return value;
593
- }
594
590
  function validateStageOutcome(stage, status, semantic) {
595
591
  if (stage !== "specify")
596
592
  return;
@@ -602,17 +598,12 @@ function validateStageOutcome(stage, status, semantic) {
602
598
  throw new AppError("semantic_status_inconsistent", "SPECIFY done cannot contain unresolved structured questions", 2);
603
599
  }
604
600
  }
605
- function beginFinishReceipt(context, stageRoot, semanticFile, runId, stage) {
601
+ function beginFinishReceipt(context, stageRoot, semanticFile, runId, stage, raw) {
606
602
  const receiptDir = path.join(stageRoot, "finish-receipts");
607
603
  fs.mkdirSync(receiptDir, { recursive: true });
608
604
  const number = fs.readdirSync(receiptDir).filter((file) => /^\d{3}\.json$/u.test(file)).length + 1;
609
605
  const receiptPath = path.join(receiptDir, `${String(number).padStart(3, "0")}.json`);
610
- let raw = null;
611
- try {
612
- raw = fs.readFileSync(semanticFile, "utf8");
613
- }
614
- catch { /* receipt records the missing input below */ }
615
- const semanticSha = raw === null ? null : crypto.createHash("sha256").update(raw).digest("hex");
606
+ const semanticSha = crypto.createHash("sha256").update(raw).digest("hex");
616
607
  atomicWrite(receiptPath, {
617
608
  schema_id: "dd-flow/stage-finish-receipt@1",
618
609
  run_id: runId,
@@ -750,7 +741,8 @@ function buildStageReport(context, view, stage, status, semantic, stageRoot, lin
750
741
  next_action: stringValue(semantic.next_action) ?? "Resolve the stage result before continuing.",
751
742
  ...(Array.isArray(semantic.questions) ? { questions: semantic.questions } : {}),
752
743
  ...(Array.isArray(semantic.reviewer_findings) ? { reviewer_findings: semantic.reviewer_findings } : {}),
753
- ...(Array.isArray(semantic.def_outcomes) ? { def_outcomes: semantic.def_outcomes } : {})
744
+ ...(Array.isArray(semantic.def_outcomes) ? { def_outcomes: semantic.def_outcomes } : {}),
745
+ ...(semantic.materialization !== undefined ? { materialization: semantic.materialization } : {})
754
746
  },
755
747
  mechanical: {
756
748
  started_at: startedAt,
@@ -775,17 +767,13 @@ function buildStageReport(context, view, stage, status, semantic, stageRoot, lin
775
767
  }
776
768
  function preparePlanFinish(context, projectRoot, view, stageRoot) {
777
769
  const planPath = planJsonPath(projectRoot, view.run.subject.id);
778
- const canonical = boundCanonicalPlan(context, {
770
+ const canonical = prepareCanonicalPlan(context, {
779
771
  projectId: view.run.project_id,
780
772
  protocolId: view.run.subject.id,
781
773
  planPath
782
774
  });
783
775
  const aspectMapPath = path.join(stageRoot, "aspect-map.json");
784
- if (!fs.existsSync(aspectMapPath)) {
785
- throw new AppError("not_found", "PLAN aspect-map.json is missing", 1, { path: aspectMapPath });
786
- }
787
- const raw = fs.readFileSync(aspectMapPath, "utf8");
788
- const value = JSON.parse(raw);
776
+ const { text: raw, value } = prepareJsonFile(aspectMapPath, "PLAN aspect map");
789
777
  if (!value || typeof value !== "object" || Array.isArray(value)) {
790
778
  throw new AppError("validation", "PLAN aspect-map.json must be a JSON object", 2, { path: aspectMapPath });
791
779
  }
@@ -848,7 +836,7 @@ function workerCoverage(context, projectId, runId) {
848
836
  jobs: { expected: jobs.map((job) => job.job_id), missing: missingJobs }
849
837
  };
850
838
  }
851
- export function runTargetedMemoryBankLint(projectRoot, selectedFiles) {
839
+ export async function runTargetedMemoryBankLint(projectRoot, selectedFiles, diagnosticRoot) {
852
840
  const files = [...new Set((selectedFiles ?? gitChangedFiles(projectRoot)).filter((file) => file.startsWith(".memory-bank/") && file.toLowerCase().endsWith(".md") && !file.split(/[\\/]/u).some((part) => part === ".." || part.startsWith(".env"))))];
853
841
  for (const file of files)
854
842
  ensureWithin(projectRoot, path.resolve(projectRoot, file), "lint target");
@@ -856,23 +844,71 @@ export function runTargetedMemoryBankLint(projectRoot, selectedFiles) {
856
844
  return { ok: true, status: "not_applicable_no_changed_docs", files, finding_count: 0 };
857
845
  }
858
846
  const binary = process.env.MB_LINT_BIN ?? "mb-lint";
859
- const result = spawnSync(binary, ["--root", projectRoot, "--files", ...files, "--format", "json"], { cwd: projectRoot, encoding: "utf8" });
860
- if (result.error || result.status === null) {
861
- throw new AppError("lint_gate_unavailable", "Selected-file mb-lint is unavailable", 1, { binary, files, cause: String(result.error ?? "process did not start") });
847
+ const fail = (code, message, details) => {
848
+ const error = new AppError(code, message, 1, { binary, files, ...details });
849
+ if (diagnosticRoot) {
850
+ try {
851
+ fs.mkdirSync(diagnosticRoot, { recursive: true });
852
+ const file = path.join(diagnosticRoot, `lint-${crypto.randomUUID()}.json`);
853
+ if (details.report) {
854
+ const reportFile = file.replace(/\.json$/, ".report.json"), report = diagnosticJson(details.report);
855
+ const reportBytes = Buffer.from(report);
856
+ fs.writeFileSync(reportFile, reportBytes.length <= 1024 * 1024 ? report : JSON.stringify({ truncated: true, bytes: reportBytes.length, excerpt: reportBytes.subarray(0, 128 * 1024).toString("utf8") }), { flag: "wx", mode: 0o600 });
857
+ error.details.report_path = reportFile;
858
+ }
859
+ delete error.details.report;
860
+ fs.writeFileSync(file, diagnosticJson(errorRecord(error)), { flag: "wx", mode: 0o600 });
861
+ error.details.diagnostic_path = file;
862
+ }
863
+ catch (capture) {
864
+ delete error.details.report;
865
+ error.details.capture_error = errorRecord(capture);
866
+ }
867
+ }
868
+ delete error.details.report;
869
+ throw error;
870
+ };
871
+ let result;
872
+ try {
873
+ result = await commandResult(binary, ["--root", projectRoot, "--files", ...files, "--format", "json"], { cwd: projectRoot, startupMs: SETUP_STARTUP_MS });
862
874
  }
863
- let parsed = {};
875
+ catch (cause) {
876
+ const recorded = errorRecord(cause), unavailable = ["ENOENT", "EACCES", "ENOEXEC"].includes(recorded.code);
877
+ fail(unavailable ? "lint_gate_unavailable" : "lint_gate_tool_failed", "Selected-file mb-lint could not execute", { cause: recorded });
878
+ }
879
+ const evidence = processEvidence(result);
880
+ if (result.signal || result.exit_code !== 0 && result.exit_code !== 1)
881
+ fail("lint_gate_tool_failed", "Selected-file mb-lint did not complete normally", { process: evidence });
882
+ let parsed;
864
883
  try {
865
- parsed = result.stdout ? JSON.parse(result.stdout) : {};
884
+ parsed = JSON.parse(result.stdout);
866
885
  }
867
886
  catch {
868
- throw new AppError("lint_gate_invalid_output", "Selected-file mb-lint did not return JSON", 1, { binary, files });
887
+ fail(result.exit_code === 0 ? "lint_gate_invalid_output" : "lint_gate_tool_failed", "Selected-file mb-lint did not return a report", { process: evidence });
869
888
  }
870
- if (result.status !== 0) {
871
- throw new AppError("lint_gate_failed", "Selected-file mb-lint reported blocking findings", 1, { binary, files, result: parsed });
889
+ const report = parsed;
890
+ const severities = { error: "errors", warning: "warnings", info: "info", suggestion: "suggestions" };
891
+ const matchingRoot = () => { try {
892
+ return typeof report?.root === "string" && fs.realpathSync(path.resolve(projectRoot, report.root)) === fs.realpathSync(projectRoot);
872
893
  }
873
- const findingCount = parsed && typeof parsed === "object" && Array.isArray(parsed.findings)
874
- ? parsed.findings.length
875
- : 0;
894
+ catch {
895
+ return false;
896
+ } };
897
+ const valid = report && report.tool === "mb-lint" && typeof report.version === "string" && report.version.trim()
898
+ && matchingRoot()
899
+ && report.memoryBank === ".memory-bank" && report.summary && Array.isArray(report.findings)
900
+ && report.findings.every(finding => finding && typeof finding === "object" && typeof finding.severity === "string" && Object.hasOwn(severities, finding.severity)
901
+ && [finding.ruleId, finding.file, finding.message].every(value => typeof value === "string" && value.trim()))
902
+ && Object.entries(severities).every(([severity, key]) => Number.isSafeInteger(report.summary[key]) && Number(report.summary[key]) >= 0
903
+ && report.summary[key] === report.findings.filter(finding => finding.severity === severity).length);
904
+ if (!valid)
905
+ fail(result.exit_code === 0 ? "lint_gate_invalid_output" : "lint_gate_tool_failed", "Selected-file mb-lint returned an invalid report", { process: evidence });
906
+ const errors = Number(report.summary.errors);
907
+ if ((errors > 0 ? 1 : 0) !== result.exit_code)
908
+ fail("lint_gate_invalid_output", "Selected-file mb-lint report contradicts its exit status", { process: evidence });
909
+ if (errors > 0)
910
+ fail("lint_gate_failed", "Selected-file mb-lint reported blocking findings", { process: evidence, report: parsed, summary: report.summary, finding_count: report.findings.length });
911
+ const findingCount = report.findings.length;
876
912
  return { ok: true, status: "passed", binary, files, finding_count: findingCount, result: parsed };
877
913
  }
878
914
  function renderMarkdown(report) {