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
@@ -0,0 +1,119 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ /**
5
+ * `RunContext` — the shared, run-scoped carrier for the three improve verbs
6
+ * (revise = reflect, learn = extract/distill/inference, consolidate = the
7
+ * memory-tier ops; D17). WI-7.5–7.8 decompose the improve god-functions into
8
+ * named passes that thread a `RunContext` instead of long positional argument
9
+ * lists.
10
+ *
11
+ * ## The D6 read-once seam
12
+ *
13
+ * `readAsset` is a memoizing file-read seam whose memo is **NEVER run-wide**
14
+ * (D6 / top-risk #7: a run-wide memo would serve prep-time bytes after a mid-run
15
+ * write). The guarantee is structural here, not merely conventional:
16
+ *
17
+ * - The **base** context returned by {@link createRunContext} has NO active
18
+ * memo. `readAsset` on it always reads through to disk, so it can never go
19
+ * stale — the safe default.
20
+ * - {@link RunContext.withFreshAssetMemo} mints a sibling context that shares
21
+ * every run-scoped carrier but owns a FRESH, empty memo. Memoization is
22
+ * therefore opt-in per scope:
23
+ * * prep's stage-body passes share ONE memo, forked only AFTER the
24
+ * mutating pre-loop passes have written their ops to disk, then
25
+ * discarded at stage end;
26
+ * * reflect and distill each fork their own memo per verb invocation, so
27
+ * their reads still happen at invoke time (not prep time).
28
+ * - Within a memo scope, {@link RunContext.writeAsset} writes through to disk
29
+ * AND refreshes the memo, and {@link RunContext.noteAssetWrite} drops a memo
30
+ * entry for a path written out-of-band, so a subsequent `readAsset` of the
31
+ * same path returns POST-write bytes (e.g. the distill in-loop salience
32
+ * stamp at `distill.ts:816`).
33
+ *
34
+ * The contract is pinned by `tests/commands/improve/run-context.test.ts`.
35
+ *
36
+ * This module deliberately mints only the carrier + seam. Adoption at the verb
37
+ * call sites lands in WI-7.5 (reflect/distill), WI-7.6 (preparation), and
38
+ * WI-7.7 (akmImprove/extract). It does NOT change `EventsContext` shape and does
39
+ * NOT thread a db handle into `ProposalsContext` (D14).
40
+ */
41
+ import fs from "node:fs";
42
+ import path from "node:path";
43
+ import { resolveStashDir } from "../../core/common.js";
44
+ import { chatCompletion } from "../../llm/client.js";
45
+ /**
46
+ * Build a `RunContext` over the given carriers with the supplied memo (or `null`
47
+ * for the non-memoizing base context). Kept private so the only way to obtain a
48
+ * memoizing context is {@link RunContext.withFreshAssetMemo}.
49
+ */
50
+ function buildRunContext(carriers, memo) {
51
+ const memoKey = (filePath) => path.resolve(filePath);
52
+ return {
53
+ stashDir: carriers.stashDir,
54
+ config: carriers.config,
55
+ eventsCtx: carriers.eventsCtx,
56
+ proposalsCtx: carriers.proposalsCtx,
57
+ chat: carriers.chat,
58
+ getLlmConfig: carriers.getLlmConfig,
59
+ sourceRun: carriers.sourceRun,
60
+ dryRun: carriers.dryRun,
61
+ signal: carriers.signal,
62
+ now: carriers.now,
63
+ readAsset(filePath) {
64
+ if (!memo)
65
+ return carriers.readFile(filePath);
66
+ const key = memoKey(filePath);
67
+ const cached = memo.get(key);
68
+ if (cached !== undefined)
69
+ return cached;
70
+ const bytes = carriers.readFile(filePath);
71
+ memo.set(key, bytes);
72
+ return bytes;
73
+ },
74
+ writeAsset(filePath, content) {
75
+ carriers.writeFile(filePath, content);
76
+ memo?.set(memoKey(filePath), content);
77
+ },
78
+ noteAssetWrite(filePath) {
79
+ memo?.delete(memoKey(filePath));
80
+ },
81
+ withFreshAssetMemo() {
82
+ return buildRunContext(carriers, new Map());
83
+ },
84
+ };
85
+ }
86
+ /**
87
+ * Create the base `RunContext` for an improve run. Its `readAsset` is
88
+ * non-memoizing (always fresh); call {@link RunContext.withFreshAssetMemo} to
89
+ * enter a memoized pass/invocation scope.
90
+ */
91
+ export function createRunContext(init) {
92
+ const carriers = {
93
+ stashDir: init.stashDir,
94
+ config: init.config,
95
+ eventsCtx: init.eventsCtx,
96
+ proposalsCtx: init.proposalsCtx,
97
+ chat: init.chat ?? chatCompletion,
98
+ getLlmConfig: init.getLlmConfig,
99
+ sourceRun: init.sourceRun,
100
+ dryRun: init.dryRun,
101
+ signal: init.signal,
102
+ now: init.now ?? Date.now,
103
+ readFile: init.io?.readFile ?? ((filePath) => fs.readFileSync(filePath, "utf8")),
104
+ writeFile: init.io?.writeFile ?? ((filePath, content) => fs.writeFileSync(filePath, content, "utf8")),
105
+ };
106
+ return buildRunContext(carriers, null);
107
+ }
108
+ /**
109
+ * Resolve the run's stash directory at the improve builder boundary: the
110
+ * explicit `options.stashDir` when the caller passed one, else the ambient
111
+ * resolveStashDir() fallback. WI-9.10d: this is the SINGLE resolveStashDir
112
+ * call site on the improve path — the verb entries call THIS instead of
113
+ * resolveStashDir directly, so the ambient read lives only in the builder
114
+ * module. (The CLI-wide resolveStashDir sweep for non-improve commands is a
115
+ * deferred follow-on — see the chunk-9 ledger WI-9.10d entry.)
116
+ */
117
+ export function resolveRunStashDir(explicitStashDir) {
118
+ return explicitStashDir ?? resolveStashDir();
119
+ }
@@ -45,8 +45,10 @@
45
45
  *
46
46
  * @module salience
47
47
  */
48
- import { makeAssetRef } from "../../core/asset/asset-ref.js";
49
- import { getAllEntries, getUtilityScoresByIds } from "../../indexer/db/db.js";
48
+ import path from "node:path";
49
+ import { conceptIdFromTypeName } from "../../core/asset/resolve-ref.js";
50
+ import { getAllEntries } from "../../storage/repositories/index-entries-repository.js";
51
+ import { getUtilityScoresByIds } from "../../storage/repositories/index-utility-repository.js";
50
52
  import { WARM_START_CAP } from "./outcome-loop.js";
51
53
  // ── One day in ms ─────────────────────────────────────────────────────────────
52
54
  const DAY_MS = 86_400_000;
@@ -207,7 +209,7 @@ export function computeSalience(inputs) {
207
209
  // When `outcomeWeightEnabled` is true/absent (DEFAULT ON since the G2
208
210
  // saturation cap landed): use WS-2 weights (w_e=0.25, w_o=0.15, w_r=0.60)
209
211
  // so the prediction-error outcome signal actually shapes rankScore — this
210
- // is the R1 loop-closure from docs/design/improve-self-learning-analysis.md.
212
+ // is the R1 loop-closure.
211
213
  //
212
214
  // When `outcomeWeightEnabled` is explicitly false (operator opt-out via
213
215
  // `improve.salience.outcomeWeightEnabled: false`): fall back to the WS-1
@@ -233,132 +235,21 @@ export function computeSalience(inputs) {
233
235
  const rankScore = Math.min(1, Math.max(0, rawRankScore));
234
236
  return { encoding, outcome, retrieval, rankScore, encodingSource };
235
237
  }
238
+ // ── state.db persistence ─────────────────────────────────────────────────────
239
+ //
240
+ // The three sub-scores live in state.db::asset_salience. Raw SQL now lives in
241
+ // storage/repositories/salience-repository.ts (#672 part 2) — extracted
242
+ // verbatim, only relocated behind the repository boundary. Re-exported here so
243
+ // existing importers of this module resolve unchanged. Migrations live in
244
+ // state-db.ts (migration 009).
245
+ export { getAllRankScores, getAssetSalience, getConsecutiveNoOps, recordNoOp, resetConsecutiveNoOps, upsertAssetSalience, } from "../../storage/repositories/salience-repository.js";
236
246
  /**
237
247
  * Does this row carry a genuine content-derived `encoding_salience` (#644)?
238
248
  *
239
- * Returns true when the provenance flag is `"content"`. For legacy rows
240
- * (`encoding_source === null`, written before migration 015) we apply a
241
- * conservative heuristic: treat the stored value as content-derived only when it
242
- * does NOT equal the pure type-weight stub for the asset's type — because before
243
- * the #644 fix every run overwrote real scores with the stub, a value that still
244
- * differs from the stub must have been content-written and never re-clobbered.
245
- * When the type cannot be determined (no `type` given) a null-provenance row is
246
- * treated as a stub (the safe default).
247
- */
248
- export function isContentEncodingRow(row, type) {
249
- if (row.encoding_source === "content")
250
- return true;
251
- if (row.encoding_source === "type-stub")
252
- return false;
253
- // Legacy NULL provenance: differ-from-stub heuristic.
254
- if (!type)
255
- return false;
256
- const stub = DEFAULT_TYPE_ENCODING_WEIGHTS[type] ?? DEFAULT_ENCODING_SALIENCE;
257
- return Math.abs(row.encoding_salience - stub) > 1e-9;
258
- }
259
- /**
260
- * Upsert salience scores for one asset into state.db.
261
- *
262
- * Idempotent: safe to call every run; updates the outcome / retrieval / rank
263
- * columns on conflict.
264
- *
265
- * #644 — encoding provenance guard: the `encoding_salience` + `encoding_source`
266
- * columns are NOT lowered from a real content-derived score to a type-weight
267
- * stub. When the stored row is `encoding_source = 'content'` and the incoming
268
- * vector is a `type-stub` fallback, the stored encoding score and its provenance
269
- * are preserved (only the other sub-scores and `rank_score` advance). A `content`
270
- * write always wins; a `type-stub` write only seeds a row that has no content
271
- * score yet. This stops the improve loop's type-weight fallback re-asserting the
272
- * stub over a distill-written score on every run.
273
- *
274
- * NOTE: when the guard preserves the stored encoding score, the incoming
275
- * `vector.rankScore` (computed from the stub encoding) is still written. Callers
276
- * that want the rank_score to reflect the preserved content score should pass the
277
- * stored content score back in as `inputs.encodingSalience` to `computeSalience`
278
- * — which the improve loop does. The guard here is the defensive backstop.
249
+ * Unknown provenance is not treated as content-derived.
279
250
  */
280
- export function upsertAssetSalience(db, ref, vector, now) {
281
- const ts = now ?? Date.now();
282
- db.prepare(`INSERT INTO asset_salience
283
- (asset_ref, encoding_salience, outcome_salience, retrieval_salience, rank_score, consecutive_no_ops, updated_at, encoding_source)
284
- VALUES (?, ?, ?, ?, ?, 0, ?, ?)
285
- ON CONFLICT(asset_ref) DO UPDATE SET
286
- -- #644: never lower a real content-derived score to a type-weight stub.
287
- -- Keep the stored encoding score + provenance when the stored row is
288
- -- 'content' and the incoming write is a 'type-stub' fallback.
289
- encoding_salience = CASE
290
- WHEN asset_salience.encoding_source = 'content' AND excluded.encoding_source = 'type-stub'
291
- THEN asset_salience.encoding_salience
292
- ELSE excluded.encoding_salience
293
- END,
294
- encoding_source = CASE
295
- WHEN asset_salience.encoding_source = 'content' AND excluded.encoding_source = 'type-stub'
296
- THEN asset_salience.encoding_source
297
- ELSE excluded.encoding_source
298
- END,
299
- outcome_salience = excluded.outcome_salience,
300
- retrieval_salience = excluded.retrieval_salience,
301
- rank_score = excluded.rank_score,
302
- updated_at = excluded.updated_at`).run(ref, vector.encoding, vector.outcome, vector.retrieval, vector.rankScore, ts, vector.encodingSource ?? "type-stub");
303
- }
304
- /**
305
- * Load the salience row for one asset, or undefined if not yet computed.
306
- */
307
- export function getAssetSalience(db, ref) {
308
- const row = db
309
- .prepare(`SELECT asset_ref, encoding_salience, outcome_salience, retrieval_salience,
310
- rank_score, consecutive_no_ops, updated_at, encoding_source
311
- FROM asset_salience WHERE asset_ref = ?`)
312
- .get(ref);
313
- // Bun SQLite returns null (not undefined) when no row found.
314
- return row == null ? undefined : row;
315
- }
316
- /**
317
- * Load ALL rank scores from the asset_salience table (full-stash query).
318
- *
319
- * Used by the forgetting-safety report (plan §WS-1 step 7) to compute stash-wide
320
- * rank positions rather than pool-relative positions. Returns an empty Map when the
321
- * table is empty (first WS-1 run = no pre-existing rows).
322
- *
323
- * Order is unspecified; callers must sort before assigning 1-indexed positions.
324
- */
325
- export function getAllRankScores(db) {
326
- const rows = db.prepare("SELECT asset_ref, rank_score FROM asset_salience").all();
327
- const result = new Map();
328
- for (const row of rows) {
329
- result.set(row.asset_ref, row.rank_score);
330
- }
331
- return result;
332
- }
333
- // ── Plasticity helpers ────────────────────────────────────────────────────────
334
- /**
335
- * Increment `consecutive_no_ops` for an asset. Called after a no-op reflect/distill.
336
- * Has NO effect on `rank_score` — the plasticity counter only dampens consolidation
337
- * selection, not retrieval ranking. See plan §WS-1 step 8.
338
- *
339
- * Invariant: recordNoOp must never originate rank_score semantics. If the asset has
340
- * no salience row yet (persistence's best-effort try/catch may have swallowed an
341
- * error), we do nothing — a no-op counter is meaningless without a rank_score row,
342
- * and a synthetic INSERT would fabricate a rank_score=0 entry that could produce
343
- * false catastrophic-forgetting signals in buildRankChangeReport.
344
- */
345
- export function recordNoOp(db, ref) {
346
- db.prepare(`UPDATE asset_salience SET consecutive_no_ops = consecutive_no_ops + 1, updated_at = ? WHERE asset_ref = ?`).run(Date.now(), ref);
347
- // If changes === 0 the asset has no salience row yet — leave the table unchanged.
348
- }
349
- /**
350
- * Reset `consecutive_no_ops` to 0 when an asset produces an accepted change.
351
- * Call after a successful proposal acceptance or detected mutation.
352
- */
353
- export function resetConsecutiveNoOps(db, ref) {
354
- db.prepare(`UPDATE asset_salience SET consecutive_no_ops = 0, updated_at = ? WHERE asset_ref = ?`).run(Date.now(), ref);
355
- }
356
- /**
357
- * Return the `consecutive_no_ops` count for one asset. 0 when unknown.
358
- */
359
- export function getConsecutiveNoOps(db, ref) {
360
- const row = db.prepare(`SELECT consecutive_no_ops FROM asset_salience WHERE asset_ref = ?`).get(ref);
361
- return row?.consecutive_no_ops ?? 0;
251
+ export function isContentEncodingRow(row) {
252
+ return row.encoding_source === "content";
362
253
  }
363
254
  // ── Consolidation-selection dampener constants ────────────────────────────────
364
255
  //
@@ -424,15 +315,21 @@ export function buildRankChangeReport(oldRanks, newRanks, oldTopN = 200, forgett
424
315
  * @param indexDb - An open read-capable index database connection.
425
316
  * @param refs - The set of asset refs to look up.
426
317
  */
427
- export function getLastUseMsByRef(indexDb, refs) {
318
+ export function getLastUseMsByRef(indexDb, refs, stashDir) {
428
319
  const result = new Map();
429
320
  if (refs.length === 0)
430
321
  return result;
431
322
  const refSet = new Set(refs);
432
323
  const allEntries = getAllEntries(indexDb);
324
+ const selectedRoot = stashDir ? path.resolve(stashDir) : undefined;
433
325
  const idToRef = new Map();
434
326
  for (const indexed of allEntries) {
435
- const ref = makeAssetRef(indexed.entry.type, indexed.entry.name);
327
+ if (selectedRoot && path.resolve(indexed.stashDir) !== selectedRoot)
328
+ continue;
329
+ // In-memory correlation key, NOT a durable write: it must match the caller's
330
+ // `refs` (the `ImproveEligibleRef.ref`, now the SHORT conceptId — Chunk-8
331
+ // WI-8.5c flipped the candidate-ref spelling to match the display flip).
332
+ const ref = conceptIdFromTypeName(indexed.entry.type, indexed.entry.name);
436
333
  if (refSet.has(ref))
437
334
  idToRef.set(indexed.id, ref);
438
335
  }
@@ -23,8 +23,9 @@
23
23
  */
24
24
  import fs from "node:fs";
25
25
  import path from "node:path";
26
+ import { stashDirFor } from "../../core/asset/asset-placement.js";
26
27
  import { assembleAsset } from "../../core/asset/asset-serialize.js";
27
- import { TYPE_DIRS } from "../../core/asset/asset-spec.js";
28
+ import { conceptIdFromTypeName } from "../../core/asset/resolve-ref.js";
28
29
  import { normalizeHarnessId } from "../../integrations/harnesses/index.js";
29
30
  /**
30
31
  * JSON Schema for the session-summary LLM call. Strict so providers that
@@ -218,7 +219,7 @@ export function buildSessionAssetContent(data, summary) {
218
219
  }
219
220
  /** Resolve `<stash>/sessions/<harness>/<session-id>.md`. */
220
221
  export function resolveSessionAssetPath(stashDir, harness, sessionId) {
221
- const dir = TYPE_DIRS.session ?? "sessions";
222
+ const dir = stashDirFor("session") ?? "sessions";
222
223
  return path.join(stashDir, dir, normalizeHarnessId(harness), `${sessionId}.md`);
223
224
  }
224
225
  /**
@@ -242,7 +243,10 @@ export async function writeSessionAsset(data, stashDir, generate) {
242
243
  return {
243
244
  written: true,
244
245
  filePath,
245
- ref: `session:${normalizeHarnessId(harness)}/${sessionId}`,
246
+ // Canonical 0.9.0 conceptId (`sessions/<harness>/<id>`, D-R3) — the same
247
+ // spelling the xrefs / usage-event readers now expect. Historical
248
+ // `session:<harness>/<id>` rows persist un-migrated and are tolerated.
249
+ ref: conceptIdFromTypeName("session", `${normalizeHarnessId(harness)}/${sessionId}`),
246
250
  logPath: data.ref.filePath,
247
251
  };
248
252
  }
@@ -1,10 +1,20 @@
1
1
  // This Source Code Form is subject to the terms of the Mozilla Public
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
- import { getDefaultLlmConfig, getImproveProcessConfig } from "../../core/config/config.js";
5
- import { warn } from "../../core/warn.js";
6
- import { resolveImproveProcessRunnerFromProfile, runnerIsLlm } from "../../integrations/agent/runner.js";
7
- import { chatCompletion } from "../../llm/client.js";
4
+ /**
5
+ * Small pure helpers shared across the improve command family. Extracted to
6
+ * delete byte-identical duplication that previously lived inline in the
7
+ * per-process passes (the whole-corpus synthesis pass removed in 0.9.0 and
8
+ * the procedural-compilation pass removed in 0.9.0). Keep this file free of
9
+ * I/O and of any improve-specific state — these are leaf utilities.
10
+ */
11
+ /**
12
+ * Cap on how many prior rejected proposals for a ref are injected as
13
+ * Reflexion-style verbal-RL context so the LLM avoids regenerating refusals.
14
+ * Shared by both the revise (reflect) and learn (distill) verbs, which
15
+ * previously declared this constant independently.
16
+ */
17
+ export const MAX_REJECTED_PROPOSALS = 3;
8
18
  /** Normalize an unknown thrown value to a human-readable message string. */
9
19
  export function errMessage(e) {
10
20
  return e instanceof Error ? e.message : String(e);
@@ -19,33 +29,3 @@ export function refSlug(ref) {
19
29
  .toLowerCase()
20
30
  .slice(0, 60);
21
31
  }
22
- /**
23
- * Resolve the production LLM seam for an improve process (`recombine` /
24
- * `procedural`). Returns a function that issues one bounded chatCompletion per
25
- * call, or `undefined` when no LLM is configured (the pass then makes no
26
- * calls). Previously copied verbatim in recombine.ts and procedural.ts.
27
- *
28
- * When `opts.activeProfile` is supplied, its per-process runner override wins
29
- * over the `default` profile so `akm improve --profile <name>` selects the
30
- * profile's model; absent falls back to `default`.
31
- */
32
- export function resolveImproveLlmFn(config, opts) {
33
- const processConfig = getImproveProcessConfig(config, opts.processKey, opts.activeProfile);
34
- const runnerSpec = resolveImproveProcessRunnerFromProfile(processConfig, config);
35
- const llmConfig = runnerSpec && runnerIsLlm(runnerSpec) ? runnerSpec.connection : getDefaultLlmConfig(config);
36
- if (!llmConfig)
37
- return undefined;
38
- return async (prompt) => {
39
- const messages = [
40
- { role: "system", content: opts.systemPrompt },
41
- { role: "user", content: prompt },
42
- ];
43
- try {
44
- return await chatCompletion(llmConfig, messages, { signal: opts.signal, enableThinking: false });
45
- }
46
- catch (e) {
47
- warn(`${opts.tag} LLM call failed: ${String(e)}`);
48
- return null;
49
- }
50
- };
51
- }
@@ -0,0 +1,28 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ // ── Durable improve-state keys ───────────────────────────────────────────────
5
+ //
6
+ // Every improve ref uses the current grammar (a short conceptId), and the durable
7
+ // state key is the resolved index entry's `item_ref` when the planner supplied
8
+ // one, else the conceptId `ref` itself (`preparation.ts`
9
+ // `salienceWriteKey`/`outcomeWriteKey` = `itemRef ?? ref`).
10
+ /**
11
+ * The durable improve-state key for a ref with no resolved `item_ref` — the
12
+ * conceptId `ref` itself.
13
+ */
14
+ export function durableImproveRef(ref) {
15
+ return ref;
16
+ }
17
+ /** Return the conceptId portion of a durable improve-state key. */
18
+ export function bareImproveRef(ref) {
19
+ const boundary = ref.indexOf("//");
20
+ return boundary >= 0 ? ref.slice(boundary + 2) : ref;
21
+ }
22
+ /**
23
+ * The single durable improve-state key used by both readers and writers.
24
+ * Indexed entries use item_ref; direct or provenance-free refs use conceptId.
25
+ */
26
+ export function improveStateReadRefs(ref, itemRef) {
27
+ return [itemRef ?? ref];
28
+ }
@@ -14,7 +14,23 @@ const MARKER_RE = /\b(error|failed|fix(?:ed)?|root cause|turns out|because|decid
14
14
  const EDIT_COMMIT_RE = /\b(Edit|Write|MultiEdit|git commit|diff)\b/i;
15
15
  // A substantive turn is an assistant or tool turn whose text is non-trivial.
16
16
  const SUBSTANTIVE_MIN_CHARS = 40;
17
- export function scoreSessionTriage(data, minScore, options) {
17
+ /**
18
+ * Pure heuristic scorer. Operates only on `data.events`. Each sub-signal is
19
+ * normalized to a small bounded contribution; `score` is their sum and
20
+ * `pass = score >= minScore`.
21
+ *
22
+ * Sub-signals:
23
+ * - markers: presence of decision/outcome/error keywords across event text
24
+ * (capped, narrative-lesson signal).
25
+ * - toolDensity: bounded contribution from tool-use events.
26
+ * - editCommit: bounded contribution from edit/write/commit events.
27
+ * - substantiveRatio: scaled fraction of non-trivial assistant+tool turns,
28
+ * filtering pure short Q&A.
29
+ *
30
+ * toolDensity + editCommit alone can clear DEFAULT_TRIAGE_MIN_SCORE so
31
+ * high-action / no-narrative sessions are KEPT.
32
+ */
33
+ export function scoreSessionTriage(data, minScore) {
18
34
  const events = data.events;
19
35
  const total = events.length;
20
36
  // (a) markers — count word-bounded marker hits across all event text, capped.
@@ -57,18 +73,7 @@ export function scoreSessionTriage(data, minScore, options) {
57
73
  const subscores = { markers, toolDensity, editCommit, substantiveRatio };
58
74
  const score = markers + toolDensity + editCommit + substantiveRatio;
59
75
  // Base gate: score must clear the floor.
60
- let pass = score >= minScore;
61
- // #641 procedural-aware floor (opt-in, DEFAULT OFF).
62
- // When enabled, a session that clears the score gate must ALSO have at least
63
- // one narrative marker (markers >= 1) OR meaningful edit/commit signal
64
- // (editCommit >= 0.5). Pure read-only Q&A sessions that pass only via
65
- // toolDensity + substantiveRatio are rejected as low-signal.
66
- if (pass && options?.proceduralAwareFloor === true) {
67
- const hasProceduralSignal = markers >= 1 || editCommit >= 0.5;
68
- if (!hasProceduralSignal) {
69
- pass = false;
70
- }
71
- }
76
+ const pass = score >= minScore;
72
77
  return {
73
78
  pass,
74
79
  score,
@@ -78,7 +83,7 @@ export function scoreSessionTriage(data, minScore, options) {
78
83
  }
79
84
  /**
80
85
  * Resolve the effective triage config from the extract process config. Mirrors
81
- * the minContentChars / schemaSimilarity resolution style in akmExtract.
86
+ * the minContentChars resolution style in akmExtract.
82
87
  *
83
88
  * Default-off: `enabled` is FALSE unless `triage.enabled === true`. `minScore`
84
89
  * defaults to {@link DEFAULT_TRIAGE_MIN_SCORE}.
@@ -87,7 +92,5 @@ export function resolveTriageConfig(extractProcess) {
87
92
  const triage = extractProcess?.triage;
88
93
  const enabled = triage?.enabled === true;
89
94
  const minScore = typeof triage?.minScore === "number" ? triage.minScore : DEFAULT_TRIAGE_MIN_SCORE;
90
- // #641: default-off — only true when explicitly set to true.
91
- const proceduralAwareFloor = triage?.proceduralAwareFloor === true;
92
- return { enabled, minScore, proceduralAwareFloor };
95
+ return { enabled, minScore };
93
96
  }