akm-cli 0.9.0-rc.8 → 0.9.0

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 (450) hide show
  1. package/CHANGELOG.md +1063 -44
  2. package/README.md +51 -25
  3. package/SECURITY.md +14 -1
  4. package/STABILITY.md +497 -0
  5. package/dist/akm +148 -35
  6. package/dist/{akm-migrate-storage → akm-migrate} +6 -9
  7. package/dist/assets/hints/cli-hints-full.md +223 -95
  8. package/dist/assets/hints/cli-hints-short.md +85 -22
  9. package/dist/assets/improve-strategies/default.json +1 -1
  10. package/dist/assets/improve-strategies/reflect-distill.json +1 -1
  11. package/dist/assets/prompts/memory-infer-user.md +2 -3
  12. package/dist/assets/stash-skeleton/README.md +6 -5
  13. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +2 -0
  14. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +2 -0
  15. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +2 -0
  16. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +2 -0
  17. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +2 -0
  18. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +2 -0
  19. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +2 -0
  20. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +2 -0
  21. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +2 -0
  22. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +2 -0
  23. package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -0
  24. package/dist/assets/stash-skeleton/facts/conventions/organization.md +20 -9
  25. package/dist/assets/tasks/core/extract.yml +1 -1
  26. package/dist/assets/tasks/core/version-check.yml +1 -1
  27. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  28. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  29. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  30. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  31. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  32. package/dist/assets/templates/html/health.html +1 -3
  33. package/dist/assets/workflows/workflow-template.md +32 -15
  34. package/dist/cli/invocation.js +40 -15
  35. package/dist/cli/parse-args.js +0 -22
  36. package/dist/cli/retired-commands.js +121 -0
  37. package/dist/cli/shared.js +154 -22
  38. package/dist/cli/unknown-flags.js +236 -0
  39. package/dist/cli-node.mjs +2 -1
  40. package/dist/cli.js +696 -258
  41. package/dist/commands/agent/agent-dispatch.js +14 -3
  42. package/dist/commands/agent/contribute-cli.js +73 -88
  43. package/dist/commands/completions.js +79 -22
  44. package/dist/commands/config-cli.js +17 -150
  45. package/dist/commands/env/env-cli.js +59 -143
  46. package/dist/commands/env/env.js +12 -163
  47. package/dist/commands/env/marker-path.js +6 -0
  48. package/dist/commands/env/secret-cli.js +36 -66
  49. package/dist/commands/env/secret.js +24 -57
  50. package/dist/commands/feedback-cli.js +141 -87
  51. package/dist/commands/health/accept-rate.js +58 -0
  52. package/dist/commands/health/advisories.js +3 -4
  53. package/dist/commands/health/checks.js +85 -23
  54. package/dist/commands/health/html-report.js +7 -10
  55. package/dist/commands/health/improve-metrics.js +25 -83
  56. package/dist/commands/health/md-report.js +5 -9
  57. package/dist/commands/health/metrics.js +62 -20
  58. package/dist/commands/health/renderers.js +47 -0
  59. package/dist/commands/health/report-view-model.js +4 -5
  60. package/dist/commands/health/stash-exposure.js +1 -1
  61. package/dist/commands/health/surfaces.js +3 -48
  62. package/dist/commands/health/task-runs.js +3 -67
  63. package/dist/commands/health/types-improve.js +7 -0
  64. package/dist/commands/health.js +99 -28
  65. package/dist/commands/improve/anti-collapse.js +2 -2
  66. package/dist/commands/improve/autonomy-gate.js +68 -0
  67. package/dist/commands/improve/collapse-detector.js +41 -40
  68. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  69. package/dist/commands/improve/consolidate/merge.js +4 -0
  70. package/dist/commands/improve/consolidate.js +140 -1000
  71. package/dist/commands/improve/distill/promote-memory.js +12 -12
  72. package/dist/commands/improve/distill/quality-gate.js +6 -6
  73. package/dist/commands/improve/distill.js +58 -69
  74. package/dist/commands/improve/eligibility.js +105 -57
  75. package/dist/commands/improve/extract-cli.js +14 -133
  76. package/dist/commands/improve/improve-cli.js +98 -114
  77. package/dist/commands/improve/improve-result-file.js +1 -28
  78. package/dist/commands/improve/improve-strategies.js +8 -5
  79. package/dist/commands/improve/improve.js +128 -91
  80. package/dist/commands/improve/loop-stages.js +182 -20
  81. package/dist/commands/improve/memory/derived-ref.js +45 -43
  82. package/dist/commands/improve/memory/memory-belief.js +1 -1
  83. package/dist/commands/improve/memory/memory-contradiction-detect.js +4 -12
  84. package/dist/commands/improve/memory/memory-improve.js +6 -5
  85. package/dist/commands/improve/outcome-loop.js +22 -65
  86. package/dist/commands/improve/preparation.js +114 -123
  87. package/dist/commands/improve/proactive-maintenance.js +2 -5
  88. package/dist/commands/improve/reflect.js +56 -160
  89. package/dist/commands/improve/salience.js +11 -122
  90. package/dist/commands/improve/source-identity.js +10 -38
  91. package/dist/commands/lint/base-linter.js +20 -124
  92. package/dist/commands/lint/env-key-rules.js +31 -47
  93. package/dist/commands/lint/index.js +249 -43
  94. package/dist/commands/{events.js → log.js} +33 -38
  95. package/dist/commands/migrate-cli.js +92 -12
  96. package/dist/commands/migration-tool.js +46 -0
  97. package/dist/commands/observability-cli.js +70 -209
  98. package/dist/commands/proposal/drain.js +101 -29
  99. package/dist/commands/proposal/proposal-cli.js +76 -48
  100. package/dist/commands/proposal/proposal.js +54 -18
  101. package/dist/commands/proposal/propose-cli.js +88 -0
  102. package/dist/commands/proposal/propose.js +23 -15
  103. package/dist/commands/proposal/repository.js +701 -278
  104. package/dist/commands/proposal/validators/proposal-quality-validators.js +2 -8
  105. package/dist/commands/proposal/validators/proposal-validators.js +55 -7
  106. package/dist/commands/proposal/validators/proposals.js +4 -7
  107. package/dist/commands/read/curate.js +34 -53
  108. package/dist/commands/read/knowledge.js +150 -95
  109. package/dist/commands/read/registry-search.js +2 -2
  110. package/dist/commands/read/remember-cli.js +42 -15
  111. package/dist/commands/read/search-cli.js +180 -78
  112. package/dist/commands/read/search.js +58 -43
  113. package/dist/commands/read/show.js +197 -141
  114. package/dist/commands/registry-cli.js +12 -51
  115. package/dist/commands/remember.js +14 -57
  116. package/dist/commands/sources/add-cli.js +100 -31
  117. package/dist/commands/sources/bundle-cli.js +166 -0
  118. package/dist/commands/sources/bundle-config-ops.js +7 -2
  119. package/dist/commands/sources/info.js +18 -5
  120. package/dist/commands/sources/init.js +12 -12
  121. package/dist/commands/sources/installed-stashes.js +382 -98
  122. package/dist/commands/sources/schema-repair.js +3 -2
  123. package/dist/commands/sources/self-update.js +131 -38
  124. package/dist/commands/sources/source-add.js +72 -17
  125. package/dist/commands/sources/source-clone.js +129 -45
  126. package/dist/commands/sources/source-manage.js +43 -23
  127. package/dist/commands/sources/sources-cli.js +57 -208
  128. package/dist/commands/sources/stash-cli.js +46 -53
  129. package/dist/commands/tasks/tasks-cli.js +91 -97
  130. package/dist/commands/tasks/tasks.js +276 -421
  131. package/dist/commands/workflow-cli.js +175 -450
  132. package/dist/core/adapter/adapters/akm-adapter.js +47 -28
  133. package/dist/core/adapter/adapters/akm-lint.js +42 -27
  134. package/dist/core/adapter/adapters/akm-metadata.js +15 -44
  135. package/dist/core/adapter/adapters/akm-task-adapter.js +15 -13
  136. package/dist/core/adapter/adapters/akm-workflow-adapter.js +55 -71
  137. package/dist/core/adapter/adapters/dotenv-adapter.js +1 -1
  138. package/dist/core/adapter/adapters/generic-files-adapter.js +2 -0
  139. package/dist/core/adapter/adapters/index.js +6 -6
  140. package/dist/core/adapter/adapters/llm-wiki-adapter.js +14 -8
  141. package/dist/core/adapter/adapters/okf-adapter.js +187 -19
  142. package/dist/core/adapter/adapters/shared.js +3 -19
  143. package/dist/core/adapter/adapters/tool-dir-shared.js +8 -3
  144. package/dist/core/adapter/adapters/website-snapshot-adapter.js +1 -0
  145. package/dist/core/adapter/detect-adapter.js +17 -0
  146. package/dist/core/adapter/recognize-match.js +6 -4
  147. package/dist/core/adapter/validate-context.js +214 -0
  148. package/dist/core/asset/akm-markdown.js +63 -0
  149. package/dist/core/asset/asset-placement.js +20 -6
  150. package/dist/core/asset/asset-ref.js +11 -9
  151. package/dist/core/asset/frontmatter-lint.js +30 -0
  152. package/dist/core/asset/frontmatter.js +37 -9
  153. package/dist/core/asset/markdown.js +40 -51
  154. package/dist/core/asset/resolve-ref.js +89 -18
  155. package/dist/core/asset/stash-meta.js +1 -1
  156. package/dist/core/bundle-id.js +51 -0
  157. package/dist/core/common.js +152 -38
  158. package/dist/core/config/config-io.js +12 -1
  159. package/dist/core/config/config-schema.js +35 -8
  160. package/dist/core/config/config-sources.js +55 -11
  161. package/dist/core/config/config-walker.js +25 -9
  162. package/dist/core/config/config.js +9 -48
  163. package/dist/core/config/experimental.js +21 -0
  164. package/dist/core/config/schema/embedding.js +5 -1
  165. package/dist/core/config/schema/experimental.js +30 -0
  166. package/dist/core/config/schema/improve-processes.js +0 -6
  167. package/dist/core/config/schema/improve.js +21 -3
  168. package/dist/core/config/schema/index-config.js +8 -15
  169. package/dist/core/config/schema/output.js +4 -1
  170. package/dist/core/config/schema/setup.js +9 -18
  171. package/dist/core/config/schema/sources-bundles.js +49 -33
  172. package/dist/core/config/schema/workflow.js +3 -3
  173. package/dist/core/env-secret-ref.js +76 -46
  174. package/dist/core/errors.js +18 -12
  175. package/dist/core/events.js +46 -128
  176. package/dist/core/file-change.js +6 -5
  177. package/dist/core/fs-txn.js +83 -7
  178. package/dist/core/git-message.js +2 -2
  179. package/dist/core/improve-result.js +1 -100
  180. package/dist/core/lesson-lint.js +1 -17
  181. package/dist/core/logs-db.js +2 -1
  182. package/dist/core/migration-operation.js +16 -0
  183. package/dist/core/mutation-target.js +78 -0
  184. package/dist/core/parse.js +4 -1
  185. package/dist/core/paths.js +17 -20
  186. package/dist/core/recognition-util.js +12 -14
  187. package/dist/core/redaction.js +34 -0
  188. package/dist/core/standards/resolve-standards-context.js +2 -14
  189. package/dist/core/standards/resolve-stash-standards.js +2 -2
  190. package/dist/core/standards/resolve-type-conventions.js +2 -2
  191. package/dist/core/state/migrations.js +41 -18
  192. package/dist/core/state-db.js +5 -14
  193. package/dist/core/structured.js +1 -1
  194. package/dist/core/subprocess.js +6 -4
  195. package/dist/core/text-truncation.js +9 -5
  196. package/dist/core/type-presentation.js +3 -3
  197. package/dist/core/warn.js +0 -3
  198. package/dist/core/write-source.js +771 -95
  199. package/dist/indexer/bundle-identity-guard.js +3 -2
  200. package/dist/indexer/db/graph-db.js +0 -24
  201. package/dist/indexer/ensure-index.js +1 -0
  202. package/dist/indexer/graph/graph-boost.js +9 -34
  203. package/dist/indexer/graph/graph-extraction.js +8 -5
  204. package/dist/indexer/index-writer-lock.js +53 -17
  205. package/dist/indexer/index-written-assets.js +16 -22
  206. package/dist/indexer/indexer.js +497 -239
  207. package/dist/indexer/installations.js +14 -96
  208. package/dist/indexer/passes/dir-staleness.js +16 -9
  209. package/dist/indexer/passes/memory-inference.js +11 -9
  210. package/dist/indexer/passes/metadata.js +113 -47
  211. package/dist/indexer/scan/doc-to-entry.js +38 -1
  212. package/dist/indexer/scan/drain-dir.js +13 -23
  213. package/dist/indexer/search/db-search.js +99 -54
  214. package/dist/indexer/search/fts-query.js +47 -24
  215. package/dist/indexer/search/ranking-contributors.js +42 -20
  216. package/dist/indexer/search/ranking.js +18 -99
  217. package/dist/indexer/search/search-fields.js +7 -2
  218. package/dist/indexer/search/search-source.js +82 -93
  219. package/dist/indexer/usage/usage-events.js +0 -89
  220. package/dist/indexer/walk/file-context.js +2 -1
  221. package/dist/indexer/walk/matchers.js +30 -43
  222. package/dist/indexer/walk/path-resolver.js +7 -2
  223. package/dist/indexer/walk/walker.js +38 -12
  224. package/dist/integrations/agent/builders.js +0 -6
  225. package/dist/integrations/agent/config.js +2 -2
  226. package/dist/integrations/agent/detect.js +49 -19
  227. package/dist/integrations/agent/engine-fallback.js +76 -0
  228. package/dist/integrations/agent/profiles.js +14 -0
  229. package/dist/integrations/agent/prompts.js +12 -8
  230. package/dist/integrations/agent/runner-dispatch.js +4 -2
  231. package/dist/integrations/agent/runner.js +0 -1
  232. package/dist/integrations/agent/spawn.js +5 -6
  233. package/dist/integrations/github.js +1 -1
  234. package/dist/integrations/harnesses/aider/agent-builder.js +6 -4
  235. package/dist/integrations/harnesses/amazonq/agent-builder.js +7 -4
  236. package/dist/integrations/harnesses/claude/session-log.js +0 -10
  237. package/dist/integrations/harnesses/codex/agent-builder.js +5 -2
  238. package/dist/integrations/harnesses/copilot/agent-builder.js +5 -3
  239. package/dist/integrations/harnesses/gemini/agent-builder.js +5 -3
  240. package/dist/integrations/harnesses/index.js +3 -7
  241. package/dist/integrations/harnesses/opencode/agent-builder.js +21 -2
  242. package/dist/integrations/harnesses/opencode/session-log.js +0 -15
  243. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +13 -4
  244. package/dist/integrations/harnesses/openhands/agent-builder.js +9 -6
  245. package/dist/integrations/harnesses/pi/agent-builder.js +6 -4
  246. package/dist/integrations/lockfile.js +101 -6
  247. package/dist/integrations/session-logs/index.js +3 -28
  248. package/dist/llm/client.js +136 -100
  249. package/dist/llm/embedders/remote.js +13 -5
  250. package/dist/llm/feature-gate.js +4 -12
  251. package/dist/llm/graph-extract.js +5 -11
  252. package/dist/llm/memory-infer.js +144 -1
  253. package/dist/llm/metadata-enhance.js +5 -7
  254. package/dist/llm/structured-call.js +1 -1
  255. package/dist/llm/usage-persist.js +26 -5
  256. package/dist/llm/usage-telemetry.js +25 -2
  257. package/dist/output/cli-hints.js +1 -2
  258. package/dist/output/context.js +22 -7
  259. package/dist/output/format-exempt.js +80 -0
  260. package/dist/output/generic-render.js +259 -0
  261. package/dist/output/render-registry.js +57 -0
  262. package/dist/output/renderers.js +14 -36
  263. package/dist/output/shapes/curate.js +10 -1
  264. package/dist/output/shapes/events.js +12 -7
  265. package/dist/output/shapes/helpers.js +56 -83
  266. package/dist/output/shapes/migrate.js +8 -0
  267. package/dist/output/shapes/passthrough.js +7 -41
  268. package/dist/output/shapes/proposal/producer.js +15 -7
  269. package/dist/output/shapes.js +2 -9
  270. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  271. package/dist/output/text/bundle-show.js +7 -0
  272. package/dist/output/text/command-format.js +164 -96
  273. package/dist/output/text/env.js +1 -3
  274. package/dist/output/text/events.js +8 -7
  275. package/dist/output/text/health-format.js +103 -0
  276. package/dist/output/text/health.js +7 -0
  277. package/dist/output/text/helpers.js +10 -8
  278. package/dist/output/text/lint-format.js +43 -0
  279. package/dist/output/text/{save.js → lint.js} +2 -2
  280. package/dist/output/text/migrate.js +88 -0
  281. package/dist/output/text/proposal/producer.js +4 -2
  282. package/dist/output/text/proposal-format.js +44 -72
  283. package/dist/output/text/registry-commands.js +1 -2
  284. package/dist/output/text/show-directives.js +15 -7
  285. package/dist/output/text/status-list.js +32 -0
  286. package/dist/output/text/sync.js +5 -0
  287. package/dist/output/text/workflow-format.js +24 -203
  288. package/dist/output/text/workflow.js +1 -7
  289. package/dist/output/text.js +16 -17
  290. package/dist/registry/factory.js +4 -6
  291. package/dist/registry/origin-resolve.js +16 -27
  292. package/dist/registry/providers/skills-sh.js +3 -3
  293. package/dist/registry/providers/static-index.js +13 -23
  294. package/dist/registry/resolve.js +42 -7
  295. package/dist/registry/semver.js +34 -84
  296. package/dist/runtime.js +2 -23
  297. package/dist/scripts/akm-migrate-node.js +60290 -0
  298. package/dist/scripts/akm-migrate.js +59628 -0
  299. package/dist/setup/detect.js +42 -15
  300. package/dist/setup/registry-stash-loader.js +2 -2
  301. package/dist/setup/setup.js +236 -136
  302. package/dist/setup/steps/connection.js +7 -9
  303. package/dist/setup/steps/platforms.js +9 -9
  304. package/dist/setup/steps/semantic.js +15 -3
  305. package/dist/setup/steps/sources.js +12 -13
  306. package/dist/setup/steps/stashdir.js +2 -3
  307. package/dist/setup/steps/tasks.js +237 -120
  308. package/dist/sources/freshness.js +1 -1
  309. package/dist/sources/provider-factory.js +11 -17
  310. package/dist/sources/providers/filesystem.js +2 -3
  311. package/dist/sources/providers/git-install.js +278 -34
  312. package/dist/sources/providers/git-provider.js +25 -23
  313. package/dist/sources/providers/git-stash.js +395 -106
  314. package/dist/sources/providers/git.js +2 -2
  315. package/dist/sources/providers/npm.js +16 -19
  316. package/dist/sources/providers/provider-utils.js +7 -4
  317. package/dist/sources/providers/sync-from-ref.js +3 -9
  318. package/dist/sources/providers/website.js +6 -1
  319. package/dist/sources/resolve.js +6 -5
  320. package/dist/sources/snapshot-fetchers/bluesky.js +146 -0
  321. package/dist/sources/snapshot-fetchers/content-extract.js +566 -0
  322. package/dist/sources/snapshot-fetchers/fetcher-util.js +41 -0
  323. package/dist/sources/snapshot-fetchers/github.js +100 -0
  324. package/dist/sources/snapshot-fetchers/host-guard.js +291 -0
  325. package/dist/sources/snapshot-fetchers/registry.js +17 -1
  326. package/dist/sources/snapshot-fetchers/robots.js +348 -0
  327. package/dist/sources/snapshot-fetchers/rss.js +282 -0
  328. package/dist/sources/snapshot-fetchers/secret-seam.js +42 -0
  329. package/dist/sources/snapshot-fetchers/website-ingest.js +566 -268
  330. package/dist/sources/snapshot-fetchers/x.js +910 -0
  331. package/dist/storage/database.js +7 -0
  332. package/dist/storage/engines/sqlite-migrations.js +23 -111
  333. package/dist/storage/managed-db.js +2 -2
  334. package/dist/storage/repositories/canaries-repository.js +1 -1
  335. package/dist/storage/repositories/events-repository.js +27 -11
  336. package/dist/storage/repositories/improve-runs-repository.js +6 -12
  337. package/dist/storage/repositories/index-connection.js +17 -6
  338. package/dist/storage/repositories/index-entries-repository.js +151 -240
  339. package/dist/storage/repositories/index-entry-mapper.js +15 -11
  340. package/dist/storage/repositories/index-fts-repository.js +5 -2
  341. package/dist/storage/repositories/index-llm-cache-repository.js +0 -1
  342. package/dist/storage/repositories/index-meta-repository.js +2 -3
  343. package/dist/storage/repositories/index-schema.js +10 -25
  344. package/dist/storage/repositories/index-utility-repository.js +15 -28
  345. package/dist/storage/repositories/index-vec-repository.js +6 -1
  346. package/dist/storage/repositories/outcome-repository.js +119 -0
  347. package/dist/storage/repositories/proposals-repository.js +296 -59
  348. package/dist/storage/repositories/registry-cache.js +19 -0
  349. package/dist/storage/repositories/salience-repository.js +172 -0
  350. package/dist/storage/repositories/task-history-repository.js +15 -13
  351. package/dist/storage/repositories/workflow-runs-repository.js +52 -40
  352. package/dist/tasks/backends/cron.js +105 -15
  353. package/dist/tasks/backends/index.js +1 -1
  354. package/dist/tasks/backends/launchd.js +85 -38
  355. package/dist/tasks/backends/schtasks.js +135 -15
  356. package/dist/tasks/embedded.js +56 -40
  357. package/dist/tasks/parser.js +7 -157
  358. package/dist/tasks/resolve-akm-bin.js +137 -59
  359. package/dist/tasks/runner.js +79 -42
  360. package/dist/tasks/scheduler-invocation.js +220 -10
  361. package/dist/tasks/schema.js +24 -1
  362. package/dist/tasks/task-id.js +1 -3
  363. package/dist/tasks/validator.js +20 -6
  364. package/dist/workflows/authoring/authoring.js +94 -143
  365. package/dist/workflows/authoring/scope-key.js +1 -1
  366. package/dist/workflows/exec/frozen-judge.js +28 -2
  367. package/dist/workflows/exec/native-executor.js +77 -57
  368. package/dist/workflows/exec/param-secrets.js +9 -9
  369. package/dist/workflows/exec/run-workflow.js +133 -79
  370. package/dist/workflows/exec/step-work.js +219 -346
  371. package/dist/{migrate-storage-node.mjs → workflows/exec/unit-dispatch.js} +1 -5
  372. package/dist/workflows/ir/compile.js +141 -270
  373. package/dist/workflows/ir/freeze.js +40 -30
  374. package/dist/workflows/ir/params.js +135 -11
  375. package/dist/workflows/ir/plan-hash.js +1 -1
  376. package/dist/workflows/ir/schema.js +25 -26
  377. package/dist/workflows/parser.js +872 -307
  378. package/dist/workflows/program/expressions.js +20 -208
  379. package/dist/workflows/program/schema.js +7 -10
  380. package/dist/workflows/renderer.js +95 -68
  381. package/dist/workflows/resource-limits.js +2 -0
  382. package/dist/workflows/runtime/checkin.js +3 -3
  383. package/dist/workflows/runtime/plan-classifier.js +16 -75
  384. package/dist/workflows/runtime/runs.js +186 -127
  385. package/dist/workflows/runtime/unit-checkin.js +1 -1
  386. package/dist/workflows/runtime/unit-phases.js +2 -2
  387. package/dist/workflows/runtime/workflow-asset-loader.js +232 -83
  388. package/dist/workflows/schema.js +1 -11
  389. package/dist/workflows/validate-summary.js +30 -36
  390. package/dist/workflows/validator.js +21 -62
  391. package/docs/README.md +68 -0
  392. package/docs/migration/README.md +8 -0
  393. package/docs/migration/release-notes/0.7.0.md +11 -11
  394. package/docs/migration/release-notes/0.9.0.md +208 -27
  395. package/docs/migration/v0.7-to-v0.8.md +46 -47
  396. package/docs/migration/v0.8-to-v0.9.md +564 -208
  397. package/docs/migration/v0.9.0-troubleshooting.md +561 -0
  398. package/docs/reference/README.md +12 -0
  399. package/docs/reference/cli.md +2253 -0
  400. package/docs/reference/configuration.md +358 -0
  401. package/docs/reference/data-and-telemetry.md +105 -42
  402. package/docs/reference/workflows.md +647 -0
  403. package/package.json +22 -11
  404. package/schemas/akm-asset-envelope.json +93 -0
  405. package/schemas/akm-config.json +81 -128
  406. package/schemas/akm-workflow.json +74 -73
  407. package/dist/assets/tasks/core/backup.yml +0 -5
  408. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  409. package/dist/cli/config-migrate.js +0 -1806
  410. package/dist/cli/config-validate.js +0 -41
  411. package/dist/commands/backup-cli.js +0 -56
  412. package/dist/commands/bundle/bundle-cli.js +0 -68
  413. package/dist/commands/bundle/bundle.js +0 -219
  414. package/dist/commands/graph/graph-cli.js +0 -124
  415. package/dist/commands/graph/graph.js +0 -489
  416. package/dist/commands/improve/extract-watch.js +0 -140
  417. package/dist/commands/mv-cli.js +0 -1221
  418. package/dist/commands/sources/history.js +0 -201
  419. package/dist/commands/tasks/default-tasks.js +0 -186
  420. package/dist/core/migration-backup.js +0 -1234
  421. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -95
  422. package/dist/llm/memory-infer-impl.js +0 -138
  423. package/dist/migrate/legacy/config-source-migration.js +0 -223
  424. package/dist/migrate/legacy/content-migration.js +0 -305
  425. package/dist/migrate/legacy/legacy-layout.js +0 -779
  426. package/dist/migrate/legacy/legacy-paths.js +0 -25
  427. package/dist/migrate/legacy/legacy-stash-json.js +0 -72
  428. package/dist/migrate/legacy/proposal-fs-import.js +0 -168
  429. package/dist/migrate/legacy/task-target-ref-migration.js +0 -272
  430. package/dist/migrate/legacy/three-db-cutover.js +0 -841
  431. package/dist/migrate/legacy/workflow-migrations-bodies.js +0 -52
  432. package/dist/migrate/legacy/workflow-migrations-frozen.js +0 -21
  433. package/dist/migrate/legacy-ref-grammar.js +0 -214
  434. package/dist/output/shapes/distill.js +0 -14
  435. package/dist/output/shapes/history.js +0 -11
  436. package/dist/output/text/distill.js +0 -6
  437. package/dist/output/text/enable-disable.js +0 -8
  438. package/dist/output/text/history.js +0 -6
  439. package/dist/registry/build-index.js +0 -382
  440. package/dist/schemas/akm-config.json +0 -4704
  441. package/dist/schemas/akm-task.json +0 -87
  442. package/dist/schemas/akm-workflow.json +0 -372
  443. package/dist/scripts/migrate-storage.js +0 -3816
  444. package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
  445. package/dist/workflows/cli.js +0 -53
  446. package/dist/workflows/exec/brief.js +0 -481
  447. package/dist/workflows/exec/report.js +0 -1460
  448. package/dist/workflows/exec/watch.js +0 -116
  449. package/dist/workflows/program/parser.js +0 -813
  450. package/dist/workflows/program/project.js +0 -104
@@ -8,20 +8,20 @@
8
8
  *
9
9
  * A workflow's run params are interpolated into every unit prompt
10
10
  * (`buildUnitPrompt` → `{{PARAMS_JSON}}` + `${{ params.* }}` references) and,
11
- * critically, are part of the unit's **input hash**. The harness-neutral driver
12
- * protocol (`akm workflow brief`) MUST surface the byte-identical prompt an
13
- * external driver has to execute redacting a param would change the prompt the
14
- * driver runs, break the input-hash contract, and defeat cross-surface parity.
15
- * So params CANNOT be redacted and are declared **non-secret**: secrets belong
16
- * in **env bindings** (`env:` refs), which `brief` surfaces by NAME ONLY and
17
- * never resolves.
11
+ * critically, are part of the unit's **input hash**. The prompt an executor runs
12
+ * must be byte-identical to the one the hash was taken over — redacting a param
13
+ * would change the prompt, break the input-hash contract, and make a resumed or
14
+ * replayed run diverge from the original. So params CANNOT be redacted and are
15
+ * declared **non-secret**: secrets belong in **env bindings** (`env:` refs),
16
+ * which are carried by NAME ONLY through the plan and the hash preimage and are
17
+ * resolved from the process environment at dispatch.
18
18
  *
19
19
  * This module is the loud, best-effort guardrail on top of that contract: it
20
20
  * scans params for values that LOOK like credentials (secret-suggesting key
21
21
  * names, long high-entropy strings, known token prefixes) and returns WARNING
22
22
  * strings. It is purely advisory — it NEVER blocks a run and NEVER mutates
23
- * params — and is surfaced both at `start` and in every `brief`. False positives
24
- * and false negatives are expected; it is a nudge, not a scanner.
23
+ * params — and is surfaced when a run starts. False positives and false
24
+ * negatives are expected; it is a nudge, not a scanner.
25
25
  */
26
26
  /**
27
27
  * Substrings that, when present in a param KEY (case-insensitive), suggest the
@@ -2,10 +2,9 @@
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  /**
5
- * Engine-driven workflow execution — `akm workflow run` (orchestration plan
6
- * P1, owner decision 5). akm itself walks the plan and dispatches units; the
7
- * existing `next`/`complete` loop remains for manual/agent-driven advancement
8
- * of the same runs.
5
+ * Engine-driven workflow execution — the `akm workflow run`
6
+ * start/resume/execute path, and the single execution surface for a run: akm
7
+ * walks the frozen plan and dispatches every unit itself.
9
8
  *
10
9
  * Invariant (plan §*Never bypass the gate spine*): every step advances
11
10
  * through `completeWorkflowStep`, never by writing step rows directly, so the
@@ -37,17 +36,17 @@
37
36
  * row (`plan_json`, persisted by `startWorkflowRun` under migration 006) with
38
37
  * a `plan_hash` integrity check — the workflow asset file is NEVER re-read
39
38
  * for an in-flight run, so a mid-run asset edit cannot change behavior.
40
- * Legacy runs (created before migration 006, NULL plan_json) fall back to
41
- * compile-from-asset with a warning. Durable-row resume: re-invoking a
42
- * partially-executed run re-dispatches only work that never completed.
39
+ * Durable-row resume: re-invoking a partially-executed run re-dispatches only
40
+ * work that never completed.
43
41
  *
44
42
  * Run lease (redesign addendum, R2): exactly one engine invocation drives a
45
43
  * run at a time. The lease (random holder id + 90s expiry on the run row) is
46
44
  * acquired before any dispatch, renewed between steps, and released in a
47
- * `finally`; a second `workflow run` on a live-leased run refuses up front,
45
+ * `finally` unless a failed run retains it as forensic state; a second
46
+ * `workflow run` on a live-leased run refuses up front,
48
47
  * and an expired lease is claimable (crash recovery). While the lease is
49
- * live, manual `workflow complete` is refused too — the engine owns the
50
- * spine while driving (enforced inside `completeWorkflowStep`).
48
+ * live, any competing spine advance is refused — the engine owns the run while
49
+ * driving (enforced inside `completeWorkflowStep`).
51
50
  *
52
51
  * Process-lifecycle contract (owner finding 4 — no leaked handles): the SDK
53
52
  * dispatch path caches `opencode serve` CHILD PROCESSES in a per-env registry
@@ -69,17 +68,51 @@ import { assertRunParamsSatisfyPlan } from "../ir/params.js";
69
68
  import { computePlanHash } from "../ir/plan-hash.js";
70
69
  import { decodeWorkflowPlanV3 } from "../ir/schema.js";
71
70
  import { requireExecutableWorkflowPlan } from "../runtime/plan-classifier.js";
72
- import { completeWorkflowStep, getNextWorkflowStep } from "../runtime/runs.js";
71
+ import { completeWorkflowStep, getNextWorkflowStep, resumeWorkflowRun } from "../runtime/runs.js";
73
72
  import { GATE_EVALUATION_PHASE } from "../runtime/unit-phases.js";
74
73
  import { frozenSummaryJudge } from "./frozen-judge.js";
75
- import { executeStepPlan } from "./native-executor.js";
74
+ import { defaultUnitDispatcher, executeStepPlan, } from "./native-executor.js";
76
75
  // Shared step semantics — route evaluation + cascaded-skip bookkeeping,
77
76
  // gate-evaluation journaling, and the whole step-completion path
78
- // (`finalizeExecutedStep`) live in step-work.ts so the engine loop and the R3
79
- // brief/report driver protocol share ONE implementation (no drift).
77
+ // (`finalizeExecutedStep`) live in step-work.ts as ONE implementation, so the
78
+ // fresh-execution and resume paths cannot drift from each other.
80
79
  import { activeGateLoop, cascadeSkippedRouter, finalizeExecutedStep, recoverGateFeedback, seedJournaledRouteDecisions, } from "./step-work.js";
81
80
  export async function runWorkflowSteps(options) {
82
- const next = await getNextWorkflowStep(options.target, options.params);
81
+ let target = options.target;
82
+ let params = options.params;
83
+ let parameterFlags = options.parameterFlags;
84
+ let remainingRetries = options.maxRetries ?? 0;
85
+ let remainingSteps = options.maxSteps;
86
+ const executed = [];
87
+ for (;;) {
88
+ const result = await runWorkflowAttempt({
89
+ ...options,
90
+ target,
91
+ ...(params !== undefined ? { params } : { params: undefined }),
92
+ ...(parameterFlags !== undefined ? { parameterFlags } : { parameterFlags: undefined }),
93
+ ...(remainingSteps !== undefined ? { maxSteps: remainingSteps } : { maxSteps: undefined }),
94
+ });
95
+ executed.push(...result.executed);
96
+ const aggregate = { ...result, executed };
97
+ if (result.run.status !== "failed" || result.aborted || result.gateRejection || remainingRetries <= 0) {
98
+ return aggregate;
99
+ }
100
+ if (remainingSteps !== undefined) {
101
+ remainingSteps -= result.executed.length;
102
+ if (remainingSteps <= 0)
103
+ return aggregate;
104
+ }
105
+ await resumeWorkflowRun(result.run.id);
106
+ target = result.run.id;
107
+ params = undefined;
108
+ parameterFlags = undefined;
109
+ remainingRetries -= 1;
110
+ }
111
+ }
112
+ async function runWorkflowAttempt(options) {
113
+ const next = await getNextWorkflowStep(options.target, options.params, {
114
+ parameterFlags: options.parameterFlags,
115
+ });
83
116
  // Version/canonical/hash validation precedes every executable mutation,
84
117
  // including lease acquisition. Historical rows remain inspectable/abandonable.
85
118
  if (!next.done && !options.loadPlan) {
@@ -125,7 +158,11 @@ export async function runWorkflowSteps(options) {
125
158
  : undefined;
126
159
  heartbeat?.start();
127
160
  try {
128
- return await driveRun(options, next, leaseHolder, heartbeat);
161
+ const result = await driveRun(options, next, leaseHolder, heartbeat);
162
+ // Creation-time notices reach the caller only here: the run row has no
163
+ // warnings column, and a later invocation of the same run must stay silent
164
+ // about a decision it did not make. `driveRun` never sets `warnings`.
165
+ return next.startWarnings?.length ? { ...result, warnings: next.startWarnings } : result;
129
166
  }
130
167
  finally {
131
168
  heartbeat?.stop();
@@ -294,30 +331,34 @@ class LeaseHeartbeat {
294
331
  this.detachUpstream?.();
295
332
  }
296
333
  }
334
+ /**
335
+ * A terminal run is a pure no-op: do not load or integrity-check its frozen
336
+ * plan, because post-completion plan corruption cannot change finished work.
337
+ */
338
+ async function completedRunResult(runId) {
339
+ const doneState = await getNextWorkflowStep(runId);
340
+ return {
341
+ run: doneState.run,
342
+ executed: [],
343
+ ...(doneState.run.status === "completed" ? { done: true } : {}),
344
+ };
345
+ }
346
+ function workflowSummaryJudge(options, plan, stepPlan, signal) {
347
+ if (options.summaryJudge !== undefined)
348
+ return options.summaryJudge;
349
+ return frozenSummaryJudge(plan, stepPlan.gate.judge, signal, options.dispatcher ?? defaultUnitDispatcher);
350
+ }
297
351
  /** The engine loop proper — runs under the lease held by `runWorkflowSteps`. */
298
352
  async function driveRun(options, initial, leaseHolder, heartbeat) {
299
353
  let next = initial;
300
- // A terminal (completed) run is a PURE no-op. `runWorkflowSteps` already
301
- // skipped lease acquisition for a done run (`leased = !next.done`), and this
302
- // path must ALSO refuse to read the journal or load/integrity-check the
303
- // frozen plan: a run that finished cleanly, then had its `plan_json` corrupted
304
- // or tampered afterwards, must still report `done` here rather than throwing a
305
- // frozen-plan integrity error (loadFrozenPlan would). Nothing will dispatch
306
- // and the engine_lease_* columns stay exactly as they were, so return the
307
- // fresh run state immediately.
308
- if (initial.done) {
309
- const doneState = await getNextWorkflowStep(initial.run.id);
310
- return {
311
- run: doneState.run,
312
- executed: [],
313
- ...(doneState.run.status === "completed" ? { done: true } : {}),
314
- };
315
- }
354
+ if (initial.done)
355
+ return completedRunResult(initial.run.id);
316
356
  // The effective dispatch signal: the heartbeat's controller (a lost lease or
317
357
  // a caller abort aborts it) while leased, else the raw caller signal.
318
358
  const dispatchSignal = heartbeat?.signal ?? options.signal;
319
359
  const executed = [];
320
360
  let gateRejection;
361
+ let aborted = false;
321
362
  const maxSteps = options.maxSteps ?? Number.POSITIVE_INFINITY;
322
363
  // Seed the lifetime unit cap AND the budget ceilings from the journal so
323
364
  // both are truly per-RUN: a resumed or re-invoked run must not restart the
@@ -349,17 +390,16 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
349
390
  let tokensUsed = journaledDispatches.reduce((sum, row) => sum + (row.tokens ?? 0), 0);
350
391
  // The decoded/hash-verified row plan is the sole execution authority. The
351
392
  // loader seam may assert an expected plan in tests, but can never replace it.
352
- const plan = await loadFrozenPlan(next.run.id, next.run.workflowRef);
393
+ const plan = await loadFrozenPlan(next.run.id);
353
394
  if (options.loadPlan) {
354
395
  const expected = decodeWorkflowPlanV3(await options.loadPlan(next.run.workflowRef));
355
396
  if (computePlanHash(expected) !== computePlanHash(plan))
356
397
  throw new UsageError(`Injected workflow plan for run ${next.run.id} differs from its frozen plan.`);
357
398
  }
358
399
  // Reviewer #12: the journaled params row must still satisfy the frozen param
359
- // schemas before the engine resolves any unit prompt from it. Applied on ALL
360
- // THREE driver surfaces (engine here, brief, report) so schema-violating
361
- // params post-start corruption fail loudly and IDENTICALLY, preserving
362
- // cross-surface parity (start already validated the params it stored).
400
+ // schemas before the engine resolves any unit prompt from it, so
401
+ // schema-violating params post-start corruption fail loudly BEFORE any
402
+ // unit is dispatched (start already validated the params it stored).
363
403
  assertRunParamsSatisfyPlan(next.run.id, plan, next.run.params ?? {});
364
404
  // Route bookkeeping: targets a completed router did NOT select are skipped
365
405
  // when the spine reaches them; a target ANY router selected is protected
@@ -373,7 +413,7 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
373
413
  // the unselected targets with empty in-memory state and execute the wrong
374
414
  // branch. Decisions stay pure functions of (frozen plan, params, journaled
375
415
  // results) — the addendum determinism bar. A done run skips the seeding:
376
- // nothing will dispatch, so an unrecoverable historical decision must not
416
+ // nothing will dispatch, so an unrecoverable prior decision must not
377
417
  // block the no-op status return below.
378
418
  if (!next.done) {
379
419
  seedJournaledRouteDecisions(plan, next, routeSelected, routeUnselected);
@@ -383,8 +423,10 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
383
423
  // another engine owns the spine now. A caller abort (options.signal) is a
384
424
  // graceful break, distinct from a lost lease.
385
425
  heartbeat?.assertAlive();
386
- if (options.signal?.aborted)
426
+ if (options.signal?.aborted) {
427
+ aborted = true;
387
428
  break;
429
+ }
388
430
  // Renew the run lease between steps (a fresh 90s window per iteration).
389
431
  // Losing it (expired mid-step + claimed by another engine) throws — the
390
432
  // new owner drives the spine now.
@@ -392,8 +434,8 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
392
434
  const step = next.step;
393
435
  const stepPlan = plan.steps.find((s) => s.stepId === step.id);
394
436
  if (!stepPlan) {
395
- throw new UsageError(`Step "${step.id}" of run ${next.run.id} is not present in the current workflow asset (${next.run.workflowRef}). ` +
396
- `The source file changed since the run started — advance this step manually with \`akm workflow complete\`.`);
437
+ throw new UsageError(`Step "${step.id}" of run ${next.run.id} is not present in its frozen workflow plan (${next.run.workflowRef}). ` +
438
+ "The run journal is inconsistent; abandon this run and start a new one.");
397
439
  }
398
440
  // A branch target no completed router selected → auto-skip, no dispatch.
399
441
  const skipInfo = routeUnselected.get(step.id);
@@ -414,7 +456,7 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
414
456
  next = await getNextWorkflowStep(next.run.id);
415
457
  continue;
416
458
  }
417
- // `dependsOn` edges (reserved in IR v2 — no frontend emits them today,
459
+ // `dependsOn` edges (no frontend emits them today,
418
460
  // but a frozen plan may carry them) are a declared ordering contract:
419
461
  // every dependency must already be resolved before this step dispatches.
420
462
  // Execution is sequential (spine order), so a violation means the plan
@@ -437,13 +479,13 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
437
479
  // final rejection — this invocation is done.
438
480
  const maxLoops = Math.max(1, stepPlan.gate.maxLoops ?? 1);
439
481
  // Crash-resume gate state (Codex P1): SEED the starting gate loop from the
440
- // journal exactly as the brief/report surfaces dothe SAME shared helpers,
441
- // no fork. A run interrupted after a rejected gate was journaled
482
+ // journal through the SAME shared helpers the first pass usedno fork.
483
+ // A run interrupted after a rejected gate was journaled
442
484
  // (`<step>.gate:l<n>`, complete:false) must resume at loop n+1 with the
443
485
  // stored corrective feedback threaded into the unit prompts; without this
444
486
  // the engine restarts at loop 1, reuses the rejected loop-1 rows, overwrites
445
487
  // `<step>.gate:l1`, and re-judges the stale artifact — breaking journaled
446
- // replay and diverging from what brief computes for the same run. The rows
488
+ // replay and making the resumed run diverge from the interrupted one. The rows
447
489
  // are re-read here (NOT the once-at-start `journaledUnits` budget seed) so a
448
490
  // step reached later within THIS same invocation still starts fresh at loop 1.
449
491
  const stepJournal = await withWorkflowRunsRepo((repo) => repo.getUnitsForRun(next.run.id));
@@ -484,6 +526,7 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
484
526
  }
485
527
  : await executeStepPlan(stepPlan, {
486
528
  runId: next.run.id,
529
+ leaseHolder,
487
530
  workflowRef: next.run.workflowRef,
488
531
  params: next.run.params ?? {},
489
532
  evidence,
@@ -508,6 +551,11 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
508
551
  unitsDispatched = result.unitsDispatched;
509
552
  if (result.tokensUsed !== undefined)
510
553
  tokensUsed = result.tokensUsed;
554
+ if (options.signal?.aborted) {
555
+ aborted = true;
556
+ stopEngine = true;
557
+ break;
558
+ }
511
559
  executed.push({
512
560
  stepId: step.id,
513
561
  ok: result.ok,
@@ -517,29 +565,42 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
517
565
  });
518
566
  // Route evaluation + artifact-judged completion gate + gate-row
519
567
  // journaling + the bounded-loop rejection contract are the SHARED
520
- // completion path (`finalizeExecutedStep`): the R3 report surface drives
521
- // the identical sequence, so an engine-driven and a report-driven run of
522
- // the same frozen plan promote the same artifact and advance (or reject)
523
- // the spine identically. The engine owns only the loop control the result
524
- // maps onto (retry re-executes; advanced moves on; failure/exhaustion
525
- // stops this invocation).
526
- const finalize = await finalizeExecutedStep({
527
- runId: next.run.id,
528
- workflowRef: next.run.workflowRef,
529
- stepId: step.id,
530
- stepPlan,
531
- completionCriteria: stepPlan.gate.criteria,
532
- gateLoop,
533
- loopsRemaining: gateLoop < maxLoops,
534
- result,
535
- priorEvidence: evidence,
536
- params: next.run.params ?? {},
537
- routeSelected,
538
- routeUnselected,
539
- summaryJudge: options.summaryJudge === undefined ? frozenSummaryJudge(plan, stepPlan.gate.judge) : options.summaryJudge,
540
- ...(options.requireGates ? { requireGates: true } : {}),
541
- leaseHolder,
542
- });
568
+ // completion path (`finalizeExecutedStep`): every step advances through
569
+ // that one sequence, whether its units were just dispatched or rehydrated
570
+ // from the journal on resume, so the same frozen plan always promotes the
571
+ // same artifact and advances (or rejects) the spine identically. The
572
+ // engine owns only the loop control the result maps onto (retry
573
+ // re-executes; advanced moves on; failure/exhaustion stops this invocation).
574
+ let finalize;
575
+ try {
576
+ finalize = await finalizeExecutedStep({
577
+ runId: next.run.id,
578
+ workflowRef: next.run.workflowRef,
579
+ stepId: step.id,
580
+ stepPlan,
581
+ completionCriteria: stepPlan.gate.criteria,
582
+ gateLoop,
583
+ loopsRemaining: gateLoop < maxLoops,
584
+ result,
585
+ priorEvidence: evidence,
586
+ params: next.run.params ?? {},
587
+ routeSelected,
588
+ routeUnselected,
589
+ summaryJudge: workflowSummaryJudge(options, plan, stepPlan, dispatchSignal),
590
+ signal: options.signal,
591
+ leaseHolder,
592
+ });
593
+ }
594
+ catch (error) {
595
+ heartbeat?.assertAlive();
596
+ if (options.signal?.aborted) {
597
+ aborted = true;
598
+ stopEngine = true;
599
+ break;
600
+ }
601
+ throw error;
602
+ }
603
+ heartbeat?.assertAlive();
543
604
  if (finalize.kind === "retry") {
544
605
  // Re-execute the subgraph with the judge/validation feedback threaded
545
606
  // into unit prompts — the changed prompt changes each unit's input
@@ -564,14 +625,6 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
564
625
  stopEngine = true;
565
626
  break;
566
627
  }
567
- if (finalize.kind === "blocked") {
568
- // Reviewer #18: a required gate with no judge available — the step is
569
- // BLOCKED (not failed) for a human. The units succeeded, so overwrite the
570
- // report's ok/summary to reflect the block, then stop this invocation.
571
- executed[executed.length - 1] = { ...executed[executed.length - 1], ok: false, summary: finalize.summary };
572
- stopEngine = true;
573
- break;
574
- }
575
628
  // gate-exhausted: rejected with no loop budget left — stop with feedback.
576
629
  gateRejection = finalize.gateRejection;
577
630
  stopEngine = true;
@@ -587,6 +640,7 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
587
640
  executed,
588
641
  ...(finalState.run.status === "completed" ? { done: true } : {}),
589
642
  ...(gateRejection ? { gateRejection } : {}),
643
+ ...(aborted ? { aborted: true } : {}),
590
644
  };
591
645
  }
592
646
  /**
@@ -596,10 +650,10 @@ async function driveRun(options, initial, leaseHolder, heartbeat) {
596
650
  * canonical JSON). A mismatch means the journaled plan was tampered with
597
651
  * or corrupted — fail loudly, never silently recompile. The workflow
598
652
  * asset file is NEVER touched on this path.
599
- * Historical v2/null rows are inspection-only in the engine cutover. They are
600
- * never recompiled from a mutable source asset.
653
+ * Missing and non-current plans fail validation and are never rebuilt from a
654
+ * mutable source asset.
601
655
  */
602
- async function loadFrozenPlan(runId, _workflowRef) {
656
+ async function loadFrozenPlan(runId) {
603
657
  const row = await withWorkflowRunsRepo((repo) => {
604
658
  const run = repo.getRunById(runId);
605
659
  return run;