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,11 +4,13 @@
4
4
  import fs from "node:fs";
5
5
  import path from "node:path";
6
6
  import { assertNever } from "../../core/assert.js";
7
+ import { parseRefInput } from "../../core/asset/resolve-ref.js";
7
8
  import { daysToMs } from "../../core/common.js";
8
- import { loadConfig } from "../../core/config/config.js";
9
- import { rethrowIfTestIsolationError } from "../../core/errors.js";
9
+ import { bundlesToSourceEntries, loadConfig } from "../../core/config/config.js";
10
+ import { ConfigError, rethrowIfTestIsolationError, UsageError } from "../../core/errors.js";
10
11
  import { appendEvent, readEvents } from "../../core/events.js";
11
12
  import { classifyImproveAction, foldDistillSkipped } from "../../core/improve-types.js";
13
+ import { resolveMutationTarget } from "../../core/mutation-target.js";
12
14
  import { getDbPath, getStateDbPathInDataDir } from "../../core/paths.js";
13
15
  import { redactSensitiveText } from "../../core/redaction.js";
14
16
  import { openStateDatabase } from "../../core/state-db.js";
@@ -16,16 +18,16 @@ import { info, warn } from "../../core/warn.js";
16
18
  import { resolveWritable, resolveWriteTarget } from "../../core/write-source.js";
17
19
  import { ensureIndex } from "../../indexer/ensure-index.js";
18
20
  import { akmIndex } from "../../indexer/indexer.js";
19
- import { resolveSourceEntries } from "../../indexer/search/search-source.js";
21
+ import { resolveEntryContentDir, resolveSourceEntries } from "../../indexer/search/search-source.js";
20
22
  import { collectEngineCredentialValues } from "../../integrations/agent/engine-resolution.js";
21
23
  import { materializeLlmRunnerConnection } from "../../integrations/agent/runner.js";
22
24
  import { installLlmUsagePersistence } from "../../llm/usage-persist.js";
23
- import { withLlmStage } from "../../llm/usage-telemetry.js";
24
25
  import { isGitBackedStash, listGitChangedPaths, resolveWritableOverride, saveGitStash, } from "../../sources/providers/git.js";
25
26
  import { closeDatabase, openExistingDatabase } from "../../storage/repositories/index-connection.js";
26
27
  import { getEntryCount } from "../../storage/repositories/index-entries-repository.js";
27
28
  import { drainProposals } from "../proposal/drain.js";
28
29
  import { resolveDrainPolicy } from "../proposal/drain-policies.js";
30
+ import { describeGatedLanes, isAutonomyLaneAllowed } from "./autonomy-gate.js";
29
31
  import { akmDistill } from "./distill.js";
30
32
  // Eligibility / candidate-selection predicates live in ./eligibility.
31
33
  import { buildLatestProposalTsMap, collectEligibleRefs, collectEligibleRefsReadOnly, memoryCleanupParentRef, resolveImproveScope, shouldAnalyzeMemoryCleanup, } from "./eligibility.js";
@@ -34,7 +36,6 @@ import { resolveImprovePlan } from "./improve-strategies.js";
34
36
  import { improveLockPath, MIN_IMPROVE_LOCK_STALE_MS, releaseImproveLock, tryAcquireImproveLock } from "./locks.js";
35
37
  // The cycle loop / post-loop / maintenance stages live in ./loop-stages.
36
38
  import { runImproveLoopStage, runImprovePostLoopStage } from "./loop-stages.js";
37
- import { detectAndWriteContradictions } from "./memory/memory-contradiction-detect.js";
38
39
  import { analyzeMemoryCleanup } from "./memory/memory-improve.js";
39
40
  // The pre-loop preparation pipeline lives in ./preparation.
40
41
  import { runImprovePreparationStage } from "./preparation.js";
@@ -42,7 +43,6 @@ import { DEFAULT_DUE_DAYS, filterProactiveDue } from "./proactive-maintenance.js
42
43
  import { akmReflect } from "./reflect.js";
43
44
  import { createRunContext } from "./run-context.js";
44
45
  import { errMessage } from "./shared.js";
45
- import { shouldReadLegacyBareImproveState } from "./source-identity.js";
46
46
  // Re-exported from ./loop-stages for test importers (improve-db-locking).
47
47
  export { runImproveMaintenancePasses } from "./loop-stages.js";
48
48
  export function renderSyncCommitMessage(template, result, nowMs) {
@@ -98,10 +98,19 @@ export async function akmImprove(options = {}) {
98
98
  let memorySummary = { eligible: 0, derived: 0 };
99
99
  let strategyFilteredRefs = [];
100
100
  let memoryCleanupPlan;
101
+ let autonomyGatedDirectLanes = [];
101
102
  let guidance;
102
103
  let triageDrain;
103
104
  let improveLockOwnership;
104
105
  let exitBackstop;
106
+ // I1: open a single state.db connection for the main improve run so all
107
+ // appendEvent calls reuse one handle instead of open/migrate/close per call.
108
+ let eventsDb;
109
+ // Start boundary-pinned for prepass telemetry, then replace this binding with
110
+ // the long-lived handle after the prepass. The usage sink resolves it per
111
+ // append, so one owner and counter span both lifecycle phases.
112
+ let eventsCtx = { dbPath: resolvedStateDbPath };
113
+ let disposeLlmUsageSink = () => { };
105
114
  const releaseRunLock = () => {
106
115
  const ownership = improveLockOwnership;
107
116
  if (!ownership)
@@ -114,6 +123,13 @@ export async function akmImprove(options = {}) {
114
123
  // Best-effort cleanup. Exact ownership prevents deleting a successor.
115
124
  }
116
125
  };
126
+ const commitStashBatch = makeCommitStashBatch({
127
+ run: setup,
128
+ getInitialGitPaths: () => initialGitPaths,
129
+ // Captured via getter: the live `eventsCtx` binding is reassigned after the
130
+ // prepass, and the catch-path sync must write through the current context.
131
+ getEventsCtx: () => eventsCtx,
132
+ });
117
133
  if (!options.dryRun) {
118
134
  const remainingBudget = budgetAbortController.signal.remainingBudgetMs;
119
135
  clearBudgetTimer = armBudgetWatchdog(Math.max(1, remainingBudget ?? budgetMs), budgetAbortController);
@@ -129,6 +145,7 @@ export async function akmImprove(options = {}) {
129
145
  return buildLockSkippedResult(selectedStrategy.name, scope, options.runId);
130
146
  }
131
147
  improveLockOwnership = acquisition.ownership;
148
+ disposeLlmUsageSink = installLlmUsagePersistence(() => eventsCtx);
132
149
  exitBackstop = releaseRunLock;
133
150
  process.on("exit", exitBackstop);
134
151
  initialGitPaths =
@@ -144,6 +161,7 @@ export async function akmImprove(options = {}) {
144
161
  memorySummary = collected.memorySummary;
145
162
  strategyFilteredRefs = collected.strategyFilteredRefs;
146
163
  memoryCleanupPlan = collected.memoryCleanupPlan;
164
+ autonomyGatedDirectLanes = collected.autonomyGatedDirectLanes;
147
165
  guidance = collected.guidance;
148
166
  preEnsureCleanupWarnings.push(...collected.warnings);
149
167
  if (options.dryRun) {
@@ -153,6 +171,9 @@ export async function akmImprove(options = {}) {
153
171
  }
154
172
  }
155
173
  catch (err) {
174
+ // If the live prepass fails, emit its summary and clear the owning sink
175
+ // before any run teardown. The disposer is idempotent with the main finalizer.
176
+ disposeLlmUsageSink();
156
177
  clearBudgetTimer();
157
178
  if (exitBackstop) {
158
179
  process.removeListener("exit", exitBackstop);
@@ -161,25 +182,6 @@ export async function akmImprove(options = {}) {
161
182
  releaseRunLock();
162
183
  throw err;
163
184
  }
164
- // I1: open a single state.db connection for the entire improve run so all
165
- // appendEvent calls reuse one handle instead of open/migrate/close per call.
166
- let eventsDb;
167
- // `eventsCtx` is read by the main catch (improve_failed) and finally, so it
168
- // lives in the outer scope. It is always assigned at the top of the try.
169
- // Pinned to the boundary snapshot so the fallback per-call `appendEvent`
170
- // opens (when the long-lived handle below fails to open) never re-read env.
171
- let eventsCtx = { dbPath: resolvedStateDbPath };
172
- // #576: clears the per-run LLM usage sink. Defaults to a no-op until the sink
173
- // is installed inside the try; the `finally` always calls it.
174
- let disposeLlmUsageSink = () => { };
175
- const commitStashBatch = makeCommitStashBatch({
176
- run: setup,
177
- getInitialGitPaths: () => initialGitPaths,
178
- // Captured via getter: the live `eventsCtx` binding is reassigned inside
179
- // the try below, and the catch-path sync must write through whichever
180
- // context is current (#662 / P6/P7 in the chunk-7 ledger).
181
- getEventsCtx: () => eventsCtx,
182
- });
183
185
  try {
184
186
  try {
185
187
  eventsDb = openStateDatabase(resolvedStateDbPath);
@@ -191,11 +193,6 @@ export async function akmImprove(options = {}) {
191
193
  // still pinned to the boundary-resolved path, never a live env re-read.
192
194
  eventsCtx = { dbPath: resolvedStateDbPath };
193
195
  }
194
- // #576: persist per-call LLM usage telemetry for this run as `llm_usage`
195
- // events, reusing the same boundary-pinned events context (and long-lived
196
- // handle when available). Disposed in `finally` so the sink never leaks
197
- // across runs. Wrapping is best-effort end to end — see usage-telemetry.ts.
198
- disposeLlmUsageSink = installLlmUsagePersistence(eventsCtx);
199
196
  // WI-9.10: construct the run's RunContext here — the first point after
200
197
  // run-setup where config/stashDir/eventsCtx/proposalsCtx/sourceRun/dryRun
201
198
  // are all in hand. See buildImproveRunContext for exactly which
@@ -206,6 +203,7 @@ export async function akmImprove(options = {}) {
206
203
  strategyFilteredRefs,
207
204
  plannedRefs,
208
205
  memoryCleanupPlan,
206
+ autonomyGatedDirectLanes,
209
207
  memorySummary,
210
208
  preEnsureCleanupWarnings,
211
209
  eventsCtx,
@@ -272,13 +270,33 @@ export async function akmImprove(options = {}) {
272
270
  }
273
271
  }
274
272
  }
275
- // ── akmImprove run-setup / stage-sequencing / run-teardown units ────────────
276
- // WI-7.7 step 1 (R31): the 810-line orchestrator body is decomposed into the
277
- // named units below. The two-try topology, all four early-exit paths, and the
278
- // exit-path cleanup ordering stay in akmImprove itself (they are the teardown
279
- // contract — see P1–P8 in the chunk-7 ledger); the units hold the straight-line
280
- // mass. Args objects carry the run-scoped values; return values replace the
281
- // old closure-mutated outer `let`s.
273
+ /** Resolve a dry-run inspection source without adapting it into a write target. */
274
+ function resolveImproveReadSource(config, scopedRef, explicitTarget, fallbackStashDir) {
275
+ if (scopedRef?.origin && explicitTarget && scopedRef.origin !== explicitTarget) {
276
+ throw new UsageError(`Qualified ref bundle "${scopedRef.origin}" conflicts with --target "${explicitTarget}".`, "INVALID_FLAG_VALUE", `Drop --target or use --target ${scopedRef.origin}.`);
277
+ }
278
+ const selector = scopedRef?.origin ?? explicitTarget ?? config.defaultWriteTarget;
279
+ if (!selector && fallbackStashDir) {
280
+ return { source: { name: "stash", path: fallbackStashDir } };
281
+ }
282
+ const configuredSelector = selector ?? config.defaultBundle;
283
+ if (configuredSelector) {
284
+ const entry = bundlesToSourceEntries(config)?.find((source) => source.name === configuredSelector);
285
+ if (!entry) {
286
+ throw new UsageError(`No source named "${configuredSelector}" is configured. Run \`akm bundle list\` to see available sources.`, "INVALID_FLAG_VALUE");
287
+ }
288
+ const sourcePath = resolveEntryContentDir(entry);
289
+ if (!sourcePath) {
290
+ throw new ConfigError(`Source "${configuredSelector}" has no resolvable on-disk path; improve cannot inspect this entry.`, "INVALID_CONFIG_FILE");
291
+ }
292
+ return { selector: configuredSelector, source: { name: configuredSelector, path: sourcePath } };
293
+ }
294
+ const implicit = resolveSourceEntries(undefined, config)[0];
295
+ if (!implicit) {
296
+ throw new ConfigError("no source configured; run `akm bundle create`", "STASH_DIR_NOT_FOUND");
297
+ }
298
+ return { source: { name: implicit.registryId ?? "stash", path: implicit.path } };
299
+ }
282
300
  /**
283
301
  * Run-setup: budget/watchdog plumbing, scope + seam resolution, the invocation
284
302
  * plan, write-target resolution, the profile-defaulted options rebuild, and
@@ -316,18 +334,32 @@ function resolveImproveRunSetup(options) {
316
334
  const selectedStrategy = resolvedPlan.strategy;
317
335
  const improveSensitiveValues = collectEngineCredentialValues(_earlyConfig);
318
336
  const improveProfile = selectedStrategy.config;
319
- const writeTarget = options.writeTarget ??
320
- (options.target || _earlyConfig.defaultWriteTarget || !options.stashDir
321
- ? resolveWriteTarget(_earlyConfig, options.target, { requireWritable: !options.dryRun })
322
- : {
323
- source: { kind: "filesystem", name: "stash", path: options.stashDir },
324
- config: {
325
- type: "filesystem",
326
- name: "stash",
327
- path: options.stashDir,
328
- writable: true,
329
- },
330
- });
337
+ const scopedRef = scope.mode === "ref" && scope.value ? parseRefInput(scope.value) : undefined;
338
+ const readSource = options.dryRun
339
+ ? options.writeTarget
340
+ ? { selector: options.writeTarget.selector, source: options.writeTarget.source }
341
+ : resolveImproveReadSource(_earlyConfig, scopedRef, options.target, options.stashDir)
342
+ : undefined;
343
+ const writeTarget = options.dryRun
344
+ ? undefined
345
+ : scopedRef?.origin
346
+ ? resolveMutationTarget(_earlyConfig, scopedRef, options.writeTarget?.source.name ?? options.target).target
347
+ : (options.writeTarget ??
348
+ (options.target || _earlyConfig.defaultWriteTarget || !options.stashDir
349
+ ? resolveWriteTarget(_earlyConfig, options.target)
350
+ : {
351
+ source: { kind: "filesystem", name: "stash", path: options.stashDir },
352
+ config: {
353
+ type: "filesystem",
354
+ name: "stash",
355
+ path: options.stashDir,
356
+ writable: true,
357
+ },
358
+ }));
359
+ const selectedSource = writeTarget?.source ?? readSource?.source;
360
+ if (!selectedSource)
361
+ throw new ConfigError("improve could not resolve a source", "STASH_DIR_NOT_FOUND");
362
+ const selectedSelector = writeTarget?.selector ?? readSource?.selector;
331
363
  // Apply profile defaults — CLI flags take precedence over profile defaults.
332
364
  // Rebuild options with effective values so all downstream stage functions
333
365
  // automatically pick up the profile-driven defaults.
@@ -336,17 +368,15 @@ function resolveImproveRunSetup(options) {
336
368
  // Pin nested calls and quality gates to the same config snapshot as the
337
369
  // invocation plan. They must never reload a changed config mid-run.
338
370
  config: _earlyConfig,
339
- target: writeTarget.selector,
340
- sourceName: writeTarget.source.name,
341
- writeTarget,
342
- stashDir: writeTarget.source.path,
371
+ target: selectedSelector,
372
+ sourceName: selectedSource.name,
373
+ ...(writeTarget ? { writeTarget } : {}),
374
+ stashDir: selectedSource.path,
343
375
  consolidateOptions: {
344
376
  ...options.consolidateOptions,
345
- target: writeTarget.selector,
346
- writeTarget,
377
+ target: selectedSelector,
378
+ ...(writeTarget ? { writeTarget } : {}),
347
379
  },
348
- legacyBareState: options.legacyBareState ??
349
- shouldReadLegacyBareImproveState(writeTarget.source.name, writeTarget.source.path, _earlyConfig),
350
380
  // Profile-level limit, then process-level reflect.limit as fallback.
351
381
  // CLI --limit takes precedence over both.
352
382
  limit: options.limit ?? improveProfile?.processes?.reflect?.limit ?? improveProfile.limit,
@@ -465,7 +495,7 @@ function recordImproveFailure(err, run, eventsCtx) {
465
495
  */
466
496
  async function indexAndCollect(args) {
467
497
  const { signal } = args;
468
- const { scope, options, primaryStashDir, improveProfile, resolvedPlan, _earlyConfig, ensureIndexFn, collectEligibleRefsImpl, } = args.run;
498
+ const { scope, options, primaryStashDir, improveProfile, _earlyConfig, ensureIndexFn, collectEligibleRefsImpl } = args.run;
469
499
  const warnings = [];
470
500
  let plannedRefs = [];
471
501
  let memorySummary = { eligible: 0, derived: 0 };
@@ -533,31 +563,23 @@ async function indexAndCollect(args) {
533
563
  plannedRefs,
534
564
  memorySummary,
535
565
  strategyFilteredRefs = [],
536
- } = await collectEligibleRefsImpl(scope, options.stashDir, improveProfile));
566
+ } = await collectEligibleRefsImpl(scope, options.stashDir, improveProfile, _earlyConfig));
537
567
  const cleanupParentRef = memoryCleanupParentRef(scope, options.stashDir);
538
- // M-1 (#367): Run contradiction-detection BEFORE analyzeMemoryCleanup so
539
- // the SCC resolver in resolveFamilyContradictions has edges to work on.
540
- // Best-effort: failures are warnings, never fatal.
541
- if (!options.dryRun &&
542
- primaryStashDir &&
543
- shouldAnalyzeMemoryCleanup(scope, memorySummary.eligible, primaryStashDir)) {
544
- try {
545
- // Reuse the config resolved at the top of the run instead of a second load.
546
- const contradictionDetectionFn = options.contradictionDetectionFn ?? detectAndWriteContradictions;
547
- await withLlmStage("memory-contradiction", () => contradictionDetectionFn(primaryStashDir, _earlyConfig, undefined, improveProfile, resolvedPlan.processes.consolidate.runner
548
- ? materializeLlmRunnerConnection(resolvedPlan.processes.consolidate.runner)
549
- : null), { engine: resolvedPlan.processes.consolidate.runner?.engine, process: "consolidate" });
550
- }
551
- catch (err) {
552
- if (signal.aborted)
553
- throw err;
554
- // Non-fatal: contradiction detection is a best-effort pass.
555
- warn(`[improve] contradiction detection failed (non-fatal): ${errMessage(err)}`);
556
- }
557
- }
558
- const memoryCleanupPlan = shouldAnalyzeMemoryCleanup(scope, memorySummary.eligible, primaryStashDir)
568
+ // D8 — the two direct lanes share one eligibility predicate, which reads scope
569
+ // and eligible-memory count and no strategy flag at all. Compute it once: it
570
+ // decides whether each lane would have run, which is also what decides whether
571
+ // a gated lane is worth REPORTING. A lane that was never eligible was not
572
+ // suppressed by the gate, so claiming it was would be noise.
573
+ const cleanupEligible = shouldAnalyzeMemoryCleanup(scope, memorySummary.eligible, primaryStashDir);
574
+ // Cleanup remains independent of the disabled contradiction writer.
575
+ const memoryCleanupPlan = cleanupEligible
559
576
  ? analyzeMemoryCleanup(primaryStashDir, cleanupParentRef ? { parentRef: cleanupParentRef } : undefined)
560
577
  : undefined;
578
+ const cleanupWouldMutate = Boolean(memoryCleanupPlan &&
579
+ (memoryCleanupPlan.pruneCandidates.length > 0 ||
580
+ memoryCleanupPlan.beliefStateTransitions.length > 0 ||
581
+ memoryCleanupPlan.relativeDateCandidates.length > 0));
582
+ const autonomyGatedDirectLanes = cleanupWouldMutate && !isAutonomyLaneAllowed("memoryCleanup", _earlyConfig) ? ["memoryCleanup"] : [];
561
583
  const guidance = memorySummary.eligible > 0
562
584
  ? "Improve folds memory cleanup into the same proposal queue: speculative promotions still go through reflect/distill proposals, while high-confidence redundant derived memories are moved into a recoverable cleanup archive instead of being left active in the stash."
563
585
  : undefined;
@@ -566,6 +588,7 @@ async function indexAndCollect(args) {
566
588
  memorySummary,
567
589
  strategyFilteredRefs: strategyFilteredRefs ?? [],
568
590
  memoryCleanupPlan,
591
+ autonomyGatedDirectLanes,
569
592
  guidance,
570
593
  warnings,
571
594
  };
@@ -655,8 +678,6 @@ function makeCommitStashBatch(deps) {
655
678
  }
656
679
  const saveGitStashFn = options.saveGitStashFn ?? saveGitStash;
657
680
  const writableOverride = writeTarget ? resolveWritable(writeTarget.config) : resolveWritableOverride(_earlyConfig);
658
- // pushOnCommit is deprecated and fully ignored (Decision 6, WI-9.6b) — it no
659
- // longer participates in this fallback chain.
660
681
  const push = options.sync?.push ?? improveProfile.sync?.push ?? true;
661
682
  const message = renderSyncCommitMessage(effectiveSync.message ?? "akm improve auto-sync", messageContext, Date.now());
662
683
  try {
@@ -721,17 +742,17 @@ function preloadRejectedProposals() {
721
742
  * immediately before the loop so external proposal writes that occurred
722
743
  * before this run acquired its lock are visible.
723
744
  */
724
- export function refilterProactiveLoopRefs(loopRefs, options, improveProfile) {
745
+ export function refilterProactiveLoopRefs(loopRefs, improveProfile) {
725
746
  // Re-read cooldown timestamps immediately before execution so external
726
747
  // proposal writes that occurred before this run acquired its lock are visible.
727
748
  const proactiveLoopRefs = loopRefs.filter((r) => r.eligibilitySource === "proactive");
728
749
  let postLockLoopRefs = loopRefs;
729
750
  if (proactiveLoopRefs.length > 0) {
730
751
  const proactiveRefStrs = proactiveLoopRefs.map((r) => r.ref);
731
- // Chunk-5 flip F5e — dual-arm the proposal reverse map on item_ref too.
752
+ // Correlate proposal timestamps on each candidate's durable key.
732
753
  const proactiveItemRefByRef = new Map(proactiveLoopRefs.map((r) => [r.ref, r.itemRef]));
733
- const freshReflectTs = buildLatestProposalTsMap(proactiveRefStrs, "reflect", options.sourceName, options.legacyBareState, proactiveItemRefByRef);
734
- const freshDistillTs = buildLatestProposalTsMap(proactiveRefStrs, "distill", options.sourceName, options.legacyBareState, proactiveItemRefByRef);
754
+ const freshReflectTs = buildLatestProposalTsMap(proactiveRefStrs, "reflect", proactiveItemRefByRef);
755
+ const freshDistillTs = buildLatestProposalTsMap(proactiveRefStrs, "distill", proactiveItemRefByRef);
735
756
  const pmDueDays = improveProfile.processes?.proactiveMaintenance?.dueDays ?? DEFAULT_DUE_DAYS;
736
757
  const stillDue = new Set(filterProactiveDue(proactiveLoopRefs, freshReflectTs, freshDistillTs, pmDueDays, Date.now()).map((r) => r.ref));
737
758
  const dropped = proactiveLoopRefs.filter((r) => !stillDue.has(r.ref));
@@ -776,11 +797,9 @@ async function runPostLoopStageOrSkip(args) {
776
797
  improveProfile,
777
798
  resolvedPlan,
778
799
  consolidationRan: preparation.consolidationRan,
779
- // R5: floor violations from this run's consolidate pass, plus the accepted
780
- // volume — hardcoded 0 since the 0.9.0 confidence-gate deletion — for churn
781
- // detection.
800
+ // R5: floor violations from this run's consolidate pass, for the collapse
801
+ // detector's merge-floor advisory.
782
802
  consolidationMergeFloorViolations: preparation.consolidation.mergeFloorViolations ?? 0,
783
- acceptedActions: 0,
784
803
  });
785
804
  }
786
805
  /**
@@ -805,6 +824,24 @@ async function runImproveStageSequence(args) {
805
824
  },
806
825
  }, eventsCtx);
807
826
  }
827
+ // D8 — one event per lane the autonomy gate downgraded, naming the lane AND
828
+ // the config key that would enable it. This is the difference between a gate
829
+ // and a silent no-op: whatever the user would have seen happen, they now see
830
+ // explained. `health` already aggregates `improve_skipped` by reason
831
+ // (buildImproveSkipSummary), so these surface there without new machinery.
832
+ for (const lane of [...args.run.resolvedPlan.autonomyGated, ...describeGatedLanes(args.autonomyGatedDirectLanes)]) {
833
+ warn(`[improve] ${lane.lane} skipped — it ${lane.reason}. Set \`${lane.configKey}: true\` to enable it.`);
834
+ appendEvent({
835
+ eventType: "improve_skipped",
836
+ ref: undefined,
837
+ metadata: {
838
+ strategy: selectedStrategy.name,
839
+ reason: "autonomy_gated",
840
+ lane: lane.lane,
841
+ configKey: lane.configKey,
842
+ },
843
+ }, eventsCtx);
844
+ }
808
845
  // Single prep->loop->post-loop pass, run under the invocation's lock.
809
846
  // Accumulators are direct assignments from the single pass's results.
810
847
  let preparation;
@@ -844,7 +881,7 @@ async function runImproveStageSequence(args) {
844
881
  preparation = await runPreparation();
845
882
  const rejectedProposalsByRef = preloadRejectedProposals();
846
883
  const runLoop = () => {
847
- const postLockLoopRefs = refilterProactiveLoopRefs(preparation.loopRefs, options, improveProfile);
884
+ const postLockLoopRefs = refilterProactiveLoopRefs(preparation.loopRefs, improveProfile);
848
885
  return runImproveLoopStageImpl({
849
886
  ctx,
850
887
  primaryStashDir,