akm-cli 0.9.0-rc.8 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (450) hide show
  1. package/CHANGELOG.md +1063 -44
  2. package/README.md +51 -25
  3. package/SECURITY.md +14 -1
  4. package/STABILITY.md +497 -0
  5. package/dist/akm +148 -35
  6. package/dist/{akm-migrate-storage → akm-migrate} +6 -9
  7. package/dist/assets/hints/cli-hints-full.md +223 -95
  8. package/dist/assets/hints/cli-hints-short.md +85 -22
  9. package/dist/assets/improve-strategies/default.json +1 -1
  10. package/dist/assets/improve-strategies/reflect-distill.json +1 -1
  11. package/dist/assets/prompts/memory-infer-user.md +2 -3
  12. package/dist/assets/stash-skeleton/README.md +6 -5
  13. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +2 -0
  14. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +2 -0
  15. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +2 -0
  16. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +2 -0
  17. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +2 -0
  18. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +2 -0
  19. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +2 -0
  20. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +2 -0
  21. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +2 -0
  22. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +2 -0
  23. package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -0
  24. package/dist/assets/stash-skeleton/facts/conventions/organization.md +20 -9
  25. package/dist/assets/tasks/core/extract.yml +1 -1
  26. package/dist/assets/tasks/core/version-check.yml +1 -1
  27. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  28. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  29. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  30. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  31. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  32. package/dist/assets/templates/html/health.html +1 -3
  33. package/dist/assets/workflows/workflow-template.md +32 -15
  34. package/dist/cli/invocation.js +40 -15
  35. package/dist/cli/parse-args.js +0 -22
  36. package/dist/cli/retired-commands.js +121 -0
  37. package/dist/cli/shared.js +154 -22
  38. package/dist/cli/unknown-flags.js +236 -0
  39. package/dist/cli-node.mjs +2 -1
  40. package/dist/cli.js +696 -258
  41. package/dist/commands/agent/agent-dispatch.js +14 -3
  42. package/dist/commands/agent/contribute-cli.js +73 -88
  43. package/dist/commands/completions.js +79 -22
  44. package/dist/commands/config-cli.js +17 -150
  45. package/dist/commands/env/env-cli.js +59 -143
  46. package/dist/commands/env/env.js +12 -163
  47. package/dist/commands/env/marker-path.js +6 -0
  48. package/dist/commands/env/secret-cli.js +36 -66
  49. package/dist/commands/env/secret.js +24 -57
  50. package/dist/commands/feedback-cli.js +141 -87
  51. package/dist/commands/health/accept-rate.js +58 -0
  52. package/dist/commands/health/advisories.js +3 -4
  53. package/dist/commands/health/checks.js +85 -23
  54. package/dist/commands/health/html-report.js +7 -10
  55. package/dist/commands/health/improve-metrics.js +25 -83
  56. package/dist/commands/health/md-report.js +5 -9
  57. package/dist/commands/health/metrics.js +62 -20
  58. package/dist/commands/health/renderers.js +47 -0
  59. package/dist/commands/health/report-view-model.js +4 -5
  60. package/dist/commands/health/stash-exposure.js +1 -1
  61. package/dist/commands/health/surfaces.js +3 -48
  62. package/dist/commands/health/task-runs.js +3 -67
  63. package/dist/commands/health/types-improve.js +7 -0
  64. package/dist/commands/health.js +99 -28
  65. package/dist/commands/improve/anti-collapse.js +2 -2
  66. package/dist/commands/improve/autonomy-gate.js +68 -0
  67. package/dist/commands/improve/collapse-detector.js +41 -40
  68. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  69. package/dist/commands/improve/consolidate/merge.js +4 -0
  70. package/dist/commands/improve/consolidate.js +140 -1000
  71. package/dist/commands/improve/distill/promote-memory.js +12 -12
  72. package/dist/commands/improve/distill/quality-gate.js +6 -6
  73. package/dist/commands/improve/distill.js +58 -69
  74. package/dist/commands/improve/eligibility.js +105 -57
  75. package/dist/commands/improve/extract-cli.js +14 -133
  76. package/dist/commands/improve/improve-cli.js +98 -114
  77. package/dist/commands/improve/improve-result-file.js +1 -28
  78. package/dist/commands/improve/improve-strategies.js +8 -5
  79. package/dist/commands/improve/improve.js +128 -91
  80. package/dist/commands/improve/loop-stages.js +182 -20
  81. package/dist/commands/improve/memory/derived-ref.js +45 -43
  82. package/dist/commands/improve/memory/memory-belief.js +1 -1
  83. package/dist/commands/improve/memory/memory-contradiction-detect.js +4 -12
  84. package/dist/commands/improve/memory/memory-improve.js +6 -5
  85. package/dist/commands/improve/outcome-loop.js +22 -65
  86. package/dist/commands/improve/preparation.js +114 -123
  87. package/dist/commands/improve/proactive-maintenance.js +2 -5
  88. package/dist/commands/improve/reflect.js +56 -160
  89. package/dist/commands/improve/salience.js +11 -122
  90. package/dist/commands/improve/source-identity.js +10 -38
  91. package/dist/commands/lint/base-linter.js +20 -124
  92. package/dist/commands/lint/env-key-rules.js +31 -47
  93. package/dist/commands/lint/index.js +249 -43
  94. package/dist/commands/{events.js → log.js} +33 -38
  95. package/dist/commands/migrate-cli.js +92 -12
  96. package/dist/commands/migration-tool.js +46 -0
  97. package/dist/commands/observability-cli.js +70 -209
  98. package/dist/commands/proposal/drain.js +101 -29
  99. package/dist/commands/proposal/proposal-cli.js +76 -48
  100. package/dist/commands/proposal/proposal.js +54 -18
  101. package/dist/commands/proposal/propose-cli.js +88 -0
  102. package/dist/commands/proposal/propose.js +23 -15
  103. package/dist/commands/proposal/repository.js +701 -278
  104. package/dist/commands/proposal/validators/proposal-quality-validators.js +2 -8
  105. package/dist/commands/proposal/validators/proposal-validators.js +55 -7
  106. package/dist/commands/proposal/validators/proposals.js +4 -7
  107. package/dist/commands/read/curate.js +34 -53
  108. package/dist/commands/read/knowledge.js +150 -95
  109. package/dist/commands/read/registry-search.js +2 -2
  110. package/dist/commands/read/remember-cli.js +42 -15
  111. package/dist/commands/read/search-cli.js +180 -78
  112. package/dist/commands/read/search.js +58 -43
  113. package/dist/commands/read/show.js +197 -141
  114. package/dist/commands/registry-cli.js +12 -51
  115. package/dist/commands/remember.js +14 -57
  116. package/dist/commands/sources/add-cli.js +100 -31
  117. package/dist/commands/sources/bundle-cli.js +166 -0
  118. package/dist/commands/sources/bundle-config-ops.js +7 -2
  119. package/dist/commands/sources/info.js +18 -5
  120. package/dist/commands/sources/init.js +12 -12
  121. package/dist/commands/sources/installed-stashes.js +382 -98
  122. package/dist/commands/sources/schema-repair.js +3 -2
  123. package/dist/commands/sources/self-update.js +131 -38
  124. package/dist/commands/sources/source-add.js +72 -17
  125. package/dist/commands/sources/source-clone.js +129 -45
  126. package/dist/commands/sources/source-manage.js +43 -23
  127. package/dist/commands/sources/sources-cli.js +57 -208
  128. package/dist/commands/sources/stash-cli.js +46 -53
  129. package/dist/commands/tasks/tasks-cli.js +91 -97
  130. package/dist/commands/tasks/tasks.js +276 -421
  131. package/dist/commands/workflow-cli.js +175 -450
  132. package/dist/core/adapter/adapters/akm-adapter.js +47 -28
  133. package/dist/core/adapter/adapters/akm-lint.js +42 -27
  134. package/dist/core/adapter/adapters/akm-metadata.js +15 -44
  135. package/dist/core/adapter/adapters/akm-task-adapter.js +15 -13
  136. package/dist/core/adapter/adapters/akm-workflow-adapter.js +55 -71
  137. package/dist/core/adapter/adapters/dotenv-adapter.js +1 -1
  138. package/dist/core/adapter/adapters/generic-files-adapter.js +2 -0
  139. package/dist/core/adapter/adapters/index.js +6 -6
  140. package/dist/core/adapter/adapters/llm-wiki-adapter.js +14 -8
  141. package/dist/core/adapter/adapters/okf-adapter.js +187 -19
  142. package/dist/core/adapter/adapters/shared.js +3 -19
  143. package/dist/core/adapter/adapters/tool-dir-shared.js +8 -3
  144. package/dist/core/adapter/adapters/website-snapshot-adapter.js +1 -0
  145. package/dist/core/adapter/detect-adapter.js +17 -0
  146. package/dist/core/adapter/recognize-match.js +6 -4
  147. package/dist/core/adapter/validate-context.js +214 -0
  148. package/dist/core/asset/akm-markdown.js +63 -0
  149. package/dist/core/asset/asset-placement.js +20 -6
  150. package/dist/core/asset/asset-ref.js +11 -9
  151. package/dist/core/asset/frontmatter-lint.js +30 -0
  152. package/dist/core/asset/frontmatter.js +37 -9
  153. package/dist/core/asset/markdown.js +40 -51
  154. package/dist/core/asset/resolve-ref.js +89 -18
  155. package/dist/core/asset/stash-meta.js +1 -1
  156. package/dist/core/bundle-id.js +51 -0
  157. package/dist/core/common.js +152 -38
  158. package/dist/core/config/config-io.js +12 -1
  159. package/dist/core/config/config-schema.js +35 -8
  160. package/dist/core/config/config-sources.js +55 -11
  161. package/dist/core/config/config-walker.js +25 -9
  162. package/dist/core/config/config.js +9 -48
  163. package/dist/core/config/experimental.js +21 -0
  164. package/dist/core/config/schema/embedding.js +5 -1
  165. package/dist/core/config/schema/experimental.js +30 -0
  166. package/dist/core/config/schema/improve-processes.js +0 -6
  167. package/dist/core/config/schema/improve.js +21 -3
  168. package/dist/core/config/schema/index-config.js +8 -15
  169. package/dist/core/config/schema/output.js +4 -1
  170. package/dist/core/config/schema/setup.js +9 -18
  171. package/dist/core/config/schema/sources-bundles.js +49 -33
  172. package/dist/core/config/schema/workflow.js +3 -3
  173. package/dist/core/env-secret-ref.js +76 -46
  174. package/dist/core/errors.js +18 -12
  175. package/dist/core/events.js +46 -128
  176. package/dist/core/file-change.js +6 -5
  177. package/dist/core/fs-txn.js +83 -7
  178. package/dist/core/git-message.js +2 -2
  179. package/dist/core/improve-result.js +1 -100
  180. package/dist/core/lesson-lint.js +1 -17
  181. package/dist/core/logs-db.js +2 -1
  182. package/dist/core/migration-operation.js +16 -0
  183. package/dist/core/mutation-target.js +78 -0
  184. package/dist/core/parse.js +4 -1
  185. package/dist/core/paths.js +17 -20
  186. package/dist/core/recognition-util.js +12 -14
  187. package/dist/core/redaction.js +34 -0
  188. package/dist/core/standards/resolve-standards-context.js +2 -14
  189. package/dist/core/standards/resolve-stash-standards.js +2 -2
  190. package/dist/core/standards/resolve-type-conventions.js +2 -2
  191. package/dist/core/state/migrations.js +41 -18
  192. package/dist/core/state-db.js +5 -14
  193. package/dist/core/structured.js +1 -1
  194. package/dist/core/subprocess.js +6 -4
  195. package/dist/core/text-truncation.js +9 -5
  196. package/dist/core/type-presentation.js +3 -3
  197. package/dist/core/warn.js +0 -3
  198. package/dist/core/write-source.js +771 -95
  199. package/dist/indexer/bundle-identity-guard.js +3 -2
  200. package/dist/indexer/db/graph-db.js +0 -24
  201. package/dist/indexer/ensure-index.js +1 -0
  202. package/dist/indexer/graph/graph-boost.js +9 -34
  203. package/dist/indexer/graph/graph-extraction.js +8 -5
  204. package/dist/indexer/index-writer-lock.js +53 -17
  205. package/dist/indexer/index-written-assets.js +16 -22
  206. package/dist/indexer/indexer.js +497 -239
  207. package/dist/indexer/installations.js +14 -96
  208. package/dist/indexer/passes/dir-staleness.js +16 -9
  209. package/dist/indexer/passes/memory-inference.js +11 -9
  210. package/dist/indexer/passes/metadata.js +113 -47
  211. package/dist/indexer/scan/doc-to-entry.js +38 -1
  212. package/dist/indexer/scan/drain-dir.js +13 -23
  213. package/dist/indexer/search/db-search.js +99 -54
  214. package/dist/indexer/search/fts-query.js +47 -24
  215. package/dist/indexer/search/ranking-contributors.js +42 -20
  216. package/dist/indexer/search/ranking.js +18 -99
  217. package/dist/indexer/search/search-fields.js +7 -2
  218. package/dist/indexer/search/search-source.js +82 -93
  219. package/dist/indexer/usage/usage-events.js +0 -89
  220. package/dist/indexer/walk/file-context.js +2 -1
  221. package/dist/indexer/walk/matchers.js +30 -43
  222. package/dist/indexer/walk/path-resolver.js +7 -2
  223. package/dist/indexer/walk/walker.js +38 -12
  224. package/dist/integrations/agent/builders.js +0 -6
  225. package/dist/integrations/agent/config.js +2 -2
  226. package/dist/integrations/agent/detect.js +49 -19
  227. package/dist/integrations/agent/engine-fallback.js +76 -0
  228. package/dist/integrations/agent/profiles.js +14 -0
  229. package/dist/integrations/agent/prompts.js +12 -8
  230. package/dist/integrations/agent/runner-dispatch.js +4 -2
  231. package/dist/integrations/agent/runner.js +0 -1
  232. package/dist/integrations/agent/spawn.js +5 -6
  233. package/dist/integrations/github.js +1 -1
  234. package/dist/integrations/harnesses/aider/agent-builder.js +6 -4
  235. package/dist/integrations/harnesses/amazonq/agent-builder.js +7 -4
  236. package/dist/integrations/harnesses/claude/session-log.js +0 -10
  237. package/dist/integrations/harnesses/codex/agent-builder.js +5 -2
  238. package/dist/integrations/harnesses/copilot/agent-builder.js +5 -3
  239. package/dist/integrations/harnesses/gemini/agent-builder.js +5 -3
  240. package/dist/integrations/harnesses/index.js +3 -7
  241. package/dist/integrations/harnesses/opencode/agent-builder.js +21 -2
  242. package/dist/integrations/harnesses/opencode/session-log.js +0 -15
  243. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +13 -4
  244. package/dist/integrations/harnesses/openhands/agent-builder.js +9 -6
  245. package/dist/integrations/harnesses/pi/agent-builder.js +6 -4
  246. package/dist/integrations/lockfile.js +101 -6
  247. package/dist/integrations/session-logs/index.js +3 -28
  248. package/dist/llm/client.js +136 -100
  249. package/dist/llm/embedders/remote.js +13 -5
  250. package/dist/llm/feature-gate.js +4 -12
  251. package/dist/llm/graph-extract.js +5 -11
  252. package/dist/llm/memory-infer.js +144 -1
  253. package/dist/llm/metadata-enhance.js +5 -7
  254. package/dist/llm/structured-call.js +1 -1
  255. package/dist/llm/usage-persist.js +26 -5
  256. package/dist/llm/usage-telemetry.js +25 -2
  257. package/dist/output/cli-hints.js +1 -2
  258. package/dist/output/context.js +22 -7
  259. package/dist/output/format-exempt.js +80 -0
  260. package/dist/output/generic-render.js +259 -0
  261. package/dist/output/render-registry.js +57 -0
  262. package/dist/output/renderers.js +14 -36
  263. package/dist/output/shapes/curate.js +10 -1
  264. package/dist/output/shapes/events.js +12 -7
  265. package/dist/output/shapes/helpers.js +56 -83
  266. package/dist/output/shapes/migrate.js +8 -0
  267. package/dist/output/shapes/passthrough.js +7 -41
  268. package/dist/output/shapes/proposal/producer.js +15 -7
  269. package/dist/output/shapes.js +2 -9
  270. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  271. package/dist/output/text/bundle-show.js +7 -0
  272. package/dist/output/text/command-format.js +164 -96
  273. package/dist/output/text/env.js +1 -3
  274. package/dist/output/text/events.js +8 -7
  275. package/dist/output/text/health-format.js +103 -0
  276. package/dist/output/text/health.js +7 -0
  277. package/dist/output/text/helpers.js +10 -8
  278. package/dist/output/text/lint-format.js +43 -0
  279. package/dist/output/text/{save.js → lint.js} +2 -2
  280. package/dist/output/text/migrate.js +88 -0
  281. package/dist/output/text/proposal/producer.js +4 -2
  282. package/dist/output/text/proposal-format.js +44 -72
  283. package/dist/output/text/registry-commands.js +1 -2
  284. package/dist/output/text/show-directives.js +15 -7
  285. package/dist/output/text/status-list.js +32 -0
  286. package/dist/output/text/sync.js +5 -0
  287. package/dist/output/text/workflow-format.js +24 -203
  288. package/dist/output/text/workflow.js +1 -7
  289. package/dist/output/text.js +16 -17
  290. package/dist/registry/factory.js +4 -6
  291. package/dist/registry/origin-resolve.js +16 -27
  292. package/dist/registry/providers/skills-sh.js +3 -3
  293. package/dist/registry/providers/static-index.js +13 -23
  294. package/dist/registry/resolve.js +42 -7
  295. package/dist/registry/semver.js +34 -84
  296. package/dist/runtime.js +2 -23
  297. package/dist/scripts/akm-migrate-node.js +60290 -0
  298. package/dist/scripts/akm-migrate.js +59628 -0
  299. package/dist/setup/detect.js +42 -15
  300. package/dist/setup/registry-stash-loader.js +2 -2
  301. package/dist/setup/setup.js +236 -136
  302. package/dist/setup/steps/connection.js +7 -9
  303. package/dist/setup/steps/platforms.js +9 -9
  304. package/dist/setup/steps/semantic.js +15 -3
  305. package/dist/setup/steps/sources.js +12 -13
  306. package/dist/setup/steps/stashdir.js +2 -3
  307. package/dist/setup/steps/tasks.js +237 -120
  308. package/dist/sources/freshness.js +1 -1
  309. package/dist/sources/provider-factory.js +11 -17
  310. package/dist/sources/providers/filesystem.js +2 -3
  311. package/dist/sources/providers/git-install.js +278 -34
  312. package/dist/sources/providers/git-provider.js +25 -23
  313. package/dist/sources/providers/git-stash.js +395 -106
  314. package/dist/sources/providers/git.js +2 -2
  315. package/dist/sources/providers/npm.js +16 -19
  316. package/dist/sources/providers/provider-utils.js +7 -4
  317. package/dist/sources/providers/sync-from-ref.js +3 -9
  318. package/dist/sources/providers/website.js +6 -1
  319. package/dist/sources/resolve.js +6 -5
  320. package/dist/sources/snapshot-fetchers/bluesky.js +146 -0
  321. package/dist/sources/snapshot-fetchers/content-extract.js +566 -0
  322. package/dist/sources/snapshot-fetchers/fetcher-util.js +41 -0
  323. package/dist/sources/snapshot-fetchers/github.js +100 -0
  324. package/dist/sources/snapshot-fetchers/host-guard.js +291 -0
  325. package/dist/sources/snapshot-fetchers/registry.js +17 -1
  326. package/dist/sources/snapshot-fetchers/robots.js +348 -0
  327. package/dist/sources/snapshot-fetchers/rss.js +282 -0
  328. package/dist/sources/snapshot-fetchers/secret-seam.js +42 -0
  329. package/dist/sources/snapshot-fetchers/website-ingest.js +566 -268
  330. package/dist/sources/snapshot-fetchers/x.js +910 -0
  331. package/dist/storage/database.js +7 -0
  332. package/dist/storage/engines/sqlite-migrations.js +23 -111
  333. package/dist/storage/managed-db.js +2 -2
  334. package/dist/storage/repositories/canaries-repository.js +1 -1
  335. package/dist/storage/repositories/events-repository.js +27 -11
  336. package/dist/storage/repositories/improve-runs-repository.js +6 -12
  337. package/dist/storage/repositories/index-connection.js +17 -6
  338. package/dist/storage/repositories/index-entries-repository.js +151 -240
  339. package/dist/storage/repositories/index-entry-mapper.js +15 -11
  340. package/dist/storage/repositories/index-fts-repository.js +5 -2
  341. package/dist/storage/repositories/index-llm-cache-repository.js +0 -1
  342. package/dist/storage/repositories/index-meta-repository.js +2 -3
  343. package/dist/storage/repositories/index-schema.js +10 -25
  344. package/dist/storage/repositories/index-utility-repository.js +15 -28
  345. package/dist/storage/repositories/index-vec-repository.js +6 -1
  346. package/dist/storage/repositories/outcome-repository.js +119 -0
  347. package/dist/storage/repositories/proposals-repository.js +296 -59
  348. package/dist/storage/repositories/registry-cache.js +19 -0
  349. package/dist/storage/repositories/salience-repository.js +172 -0
  350. package/dist/storage/repositories/task-history-repository.js +15 -13
  351. package/dist/storage/repositories/workflow-runs-repository.js +52 -40
  352. package/dist/tasks/backends/cron.js +105 -15
  353. package/dist/tasks/backends/index.js +1 -1
  354. package/dist/tasks/backends/launchd.js +85 -38
  355. package/dist/tasks/backends/schtasks.js +135 -15
  356. package/dist/tasks/embedded.js +56 -40
  357. package/dist/tasks/parser.js +7 -157
  358. package/dist/tasks/resolve-akm-bin.js +137 -59
  359. package/dist/tasks/runner.js +79 -42
  360. package/dist/tasks/scheduler-invocation.js +220 -10
  361. package/dist/tasks/schema.js +24 -1
  362. package/dist/tasks/task-id.js +1 -3
  363. package/dist/tasks/validator.js +20 -6
  364. package/dist/workflows/authoring/authoring.js +94 -143
  365. package/dist/workflows/authoring/scope-key.js +1 -1
  366. package/dist/workflows/exec/frozen-judge.js +28 -2
  367. package/dist/workflows/exec/native-executor.js +77 -57
  368. package/dist/workflows/exec/param-secrets.js +9 -9
  369. package/dist/workflows/exec/run-workflow.js +133 -79
  370. package/dist/workflows/exec/step-work.js +219 -346
  371. package/dist/{migrate-storage-node.mjs → workflows/exec/unit-dispatch.js} +1 -5
  372. package/dist/workflows/ir/compile.js +141 -270
  373. package/dist/workflows/ir/freeze.js +40 -30
  374. package/dist/workflows/ir/params.js +135 -11
  375. package/dist/workflows/ir/plan-hash.js +1 -1
  376. package/dist/workflows/ir/schema.js +25 -26
  377. package/dist/workflows/parser.js +872 -307
  378. package/dist/workflows/program/expressions.js +20 -208
  379. package/dist/workflows/program/schema.js +7 -10
  380. package/dist/workflows/renderer.js +95 -68
  381. package/dist/workflows/resource-limits.js +2 -0
  382. package/dist/workflows/runtime/checkin.js +3 -3
  383. package/dist/workflows/runtime/plan-classifier.js +16 -75
  384. package/dist/workflows/runtime/runs.js +186 -127
  385. package/dist/workflows/runtime/unit-checkin.js +1 -1
  386. package/dist/workflows/runtime/unit-phases.js +2 -2
  387. package/dist/workflows/runtime/workflow-asset-loader.js +232 -83
  388. package/dist/workflows/schema.js +1 -11
  389. package/dist/workflows/validate-summary.js +30 -36
  390. package/dist/workflows/validator.js +21 -62
  391. package/docs/README.md +68 -0
  392. package/docs/migration/README.md +8 -0
  393. package/docs/migration/release-notes/0.7.0.md +11 -11
  394. package/docs/migration/release-notes/0.9.0.md +208 -27
  395. package/docs/migration/v0.7-to-v0.8.md +46 -47
  396. package/docs/migration/v0.8-to-v0.9.md +564 -208
  397. package/docs/migration/v0.9.0-troubleshooting.md +561 -0
  398. package/docs/reference/README.md +12 -0
  399. package/docs/reference/cli.md +2253 -0
  400. package/docs/reference/configuration.md +358 -0
  401. package/docs/reference/data-and-telemetry.md +105 -42
  402. package/docs/reference/workflows.md +647 -0
  403. package/package.json +22 -11
  404. package/schemas/akm-asset-envelope.json +93 -0
  405. package/schemas/akm-config.json +81 -128
  406. package/schemas/akm-workflow.json +74 -73
  407. package/dist/assets/tasks/core/backup.yml +0 -5
  408. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  409. package/dist/cli/config-migrate.js +0 -1806
  410. package/dist/cli/config-validate.js +0 -41
  411. package/dist/commands/backup-cli.js +0 -56
  412. package/dist/commands/bundle/bundle-cli.js +0 -68
  413. package/dist/commands/bundle/bundle.js +0 -219
  414. package/dist/commands/graph/graph-cli.js +0 -124
  415. package/dist/commands/graph/graph.js +0 -489
  416. package/dist/commands/improve/extract-watch.js +0 -140
  417. package/dist/commands/mv-cli.js +0 -1221
  418. package/dist/commands/sources/history.js +0 -201
  419. package/dist/commands/tasks/default-tasks.js +0 -186
  420. package/dist/core/migration-backup.js +0 -1234
  421. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -95
  422. package/dist/llm/memory-infer-impl.js +0 -138
  423. package/dist/migrate/legacy/config-source-migration.js +0 -223
  424. package/dist/migrate/legacy/content-migration.js +0 -305
  425. package/dist/migrate/legacy/legacy-layout.js +0 -779
  426. package/dist/migrate/legacy/legacy-paths.js +0 -25
  427. package/dist/migrate/legacy/legacy-stash-json.js +0 -72
  428. package/dist/migrate/legacy/proposal-fs-import.js +0 -168
  429. package/dist/migrate/legacy/task-target-ref-migration.js +0 -272
  430. package/dist/migrate/legacy/three-db-cutover.js +0 -841
  431. package/dist/migrate/legacy/workflow-migrations-bodies.js +0 -52
  432. package/dist/migrate/legacy/workflow-migrations-frozen.js +0 -21
  433. package/dist/migrate/legacy-ref-grammar.js +0 -214
  434. package/dist/output/shapes/distill.js +0 -14
  435. package/dist/output/shapes/history.js +0 -11
  436. package/dist/output/text/distill.js +0 -6
  437. package/dist/output/text/enable-disable.js +0 -8
  438. package/dist/output/text/history.js +0 -6
  439. package/dist/registry/build-index.js +0 -382
  440. package/dist/schemas/akm-config.json +0 -4704
  441. package/dist/schemas/akm-task.json +0 -87
  442. package/dist/schemas/akm-workflow.json +0 -372
  443. package/dist/scripts/migrate-storage.js +0 -3816
  444. package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
  445. package/dist/workflows/cli.js +0 -53
  446. package/dist/workflows/exec/brief.js +0 -481
  447. package/dist/workflows/exec/report.js +0 -1460
  448. package/dist/workflows/exec/watch.js +0 -116
  449. package/dist/workflows/program/parser.js +0 -813
  450. package/dist/workflows/program/project.js +0 -104
@@ -19,7 +19,7 @@
19
19
  import fs from "node:fs";
20
20
  import { parseFrontmatter } from "../../../core/asset/frontmatter.js";
21
21
  import { appendEvent } from "../../../core/events.js";
22
- import { parseEmbeddedJsonResponse } from "../../../llm/client.js";
22
+ import { parseEmbeddedJsonResponse } from "../../../core/parse.js";
23
23
  import { isProposalSkipped } from "../../proposal/repository.js";
24
24
  import { assessMemoryKnowledgePromotionCandidate } from "../distill-promotion-policy.js";
25
25
  import { emitProposal } from "../proposal-envelope.js";
@@ -38,7 +38,7 @@ import { persistOutputEncodingSalience, runLessonQualityJudge, writeQualityRejec
38
38
  async function resolveKnowledgePromotionContent(ctx, baseContent, knowledgeRef) {
39
39
  const durableInputRef = ctx.durableInputRef ?? ctx.inputRef;
40
40
  let resolvedPromotionContent = baseContent;
41
- const existingKnowledgePath = await ctx.lookup(durableImproveRef(knowledgeRef, ctx.sourceName));
41
+ const existingKnowledgePath = await ctx.lookup(durableImproveRef(knowledgeRef));
42
42
  const existingKnowledgeContent = existingKnowledgePath && fs.existsSync(existingKnowledgePath)
43
43
  ? (() => {
44
44
  try {
@@ -77,11 +77,11 @@ async function resolveKnowledgePromotionContent(ctx, baseContent, knowledgeRef)
77
77
  // Existing content is authoritative — no update needed.
78
78
  appendEvent({
79
79
  eventType: "distill_invoked",
80
- // Chunk-5 flip F5f — item_ref when resolved, else durable (dormant today).
80
+ // Use item_ref when resolved, otherwise the input conceptId.
81
81
  ref: ctx.itemRef ?? durableInputRef,
82
82
  metadata: {
83
83
  outcome: "skipped",
84
- lessonRef: knowledgeRef,
84
+ proposalRef: knowledgeRef,
85
85
  message: "D-1: LLM resolved destination conflict as NOOP — existing content kept",
86
86
  ...ctx.eligMeta,
87
87
  },
@@ -92,7 +92,8 @@ async function resolveKnowledgePromotionContent(ctx, baseContent, knowledgeRef)
92
92
  ok: true,
93
93
  outcome: "skipped",
94
94
  inputRef: ctx.inputRef,
95
- lessonRef: knowledgeRef,
95
+ proposalRef: knowledgeRef,
96
+ skipReason: "conflict_noop",
96
97
  message: "Existing knowledge content unchanged (contradiction resolution: NOOP)",
97
98
  },
98
99
  };
@@ -198,11 +199,11 @@ export async function promoteMemoryToKnowledge(ctx) {
198
199
  if (isProposalSkipped(proposalResult)) {
199
200
  appendEvent({
200
201
  eventType: "distill_invoked",
201
- // Chunk-5 flip F5f — item_ref when resolved, else durable (dormant today).
202
+ // Use item_ref when resolved, otherwise the input conceptId.
202
203
  ref: ctx.itemRef ?? durableInputRef,
203
204
  metadata: {
204
205
  outcome: "skipped",
205
- lessonRef: promotion.knowledgeRef,
206
+ proposalRef: promotion.knowledgeRef,
206
207
  message: proposalResult.message,
207
208
  skipReason: proposalResult.reason,
208
209
  ...eligMeta,
@@ -213,21 +214,21 @@ export async function promoteMemoryToKnowledge(ctx) {
213
214
  ok: true,
214
215
  outcome: "skipped",
215
216
  inputRef,
216
- lessonRef: promotion.knowledgeRef,
217
+ proposalRef: promotion.knowledgeRef,
218
+ skipReason: proposalResult.reason,
217
219
  message: proposalResult.message,
218
220
  };
219
221
  }
220
222
  const proposal = proposalResult;
221
223
  // G4: content-score the distilled OUTPUT so it carries a real encoding
222
224
  // salience (encoding_source='content') from creation.
223
- persistOutputEncodingSalience(durableImproveRef(promotion.knowledgeRef, ctx.sourceName), resolvedPromotionContent, existingRefVocabulary, outcomeWeightEnabled);
225
+ persistOutputEncodingSalience(durableImproveRef(promotion.knowledgeRef), resolvedPromotionContent, existingRefVocabulary, outcomeWeightEnabled);
224
226
  appendEvent({
225
227
  eventType: "distill_invoked",
226
- // Chunk-5 flip F5f — item_ref when resolved, else durable (dormant today).
228
+ // Use item_ref when resolved, otherwise the input conceptId.
227
229
  ref: ctx.itemRef ?? durableInputRef,
228
230
  metadata: {
229
231
  outcome: "queued",
230
- lessonRef: promotion.knowledgeRef,
231
232
  proposalRef: promotion.knowledgeRef,
232
233
  proposalKind: "knowledge",
233
234
  proposalId: proposal.id,
@@ -244,7 +245,6 @@ export async function promoteMemoryToKnowledge(ctx) {
244
245
  ok: true,
245
246
  outcome: "queued",
246
247
  inputRef,
247
- lessonRef: promotion.knowledgeRef,
248
248
  proposalRef: promotion.knowledgeRef,
249
249
  proposalKind: "knowledge",
250
250
  proposalId: proposal.id,
@@ -13,9 +13,9 @@ import path from "node:path";
13
13
  import { parseRefInput } from "../../../core/asset/resolve-ref.js";
14
14
  import { timestampForFilename } from "../../../core/common.js";
15
15
  import { appendEvent } from "../../../core/events.js";
16
+ import { parseEmbeddedJsonResponse } from "../../../core/parse.js";
16
17
  import { withStateDb } from "../../../core/state-db.js";
17
18
  import { getDefaultLlmConfig } from "../../../integrations/agent/engine-resolution.js";
18
- import { parseEmbeddedJsonResponse } from "../../../llm/client.js";
19
19
  import { callStructured } from "../../../llm/structured-call.js";
20
20
  import { akmSearch } from "../../read/search.js";
21
21
  import { scoreEncodingSalience } from "../encoding-salience.js";
@@ -234,26 +234,26 @@ export async function runReflectQualityJudge(config, candidateContent, sourceCon
234
234
  *
235
235
  * @param stash - Root stash directory.
236
236
  * @param inputRef - The original input ref (for the event).
237
- * @param lessonRef - The proposed lesson/knowledge ref.
237
+ * @param proposalRef - The proposed lesson/knowledge ref.
238
238
  * @param content - The raw content that failed the quality gate.
239
239
  * @param score - Quality score from the judge.
240
240
  * @param reason - Human-readable rejection reason.
241
241
  * @param extraMeta - Optional additional metadata for the event.
242
242
  * @param eventsCtx - Events context so the emit takes appendEvent's fast path (R25).
243
243
  */
244
- export function writeQualityRejection(stash, inputRef, lessonRef, content, score, reason, extraMeta = {}, eligibilitySource, eventsCtx) {
244
+ export function writeQualityRejection(stash, inputRef, proposalRef, content, score, reason, extraMeta = {}, eligibilitySource, eventsCtx) {
245
245
  // D-5 / #388: reviewNeeded flag selects "review_needed" vs "quality_rejected" outcome.
246
246
  const outcome = extraMeta.reviewNeeded ? "review_needed" : "quality_rejected";
247
247
  const rejectDir = path.join(stash, ".akm", "distill-rejected");
248
248
  fs.mkdirSync(rejectDir, { recursive: true });
249
249
  const ts = timestampForFilename();
250
- fs.writeFileSync(path.join(rejectDir, `${ts}-${lessonRef.replace(/[:/\\]/g, "-")}.md`), `---\nscore: ${score}\nreason: ${reason}\noutcome: ${outcome}\n---\n\n${content}`, "utf8");
250
+ fs.writeFileSync(path.join(rejectDir, `${ts}-${proposalRef.replace(/[:/\\]/g, "-")}.md`), `---\nscore: ${score}\nreason: ${reason}\noutcome: ${outcome}\n---\n\n${content}`, "utf8");
251
251
  appendEvent({
252
252
  eventType: "distill_invoked",
253
253
  ref: inputRef,
254
254
  metadata: {
255
255
  outcome,
256
- lessonRef,
256
+ proposalRef,
257
257
  score,
258
258
  reason,
259
259
  ...extraMeta,
@@ -267,7 +267,7 @@ export function writeQualityRejection(stash, inputRef, lessonRef, content, score
267
267
  ok: true,
268
268
  outcome,
269
269
  inputRef,
270
- lessonRef,
270
+ proposalRef,
271
271
  score,
272
272
  reason,
273
273
  ...extraMeta,
@@ -35,7 +35,7 @@
35
35
  * # Lesson-name derivation rule
36
36
  *
37
37
  * A nested input preserves its first legitimate scope segment
38
- * (`memory:project-a/deploy` → `lesson:project-a/memory-deploy-lesson`). An
38
+ * (`memories/project-a/deploy` → `lessons/project-a/memory-deploy-lesson`). An
39
39
  * unscoped input stays flat; asset types are not project scopes. Origin prefixes
40
40
  * remain durable provenance but are not embedded in the output path.
41
41
  *
@@ -58,6 +58,7 @@ import { getImproveProcessConfig, loadConfig } from "../../core/config/config.js
58
58
  import { UsageError } from "../../core/errors.js";
59
59
  import { appendEvent, readEvents } from "../../core/events.js";
60
60
  import { lintLessonContent } from "../../core/lesson-lint.js";
61
+ import { parseEmbeddedJsonResponse } from "../../core/parse.js";
61
62
  import { getDbPath } from "../../core/paths.js";
62
63
  import { resolveStandardsContext } from "../../core/standards/resolve-standards-context.js";
63
64
  import { withStateDb } from "../../core/state-db.js";
@@ -65,7 +66,7 @@ import { warnVerbose } from "../../core/warn.js";
65
66
  import { resolveAssetPath } from "../../indexer/walk/path-resolver.js";
66
67
  import { getDefaultLlmConfig } from "../../integrations/agent/engine-resolution.js";
67
68
  import { materializeLlmRunnerConnection, resolveImproveProcessRunner } from "../../integrations/agent/runner.js";
68
- import { chatCompletion, parseEmbeddedJsonResponse } from "../../llm/client.js";
69
+ import { chatCompletion } from "../../llm/client.js";
69
70
  import { callStructured } from "../../llm/structured-call.js";
70
71
  import { closeDatabase, openIndexDatabase } from "../../storage/repositories/index-connection.js";
71
72
  import { getAllEntries } from "../../storage/repositories/index-entries-repository.js";
@@ -82,16 +83,13 @@ import { emitProposal } from "./proposal-envelope.js";
82
83
  import { createRunContext, resolveRunStashDir } from "./run-context.js";
83
84
  import { computeSalience, upsertAssetSalience } from "./salience.js";
84
85
  import { MAX_REJECTED_PROPOSALS } from "./shared.js";
85
- import { bareImproveRef, durableImproveRef } from "./source-identity.js";
86
- // Re-exported for `reflect.ts`, which applies the same LLM-as-judge gate to
87
- // reflect proposals (R-5 / #374).
88
- export { runLessonQualityJudge };
86
+ import { durableImproveRef } from "./source-identity.js";
89
87
  /**
90
88
  * Asset-ref types that `akm distill` structurally refuses as inputs.
91
89
  *
92
90
  * Distill *produces* lessons from non-lesson sources (memory, skill, knowledge,
93
- * etc.). Calling distill on an existing `lesson:*` ref would derive
94
- * `lesson:lesson-<name>-lesson-lesson` (double `-lesson` suffix) — the
91
+ * etc.). Calling distill on an existing `lessons/*` ref would derive
92
+ * `lessons/lesson-<name>-lesson-lesson` (double `-lesson` suffix) — the
95
93
  * recursive-ref defect observed across 323 archived rejected proposals.
96
94
  *
97
95
  * 08-F2: `env` and `secret` are refused as a STRUCTURAL floor — distill reads
@@ -122,8 +120,8 @@ export function isDistillRefusedInputType(type) {
122
120
  /** Derive the proposed lesson ref from the input ref. See module docblock. */
123
121
  export function deriveLessonRef(inputRef) {
124
122
  const parsed = parseRefInput(inputRef);
125
- // Strip origin: a feedback signal recorded against `team//skill:deploy`
126
- // distils into the same lesson namespace as `skill:deploy`. The proposal
123
+ // Strip the bundle: a feedback signal recorded against `team//skills/deploy`
124
+ // distils into the same lesson namespace as `skills/deploy`. The proposal
127
125
  // id (a UUID) keeps the queue entries distinct, so collisions are not a
128
126
  // problem — and reviewers want to see them next to each other anyway.
129
127
  const parts = parsed.name.split("/");
@@ -146,20 +144,17 @@ export function deriveLessonRef(inputRef) {
146
144
  //
147
145
  // The actual implementations now live in `core/proposal-quality-validators.ts`
148
146
  // so the same checks run inside `runProposalValidators` on `proposal accept`.
149
- // We re-export the public-facing helpers here so existing imports
150
- // (`from "../../src/commands/distill"`) continue to resolve.
151
- import { detectDoubleFrontmatter, isValidDescription, isValidWhenToUse, } from "../proposal/validators/proposal-quality-validators.js";
152
- export { detectDoubleFrontmatter, isValidDescription, isValidWhenToUse };
147
+ import { detectDoubleFrontmatter, isValidDescription } from "../proposal/validators/proposal-quality-validators.js";
153
148
  // ── Prompt assembly ─────────────────────────────────────────────────────────
154
149
  const LESSON_SYSTEM_PROMPT = distillLessonSystemPrompt;
155
150
  const KNOWLEDGE_SYSTEM_PROMPT = distillKnowledgeSystemPrompt;
156
151
  // ── Structured-output schemas (responseSchema lift) ─────────────────────────
157
152
  //
158
- // PR 1 of the asset-writers decision (see knowledge:projects/akm/
153
+ // PR 1 of the asset-writers decision (see knowledge/projects/akm/
159
154
  // asset-writers-investigation/00-synthesis): on providers that honour
160
155
  // `response_format: json_schema`, ask the LLM for a typed JSON object and
161
- // re-assemble the markdown locally. The previous "emit raw markdown with
162
- // embedded frontmatter" path remains as a fallback for providers that ignore
156
+ // re-assemble the markdown locally. The "emit raw markdown with embedded
157
+ // frontmatter" path supports providers that ignore
163
158
  // the schema (and for the `chat` test seam, which is wired to return strings
164
159
  // today). Shape-level rejection codes — MALFORMED_FRONTMATTER_BLOCK,
165
160
  // FRONTMATTER_NOT_OBJECT, INVALID_YAML, UNBALANCED_CODE_FENCE — become
@@ -334,7 +329,11 @@ export function buildDistillPrompt(input) {
334
329
  }
335
330
  lines.push("Asset content:");
336
331
  if (input.assetContent) {
337
- const body = input.assetContent.trim().slice(0, 3000);
332
+ // The output contract also uses YAML fences. Feeding source frontmatter
333
+ // verbatim caused local models to copy it into the lesson body, producing
334
+ // deterministic double-frontmatter rejection. Distillation needs the
335
+ // source body; its metadata is not evidence to reproduce.
336
+ const body = parseFrontmatter(input.assetContent).content.trim().slice(0, 3000);
338
337
  lines.push("```");
339
338
  lines.push(body);
340
339
  lines.push("```");
@@ -523,7 +522,7 @@ async function loadAndScoreInputSalience(args) {
523
522
  /**
524
523
  * Recursive-distillation + secret-material input guard. Distill produces
525
524
  * *lessons* from non-lesson sources; a lesson input would derive a recursive
526
- * `lesson:lesson-<name>` ref (the 323-archived-proposals defect) and
525
+ * `lessons/lesson-<name>` ref (the 323-archived-proposals defect) and
527
526
  * env/secret inputs must never be read or sent to the LLM. Emits the
528
527
  * `distill_invoked(skipped)` event and returns the terminal skipped result,
529
528
  * or `null` when the input type is allowed. Extracted verbatim from
@@ -542,12 +541,11 @@ function refuseDisallowedDistillInput(args) {
542
541
  : "Distill refuses lesson inputs — lessons are the distilled form, not a source.";
543
542
  appendEvent({
544
543
  eventType: "distill_invoked",
545
- // Chunk-5 flip F5f — key on item_ref when the planner resolved one, else
546
- // the pre-flip source-qualified durable ref (dormant: item_ref NULL today).
544
+ // Key on item_ref when the planner resolved one, otherwise the conceptId.
547
545
  ref: options.itemRef ?? durableInputRef,
548
546
  metadata: {
549
547
  outcome: "skipped",
550
- lessonRef: skippedRef,
548
+ proposalRef: skippedRef,
551
549
  message,
552
550
  skipReason: isSecretInput ? "refused_secret_input" : "recursive_lesson_input",
553
551
  ...eligMeta,
@@ -558,7 +556,8 @@ function refuseDisallowedDistillInput(args) {
558
556
  ok: true,
559
557
  outcome: "skipped",
560
558
  inputRef,
561
- lessonRef: skippedRef,
559
+ proposalRef: skippedRef,
560
+ skipReason: isSecretInput ? "refused_secret_input" : "recursive_lesson_input",
562
561
  message,
563
562
  };
564
563
  }
@@ -569,11 +568,26 @@ export async function akmDistill(options) {
569
568
  }
570
569
  // Validate the ref shape up front so a typo never reaches the LLM.
571
570
  const parsedInputRef = parseRefInput(inputRef);
572
- const durableInputRef = durableImproveRef(inputRef, options.sourceName);
573
- // Chunk-5 flip F5e — the input asset's durable salience write key: item_ref
574
- // when the planner resolved one, else the pre-flip source-qualified spelling.
571
+ const durableInputRef = durableImproveRef(inputRef);
572
+ // The input asset's durable salience write key is item_ref when resolved,
573
+ // otherwise the input conceptId.
575
574
  const salienceWriteKey = options.itemRef ?? durableInputRef;
576
575
  const targetKind = options.proposalKind ?? "lesson";
576
+ const config = options.config ?? loadConfig();
577
+ const improveProfile = options.improveProfile ?? resolveImproveStrategy(undefined, config).config;
578
+ options = { ...options, improveProfile };
579
+ if (!resolveProcessEnabled("distill", improveProfile)) {
580
+ const proposalKind = targetKind === "knowledge" ? "knowledge" : "lesson";
581
+ return {
582
+ schemaVersion: 1,
583
+ ok: true,
584
+ outcome: "config_disabled",
585
+ inputRef,
586
+ proposalRef: proposalKind === "knowledge" ? deriveKnowledgeRef(inputRef) : deriveLessonRef(inputRef),
587
+ proposalKind,
588
+ message: "distill is disabled in config; enable processes.distill.enabled to activate.",
589
+ };
590
+ }
577
591
  // Attribution tagging: spread into every distill_invoked event's metadata so
578
592
  // the lane that selected this asset is recorded uniformly across all outcome
579
593
  // branches. Empty object when no lane was supplied (direct `akm distill`).
@@ -587,8 +601,6 @@ export async function akmDistill(options) {
587
601
  const refused = refuseDisallowedDistillInput({ options, parsedInputRef, inputRef, durableInputRef, eligMeta });
588
602
  if (refused)
589
603
  return refused;
590
- const config = options.config ?? loadConfig();
591
- options = { ...options, improveProfile: options.improveProfile ?? resolveImproveStrategy(undefined, config).config };
592
604
  const stash = resolveRunStashDir(options.stashDir);
593
605
  const chat = options.chat ?? chatCompletion;
594
606
  const distillLlm = Object.hasOwn(options, "llmConfig")
@@ -604,31 +616,17 @@ export async function akmDistill(options) {
604
616
  const outcomeWeightEnabled = config.improve?.salience?.outcomeWeightEnabled !== false;
605
617
  // D-4 / #390: similar-lessons retrieval seam (test-injectable).
606
618
  const fetchSimilarLessonsFn = options.fetchSimilarLessonsFn ?? ((query, n) => fetchTopSimilarLessons(query, n, options.stashDir));
607
- // WI-9.10: construct this invocation's RunContext from values already
608
- // resolved above — no second config load, no new db handle. distill has no
609
- // `dryRun` option (only the best-effort salience stamp below writes a
610
- // source asset, routed through `ctx.writeAsset`); `sourceRun` has no
611
- // existing run-level convention here (unlike extract/consolidate, distill
612
- // simply forwards `options.sourceRun` verbatim wherever it is set — see
613
- // the `promoteMemoryToKnowledge` call below), so this is a fresh,
614
- // independent token following the same `<verb>-<ms>` shape.
615
- const ctx = createRunContext({
619
+ const assetCtx = createRunContext({
616
620
  stashDir: stash,
617
621
  config,
618
622
  eventsCtx: options.eventsCtx ?? {},
619
- // Not yet wired into any proposal call site this stage (mirrors
620
- // buildImproveRunContext's proposalsCtx comment in improve.ts).
621
623
  proposalsCtx: options.ctx ?? {},
622
624
  chat,
623
625
  getLlmConfig: () => distillLlm ?? null,
624
626
  sourceRun: options.sourceRun ?? `distill-${Date.now()}`,
625
627
  dryRun: false,
626
628
  signal: options.signal,
627
- });
628
- // D6: a fresh, per-invocation memo. loadAndScoreInputSalience below is the
629
- // genuine content-read + write-back consumer (run-context.ts's D6 seam
630
- // docblock cites this exact site).
631
- const assetCtx = ctx.withFreshAssetMemo();
629
+ }).withFreshAssetMemo();
632
630
  const { assetContent, existingRefVocabulary } = await loadAndScoreInputSalience({
633
631
  inputRef,
634
632
  durableInputRef,
@@ -643,7 +641,6 @@ export async function akmDistill(options) {
643
641
  readEventsImpl,
644
642
  options,
645
643
  durableInputRef,
646
- inputRef,
647
644
  });
648
645
  const feedback = filteredEvents.slice(-20).map((e) => ({
649
646
  ts: e.ts,
@@ -661,7 +658,6 @@ export async function akmDistill(options) {
661
658
  inputRef,
662
659
  durableInputRef,
663
660
  ...(options.itemRef ? { itemRef: options.itemRef } : {}),
664
- sourceName: options.sourceName,
665
661
  assetContent,
666
662
  filteredEvents,
667
663
  config,
@@ -838,11 +834,11 @@ async function emitDistillLessonProposal(args) {
838
834
  if (isProposalSkipped(proposalResult2)) {
839
835
  appendEvent({
840
836
  eventType: "distill_invoked",
841
- // Chunk-5 flip F5f — item_ref when resolved, else durable (dormant today).
837
+ // Use item_ref when resolved, otherwise the input conceptId.
842
838
  ref: options.itemRef ?? durableInputRef,
843
839
  metadata: {
844
840
  outcome: "skipped",
845
- lessonRef: effectiveLessonRef,
841
+ proposalRef: effectiveLessonRef,
846
842
  message: proposalResult2.message,
847
843
  skipReason: proposalResult2.reason,
848
844
  ...eligMeta,
@@ -853,7 +849,8 @@ async function emitDistillLessonProposal(args) {
853
849
  ok: true,
854
850
  outcome: "skipped",
855
851
  inputRef,
856
- lessonRef: effectiveLessonRef,
852
+ proposalRef: effectiveLessonRef,
853
+ skipReason: proposalResult2.reason,
857
854
  message: proposalResult2.message,
858
855
  };
859
856
  }
@@ -861,14 +858,13 @@ async function emitDistillLessonProposal(args) {
861
858
  // G4: content-score the distilled OUTPUT so it carries a real encoding
862
859
  // salience (encoding_source='content') from creation — lessons never get
863
860
  // another chance (they are refused as distill inputs).
864
- persistOutputEncodingSalience(durableImproveRef(effectiveLessonRef, options.sourceName), content, existingRefVocabulary, outcomeWeightEnabled);
861
+ persistOutputEncodingSalience(durableImproveRef(effectiveLessonRef), content, existingRefVocabulary, outcomeWeightEnabled);
865
862
  appendEvent({
866
863
  eventType: "distill_invoked",
867
- // Chunk-5 flip F5f — item_ref when resolved, else durable (dormant today).
864
+ // Use item_ref when resolved, otherwise the input conceptId.
868
865
  ref: options.itemRef ?? durableInputRef,
869
866
  metadata: {
870
867
  outcome: "queued",
871
- lessonRef: effectiveLessonRef,
872
868
  proposalRef: effectiveLessonRef,
873
869
  proposalKind: effectiveProposalKind,
874
870
  proposalId: proposal2.id,
@@ -886,7 +882,6 @@ async function emitDistillLessonProposal(args) {
886
882
  ok: true,
887
883
  outcome: "queued",
888
884
  inputRef,
889
- lessonRef: effectiveLessonRef,
890
885
  proposalRef: effectiveLessonRef,
891
886
  proposalKind: effectiveProposalKind,
892
887
  proposalId: proposal2.id,
@@ -906,8 +901,8 @@ function assembleAndValidateDistillContent(args) {
906
901
  const { raw, effectiveProposalKind, inputRef, durableInputRef, itemRef, effectiveLessonRef, exclusionSet, filteredFeedbackCount, eligMeta, eventsCtx, } = args;
907
902
  // Structured-output path: when the provider honoured the JSON schema, `raw`
908
903
  // is a JSON object string (not a markdown blob). Try to parse it and assemble
909
- // the canonical `---\nfm\n---\n\nbody` form before falling through to the
910
- // legacy markdown pipeline. Failure here (non-JSON response, missing
904
+ // the canonical `---\nfm\n---\n\nbody` form before using the markdown
905
+ // response path. Failure here (non-JSON response, missing
911
906
  // required field, unexpected types) is non-fatal — we drop down to the
912
907
  // markdown path which has its own auto-repair + lint pass.
913
908
  let content;
@@ -952,11 +947,11 @@ function assembleAndValidateDistillContent(args) {
952
947
  if (findings.length > 0) {
953
948
  appendEvent({
954
949
  eventType: "distill_invoked",
955
- // Chunk-5 flip F5f — item_ref when resolved, else durable (dormant today).
950
+ // Use item_ref when resolved, otherwise the input conceptId.
956
951
  ref: itemRef ?? durableInputRef,
957
952
  metadata: {
958
953
  outcome: "validation_failed",
959
- lessonRef: effectiveLessonRef,
954
+ proposalRef: effectiveLessonRef,
960
955
  proposalKind: effectiveProposalKind,
961
956
  findingKinds: findings.map((f) => f.kind),
962
957
  ...(exclusionSet.size > 0 ? { filteredFeedbackCount } : {}),
@@ -1046,7 +1041,6 @@ function distillEmptyResponseResult(args) {
1046
1041
  ok: true,
1047
1042
  outcome: "config_disabled",
1048
1043
  inputRef,
1049
- lessonRef: effectiveLessonRef,
1050
1044
  proposalRef: effectiveLessonRef,
1051
1045
  proposalKind: effectiveProposalKind,
1052
1046
  message: "distill is disabled in config; enable processes.distill.enabled to activate.",
@@ -1058,11 +1052,11 @@ function distillEmptyResponseResult(args) {
1058
1052
  // is observable.
1059
1053
  appendEvent({
1060
1054
  eventType: "distill_invoked",
1061
- // Chunk-5 flip F5f — item_ref when resolved, else durable (dormant today).
1055
+ // Use item_ref when resolved, otherwise the input conceptId.
1062
1056
  ref: itemRef ?? durableInputRef,
1063
1057
  metadata: {
1064
1058
  outcome: "llm_failed",
1065
- lessonRef: effectiveLessonRef,
1059
+ proposalRef: effectiveLessonRef,
1066
1060
  proposalKind: effectiveProposalKind,
1067
1061
  ...(exclusionSet.size > 0 ? { filteredFeedbackCount } : {}),
1068
1062
  ...eligMeta,
@@ -1073,7 +1067,6 @@ function distillEmptyResponseResult(args) {
1073
1067
  ok: true,
1074
1068
  outcome: "llm_failed",
1075
1069
  inputRef,
1076
- lessonRef: effectiveLessonRef,
1077
1070
  proposalRef: effectiveLessonRef,
1078
1071
  proposalKind: effectiveProposalKind,
1079
1072
  message: "LLM call returned no usable output (timeout, empty, or error).",
@@ -1124,22 +1117,18 @@ async function applyDistillQualityGate(args) {
1124
1117
  * carry. Extracted verbatim from `akmDistill`.
1125
1118
  */
1126
1119
  function readDistillFeedback(args) {
1127
- const { readEventsImpl, options, durableInputRef, inputRef } = args;
1120
+ const { readEventsImpl, options, durableInputRef } = args;
1128
1121
  const { events: unfilteredEvents } = readEventsImpl({
1129
- ...(!options.legacyBareState ? { ref: durableInputRef } : {}),
1122
+ ref: options.itemRef ?? durableInputRef,
1130
1123
  type: "feedback",
1131
1124
  excludeTags: options.excludeTags,
1132
1125
  includeTags: options.includeTags,
1133
1126
  });
1134
- const events = options.legacyBareState
1135
- ? unfilteredEvents.filter((event) => event.ref === durableInputRef || event.ref === bareImproveRef(inputRef))
1136
- : unfilteredEvents;
1127
+ const events = unfilteredEvents;
1137
1128
  // #267 — feedback exclusion. Filter events whose `ref` matches the
1138
1129
  // exclusion list BEFORE the prompt is built. The original event stream
1139
1130
  // is never mutated; only the `feedback` slice that reaches the LLM is
1140
- // affected. The exclusion set is normalised through the durable/bare ref
1141
- // helpers so callers can pass canonical or origin-prefixed refs and the
1142
- // comparison still works against the event payload's `ref`.
1131
+ // affected. Exclusion refs are compared with event refs exactly.
1143
1132
  const exclusionList = options.excludeFeedbackFromRefs ?? [];
1144
1133
  const exclusionSet = new Set(exclusionList.map((ref) => ref.trim()).filter((ref) => ref.length > 0));
1145
1134
  const originalEventCount = events.length;