akm-cli 0.9.0-rc.0 → 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 (598) hide show
  1. package/CHANGELOG.md +1283 -22
  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/prompts/workflow-unit-preamble.md +26 -0
  26. package/dist/assets/stash-skeleton/README.md +38 -10
  27. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
  28. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
  29. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
  30. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
  38. package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
  39. package/dist/assets/tasks/core/extract.yml +3 -2
  40. package/dist/assets/tasks/core/improve.yml +2 -1
  41. package/dist/assets/tasks/core/index-refresh.yml +1 -0
  42. package/dist/assets/tasks/core/sync.yml +1 -0
  43. package/dist/assets/tasks/core/version-check.yml +2 -1
  44. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  45. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  46. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  47. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  48. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  49. package/dist/assets/templates/html/health.html +5 -4
  50. package/dist/assets/workflows/workflow-template.md +31 -15
  51. package/dist/cli/invocation.js +279 -0
  52. package/dist/cli/parse-args.js +5 -90
  53. package/dist/cli/retired-commands.js +78 -0
  54. package/dist/cli/shared.js +158 -48
  55. package/dist/cli-node.mjs +2 -1
  56. package/dist/cli.js +747 -293
  57. package/dist/commands/agent/agent-dispatch.js +19 -18
  58. package/dist/commands/agent/agent-support.js +0 -24
  59. package/dist/commands/agent/contribute-cli.js +43 -97
  60. package/dist/commands/completions.js +80 -23
  61. package/dist/commands/config-cli.js +44 -281
  62. package/dist/commands/env/env-binding.js +99 -0
  63. package/dist/commands/env/env-cli.js +84 -224
  64. package/dist/commands/env/env.js +12 -163
  65. package/dist/commands/env/marker-path.js +6 -0
  66. package/dist/commands/env/secret-cli.js +45 -61
  67. package/dist/commands/env/secret.js +32 -62
  68. package/dist/commands/feedback-cli.js +179 -85
  69. package/dist/commands/health/accept-rate.js +58 -0
  70. package/dist/commands/health/advisories.js +7 -8
  71. package/dist/commands/health/checks.js +279 -94
  72. package/dist/commands/health/html-report.js +197 -578
  73. package/dist/commands/health/improve-metrics.js +277 -246
  74. package/dist/commands/health/llm-usage.js +19 -19
  75. package/dist/commands/health/md-report.js +16 -7
  76. package/dist/commands/health/metrics.js +67 -32
  77. package/dist/commands/health/renderers.js +47 -0
  78. package/dist/commands/health/report-view-model.js +508 -0
  79. package/dist/commands/health/stash-exposure.js +1 -1
  80. package/dist/commands/health/surfaces.js +16 -56
  81. package/dist/commands/health/task-runs.js +3 -67
  82. package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
  83. package/dist/commands/health/types-improve.js +29 -0
  84. package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
  85. package/dist/commands/health/types-result.js +7 -0
  86. package/dist/commands/health/types-runs.js +4 -0
  87. package/dist/commands/health/types-session-log.js +4 -0
  88. package/dist/commands/health/types-windows.js +4 -0
  89. package/dist/commands/health/types.js +26 -21
  90. package/dist/commands/health/windows.js +2 -3
  91. package/dist/commands/health.js +296 -167
  92. package/dist/commands/improve/anti-collapse.js +5 -5
  93. package/dist/commands/improve/autonomy-gate.js +68 -0
  94. package/dist/commands/improve/collapse-detector.js +65 -52
  95. package/dist/commands/improve/consolidate/chunking.js +9 -7
  96. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  97. package/dist/commands/improve/consolidate/merge.js +4 -0
  98. package/dist/commands/improve/consolidate.js +454 -1354
  99. package/dist/commands/improve/content-hash.js +39 -0
  100. package/dist/commands/improve/distill/content-repair.js +4 -10
  101. package/dist/commands/improve/distill/promote-memory.js +89 -64
  102. package/dist/commands/improve/distill/quality-gate.js +118 -42
  103. package/dist/commands/improve/distill-guards.js +1 -1
  104. package/dist/commands/improve/distill-promotion-policy.js +33 -888
  105. package/dist/commands/improve/distill.js +607 -363
  106. package/dist/commands/improve/eligibility.js +165 -79
  107. package/dist/commands/improve/extract-cli.js +35 -126
  108. package/dist/commands/improve/extract-prompt.js +6 -35
  109. package/dist/commands/improve/extract.js +640 -391
  110. package/dist/commands/improve/feedback-valence.js +2 -12
  111. package/dist/commands/improve/improve-cli.js +134 -135
  112. package/dist/commands/improve/improve-result-file.js +30 -50
  113. package/dist/commands/improve/improve-run-types.js +4 -0
  114. package/dist/commands/improve/improve-strategies.js +135 -0
  115. package/dist/commands/improve/improve.js +904 -701
  116. package/dist/commands/improve/locks.js +64 -111
  117. package/dist/commands/improve/loop-stages.js +1110 -923
  118. package/dist/commands/improve/memory/derived-ref.js +124 -0
  119. package/dist/commands/improve/memory/memory-belief.js +79 -7
  120. package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
  121. package/dist/commands/improve/memory/memory-improve.js +25 -37
  122. package/dist/commands/improve/outcome-loop.js +25 -88
  123. package/dist/commands/improve/preparation.js +1034 -813
  124. package/dist/commands/improve/proactive-maintenance.js +34 -9
  125. package/dist/commands/improve/proposal-envelope.js +31 -0
  126. package/dist/commands/improve/reflect.js +983 -794
  127. package/dist/commands/improve/run-context.js +119 -0
  128. package/dist/commands/improve/salience.js +24 -127
  129. package/dist/commands/improve/session-asset.js +7 -3
  130. package/dist/commands/improve/shared.js +14 -34
  131. package/dist/commands/improve/source-identity.js +28 -0
  132. package/dist/commands/improve/triage.js +20 -17
  133. package/dist/commands/lint/base-linter.js +340 -313
  134. package/dist/commands/lint/env-key-rules.js +31 -47
  135. package/dist/commands/lint/index.js +185 -30
  136. package/dist/commands/{events.js → log.js} +28 -38
  137. package/dist/commands/migrate-cli.js +54 -0
  138. package/dist/commands/migration-tool.js +55 -0
  139. package/dist/commands/observability-cli.js +70 -208
  140. package/dist/commands/proposal/diff-format.js +50 -0
  141. package/dist/commands/proposal/drain-policies.js +0 -6
  142. package/dist/commands/proposal/drain.js +91 -40
  143. package/dist/commands/proposal/proposal-cli.js +134 -132
  144. package/dist/commands/proposal/proposal-types.js +56 -0
  145. package/dist/commands/proposal/proposal.js +83 -65
  146. package/dist/commands/proposal/propose-cli.js +88 -0
  147. package/dist/commands/proposal/propose.js +105 -88
  148. package/dist/commands/proposal/repository.js +1303 -278
  149. package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
  150. package/dist/commands/proposal/validators/proposal-validators.js +61 -12
  151. package/dist/commands/proposal/validators/proposals.js +6 -8
  152. package/dist/commands/read/curate.js +78 -73
  153. package/dist/commands/read/knowledge.js +510 -13
  154. package/dist/commands/read/registry-search.js +2 -2
  155. package/dist/commands/read/remember-cli.js +84 -15
  156. package/dist/commands/read/search-cli.js +203 -96
  157. package/dist/commands/read/search.js +126 -94
  158. package/dist/commands/read/show.js +226 -250
  159. package/dist/commands/registry-cli.js +34 -60
  160. package/dist/commands/remember.js +18 -57
  161. package/dist/commands/sources/add-cli.js +104 -49
  162. package/dist/commands/sources/bundle-cli.js +166 -0
  163. package/dist/commands/sources/bundle-config-ops.js +63 -0
  164. package/dist/commands/sources/info.js +27 -15
  165. package/dist/commands/sources/init.js +30 -40
  166. package/dist/commands/sources/installed-stashes.js +469 -172
  167. package/dist/commands/sources/migration-help.js +7 -4
  168. package/dist/commands/sources/schema-repair.js +10 -9
  169. package/dist/commands/sources/self-update.js +182 -121
  170. package/dist/commands/sources/source-add.js +169 -178
  171. package/dist/commands/sources/source-clone.js +144 -41
  172. package/dist/commands/sources/source-manage.js +94 -59
  173. package/dist/commands/sources/sources-cli.js +64 -205
  174. package/dist/commands/sources/stash-cli.js +91 -54
  175. package/dist/commands/sources/stash-skeleton.js +1 -1
  176. package/dist/commands/tasks/tasks-cli.js +106 -104
  177. package/dist/commands/tasks/tasks.js +445 -262
  178. package/dist/commands/workflow-cli.js +232 -121
  179. package/dist/core/action-contributors.js +1 -1
  180. package/dist/core/activation-policy.js +49 -0
  181. package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
  182. package/dist/core/adapter/adapters/akm-adapter.js +528 -0
  183. package/dist/core/adapter/adapters/akm-lint.js +392 -0
  184. package/dist/core/adapter/adapters/akm-metadata.js +387 -0
  185. package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
  186. package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
  187. package/dist/core/adapter/adapters/claude-adapter.js +61 -0
  188. package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
  189. package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
  190. package/dist/core/adapter/adapters/index.js +80 -0
  191. package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
  192. package/dist/core/adapter/adapters/okf-adapter.js +391 -0
  193. package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
  194. package/dist/core/adapter/adapters/shared.js +286 -0
  195. package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
  196. package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
  197. package/dist/core/adapter/bundle-adapter.js +4 -0
  198. package/dist/core/adapter/detect-adapter.js +17 -0
  199. package/dist/core/adapter/recognize-match.js +44 -0
  200. package/dist/core/adapter/registry.js +56 -0
  201. package/dist/core/adapter/types.js +4 -0
  202. package/dist/core/asset/akm-markdown.js +30 -0
  203. package/dist/core/asset/asset-placement.js +243 -0
  204. package/dist/core/asset/asset-ref.js +110 -79
  205. package/dist/core/asset/asset-serialize.js +20 -0
  206. package/dist/core/asset/frontmatter.js +28 -12
  207. package/dist/core/asset/markdown.js +40 -51
  208. package/dist/core/asset/resolve-ref.js +274 -0
  209. package/dist/core/asset/stash-meta.js +2 -2
  210. package/dist/core/bundle-id.js +51 -0
  211. package/dist/core/common.js +281 -86
  212. package/dist/core/config/config-io.js +42 -128
  213. package/dist/core/config/config-schema.js +233 -834
  214. package/dist/core/config/config-sources.js +162 -39
  215. package/dist/core/config/config-types.js +16 -11
  216. package/dist/core/config/config-version.js +29 -0
  217. package/dist/core/config/config-walker.js +126 -37
  218. package/dist/core/config/config.js +154 -331
  219. package/dist/core/config/deep-merge.js +41 -0
  220. package/dist/core/config/engine-semantics.js +28 -0
  221. package/dist/core/config/experimental.js +21 -0
  222. package/dist/core/config/schema/embedding.js +38 -0
  223. package/dist/core/config/schema/engines.js +116 -0
  224. package/dist/core/config/schema/experimental.js +47 -0
  225. package/dist/core/config/schema/feedback.js +31 -0
  226. package/dist/core/config/schema/improve-processes.js +389 -0
  227. package/dist/core/config/schema/improve.js +94 -0
  228. package/dist/core/config/schema/index-config.js +176 -0
  229. package/dist/core/config/schema/output.js +18 -0
  230. package/dist/core/config/schema/primitives.js +94 -0
  231. package/dist/core/config/schema/search.js +30 -0
  232. package/dist/core/config/schema/setup.js +18 -0
  233. package/dist/core/config/schema/sources-bundles.js +169 -0
  234. package/dist/core/config/schema/workflow.js +29 -0
  235. package/dist/core/env-secret-ref.js +155 -20
  236. package/dist/core/errors.js +17 -15
  237. package/dist/core/events-types.js +4 -0
  238. package/dist/core/events.js +46 -128
  239. package/dist/core/extra-params.js +62 -0
  240. package/dist/core/file-change.js +17 -0
  241. package/dist/core/file-lock.js +202 -57
  242. package/dist/core/fs-txn.js +392 -0
  243. package/dist/core/git-message.js +59 -0
  244. package/dist/core/improve-result.js +167 -0
  245. package/dist/core/json-schema.js +142 -0
  246. package/dist/core/lesson-lint.js +1 -17
  247. package/dist/core/logs-db.js +1 -1
  248. package/dist/core/maintenance-barrier.js +135 -0
  249. package/dist/core/migration-operation.js +44 -0
  250. package/dist/core/mutation-target.js +78 -0
  251. package/dist/core/paths.js +22 -25
  252. package/dist/core/platform.js +10 -0
  253. package/dist/core/recognition-util.js +128 -0
  254. package/dist/core/redaction.js +392 -0
  255. package/dist/core/standards/resolve-standards-context.js +36 -65
  256. package/dist/core/standards/resolve-stash-standards.js +2 -2
  257. package/dist/core/standards/resolve-type-conventions.js +5 -5
  258. package/dist/core/state/migrations.js +242 -11
  259. package/dist/core/state-db.js +98 -10
  260. package/dist/core/structured.js +1 -1
  261. package/dist/core/subprocess.js +303 -0
  262. package/dist/core/text-truncation.js +9 -5
  263. package/dist/core/time.js +20 -0
  264. package/dist/core/type-presentation.js +130 -0
  265. package/dist/core/warn.js +0 -3
  266. package/dist/core/write-source.js +834 -118
  267. package/dist/indexer/bundle-identity-guard.js +92 -0
  268. package/dist/indexer/db/graph-db.js +1 -25
  269. package/dist/indexer/db/llm-cache.js +1 -1
  270. package/dist/indexer/ensure-index.js +30 -9
  271. package/dist/indexer/graph/graph-boost.js +9 -30
  272. package/dist/indexer/graph/graph-extraction.js +41 -27
  273. package/dist/indexer/graph/graph-types.js +4 -0
  274. package/dist/indexer/index-writer-lock.js +93 -49
  275. package/dist/indexer/index-written-assets.js +100 -53
  276. package/dist/indexer/indexer.js +746 -329
  277. package/dist/indexer/init.js +18 -25
  278. package/dist/indexer/installations.js +142 -0
  279. package/dist/indexer/passes/dir-staleness.js +18 -10
  280. package/dist/indexer/passes/memory-inference.js +25 -15
  281. package/dist/indexer/passes/metadata.js +412 -243
  282. package/dist/indexer/scan/doc-to-entry.js +160 -0
  283. package/dist/indexer/scan/drain-dir.js +134 -0
  284. package/dist/indexer/search/db-search.js +292 -108
  285. package/dist/indexer/search/fts-query.js +64 -0
  286. package/dist/indexer/search/ranking-contributors.js +145 -25
  287. package/dist/indexer/search/ranking-types.js +4 -0
  288. package/dist/indexer/search/ranking.js +28 -71
  289. package/dist/indexer/search/search-attribution.js +67 -0
  290. package/dist/indexer/search/search-fields.js +18 -3
  291. package/dist/indexer/search/search-hit-enrichers.js +30 -40
  292. package/dist/indexer/search/search-source.js +157 -111
  293. package/dist/indexer/search/semantic-status.js +4 -1
  294. package/dist/indexer/usage/usage-events.js +10 -30
  295. package/dist/indexer/walk/file-context.js +3 -45
  296. package/dist/indexer/walk/matchers.js +42 -34
  297. package/dist/indexer/walk/path-resolver.js +11 -5
  298. package/dist/indexer/walk/walker.js +42 -14
  299. package/dist/integrations/agent/builder-shared.js +7 -0
  300. package/dist/integrations/agent/builders.js +5 -56
  301. package/dist/integrations/agent/config.js +3 -143
  302. package/dist/integrations/agent/detect.js +17 -2
  303. package/dist/integrations/agent/engine-resolution.js +231 -0
  304. package/dist/integrations/agent/index.js +1 -2
  305. package/dist/integrations/agent/model-aliases.js +16 -2
  306. package/dist/integrations/agent/profiles.js +36 -62
  307. package/dist/integrations/agent/prompts.js +46 -18
  308. package/dist/integrations/agent/runner-dispatch.js +93 -4
  309. package/dist/integrations/agent/runner.js +76 -208
  310. package/dist/integrations/agent/spawn.js +88 -196
  311. package/dist/integrations/harnesses/aider/agent-builder.js +114 -0
  312. package/dist/integrations/harnesses/aider/index.js +48 -0
  313. package/dist/integrations/harnesses/aider/result-extractor.js +53 -0
  314. package/dist/integrations/harnesses/amazonq/agent-builder.js +147 -0
  315. package/dist/integrations/harnesses/amazonq/index.js +45 -0
  316. package/dist/integrations/harnesses/amazonq/result-extractor.js +48 -0
  317. package/dist/integrations/harnesses/claude/agent-builder.js +46 -8
  318. package/dist/integrations/harnesses/claude/config-import.js +1 -3
  319. package/dist/integrations/harnesses/claude/index.js +24 -35
  320. package/dist/integrations/harnesses/claude/result-extractor.js +52 -0
  321. package/dist/integrations/harnesses/claude/session-log.js +27 -75
  322. package/dist/integrations/harnesses/codex/agent-builder.js +138 -0
  323. package/dist/integrations/harnesses/codex/index.js +52 -0
  324. package/dist/integrations/harnesses/codex/result-extractor.js +73 -0
  325. package/dist/integrations/harnesses/copilot/agent-builder.js +122 -0
  326. package/dist/integrations/harnesses/copilot/index.js +48 -0
  327. package/dist/integrations/harnesses/copilot/result-extractor.js +151 -0
  328. package/dist/integrations/harnesses/gemini/agent-builder.js +120 -0
  329. package/dist/integrations/harnesses/gemini/index.js +48 -0
  330. package/dist/integrations/harnesses/gemini/result-extractor.js +121 -0
  331. package/dist/integrations/harnesses/ids.js +24 -0
  332. package/dist/integrations/harnesses/index.js +54 -34
  333. package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
  334. package/dist/integrations/harnesses/opencode/config-import.js +1 -3
  335. package/dist/integrations/harnesses/opencode/index.js +14 -32
  336. package/dist/integrations/harnesses/opencode/session-log.js +67 -125
  337. package/dist/integrations/harnesses/opencode-sdk/harness.js +51 -0
  338. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +681 -108
  339. package/dist/integrations/harnesses/openhands/agent-builder.js +128 -0
  340. package/dist/integrations/harnesses/openhands/index.js +48 -0
  341. package/dist/integrations/harnesses/openhands/result-extractor.js +103 -0
  342. package/dist/integrations/harnesses/pi/agent-builder.js +97 -0
  343. package/dist/integrations/harnesses/pi/index.js +45 -0
  344. package/dist/integrations/harnesses/pi/result-extractor.js +135 -0
  345. package/dist/integrations/harnesses/shared.js +17 -0
  346. package/dist/integrations/harnesses/types.js +43 -32
  347. package/dist/integrations/lockfile.js +211 -24
  348. package/dist/integrations/session-logs/index.js +36 -39
  349. package/dist/integrations/session-logs/provider-base.js +113 -0
  350. package/dist/llm/client.js +182 -110
  351. package/dist/llm/embedders/deterministic.js +2 -2
  352. package/dist/llm/embedders/remote.js +21 -9
  353. package/dist/llm/feature-gate.js +17 -57
  354. package/dist/llm/graph-extract.js +12 -13
  355. package/dist/llm/index-passes.js +8 -42
  356. package/dist/llm/memory-infer.js +144 -1
  357. package/dist/llm/metadata-enhance.js +45 -30
  358. package/dist/llm/structured-call.js +16 -8
  359. package/dist/llm/usage-persist.js +30 -5
  360. package/dist/llm/usage-telemetry.js +59 -6
  361. package/dist/output/cli-hints.js +1 -2
  362. package/dist/output/command-registry.js +27 -0
  363. package/dist/output/context.js +22 -7
  364. package/dist/output/format-exempt.js +80 -0
  365. package/dist/output/generic-render.js +251 -0
  366. package/dist/output/html-render.js +11 -16
  367. package/dist/output/render-registry.js +57 -0
  368. package/dist/output/renderers.js +14 -279
  369. package/dist/output/shapes/curate.js +10 -1
  370. package/dist/output/shapes/events.js +12 -7
  371. package/dist/output/shapes/helpers.js +58 -84
  372. package/dist/output/shapes/passthrough.js +11 -39
  373. package/dist/output/shapes/proposal/producer.js +15 -7
  374. package/dist/output/shapes/registry.js +12 -6
  375. package/dist/output/shapes.js +0 -9
  376. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  377. package/dist/output/text/bundle-show.js +7 -0
  378. package/dist/output/text/command-format.js +562 -0
  379. package/dist/output/text/env.js +1 -3
  380. package/dist/output/text/events.js +8 -7
  381. package/dist/output/text/helpers.js +15 -1164
  382. package/dist/output/text/proposal/producer.js +4 -2
  383. package/dist/output/text/proposal-format.js +202 -0
  384. package/dist/output/text/registry-commands.js +1 -2
  385. package/dist/output/text/registry.js +12 -6
  386. package/dist/output/text/show-directives.js +117 -0
  387. package/dist/output/text/show-format.js +103 -0
  388. package/dist/output/text/sync.js +5 -0
  389. package/dist/output/text/workflow-format.js +332 -0
  390. package/dist/output/text/workflow.js +3 -2
  391. package/dist/output/text.js +10 -19
  392. package/dist/registry/factory.js +4 -6
  393. package/dist/registry/origin-resolve.js +16 -27
  394. package/dist/registry/providers/skills-sh.js +3 -3
  395. package/dist/registry/providers/static-index.js +15 -25
  396. package/dist/registry/resolve.js +43 -94
  397. package/dist/registry/semver.js +43 -0
  398. package/dist/runtime.js +81 -12
  399. package/dist/scripts/akm-migrate.js +35529 -0
  400. package/dist/setup/detect.js +5 -7
  401. package/dist/setup/detected-engines.js +136 -0
  402. package/dist/setup/engine-config.js +100 -0
  403. package/dist/setup/registry-stash-loader.js +3 -3
  404. package/dist/setup/semantic-assets.js +12 -9
  405. package/dist/setup/setup.js +444 -208
  406. package/dist/setup/steps/connection-shared.js +120 -0
  407. package/dist/setup/steps/connection.js +108 -305
  408. package/dist/setup/steps/platforms.js +13 -12
  409. package/dist/setup/steps/semantic.js +15 -3
  410. package/dist/setup/steps/sources.js +21 -15
  411. package/dist/setup/steps/stashdir.js +6 -4
  412. package/dist/setup/steps/tasks.js +236 -119
  413. package/dist/setup/steps.js +3 -2
  414. package/dist/sources/freshness.js +39 -0
  415. package/dist/sources/provider-factory.js +11 -17
  416. package/dist/sources/providers/filesystem.js +2 -3
  417. package/dist/sources/providers/git-install.js +278 -34
  418. package/dist/sources/providers/git-provider.js +54 -56
  419. package/dist/sources/providers/git-stash.js +420 -91
  420. package/dist/sources/providers/git.js +2 -2
  421. package/dist/sources/providers/npm.js +16 -19
  422. package/dist/sources/providers/provider-utils.js +47 -22
  423. package/dist/sources/providers/sync-from-ref.js +3 -9
  424. package/dist/sources/providers/website.js +2 -2
  425. package/dist/sources/resolve.js +11 -10
  426. package/dist/sources/snapshot-fetchers/types.js +4 -0
  427. package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
  428. package/dist/storage/database.js +60 -4
  429. package/dist/storage/engines/sqlite-migrations.js +156 -5
  430. package/dist/storage/locations.js +1 -2
  431. package/dist/storage/repositories/canaries-repository.js +1 -1
  432. package/dist/storage/repositories/events-repository.js +51 -11
  433. package/dist/storage/repositories/improve-runs-repository.js +6 -32
  434. package/dist/storage/repositories/index-connection.js +79 -0
  435. package/dist/storage/repositories/index-db.js +4 -3
  436. package/dist/storage/repositories/index-entries-repository.js +863 -0
  437. package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
  438. package/dist/storage/repositories/index-entry-types.js +4 -0
  439. package/dist/storage/repositories/index-fts-repository.js +167 -0
  440. package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
  441. package/dist/storage/repositories/index-meta-repository.js +49 -0
  442. package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
  443. package/dist/storage/repositories/index-sql.js +12 -0
  444. package/dist/storage/repositories/index-utility-repository.js +356 -0
  445. package/dist/storage/repositories/index-vec-repository.js +250 -0
  446. package/dist/storage/repositories/outcome-repository.js +119 -0
  447. package/dist/storage/repositories/proposals-repository.js +317 -75
  448. package/dist/storage/repositories/registry-cache.js +1 -1
  449. package/dist/storage/repositories/salience-repository.js +172 -0
  450. package/dist/storage/repositories/task-history-repository.js +110 -3
  451. package/dist/storage/repositories/workflow-runs-repository.js +240 -19
  452. package/dist/tasks/backends/cron.js +169 -46
  453. package/dist/tasks/backends/exec-utils.js +76 -3
  454. package/dist/tasks/backends/index.js +6 -9
  455. package/dist/tasks/backends/launchd.js +292 -55
  456. package/dist/tasks/backends/schtasks.js +557 -70
  457. package/dist/tasks/backends/types.js +4 -0
  458. package/dist/tasks/command-executable.js +93 -0
  459. package/dist/tasks/embedded.js +56 -38
  460. package/dist/tasks/parser.js +156 -64
  461. package/dist/tasks/resolve-akm-bin.js +144 -51
  462. package/dist/tasks/runner.js +377 -209
  463. package/dist/tasks/schedule.js +108 -19
  464. package/dist/tasks/scheduler-invocation.js +296 -0
  465. package/dist/tasks/schema.js +1 -1
  466. package/dist/tasks/task-id.js +35 -0
  467. package/dist/tasks/validator.js +30 -16
  468. package/dist/text-import-hook.mjs +1 -1
  469. package/dist/workflows/authoring/authoring.js +104 -43
  470. package/dist/workflows/authoring/scope-key.js +1 -1
  471. package/dist/workflows/cli.js +0 -16
  472. package/dist/workflows/concurrency-policy.js +15 -0
  473. package/dist/workflows/exec/brief.js +450 -0
  474. package/dist/workflows/exec/frozen-judge.js +47 -0
  475. package/dist/workflows/exec/native-executor.js +1038 -0
  476. package/dist/workflows/exec/param-secrets.js +115 -0
  477. package/dist/workflows/exec/report.js +1460 -0
  478. package/dist/workflows/exec/run-workflow.js +602 -0
  479. package/dist/workflows/exec/scheduler.js +71 -0
  480. package/dist/workflows/exec/step-work.js +1190 -0
  481. package/dist/workflows/exec/unit-writer.js +23 -0
  482. package/dist/workflows/exec/workflow-engine-gate.js +67 -0
  483. package/dist/workflows/exec/worktree.js +171 -0
  484. package/dist/workflows/ir/compile.js +246 -0
  485. package/dist/workflows/ir/freeze.js +233 -0
  486. package/dist/workflows/ir/params.js +54 -0
  487. package/dist/workflows/ir/plan-hash.js +68 -0
  488. package/dist/workflows/ir/schema.js +540 -0
  489. package/dist/workflows/parser.js +878 -304
  490. package/dist/workflows/program/expressions.js +181 -0
  491. package/dist/workflows/program/schema.js +51 -0
  492. package/dist/workflows/renderer.js +100 -45
  493. package/dist/workflows/resource-limits.js +22 -0
  494. package/dist/workflows/runtime/agent-identity.js +59 -14
  495. package/dist/workflows/runtime/checkin.js +1 -1
  496. package/dist/workflows/runtime/plan-classifier.js +131 -0
  497. package/dist/workflows/runtime/runs.js +376 -119
  498. package/dist/workflows/runtime/unit-checkin.js +45 -0
  499. package/dist/workflows/runtime/unit-phases.js +20 -0
  500. package/dist/workflows/runtime/workflow-asset-loader.js +241 -40
  501. package/dist/workflows/schema.js +1 -11
  502. package/dist/workflows/validate-summary.js +2 -3
  503. package/dist/workflows/validator.js +52 -30
  504. package/docs/README.md +42 -78
  505. package/docs/migration/README.md +8 -0
  506. package/docs/migration/release-notes/0.6.0.md +1 -1
  507. package/docs/migration/release-notes/0.7.0.md +9 -8
  508. package/docs/migration/release-notes/0.9.0.md +158 -14
  509. package/docs/migration/v0.7-to-v0.8.md +46 -47
  510. package/docs/migration/v0.8-to-v0.9.md +844 -0
  511. package/docs/reference/README.md +12 -0
  512. package/docs/reference/data-and-telemetry.md +333 -0
  513. package/package.json +21 -17
  514. package/schemas/akm-asset-envelope.json +93 -0
  515. package/schemas/akm-config.json +4636 -0
  516. package/schemas/akm-task.json +87 -0
  517. package/schemas/akm-workflow.json +373 -0
  518. package/dist/akm-migrate-storage +0 -38
  519. package/dist/assets/help/help-accept.md +0 -12
  520. package/dist/assets/help/help-improve.md +0 -84
  521. package/dist/assets/help/help-proposals.md +0 -17
  522. package/dist/assets/help/help-propose.md +0 -17
  523. package/dist/assets/help/help-reject.md +0 -11
  524. package/dist/assets/profiles/frequent.json +0 -13
  525. package/dist/assets/profiles/recombine-only.json +0 -21
  526. package/dist/assets/profiles/reflect-distill.json +0 -30
  527. package/dist/assets/profiles/synthesize.json +0 -15
  528. package/dist/assets/prompts/procedural-system.md +0 -44
  529. package/dist/assets/prompts/recombine-system.md +0 -40
  530. package/dist/assets/prompts/staleness-detect-system.md +0 -6
  531. package/dist/assets/tasks/core/backup.yml +0 -4
  532. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  533. package/dist/assets/templates/html/default.html +0 -78
  534. package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
  535. package/dist/assets/wiki/index-template.md +0 -12
  536. package/dist/assets/wiki/ingest-workflow-template.md +0 -83
  537. package/dist/assets/wiki/log-template.md +0 -8
  538. package/dist/assets/wiki/schema-template.md +0 -61
  539. package/dist/cli/config-migrate.js +0 -150
  540. package/dist/cli/config-validate.js +0 -39
  541. package/dist/commands/graph/graph-cli.js +0 -124
  542. package/dist/commands/graph/graph.js +0 -487
  543. package/dist/commands/improve/calibration.js +0 -161
  544. package/dist/commands/improve/dedup.js +0 -482
  545. package/dist/commands/improve/extract-watch.js +0 -140
  546. package/dist/commands/improve/hot-probation.js +0 -45
  547. package/dist/commands/improve/improve-auto-accept.js +0 -276
  548. package/dist/commands/improve/improve-profiles.js +0 -168
  549. package/dist/commands/improve/procedural.js +0 -398
  550. package/dist/commands/improve/recombine.js +0 -818
  551. package/dist/commands/improve/schema-similarity-gate.js +0 -168
  552. package/dist/commands/lint/agent-linter.js +0 -44
  553. package/dist/commands/lint/command-linter.js +0 -44
  554. package/dist/commands/lint/default-linter.js +0 -16
  555. package/dist/commands/lint/fact-linter.js +0 -39
  556. package/dist/commands/lint/knowledge-linter.js +0 -16
  557. package/dist/commands/lint/memory-linter.js +0 -61
  558. package/dist/commands/lint/registry.js +0 -41
  559. package/dist/commands/lint/skill-linter.js +0 -45
  560. package/dist/commands/lint/task-linter.js +0 -50
  561. package/dist/commands/lint/workflow-linter.js +0 -81
  562. package/dist/commands/proposal/legacy-import.js +0 -115
  563. package/dist/commands/sources/history.js +0 -196
  564. package/dist/commands/tasks/default-tasks.js +0 -186
  565. package/dist/commands/wiki-cli.js +0 -292
  566. package/dist/core/asset/asset-registry.js +0 -76
  567. package/dist/core/asset/asset-spec.js +0 -259
  568. package/dist/core/config/config-migration.js +0 -602
  569. package/dist/core/deep-merge.js +0 -38
  570. package/dist/core/eval/rank-metrics.js +0 -113
  571. package/dist/core/ripgrep/install.js +0 -163
  572. package/dist/core/ripgrep/resolve.js +0 -81
  573. package/dist/indexer/db/db.js +0 -1413
  574. package/dist/indexer/manifest.js +0 -170
  575. package/dist/indexer/passes/metadata-contributors.js +0 -31
  576. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
  577. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -49
  578. package/dist/llm/call-ai.js +0 -62
  579. package/dist/llm/memory-infer-impl.js +0 -138
  580. package/dist/output/shapes/distill.js +0 -14
  581. package/dist/output/shapes/history.js +0 -11
  582. package/dist/output/text/distill.js +0 -6
  583. package/dist/output/text/enable-disable.js +0 -8
  584. package/dist/output/text/history.js +0 -6
  585. package/dist/output/text/wiki.js +0 -16
  586. package/dist/registry/build-index.js +0 -386
  587. package/dist/scripts/migrate-storage.js +0 -19108
  588. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -9411
  589. package/dist/scripts/migrations/v16-to-v17.js +0 -141
  590. package/dist/setup/legacy-config.js +0 -106
  591. package/dist/storage/repositories/consolidation-repository.js +0 -38
  592. package/dist/storage/repositories/recombine-repository.js +0 -213
  593. package/dist/wiki/wiki-templates.js +0 -15
  594. package/dist/wiki/wiki.js +0 -1012
  595. package/dist/workflows/db.js +0 -215
  596. package/docs/data-and-telemetry.md +0 -226
  597. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
  598. /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
  }