akm-cli 0.10.261012-beta → 0.10.261014-beta

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 (518) hide show
  1. package/CHANGELOG.md +710 -3
  2. package/README.md +15 -0
  3. package/SECURITY.md +11 -10
  4. package/STABILITY.md +47 -51
  5. package/dist/assets/hints/cli-hints-full.md +21 -19
  6. package/dist/assets/hints/cli-hints-short.md +3 -4
  7. package/dist/assets/opencode/akm-plugin.js +177 -0
  8. package/dist/assets/stash-skeleton/README.md +1 -1
  9. package/dist/assets/tasks/core/improve.yml +1 -1
  10. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +1 -1
  11. package/dist/assets/ui/config.js +27 -10
  12. package/dist/assets/workflows/workflow-template.md +2 -2
  13. package/dist/cli/clack.js +3 -1
  14. package/dist/cli/selection.js +33 -0
  15. package/dist/cli/shared.js +14 -1
  16. package/dist/cli/unknown-flags.js +6 -37
  17. package/dist/cli.js +69 -48
  18. package/dist/commands/agent/agent-dispatch.js +17 -25
  19. package/dist/commands/agent/contribute-cli.js +9 -8
  20. package/dist/commands/command/command-cli.js +4 -8
  21. package/dist/commands/command/command-execution.js +25 -39
  22. package/dist/commands/command/execution-source-loader.js +10 -14
  23. package/dist/commands/completions.js +1 -1
  24. package/dist/commands/config-cli.js +14 -5
  25. package/dist/commands/env/child-env.js +12 -14
  26. package/dist/commands/env/env-binding.js +47 -58
  27. package/dist/commands/env/env-cli.js +22 -24
  28. package/dist/commands/env/env.js +10 -58
  29. package/dist/commands/env/secret-cli.js +11 -29
  30. package/dist/commands/env/secret.js +3 -10
  31. package/dist/commands/health/checks.js +10 -849
  32. package/dist/commands/health/connections-and-harnesses-check.js +109 -0
  33. package/dist/commands/health/egress.js +3 -3
  34. package/dist/commands/health/html-report.js +9 -10
  35. package/dist/commands/health/plugin-staleness.js +18 -11
  36. package/dist/commands/health/report-view-model.js +16 -12
  37. package/dist/commands/health/scheduler-binary.js +1 -1
  38. package/dist/commands/health/semantic-search-check.js +85 -0
  39. package/dist/commands/health/type-directory-check.js +0 -3
  40. package/dist/commands/health.js +30 -42
  41. package/dist/commands/improve/consolidate/pair-pass.js +10 -25
  42. package/dist/commands/improve/consolidate.js +10 -15
  43. package/dist/commands/improve/distill.js +5 -17
  44. package/dist/commands/improve/eligibility.js +1 -3
  45. package/dist/commands/improve/execution.js +37 -40
  46. package/dist/commands/improve/extract-cli.js +6 -11
  47. package/dist/commands/improve/extract-prompt.js +2 -2
  48. package/dist/commands/improve/extract.js +67 -97
  49. package/dist/commands/improve/improve-cli.js +22 -128
  50. package/dist/commands/improve/improve-report.js +1 -1
  51. package/dist/commands/improve/improve-strategies.js +25 -108
  52. package/dist/commands/improve/improve.js +10 -14
  53. package/dist/commands/improve/loop-stages.js +3 -0
  54. package/dist/commands/improve/memory/memory-improve.js +1 -1
  55. package/dist/commands/improve/preparation.js +8 -13
  56. package/dist/commands/improve/reflect.js +203 -332
  57. package/dist/commands/improve/retrieval-scope.js +1 -1
  58. package/dist/commands/improve/session-asset.js +3 -2
  59. package/dist/commands/improve/stage.js +87 -115
  60. package/dist/commands/lint/base-linter.js +3 -3
  61. package/dist/commands/lint/env-key-rules.js +7 -6
  62. package/dist/commands/lint/index.js +3 -3
  63. package/dist/commands/models-cli.js +103 -63
  64. package/dist/commands/proposal/drain.js +26 -39
  65. package/dist/commands/proposal/proposal-cli.js +14 -18
  66. package/dist/commands/proposal/propose-cli.js +4 -2
  67. package/dist/commands/proposal/propose.js +37 -64
  68. package/dist/commands/proposal/repository.js +17 -17
  69. package/dist/commands/proposal/validators/proposal-validators.js +3 -6
  70. package/dist/commands/read/curate.js +10 -6
  71. package/dist/commands/read/registry-search.js +2 -48
  72. package/dist/commands/read/search-cli.js +1 -8
  73. package/dist/commands/read/search.js +5 -6
  74. package/dist/commands/read/show.js +6 -29
  75. package/dist/commands/remember.js +25 -40
  76. package/dist/commands/sources/add-cli.js +8 -63
  77. package/dist/commands/sources/bundle-cli.js +8 -9
  78. package/dist/commands/sources/bundle-config-ops.js +2 -2
  79. package/dist/commands/sources/info.js +12 -1
  80. package/dist/commands/sources/init.js +1 -1
  81. package/dist/commands/sources/installed-stashes.js +119 -63
  82. package/dist/commands/sources/migration-help.js +1 -1
  83. package/dist/commands/sources/plugin-upgrade.js +8 -15
  84. package/dist/commands/sources/schema-repair.js +4 -10
  85. package/dist/commands/sources/source-add.js +2 -2
  86. package/dist/commands/sources/source-clone.js +31 -7
  87. package/dist/commands/sources/source-manage.js +4 -4
  88. package/dist/commands/targets.js +175 -0
  89. package/dist/commands/tasks/explain.js +104 -69
  90. package/dist/commands/tasks/tasks-cli.js +9 -11
  91. package/dist/commands/tasks/tasks.js +75 -97
  92. package/dist/commands/ui/api.js +11 -3
  93. package/dist/commands/ui/redact.js +5 -31
  94. package/dist/commands/ui/workspace-actions.js +1 -1
  95. package/dist/commands/workflow/plan.js +48 -9
  96. package/dist/commands/workflow-cli.js +40 -45
  97. package/dist/core/adapter/adapters/agent-skills-adapter.js +10 -11
  98. package/dist/core/adapter/adapters/akm-adapter.js +36 -41
  99. package/dist/core/adapter/adapters/akm-lint.js +10 -12
  100. package/dist/core/adapter/adapters/akm-metadata.js +2 -2
  101. package/dist/core/adapter/adapters/akm-task-adapter.js +8 -9
  102. package/dist/core/adapter/adapters/akm-workflow-adapter.js +5 -5
  103. package/dist/core/adapter/adapters/claude-adapter.js +1 -1
  104. package/dist/core/adapter/adapters/dotenv-adapter.js +7 -6
  105. package/dist/core/adapter/adapters/generic-files-adapter.js +5 -5
  106. package/dist/core/adapter/adapters/index.js +3 -4
  107. package/dist/core/adapter/adapters/llm-wiki-adapter.js +12 -14
  108. package/dist/core/adapter/adapters/okf-adapter.js +8 -10
  109. package/dist/core/adapter/adapters/opencode-adapter.js +1 -1
  110. package/dist/core/adapter/adapters/shared.js +3 -3
  111. package/dist/core/adapter/adapters/tool-dir-shared.js +7 -25
  112. package/dist/core/adapter/adapters/website-snapshot-adapter.js +3 -3
  113. package/dist/core/adapter/detect-adapter.js +1 -1
  114. package/dist/core/adapter/execution-source.js +13 -35
  115. package/dist/core/adapter/registry.js +1 -1
  116. package/dist/core/adapter/validate-context.js +2 -4
  117. package/dist/core/asset/asset-placement.js +1 -1
  118. package/dist/core/asset/asset-ref.js +3 -3
  119. package/dist/core/asset/resolve-ref.js +5 -0
  120. package/dist/core/bundle-rename.js +12 -4
  121. package/dist/core/closest-match.js +37 -0
  122. package/dist/core/common.js +37 -57
  123. package/dist/core/config/config-io.js +26 -18
  124. package/dist/core/config/config-schema.js +19 -106
  125. package/dist/core/config/config-sources.js +3 -3
  126. package/dist/core/config/config-types.js +4 -4
  127. package/dist/core/config/config-walker.js +50 -77
  128. package/dist/core/config/config.js +438 -109
  129. package/dist/core/config/convert-engine-references.js +114 -0
  130. package/dist/core/config/convert-engines-shared.js +40 -0
  131. package/dist/core/config/convert-engines.js +300 -0
  132. package/dist/core/config/convert-models-overlay.js +137 -0
  133. package/dist/core/config/credentials.js +304 -0
  134. package/dist/core/config/engine-semantics.js +3 -3
  135. package/dist/core/config/migrate-keys.js +222 -0
  136. package/dist/core/config/model-aliases.js +37 -0
  137. package/dist/core/config/models-file.js +34 -0
  138. package/dist/core/config/retired-engines.js +53 -0
  139. package/dist/core/config/schema/connections.js +41 -0
  140. package/dist/core/config/schema/embedding.js +2 -2
  141. package/dist/core/config/schema/harnesses.js +41 -0
  142. package/dist/core/config/schema/improve-processes.js +9 -28
  143. package/dist/core/config/schema/improve.js +36 -1
  144. package/dist/core/config/schema/index-config.js +18 -20
  145. package/dist/core/config/schema/primitives.js +42 -17
  146. package/dist/core/config/schema/search.js +6 -11
  147. package/dist/core/config/schema/sources-bundles.js +9 -9
  148. package/dist/core/config/schema/workflow.js +2 -6
  149. package/dist/core/config/unusable-entries.js +66 -0
  150. package/dist/core/content-safety.js +3 -6
  151. package/dist/core/endpoint-url.js +47 -0
  152. package/dist/core/env-secret-ref.js +84 -73
  153. package/dist/core/errors.js +10 -16
  154. package/dist/core/extra-params.js +3 -3
  155. package/dist/core/improve-result.js +8 -9
  156. package/dist/core/json-schema.js +1 -1
  157. package/dist/core/lesson-lint.js +1 -1
  158. package/dist/core/llm-inference.js +80 -0
  159. package/dist/core/parse.js +2 -2
  160. package/dist/core/paths.js +33 -10
  161. package/dist/core/recognition-util.js +8 -10
  162. package/dist/core/redaction.js +94 -55
  163. package/dist/core/ref-token.js +82 -0
  164. package/dist/core/secret-value.js +14 -0
  165. package/dist/core/state/migrations.js +17 -22
  166. package/dist/core/structured.js +2 -68
  167. package/dist/core/subprocess.js +63 -22
  168. package/dist/core/type-presentation.js +10 -14
  169. package/dist/core/write-source.js +20 -4
  170. package/dist/execution/input-contract.js +3 -6
  171. package/dist/execution/notices.js +49 -0
  172. package/dist/execution/resolved-request.js +24 -40
  173. package/dist/execution/source.js +21 -45
  174. package/dist/execution/target-ref.js +2 -2
  175. package/dist/indexer/bundle-identity-guard.js +6 -5
  176. package/dist/indexer/ensure-index.js +1 -1
  177. package/dist/indexer/index-writer-lock.js +1 -1
  178. package/dist/indexer/indexer.js +46 -42
  179. package/dist/indexer/installations.js +12 -22
  180. package/dist/indexer/lookup/adapter-concept-owner.js +40 -14
  181. package/dist/indexer/materialize-embeddings.js +20 -16
  182. package/dist/indexer/passes/memory-inference.js +21 -50
  183. package/dist/indexer/passes/metadata.js +5 -5
  184. package/dist/indexer/scan/doc-to-entry.js +1 -1
  185. package/dist/indexer/scan/drain-dir.js +9 -11
  186. package/dist/indexer/search/db-search.js +9 -7
  187. package/dist/indexer/search/search-source.js +42 -22
  188. package/dist/indexer/usage/usage-events.js +2 -3
  189. package/dist/indexer/walk/index-context.js +2 -1
  190. package/dist/indexer/walk/matchers.js +3 -11
  191. package/dist/indexer/walk/path-resolver.js +13 -68
  192. package/dist/indexer/walk/walker.js +32 -26
  193. package/dist/integrations/agent/akm-read-tools.js +81 -0
  194. package/dist/integrations/agent/config.js +1 -1
  195. package/dist/integrations/agent/detect.js +32 -36
  196. package/dist/integrations/agent/execution.js +130 -428
  197. package/dist/integrations/agent/index.js +1 -1
  198. package/dist/integrations/agent/profiles.js +24 -28
  199. package/dist/integrations/agent/prompts.js +17 -30
  200. package/dist/integrations/agent/request-lowering.js +67 -101
  201. package/dist/integrations/agent/resolution.js +332 -0
  202. package/dist/integrations/agent/runner-dispatch.js +156 -181
  203. package/dist/integrations/agent/runner.js +20 -70
  204. package/dist/integrations/agent/runtime-port.js +4 -0
  205. package/dist/integrations/agent/runtime.js +10 -0
  206. package/dist/integrations/agent/spawn.js +65 -190
  207. package/dist/integrations/harnesses/aider/index.js +19 -39
  208. package/dist/integrations/harnesses/amazonq/index.js +17 -32
  209. package/dist/integrations/harnesses/claude/index.js +59 -28
  210. package/dist/integrations/harnesses/claude/session-log.js +7 -5
  211. package/dist/integrations/harnesses/codex/index.js +19 -31
  212. package/dist/integrations/harnesses/copilot/index.js +17 -35
  213. package/dist/integrations/harnesses/gemini/index.js +18 -34
  214. package/dist/integrations/harnesses/harness.js +36 -0
  215. package/dist/integrations/harnesses/index.js +20 -51
  216. package/dist/integrations/harnesses/opencode/agent-builder.js +132 -100
  217. package/dist/integrations/harnesses/opencode/index.js +11 -33
  218. package/dist/integrations/harnesses/opencode/roots.js +50 -0
  219. package/dist/integrations/harnesses/opencode/runtime/binary.js +206 -0
  220. package/dist/integrations/harnesses/opencode/runtime/command.js +152 -0
  221. package/dist/integrations/harnesses/opencode/runtime/index.js +177 -0
  222. package/dist/integrations/harnesses/opencode/runtime/tar.js +107 -0
  223. package/dist/integrations/harnesses/opencode/session-log-v1.js +15 -7
  224. package/dist/integrations/harnesses/opencode/session-log-v2.js +72 -48
  225. package/dist/integrations/harnesses/opencode/session-log.js +58 -137
  226. package/dist/integrations/harnesses/opencode/version.js +34 -53
  227. package/dist/integrations/harnesses/openhands/index.js +13 -37
  228. package/dist/integrations/harnesses/pi/index.js +21 -32
  229. package/dist/integrations/lockfile.js +1 -1
  230. package/dist/integrations/session-logs/index.js +11 -31
  231. package/dist/llm/client.js +93 -111
  232. package/dist/llm/embedder.js +19 -34
  233. package/dist/llm/embedders/connection.js +31 -0
  234. package/dist/llm/embedders/local-model-files.js +56 -0
  235. package/dist/llm/embedders/local.js +146 -115
  236. package/dist/llm/embedders/remote.js +26 -23
  237. package/dist/llm/embedders/types.js +1 -1
  238. package/dist/llm/index-passes.js +33 -39
  239. package/dist/llm/memory-infer.js +67 -77
  240. package/dist/llm/model-list.js +35 -0
  241. package/dist/llm/rerank-client.js +8 -14
  242. package/dist/llm/structured-call.js +45 -99
  243. package/dist/llm/structured.js +60 -0
  244. package/dist/output/renderers.js +2 -8
  245. package/dist/output/shapes/helpers.js +18 -44
  246. package/dist/output/shapes/passthrough.js +1 -0
  247. package/dist/output/shapes.js +1 -7
  248. package/dist/output/text/command-format.js +41 -39
  249. package/dist/output/text/health-format.js +8 -2
  250. package/dist/output/text/helpers.js +1 -1
  251. package/dist/output/text/migrate.js +12 -0
  252. package/dist/output/text/models.js +3 -2
  253. package/dist/output/text/registry-commands.js +1 -2
  254. package/dist/output/text/show-directives.js +16 -28
  255. package/dist/output/text/show-format.js +0 -2
  256. package/dist/output/text/targets-table.js +70 -0
  257. package/dist/output/text/workflow-format.js +44 -15
  258. package/dist/output/text.js +1 -1
  259. package/dist/registry/providers/skills-sh.js +1 -28
  260. package/dist/registry/providers/static-index.js +1 -71
  261. package/dist/runtime.js +6 -2
  262. package/dist/scripts/akm-migrate-node.js +47095 -44905
  263. package/dist/scripts/akm-migrate.js +46946 -44755
  264. package/dist/setup/detect.js +28 -273
  265. package/dist/setup/endpoint.js +36 -0
  266. package/dist/setup/semantic-assets.js +13 -19
  267. package/dist/setup/setup-flags.js +77 -0
  268. package/dist/setup/setup-plan.js +144 -0
  269. package/dist/setup/setup.js +134 -358
  270. package/dist/setup/steps/connection-shared.js +49 -101
  271. package/dist/setup/steps/connection.js +121 -524
  272. package/dist/setup/steps/embeddings.js +151 -0
  273. package/dist/setup/steps/harnesses.js +118 -0
  274. package/dist/setup/steps/platforms.js +2 -81
  275. package/dist/setup/steps/tasks.js +1 -2
  276. package/dist/setup/steps.js +10 -0
  277. package/dist/setup/summary.js +67 -0
  278. package/dist/sources/freshness.js +16 -21
  279. package/dist/sources/providers/git-provider.js +2 -9
  280. package/dist/sources/providers/provider-utils.js +13 -5
  281. package/dist/sources/resolve.js +12 -16
  282. package/dist/sources/snapshot-fetchers/robots.js +11 -12
  283. package/dist/sources/snapshot-fetchers/secret-seam.js +2 -4
  284. package/dist/sources/snapshot-fetchers/website-ingest.js +8 -15
  285. package/dist/sources/snapshot-fetchers/x.js +1 -1
  286. package/dist/standalone/onnxruntime-library.js +52 -0
  287. package/dist/storage/repositories/improve-ledger-repository.js +1 -1
  288. package/dist/storage/repositories/improve-runs-repository.js +0 -13
  289. package/dist/storage/repositories/index-entries-repository.js +2 -2
  290. package/dist/storage/repositories/proposals-repository.js +2 -2
  291. package/dist/storage/repositories/task-history-repository.js +2 -2
  292. package/dist/storage/repositories/workflow-runs-repository.js +44 -129
  293. package/dist/storage/sqlite-read-snapshot.js +33 -29
  294. package/dist/tasks/embedded.js +1 -1
  295. package/dist/tasks/log-redaction.js +7 -119
  296. package/dist/tasks/prepare/prepare-support.js +8 -7
  297. package/dist/tasks/prepare/prepare.js +8 -9
  298. package/dist/tasks/prepare/script-capture.js +9 -25
  299. package/dist/tasks/run/attempt-lifecycle.js +17 -35
  300. package/dist/tasks/run/load-task.js +54 -27
  301. package/dist/tasks/run/run-command-task.js +15 -10
  302. package/dist/tasks/run/run-native-task.js +8 -21
  303. package/dist/tasks/run/run-task.js +5 -8
  304. package/dist/tasks/run/run-workflow-task.js +14 -21
  305. package/dist/tasks/run/task-history.js +9 -17
  306. package/dist/tasks/run/task-log.js +1 -5
  307. package/dist/tasks/scheduler-invocation.js +13 -18
  308. package/dist/tasks/scheduler-sync.js +0 -1
  309. package/dist/tasks/source/bounded-document.js +31 -117
  310. package/dist/tasks/source/parse-task-source.js +0 -1
  311. package/dist/tasks/source/project-v4.js +5 -3
  312. package/dist/tasks/source/task-input-diagnostics.js +3 -4
  313. package/dist/tasks/source/task-source-v4.js +48 -72
  314. package/dist/tasks/source-v3.js +2 -5
  315. package/dist/tasks/task-run-reserved-flags.js +1 -2
  316. package/dist/workflows/authoring/authoring.js +2 -7
  317. package/dist/workflows/compile.js +1 -15
  318. package/dist/workflows/concurrency-policy.js +4 -4
  319. package/dist/workflows/exec/child-workflow.js +1 -4
  320. package/dist/workflows/exec/dispatch-redaction.js +35 -86
  321. package/dist/workflows/exec/environment.js +13 -77
  322. package/dist/workflows/exec/exec-unit.js +14 -55
  323. package/dist/workflows/exec/frozen-judge.js +26 -28
  324. package/dist/workflows/exec/native-executor.js +126 -71
  325. package/dist/workflows/exec/run-workflow.js +38 -42
  326. package/dist/workflows/exec/step-work.js +13 -17
  327. package/dist/workflows/exec/unit-dispatch.js +7 -21
  328. package/dist/workflows/freeze/environment.js +14 -119
  329. package/dist/workflows/freeze/freeze.js +14 -33
  330. package/dist/workflows/freeze/step-values.js +6 -13
  331. package/dist/workflows/freeze/targets/child-workflow.js +3 -5
  332. package/dist/workflows/freeze/targets/command.js +9 -15
  333. package/dist/workflows/freeze/targets/shell.js +0 -3
  334. package/dist/workflows/freeze/task-bindings.js +0 -1
  335. package/dist/workflows/parser.js +50 -59
  336. package/dist/workflows/plan.js +8 -2
  337. package/dist/workflows/renderer.js +83 -9
  338. package/dist/workflows/resource-limits.js +2 -2
  339. package/dist/workflows/runtime/run-plan.js +38 -23
  340. package/dist/workflows/runtime/runs.js +55 -93
  341. package/dist/workflows/runtime/workflow-asset-loader.js +55 -86
  342. package/dist/workflows/source-files.js +7 -19
  343. package/docs/README.md +10 -16
  344. package/docs/architecture/README.md +2 -37
  345. package/docs/architecture/adapters.md +2 -2
  346. package/docs/architecture/akm-core-principles.md +256 -118
  347. package/docs/architecture/architecture.md +283 -99
  348. package/docs/architecture/improvement.md +8 -2
  349. package/docs/architecture/internals/classification.md +1 -3
  350. package/docs/architecture/internals/fresh-host-rebuild-runbook.md +7 -6
  351. package/docs/architecture/internals/health-advisories.md +35 -74
  352. package/docs/architecture/internals/improve-workflow.md +27 -26
  353. package/docs/architecture/internals/indexing.md +3 -3
  354. package/docs/architecture/internals/storage-locations.md +48 -15
  355. package/docs/architecture/persisted-data-compat.md +10 -6
  356. package/docs/architecture/specs/okf-support.md +9 -11
  357. package/docs/architecture/specs/ref.md +7 -9
  358. package/docs/architecture/testing/testing-workflow.md +172 -52
  359. package/docs/architecture/workflow-engine.md +51 -34
  360. package/docs/guides/README.md +0 -1
  361. package/docs/guides/author-bundles.md +15 -20
  362. package/docs/guides/author-workflows.md +93 -71
  363. package/docs/guides/bundles.md +20 -16
  364. package/docs/guides/discover-and-load.md +1 -1
  365. package/docs/guides/getting-started.md +49 -3
  366. package/docs/guides/improve-the-library.md +10 -4
  367. package/docs/guides/recipes/headless-install.md +11 -16
  368. package/docs/guides/run-workflows.md +29 -20
  369. package/docs/guides/scheduling.md +2 -2
  370. package/docs/guides/use-with-any-agent.md +20 -22
  371. package/docs/integration/bundling-akm.md +19 -9
  372. package/docs/maintainers/README.md +2 -6
  373. package/docs/maintainers/release-checklist.md +73 -126
  374. package/docs/migration/README.md +10 -3
  375. package/docs/migration/release-notes/0.10.0.md +81 -16
  376. package/docs/migration/release-notes/0.6.0.md +1 -1
  377. package/docs/migration/release-notes/0.7.0.md +1 -1
  378. package/docs/migration/release-notes/0.9.0.md +1 -1
  379. package/docs/migration/release-notes/README.md +1 -1
  380. package/docs/migration/v0.9-to-v0.10.md +300 -60
  381. package/docs/migration/v0.9.1-to-v0.9.2.md +6 -5
  382. package/docs/posts/config-v2-lessons-16.md +1 -1
  383. package/docs/posts/llm-mode-reflect-13.md +1 -1
  384. package/docs/posts/release-0.6.0.md +11 -11
  385. package/docs/posts/release-0.8.0.md +4 -4
  386. package/docs/posts/workflows-vaults-09.md +1 -1
  387. package/docs/reference/README.md +1 -1
  388. package/docs/reference/asset-types.md +2 -2
  389. package/docs/reference/cli.md +477 -388
  390. package/docs/reference/configuration.md +569 -550
  391. package/docs/reference/data-and-telemetry.md +9 -6
  392. package/docs/reference/env-and-secrets.md +72 -15
  393. package/docs/reference/refs.md +3 -20
  394. package/docs/reference/registry.md +12 -38
  395. package/docs/reference/supported-formats.md +1 -1
  396. package/docs/reference/tasks.md +22 -11
  397. package/docs/reference/ui-api.md +14 -9
  398. package/docs/reference/workflow-schema.md +199 -154
  399. package/docs/reference/workflows.md +4 -6
  400. package/package.json +9 -11
  401. package/schemas/akm-config.json +1696 -2922
  402. package/schemas/akm-task.json +4 -4
  403. package/schemas/akm-workflow.json +36 -9
  404. package/ROADMAP.md +0 -112
  405. package/dist/assets/models.json +0 -35
  406. package/dist/commands/health/engine-usage.js +0 -45
  407. package/dist/commands/sources/dangerous-env-audit.js +0 -134
  408. package/dist/core/activation-policy.js +0 -67
  409. package/dist/core/config/schema/engines.js +0 -160
  410. package/dist/core/config/schema/execution.js +0 -23
  411. package/dist/core/spawn-env.js +0 -268
  412. package/dist/execution/directory-identity.js +0 -78
  413. package/dist/integrations/agent/builder-shared.js +0 -33
  414. package/dist/integrations/agent/builders.js +0 -43
  415. package/dist/integrations/agent/engine-fallback.js +0 -59
  416. package/dist/integrations/agent/engine-resolution.js +0 -333
  417. package/dist/integrations/agent/model-map.js +0 -475
  418. package/dist/integrations/harnesses/aider/agent-builder.js +0 -107
  419. package/dist/integrations/harnesses/aider/result-extractor.js +0 -53
  420. package/dist/integrations/harnesses/amazonq/agent-builder.js +0 -138
  421. package/dist/integrations/harnesses/amazonq/result-extractor.js +0 -48
  422. package/dist/integrations/harnesses/claude/agent-builder.js +0 -106
  423. package/dist/integrations/harnesses/claude/config-import.js +0 -67
  424. package/dist/integrations/harnesses/claude/result-extractor.js +0 -67
  425. package/dist/integrations/harnesses/codex/agent-builder.js +0 -150
  426. package/dist/integrations/harnesses/codex/result-extractor.js +0 -110
  427. package/dist/integrations/harnesses/copilot/agent-builder.js +0 -117
  428. package/dist/integrations/harnesses/copilot/result-extractor.js +0 -178
  429. package/dist/integrations/harnesses/gemini/agent-builder.js +0 -114
  430. package/dist/integrations/harnesses/gemini/result-extractor.js +0 -149
  431. package/dist/integrations/harnesses/opencode/config-import.js +0 -149
  432. package/dist/integrations/harnesses/opencode/model-config.js +0 -33
  433. package/dist/integrations/harnesses/opencode/model-work-agent.js +0 -115
  434. package/dist/integrations/harnesses/opencode/session-log-types.js +0 -12
  435. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -44
  436. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +0 -1052
  437. package/dist/integrations/harnesses/opencode-sdk/v1-adapter.js +0 -199
  438. package/dist/integrations/harnesses/opencode-sdk/v2-adapter.js +0 -254
  439. package/dist/integrations/harnesses/opencode-sdk/wire.js +0 -66
  440. package/dist/integrations/harnesses/openhands/agent-builder.js +0 -120
  441. package/dist/integrations/harnesses/openhands/result-extractor.js +0 -135
  442. package/dist/integrations/harnesses/pi/agent-builder.js +0 -89
  443. package/dist/integrations/harnesses/pi/result-extractor.js +0 -168
  444. package/dist/integrations/harnesses/shared.js +0 -18
  445. package/dist/integrations/harnesses/types.js +0 -55
  446. package/dist/llm/feature-gate.js +0 -115
  447. package/dist/output/shapes/models-list.js +0 -16
  448. package/dist/output/shapes/registry-search.js +0 -10
  449. package/dist/setup/detected-engines.js +0 -136
  450. package/dist/setup/engine-config.js +0 -97
  451. package/dist/setup/harness-config-import.js +0 -47
  452. package/dist/setup/providers.js +0 -14
  453. package/dist/setup/steps/semantic.js +0 -39
  454. package/dist/workflows/authoring/scope-key.js +0 -79
  455. package/dist/workflows/exec/lowering-notices.js +0 -23
  456. package/dist/workflows/source-semantics.js +0 -110
  457. package/docs/architecture/0.10-process-rules.md +0 -832
  458. package/docs/architecture/akm-architecture-decision-history.md +0 -2055
  459. package/docs/architecture/comparisons/claude-code-vs-akm-workflows-full.md +0 -550
  460. package/docs/architecture/decisions/0001-no-interpolation-attached-structured-context.md +0 -72
  461. package/docs/architecture/decisions/0002-unit-reuse-and-input-hash-scope.md +0 -142
  462. package/docs/architecture/decisions/0003-child-env-allowlist-and-provenance.md +0 -189
  463. package/docs/architecture/decisions/0004-task-input-contract-and-flag-coercion.md +0 -97
  464. package/docs/architecture/decisions/0005-task-result-vocabulary-and-legacy-read-mapping.md +0 -108
  465. package/docs/architecture/decisions/0006-task-source-version-routing.md +0 -124
  466. package/docs/architecture/decisions/0007-workflow-composition-bounds.md +0 -83
  467. package/docs/architecture/decisions/0008-task-binding-normalization.md +0 -88
  468. package/docs/architecture/decisions/0009-child-run-publication-column-parity.md +0 -80
  469. package/docs/architecture/decisions/0010-driver-protocol-cut.md +0 -36
  470. package/docs/architecture/decisions/0011-engine-run-loop-invariants.md +0 -125
  471. package/docs/architecture/decisions/README.md +0 -62
  472. package/docs/architecture/internals/functional-contract-patterns.md +0 -340
  473. package/docs/architecture/internals/registry-network-boundary.md +0 -57
  474. package/docs/architecture/internals/search.md +0 -248
  475. package/docs/architecture/reviews/env-secret-access.md +0 -319
  476. package/docs/architecture/runtime-boundary-design.md +0 -153
  477. package/docs/architecture/specs/0.9.0-close-out-plan.md +0 -361
  478. package/docs/architecture/specs/0.9.0-decisions.md +0 -532
  479. package/docs/architecture/specs/0.9.0-docs-code-drift-register.md +0 -745
  480. package/docs/architecture/specs/0.9.0-open-items-register.md +0 -135
  481. package/docs/architecture/specs/0.9.0-public-api-issue-backlog.md +0 -740
  482. package/docs/architecture/specs/0.9.0-release-surface-review.md +0 -636
  483. package/docs/architecture/specs/agent-command-engine-model-design.md +0 -513
  484. package/docs/architecture/specs/akm-0.9.0-bundle-adapter-spec.md +0 -501
  485. package/docs/architecture/specs/akm-0.9.0-ref-grammar-decision.md +0 -291
  486. package/docs/architecture/specs/akm-format-neutral-bundle-workspace-spec.md +0 -2059
  487. package/docs/architecture/specs/di-seams-plan.md +0 -539
  488. package/docs/architecture/specs/driver-protocol-keep-or-cut.md +0 -275
  489. package/docs/architecture/specs/fact-asset-type.md +0 -142
  490. package/docs/architecture/specs/improve-collapse-churn-detector-design.md +0 -634
  491. package/docs/architecture/specs/reviews/task-workflow-unification/README.md +0 -72
  492. package/docs/architecture/specs/reviews/task-workflow-unification/findings-consolidated.md +0 -152
  493. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-alternatives.md +0 -352
  494. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-bunqueue.md +0 -300
  495. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-openworkflow.md +0 -402
  496. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-1.md +0 -758
  497. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-2.md +0 -645
  498. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-3.md +0 -602
  499. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-adversarial.md +0 -27
  500. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-architecture.md +0 -27
  501. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-coverage.md +0 -74
  502. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-security.md +0 -15
  503. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-adversarial.md +0 -132
  504. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-verification.md +0 -147
  505. package/docs/architecture/specs/stash-conventions-code-spec.md +0 -275
  506. package/docs/architecture/specs/stash-organization-conventions.md +0 -377
  507. package/docs/architecture/specs/task-workflow-format-unification.md +0 -721
  508. package/docs/architecture/specs/workflow-engine-buy-vs-build.md +0 -231
  509. package/docs/architecture/specs/workflow-format-unification.md +0 -432
  510. package/docs/architecture/testing/manual-testing-checklist.md +0 -3411
  511. package/docs/architecture/testing/okf-v0.2-conformance-runbook.md +0 -924
  512. package/docs/architecture/testing/task-workflow-manual-tests.md +0 -1720
  513. package/docs/guides/claude-code-vs-akm-workflows.md +0 -29
  514. package/docs/guides/knowledge-management.md +0 -18
  515. package/docs/maintainers/curate-workmap.md +0 -335
  516. package/docs/migration/v0.5-to-v0.6.md +0 -759
  517. package/docs/migration/v0.7-to-v0.8.md +0 -1378
  518. package/docs/plans/0.9.2-agent-command-workflow-plan.md +0 -423
@@ -17,6 +17,7 @@ import { assembleAsset } from "../../core/asset/asset-serialize.js";
17
17
  import { conceptIdFromTypeName } from "../../core/asset/resolve-ref.js";
18
18
  import { resolveStashDir, timestampForFilename } from "../../core/common.js";
19
19
  import { getImproveProcessConfig, loadConfig } from "../../core/config/config.js";
20
+ import { SHIPPED_ALIAS } from "../../core/config/model-aliases.js";
20
21
  import { ConfigError, UsageError } from "../../core/errors.js";
21
22
  import { appendEvent } from "../../core/events.js";
22
23
  import { createLockPayload, probeLock, reclaimStaleLock, releaseLock, tryAcquireLockSync, } from "../../core/file-lock.js";
@@ -25,14 +26,14 @@ import { redactErrorBody } from "../../core/redaction.js";
25
26
  import { resolveStashStandards } from "../../core/standards/resolve-stash-standards.js";
26
27
  import { resolveTypeConventions, typeConventionRef } from "../../core/standards/resolve-type-conventions.js";
27
28
  import { getStateDbPath, openStateDatabase } from "../../core/state-db.js";
28
- import { runStructured } from "../../core/structured.js";
29
29
  import { repairTruncatedDescription } from "../../core/text-truncation.js";
30
30
  import { DURATION_UNITS, parseDuration } from "../../core/time.js";
31
31
  import { warn, warnVerbose } from "../../core/warn.js";
32
+ import { noticeSet } from "../../execution/notices.js";
32
33
  import { indexWrittenAssets } from "../../indexer/index-written-assets.js";
33
- import { assertRunnerCredentials } from "../../integrations/agent/runner-dispatch.js";
34
34
  import { getAvailableHarnesses } from "../../integrations/session-logs/index.js";
35
35
  import { preFilterSession } from "../../integrations/session-logs/pre-filter.js";
36
+ import { isRefused } from "../../llm/structured.js";
36
37
  import { getExtractedSessionsMap, getLastExtractRunAt, shouldSkipAlreadyExtractedSession, upsertExtractedSession, } from "../../storage/repositories/extract-sessions-repository.js";
37
38
  import { listImproveLedgerRows } from "../../storage/repositories/improve-ledger-repository.js";
38
39
  import { getStateProposal } from "../../storage/repositories/proposals-repository.js";
@@ -43,7 +44,7 @@ import { buildExtractPrompt, EXTRACT_JSON_SCHEMA, parseExtractPayload, } from ".
43
44
  import { cloneAndFreeze, resolveImproveStrategy, resolveProcessEnabled } from "./improve-strategies.js";
44
45
  import { isLedgerBlocked, ledgerKey, readLedgerDb } from "./ledger.js";
45
46
  import { buildSessionSummaryPrompt, parseSessionSummary, SESSION_SUMMARY_JSON_SCHEMA, sessionMeetsDurationGate, writeSessionAsset, } from "./session-asset.js";
46
- import { callStage, callStageOnce, mintProposal, noticeSet } from "./stage.js";
47
+ import { callStage, callStageLoop, mintProposal } from "./stage.js";
47
48
  /** Minimum session duration (minutes) for writing a session asset. */
48
49
  const DEFAULT_MIN_SESSION_DURATION_MINUTES = 5;
49
50
  /** Raw session size (chars) below which the LLM call is skipped; only truly empty sessions are safe to skip. */
@@ -114,33 +115,31 @@ function acquireExtractSessionLock(lockPath) {
114
115
  }
115
116
  /** Resolve standalone extract selection once, before discovery, auto iteration or watch startup. */
116
117
  export function resolveStandaloneExtractPlan(config, selection) {
117
- if (selection.engine && selection.strategy) {
118
- throw new UsageError("--engine and --strategy are mutually exclusive. Pick one.", "INVALID_FLAG_VALUE");
119
- }
120
118
  const selected = resolveImproveStrategy(selection.strategy, config);
121
119
  const process = cloneAndFreeze(getImproveProcessConfig("extract", selected.config) ?? {});
122
120
  const resolved = resolveImproveExecution({
123
121
  config,
124
- profile: selected.config,
125
- process,
126
122
  current: {
123
+ ...(selection.connection ? { connection: selection.connection } : {}),
124
+ ...(selection.harness ? { harness: selection.harness } : {}),
127
125
  ...(selection.engine ? { engine: selection.engine } : {}),
126
+ ...(selection.model ? { model: selection.model } : {}),
128
127
  ...(Object.hasOwn(selection, "timeoutMs") ? { timeoutMs: selection.timeoutMs ?? null } : {}),
129
128
  },
130
129
  processName: "extract",
130
+ alias: SHIPPED_ALIAS.extract,
131
131
  });
132
132
  if (!resolved) {
133
- throw new ConfigError("No engine configured for extract. Set defaults.llmEngine, pass --engine, or select an improve strategy with processes.extract.engine.", "LLM_NOT_CONFIGURED");
133
+ throw new ConfigError("No connection or harness is configured for extract. Run `akm setup`, pass --connection or --harness, or set improve.connection or improve.processes.extract.connection.", "LLM_NOT_CONFIGURED");
134
134
  }
135
135
  const runner = resolved.runner;
136
136
  return Object.freeze({
137
137
  strategy: selected.name,
138
- engine: runner.engine,
138
+ engine: runner.name,
139
139
  // An explicit `akm extract` runs regardless of the strategy's improve-stage toggle.
140
140
  enabled: true,
141
141
  process,
142
142
  runner: cloneAndFreeze(runner),
143
- timeoutMs: Object.hasOwn(runner, "timeoutMs") ? (runner.timeoutMs ?? null) : 600_000,
144
143
  embeddingConfig: cloneAndFreeze(config.embedding),
145
144
  ...(resolved.notices.length > 0 ? { notices: cloneAndFreeze(resolved.notices) } : {}),
146
145
  });
@@ -168,7 +167,7 @@ function emptyExtractResult(args) {
168
167
  sessions: [],
169
168
  warnings: [args.warning],
170
169
  durationMs: Date.now() - args.startMs,
171
- ...(args.llmRunner ? { engine: args.llmRunner.engine, engineKind: args.llmRunner.kind } : {}),
170
+ ...(args.llmRunner ? { engine: args.llmRunner.name, engineKind: args.llmRunner.kind } : {}),
172
171
  };
173
172
  }
174
173
  /**
@@ -274,11 +273,11 @@ function sessionTriagePasses(data, minScore) {
274
273
  * `--force` overrides it, even for `--session-id`), the raw-size floor and the
275
274
  * triage score. Returns a skip, or what the prompt needs.
276
275
  */
277
- function runPreLlmSessionGates(harness, sessionRef, prior, force, gates) {
276
+ async function runPreLlmSessionGates(harness, sessionRef, prior, force, gates) {
278
277
  const { sessionId } = sessionRef;
279
278
  let data;
280
279
  try {
281
- data = harness.readSession(sessionRef);
280
+ data = await harness.readSession(sessionRef);
282
281
  }
283
282
  catch (err) {
284
283
  return {
@@ -333,7 +332,7 @@ function lockedConcurrentResult(harness, summary) {
333
332
  * Classify candidates read-only, up to `maxSessionsPerRun` model sessions
334
333
  * (explicit `--session-id` and `--force` are uncapped); the rest are deferred.
335
334
  */
336
- function planExtractSessions(args) {
335
+ async function planExtractSessions(args) {
337
336
  const { candidates, options, harness, maxSessionsPerRun, locking } = args;
338
337
  const lockUnavailable = (summary) => locking &&
339
338
  extractSessionLockIsUnavailable(harness.name, summary.sessionId, options.stateDbPath ?? getStateDbPath());
@@ -351,7 +350,7 @@ function planExtractSessions(args) {
351
350
  continue;
352
351
  }
353
352
  const prior = args.seenMap.get(summary.sessionId);
354
- const gate = runPreLlmSessionGates(harness, summary, prior, options.force === true, args.gates);
353
+ const gate = await runPreLlmSessionGates(harness, summary, prior, options.force === true, args.gates);
355
354
  if ("skip" in gate) {
356
355
  plans.push({ kind: "skip", summary, result: gate.skip });
357
356
  continue;
@@ -366,58 +365,40 @@ function planExtractSessions(args) {
366
365
  }
367
366
  return { plans, deferredCandidates: [] };
368
367
  }
369
- const EXTRACT_LLM_UNAVAILABLE = Symbol("extract-llm-unavailable");
370
368
  /**
371
369
  * One session's extraction call, with one corrective retry; configuration
372
370
  * errors escape before any state is written.
373
371
  */
374
372
  async function extractFromSession(run, prompt) {
375
- const { llmRunner } = run;
376
- try {
377
- const result = await runStructured({
378
- dispatch: async (feedback) => {
379
- // This loop parses and repairs the reply itself, so each attempt is one unvalidated dispatch.
380
- const outcome = await callStageOnce({
381
- feature: "session_extraction",
382
- runner: llmRunner,
383
- prompt: feedback ? `${prompt}\n\n## Corrective output instruction\n\n${feedback}` : prompt,
384
- gate: { config: run.config },
385
- request: {
386
- timeoutMs: run.timeoutMs,
387
- responseSchema: EXTRACT_JSON_SCHEMA,
388
- ...(run.options.signal ? { signal: run.options.signal } : {}),
389
- ...(run.options.chat ? { chat: run.options.chat } : {}),
390
- },
391
- onNotices: run.notices.add,
392
- });
393
- if (!outcome.ok)
394
- throw EXTRACT_LLM_UNAVAILABLE;
395
- return outcome.raw;
396
- },
397
- parse: (raw) => {
398
- const payload = parseExtractPayload(raw);
399
- return payload.parseFailure ? undefined : payload;
400
- },
401
- validate: (payload) => ({ ok: true, value: payload }),
402
- buildFeedback: () => "Your previous response did not contain a valid extraction payload. Respond with ONLY a JSON object matching the requested schema, with a candidates array and no prose or code fences.",
403
- });
404
- if (result.ok)
405
- return { kind: "success", payload: result.value, attempts: result.attempts };
406
- return {
407
- kind: "malformed",
408
- raw: result.raw,
409
- attempts: result.attempts,
410
- failure: parseExtractPayload(result.raw).parseFailure ?? {
411
- code: "invalid_payload",
412
- message: result.errors.join("; "),
413
- },
414
- };
415
- }
416
- catch (err) {
417
- if (err === EXTRACT_LLM_UNAVAILABLE)
418
- return { kind: "unavailable" };
419
- throw err;
420
- }
373
+ // This loop parses and repairs the reply itself, so each attempt is one unvalidated dispatch.
374
+ const result = await callStageLoop({
375
+ runner: run.llmRunner,
376
+ prompt,
377
+ request: {
378
+ responseSchema: EXTRACT_JSON_SCHEMA,
379
+ ...(run.options.signal ? { signal: run.options.signal } : {}),
380
+ ...(run.options.chat ? { chat: run.options.chat } : {}),
381
+ },
382
+ onNotices: run.notices.add,
383
+ }, (raw) => {
384
+ const payload = parseExtractPayload(raw);
385
+ return payload.parseFailure
386
+ ? { ok: false, errors: [payload.parseFailure.message] }
387
+ : { ok: true, value: payload };
388
+ }, () => "## Corrective output instruction\n\nYour previous response did not contain a valid extraction payload. Respond with ONLY a JSON object matching the requested schema, with a candidates array and no prose or code fences.");
389
+ if (result.ok)
390
+ return { kind: "success", payload: result.value, attempts: result.attempts };
391
+ if (!isRefused(result))
392
+ return { kind: "unavailable" };
393
+ return {
394
+ kind: "malformed",
395
+ raw: result.raw,
396
+ attempts: result.attempts,
397
+ failure: parseExtractPayload(result.raw).parseFailure ?? {
398
+ code: "invalid_payload",
399
+ message: result.errors.join("; "),
400
+ },
401
+ };
421
402
  }
422
403
  /**
423
404
  * Write the session's searchable asset (`sessions/<harness>/<id>.md`). Fails
@@ -630,7 +611,7 @@ async function runExtractSessionLoop(run, planned, seenMap, stateDb, tracking, t
630
611
  deferred: 0,
631
612
  };
632
613
  const account = (result) => {
633
- const stamped = { ...result, engine: run.llmRunner.engine };
614
+ const stamped = { ...result, engine: run.llmRunner.name };
634
615
  tally.sessions.push(stamped);
635
616
  const preempted = ["read_failed", "too_short", "already_extracted", "locked_concurrent"].includes(result.skipReason ?? "");
636
617
  if (gates.triage.enabled && !preempted) {
@@ -652,10 +633,10 @@ async function runExtractSessionLoop(run, planned, seenMap, stateDb, tracking, t
652
633
  };
653
634
  const workPlans = [...planned.plans];
654
635
  let remaining = planned.deferredCandidates;
655
- const refillModelSlot = () => {
636
+ const refillModelSlot = async () => {
656
637
  if (remaining.length === 0 || options.signal?.aborted)
657
638
  return;
658
- const refill = planExtractSessions({
639
+ const refill = await planExtractSessions({
659
640
  candidates: remaining,
660
641
  options,
661
642
  harness,
@@ -680,7 +661,7 @@ async function runExtractSessionLoop(run, planned, seenMap, stateDb, tracking, t
680
661
  const lock = acquireExtractSessionLock(extractSessionLockPath(harness.name, summary.sessionId, options.stateDbPath ?? getStateDbPath()));
681
662
  if (!lock.proceed) {
682
663
  account(lockedConcurrentResult(harness.name, summary));
683
- refillModelSlot();
664
+ await refillModelSlot();
684
665
  continue;
685
666
  }
686
667
  lockOwnership = lock.ownership;
@@ -689,10 +670,10 @@ async function runExtractSessionLoop(run, planned, seenMap, stateDb, tracking, t
689
670
  const prior = stateDb
690
671
  ? getExtractedSessionsMap(stateDb, harness.name, [summary.sessionId]).get(summary.sessionId)
691
672
  : seenMap.get(summary.sessionId);
692
- const gate = runPreLlmSessionGates(harness, summary, prior, options.force === true, gates);
673
+ const gate = await runPreLlmSessionGates(harness, summary, prior, options.force === true, gates);
693
674
  if ("skip" in gate) {
694
675
  accountAndRecord(summary, gate.skip);
695
- refillModelSlot();
676
+ await refillModelSlot();
696
677
  continue;
697
678
  }
698
679
  const result = await processSession(run, summary, gate);
@@ -775,8 +756,8 @@ function recordSessionOutcome(stateDb, enabled, harness, summary, result, source
775
756
  warn(`[extract] failed to record session ${summary.sessionId} in state.db: ${err instanceof Error ? err.message : String(err)}`);
776
757
  }
777
758
  }
778
- /** The run's runner, budgets, gates and session-indexing settings (throws without an engine). */
779
- function resolveExtractRun(options, config, process, activeProfile) {
759
+ /** The run's runner, budgets, gates and session-indexing settings (throws without a connection or harness). */
760
+ function resolveExtractRun(options, config, process) {
780
761
  const notices = noticeSet();
781
762
  let llmRunner;
782
763
  if (options.resolvedPlan) {
@@ -787,32 +768,22 @@ function resolveExtractRun(options, config, process, activeProfile) {
787
768
  llmRunner = options.llmRunner;
788
769
  }
789
770
  else {
790
- const resolved = resolveImproveExecution({ config, profile: activeProfile, process, processName: "extract" });
771
+ const resolved = resolveImproveExecution({ config, processName: "extract", alias: SHIPPED_ALIAS.extract });
791
772
  llmRunner = resolved?.runner;
792
773
  if (resolved)
793
774
  notices.add(resolved.notices);
794
775
  }
795
776
  if (!llmRunner) {
796
- throw new ConfigError("No engine configured for extract. Set defaults.llmEngine or improve.strategies.<name>.processes.extract.engine.", "LLM_NOT_CONFIGURED");
777
+ throw new ConfigError("No connection or harness is configured for extract. Run `akm setup`, or set improve.connection or improve.processes.extract.connection.", "LLM_NOT_CONFIGURED");
797
778
  }
798
779
  const runner = llmRunner;
799
- const timeoutMs = options.resolvedPlan
800
- ? options.resolvedPlan.timeoutMs
801
- : Object.hasOwn(options, "timeoutMs")
802
- ? (options.timeoutMs ?? null)
803
- : Object.hasOwn(runner, "timeoutMs")
804
- ? (runner.timeoutMs ?? null)
805
- : 600_000;
806
780
  const triage = process?.triage;
807
781
  // The default summary generator fails open: no summary, no session asset.
808
782
  const generate = async (data) => {
809
783
  const outcome = await callStage({
810
- feature: "session_extraction",
811
784
  runner,
812
785
  prompt: buildSessionSummaryPrompt(data),
813
- gate: { config },
814
786
  request: {
815
- timeoutMs,
816
787
  responseSchema: SESSION_SUMMARY_JSON_SCHEMA,
817
788
  ...(options.signal ? { signal: options.signal } : {}),
818
789
  ...(options.chat ? { chat: options.chat } : {}),
@@ -825,7 +796,6 @@ function resolveExtractRun(options, config, process, activeProfile) {
825
796
  return {
826
797
  llmRunner: runner,
827
798
  notices,
828
- timeoutMs,
829
799
  gates: {
830
800
  maxTotalChars: typeof process?.maxTotalChars === "number" ? process.maxTotalChars : undefined,
831
801
  minContentChars: typeof process?.minContentChars === "number" ? process.minContentChars : DEFAULT_MIN_CONTENT_CHARS,
@@ -850,10 +820,10 @@ function resolveExtractRun(options, config, process, activeProfile) {
850
820
  };
851
821
  }
852
822
  /** The sessions to process: the `--session-id` target (or a not-found envelope) or the discovery window. */
853
- function discoverExtractCandidates(options, harness, effectiveSince, startMs, dryRun, llmRunner) {
823
+ async function discoverExtractCandidates(options, harness, effectiveSince, startMs, dryRun, llmRunner) {
854
824
  const location = options.location ? { location: options.location } : {};
855
825
  if (options.sessionId) {
856
- const target = harness.listSessions(location).find((s) => s.sessionId === options.sessionId);
826
+ const target = (await harness.listSessions(location)).find((s) => s.sessionId === options.sessionId);
857
827
  if (target)
858
828
  return { candidates: [target] };
859
829
  return {
@@ -874,7 +844,7 @@ function discoverExtractCandidates(options, harness, effectiveSince, startMs, dr
874
844
  ...(options.stateDbPath ? { stateDbPath: options.stateDbPath } : {}),
875
845
  ...(options.skipTracking ? { skipTracking: options.skipTracking } : {}),
876
846
  });
877
- return { candidates: harness.listSessions({ sinceMs, ...location }) };
847
+ return { candidates: await harness.listSessions({ sinceMs, ...location }) };
878
848
  }
879
849
  function loadSeenMapReadOnly(options, harness, candidates, warnings) {
880
850
  if (options.skipTracking === true || candidates.length === 0)
@@ -922,7 +892,7 @@ export async function akmExtract(options) {
922
892
  startMs,
923
893
  });
924
894
  }
925
- const resolved = resolveExtractRun(options, config, process, activeProfile);
895
+ const resolved = resolveExtractRun(options, config, process);
926
896
  const { llmRunner, notices } = resolved;
927
897
  const harness = (options.harnesses ?? getAvailableHarnesses()).find((h) => h.name === options.type);
928
898
  const unavailable = !harness
@@ -940,13 +910,13 @@ export async function akmExtract(options) {
940
910
  llmRunner,
941
911
  });
942
912
  }
943
- const discovery = discoverExtractCandidates(options, harness, resolved.effectiveSince, startMs, dryRun, llmRunner);
913
+ const discovery = await discoverExtractCandidates(options, harness, resolved.effectiveSince, startMs, dryRun, llmRunner);
944
914
  if ("notFound" in discovery)
945
915
  return discovery.notFound;
946
916
  const topLevelWarnings = [];
947
917
  const tracking = options.skipTracking !== true;
948
918
  const seenMap = loadSeenMapReadOnly(options, harness.name, discovery.candidates, topLevelWarnings);
949
- const planned = planExtractSessions({
919
+ const planned = await planExtractSessions({
950
920
  candidates: discovery.candidates,
951
921
  options,
952
922
  harness,
@@ -956,9 +926,6 @@ export async function akmExtract(options) {
956
926
  locking: tracking && !dryRun && !options.stateDb,
957
927
  });
958
928
  const modelPlanCount = planned.plans.filter((plan) => plan.kind === "model").length;
959
- // Credentials are materialized once, after every read-only gate and before live state or a lock.
960
- if (modelPlanCount > 0)
961
- assertRunnerCredentials(llmRunner);
962
929
  let stateDb;
963
930
  let tally;
964
931
  try {
@@ -1011,7 +978,7 @@ export async function akmExtract(options) {
1011
978
  for (const reason of EXTRACT_INFRASTRUCTURE_SKIP_REASONS) {
1012
979
  const n = counts[reason];
1013
980
  if (n)
1014
- topLevelWarnings.push(`${n} of ${tally.sessions.length} sessions skipped: ${reason} (engine "${llmRunner.engine}")`);
981
+ topLevelWarnings.push(`${n} of ${tally.sessions.length} sessions skipped: ${reason} (engine "${llmRunner.name}")`);
1015
982
  }
1016
983
  if (modelPlanCount > 0 && resolved.gates.triage.enabled && tally.triageEvaluated > 0) {
1017
984
  appendEvent({
@@ -1039,7 +1006,7 @@ export async function akmExtract(options) {
1039
1006
  durationMs: Date.now() - startMs,
1040
1007
  ...notices.fields(),
1041
1008
  ...(Object.keys(counts).length > 0 ? { skipReasons: counts } : {}),
1042
- engine: llmRunner.engine,
1009
+ engine: llmRunner.name,
1043
1010
  engineKind: llmRunner.kind,
1044
1011
  };
1045
1012
  }
@@ -1049,7 +1016,7 @@ export async function akmExtract(options) {
1049
1016
  * so a session counts as new when it has no seen row or a row without a
1050
1017
  * content hash; the exact hash check happens at extraction.
1051
1018
  */
1052
- export function countNewExtractCandidates(_config, options = {}) {
1019
+ export async function countNewExtractCandidates(_config, options = {}) {
1053
1020
  const effectiveSince = options.since ?? getImproveProcessConfig("extract", options.improveProfile)?.defaultSince;
1054
1021
  const explicitSinceMs = effectiveSince ? parseSinceArg(effectiveSince) : undefined;
1055
1022
  const harnesses = (options.harnesses ?? getAvailableHarnesses()).filter((h) => h.isAvailable());
@@ -1064,7 +1031,10 @@ export function countNewExtractCandidates(_config, options = {}) {
1064
1031
  ...(options.stateDbPath ? { stateDbPath: options.stateDbPath } : {}),
1065
1032
  ...(options.readOnly && !options.stateDb ? { skipTracking: true } : {}),
1066
1033
  });
1067
- const candidates = harness.listSessions({ sinceMs, ...(options.readOnly ? { isolatedSnapshot: true } : {}) });
1034
+ const candidates = await harness.listSessions({
1035
+ sinceMs,
1036
+ ...(options.readOnly ? { isolatedSnapshot: true } : {}),
1037
+ });
1068
1038
  if (candidates.length === 0)
1069
1039
  continue;
1070
1040
  // A dry planner without state.db has no seen-session ledger by definition.
@@ -4,20 +4,17 @@
4
4
  import path from "node:path";
5
5
  import { defineCommand } from "citty";
6
6
  import { findCittyTopLevelCommandIndex, getStringArg, hasSubcommand, parsePositiveIntFlag } from "../../cli/parse-args.js";
7
+ import { SELECTION_ARGS, selectionFromArgs } from "../../cli/selection.js";
7
8
  import { defineJsonCommand, GLOBAL_OUTPUT_ARGS, output, runWithJsonErrors } from "../../cli/shared.js";
8
9
  import { isFullRefInput, parseRefInput } from "../../core/asset/resolve-ref.js";
9
10
  import { loadConfig } from "../../core/config/config.js";
11
+ import { collectCredentialValues } from "../../core/config/credentials.js";
10
12
  import { ConfigError, UsageError } from "../../core/errors.js";
11
13
  import { resolveMutationTarget } from "../../core/mutation-target.js";
12
14
  import { getRunLogDir } from "../../core/paths.js";
13
15
  import { redactSensitiveText } from "../../core/redaction.js";
14
- import { clearLogFile, setLogFile } from "../../core/warn.js";
16
+ import { clearLogFile, setLogFile, warnOnce } from "../../core/warn.js";
15
17
  import { resolveWriteTarget } from "../../core/write-source.js";
16
- import { DEFAULT_LLM_TIMEOUT_MS } from "../../integrations/agent/config.js";
17
- import { defaultWhich } from "../../integrations/agent/detect.js";
18
- import { collectEngineCredentialValues, materializeLlmConnection, } from "../../integrations/agent/engine-resolution.js";
19
- import { llmUseFromRunner, sdkFallbackUseFromRunner } from "../../integrations/agent/runner.js";
20
- import { probeLlmReachable } from "../../llm/client.js";
21
18
  import { getOutputMode } from "../../output/context.js";
22
19
  import { deliverRendered } from "../../output/html-render.js";
23
20
  import { readStdin } from "../../runtime.js";
@@ -25,7 +22,7 @@ import { akmImprove, IMPROVE_TARGET_FLAG, resolveImproveReadSource } from "./imp
25
22
  import { runImproveReportQuery } from "./improve-report.js";
26
23
  import { buildImproveRunId, recordImproveRunResult, recordTerminatedImproveRun, } from "./improve-result-file.js";
27
24
  import { runImproveSession } from "./improve-session.js";
28
- import { resolveImprovePlan, resolveImproveStrategy, } from "./improve-strategies.js";
25
+ import { resolveImprovePlan, resolveImproveStrategy } from "./improve-strategies.js";
29
26
  import { formatUsageReportTable } from "./improve-usage-report.js";
30
27
  import { renderReflectPromptPreview } from "./reflect.js";
31
28
  import { resolveQualityGateJudge, runReflectQualityJudge } from "./stage.js";
@@ -34,109 +31,6 @@ let akmImproveForRun = akmImprove;
34
31
  export function _setAkmImproveForTests(fake) {
35
32
  akmImproveForRun = fake ?? akmImprove;
36
33
  }
37
- /**
38
- * `--require-engines` (#957): fail before any side effect when an enabled
39
- * process cannot run, naming what each is missing — a scheduled run would
40
- * rather fail loudly than index and then skip everything.
41
- */
42
- function assertRequiredEnginesAvailable(plan) {
43
- if (plan.engineUnavailable.length === 0)
44
- return;
45
- const lines = plan.engineUnavailable.map((item) => ` - ${item.process} (${item.configKey}): ${item.reason}`);
46
- throw new ConfigError(`--require-engines: ${plan.engineUnavailable.length} improve process${plan.engineUnavailable.length === 1 ? "" : "es"} cannot run because ${plan.engineUnavailable.length === 1 ? "its" : "their"} engine is unavailable:\n${lines.join("\n")}`, "LLM_NOT_CONFIGURED");
47
- }
48
- /** Every engine the plan would dispatch to, triage's judgment engine included. */
49
- function collectRequiredEngineTargets(plan) {
50
- const runners = Object.entries(plan.processes)
51
- .flatMap(([processName, process]) => (process.runner ? [[processName, process.runner]] : []))
52
- .concat(plan.triageJudgment ? [["triage.judgment", plan.triageJudgment]] : []);
53
- return runners.map(([processName, runner]) => {
54
- // The runner's own timeout, else the connection's (sdkFallbackUseFromRunner already does this).
55
- const use = runner.kind === "llm"
56
- ? {
57
- ...llmUseFromRunner(runner),
58
- timeoutMs: runner.timeoutMs !== undefined ? runner.timeoutMs : (runner.connection.timeoutMs ?? null),
59
- }
60
- : runner.kind === "sdk"
61
- ? sdkFallbackUseFromRunner(runner)
62
- : undefined;
63
- return {
64
- process: processName,
65
- engine: runner.engine,
66
- ...(runner.kind === "llm" ? {} : { bin: runner.profile.bin }),
67
- ...(use ? probeConnection(use) : {}),
68
- };
69
- });
70
- }
71
- /**
72
- * The connection the probe sends, built as a dispatch builds it: the runner
73
- * keeps its credential symbolic, so the key is read and injected here, or the
74
- * probe would go out without one.
75
- */
76
- function probeConnection(use) {
77
- try {
78
- return { connection: materializeLlmConnection(use) };
79
- }
80
- catch (err) {
81
- return { connection: use.connection, error: err instanceof Error ? err.message : String(err) };
82
- }
83
- }
84
- /**
85
- * The bound on `--require-engines`' probe: the connection's own request
86
- * timeout, at most two minutes. A local server busy with another job queues
87
- * the probe behind that job, and a fixed 3s bound failed every scheduled
88
- * improve run on 2026-09-27 against a reachable endpoint; the cap still ends a
89
- * hung endpoint (#957) long before a run's own multi-minute calls would.
90
- */
91
- export function requiredEngineProbeTimeoutMs(connection) {
92
- return Math.min(connection.timeoutMs ?? DEFAULT_LLM_TIMEOUT_MS, REQUIRED_ENGINE_PROBE_MAX_MS);
93
- }
94
- const REQUIRED_ENGINE_PROBE_MAX_MS = 120_000;
95
- /**
96
- * `--require-engines`, live: probe each connection's real completion path
97
- * (a gateway can list a model whose completion route is dead, #980), once per
98
- * endpoint + model, within {@link requiredEngineProbeTimeoutMs}, and look each
99
- * agent harness's binary up on PATH. Returns each target's latency for the run
100
- * result (R17); an unreachable one fails the run.
101
- */
102
- export async function assertRequiredEnginesReachable(plan, probeReachable = (connection) => probeLlmReachable(connection, requiredEngineProbeTimeoutMs(connection)), which = defaultWhich) {
103
- const targets = collectRequiredEngineTargets(plan);
104
- if (targets.length === 0)
105
- return [];
106
- const probesByConnection = new Map();
107
- const probeConnectionOnce = (connection) => {
108
- const key = `${connection.endpoint.replace(/\/+$/, "")}|${connection.model}`;
109
- let pending = probesByConnection.get(key);
110
- if (!pending) {
111
- const probeStartedAt = Date.now();
112
- pending = probeReachable(connection).then((reach) => ({ reach, latencyMs: Date.now() - probeStartedAt }));
113
- probesByConnection.set(key, pending);
114
- }
115
- return pending;
116
- };
117
- const probed = await Promise.all(targets.map(async (target) => {
118
- if (target.bin !== undefined && which(target.bin) === undefined) {
119
- return { ...target, reach: { reachable: false, error: `${target.bin} is not on PATH` }, latencyMs: 0 };
120
- }
121
- if (!target.connection)
122
- return { ...target, reach: { reachable: true }, latencyMs: 0 };
123
- if (target.error)
124
- return { ...target, reach: { reachable: false, error: target.error }, latencyMs: 0 };
125
- return { ...target, ...(await probeConnectionOnce(target.connection)) };
126
- }));
127
- const unreachable = probed.filter((item) => !item.reach.reachable);
128
- if (unreachable.length > 0) {
129
- const lines = unreachable.map((item) => ` - ${item.process} (engine "${item.engine}", ${item.connection?.endpoint ?? item.bin}): ${item.reach.error ?? "did not respond"}`);
130
- throw new ConfigError(`--require-engines: ${unreachable.length} improve process${unreachable.length === 1 ? "" : "es"} cannot run because ${unreachable.length === 1 ? "its" : "their"} engine completion path is not reachable:\n${lines.join("\n")}`, "LLM_NOT_CONFIGURED", "Check that each listed endpoint is up and serves its model, and that each listed agent binary is installed. The endpoint probe is one short completion, bounded by the engine's timeoutMs (at most two minutes).");
131
- }
132
- return probed.map((item) => ({
133
- process: item.process,
134
- engine: item.engine,
135
- endpoint: item.connection?.endpoint ?? item.bin,
136
- reachable: item.reach.reachable,
137
- latencyMs: item.latencyMs,
138
- }));
139
- }
140
34
  /** `--show-prompt` (#952): print reflect's composed prompt for one ref — no lock, write or dispatch. */
141
35
  async function runShowPromptCli(refArg, parsedRef, taskArg, targetArg, resolvedPlan) {
142
36
  const readSource = resolveImproveReadSource(resolvedPlan.config, parsedRef, targetArg);
@@ -145,6 +39,9 @@ async function runShowPromptCli(refArg, parsedRef, taskArg, targetArg, resolvedP
145
39
  ...(taskArg ? { task: taskArg } : {}),
146
40
  improveProfile: resolvedPlan.strategy.config,
147
41
  config: resolvedPlan.config,
42
+ // A strategy that turns reflect off froze no runner for it; the preview resolves its own.
43
+ ...(resolvedPlan.processes.reflect.runner ? { llmRunner: resolvedPlan.processes.reflect.runner } : {}),
44
+ ...(resolvedPlan.run ? { run: resolvedPlan.run } : {}),
148
45
  stashDir: readSource.source.path,
149
46
  });
150
47
  const outputMode = getOutputMode();
@@ -184,7 +81,7 @@ const improveReportCommand = defineJsonCommand({
184
81
  });
185
82
  /**
186
83
  * `akm improve judge`: reflect's quality judge on one revision, read as
187
- * `{"source", "candidate", "feedback"}` JSON from stdin, with the engine the
84
+ * `{"source", "candidate", "feedback"}` JSON from stdin, on the connection or harness the
188
85
  * strategy's reflect quality gate names. It writes nothing.
189
86
  */
190
87
  const improveJudgeCommand = defineJsonCommand({
@@ -209,7 +106,7 @@ const improveJudgeCommand = defineJsonCommand({
209
106
  const config = loadConfig();
210
107
  const judge = resolveQualityGateJudge(config, resolveImproveStrategy(getStringArg(args, "strategy"), config).config, "reflect");
211
108
  if (!judge) {
212
- throw new ConfigError("`akm improve judge` judges with the reflect quality gate's engine. Set processes.reflect.qualityGate.engine.", "INVALID_CONFIG_FILE");
109
+ throw new ConfigError("`akm improve judge` judges with the reflect quality gate's connection or harness. Set improve.qualityGate.connection.", "INVALID_CONFIG_FILE");
213
110
  }
214
111
  const notes = typeof feedback === "string" && feedback.trim() !== "" ? [feedback.trim()] : [];
215
112
  const verdict = await runReflectQualityJudge(config, candidate, source, notes, undefined, {
@@ -217,7 +114,7 @@ const improveJudgeCommand = defineJsonCommand({
217
114
  llmRunner: judge,
218
115
  ...(typeof ref === "string" && ref ? { ref } : {}),
219
116
  });
220
- output("improve-judge", { engine: judge.engine, ...verdict });
117
+ output("improve-judge", { engine: judge.name, ...verdict });
221
118
  },
222
119
  });
223
120
  /** The subcommands `setup` withheld for this run, restored by `cleanup` (one command runs per process; in-process tests run many). */
@@ -282,20 +179,18 @@ export const improveCommand = defineCommand({
282
179
  description: "If another improve run already holds the lock, skip gracefully (exit 0) instead of failing with 'already running' (exit 75). Use for high-frequency scheduled runs so they don't pile up failures while a longer run is in progress.",
283
180
  default: false,
284
181
  },
285
- "require-engines": {
286
- type: "boolean",
287
- description: "Abort before any indexing, lock, or log side effect (exit 78) if the active strategy would enable a process whose engine or credential cannot be resolved in this process's environment, OR whose endpoint fails a bounded reachability probe (the same probe akm health runs). Without this flag, improve degrades gracefully instead: it skips the affected processes and reports them in the result's skippedProcesses. Recommended alongside --skip-if-locked for scheduled runs.",
288
- default: false,
289
- },
182
+ // Retired: a run already stops at planning (exit 78) when no process has a connection or harness to run on.
183
+ "require-engines": { type: "boolean", hidden: true, description: "Retired: has no effect." },
290
184
  "show-prompt": {
291
185
  type: "boolean",
292
- description: "Print the composed reflect prompt for one asset ref and exit — no lock, index write, or engine dispatch (#952). Requires a fully-qualified asset ref as the scope positional (e.g. `akm improve lessons/my-lesson --show-prompt`). JSON/yaml format carries the prompt as a `prompt` field; text format prints it directly.",
186
+ description: "Print the composed reflect prompt for one asset ref and exit — no lock, index write, or model call (#952). Requires a fully-qualified asset ref as the scope positional (e.g. `akm improve lessons/my-lesson --show-prompt`). JSON/yaml format carries the prompt as a `prompt` field; text format prints it directly.",
293
187
  default: false,
294
188
  },
295
189
  strategy: {
296
190
  type: "string",
297
- description: "Named improve strategy from improve.strategies or built-in strategies (consolidate, default). Controls which sub-processes run and which asset types are processed.",
191
+ description: "Named improve strategy from improve.strategies or built-in strategies (consolidate, default). Controls which sub-processes run and which asset types are processed, never where they run.",
298
192
  },
193
+ ...SELECTION_ARGS,
299
194
  sync: {
300
195
  type: "boolean",
301
196
  description: "Sync the git-backed primary bundle like `akm sync` (fetch and merge the upstream, commit, push) before the run, and commit (and optionally push) when it finishes. Use --no-sync to disable. Default: on for git-backed bundles (per profile config).",
@@ -310,6 +205,9 @@ export const improveCommand = defineCommand({
310
205
  // citty runs this body after a subcommand it dispatched too.
311
206
  if (hasSubcommand(args, new Set(Object.keys(IMPROVE_SUBCOMMANDS))))
312
207
  return;
208
+ if (args["require-engines"]) {
209
+ warnOnce("retired-flag:--require-engines", "--require-engines is retired and has no effect: akm improve already stops at planning (exit 78) when no process has a connection or harness to run on, and `akm health` checks the connections and harnesses.");
210
+ }
313
211
  const jsonToStdout = args["json-to-stdout"];
314
212
  const targetArg = getStringArg(args, "bundle");
315
213
  const taskArg = getStringArg(args, "task");
@@ -320,6 +218,8 @@ export const improveCommand = defineCommand({
320
218
  const requireFeedbackSignal = args["require-feedback-signal"];
321
219
  const skipIfLocked = args["skip-if-locked"];
322
220
  const strategyArg = getStringArg(args, "strategy");
221
+ // What the run selected is the nearest layer of every call in it, judges included.
222
+ const run = selectionFromArgs(args);
323
223
  const effectiveConfig = loadConfig();
324
224
  const scopeArg = getStringArg(args, "scope");
325
225
  const scopeRef = scopeArg && isFullRefInput(scopeArg) ? parseRefInput(scopeArg) : undefined;
@@ -330,7 +230,7 @@ export const improveCommand = defineCommand({
330
230
  : resolveWriteTarget(effectiveConfig, targetArg, { flag: IMPROVE_TARGET_FLAG });
331
231
  // Every model-backed process resolves before any side effect; a dry run
332
232
  // never dispatches, so it tolerates every process being disabled.
333
- const resolvedPlan = resolveImprovePlan(strategyArg, effectiveConfig, { allowAllDisabled: Boolean(dryRun) });
233
+ const resolvedPlan = resolveImprovePlan(strategyArg, effectiveConfig, Object.keys(run).length > 0 ? { run } : {});
334
234
  if (args["show-prompt"]) {
335
235
  if (!scopeArg || !scopeRef) {
336
236
  throw new UsageError("`--show-prompt` requires a fully-qualified asset ref as the scope (e.g. `akm improve lessons/my-lesson --show-prompt`).", "INVALID_FLAG_VALUE");
@@ -338,13 +238,8 @@ export const improveCommand = defineCommand({
338
238
  await runShowPromptCli(scopeArg, scopeRef, taskArg, targetArg, resolvedPlan);
339
239
  return;
340
240
  }
341
- let engineProbe;
342
- if (args["require-engines"]) {
343
- assertRequiredEnginesAvailable(resolvedPlan);
344
- engineProbe = await assertRequiredEnginesReachable(resolvedPlan);
345
- }
346
241
  const selectedStrategyName = resolvedPlan.strategy.name;
347
- const sensitiveValues = collectEngineCredentialValues(effectiveConfig);
242
+ const sensitiveValues = collectCredentialValues(effectiveConfig);
348
243
  // Only flags actually passed override the strategy's `sync` block.
349
244
  const syncFlag = args.sync;
350
245
  const pushFlag = args.push;
@@ -403,7 +298,6 @@ export const improveCommand = defineCommand({
403
298
  ...(requireFeedbackSignal ? { requireFeedbackSignal } : {}),
404
299
  ...(skipIfLocked ? { skipIfLocked } : {}),
405
300
  ...(strategyArg !== undefined ? { strategy: strategyArg } : {}),
406
- ...(engineProbe !== undefined ? { engineProbe } : {}),
407
301
  onBudgetHardKill: () => persistTerminated("budget_exhausted"),
408
302
  ...(Object.keys(syncOverride).length > 0 ? { sync: syncOverride } : {}),
409
303
  }),