akm-cli 0.9.0-rc.1 → 0.9.0-rc.13

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 (587) hide show
  1. package/CHANGELOG.md +1190 -52
  2. package/README.md +62 -37
  3. package/SECURITY.md +46 -31
  4. package/dist/akm +162 -38
  5. package/dist/akm-migrate +44 -0
  6. package/dist/assets/backends/schtasks-template.xml +2 -1
  7. package/dist/assets/hints/cli-hints-full.md +268 -118
  8. package/dist/assets/hints/cli-hints-short.md +87 -24
  9. package/dist/assets/{profiles → improve-strategies}/catchup.json +3 -1
  10. package/dist/assets/{profiles → improve-strategies}/consolidate.json +3 -1
  11. package/dist/assets/{profiles → improve-strategies}/default.json +6 -7
  12. package/dist/assets/improve-strategies/frequent.json +15 -0
  13. package/dist/assets/{profiles → improve-strategies}/graph-refresh.json +4 -2
  14. package/dist/assets/{profiles → improve-strategies}/memory-focus.json +4 -1
  15. package/dist/assets/{profiles → improve-strategies}/proactive-maintenance.json +5 -5
  16. package/dist/assets/{profiles → improve-strategies}/quick.json +4 -2
  17. package/dist/assets/improve-strategies/reflect-distill.json +30 -0
  18. package/dist/assets/{profiles → improve-strategies}/thorough.json +1 -1
  19. package/dist/assets/prompts/consolidate-system.md +5 -5
  20. package/dist/assets/prompts/extract-session.md +2 -6
  21. package/dist/assets/prompts/memory-infer-user.md +2 -3
  22. package/dist/assets/prompts/reflect-llm-framed-contract.md +11 -0
  23. package/dist/assets/prompts/reflect-llm-schema-contract.md +3 -0
  24. package/dist/assets/prompts/reflect-output-repair.md +3 -0
  25. package/dist/assets/stash-skeleton/README.md +38 -10
  26. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
  27. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
  28. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
  29. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
  30. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
  38. package/dist/assets/tasks/core/extract.yml +3 -2
  39. package/dist/assets/tasks/core/improve.yml +2 -1
  40. package/dist/assets/tasks/core/index-refresh.yml +1 -0
  41. package/dist/assets/tasks/core/sync.yml +1 -0
  42. package/dist/assets/tasks/core/version-check.yml +2 -1
  43. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  44. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  45. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  46. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  47. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  48. package/dist/assets/templates/html/health.html +5 -4
  49. package/dist/assets/workflows/workflow-template.md +31 -15
  50. package/dist/cli/invocation.js +279 -0
  51. package/dist/cli/parse-args.js +5 -90
  52. package/dist/cli/retired-commands.js +78 -0
  53. package/dist/cli/shared.js +158 -48
  54. package/dist/cli-node.mjs +2 -1
  55. package/dist/cli.js +747 -293
  56. package/dist/commands/agent/agent-dispatch.js +19 -18
  57. package/dist/commands/agent/agent-support.js +0 -24
  58. package/dist/commands/agent/contribute-cli.js +43 -97
  59. package/dist/commands/completions.js +80 -23
  60. package/dist/commands/config-cli.js +44 -281
  61. package/dist/commands/env/env-binding.js +13 -9
  62. package/dist/commands/env/env-cli.js +76 -159
  63. package/dist/commands/env/env.js +12 -163
  64. package/dist/commands/env/marker-path.js +6 -0
  65. package/dist/commands/env/secret-cli.js +45 -61
  66. package/dist/commands/env/secret.js +32 -62
  67. package/dist/commands/feedback-cli.js +179 -85
  68. package/dist/commands/health/accept-rate.js +58 -0
  69. package/dist/commands/health/advisories.js +7 -8
  70. package/dist/commands/health/checks.js +279 -94
  71. package/dist/commands/health/html-report.js +197 -578
  72. package/dist/commands/health/improve-metrics.js +277 -246
  73. package/dist/commands/health/llm-usage.js +19 -19
  74. package/dist/commands/health/md-report.js +16 -7
  75. package/dist/commands/health/metrics.js +67 -32
  76. package/dist/commands/health/renderers.js +47 -0
  77. package/dist/commands/health/report-view-model.js +508 -0
  78. package/dist/commands/health/stash-exposure.js +1 -1
  79. package/dist/commands/health/surfaces.js +16 -56
  80. package/dist/commands/health/task-runs.js +3 -67
  81. package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
  82. package/dist/commands/health/types-improve.js +29 -0
  83. package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
  84. package/dist/commands/health/types-result.js +7 -0
  85. package/dist/commands/health/types-runs.js +4 -0
  86. package/dist/commands/health/types-session-log.js +4 -0
  87. package/dist/commands/health/types-windows.js +4 -0
  88. package/dist/commands/health/types.js +26 -21
  89. package/dist/commands/health/windows.js +2 -3
  90. package/dist/commands/health.js +296 -167
  91. package/dist/commands/improve/anti-collapse.js +5 -5
  92. package/dist/commands/improve/autonomy-gate.js +68 -0
  93. package/dist/commands/improve/collapse-detector.js +65 -52
  94. package/dist/commands/improve/consolidate/chunking.js +9 -7
  95. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  96. package/dist/commands/improve/consolidate/merge.js +4 -0
  97. package/dist/commands/improve/consolidate.js +454 -1354
  98. package/dist/commands/improve/content-hash.js +39 -0
  99. package/dist/commands/improve/distill/content-repair.js +4 -10
  100. package/dist/commands/improve/distill/promote-memory.js +89 -64
  101. package/dist/commands/improve/distill/quality-gate.js +118 -42
  102. package/dist/commands/improve/distill-guards.js +1 -1
  103. package/dist/commands/improve/distill-promotion-policy.js +33 -888
  104. package/dist/commands/improve/distill.js +607 -363
  105. package/dist/commands/improve/eligibility.js +165 -79
  106. package/dist/commands/improve/extract-cli.js +35 -126
  107. package/dist/commands/improve/extract-prompt.js +6 -35
  108. package/dist/commands/improve/extract.js +640 -391
  109. package/dist/commands/improve/feedback-valence.js +2 -12
  110. package/dist/commands/improve/improve-cli.js +134 -135
  111. package/dist/commands/improve/improve-result-file.js +30 -50
  112. package/dist/commands/improve/improve-run-types.js +4 -0
  113. package/dist/commands/improve/improve-strategies.js +135 -0
  114. package/dist/commands/improve/improve.js +904 -701
  115. package/dist/commands/improve/locks.js +64 -111
  116. package/dist/commands/improve/loop-stages.js +1110 -923
  117. package/dist/commands/improve/memory/derived-ref.js +124 -0
  118. package/dist/commands/improve/memory/memory-belief.js +79 -7
  119. package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
  120. package/dist/commands/improve/memory/memory-improve.js +25 -37
  121. package/dist/commands/improve/outcome-loop.js +25 -88
  122. package/dist/commands/improve/preparation.js +1034 -813
  123. package/dist/commands/improve/proactive-maintenance.js +34 -9
  124. package/dist/commands/improve/proposal-envelope.js +31 -0
  125. package/dist/commands/improve/reflect.js +983 -794
  126. package/dist/commands/improve/run-context.js +119 -0
  127. package/dist/commands/improve/salience.js +24 -127
  128. package/dist/commands/improve/session-asset.js +7 -3
  129. package/dist/commands/improve/shared.js +14 -34
  130. package/dist/commands/improve/source-identity.js +28 -0
  131. package/dist/commands/improve/triage.js +20 -17
  132. package/dist/commands/lint/base-linter.js +340 -313
  133. package/dist/commands/lint/env-key-rules.js +31 -47
  134. package/dist/commands/lint/index.js +185 -30
  135. package/dist/commands/{events.js → log.js} +28 -38
  136. package/dist/commands/migrate-cli.js +54 -0
  137. package/dist/commands/migration-tool.js +55 -0
  138. package/dist/commands/observability-cli.js +70 -208
  139. package/dist/commands/proposal/diff-format.js +50 -0
  140. package/dist/commands/proposal/drain-policies.js +0 -6
  141. package/dist/commands/proposal/drain.js +91 -40
  142. package/dist/commands/proposal/proposal-cli.js +134 -132
  143. package/dist/commands/proposal/proposal-types.js +56 -0
  144. package/dist/commands/proposal/proposal.js +83 -65
  145. package/dist/commands/proposal/propose-cli.js +88 -0
  146. package/dist/commands/proposal/propose.js +105 -88
  147. package/dist/commands/proposal/repository.js +1303 -278
  148. package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
  149. package/dist/commands/proposal/validators/proposal-validators.js +61 -12
  150. package/dist/commands/proposal/validators/proposals.js +6 -8
  151. package/dist/commands/read/curate.js +78 -73
  152. package/dist/commands/read/knowledge.js +510 -13
  153. package/dist/commands/read/registry-search.js +2 -2
  154. package/dist/commands/read/remember-cli.js +84 -15
  155. package/dist/commands/read/search-cli.js +203 -96
  156. package/dist/commands/read/search.js +126 -94
  157. package/dist/commands/read/show.js +226 -250
  158. package/dist/commands/registry-cli.js +34 -60
  159. package/dist/commands/remember.js +18 -57
  160. package/dist/commands/sources/add-cli.js +104 -49
  161. package/dist/commands/sources/bundle-cli.js +166 -0
  162. package/dist/commands/sources/bundle-config-ops.js +63 -0
  163. package/dist/commands/sources/info.js +27 -15
  164. package/dist/commands/sources/init.js +30 -40
  165. package/dist/commands/sources/installed-stashes.js +469 -172
  166. package/dist/commands/sources/schema-repair.js +10 -9
  167. package/dist/commands/sources/self-update.js +182 -121
  168. package/dist/commands/sources/source-add.js +169 -178
  169. package/dist/commands/sources/source-clone.js +144 -41
  170. package/dist/commands/sources/source-manage.js +94 -59
  171. package/dist/commands/sources/sources-cli.js +64 -205
  172. package/dist/commands/sources/stash-cli.js +91 -54
  173. package/dist/commands/sources/stash-skeleton.js +1 -1
  174. package/dist/commands/tasks/tasks-cli.js +106 -104
  175. package/dist/commands/tasks/tasks.js +445 -262
  176. package/dist/commands/workflow-cli.js +75 -228
  177. package/dist/core/action-contributors.js +1 -1
  178. package/dist/core/activation-policy.js +49 -0
  179. package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
  180. package/dist/core/adapter/adapters/akm-adapter.js +528 -0
  181. package/dist/core/adapter/adapters/akm-lint.js +392 -0
  182. package/dist/core/adapter/adapters/akm-metadata.js +387 -0
  183. package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
  184. package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
  185. package/dist/core/adapter/adapters/claude-adapter.js +61 -0
  186. package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
  187. package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
  188. package/dist/core/adapter/adapters/index.js +80 -0
  189. package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
  190. package/dist/core/adapter/adapters/okf-adapter.js +391 -0
  191. package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
  192. package/dist/core/adapter/adapters/shared.js +286 -0
  193. package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
  194. package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
  195. package/dist/core/adapter/bundle-adapter.js +4 -0
  196. package/dist/core/adapter/detect-adapter.js +17 -0
  197. package/dist/core/adapter/recognize-match.js +44 -0
  198. package/dist/core/adapter/registry.js +56 -0
  199. package/dist/core/adapter/types.js +4 -0
  200. package/dist/core/asset/akm-markdown.js +30 -0
  201. package/dist/core/asset/asset-placement.js +243 -0
  202. package/dist/core/asset/asset-ref.js +110 -79
  203. package/dist/core/asset/asset-serialize.js +20 -0
  204. package/dist/core/asset/frontmatter.js +28 -12
  205. package/dist/core/asset/markdown.js +40 -51
  206. package/dist/core/asset/resolve-ref.js +274 -0
  207. package/dist/core/asset/stash-meta.js +2 -2
  208. package/dist/core/bundle-id.js +51 -0
  209. package/dist/core/common.js +281 -86
  210. package/dist/core/config/config-io.js +42 -128
  211. package/dist/core/config/config-schema.js +233 -855
  212. package/dist/core/config/config-sources.js +162 -39
  213. package/dist/core/config/config-types.js +16 -11
  214. package/dist/core/config/config-version.js +29 -0
  215. package/dist/core/config/config-walker.js +126 -37
  216. package/dist/core/config/config.js +154 -331
  217. package/dist/core/config/deep-merge.js +41 -0
  218. package/dist/core/config/engine-semantics.js +28 -0
  219. package/dist/core/config/experimental.js +21 -0
  220. package/dist/core/config/schema/embedding.js +38 -0
  221. package/dist/core/config/schema/engines.js +116 -0
  222. package/dist/core/config/schema/experimental.js +47 -0
  223. package/dist/core/config/schema/feedback.js +31 -0
  224. package/dist/core/config/schema/improve-processes.js +389 -0
  225. package/dist/core/config/schema/improve.js +94 -0
  226. package/dist/core/config/schema/index-config.js +176 -0
  227. package/dist/core/config/schema/output.js +18 -0
  228. package/dist/core/config/schema/primitives.js +94 -0
  229. package/dist/core/config/schema/search.js +30 -0
  230. package/dist/core/config/schema/setup.js +18 -0
  231. package/dist/core/config/schema/sources-bundles.js +169 -0
  232. package/dist/core/config/schema/workflow.js +29 -0
  233. package/dist/core/env-secret-ref.js +155 -20
  234. package/dist/core/errors.js +17 -15
  235. package/dist/core/events-types.js +4 -0
  236. package/dist/core/events.js +46 -128
  237. package/dist/core/extra-params.js +62 -0
  238. package/dist/core/file-change.js +17 -0
  239. package/dist/core/file-lock.js +202 -57
  240. package/dist/core/fs-txn.js +392 -0
  241. package/dist/core/git-message.js +59 -0
  242. package/dist/core/improve-result.js +167 -0
  243. package/dist/core/lesson-lint.js +1 -17
  244. package/dist/core/logs-db.js +1 -1
  245. package/dist/core/maintenance-barrier.js +135 -0
  246. package/dist/core/migration-operation.js +44 -0
  247. package/dist/core/mutation-target.js +78 -0
  248. package/dist/core/paths.js +22 -25
  249. package/dist/core/platform.js +10 -0
  250. package/dist/core/recognition-util.js +128 -0
  251. package/dist/core/redaction.js +392 -0
  252. package/dist/core/standards/resolve-standards-context.js +36 -65
  253. package/dist/core/standards/resolve-stash-standards.js +2 -2
  254. package/dist/core/standards/resolve-type-conventions.js +5 -5
  255. package/dist/core/state/migrations.js +242 -11
  256. package/dist/core/state-db.js +98 -10
  257. package/dist/core/structured.js +1 -1
  258. package/dist/core/subprocess.js +303 -0
  259. package/dist/core/text-truncation.js +9 -5
  260. package/dist/core/time.js +20 -0
  261. package/dist/core/type-presentation.js +130 -0
  262. package/dist/core/warn.js +0 -3
  263. package/dist/core/write-source.js +834 -118
  264. package/dist/indexer/bundle-identity-guard.js +92 -0
  265. package/dist/indexer/db/graph-db.js +1 -25
  266. package/dist/indexer/db/llm-cache.js +1 -1
  267. package/dist/indexer/ensure-index.js +30 -9
  268. package/dist/indexer/graph/graph-boost.js +9 -30
  269. package/dist/indexer/graph/graph-extraction.js +41 -27
  270. package/dist/indexer/graph/graph-types.js +4 -0
  271. package/dist/indexer/index-writer-lock.js +93 -49
  272. package/dist/indexer/index-written-assets.js +100 -53
  273. package/dist/indexer/indexer.js +746 -329
  274. package/dist/indexer/init.js +18 -25
  275. package/dist/indexer/installations.js +142 -0
  276. package/dist/indexer/passes/dir-staleness.js +18 -10
  277. package/dist/indexer/passes/memory-inference.js +25 -15
  278. package/dist/indexer/passes/metadata.js +412 -243
  279. package/dist/indexer/scan/doc-to-entry.js +160 -0
  280. package/dist/indexer/scan/drain-dir.js +134 -0
  281. package/dist/indexer/search/db-search.js +292 -108
  282. package/dist/indexer/search/fts-query.js +64 -0
  283. package/dist/indexer/search/ranking-contributors.js +145 -25
  284. package/dist/indexer/search/ranking-types.js +4 -0
  285. package/dist/indexer/search/ranking.js +28 -71
  286. package/dist/indexer/search/search-attribution.js +67 -0
  287. package/dist/indexer/search/search-fields.js +18 -3
  288. package/dist/indexer/search/search-hit-enrichers.js +30 -40
  289. package/dist/indexer/search/search-source.js +157 -111
  290. package/dist/indexer/search/semantic-status.js +4 -1
  291. package/dist/indexer/usage/usage-events.js +10 -30
  292. package/dist/indexer/walk/file-context.js +3 -45
  293. package/dist/indexer/walk/matchers.js +42 -73
  294. package/dist/indexer/walk/path-resolver.js +11 -5
  295. package/dist/indexer/walk/walker.js +42 -14
  296. package/dist/integrations/agent/builder-shared.js +7 -0
  297. package/dist/integrations/agent/builders.js +5 -58
  298. package/dist/integrations/agent/config.js +3 -143
  299. package/dist/integrations/agent/detect.js +17 -2
  300. package/dist/integrations/agent/engine-resolution.js +231 -0
  301. package/dist/integrations/agent/index.js +1 -2
  302. package/dist/integrations/agent/model-aliases.js +8 -3
  303. package/dist/integrations/agent/profiles.js +6 -99
  304. package/dist/integrations/agent/prompts.js +46 -18
  305. package/dist/integrations/agent/runner-dispatch.js +78 -13
  306. package/dist/integrations/agent/runner.js +76 -208
  307. package/dist/integrations/agent/spawn.js +48 -279
  308. package/dist/integrations/harnesses/aider/agent-builder.js +9 -8
  309. package/dist/integrations/harnesses/aider/index.js +2 -12
  310. package/dist/integrations/harnesses/amazonq/agent-builder.js +10 -16
  311. package/dist/integrations/harnesses/amazonq/index.js +3 -17
  312. package/dist/integrations/harnesses/claude/agent-builder.js +2 -3
  313. package/dist/integrations/harnesses/claude/config-import.js +1 -3
  314. package/dist/integrations/harnesses/claude/index.js +1 -14
  315. package/dist/integrations/harnesses/claude/session-log.js +27 -75
  316. package/dist/integrations/harnesses/codex/agent-builder.js +8 -7
  317. package/dist/integrations/harnesses/codex/index.js +2 -13
  318. package/dist/integrations/harnesses/copilot/agent-builder.js +9 -9
  319. package/dist/integrations/harnesses/copilot/index.js +1 -13
  320. package/dist/integrations/harnesses/gemini/agent-builder.js +8 -9
  321. package/dist/integrations/harnesses/gemini/index.js +1 -13
  322. package/dist/integrations/harnesses/ids.js +24 -0
  323. package/dist/integrations/harnesses/index.js +31 -33
  324. package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
  325. package/dist/integrations/harnesses/opencode/config-import.js +1 -3
  326. package/dist/integrations/harnesses/opencode/index.js +1 -18
  327. package/dist/integrations/harnesses/opencode/session-log.js +67 -125
  328. package/dist/integrations/harnesses/opencode-sdk/harness.js +3 -17
  329. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +274 -191
  330. package/dist/integrations/harnesses/openhands/agent-builder.js +12 -10
  331. package/dist/integrations/harnesses/openhands/index.js +2 -12
  332. package/dist/integrations/harnesses/pi/agent-builder.js +11 -18
  333. package/dist/integrations/harnesses/pi/index.js +3 -16
  334. package/dist/integrations/harnesses/shared.js +17 -0
  335. package/dist/integrations/harnesses/types.js +38 -34
  336. package/dist/integrations/lockfile.js +211 -24
  337. package/dist/integrations/session-logs/index.js +24 -40
  338. package/dist/integrations/session-logs/provider-base.js +113 -0
  339. package/dist/llm/client.js +182 -110
  340. package/dist/llm/embedders/deterministic.js +2 -2
  341. package/dist/llm/embedders/remote.js +21 -9
  342. package/dist/llm/feature-gate.js +17 -57
  343. package/dist/llm/graph-extract.js +12 -13
  344. package/dist/llm/index-passes.js +8 -42
  345. package/dist/llm/memory-infer.js +144 -1
  346. package/dist/llm/metadata-enhance.js +45 -30
  347. package/dist/llm/structured-call.js +16 -8
  348. package/dist/llm/usage-persist.js +30 -5
  349. package/dist/llm/usage-telemetry.js +59 -6
  350. package/dist/output/cli-hints.js +1 -2
  351. package/dist/output/command-registry.js +27 -0
  352. package/dist/output/context.js +22 -7
  353. package/dist/output/format-exempt.js +80 -0
  354. package/dist/output/generic-render.js +251 -0
  355. package/dist/output/html-render.js +11 -16
  356. package/dist/output/render-registry.js +57 -0
  357. package/dist/output/renderers.js +15 -281
  358. package/dist/output/shapes/curate.js +10 -1
  359. package/dist/output/shapes/events.js +12 -7
  360. package/dist/output/shapes/helpers.js +58 -84
  361. package/dist/output/shapes/passthrough.js +8 -40
  362. package/dist/output/shapes/proposal/producer.js +15 -7
  363. package/dist/output/shapes/registry.js +12 -6
  364. package/dist/output/shapes.js +0 -9
  365. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  366. package/dist/output/text/bundle-show.js +7 -0
  367. package/dist/output/text/command-format.js +562 -0
  368. package/dist/output/text/env.js +1 -3
  369. package/dist/output/text/events.js +8 -7
  370. package/dist/output/text/helpers.js +15 -1375
  371. package/dist/output/text/proposal/producer.js +4 -2
  372. package/dist/output/text/proposal-format.js +202 -0
  373. package/dist/output/text/registry-commands.js +1 -2
  374. package/dist/output/text/registry.js +12 -6
  375. package/dist/output/text/show-directives.js +117 -0
  376. package/dist/output/text/show-format.js +103 -0
  377. package/dist/output/text/sync.js +5 -0
  378. package/dist/output/text/workflow-format.js +332 -0
  379. package/dist/output/text/workflow.js +1 -2
  380. package/dist/output/text.js +10 -19
  381. package/dist/registry/factory.js +4 -6
  382. package/dist/registry/origin-resolve.js +16 -27
  383. package/dist/registry/providers/skills-sh.js +3 -3
  384. package/dist/registry/providers/static-index.js +15 -25
  385. package/dist/registry/resolve.js +43 -94
  386. package/dist/registry/semver.js +43 -0
  387. package/dist/runtime.js +81 -12
  388. package/dist/scripts/akm-migrate.js +35529 -0
  389. package/dist/setup/detect.js +5 -7
  390. package/dist/setup/detected-engines.js +136 -0
  391. package/dist/setup/engine-config.js +100 -0
  392. package/dist/setup/registry-stash-loader.js +3 -3
  393. package/dist/setup/semantic-assets.js +12 -9
  394. package/dist/setup/setup.js +444 -208
  395. package/dist/setup/steps/connection-shared.js +120 -0
  396. package/dist/setup/steps/connection.js +108 -305
  397. package/dist/setup/steps/platforms.js +13 -12
  398. package/dist/setup/steps/semantic.js +15 -3
  399. package/dist/setup/steps/sources.js +21 -15
  400. package/dist/setup/steps/stashdir.js +6 -4
  401. package/dist/setup/steps/tasks.js +236 -119
  402. package/dist/setup/steps.js +3 -2
  403. package/dist/sources/freshness.js +39 -0
  404. package/dist/sources/provider-factory.js +11 -17
  405. package/dist/sources/providers/filesystem.js +2 -3
  406. package/dist/sources/providers/git-install.js +278 -34
  407. package/dist/sources/providers/git-provider.js +54 -56
  408. package/dist/sources/providers/git-stash.js +420 -91
  409. package/dist/sources/providers/git.js +2 -2
  410. package/dist/sources/providers/npm.js +16 -19
  411. package/dist/sources/providers/provider-utils.js +47 -22
  412. package/dist/sources/providers/sync-from-ref.js +3 -9
  413. package/dist/sources/providers/website.js +2 -2
  414. package/dist/sources/resolve.js +11 -10
  415. package/dist/sources/snapshot-fetchers/types.js +4 -0
  416. package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
  417. package/dist/storage/database.js +60 -4
  418. package/dist/storage/engines/sqlite-migrations.js +156 -5
  419. package/dist/storage/locations.js +1 -2
  420. package/dist/storage/repositories/canaries-repository.js +1 -1
  421. package/dist/storage/repositories/events-repository.js +51 -11
  422. package/dist/storage/repositories/improve-runs-repository.js +6 -32
  423. package/dist/storage/repositories/index-connection.js +79 -0
  424. package/dist/storage/repositories/index-db.js +4 -3
  425. package/dist/storage/repositories/index-entries-repository.js +863 -0
  426. package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
  427. package/dist/storage/repositories/index-entry-types.js +4 -0
  428. package/dist/storage/repositories/index-fts-repository.js +167 -0
  429. package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
  430. package/dist/storage/repositories/index-meta-repository.js +49 -0
  431. package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
  432. package/dist/storage/repositories/index-sql.js +12 -0
  433. package/dist/storage/repositories/index-utility-repository.js +356 -0
  434. package/dist/storage/repositories/index-vec-repository.js +250 -0
  435. package/dist/storage/repositories/outcome-repository.js +119 -0
  436. package/dist/storage/repositories/proposals-repository.js +317 -75
  437. package/dist/storage/repositories/registry-cache.js +1 -1
  438. package/dist/storage/repositories/salience-repository.js +172 -0
  439. package/dist/storage/repositories/task-history-repository.js +110 -3
  440. package/dist/storage/repositories/workflow-runs-repository.js +68 -35
  441. package/dist/tasks/backends/cron.js +169 -46
  442. package/dist/tasks/backends/exec-utils.js +76 -3
  443. package/dist/tasks/backends/index.js +6 -9
  444. package/dist/tasks/backends/launchd.js +292 -55
  445. package/dist/tasks/backends/schtasks.js +557 -70
  446. package/dist/tasks/backends/types.js +4 -0
  447. package/dist/tasks/command-executable.js +93 -0
  448. package/dist/tasks/embedded.js +56 -38
  449. package/dist/tasks/parser.js +156 -64
  450. package/dist/tasks/resolve-akm-bin.js +144 -51
  451. package/dist/tasks/runner.js +377 -209
  452. package/dist/tasks/schedule.js +108 -19
  453. package/dist/tasks/scheduler-invocation.js +296 -0
  454. package/dist/tasks/schema.js +1 -1
  455. package/dist/tasks/task-id.js +35 -0
  456. package/dist/tasks/validator.js +30 -16
  457. package/dist/workflows/authoring/authoring.js +96 -148
  458. package/dist/workflows/authoring/scope-key.js +1 -1
  459. package/dist/workflows/cli.js +0 -20
  460. package/dist/workflows/concurrency-policy.js +15 -0
  461. package/dist/workflows/exec/brief.js +25 -59
  462. package/dist/workflows/exec/frozen-judge.js +47 -0
  463. package/dist/workflows/exec/native-executor.js +157 -94
  464. package/dist/workflows/exec/report.js +365 -200
  465. package/dist/workflows/exec/run-workflow.js +46 -40
  466. package/dist/workflows/exec/scheduler.js +12 -41
  467. package/dist/workflows/exec/step-work.js +239 -205
  468. package/dist/workflows/exec/workflow-engine-gate.js +67 -0
  469. package/dist/workflows/ir/compile.js +141 -283
  470. package/dist/workflows/ir/freeze.js +233 -0
  471. package/dist/workflows/ir/plan-hash.js +40 -5
  472. package/dist/workflows/ir/schema.js +537 -1
  473. package/dist/workflows/parser.js +878 -306
  474. package/dist/workflows/program/expressions.js +20 -208
  475. package/dist/workflows/program/schema.js +7 -10
  476. package/dist/workflows/renderer.js +99 -121
  477. package/dist/workflows/resource-limits.js +22 -0
  478. package/dist/workflows/runtime/checkin.js +1 -1
  479. package/dist/workflows/runtime/plan-classifier.js +131 -0
  480. package/dist/workflows/runtime/runs.js +200 -113
  481. package/dist/workflows/runtime/unit-checkin.js +1 -1
  482. package/dist/workflows/runtime/unit-phases.js +20 -0
  483. package/dist/workflows/runtime/workflow-asset-loader.js +235 -97
  484. package/dist/workflows/schema.js +1 -11
  485. package/dist/workflows/validate-summary.js +4 -26
  486. package/dist/workflows/validator.js +52 -30
  487. package/docs/README.md +42 -78
  488. package/docs/migration/README.md +8 -0
  489. package/docs/migration/release-notes/0.6.0.md +1 -1
  490. package/docs/migration/release-notes/0.7.0.md +9 -8
  491. package/docs/migration/release-notes/0.9.0.md +158 -14
  492. package/docs/migration/v0.7-to-v0.8.md +46 -47
  493. package/docs/migration/v0.8-to-v0.9.md +844 -0
  494. package/docs/reference/README.md +12 -0
  495. package/docs/reference/data-and-telemetry.md +333 -0
  496. package/package.json +21 -17
  497. package/schemas/akm-asset-envelope.json +93 -0
  498. package/schemas/akm-config.json +4636 -0
  499. package/schemas/akm-task.json +87 -0
  500. package/{dist/schemas → schemas}/akm-workflow.json +127 -82
  501. package/dist/akm-migrate-storage +0 -38
  502. package/dist/assets/help/help-accept.md +0 -12
  503. package/dist/assets/help/help-improve.md +0 -84
  504. package/dist/assets/help/help-proposals.md +0 -17
  505. package/dist/assets/help/help-propose.md +0 -17
  506. package/dist/assets/help/help-reject.md +0 -11
  507. package/dist/assets/profiles/frequent.json +0 -13
  508. package/dist/assets/profiles/recombine-only.json +0 -21
  509. package/dist/assets/profiles/reflect-distill.json +0 -30
  510. package/dist/assets/profiles/synthesize.json +0 -15
  511. package/dist/assets/prompts/procedural-system.md +0 -44
  512. package/dist/assets/prompts/recombine-system.md +0 -40
  513. package/dist/assets/prompts/staleness-detect-system.md +0 -6
  514. package/dist/assets/tasks/core/backup.yml +0 -4
  515. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  516. package/dist/assets/templates/html/default.html +0 -78
  517. package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
  518. package/dist/assets/wiki/index-template.md +0 -12
  519. package/dist/assets/wiki/ingest-workflow-template.md +0 -83
  520. package/dist/assets/wiki/log-template.md +0 -8
  521. package/dist/assets/wiki/schema-template.md +0 -61
  522. package/dist/cli/config-migrate.js +0 -150
  523. package/dist/cli/config-validate.js +0 -39
  524. package/dist/commands/graph/graph-cli.js +0 -124
  525. package/dist/commands/graph/graph.js +0 -487
  526. package/dist/commands/improve/calibration.js +0 -161
  527. package/dist/commands/improve/dedup.js +0 -482
  528. package/dist/commands/improve/extract-watch.js +0 -140
  529. package/dist/commands/improve/hot-probation.js +0 -45
  530. package/dist/commands/improve/improve-auto-accept.js +0 -276
  531. package/dist/commands/improve/improve-profiles.js +0 -168
  532. package/dist/commands/improve/procedural.js +0 -398
  533. package/dist/commands/improve/recombine.js +0 -818
  534. package/dist/commands/improve/schema-similarity-gate.js +0 -168
  535. package/dist/commands/lint/agent-linter.js +0 -44
  536. package/dist/commands/lint/command-linter.js +0 -44
  537. package/dist/commands/lint/default-linter.js +0 -16
  538. package/dist/commands/lint/fact-linter.js +0 -39
  539. package/dist/commands/lint/knowledge-linter.js +0 -16
  540. package/dist/commands/lint/memory-linter.js +0 -61
  541. package/dist/commands/lint/registry.js +0 -41
  542. package/dist/commands/lint/skill-linter.js +0 -45
  543. package/dist/commands/lint/task-linter.js +0 -50
  544. package/dist/commands/lint/workflow-linter.js +0 -81
  545. package/dist/commands/proposal/legacy-import.js +0 -115
  546. package/dist/commands/sources/history.js +0 -196
  547. package/dist/commands/tasks/default-tasks.js +0 -186
  548. package/dist/commands/wiki-cli.js +0 -292
  549. package/dist/core/asset/asset-registry.js +0 -76
  550. package/dist/core/asset/asset-spec.js +0 -316
  551. package/dist/core/config/config-migration.js +0 -602
  552. package/dist/core/deep-merge.js +0 -38
  553. package/dist/core/eval/rank-metrics.js +0 -113
  554. package/dist/core/ripgrep/install.js +0 -163
  555. package/dist/core/ripgrep/resolve.js +0 -81
  556. package/dist/indexer/db/db.js +0 -1414
  557. package/dist/indexer/manifest.js +0 -170
  558. package/dist/indexer/passes/metadata-contributors.js +0 -31
  559. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
  560. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -25
  561. package/dist/llm/call-ai.js +0 -62
  562. package/dist/llm/memory-infer-impl.js +0 -138
  563. package/dist/output/shapes/distill.js +0 -14
  564. package/dist/output/shapes/history.js +0 -11
  565. package/dist/output/text/distill.js +0 -6
  566. package/dist/output/text/enable-disable.js +0 -8
  567. package/dist/output/text/history.js +0 -6
  568. package/dist/output/text/wiki.js +0 -16
  569. package/dist/registry/build-index.js +0 -386
  570. package/dist/schemas/akm-config.json +0 -14225
  571. package/dist/scripts/migrate-storage.js +0 -13169
  572. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -10169
  573. package/dist/scripts/migrations/v16-to-v17.js +0 -141
  574. package/dist/setup/legacy-config.js +0 -106
  575. package/dist/storage/repositories/consolidation-repository.js +0 -38
  576. package/dist/storage/repositories/recombine-repository.js +0 -213
  577. package/dist/wiki/wiki-templates.js +0 -15
  578. package/dist/wiki/wiki.js +0 -1012
  579. package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
  580. package/dist/workflows/db.js +0 -350
  581. package/dist/workflows/exec/watch.js +0 -116
  582. package/dist/workflows/program/parser.js +0 -760
  583. package/dist/workflows/program/project.js +0 -105
  584. package/docs/data-and-telemetry.md +0 -227
  585. package/docs/migration/release-notes/0.9.0-beta.60.md +0 -19
  586. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
  587. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
@@ -3,16 +3,21 @@
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  import fs from "node:fs";
5
5
  import path from "node:path";
6
- import { makeAssetRef, parseAssetRef } from "../../core/asset/asset-ref.js";
7
6
  import { parseFrontmatter } from "../../core/asset/frontmatter.js";
8
- import { isAssetType } from "../../core/common.js";
7
+ import { conceptIdFromTypeName, parseRefInput, resolveRef } from "../../core/asset/resolve-ref.js";
8
+ import { loadConfig } from "../../core/config/config.js";
9
9
  import { NotFoundError, rethrowIfTestIsolationError, UsageError } from "../../core/errors.js";
10
10
  import { readEvents } from "../../core/events.js";
11
- import { closeDatabase, getAllEntries, getUtilityScoresByIds, openExistingDatabase } from "../../indexer/db/db.js";
11
+ import { deriveInstallations } from "../../indexer/installations.js";
12
12
  import { getWritableStashDirs, resolveSourceEntries } from "../../indexer/search/search-source.js";
13
13
  import { resolveAssetPath } from "../../indexer/walk/path-resolver.js";
14
+ import { closeDatabase, openExistingDatabase, openReadonlyExistingDatabase, } from "../../storage/repositories/index-connection.js";
15
+ import { getAllEntries } from "../../storage/repositories/index-entries-repository.js";
16
+ import { getUtilityScoresByIds } from "../../storage/repositories/index-utility-repository.js";
14
17
  import { isDistillRefusedInputType } from "./distill.js";
15
- import { isProfileFilteredForAllPasses } from "./improve-profiles.js";
18
+ import { isStrategyFilteredForAllPasses } from "./improve-strategies.js";
19
+ import { parseMemoryRef } from "./memory/derived-ref.js";
20
+ import { improveStateReadRefs } from "./source-identity.js";
16
21
  // Eligibility / candidate-selection predicates for improve. Free functions
17
22
  // (no akmImprove closure state) extracted from improve.ts to shrink the
18
23
  // orchestrator and make candidate selection independently testable.
@@ -21,69 +26,122 @@ export function resolveImproveScope(scope) {
21
26
  if (!trimmed)
22
27
  return { mode: "all" };
23
28
  try {
24
- parseAssetRef(trimmed);
29
+ parseRefInput(trimmed);
25
30
  return { mode: "ref", value: trimmed };
26
31
  }
27
- catch {
28
- if (!isAssetType(trimmed)) {
29
- throw new UsageError(`Unknown asset type: "${trimmed}". Valid types: memory, knowledge, skill, lesson, workflow, agent, command, script, wiki, env, secret, task.\n` +
30
- `If you passed --format to akm improve, that flag is not supported — use it with akm search or akm show instead.`, "INVALID_FLAG_VALUE");
32
+ catch (err) {
33
+ // A bare word with no ref separator is a `--scope <type>` filter attempt,
34
+ // not a ref. Any such word is accepted, including foreign/unknown type strings,
35
+ // which simply match zero entries downstream (a read-only query filter,
36
+ // not a data-acceptance gate, so no deny-list is needed here: an
37
+ // unrecognized type just matches nothing, since nothing is ever indexed
38
+ // with it). No test pinned the old "Unknown asset type" rejection for
39
+ // this case (chunk-1.5 anchors §A.5 — 0 hits).
40
+ //
41
+ // A colon-shaped value that still fails `parseRefInput` is a genuinely
42
+ // malformed ref attempt (bad name, path traversal, or a deny-listed
43
+ // deliberately-removed type like tool/vault, D1.5-6) — that must still
44
+ // surface as a real error, not be silently absorbed into a type filter
45
+ // that will never match anything.
46
+ if (!/[/:#]/.test(trimmed)) {
47
+ return { mode: "type", value: trimmed };
31
48
  }
32
- return { mode: "type", value: trimmed };
49
+ const message = err instanceof Error ? err.message : String(err);
50
+ throw new UsageError(`Invalid --scope "${trimmed}": ${message}`, "INVALID_FLAG_VALUE");
33
51
  }
34
52
  }
35
53
  /**
36
- * Dedupe a list of eligible refs by `ref`, preserving first-seen order. Used to
37
- * merge the three eligibility sources (feedback-signal, P0-A high-retrieval,
38
- * Layer-2 proactive-maintenance) without admitting a ref into the loop twice.
54
+ * Dedupe eligible refs by their durable item ref when available, preserving
55
+ * the first candidate and its display ref. Used to
56
+ * merge the eligibility sources (feedback-signal, Layer-2 proactive-maintenance,
57
+ * high-salience) without admitting a ref into the loop twice.
39
58
  */
40
59
  export function dedupeRefs(refs) {
41
60
  const seen = new Set();
42
61
  const out = [];
43
62
  for (const r of refs) {
44
- if (seen.has(r.ref))
63
+ const key = r.itemRef ?? r.ref;
64
+ if (seen.has(key))
45
65
  continue;
46
- seen.add(r.ref);
66
+ seen.add(key);
47
67
  out.push(r);
48
68
  }
49
69
  return out;
50
70
  }
51
- export async function collectEligibleRefs(scope, stashDir, improveProfile) {
71
+ export async function collectEligibleRefs(scope, stashDir, improveProfile, config) {
72
+ return collectEligibleRefsFromIndex(scope, stashDir, improveProfile, false, config);
73
+ }
74
+ /** Dry-run planner path: query an existing index without creating or mutating it. */
75
+ export async function collectEligibleRefsReadOnly(scope, stashDir, improveProfile, config) {
76
+ return collectEligibleRefsFromIndex(scope, stashDir, improveProfile, true, config);
77
+ }
78
+ async function collectEligibleRefsFromIndex(scope, stashDir, improveProfile, readOnly, configOverride) {
79
+ const config = configOverride ?? loadConfig();
52
80
  if (scope.mode === "ref" && scope.value) {
53
- const parsed = parseAssetRef(scope.value);
54
- const writableDirs = new Set(getWritableStashDirs(stashDir).map((dir) => path.resolve(dir)));
55
- const filePath = await findAssetFilePath(scope.value, stashDir, writableDirs);
56
- if (!filePath) {
81
+ const writableDirs = new Set(getWritableStashDirs(stashDir, config).map((dir) => path.resolve(dir)));
82
+ let db;
83
+ try {
84
+ db = readOnly ? openReadonlyExistingDatabase() : openExistingDatabase();
85
+ if (!db) {
86
+ return { plannedRefs: [], memorySummary: { eligible: 0, derived: 0 }, strategyFilteredRefs: [] };
87
+ }
88
+ const entries = getAllEntries(db);
89
+ const entriesByItemRef = new Map(entries.flatMap((entry) => entry.bundleId && entry.conceptId ? [[`${entry.bundleId}//${entry.conceptId}`, entry]] : []));
90
+ const installations = deriveInstallations(resolveSourceEntries(stashDir, config));
91
+ const resolved = resolveRef(scope.value, {
92
+ defaultBundle: config.defaultBundle,
93
+ bundles: installations.map((installation) => ({
94
+ id: installation.id,
95
+ hasConcept: (conceptId) => entriesByItemRef.has(`${installation.id}//${conceptId}`),
96
+ })),
97
+ });
98
+ const indexed = entriesByItemRef.get(`${resolved.bundle}//${resolved.conceptId}`);
99
+ if (!indexed?.bundleId || !indexed.conceptId || !fs.existsSync(indexed.filePath)) {
100
+ if (await findAssetFilePath(scope.value, stashDir)) {
101
+ return { plannedRefs: [], memorySummary: { eligible: 0, derived: 0 }, strategyFilteredRefs: [] };
102
+ }
103
+ throw new NotFoundError(`Asset not found in the selected writable source: ${scope.value}`, "ASSET_NOT_FOUND");
104
+ }
105
+ if (!isEntryInScope(indexed.stashDir, indexed.filePath, stashDir) ||
106
+ !isEntryInWritableSource(indexed.stashDir, indexed.filePath, writableDirs)) {
107
+ return { plannedRefs: [], memorySummary: { eligible: 0, derived: 0 }, strategyFilteredRefs: [] };
108
+ }
109
+ const itemRef = `${indexed.bundleId}//${indexed.conceptId}`;
57
110
  return {
58
- plannedRefs: [],
59
- memorySummary: { eligible: 0, derived: 0 },
60
- profileFilteredRefs: [],
111
+ plannedRefs: [{ ref: indexed.conceptId, itemRef, reason: "scope-ref", filePath: indexed.filePath }],
112
+ memorySummary: {
113
+ eligible: indexed.entry.type === "memory" ? 1 : 0,
114
+ derived: indexed.entry.type === "memory" && indexed.entry.name.endsWith(".derived") ? 1 : 0,
115
+ },
116
+ strategyFilteredRefs: [],
61
117
  };
62
118
  }
63
- return {
64
- plannedRefs: [{ ref: scope.value, reason: "scope-ref", filePath }],
65
- memorySummary: {
66
- eligible: parsed.type === "memory" ? 1 : 0,
67
- derived: parsed.type === "memory" && parsed.name.endsWith(".derived") ? 1 : 0,
68
- },
69
- profileFilteredRefs: [],
70
- };
119
+ catch (error) {
120
+ if (error instanceof Error && /no such table:\s*entries/i.test(error.message)) {
121
+ return { plannedRefs: [], memorySummary: { eligible: 0, derived: 0 }, strategyFilteredRefs: [] };
122
+ }
123
+ throw error;
124
+ }
125
+ finally {
126
+ if (db)
127
+ closeDatabase(db);
128
+ }
71
129
  }
72
130
  let sources;
73
131
  try {
74
- sources = resolveSourceEntries(stashDir);
132
+ sources = resolveSourceEntries(stashDir, config);
75
133
  }
76
134
  catch {
77
- return { plannedRefs: [], memorySummary: { eligible: 0, derived: 0 }, profileFilteredRefs: [] };
135
+ return { plannedRefs: [], memorySummary: { eligible: 0, derived: 0 }, strategyFilteredRefs: [] };
78
136
  }
79
137
  if (sources.length === 0) {
80
- return { plannedRefs: [], memorySummary: { eligible: 0, derived: 0 }, profileFilteredRefs: [] };
138
+ return { plannedRefs: [], memorySummary: { eligible: 0, derived: 0 }, strategyFilteredRefs: [] };
81
139
  }
82
140
  // Only operate on writable sources — never mutate read-only registry caches
83
141
  // or remote stashes that the user did not mark writable.
84
142
  let writableDirs;
85
143
  try {
86
- writableDirs = getWritableStashDirs(stashDir);
144
+ writableDirs = getWritableStashDirs(stashDir, config);
87
145
  }
88
146
  catch {
89
147
  writableDirs = sources.slice(0, 1).map((s) => s.path); // fallback: primary only
@@ -91,7 +149,10 @@ export async function collectEligibleRefs(scope, stashDir, improveProfile) {
91
149
  const writableDirSet = new Set(writableDirs.map((d) => path.resolve(d)));
92
150
  let db;
93
151
  try {
94
- db = openExistingDatabase();
152
+ db = readOnly ? openReadonlyExistingDatabase() : openExistingDatabase();
153
+ if (!db) {
154
+ return { plannedRefs: [], memorySummary: { eligible: 0, derived: 0 }, strategyFilteredRefs: [] };
155
+ }
95
156
  const entries = getAllEntries(db, scope.mode === "type" ? scope.value : undefined).filter((indexed) => {
96
157
  // First apply the existing stashDir-scope filter (no-op when stashDir is unset).
97
158
  if (!isEntryInScope(indexed.stashDir, indexed.filePath, stashDir))
@@ -100,11 +161,26 @@ export async function collectEligibleRefs(scope, stashDir, improveProfile) {
100
161
  return isEntryInWritableSource(indexed.stashDir, indexed.filePath, writableDirSet);
101
162
  });
102
163
  const planned = new Map();
103
- const profileFiltered = new Map();
164
+ const strategyFiltered = new Map();
104
165
  let memoryEligible = 0;
105
166
  let memoryDerived = 0;
106
167
  for (const indexed of entries) {
107
- const ref = makeAssetRef(indexed.entry.type, indexed.entry.name);
168
+ // Chunk-8 WI-8.5c: the candidate `ref` is the SHORT conceptId
169
+ // (`<stash-subdir>/<name>`, D-R2) — it now matches the disk lookup,
170
+ // xrefs, and `displayRef` output spelling. `.itemRef` below stays the
171
+ // fully-qualified durable key.
172
+ const ref = conceptIdFromTypeName(indexed.entry.type, indexed.entry.name);
173
+ try {
174
+ parseRefInput(ref);
175
+ }
176
+ catch (error) {
177
+ if (error instanceof UsageError || error instanceof NotFoundError)
178
+ continue;
179
+ throw error;
180
+ }
181
+ // Derive the durable item_ref from indexed provenance without another query.
182
+ // A provenance-free row uses the short conceptId ref for improve state.
183
+ const itemRef = indexed.bundleId && indexed.conceptId ? `${indexed.bundleId}//${indexed.conceptId}` : undefined;
108
184
  const isDerived = indexed.entry.name.endsWith(".derived");
109
185
  // `.derived` memories are LLM-inferred and intentionally skip reflect
110
186
  // (see the synthetic `derived-memory-reflect-skipped` branch in the
@@ -113,19 +189,20 @@ export async function collectEligibleRefs(scope, stashDir, improveProfile) {
113
189
  // 2026-05-21: 11 derived refs re-planned every hour during idle periods.
114
190
  // The cleanup phase (analyzeMemoryCleanup) inspects derived memories
115
191
  // independently of `plannedRefs`, so dropping them here loses nothing.
116
- if (!isDerived && !planned.has(ref) && !profileFiltered.has(ref)) {
117
- // 2026-05-27: extend the .derived precedent to profile-incompatible
192
+ if (!isDerived && !planned.has(ref) && !strategyFiltered.has(ref)) {
193
+ // 2026-05-27: extend the .derived precedent to strategy-incompatible
118
194
  // refs. If every per-ref pass (reflect + distill) on the active
119
- // profile would refuse this ref, drop it from `plannedRefs`. The
120
- // caller emits `improve_skipped { reason: profile_filtered_all_passes }`
195
+ // strategy would refuse this ref, drop it from `plannedRefs`. The
196
+ // caller emits `improve_skipped { reason: strategy_filtered_all_passes }`
121
197
  // once `eventsCtx` is available so the audit trail is preserved in a
122
198
  // single event per ref instead of 2× synthetic actions per run.
123
199
  // Background: see /tmp/akm-health-investigations/planner-profile-metrics-deep-analysis.md
124
- if (improveProfile && isProfileFilteredForAllPasses(ref, improveProfile)) {
125
- profileFiltered.set(ref, {
200
+ if (improveProfile && isStrategyFilteredForAllPasses(ref, improveProfile)) {
201
+ strategyFiltered.set(ref, {
126
202
  ref,
127
- reason: "profile_filtered_all_passes",
203
+ reason: "strategy_filtered_all_passes",
128
204
  filePath: indexed.filePath,
205
+ itemRef,
129
206
  });
130
207
  }
131
208
  else {
@@ -133,6 +210,7 @@ export async function collectEligibleRefs(scope, stashDir, improveProfile) {
133
210
  ref,
134
211
  reason: scope.mode === "type" ? "scope-type" : indexed.entry.type === "memory" ? "memory-cleanup" : "scope-type",
135
212
  filePath: indexed.filePath,
213
+ itemRef,
136
214
  });
137
215
  }
138
216
  }
@@ -145,14 +223,14 @@ export async function collectEligibleRefs(scope, stashDir, improveProfile) {
145
223
  return {
146
224
  plannedRefs: [...planned.values()],
147
225
  memorySummary: { eligible: memoryEligible, derived: memoryDerived },
148
- profileFilteredRefs: [...profileFiltered.values()],
226
+ strategyFilteredRefs: [...strategyFiltered.values()],
149
227
  };
150
228
  }
151
229
  catch (error) {
152
- // The bun-test isolation guard must never be downgraded to "empty plan".
230
+ // Empty-stash setup paths can open index.db before its schema exists.
153
231
  rethrowIfTestIsolationError(error);
154
- if (error instanceof NotFoundError || error instanceof Error) {
155
- return { plannedRefs: [], memorySummary: { eligible: 0, derived: 0 }, profileFilteredRefs: [] };
232
+ if (error instanceof Error && /no such table:\s*entries/i.test(error.message)) {
233
+ return { plannedRefs: [], memorySummary: { eligible: 0, derived: 0 }, strategyFilteredRefs: [] };
156
234
  }
157
235
  throw error;
158
236
  }
@@ -191,11 +269,16 @@ export function isEntryInWritableSource(entryStashDir, filePath, writableDirSet)
191
269
  export function memoryCleanupParentRef(scope, stashDir) {
192
270
  if (scope.mode !== "ref" || !scope.value)
193
271
  return undefined;
194
- const parsed = parseAssetRef(scope.value);
272
+ const parsed = parseRefInput(scope.value);
195
273
  if (parsed.type !== "memory")
196
274
  return undefined;
275
+ // Non-derived parent scope: emit the canonical `memories/<name>` conceptId so
276
+ // it matches `resolveParentRef`'s output in analyzeMemoryCleanup's parentRef
277
+ // filter (Group-C item 2 — the reader and every comparison site flipped
278
+ // together; emitting the raw scope value would re-open the mismatch the
279
+ // chunk-8 history warns about).
197
280
  if (!parsed.name.endsWith(".derived"))
198
- return scope.value;
281
+ return conceptIdFromTypeName(parsed.type, parsed.name);
199
282
  const sources = resolveSourceEntries(stashDir);
200
283
  for (const source of sources) {
201
284
  const candidate = path.join(source.path, "memories", `${parsed.name}.md`);
@@ -203,23 +286,21 @@ export function memoryCleanupParentRef(scope, stashDir) {
203
286
  continue;
204
287
  const raw = fs.readFileSync(candidate, "utf8");
205
288
  const fm = parseFrontmatter(raw).data;
206
- const sourceRef = typeof fm.source === "string" ? fm.source : undefined;
207
- if (sourceRef) {
208
- try {
209
- const parent = parseAssetRef(sourceRef.trim());
210
- if (parent.type === "memory")
211
- return makeAssetRef(parent.type, parent.name);
212
- }
213
- catch { }
214
- }
289
+ // The `source:` backref is normalized to the `memories/<name>` conceptId.
290
+ // That is exactly what
291
+ // analyzeMemoryCleanup's parentRef filter compares against — resolveParentRef
292
+ // emits the same conceptId — so the two sites stay in lockstep.
293
+ const parent = parseMemoryRef(typeof fm.source === "string" ? fm.source : undefined);
294
+ if (parent)
295
+ return parent;
215
296
  }
216
- return makeAssetRef("memory", parsed.name.slice(0, -".derived".length));
297
+ return conceptIdFromTypeName("memory", parsed.name.slice(0, -".derived".length));
217
298
  }
218
299
  export function isLessonCandidate(ref) {
219
300
  // Only lesson assets need lesson-schema validation (description + when_to_use).
220
301
  // Memories have their own distill path via shouldDistillMemoryRef.
221
302
  // All other types go through reflect, not distill.
222
- return parseAssetRef(ref).type === "lesson";
303
+ return parseRefInput(ref).type === "lesson";
223
304
  }
224
305
  /**
225
306
  * Planner-side check: should this ref enter the distill queue?
@@ -239,16 +320,16 @@ export function isLessonCandidate(ref) {
239
320
  * which was true *only* for `lesson:*` refs — exactly the set distill refuses.
240
321
  * The result: every hourly run re-queued the same lesson refs, the same skip
241
322
  * message returned, and no work was ever done. See
242
- * `tests/commands/improve-distill-planner-skip-lessons.test.ts`.
323
+ * `tests/integration/commands/improve-distill-planner-skip-lessons.test.ts`.
243
324
  */
244
325
  export function isDistillCandidateRef(ref, stashDir) {
245
- const parsed = parseAssetRef(ref);
326
+ const parsed = parseRefInput(ref);
246
327
  if (isDistillRefusedInputType(parsed.type))
247
328
  return false;
248
329
  return shouldDistillMemoryRef(ref, stashDir);
249
330
  }
250
331
  export function shouldDistillMemoryRef(ref, stashDir) {
251
- const parsed = parseAssetRef(ref);
332
+ const parsed = parseRefInput(ref);
252
333
  if (parsed.type !== "memory")
253
334
  return false;
254
335
  const sources = resolveSourceEntries(stashDir);
@@ -282,15 +363,16 @@ export function shouldDistillMemoryRef(ref, stashDir) {
282
363
  * metadata events are ignored so a stray `akm feedback <ref>` invocation
283
364
  * without a flag doesn't trigger downstream re-processing.
284
365
  */
285
- export function buildLatestFeedbackTsMap(refs, sinceIso) {
366
+ export function buildLatestFeedbackTsMap(refs, sinceIso, itemRefByRef) {
286
367
  const out = new Map();
287
368
  if (refs.length === 0)
288
369
  return out;
289
- const refSet = new Set(refs);
370
+ // Correlate item_ref-keyed events and conceptId-keyed direct invocations.
371
+ const refByDurableKey = new Map(refs.flatMap((ref) => improveStateReadRefs(ref, itemRefByRef?.get(ref)).map((key) => [key, ref])));
290
372
  const { events } = readEvents({ type: "feedback", since: sinceIso });
291
373
  for (const e of events) {
292
- const ref = e.ref;
293
- if (!ref || !refSet.has(ref))
374
+ const ref = e.ref ? refByDurableKey.get(e.ref) : undefined;
375
+ if (!ref)
294
376
  continue;
295
377
  const meta = e.metadata;
296
378
  const hasSignal = meta !== undefined && (typeof meta.signal === "string" || typeof meta.note === "string");
@@ -306,21 +388,22 @@ export function buildLatestFeedbackTsMap(refs, sinceIso) {
306
388
  * Latest proposal timestamp per input-ref, filtered by source ('reflect' or
307
389
  * 'distill'). Reads the corresponding `*_invoked` events from state.db —
308
390
  * these events are emitted at proposal creation time and carry the *input*
309
- * asset ref (memory:foo, skill:bar, etc.) directly. We use them rather than
391
+ * asset ref (`memories/foo`, `skills/bar`, etc.) directly. We use them rather than
310
392
  * `listProposals` because distill proposals are keyed by the derived
311
393
  * lesson/knowledge ref, not the source memory — joining back through the
312
394
  * payload would be fragile.
313
395
  */
314
- export function buildLatestProposalTsMap(refs, source) {
396
+ export function buildLatestProposalTsMap(refs, source, itemRefByRef) {
315
397
  const out = new Map();
316
398
  if (refs.length === 0)
317
399
  return out;
318
- const refSet = new Set(refs);
400
+ // Correlate item_ref-keyed events and conceptId-keyed direct invocations.
401
+ const refByDurableKey = new Map(refs.flatMap((ref) => improveStateReadRefs(ref, itemRefByRef?.get(ref)).map((key) => [key, ref])));
319
402
  const eventType = source === "reflect" ? "reflect_invoked" : "distill_invoked";
320
403
  const { events } = readEvents({ type: eventType });
321
404
  for (const e of events) {
322
- const ref = e.ref;
323
- if (!ref || !refSet.has(ref))
405
+ const ref = e.ref ? refByDurableKey.get(e.ref) : undefined;
406
+ if (!ref)
324
407
  continue;
325
408
  // For distill_invoked we only count attempts that produced (or attempted
326
409
  // to produce) a real proposal — config_disabled / parse-error outcomes
@@ -343,8 +426,9 @@ export function buildLatestProposalTsMap(refs, source) {
343
426
  * exists for this (ref, source) OR `latestFeedback[ref] > lastProposal[ref]`.
344
427
  *
345
428
  * Refs with no feedback signal at all are ineligible by definition — the
346
- * high-retrieval fallback path (see `noFeedbackCandidates` later in the
347
- * planner) handles never-touched-but-frequently-read assets separately.
429
+ * proactive-maintenance and high-salience fallback lanes (see
430
+ * `noFeedbackCandidates` later in the planner) handle never-rated assets
431
+ * separately.
348
432
  */
349
433
  export function isSignalDeltaEligible(ref, latestFeedback, lastProposal) {
350
434
  const fb = latestFeedback.get(ref);
@@ -385,7 +469,7 @@ export function shouldAnalyzeMemoryCleanup(scope, eligibleMemories, primaryStash
385
469
  return scope.value === "memory";
386
470
  if (!scope.value)
387
471
  return false;
388
- return parseAssetRef(scope.value).type === "memory";
472
+ return parseRefInput(scope.value).type === "memory";
389
473
  }
390
474
  export function buildUtilityMap(refs) {
391
475
  const map = new Map();
@@ -398,7 +482,9 @@ export function buildUtilityMap(refs) {
398
482
  const allDbEntries = getAllEntries(db);
399
483
  const idToRef = new Map();
400
484
  for (const indexed of allDbEntries) {
401
- const ref = makeAssetRef(indexed.entry.type, indexed.entry.name);
485
+ // Chunk-8 WI-8.5c: correlate on the SHORT conceptId to match the
486
+ // `ImproveEligibleRef.ref` set built in collectEligibleRefsFromIndex.
487
+ const ref = conceptIdFromTypeName(indexed.entry.type, indexed.entry.name);
402
488
  if (refSet.has(ref))
403
489
  idToRef.set(indexed.id, ref);
404
490
  }
@@ -429,6 +515,6 @@ export async function findAssetFilePath(ref, stashDir, writableDirSet) {
429
515
  writableDirSet,
430
516
  directoryIndexNames: ["SKILL.md"],
431
517
  preserveDirectNameFallback: true,
432
- honorOrigin: false,
518
+ honorOrigin: true,
433
519
  });
434
520
  }