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
@@ -4,21 +4,19 @@
4
4
  import path from "node:path";
5
5
  import { defineCommand } from "citty";
6
6
  import { getParsedInvocation } from "../../cli/invocation.js";
7
- import { getStringArg, parseAutoAcceptFlag, parsePositiveIntFlag } from "../../cli/parse-args.js";
8
- import { output, runWithJsonErrors } from "../../cli/shared.js";
7
+ import { getStringArg, parsePositiveIntFlag } from "../../cli/parse-args.js";
8
+ import { GLOBAL_OUTPUT_ARGS, output, runWithJsonErrors } from "../../cli/shared.js";
9
+ import { isFullRefInput, parseRefInput } from "../../core/asset/resolve-ref.js";
9
10
  import { loadConfig } from "../../core/config/config.js";
10
11
  import { UsageError } from "../../core/errors.js";
12
+ import { resolveMutationTarget } from "../../core/mutation-target.js";
11
13
  import { getCacheDir } from "../../core/paths.js";
12
14
  import { redactSensitiveText } from "../../core/redaction.js";
13
- import { withStateDb } from "../../core/state-db.js";
14
- import { clearLogFile, setLogFile } from "../../core/warn.js";
15
+ import { clearLogFile, setLogFile, warn } from "../../core/warn.js";
15
16
  import { resolveWriteTarget } from "../../core/write-source.js";
16
17
  import { collectEngineCredentialValues } from "../../integrations/agent/engine-resolution.js";
17
- import { getActiveCanaries, queryRecentCycleMetrics } from "../../storage/repositories/canaries-repository.js";
18
- import { closeDatabase, openExistingDatabase } from "../../storage/repositories/index-connection.js";
19
- import { refreshCanarySet } from "./collapse-detector.js";
20
18
  import { akmImprove } from "./improve.js";
21
- import { buildImproveRunId, improveRunLocator, recordImproveRunResult, recordTerminatedImproveRun, } from "./improve-result-file.js";
19
+ import { buildImproveRunId, recordImproveRunResult, recordTerminatedImproveRun, } from "./improve-result-file.js";
22
20
  import { runImproveSession } from "./improve-session.js";
23
21
  import { resolveImprovePlan } from "./improve-strategies.js";
24
22
  let akmImproveForRun = akmImprove;
@@ -26,89 +24,79 @@ let akmImproveForRun = akmImprove;
26
24
  export function _setAkmImproveForTests(fake) {
27
25
  akmImproveForRun = fake ?? akmImprove;
28
26
  }
29
- // R5 — collapse-detector canary set inspection / explicit refresh. The
30
- // detector NEVER auto-refreshes the canary set (silent re-baselining is how a
31
- // slow collapse hides); this verb is the only refresh path.
32
- //
33
- // Dispatched from the parent improve run() on `scope === "canary"` — NOT a
34
- // citty subCommand: registering subCommands makes citty treat EVERY first
35
- // positional as a subcommand name, breaking `akm improve <type|ref>` outright
36
- // (citty throws "Unknown command memory"), and citty also re-runs the parent
37
- // run() after a matched subcommand.
38
- async function runCanaryInspection(refresh) {
39
- const config = loadConfig();
40
- const cfg = config.improve?.collapseDetector ?? {};
41
- const result = withStateDb((stateDb) => {
42
- let refreshOutcome;
43
- if (refresh) {
44
- const indexDb = openExistingDatabase();
45
- try {
46
- // Mint-first, deactivate-after (refreshCanarySet): an empty/unreadable
47
- // index keeps the old baseline instead of destroying it.
48
- refreshOutcome = refreshCanarySet(stateDb, indexDb, cfg) === null ? "kept-old-set" : "refreshed";
49
- }
50
- finally {
51
- closeDatabase(indexDb);
52
- }
53
- }
54
- const canaries = getActiveCanaries(stateDb);
55
- const canarySetId = canaries[0]?.canary_set_id;
56
- const recentCycles = canarySetId ? queryRecentCycleMetrics(stateDb, canarySetId, cfg.windowCycles ?? 5) : [];
57
- return {
58
- schemaVersion: 1,
59
- ok: true,
60
- refreshed: refreshOutcome === "refreshed",
61
- ...(refreshOutcome === "kept-old-set"
62
- ? { warning: "refresh skipped: no mintable learning entries in the index — existing canary set kept" }
63
- : {}),
64
- canarySetId: canarySetId ?? null,
65
- canaries: canaries.map((c) => ({ id: c.id, anchorRef: c.anchor_ref, query: c.query })),
66
- recentCycles: recentCycles.map((r) => ({
67
- ts: r.ts,
68
- pass: r.pass,
69
- meanRecall: r.mean_recall,
70
- meanNdcg: r.mean_ndcg,
71
- distinctContentRatio: r.distinct_content_ratio,
72
- acceptedActions: r.accepted_actions,
73
- mergeFloorViolations: r.merge_floor_violations,
74
- alerts: JSON.parse(r.alerts_json),
75
- })),
76
- };
77
- });
78
- output("improve-canary", result);
27
+ /**
28
+ * Handle the `--auto-accept` flag retired in 0.9.0, returning the scope the run
29
+ * should actually use.
30
+ *
31
+ * citty is non-strict, so the removed flag is silently absorbed rather than
32
+ * rejected — which is the dangerous case. The SPACE-separated spelling
33
+ * (`--auto-accept 90`) leaves `90` sitting in the positional slot, where it is
34
+ * read as the asset-type scope: the run then matches nothing and exits 0, so a
35
+ * 0.8-era crontab goes dark with no error at all. Warn about the flag, and drop
36
+ * the poisoned positional so the run behaves as an unscoped improve instead.
37
+ */
38
+ function resolveScopeAfterRetiredAutoAccept(scopeArg) {
39
+ const invocation = getParsedInvocation();
40
+ const autoAcceptRaw = invocation.getFlagValue("--auto-accept");
41
+ if (autoAcceptRaw === undefined && !invocation.hasFlag("--auto-accept"))
42
+ return scopeArg;
43
+ warn("[improve] --auto-accept was removed in 0.9 and is ignored; proposals always queue for review. " +
44
+ "Replacement: `akm improve && akm proposal drain --promote --yes`, or a `triage` block with " +
45
+ 'applyMode: "promote" in your strategy. It becomes a hard error in 0.10.');
46
+ if (scopeArg !== undefined && scopeArg === autoAcceptRaw) {
47
+ warn(`[improve] ignoring "${scopeArg}" as a scope — it is the removed --auto-accept flag's value.`);
48
+ return undefined;
49
+ }
50
+ return scopeArg;
51
+ }
52
+ /**
53
+ * `akm improve canary` was removed in 0.9 (moved to
54
+ * `scripts/refresh-canary-set.ts`). Without this check "canary" falls through
55
+ * to the generic scope positional, where resolveImproveScope treats any bare
56
+ * word as a type filter that matches zero entries — so an unmigrated caller
57
+ * silently acquires the improve lock and exits 0 having done nothing, instead
58
+ * of getting an error.
59
+ */
60
+ function rejectRetiredCanaryScope(scopeArg) {
61
+ if (scopeArg !== "canary")
62
+ return;
63
+ throw new UsageError('"akm improve canary" was removed in 0.9. Use `bun scripts/refresh-canary-set.ts [--refresh]` instead.', "INVALID_FLAG_VALUE");
64
+ }
65
+ /**
66
+ * `--target` was renamed to `--bundle` on `improve` in 0.9 (S8). citty is
67
+ * non-strict, so the retired spelling is silently absorbed rather than
68
+ * rejected — accepted proposals then write into the default bundle instead
69
+ * of the one the caller named, with exit 0 and no error. Reject it
70
+ * explicitly instead.
71
+ */
72
+ function rejectRetiredImproveTargetFlag() {
73
+ if (!getParsedInvocation().hasFlag("--target"))
74
+ return;
75
+ throw new UsageError("`akm improve --target` was renamed to `--bundle` in 0.9. Use `--bundle <name>` instead.", "INVALID_FLAG_VALUE");
79
76
  }
80
77
  export const improveCommand = defineCommand({
81
78
  meta: {
82
79
  name: "improve",
83
- description: "Analyze existing AKM assets and generate improvement proposals; also consolidates memories when the selected strategy enables consolidate. `akm improve canary [--refresh]` inspects the collapse-detector canary set.",
80
+ description: "Analyze existing AKM assets and generate improvement proposals; also consolidates memories when the selected strategy enables consolidate.",
84
81
  },
82
+ // Raw defineCommand, so the global output flags are declared here explicitly.
83
+ // Without them citty treats `--format` as a boolean and its space-separated
84
+ // value falls through to the `scope` positional.
85
85
  args: {
86
+ ...GLOBAL_OUTPUT_ARGS,
86
87
  scope: {
87
88
  type: "positional",
88
89
  description: "Optional asset type or asset ref to improve",
89
90
  required: false,
90
91
  },
91
92
  task: { type: "string", description: "Add extra guidance for this improvement pass" },
92
- refresh: {
93
- type: "boolean",
94
- description: "(canary scope only) Mint a new collapse-detector canary set and deactivate the old one; old rows and their cycle history are retained",
95
- default: false,
96
- },
97
93
  "dry-run": { type: "boolean", description: "Show planned actions without writing", default: false },
98
- target: { type: "string", description: "Override the write target for accepted proposals" },
99
- "auto-accept": {
100
- type: "string",
101
- description: "DEPRECATED and ignored (the 0.9.0 confidence gate was removed; proposals queue for review via `akm proposal` / the drain engine). Accepted for one minor so existing crontabs keep working; removed in 0.10.",
102
- },
94
+ bundle: { type: "string", description: "Override the write target for accepted proposals" },
103
95
  limit: { type: "string", description: "Maximum number of assets to process (highest utility first)" },
104
96
  "timeout-ms": {
105
97
  type: "string",
106
98
  description: "Wall-clock budget for the entire run in milliseconds (default: 7200000 = 2 hours)",
107
99
  },
108
- "consolidate-recovery": {
109
- type: "string",
110
- description: "How to handle stale/incomplete consolidation journals: abort (default) or clean (remove stale journal artifacts)",
111
- },
112
100
  "require-feedback-signal": {
113
101
  type: "boolean",
114
102
  description: "Only process assets with recent feedback signals (disables the proactive/high-salience fallback lanes)",
@@ -116,7 +104,7 @@ export const improveCommand = defineCommand({
116
104
  },
117
105
  "json-to-stdout": {
118
106
  type: "boolean",
119
- description: "Emit the full JSON result on stdout (legacy behaviour). (0.8.0+: full result is recorded in the improve_runs table of state.db and stdout is empty; use this flag for the prior behaviour, e.g. `akm improve --json-to-stdout | jq`.)",
107
+ description: "Also emit the full persisted run result on stdout as JSON.",
120
108
  default: false,
121
109
  },
122
110
  "skip-if-locked": {
@@ -126,11 +114,11 @@ export const improveCommand = defineCommand({
126
114
  },
127
115
  strategy: {
128
116
  type: "string",
129
- description: "Named improve strategy from improve.strategies or built-in strategies (default, quick, thorough, memory-focus, graph-refresh). Controls which sub-processes run and which asset types are processed.",
117
+ description: "Named improve strategy from improve.strategies or built-in strategies (catchup, consolidate, default, frequent, graph-refresh, memory-focus, proactive-maintenance, quick, reflect-distill, thorough). Controls which sub-processes run and which asset types are processed.",
130
118
  },
131
119
  sync: {
132
120
  type: "boolean",
133
- description: "Commit (and optionally push) the git-backed primary stash when the run finishes. Use --no-sync to disable. Default: on for git-backed stashes (per profile config).",
121
+ description: "Commit (and optionally push) the git-backed primary bundle when the run finishes. Use --no-sync to disable. Default: on for git-backed bundles (per profile config).",
134
122
  },
135
123
  push: {
136
124
  type: "boolean",
@@ -138,39 +126,32 @@ export const improveCommand = defineCommand({
138
126
  },
139
127
  },
140
128
  async run({ args }) {
141
- // "canary" is a reserved scope word (never a valid asset type, and refs
142
- // contain ":"): dispatch to the detector inspection verb instead of an
143
- // improve run.
144
- if (args.scope === "canary") {
145
- await runWithJsonErrors(() => runCanaryInspection(args.refresh));
146
- return;
147
- }
148
129
  await runWithJsonErrors(async () => {
149
- const formatFlagValue = getParsedInvocation().getFlagValue("--format");
150
- if (formatFlagValue !== undefined) {
151
- throw new UsageError(`akm improve does not accept --format. That flag controls output formatting for other commands (search, show, etc.).\n` +
152
- `Did you mean: akm improve (no --format flag)?`, "INVALID_FLAG_VALUE");
153
- }
130
+ rejectRetiredImproveTargetFlag();
131
+ // D7 — `--format` used to be rejected here outright. It is a global flag on
132
+ // a command that does emit an envelope through `output()` (always on
133
+ // `--dry-run`, otherwise with `--json-to-stdout`), so rejecting it made
134
+ // improve a fourth inconsistent format behaviour rather than a documented
135
+ // exemption. It now applies to that envelope; progress output stays on
136
+ // stderr regardless.
154
137
  const jsonToStdout = args["json-to-stdout"];
155
- // Deprecated (0.9.0): warns when present, has no effect. Removed in 0.10.
156
- parseAutoAcceptFlag(args["auto-accept"]);
157
- const targetArg = getStringArg(args, "target");
138
+ const targetArg = getStringArg(args, "bundle");
158
139
  const taskArg = getStringArg(args, "task");
159
140
  const dryRun = args["dry-run"];
160
141
  const limitRaw = parsePositiveIntFlag(args.limit ?? undefined);
161
142
  const timeoutMs = parsePositiveIntFlag(args["timeout-ms"], "--timeout-ms");
162
- const consolidateRecoveryRaw = args["consolidate-recovery"];
163
- const consolidateRecovery = consolidateRecoveryRaw === undefined
164
- ? undefined
165
- : consolidateRecoveryRaw.trim().toLowerCase();
166
- if (consolidateRecovery !== undefined && consolidateRecovery !== "abort" && consolidateRecovery !== "clean") {
167
- throw new UsageError(`Invalid --consolidate-recovery value: "${consolidateRecoveryRaw}". Must be one of: abort, clean.`, "INVALID_FLAG_VALUE");
168
- }
169
143
  const requireFeedbackSignal = args["require-feedback-signal"];
170
144
  const skipIfLocked = args["skip-if-locked"];
171
145
  const strategyArg = getStringArg(args, "strategy");
172
146
  const effectiveConfig = loadConfig();
173
- const writeTarget = resolveWriteTarget(effectiveConfig, targetArg, { requireWritable: !dryRun });
147
+ const scopeArg = resolveScopeAfterRetiredAutoAccept(getStringArg(args, "scope"));
148
+ rejectRetiredCanaryScope(scopeArg);
149
+ const scopeRef = scopeArg && isFullRefInput(scopeArg) ? parseRefInput(scopeArg) : undefined;
150
+ const writeTarget = dryRun
151
+ ? undefined
152
+ : scopeRef
153
+ ? resolveMutationTarget(effectiveConfig, scopeRef, targetArg).target
154
+ : resolveWriteTarget(effectiveConfig, targetArg);
174
155
  // Resolve every enabled model-backed process before logging, signal
175
156
  // lifecycle setup, or any filesystem/database side effect.
176
157
  const resolvedPlan = resolveImprovePlan(strategyArg, effectiveConfig);
@@ -197,9 +178,8 @@ export const improveCommand = defineCommand({
197
178
  // was minted at end-of-run, so SIGTERM'd runs (cron timeout) left no
198
179
  // row in improve_runs and effectively disappeared from `akm health`.
199
180
  const runId = buildImproveRunId();
200
- const primaryStashDir = writeTarget.source.path;
201
- const scopeArg = getStringArg(args, "scope");
202
- const inferredScopeMode = (scopeArg ?? "").includes(":") ? "ref" : scopeArg ? "type" : "all";
181
+ const primaryStashDir = writeTarget?.source.path;
182
+ const inferredScopeMode = scopeRef ? "ref" : scopeArg ? "type" : "all";
203
183
  // Signal handler + exception path both flow through this helper so
204
184
  // every abnormal termination produces a row with ok:false and a
205
185
  // reason in metadata.terminated.
@@ -243,7 +223,7 @@ export const improveCommand = defineCommand({
243
223
  dryRun,
244
224
  resolvedPlan,
245
225
  target: targetArg,
246
- writeTarget,
226
+ ...(writeTarget ? { writeTarget } : {}),
247
227
  ...(runId !== undefined ? { runId } : {}),
248
228
  ...(limitRaw !== undefined ? { limit: limitRaw } : {}),
249
229
  ...(timeoutMs !== undefined ? { timeoutMs } : {}),
@@ -255,7 +235,6 @@ export const improveCommand = defineCommand({
255
235
  target: targetArg,
256
236
  dryRun,
257
237
  task: taskArg,
258
- ...(consolidateRecovery !== undefined ? { recoveryMode: consolidateRecovery } : {}),
259
238
  },
260
239
  }),
261
240
  }, {
@@ -278,12 +257,15 @@ export const improveCommand = defineCommand({
278
257
  finally {
279
258
  clearLogFile();
280
259
  }
281
- const durationMs = Date.now() - startedAtMs;
282
- if (dryRun || jsonToStdout) {
260
+ if (dryRun) {
283
261
  // A dry-run never persists its result, so stdout is its only result
284
- // channel. --json-to-stdout remains the live-run escape hatch.
262
+ // channel. F4: was `process.exit(0)`, which terminates synchronously
263
+ // and skips pending cleanup (e.g. the `finally { clearLogFile(); }`
264
+ // above already ran, but any citty/runWithJsonErrors-level cleanup
265
+ // on the way out would not). Exit code is 0 either way — `return`
266
+ // alone is sufficient since success is the default `process.exitCode`.
285
267
  output("improve", improveResult);
286
- process.exit(0);
268
+ return;
287
269
  }
288
270
  // Default mode (0.8.0+): persist the full result as a row in the
289
271
  // `improve_runs` table of state.db (migration 003) and emit NOTHING
@@ -299,7 +281,6 @@ export const improveCommand = defineCommand({
299
281
  // ORDER BY started_at DESC LIMIT 10"
300
282
  // runId + primaryStashDir minted up-top so signal handlers can record
301
283
  // partial runs; reuse them here for the success path.
302
- const resultRef = improveRunLocator(runId);
303
284
  runRecorded = true; // Suppress any late signal-handler write — the success path owns the row now.
304
285
  if (primaryStashDir) {
305
286
  try {
@@ -308,15 +289,18 @@ export const improveCommand = defineCommand({
308
289
  catch (err) {
309
290
  // Stderr warning on the failure path is preferable to crashing
310
291
  // the run after all the work has completed.
311
- process.stderr.write(`warning: failed to record improve run ${resultRef}: ${err instanceof Error ? err.message : String(err)}\n`);
292
+ process.stderr.write(`warning: failed to record improve run ${runId}: ${err instanceof Error ? err.message : String(err)}\n`);
312
293
  }
313
294
  }
314
295
  else {
315
- process.stderr.write(`warning: no writable stash directory resolved; improve result not persisted to state.db (use --json-to-stdout to capture)\n`);
296
+ process.stderr.write(`warning: no writable bundle directory resolved; improve result not persisted to state.db (use --json-to-stdout to capture)\n`);
316
297
  }
317
- // durationMs reserved for future use (no console emission today).
318
- void durationMs;
319
- process.exit(0);
298
+ if (jsonToStdout)
299
+ output("improve", improveResult);
300
+ // F4: was `process.exit(0)` — the run has already been fully recorded
301
+ // above (recordImproveRunResult / the warning path), so nothing here
302
+ // depends on an immediate synchronous exit. This is the last statement
303
+ // in the handler, so a plain fall-through is equivalent.
320
304
  });
321
305
  },
322
306
  });
@@ -9,8 +9,7 @@
9
9
  * `improve_runs` table of `state.db` (migration 003). Stdout is empty.
10
10
  * The existing `[improve] ...` progress log lines on stderr remain the
11
11
  * canonical console UX.
12
- * - `--json-to-stdout` restores the prior behaviour: full JSON to stdout,
13
- * nothing written to state.db.
12
+ * - `--json-to-stdout` additionally emits the persisted result as JSON.
14
13
  *
15
14
  * v0.8.0 storage change (this module): the previous on-disk artifact at
16
15
  * `<stash>/.akm/runs/<runId>/improve-result.json` is no longer written. The
@@ -26,7 +25,6 @@
26
25
  * single-slot artefact. We mint a fresh timestamped id for each improve run.
27
26
  */
28
27
  import crypto from "node:crypto";
29
- import path from "node:path";
30
28
  import { decodeImproveResult } from "../../core/improve-result.js";
31
29
  import { redactSensitiveValue } from "../../core/redaction.js";
32
30
  import { withStateDb } from "../../core/state-db.js";
@@ -45,32 +43,9 @@ export function buildImproveRunId(now = new Date()) {
45
43
  const rand = crypto.randomBytes(4).toString("hex");
46
44
  return `${iso}-${rand}`;
47
45
  }
48
- /**
49
- * Return a stable, human-recognisable reference for a given improve run.
50
- *
51
- * Historical compatibility shim: callers used to receive a stash-relative
52
- * file path like `.akm/runs/<runId>/improve-result.json`. With the state.db
53
- * migration, no such file exists, but several callers still log "wrote to
54
- * <path>" style messages. Returning a `state.db//improve_runs/<runId>`
55
- * locator preserves the "the result is at <thing>" signature so existing
56
- * log lines and error messages continue to make sense without rewriting
57
- * every call site.
58
- */
59
- export function improveRunLocator(runId) {
60
- return path.join("state.db", "improve_runs", runId);
61
- }
62
46
  /**
63
47
  * Persist the full improve result into the `improve_runs` table of state.db.
64
48
  *
65
- * Backwards-compatible signature: the argument list and return type match the
66
- * pre-0.8.0 file-writing helper (the 0.9.0 rename from `writeImproveResultFile`
67
- * corrects the name, which had lied about writing a file). The returned
68
- * string is the `state.db//improve_runs/<runId>` locator (see
69
- * {@link improveRunLocator}), which is intended for log messages
70
- * only — no caller should treat it as a filesystem path. Zero current
71
- * readers existed for the previous file path, so this is a pure storage
72
- * swap.
73
- *
74
49
  * The state.db row carries the scope and dry-run flag from `result.scope`
75
50
  * and `result.dryRun`, plus the full result JSON for full fidelity. The
76
51
  * dry-run column is indexed so productivity audits can filter cleanly
@@ -94,7 +69,6 @@ export function recordImproveRunResult(stashDir, runId, result, startedAt, sensi
94
69
  completedAt,
95
70
  stashDir,
96
71
  dryRun: Boolean(result.dryRun),
97
- legacyProfile: redactSensitiveValue(decoded.legacyProfile, sensitiveValues),
98
72
  strategy: redactSensitiveValue(decoded.strategy, sensitiveValues),
99
73
  scopeMode: result.scope?.mode ?? "all",
100
74
  scopeValue: persistedResult.scope?.value ?? null,
@@ -103,7 +77,6 @@ export function recordImproveRunResult(stashDir, runId, result, startedAt, sensi
103
77
  result: persistedResult,
104
78
  });
105
79
  });
106
- return improveRunLocator(runId);
107
80
  }
108
81
  /**
109
82
  * Persist an improve_runs row for a run that did NOT complete normally.
@@ -16,6 +16,7 @@ import { deepMergeConfig } from "../../core/config/deep-merge.js";
16
16
  import { BUILTIN_IMPROVE_STRATEGY_NAMES, IMPROVE_PROCESS_ENGINE_CAPABILITIES, } from "../../core/config/engine-semantics.js";
17
17
  import { ConfigError } from "../../core/errors.js";
18
18
  import { resolveImproveProcessRunner, resolveTriageJudgmentRunner, } from "../../integrations/agent/runner.js";
19
+ import { applyAutonomyGate } from "./autonomy-gate.js";
19
20
  export const DEFAULT_ALLOWED_TYPES = {
20
21
  reflect: ["agent", "command", "knowledge", "lesson", "memory", "skill", "workflow"],
21
22
  distill: ["memory"],
@@ -66,9 +67,6 @@ export function resolveImproveStrategy(name, config) {
66
67
  const resolved = deepMergeConfig(baseStrategy, (userStrategies[selectedName] ?? {}));
67
68
  return { name: selectedName, config: resolved };
68
69
  }
69
- export function resolveStrategyProcessEnabled(strategy, processName) {
70
- return resolveProcessEnabled(processName, strategy.config);
71
- }
72
70
  function cloneAndFreeze(value) {
73
71
  const clone = structuredClone(value);
74
72
  const freeze = (item) => {
@@ -83,8 +81,13 @@ function cloneAndFreeze(value) {
83
81
  }
84
82
  /** Resolve every enabled process structurally before improve emits signals or performs I/O. */
85
83
  export function resolveImprovePlan(name, config, options = {}) {
86
- const strategy = resolveImproveStrategy(name, config);
87
- return buildImprovePlan(strategy, config, options);
84
+ const selected = resolveImproveStrategy(name, config);
85
+ // D8 — gate autonomy BEFORE the plan is built, so every downstream consumer
86
+ // (process enablement, LLM preflight, triage judgment) sees one already-safe
87
+ // strategy rather than each having to re-ask whether autonomy is allowed.
88
+ const { config: gatedStrategyConfig, gated } = applyAutonomyGate(selected.config, config);
89
+ const strategy = { name: selected.name, config: gatedStrategyConfig };
90
+ return { ...buildImprovePlan(strategy, config, options), autonomyGated: gated };
88
91
  }
89
92
  function buildImprovePlan(strategy, config, options) {
90
93
  const processes = {};