cognitive-core 0.2.4 → 0.3.1

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 (1278) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +88 -143
  3. package/dist/agents/mock-provider.d.ts.map +1 -1
  4. package/dist/agents/mock-provider.js.map +1 -1
  5. package/dist/agents/types.d.ts.map +1 -1
  6. package/dist/agents/types.js +5 -4
  7. package/dist/agents/types.js.map +1 -1
  8. package/dist/atlas.d.ts +309 -97
  9. package/dist/atlas.d.ts.map +1 -1
  10. package/dist/atlas.js +743 -277
  11. package/dist/atlas.js.map +1 -1
  12. package/dist/bin/cli-utils.d.ts +25 -2
  13. package/dist/bin/cli-utils.d.ts.map +1 -1
  14. package/dist/bin/cli-utils.js +79 -9
  15. package/dist/bin/cli-utils.js.map +1 -1
  16. package/dist/bin/cognitive-core.js +32 -0
  17. package/dist/bin/cognitive-core.js.map +1 -1
  18. package/dist/bin/commands/dream.d.ts +17 -0
  19. package/dist/bin/commands/dream.d.ts.map +1 -0
  20. package/dist/bin/commands/dream.js +168 -0
  21. package/dist/bin/commands/dream.js.map +1 -0
  22. package/dist/bin/commands/eval.d.ts +181 -0
  23. package/dist/bin/commands/eval.d.ts.map +1 -0
  24. package/dist/bin/commands/eval.js +1582 -0
  25. package/dist/bin/commands/eval.js.map +1 -0
  26. package/dist/bin/commands/kb.js +0 -8
  27. package/dist/bin/commands/kb.js.map +1 -1
  28. package/dist/bin/commands/learn.js +12 -4
  29. package/dist/bin/commands/learn.js.map +1 -1
  30. package/dist/bin/commands/legacy.d.ts.map +1 -1
  31. package/dist/bin/commands/legacy.js +1 -1
  32. package/dist/bin/commands/legacy.js.map +1 -1
  33. package/dist/bin/commands/run.d.ts.map +1 -1
  34. package/dist/bin/commands/run.js +10 -9
  35. package/dist/bin/commands/run.js.map +1 -1
  36. package/dist/bin/commands/sessions.d.ts.map +1 -1
  37. package/dist/bin/commands/sessions.js.map +1 -1
  38. package/dist/bin/commands/skills.d.ts.map +1 -1
  39. package/dist/bin/commands/skills.js +283 -1
  40. package/dist/bin/commands/skills.js.map +1 -1
  41. package/dist/embeddings/bm25.d.ts.map +1 -1
  42. package/dist/embeddings/bm25.js +1 -2
  43. package/dist/embeddings/bm25.js.map +1 -1
  44. package/dist/embeddings/index.d.ts +3 -3
  45. package/dist/embeddings/index.d.ts.map +1 -1
  46. package/dist/embeddings/index.js +3 -3
  47. package/dist/embeddings/index.js.map +1 -1
  48. package/dist/embeddings/inverted-index.js +62 -7
  49. package/dist/embeddings/inverted-index.js.map +1 -1
  50. package/dist/embeddings/manager.d.ts.map +1 -1
  51. package/dist/embeddings/manager.js +6 -5
  52. package/dist/embeddings/manager.js.map +1 -1
  53. package/dist/embeddings/provider.d.ts +96 -5
  54. package/dist/embeddings/provider.d.ts.map +1 -1
  55. package/dist/embeddings/provider.js +171 -48
  56. package/dist/embeddings/provider.js.map +1 -1
  57. package/dist/embeddings/vector-store.d.ts.map +1 -1
  58. package/dist/embeddings/vector-store.js +3 -1
  59. package/dist/embeddings/vector-store.js.map +1 -1
  60. package/dist/eval/ablation-validate.d.ts +12 -0
  61. package/dist/eval/ablation-validate.d.ts.map +1 -0
  62. package/dist/eval/ablation-validate.js +78 -0
  63. package/dist/eval/ablation-validate.js.map +1 -0
  64. package/dist/eval/ablation.d.ts +94 -0
  65. package/dist/eval/ablation.d.ts.map +1 -0
  66. package/dist/eval/ablation.js +161 -0
  67. package/dist/eval/ablation.js.map +1 -0
  68. package/dist/eval/ci-smoke.d.ts +11 -0
  69. package/dist/eval/ci-smoke.d.ts.map +1 -0
  70. package/dist/eval/ci-smoke.js +49 -0
  71. package/dist/eval/ci-smoke.js.map +1 -0
  72. package/dist/eval/diagnostics.d.ts +214 -0
  73. package/dist/eval/diagnostics.d.ts.map +1 -0
  74. package/dist/eval/diagnostics.js +107 -0
  75. package/dist/eval/diagnostics.js.map +1 -0
  76. package/dist/eval/index.d.ts +27 -0
  77. package/dist/eval/index.d.ts.map +1 -0
  78. package/dist/eval/index.js +27 -0
  79. package/dist/eval/index.js.map +1 -0
  80. package/dist/eval/live/alfworld.d.ts +248 -0
  81. package/dist/eval/live/alfworld.d.ts.map +1 -0
  82. package/dist/eval/live/alfworld.js +637 -0
  83. package/dist/eval/live/alfworld.js.map +1 -0
  84. package/dist/eval/live/alfworld_h1.d.ts +16 -0
  85. package/dist/eval/live/alfworld_h1.d.ts.map +1 -0
  86. package/dist/eval/live/alfworld_h1.js +75 -0
  87. package/dist/eval/live/alfworld_h1.js.map +1 -0
  88. package/dist/eval/live/alfworld_memory.d.ts +38 -0
  89. package/dist/eval/live/alfworld_memory.d.ts.map +1 -0
  90. package/dist/eval/live/alfworld_memory.js +184 -0
  91. package/dist/eval/live/alfworld_memory.js.map +1 -0
  92. package/dist/eval/live/alfworld_strategy.d.ts +65 -0
  93. package/dist/eval/live/alfworld_strategy.d.ts.map +1 -0
  94. package/dist/eval/live/alfworld_strategy.js +89 -0
  95. package/dist/eval/live/alfworld_strategy.js.map +1 -0
  96. package/dist/eval/live/azure-openai-llm-provider.d.ts +41 -0
  97. package/dist/eval/live/azure-openai-llm-provider.d.ts.map +1 -0
  98. package/dist/eval/live/azure-openai-llm-provider.js +92 -0
  99. package/dist/eval/live/azure-openai-llm-provider.js.map +1 -0
  100. package/dist/eval/live/bridges/skillflow_e2b_bridge.d.ts +3 -0
  101. package/dist/eval/live/bridges/skillflow_e2b_bridge.d.ts.map +1 -0
  102. package/dist/eval/live/bridges/skillflow_e2b_bridge.js +12 -0
  103. package/dist/eval/live/bridges/skillflow_e2b_bridge.js.map +1 -0
  104. package/dist/eval/live/claude-cli-llm-provider.d.ts +53 -0
  105. package/dist/eval/live/claude-cli-llm-provider.d.ts.map +1 -0
  106. package/dist/eval/live/claude-cli-llm-provider.js +71 -0
  107. package/dist/eval/live/claude-cli-llm-provider.js.map +1 -0
  108. package/dist/eval/live/claude-cli.d.ts +96 -0
  109. package/dist/eval/live/claude-cli.d.ts.map +1 -0
  110. package/dist/eval/live/claude-cli.js +314 -0
  111. package/dist/eval/live/claude-cli.js.map +1 -0
  112. package/dist/eval/live/claude-delegate.d.ts +41 -0
  113. package/dist/eval/live/claude-delegate.d.ts.map +1 -0
  114. package/dist/eval/live/claude-delegate.js +59 -0
  115. package/dist/eval/live/claude-delegate.js.map +1 -0
  116. package/dist/eval/live/claude-workspace-backend.d.ts +24 -0
  117. package/dist/eval/live/claude-workspace-backend.d.ts.map +1 -0
  118. package/dist/eval/live/claude-workspace-backend.js +76 -0
  119. package/dist/eval/live/claude-workspace-backend.js.map +1 -0
  120. package/dist/eval/live/clbench.d.ts +64 -0
  121. package/dist/eval/live/clbench.d.ts.map +1 -0
  122. package/dist/eval/live/clbench.js +291 -0
  123. package/dist/eval/live/clbench.js.map +1 -0
  124. package/dist/eval/live/cold-reuse.d.ts +21 -0
  125. package/dist/eval/live/cold-reuse.d.ts.map +1 -0
  126. package/dist/eval/live/cold-reuse.js +102 -0
  127. package/dist/eval/live/cold-reuse.js.map +1 -0
  128. package/dist/eval/live/difficulty-registry.d.ts +68 -0
  129. package/dist/eval/live/difficulty-registry.d.ts.map +1 -0
  130. package/dist/eval/live/difficulty-registry.js +169 -0
  131. package/dist/eval/live/difficulty-registry.js.map +1 -0
  132. package/dist/eval/live/docker.d.ts +52 -0
  133. package/dist/eval/live/docker.d.ts.map +1 -0
  134. package/dist/eval/live/docker.js +164 -0
  135. package/dist/eval/live/docker.js.map +1 -0
  136. package/dist/eval/live/env-bridge.d.ts +68 -0
  137. package/dist/eval/live/env-bridge.d.ts.map +1 -0
  138. package/dist/eval/live/env-bridge.js +188 -0
  139. package/dist/eval/live/env-bridge.js.map +1 -0
  140. package/dist/eval/live/gsm8k.d.ts +44 -0
  141. package/dist/eval/live/gsm8k.d.ts.map +1 -0
  142. package/dist/eval/live/gsm8k.js +142 -0
  143. package/dist/eval/live/gsm8k.js.map +1 -0
  144. package/dist/eval/live/index.d.ts +38 -0
  145. package/dist/eval/live/index.d.ts.map +1 -0
  146. package/dist/eval/live/index.js +38 -0
  147. package/dist/eval/live/index.js.map +1 -0
  148. package/dist/eval/live/lifelongagent.d.ts +64 -0
  149. package/dist/eval/live/lifelongagent.d.ts.map +1 -0
  150. package/dist/eval/live/lifelongagent.js +216 -0
  151. package/dist/eval/live/lifelongagent.js.map +1 -0
  152. package/dist/eval/live/lift-registry.d.ts +128 -0
  153. package/dist/eval/live/lift-registry.d.ts.map +1 -0
  154. package/dist/eval/live/lift-registry.js +147 -0
  155. package/dist/eval/live/lift-registry.js.map +1 -0
  156. package/dist/eval/live/live-benchmark.d.ts +84 -0
  157. package/dist/eval/live/live-benchmark.d.ts.map +1 -0
  158. package/dist/eval/live/live-benchmark.js +2 -0
  159. package/dist/eval/live/live-benchmark.js.map +1 -0
  160. package/dist/eval/live/live-runner.d.ts +609 -0
  161. package/dist/eval/live/live-runner.d.ts.map +1 -0
  162. package/dist/eval/live/live-runner.js +1409 -0
  163. package/dist/eval/live/live-runner.js.map +1 -0
  164. package/dist/eval/live/refine.d.ts +88 -0
  165. package/dist/eval/live/refine.d.ts.map +1 -0
  166. package/dist/eval/live/refine.js +135 -0
  167. package/dist/eval/live/refine.js.map +1 -0
  168. package/dist/eval/live/registry-store.d.ts +109 -0
  169. package/dist/eval/live/registry-store.d.ts.map +1 -0
  170. package/dist/eval/live/registry-store.js +272 -0
  171. package/dist/eval/live/registry-store.js.map +1 -0
  172. package/dist/eval/live/run-checkpoint.d.ts +55 -0
  173. package/dist/eval/live/run-checkpoint.d.ts.map +1 -0
  174. package/dist/eval/live/run-checkpoint.js +86 -0
  175. package/dist/eval/live/run-checkpoint.js.map +1 -0
  176. package/dist/eval/live/run-resume.d.ts +22 -0
  177. package/dist/eval/live/run-resume.d.ts.map +1 -0
  178. package/dist/eval/live/run-resume.js +70 -0
  179. package/dist/eval/live/run-resume.js.map +1 -0
  180. package/dist/eval/live/skill-injector.d.ts +36 -0
  181. package/dist/eval/live/skill-injector.d.ts.map +1 -0
  182. package/dist/eval/live/skill-injector.js +81 -0
  183. package/dist/eval/live/skill-injector.js.map +1 -0
  184. package/dist/eval/live/skillflow-embedded-workbook-bundle.d.ts +3 -0
  185. package/dist/eval/live/skillflow-embedded-workbook-bundle.d.ts.map +1 -0
  186. package/dist/eval/live/skillflow-embedded-workbook-bundle.js +391 -0
  187. package/dist/eval/live/skillflow-embedded-workbook-bundle.js.map +1 -0
  188. package/dist/eval/live/skillflow.d.ts +154 -0
  189. package/dist/eval/live/skillflow.d.ts.map +1 -0
  190. package/dist/eval/live/skillflow.js +612 -0
  191. package/dist/eval/live/skillflow.js.map +1 -0
  192. package/dist/eval/live/skilllearnbench.d.ts +43 -0
  193. package/dist/eval/live/skilllearnbench.d.ts.map +1 -0
  194. package/dist/eval/live/skilllearnbench.js +154 -0
  195. package/dist/eval/live/skilllearnbench.js.map +1 -0
  196. package/dist/eval/live/skillopt_v1.d.ts +96 -0
  197. package/dist/eval/live/skillopt_v1.d.ts.map +1 -0
  198. package/dist/eval/live/skillopt_v1.js +0 -0
  199. package/dist/eval/live/skillopt_v1.js.map +1 -0
  200. package/dist/eval/live/skillopt_v1_causal.d.ts +26 -0
  201. package/dist/eval/live/skillopt_v1_causal.d.ts.map +1 -0
  202. package/dist/eval/live/skillopt_v1_causal.js +106 -0
  203. package/dist/eval/live/skillopt_v1_causal.js.map +1 -0
  204. package/dist/eval/live/skillopt_v1_memory.d.ts +53 -0
  205. package/dist/eval/live/skillopt_v1_memory.d.ts.map +1 -0
  206. package/dist/eval/live/skillopt_v1_memory.js +147 -0
  207. package/dist/eval/live/skillopt_v1_memory.js.map +1 -0
  208. package/dist/eval/live/skillopt_v1_rules.d.ts +39 -0
  209. package/dist/eval/live/skillopt_v1_rules.d.ts.map +1 -0
  210. package/dist/eval/live/skillopt_v1_rules.js +91 -0
  211. package/dist/eval/live/skillopt_v1_rules.js.map +1 -0
  212. package/dist/eval/live/skillsbench.d.ts +138 -0
  213. package/dist/eval/live/skillsbench.d.ts.map +1 -0
  214. package/dist/eval/live/skillsbench.js +626 -0
  215. package/dist/eval/live/skillsbench.js.map +1 -0
  216. package/dist/eval/live/stopping.d.ts +69 -0
  217. package/dist/eval/live/stopping.d.ts.map +1 -0
  218. package/dist/eval/live/stopping.js +213 -0
  219. package/dist/eval/live/stopping.js.map +1 -0
  220. package/dist/eval/live/trace.d.ts +20 -0
  221. package/dist/eval/live/trace.d.ts.map +1 -0
  222. package/dist/eval/live/trace.js +41 -0
  223. package/dist/eval/live/trace.js.map +1 -0
  224. package/dist/eval/mechanism-trace-adapter.d.ts +8 -0
  225. package/dist/eval/mechanism-trace-adapter.d.ts.map +1 -0
  226. package/dist/eval/mechanism-trace-adapter.js +118 -0
  227. package/dist/eval/mechanism-trace-adapter.js.map +1 -0
  228. package/dist/eval/memory-ab.d.ts +61 -0
  229. package/dist/eval/memory-ab.d.ts.map +1 -0
  230. package/dist/eval/memory-ab.js +161 -0
  231. package/dist/eval/memory-ab.js.map +1 -0
  232. package/dist/eval/memory-mock.d.ts +54 -0
  233. package/dist/eval/memory-mock.d.ts.map +1 -0
  234. package/dist/eval/memory-mock.js +129 -0
  235. package/dist/eval/memory-mock.js.map +1 -0
  236. package/dist/eval/memory-qa/index.d.ts +13 -0
  237. package/dist/eval/memory-qa/index.d.ts.map +1 -0
  238. package/dist/eval/memory-qa/index.js +13 -0
  239. package/dist/eval/memory-qa/index.js.map +1 -0
  240. package/dist/eval/memory-qa/iterative.d.ts +80 -0
  241. package/dist/eval/memory-qa/iterative.d.ts.map +1 -0
  242. package/dist/eval/memory-qa/iterative.js +107 -0
  243. package/dist/eval/memory-qa/iterative.js.map +1 -0
  244. package/dist/eval/memory-qa/loaders.d.ts +11 -0
  245. package/dist/eval/memory-qa/loaders.d.ts.map +1 -0
  246. package/dist/eval/memory-qa/loaders.js +21 -0
  247. package/dist/eval/memory-qa/loaders.js.map +1 -0
  248. package/dist/eval/memory-qa/metrics.d.ts +3 -0
  249. package/dist/eval/memory-qa/metrics.d.ts.map +1 -0
  250. package/dist/eval/memory-qa/metrics.js +2 -0
  251. package/dist/eval/memory-qa/metrics.js.map +1 -0
  252. package/dist/eval/memory-qa/qa.d.ts +186 -0
  253. package/dist/eval/memory-qa/qa.d.ts.map +1 -0
  254. package/dist/eval/memory-qa/qa.js +424 -0
  255. package/dist/eval/memory-qa/qa.js.map +1 -0
  256. package/dist/eval/memory-qa/retrieval.d.ts +33 -0
  257. package/dist/eval/memory-qa/retrieval.d.ts.map +1 -0
  258. package/dist/eval/memory-qa/retrieval.js +44 -0
  259. package/dist/eval/memory-qa/retrieval.js.map +1 -0
  260. package/dist/eval/memory-qa/serving.d.ts +60 -0
  261. package/dist/eval/memory-qa/serving.d.ts.map +1 -0
  262. package/dist/eval/memory-qa/serving.js +267 -0
  263. package/dist/eval/memory-qa/serving.js.map +1 -0
  264. package/dist/eval/memory-qa/types.d.ts +2 -0
  265. package/dist/eval/memory-qa/types.d.ts.map +1 -0
  266. package/dist/eval/memory-qa/types.js +2 -0
  267. package/dist/eval/memory-qa/types.js.map +1 -0
  268. package/dist/eval/metrics.d.ts +120 -0
  269. package/dist/eval/metrics.d.ts.map +1 -0
  270. package/dist/eval/metrics.js +361 -0
  271. package/dist/eval/metrics.js.map +1 -0
  272. package/dist/eval/oracle-smoke.d.ts +75 -0
  273. package/dist/eval/oracle-smoke.d.ts.map +1 -0
  274. package/dist/eval/oracle-smoke.js +143 -0
  275. package/dist/eval/oracle-smoke.js.map +1 -0
  276. package/dist/eval/playbook-calibration-report.d.ts +40 -0
  277. package/dist/eval/playbook-calibration-report.d.ts.map +1 -0
  278. package/dist/eval/playbook-calibration-report.js +246 -0
  279. package/dist/eval/playbook-calibration-report.js.map +1 -0
  280. package/dist/eval/playbook-candidate-decisions-report.d.ts +36 -0
  281. package/dist/eval/playbook-candidate-decisions-report.d.ts.map +1 -0
  282. package/dist/eval/playbook-candidate-decisions-report.js +201 -0
  283. package/dist/eval/playbook-candidate-decisions-report.js.map +1 -0
  284. package/dist/eval/playbook-usage-report.d.ts +7 -0
  285. package/dist/eval/playbook-usage-report.d.ts.map +1 -0
  286. package/dist/eval/playbook-usage-report.js +222 -0
  287. package/dist/eval/playbook-usage-report.js.map +1 -0
  288. package/dist/eval/report.d.ts +28 -0
  289. package/dist/eval/report.d.ts.map +1 -0
  290. package/dist/eval/report.js +567 -0
  291. package/dist/eval/report.js.map +1 -0
  292. package/dist/eval/retrieval/corpus.d.ts +41 -0
  293. package/dist/eval/retrieval/corpus.d.ts.map +1 -0
  294. package/dist/eval/retrieval/corpus.js +158 -0
  295. package/dist/eval/retrieval/corpus.js.map +1 -0
  296. package/dist/eval/retrieval/index.d.ts +12 -0
  297. package/dist/eval/retrieval/index.d.ts.map +1 -0
  298. package/dist/eval/retrieval/index.js +14 -0
  299. package/dist/eval/retrieval/index.js.map +1 -0
  300. package/dist/eval/retrieval/knowledge-corpus.d.ts +91 -0
  301. package/dist/eval/retrieval/knowledge-corpus.d.ts.map +1 -0
  302. package/dist/eval/retrieval/knowledge-corpus.js +268 -0
  303. package/dist/eval/retrieval/knowledge-corpus.js.map +1 -0
  304. package/dist/eval/retrieval/knowledge-quality.d.ts +91 -0
  305. package/dist/eval/retrieval/knowledge-quality.d.ts.map +1 -0
  306. package/dist/eval/retrieval/knowledge-quality.js +247 -0
  307. package/dist/eval/retrieval/knowledge-quality.js.map +1 -0
  308. package/dist/eval/retrieval/ladder.d.ts +69 -0
  309. package/dist/eval/retrieval/ladder.d.ts.map +1 -0
  310. package/dist/eval/retrieval/ladder.js +80 -0
  311. package/dist/eval/retrieval/ladder.js.map +1 -0
  312. package/dist/eval/retrieval/quality.d.ts +39 -0
  313. package/dist/eval/retrieval/quality.d.ts.map +1 -0
  314. package/dist/eval/retrieval/quality.js +75 -0
  315. package/dist/eval/retrieval/quality.js.map +1 -0
  316. package/dist/eval/rng.d.ts +25 -0
  317. package/dist/eval/rng.d.ts.map +1 -0
  318. package/dist/eval/rng.js +43 -0
  319. package/dist/eval/rng.js.map +1 -0
  320. package/dist/eval/runner.d.ts +65 -0
  321. package/dist/eval/runner.d.ts.map +1 -0
  322. package/dist/eval/runner.js +216 -0
  323. package/dist/eval/runner.js.map +1 -0
  324. package/dist/eval/skill-bundle.d.ts +18 -0
  325. package/dist/eval/skill-bundle.d.ts.map +1 -0
  326. package/dist/eval/skill-bundle.js +38 -0
  327. package/dist/eval/skill-bundle.js.map +1 -0
  328. package/dist/eval/swarmkit-report.d.ts +21 -0
  329. package/dist/eval/swarmkit-report.d.ts.map +1 -0
  330. package/dist/eval/swarmkit-report.js +93 -0
  331. package/dist/eval/swarmkit-report.js.map +1 -0
  332. package/dist/eval/task-stream.d.ts +22 -0
  333. package/dist/eval/task-stream.d.ts.map +1 -0
  334. package/dist/eval/task-stream.js +99 -0
  335. package/dist/eval/task-stream.js.map +1 -0
  336. package/dist/eval/types.d.ts +173 -0
  337. package/dist/eval/types.d.ts.map +1 -0
  338. package/dist/eval/types.js +11 -0
  339. package/dist/eval/types.js.map +1 -0
  340. package/dist/experimental/causal-store.d.ts +97 -0
  341. package/dist/experimental/causal-store.d.ts.map +1 -0
  342. package/dist/experimental/causal-store.js +213 -0
  343. package/dist/experimental/causal-store.js.map +1 -0
  344. package/dist/experimental/graph-layers/base.d.ts +29 -0
  345. package/dist/experimental/graph-layers/base.d.ts.map +1 -0
  346. package/dist/experimental/graph-layers/base.js +143 -0
  347. package/dist/experimental/graph-layers/base.js.map +1 -0
  348. package/dist/experimental/graph-layers/causal.d.ts +14 -0
  349. package/dist/experimental/graph-layers/causal.d.ts.map +1 -0
  350. package/dist/experimental/graph-layers/causal.js +14 -0
  351. package/dist/experimental/graph-layers/causal.js.map +1 -0
  352. package/dist/experimental/graph-layers/entity.d.ts +14 -0
  353. package/dist/experimental/graph-layers/entity.d.ts.map +1 -0
  354. package/dist/experimental/graph-layers/entity.js +14 -0
  355. package/dist/experimental/graph-layers/entity.js.map +1 -0
  356. package/dist/experimental/graph-layers/index.d.ts +6 -0
  357. package/dist/experimental/graph-layers/index.d.ts.map +1 -0
  358. package/dist/experimental/graph-layers/index.js +6 -0
  359. package/dist/experimental/graph-layers/index.js.map +1 -0
  360. package/dist/experimental/graph-layers/semantic.d.ts +14 -0
  361. package/dist/experimental/graph-layers/semantic.d.ts.map +1 -0
  362. package/dist/experimental/graph-layers/semantic.js +14 -0
  363. package/dist/experimental/graph-layers/semantic.js.map +1 -0
  364. package/dist/experimental/graph-layers/temporal.d.ts +14 -0
  365. package/dist/experimental/graph-layers/temporal.d.ts.map +1 -0
  366. package/dist/experimental/graph-layers/temporal.js +14 -0
  367. package/dist/experimental/graph-layers/temporal.js.map +1 -0
  368. package/dist/experimental/healing-orchestrator.d.ts +182 -0
  369. package/dist/experimental/healing-orchestrator.d.ts.map +1 -0
  370. package/dist/experimental/healing-orchestrator.js +250 -0
  371. package/dist/experimental/healing-orchestrator.js.map +1 -0
  372. package/dist/experimental/knowledge-graph-types.d.ts +148 -0
  373. package/dist/experimental/knowledge-graph-types.d.ts.map +1 -0
  374. package/dist/experimental/knowledge-graph-types.js +40 -0
  375. package/dist/experimental/knowledge-graph-types.js.map +1 -0
  376. package/dist/experimental/knowledge-graph.d.ts +41 -0
  377. package/dist/experimental/knowledge-graph.d.ts.map +1 -0
  378. package/dist/experimental/knowledge-graph.js +270 -0
  379. package/dist/experimental/knowledge-graph.js.map +1 -0
  380. package/dist/experimental/meta-reflection.d.ts +47 -0
  381. package/dist/experimental/meta-reflection.d.ts.map +1 -0
  382. package/dist/experimental/meta-reflection.js +143 -0
  383. package/dist/experimental/meta-reflection.js.map +1 -0
  384. package/dist/experimental/moe-gate.d.ts +134 -0
  385. package/dist/experimental/moe-gate.d.ts.map +1 -0
  386. package/dist/experimental/moe-gate.js +240 -0
  387. package/dist/experimental/moe-gate.js.map +1 -0
  388. package/dist/experimental/reasoning-bank.d.ts +130 -0
  389. package/dist/experimental/reasoning-bank.d.ts.map +1 -0
  390. package/dist/experimental/reasoning-bank.js +427 -0
  391. package/dist/experimental/reasoning-bank.js.map +1 -0
  392. package/dist/experimental/team/team-config.d.ts +127 -0
  393. package/dist/experimental/team/team-config.d.ts.map +1 -0
  394. package/dist/experimental/team/team-config.js +48 -0
  395. package/dist/experimental/team/team-config.js.map +1 -0
  396. package/dist/experimental/team/team-experience.d.ts +300 -0
  397. package/dist/experimental/team/team-experience.d.ts.map +1 -0
  398. package/dist/experimental/team/team-experience.js +355 -0
  399. package/dist/experimental/team/team-experience.js.map +1 -0
  400. package/dist/experimental/team/team-ingester.d.ts +152 -0
  401. package/dist/experimental/team/team-ingester.d.ts.map +1 -0
  402. package/dist/experimental/team/team-ingester.js +330 -0
  403. package/dist/experimental/team/team-ingester.js.map +1 -0
  404. package/dist/experimental/team/team-meta-learner.d.ts +51 -0
  405. package/dist/experimental/team/team-meta-learner.d.ts.map +1 -0
  406. package/dist/experimental/team/team-meta-learner.js +404 -0
  407. package/dist/experimental/team/team-meta-learner.js.map +1 -0
  408. package/dist/experimental/team/team-meta.d.ts +160 -0
  409. package/dist/experimental/team/team-meta.d.ts.map +1 -0
  410. package/dist/experimental/team/team-meta.js +42 -0
  411. package/dist/experimental/team/team-meta.js.map +1 -0
  412. package/dist/experimental/team/team-pipeline.d.ts +77 -0
  413. package/dist/experimental/team/team-pipeline.d.ts.map +1 -0
  414. package/dist/experimental/team/team-pipeline.js +262 -0
  415. package/dist/experimental/team/team-pipeline.js.map +1 -0
  416. package/dist/experimental/team/team-playbook-extraction.d.ts +45 -0
  417. package/dist/experimental/team/team-playbook-extraction.d.ts.map +1 -0
  418. package/dist/experimental/team/team-playbook-extraction.js +526 -0
  419. package/dist/experimental/team/team-playbook-extraction.js.map +1 -0
  420. package/dist/experimental/team/team-playbook.d.ts +276 -0
  421. package/dist/experimental/team/team-playbook.d.ts.map +1 -0
  422. package/dist/experimental/team/team-playbook.js +85 -0
  423. package/dist/experimental/team/team-playbook.js.map +1 -0
  424. package/dist/experimental/team/team-router.d.ts +98 -0
  425. package/dist/experimental/team/team-router.d.ts.map +1 -0
  426. package/dist/experimental/team/team-router.js +312 -0
  427. package/dist/experimental/team/team-router.js.map +1 -0
  428. package/dist/experimental/team/team-skill-library.d.ts +180 -0
  429. package/dist/experimental/team/team-skill-library.d.ts.map +1 -0
  430. package/dist/experimental/team/team-skill-library.js +385 -0
  431. package/dist/experimental/team/team-skill-library.js.map +1 -0
  432. package/dist/experimental/team/team-trajectory-analysis.d.ts +19 -0
  433. package/dist/experimental/team/team-trajectory-analysis.d.ts.map +1 -0
  434. package/dist/experimental/team/team-trajectory-analysis.js +442 -0
  435. package/dist/experimental/team/team-trajectory-analysis.js.map +1 -0
  436. package/dist/experimental/team/team-trajectory.d.ts +305 -0
  437. package/dist/experimental/team/team-trajectory.d.ts.map +1 -0
  438. package/dist/experimental/team/team-trajectory.js +315 -0
  439. package/dist/experimental/team/team-trajectory.js.map +1 -0
  440. package/dist/factory.d.ts +2 -3
  441. package/dist/factory.d.ts.map +1 -1
  442. package/dist/factory.js +12 -11
  443. package/dist/factory.js.map +1 -1
  444. package/dist/index.d.ts +9 -11
  445. package/dist/index.d.ts.map +1 -1
  446. package/dist/index.js +26 -32
  447. package/dist/index.js.map +1 -1
  448. package/dist/learning/analyzer.d.ts +26 -36
  449. package/dist/learning/analyzer.d.ts.map +1 -1
  450. package/dist/learning/analyzer.js +50 -11
  451. package/dist/learning/analyzer.js.map +1 -1
  452. package/dist/learning/compound-bootstrap/external-acquisition.d.ts +63 -0
  453. package/dist/learning/compound-bootstrap/external-acquisition.d.ts.map +1 -0
  454. package/dist/learning/compound-bootstrap/external-acquisition.js +255 -0
  455. package/dist/learning/compound-bootstrap/external-acquisition.js.map +1 -0
  456. package/dist/learning/compound-bootstrap/index.d.ts +3 -0
  457. package/dist/learning/compound-bootstrap/index.d.ts.map +1 -0
  458. package/dist/learning/compound-bootstrap/index.js +3 -0
  459. package/dist/learning/compound-bootstrap/index.js.map +1 -0
  460. package/dist/learning/compound-bootstrap/workspace-analyzer.d.ts +33 -0
  461. package/dist/learning/compound-bootstrap/workspace-analyzer.d.ts.map +1 -0
  462. package/dist/learning/compound-bootstrap/workspace-analyzer.js +379 -0
  463. package/dist/learning/compound-bootstrap/workspace-analyzer.js.map +1 -0
  464. package/dist/learning/consolidation-coordinator.d.ts +49 -0
  465. package/dist/learning/consolidation-coordinator.d.ts.map +1 -0
  466. package/dist/learning/consolidation-coordinator.js +75 -0
  467. package/dist/learning/consolidation-coordinator.js.map +1 -0
  468. package/dist/learning/convention-distiller.d.ts +84 -0
  469. package/dist/learning/convention-distiller.d.ts.map +1 -0
  470. package/dist/learning/convention-distiller.js +268 -0
  471. package/dist/learning/convention-distiller.js.map +1 -0
  472. package/dist/learning/distiller.d.ts +82 -0
  473. package/dist/learning/distiller.d.ts.map +1 -0
  474. package/dist/learning/distiller.js +353 -0
  475. package/dist/learning/distiller.js.map +1 -0
  476. package/dist/learning/effectiveness.d.ts +12 -2
  477. package/dist/learning/effectiveness.d.ts.map +1 -1
  478. package/dist/learning/effectiveness.js +18 -14
  479. package/dist/learning/effectiveness.js.map +1 -1
  480. package/dist/learning/escalation.d.ts +89 -0
  481. package/dist/learning/escalation.d.ts.map +1 -0
  482. package/dist/learning/escalation.js +168 -0
  483. package/dist/learning/escalation.js.map +1 -0
  484. package/dist/learning/external-exposure.d.ts +57 -0
  485. package/dist/learning/external-exposure.d.ts.map +1 -0
  486. package/dist/learning/external-exposure.js +95 -0
  487. package/dist/learning/external-exposure.js.map +1 -0
  488. package/dist/learning/gepa-proposer.d.ts +116 -0
  489. package/dist/learning/gepa-proposer.d.ts.map +1 -0
  490. package/dist/learning/gepa-proposer.js +258 -0
  491. package/dist/learning/gepa-proposer.js.map +1 -0
  492. package/dist/learning/index.d.ts +21 -8
  493. package/dist/learning/index.d.ts.map +1 -1
  494. package/dist/learning/index.js +28 -10
  495. package/dist/learning/index.js.map +1 -1
  496. package/dist/learning/instant-loop.d.ts +46 -16
  497. package/dist/learning/instant-loop.d.ts.map +1 -1
  498. package/dist/learning/instant-loop.js +114 -111
  499. package/dist/learning/instant-loop.js.map +1 -1
  500. package/dist/learning/knowledge-extractor.d.ts.map +1 -1
  501. package/dist/learning/knowledge-extractor.js +1 -2
  502. package/dist/learning/knowledge-extractor.js.map +1 -1
  503. package/dist/learning/llm-extractor.d.ts +88 -0
  504. package/dist/learning/llm-extractor.d.ts.map +1 -0
  505. package/dist/learning/llm-extractor.js +372 -0
  506. package/dist/learning/llm-extractor.js.map +1 -0
  507. package/dist/learning/loop-coordinator.d.ts +61 -0
  508. package/dist/learning/loop-coordinator.d.ts.map +1 -0
  509. package/dist/learning/loop-coordinator.js +96 -0
  510. package/dist/learning/loop-coordinator.js.map +1 -0
  511. package/dist/learning/maintenance-scheduler.d.ts +15 -4
  512. package/dist/learning/maintenance-scheduler.d.ts.map +1 -1
  513. package/dist/learning/maintenance-scheduler.js +19 -16
  514. package/dist/learning/maintenance-scheduler.js.map +1 -1
  515. package/dist/learning/mechanism-trace.d.ts +196 -0
  516. package/dist/learning/mechanism-trace.d.ts.map +1 -0
  517. package/dist/learning/mechanism-trace.js +81 -0
  518. package/dist/learning/mechanism-trace.js.map +1 -0
  519. package/dist/learning/merge-proposer.d.ts +102 -0
  520. package/dist/learning/merge-proposer.d.ts.map +1 -0
  521. package/dist/learning/merge-proposer.js +253 -0
  522. package/dist/learning/merge-proposer.js.map +1 -0
  523. package/dist/learning/meta-learner.d.ts +9 -7
  524. package/dist/learning/meta-learner.d.ts.map +1 -1
  525. package/dist/learning/meta-learner.js +16 -45
  526. package/dist/learning/meta-learner.js.map +1 -1
  527. package/dist/learning/mutation-gate.d.ts +218 -0
  528. package/dist/learning/mutation-gate.d.ts.map +1 -0
  529. package/dist/learning/mutation-gate.js +390 -0
  530. package/dist/learning/mutation-gate.js.map +1 -0
  531. package/dist/learning/oracle-signal.d.ts +67 -0
  532. package/dist/learning/oracle-signal.d.ts.map +1 -0
  533. package/dist/learning/oracle-signal.js +94 -0
  534. package/dist/learning/oracle-signal.js.map +1 -0
  535. package/dist/learning/pipeline.d.ts +31 -4
  536. package/dist/learning/pipeline.d.ts.map +1 -1
  537. package/dist/learning/pipeline.js +64 -12
  538. package/dist/learning/pipeline.js.map +1 -1
  539. package/dist/learning/playbook-extractor.d.ts +8 -0
  540. package/dist/learning/playbook-extractor.d.ts.map +1 -1
  541. package/dist/learning/playbook-extractor.js +119 -34
  542. package/dist/learning/playbook-extractor.js.map +1 -1
  543. package/dist/learning/playbook-optimizer.d.ts +37 -0
  544. package/dist/learning/playbook-optimizer.d.ts.map +1 -0
  545. package/dist/learning/playbook-optimizer.js +125 -0
  546. package/dist/learning/playbook-optimizer.js.map +1 -0
  547. package/dist/learning/reflective-proposer.d.ts +173 -0
  548. package/dist/learning/reflective-proposer.d.ts.map +1 -0
  549. package/dist/learning/reflective-proposer.js +354 -0
  550. package/dist/learning/reflective-proposer.js.map +1 -0
  551. package/dist/learning/reflexion-generator.d.ts.map +1 -1
  552. package/dist/learning/reflexion-generator.js +4 -3
  553. package/dist/learning/reflexion-generator.js.map +1 -1
  554. package/dist/learning/replay-executor.d.ts +64 -0
  555. package/dist/learning/replay-executor.d.ts.map +1 -0
  556. package/dist/learning/replay-executor.js +92 -0
  557. package/dist/learning/replay-executor.js.map +1 -0
  558. package/dist/learning/replay-types.d.ts +150 -0
  559. package/dist/learning/replay-types.d.ts.map +1 -0
  560. package/dist/learning/replay-types.js +207 -0
  561. package/dist/learning/replay-types.js.map +1 -0
  562. package/dist/learning/replay.d.ts +166 -0
  563. package/dist/learning/replay.d.ts.map +1 -0
  564. package/dist/learning/replay.js +228 -0
  565. package/dist/learning/replay.js.map +1 -0
  566. package/dist/learning/seed-report.d.ts +88 -0
  567. package/dist/learning/seed-report.d.ts.map +1 -0
  568. package/dist/learning/seed-report.js +120 -0
  569. package/dist/learning/seed-report.js.map +1 -0
  570. package/dist/learning/trajectory-sources/dataclaw.d.ts.map +1 -1
  571. package/dist/learning/trajectory-sources/dataclaw.js +6 -18
  572. package/dist/learning/trajectory-sources/dataclaw.js.map +1 -1
  573. package/dist/learning/trajectory-sources/entire.d.ts.map +1 -1
  574. package/dist/learning/trajectory-sources/entire.js +30 -9
  575. package/dist/learning/trajectory-sources/entire.js.map +1 -1
  576. package/dist/learning/trajectory-sources/file.d.ts.map +1 -1
  577. package/dist/learning/trajectory-sources/file.js.map +1 -1
  578. package/dist/learning/trajectory-sources/huggingface.d.ts.map +1 -1
  579. package/dist/learning/trajectory-sources/huggingface.js +7 -7
  580. package/dist/learning/trajectory-sources/huggingface.js.map +1 -1
  581. package/dist/learning/trajectory-sources/in-memory.d.ts.map +1 -1
  582. package/dist/learning/trajectory-sources/in-memory.js.map +1 -1
  583. package/dist/learning/trajectory-sources/index.d.ts +3 -4
  584. package/dist/learning/trajectory-sources/index.d.ts.map +1 -1
  585. package/dist/learning/trajectory-sources/index.js +3 -4
  586. package/dist/learning/trajectory-sources/index.js.map +1 -1
  587. package/dist/learning/trajectory-sources/pipeline.d.ts +4 -3
  588. package/dist/learning/trajectory-sources/pipeline.d.ts.map +1 -1
  589. package/dist/learning/trajectory-sources/pipeline.js +4 -3
  590. package/dist/learning/trajectory-sources/pipeline.js.map +1 -1
  591. package/dist/learning/unified-pipeline.d.ts +486 -61
  592. package/dist/learning/unified-pipeline.d.ts.map +1 -1
  593. package/dist/learning/unified-pipeline.js +1501 -232
  594. package/dist/learning/unified-pipeline.js.map +1 -1
  595. package/dist/learning/usage-inference.d.ts.map +1 -1
  596. package/dist/learning/usage-inference.js +4 -9
  597. package/dist/learning/usage-inference.js.map +1 -1
  598. package/dist/learning/workspace-snapshot.d.ts +146 -0
  599. package/dist/learning/workspace-snapshot.d.ts.map +1 -0
  600. package/dist/learning/workspace-snapshot.js +269 -0
  601. package/dist/learning/workspace-snapshot.js.map +1 -0
  602. package/dist/mcp/playbook-server.d.ts +61 -2
  603. package/dist/mcp/playbook-server.d.ts.map +1 -1
  604. package/dist/mcp/playbook-server.js +179 -9
  605. package/dist/mcp/playbook-server.js.map +1 -1
  606. package/dist/memory/coherence.d.ts.map +1 -1
  607. package/dist/memory/coherence.js +5 -7
  608. package/dist/memory/coherence.js.map +1 -1
  609. package/dist/memory/curated-loader.d.ts +24 -0
  610. package/dist/memory/curated-loader.d.ts.map +1 -1
  611. package/dist/memory/curated-loader.js +22 -5
  612. package/dist/memory/curated-loader.js.map +1 -1
  613. package/dist/memory/evolution/llm-evolver.d.ts +36 -0
  614. package/dist/memory/evolution/llm-evolver.d.ts.map +1 -0
  615. package/dist/memory/evolution/llm-evolver.js +106 -0
  616. package/dist/memory/evolution/llm-evolver.js.map +1 -0
  617. package/dist/memory/experience.d.ts +34 -13
  618. package/dist/memory/experience.d.ts.map +1 -1
  619. package/dist/memory/experience.js +59 -48
  620. package/dist/memory/experience.js.map +1 -1
  621. package/dist/memory/extraction/conversation-extractor.d.ts +62 -0
  622. package/dist/memory/extraction/conversation-extractor.d.ts.map +1 -0
  623. package/dist/memory/extraction/conversation-extractor.js +169 -0
  624. package/dist/memory/extraction/conversation-extractor.js.map +1 -0
  625. package/dist/memory/filesystem-cascade.d.ts +116 -0
  626. package/dist/memory/filesystem-cascade.d.ts.map +1 -0
  627. package/dist/memory/filesystem-cascade.js +221 -0
  628. package/dist/memory/filesystem-cascade.js.map +1 -0
  629. package/dist/memory/index.d.ts +14 -10
  630. package/dist/memory/index.d.ts.map +1 -1
  631. package/dist/memory/index.js +15 -12
  632. package/dist/memory/index.js.map +1 -1
  633. package/dist/memory/knowledge-bank.d.ts +145 -29
  634. package/dist/memory/knowledge-bank.d.ts.map +1 -1
  635. package/dist/memory/knowledge-bank.js +511 -200
  636. package/dist/memory/knowledge-bank.js.map +1 -1
  637. package/dist/memory/knowledge-defrag.d.ts +32 -9
  638. package/dist/memory/knowledge-defrag.d.ts.map +1 -1
  639. package/dist/memory/knowledge-defrag.js +57 -49
  640. package/dist/memory/knowledge-defrag.js.map +1 -1
  641. package/dist/memory/meta-playbook-bank.d.ts +24 -0
  642. package/dist/memory/meta-playbook-bank.d.ts.map +1 -0
  643. package/dist/memory/meta-playbook-bank.js +135 -0
  644. package/dist/memory/meta-playbook-bank.js.map +1 -0
  645. package/dist/memory/meta.d.ts.map +1 -1
  646. package/dist/memory/meta.js +33 -14
  647. package/dist/memory/meta.js.map +1 -1
  648. package/dist/memory/playbook-applicability.d.ts +43 -0
  649. package/dist/memory/playbook-applicability.d.ts.map +1 -0
  650. package/dist/memory/playbook-applicability.js +155 -0
  651. package/dist/memory/playbook-applicability.js.map +1 -0
  652. package/dist/memory/playbook-incorporation.d.ts +24 -0
  653. package/dist/memory/playbook-incorporation.d.ts.map +1 -0
  654. package/dist/memory/playbook-incorporation.js +41 -0
  655. package/dist/memory/playbook-incorporation.js.map +1 -0
  656. package/dist/memory/playbook.d.ts +444 -7
  657. package/dist/memory/playbook.d.ts.map +1 -1
  658. package/dist/memory/playbook.js +1231 -50
  659. package/dist/memory/playbook.js.map +1 -1
  660. package/dist/memory/procedural-skill.d.ts +142 -0
  661. package/dist/memory/procedural-skill.d.ts.map +1 -0
  662. package/dist/memory/procedural-skill.js +846 -0
  663. package/dist/memory/procedural-skill.js.map +1 -0
  664. package/dist/memory/search-provider.d.ts +8 -3
  665. package/dist/memory/search-provider.d.ts.map +1 -1
  666. package/dist/memory/search-providers/embedding.d.ts +64 -0
  667. package/dist/memory/search-providers/embedding.d.ts.map +1 -0
  668. package/dist/memory/search-providers/embedding.js +96 -0
  669. package/dist/memory/search-providers/embedding.js.map +1 -0
  670. package/dist/memory/search-providers/hybrid.d.ts +74 -0
  671. package/dist/memory/search-providers/hybrid.d.ts.map +1 -0
  672. package/dist/memory/search-providers/hybrid.js +94 -0
  673. package/dist/memory/search-providers/hybrid.js.map +1 -0
  674. package/dist/memory/search-providers/index.d.ts +3 -0
  675. package/dist/memory/search-providers/index.d.ts.map +1 -1
  676. package/dist/memory/search-providers/index.js +3 -0
  677. package/dist/memory/search-providers/index.js.map +1 -1
  678. package/dist/memory/search-providers/keyword-expanding.d.ts +22 -0
  679. package/dist/memory/search-providers/keyword-expanding.d.ts.map +1 -0
  680. package/dist/memory/search-providers/keyword-expanding.js +35 -0
  681. package/dist/memory/search-providers/keyword-expanding.js.map +1 -0
  682. package/dist/memory/search-providers/minimem.d.ts +16 -4
  683. package/dist/memory/search-providers/minimem.d.ts.map +1 -1
  684. package/dist/memory/search-providers/minimem.js +14 -3
  685. package/dist/memory/search-providers/minimem.js.map +1 -1
  686. package/dist/memory/search-providers/text-similarity.d.ts +2 -4
  687. package/dist/memory/search-providers/text-similarity.d.ts.map +1 -1
  688. package/dist/memory/search-providers/text-similarity.js.map +1 -1
  689. package/dist/memory/seeds/meta-playbook-seeds.d.ts +27 -0
  690. package/dist/memory/seeds/meta-playbook-seeds.d.ts.map +1 -0
  691. package/dist/memory/seeds/meta-playbook-seeds.js +560 -0
  692. package/dist/memory/seeds/meta-playbook-seeds.js.map +1 -0
  693. package/dist/memory/seeds/meta-strategy-seeds.d.ts +23 -0
  694. package/dist/memory/seeds/meta-strategy-seeds.d.ts.map +1 -0
  695. package/dist/memory/seeds/meta-strategy-seeds.js +82 -0
  696. package/dist/memory/seeds/meta-strategy-seeds.js.map +1 -0
  697. package/dist/memory/seeds/seed-loader.d.ts +34 -0
  698. package/dist/memory/seeds/seed-loader.d.ts.map +1 -0
  699. package/dist/memory/seeds/seed-loader.js +60 -0
  700. package/dist/memory/seeds/seed-loader.js.map +1 -0
  701. package/dist/memory/skill-exporter.d.ts.map +1 -1
  702. package/dist/memory/skill-exporter.js +1 -2
  703. package/dist/memory/skill-exporter.js.map +1 -1
  704. package/dist/memory/source-resolver.d.ts.map +1 -1
  705. package/dist/memory/source-resolver.js +7 -8
  706. package/dist/memory/source-resolver.js.map +1 -1
  707. package/dist/memory/system.d.ts +119 -14
  708. package/dist/memory/system.d.ts.map +1 -1
  709. package/dist/memory/system.js +416 -60
  710. package/dist/memory/system.js.map +1 -1
  711. package/dist/memory/temporal-compressor.d.ts +1 -1
  712. package/dist/memory/temporal-compressor.d.ts.map +1 -1
  713. package/dist/memory/temporal-compressor.js +26 -16
  714. package/dist/memory/temporal-compressor.js.map +1 -1
  715. package/dist/persistence/index.d.ts +2 -2
  716. package/dist/persistence/index.d.ts.map +1 -1
  717. package/dist/persistence/index.js +1 -1
  718. package/dist/persistence/index.js.map +1 -1
  719. package/dist/persistence/migrator.d.ts +34 -1
  720. package/dist/persistence/migrator.d.ts.map +1 -1
  721. package/dist/persistence/migrator.js +163 -33
  722. package/dist/persistence/migrator.js.map +1 -1
  723. package/dist/persistence/sqlite-persistence.d.ts +412 -1
  724. package/dist/persistence/sqlite-persistence.d.ts.map +1 -1
  725. package/dist/persistence/sqlite-persistence.js +1038 -47
  726. package/dist/persistence/sqlite-persistence.js.map +1 -1
  727. package/dist/runtime/backends/acp-protocol.d.ts.map +1 -1
  728. package/dist/runtime/backends/acp-protocol.js +2 -1
  729. package/dist/runtime/backends/acp-protocol.js.map +1 -1
  730. package/dist/runtime/backends/acp.d.ts.map +1 -1
  731. package/dist/runtime/backends/acp.js +5 -4
  732. package/dist/runtime/backends/acp.js.map +1 -1
  733. package/dist/runtime/backends/index.d.ts +2 -2
  734. package/dist/runtime/backends/index.d.ts.map +1 -1
  735. package/dist/runtime/backends/index.js +2 -2
  736. package/dist/runtime/backends/index.js.map +1 -1
  737. package/dist/runtime/backends/macro-agent.d.ts +17 -1
  738. package/dist/runtime/backends/macro-agent.d.ts.map +1 -1
  739. package/dist/runtime/backends/macro-agent.js +1 -1
  740. package/dist/runtime/backends/macro-agent.js.map +1 -1
  741. package/dist/runtime/backends/mock.d.ts.map +1 -1
  742. package/dist/runtime/backends/mock.js.map +1 -1
  743. package/dist/runtime/backends/subprocess.d.ts.map +1 -1
  744. package/dist/runtime/backends/subprocess.js +5 -4
  745. package/dist/runtime/backends/subprocess.js.map +1 -1
  746. package/dist/runtime/compute-provider.d.ts +2 -18
  747. package/dist/runtime/compute-provider.d.ts.map +1 -1
  748. package/dist/runtime/compute-provider.js +8 -8
  749. package/dist/runtime/compute-provider.js.map +1 -1
  750. package/dist/runtime/flows/learning.d.ts +2 -1
  751. package/dist/runtime/flows/learning.d.ts.map +1 -1
  752. package/dist/runtime/flows/learning.js +4 -5
  753. package/dist/runtime/flows/learning.js.map +1 -1
  754. package/dist/runtime/flows/validation.d.ts.map +1 -1
  755. package/dist/runtime/flows/validation.js +2 -5
  756. package/dist/runtime/flows/validation.js.map +1 -1
  757. package/dist/runtime/index.d.ts +1 -1
  758. package/dist/runtime/index.d.ts.map +1 -1
  759. package/dist/runtime/index.js.map +1 -1
  760. package/dist/runtime/manager.d.ts +128 -0
  761. package/dist/runtime/manager.d.ts.map +1 -1
  762. package/dist/runtime/manager.js +375 -64
  763. package/dist/runtime/manager.js.map +1 -1
  764. package/dist/runtime/types.d.ts +92 -1
  765. package/dist/runtime/types.d.ts.map +1 -1
  766. package/dist/search/evaluator.d.ts +71 -0
  767. package/dist/search/evaluator.d.ts.map +1 -1
  768. package/dist/search/evaluator.js +40 -5
  769. package/dist/search/evaluator.js.map +1 -1
  770. package/dist/search/index.d.ts +3 -5
  771. package/dist/search/index.d.ts.map +1 -1
  772. package/dist/search/index.js +4 -7
  773. package/dist/search/index.js.map +1 -1
  774. package/dist/search/moe-gate.d.ts +48 -2
  775. package/dist/search/moe-gate.d.ts.map +1 -1
  776. package/dist/search/moe-gate.js +117 -4
  777. package/dist/search/moe-gate.js.map +1 -1
  778. package/dist/search/refinement-loop.d.ts +63 -3
  779. package/dist/search/refinement-loop.d.ts.map +1 -1
  780. package/dist/search/refinement-loop.js +278 -23
  781. package/dist/search/refinement-loop.js.map +1 -1
  782. package/dist/search/refinement-types.d.ts +4 -2
  783. package/dist/search/refinement-types.d.ts.map +1 -1
  784. package/dist/search/refinement-types.js +2 -11
  785. package/dist/search/refinement-types.js.map +1 -1
  786. package/dist/search/router.d.ts +41 -34
  787. package/dist/search/router.d.ts.map +1 -1
  788. package/dist/search/router.js +156 -90
  789. package/dist/search/router.js.map +1 -1
  790. package/dist/search/solver.js +1 -1
  791. package/dist/search/solver.js.map +1 -1
  792. package/dist/search/task-difficulty.d.ts +54 -0
  793. package/dist/search/task-difficulty.d.ts.map +1 -0
  794. package/dist/search/task-difficulty.js +116 -0
  795. package/dist/search/task-difficulty.js.map +1 -0
  796. package/dist/search/tau-bench-verifier.d.ts +74 -0
  797. package/dist/search/tau-bench-verifier.d.ts.map +1 -0
  798. package/dist/search/tau-bench-verifier.js +96 -0
  799. package/dist/search/tau-bench-verifier.js.map +1 -0
  800. package/dist/search/verification-runner.d.ts.map +1 -1
  801. package/dist/search/verification-runner.js +6 -5
  802. package/dist/search/verification-runner.js.map +1 -1
  803. package/dist/session-bank/git-reader.d.ts.map +1 -1
  804. package/dist/session-bank/git-reader.js +5 -19
  805. package/dist/session-bank/git-reader.js.map +1 -1
  806. package/dist/session-bank/parser.d.ts.map +1 -1
  807. package/dist/session-bank/parser.js +26 -0
  808. package/dist/session-bank/parser.js.map +1 -1
  809. package/dist/session-bank/session-bank.d.ts.map +1 -1
  810. package/dist/session-bank/session-bank.js +2 -5
  811. package/dist/session-bank/session-bank.js.map +1 -1
  812. package/dist/session-bank/types.d.ts +24 -0
  813. package/dist/session-bank/types.d.ts.map +1 -1
  814. package/dist/surfacing/index.d.ts +3 -3
  815. package/dist/surfacing/index.d.ts.map +1 -1
  816. package/dist/surfacing/index.js +2 -2
  817. package/dist/surfacing/index.js.map +1 -1
  818. package/dist/surfacing/shared-bank.d.ts +43 -0
  819. package/dist/surfacing/shared-bank.d.ts.map +1 -0
  820. package/dist/surfacing/shared-bank.js +104 -0
  821. package/dist/surfacing/shared-bank.js.map +1 -0
  822. package/dist/surfacing/skill-library.d.ts +98 -2
  823. package/dist/surfacing/skill-library.d.ts.map +1 -1
  824. package/dist/surfacing/skill-library.js +192 -17
  825. package/dist/surfacing/skill-library.js.map +1 -1
  826. package/dist/surfacing/skill-publisher.d.ts +3 -1
  827. package/dist/surfacing/skill-publisher.d.ts.map +1 -1
  828. package/dist/surfacing/skill-publisher.js +28 -28
  829. package/dist/surfacing/skill-publisher.js.map +1 -1
  830. package/dist/surfacing/sqlite-storage-adapter.d.ts +2 -2
  831. package/dist/surfacing/sqlite-storage-adapter.d.ts.map +1 -1
  832. package/dist/surfacing/sqlite-storage-adapter.js +27 -18
  833. package/dist/surfacing/sqlite-storage-adapter.js.map +1 -1
  834. package/dist/types/analysis.d.ts +43 -0
  835. package/dist/types/analysis.d.ts.map +1 -0
  836. package/dist/types/analysis.js +10 -0
  837. package/dist/types/analysis.js.map +1 -0
  838. package/dist/types/config.d.ts +2178 -425
  839. package/dist/types/config.d.ts.map +1 -1
  840. package/dist/types/config.js +600 -88
  841. package/dist/types/config.js.map +1 -1
  842. package/dist/types/dataclaw.d.ts +3 -3
  843. package/dist/types/index.d.ts +4 -7
  844. package/dist/types/index.d.ts.map +1 -1
  845. package/dist/types/index.js +2 -10
  846. package/dist/types/index.js.map +1 -1
  847. package/dist/types/knowledge-graph.d.ts +1 -1
  848. package/dist/types/knowledge-graph.d.ts.map +1 -1
  849. package/dist/types/knowledge.d.ts +219 -11
  850. package/dist/types/knowledge.d.ts.map +1 -1
  851. package/dist/types/knowledge.js +90 -30
  852. package/dist/types/knowledge.js.map +1 -1
  853. package/dist/types/memory.d.ts +8 -0
  854. package/dist/types/memory.d.ts.map +1 -1
  855. package/dist/types/memory.js +12 -4
  856. package/dist/types/memory.js.map +1 -1
  857. package/dist/types/outcome.d.ts +11 -0
  858. package/dist/types/outcome.d.ts.map +1 -1
  859. package/dist/types/outcome.js +9 -0
  860. package/dist/types/outcome.js.map +1 -1
  861. package/dist/types/playbook.d.ts +63 -0
  862. package/dist/types/playbook.d.ts.map +1 -1
  863. package/dist/types/playbook.js +51 -0
  864. package/dist/types/playbook.js.map +1 -1
  865. package/dist/types/trajectory-source.d.ts +1 -1
  866. package/dist/types/trajectory-source.d.ts.map +1 -1
  867. package/dist/types/trajectory.d.ts +61 -0
  868. package/dist/types/trajectory.d.ts.map +1 -1
  869. package/dist/types/trajectory.js +25 -0
  870. package/dist/types/trajectory.js.map +1 -1
  871. package/dist/utils/clock.d.ts +36 -0
  872. package/dist/utils/clock.d.ts.map +1 -0
  873. package/dist/utils/clock.js +48 -0
  874. package/dist/utils/clock.js.map +1 -0
  875. package/dist/utils/frontmatter.d.ts.map +1 -1
  876. package/dist/utils/frontmatter.js +10 -2
  877. package/dist/utils/frontmatter.js.map +1 -1
  878. package/dist/utils/index.d.ts +4 -1
  879. package/dist/utils/index.d.ts.map +1 -1
  880. package/dist/utils/index.js +4 -1
  881. package/dist/utils/index.js.map +1 -1
  882. package/dist/utils/logger.d.ts +31 -0
  883. package/dist/utils/logger.d.ts.map +1 -0
  884. package/dist/utils/logger.js +50 -0
  885. package/dist/utils/logger.js.map +1 -0
  886. package/dist/utils/objectives.d.ts +45 -0
  887. package/dist/utils/objectives.d.ts.map +1 -0
  888. package/dist/utils/objectives.js +74 -0
  889. package/dist/utils/objectives.js.map +1 -0
  890. package/dist/utils/partitioned-store.d.ts.map +1 -1
  891. package/dist/utils/partitioned-store.js.map +1 -1
  892. package/dist/utils/playbook-hash.d.ts +19 -0
  893. package/dist/utils/playbook-hash.d.ts.map +1 -0
  894. package/dist/utils/playbook-hash.js +51 -0
  895. package/dist/utils/playbook-hash.js.map +1 -0
  896. package/dist/utils/similarity.d.ts.map +1 -1
  897. package/dist/utils/similarity.js.map +1 -1
  898. package/dist/utils/solver-canonicalizer.d.ts +22 -0
  899. package/dist/utils/solver-canonicalizer.d.ts.map +1 -0
  900. package/dist/utils/solver-canonicalizer.js +41 -0
  901. package/dist/utils/solver-canonicalizer.js.map +1 -0
  902. package/dist/utils/storage.d.ts.map +1 -1
  903. package/dist/utils/storage.js +1 -3
  904. package/dist/utils/storage.js.map +1 -1
  905. package/dist/utils/task-signature.d.ts +34 -0
  906. package/dist/utils/task-signature.d.ts.map +1 -0
  907. package/dist/utils/task-signature.js +112 -0
  908. package/dist/utils/task-signature.js.map +1 -0
  909. package/dist/utils/trajectory-helpers.d.ts.map +1 -1
  910. package/dist/utils/trajectory-helpers.js.map +1 -1
  911. package/dist/utils/validation.d.ts.map +1 -1
  912. package/dist/utils/validation.js.map +1 -1
  913. package/dist/workspace/efficacy-toolkit.d.ts.map +1 -1
  914. package/dist/workspace/efficacy-toolkit.js +18 -26
  915. package/dist/workspace/efficacy-toolkit.js.map +1 -1
  916. package/dist/workspace/index.d.ts +4 -3
  917. package/dist/workspace/index.d.ts.map +1 -1
  918. package/dist/workspace/index.js +5 -3
  919. package/dist/workspace/index.js.map +1 -1
  920. package/dist/workspace/runner.d.ts.map +1 -1
  921. package/dist/workspace/runner.js +95 -21
  922. package/dist/workspace/runner.js.map +1 -1
  923. package/dist/workspace/skill-converter.d.ts +66 -1
  924. package/dist/workspace/skill-converter.d.ts.map +1 -1
  925. package/dist/workspace/skill-converter.js +238 -19
  926. package/dist/workspace/skill-converter.js.map +1 -1
  927. package/dist/workspace/skill-import.d.ts +43 -0
  928. package/dist/workspace/skill-import.d.ts.map +1 -0
  929. package/dist/workspace/skill-import.js +40 -0
  930. package/dist/workspace/skill-import.js.map +1 -0
  931. package/dist/workspace/templates/index.d.ts +6 -8
  932. package/dist/workspace/templates/index.d.ts.map +1 -1
  933. package/dist/workspace/templates/index.js +7 -11
  934. package/dist/workspace/templates/index.js.map +1 -1
  935. package/dist/workspace/templates/knowledge-defrag.d.ts.map +1 -1
  936. package/dist/workspace/templates/knowledge-defrag.js +0 -2
  937. package/dist/workspace/templates/knowledge-defrag.js.map +1 -1
  938. package/dist/workspace/templates/knowledge-extraction.d.ts +11 -0
  939. package/dist/workspace/templates/knowledge-extraction.d.ts.map +1 -1
  940. package/dist/workspace/templates/knowledge-extraction.js +11 -6
  941. package/dist/workspace/templates/knowledge-extraction.js.map +1 -1
  942. package/dist/workspace/templates/playbook-conditioning.d.ts +38 -0
  943. package/dist/workspace/templates/playbook-conditioning.d.ts.map +1 -0
  944. package/dist/workspace/templates/playbook-conditioning.js +147 -0
  945. package/dist/workspace/templates/playbook-conditioning.js.map +1 -0
  946. package/dist/workspace/templates/playbook-decay-detection.d.ts.map +1 -1
  947. package/dist/workspace/templates/playbook-decay-detection.js +24 -18
  948. package/dist/workspace/templates/playbook-decay-detection.js.map +1 -1
  949. package/dist/workspace/templates/playbook-efficacy-audit.d.ts.map +1 -1
  950. package/dist/workspace/templates/playbook-efficacy-audit.js +26 -11
  951. package/dist/workspace/templates/playbook-efficacy-audit.js.map +1 -1
  952. package/dist/workspace/templates/playbook-extraction.d.ts.map +1 -1
  953. package/dist/workspace/templates/playbook-extraction.js +75 -15
  954. package/dist/workspace/templates/playbook-extraction.js.map +1 -1
  955. package/dist/workspace/templates/playbook-lifecycle-review.d.ts.map +1 -1
  956. package/dist/workspace/templates/playbook-lifecycle-review.js +12 -8
  957. package/dist/workspace/templates/playbook-lifecycle-review.js.map +1 -1
  958. package/dist/workspace/templates/refinement-analysis.d.ts.map +1 -1
  959. package/dist/workspace/templates/refinement-analysis.js +11 -5
  960. package/dist/workspace/templates/refinement-analysis.js.map +1 -1
  961. package/dist/workspace/templates/skill-enrichment.d.ts.map +1 -1
  962. package/dist/workspace/templates/skill-enrichment.js +7 -11
  963. package/dist/workspace/templates/skill-enrichment.js.map +1 -1
  964. package/dist/workspace/templates/solution-evaluation.d.ts.map +1 -1
  965. package/dist/workspace/templates/solution-evaluation.js +15 -8
  966. package/dist/workspace/templates/solution-evaluation.js.map +1 -1
  967. package/dist/workspace/templates/trajectory-analysis.d.ts.map +1 -1
  968. package/dist/workspace/templates/trajectory-analysis.js +1 -3
  969. package/dist/workspace/templates/trajectory-analysis.js.map +1 -1
  970. package/dist/workspace/templates/usage-inference.d.ts.map +1 -1
  971. package/dist/workspace/templates/usage-inference.js +9 -7
  972. package/dist/workspace/templates/usage-inference.js.map +1 -1
  973. package/dist/workspace/types.d.ts +32 -2
  974. package/dist/workspace/types.d.ts.map +1 -1
  975. package/dist/workspace/types.js +29 -0
  976. package/dist/workspace/types.js.map +1 -1
  977. package/package.json +43 -19
  978. package/playbooks/agent-ops/long-task-checkpointing.json +54 -0
  979. package/playbooks/agent-ops/progressive-context-gathering.json +56 -0
  980. package/playbooks/agent-ops/safe-destructive-operations.json +59 -0
  981. package/playbooks/agent-ops/scope-discipline.json +56 -0
  982. package/playbooks/agent-ops/stall-detection-strategy-switch.json +55 -0
  983. package/playbooks/agent-ops/verification-before-completion.json +54 -0
  984. package/playbooks/alfworld/clean-and-place.json +35 -0
  985. package/playbooks/alfworld/cool-and-place.json +35 -0
  986. package/playbooks/alfworld/examine-in-light.json +32 -0
  987. package/playbooks/alfworld/heat-and-place.json +35 -0
  988. package/playbooks/alfworld/pick-and-place.json +37 -0
  989. package/playbooks/alfworld/pick-two-and-place.json +35 -0
  990. package/.claude/settings.json +0 -197
  991. package/.entire/settings.json +0 -4
  992. package/.sessionlog/settings.json +0 -4
  993. package/CLAUDE.md +0 -233
  994. package/SKILL.md +0 -193
  995. package/docs/DESIGN-agentic-workspace.md +0 -2057
  996. package/docs/DESIGN-semantic-memory-knowledge-bank.md +0 -1789
  997. package/docs/DESIGN-session-bank.md +0 -1134
  998. package/docs/DESIGN-team-extraction-pipeline.md +0 -1369
  999. package/docs/PROPOSAL-team-aware-learning.md +0 -1080
  1000. package/docs/RESEARCH-semantic-memory-knowledge-structures.md +0 -517
  1001. package/docs/RESEARCH-team-trajectory-learning.md +0 -553
  1002. package/gaps.md +0 -204
  1003. package/scripts/migrate-to-playbooks.ts +0 -307
  1004. package/src/agents/index.ts +0 -14
  1005. package/src/agents/mock-provider.ts +0 -93
  1006. package/src/agents/types.ts +0 -137
  1007. package/src/atlas.ts +0 -1198
  1008. package/src/bin/cli-utils.ts +0 -220
  1009. package/src/bin/cognitive-core.ts +0 -162
  1010. package/src/bin/commands/kb.ts +0 -266
  1011. package/src/bin/commands/learn.ts +0 -100
  1012. package/src/bin/commands/legacy.ts +0 -182
  1013. package/src/bin/commands/run.ts +0 -113
  1014. package/src/bin/commands/sessions.ts +0 -221
  1015. package/src/bin/commands/skills.ts +0 -146
  1016. package/src/embeddings/bm25.ts +0 -337
  1017. package/src/embeddings/index.ts +0 -42
  1018. package/src/embeddings/inverted-index.ts +0 -134
  1019. package/src/embeddings/manager.ts +0 -293
  1020. package/src/embeddings/provider.ts +0 -318
  1021. package/src/embeddings/vector-store.ts +0 -365
  1022. package/src/factory.ts +0 -280
  1023. package/src/index.ts +0 -495
  1024. package/src/learning/analyzer.ts +0 -319
  1025. package/src/learning/effectiveness.ts +0 -428
  1026. package/src/learning/energy-evaluator.ts +0 -282
  1027. package/src/learning/healing-orchestrator.ts +0 -383
  1028. package/src/learning/index.ts +0 -150
  1029. package/src/learning/instant-loop.ts +0 -357
  1030. package/src/learning/knowledge-extractor.ts +0 -470
  1031. package/src/learning/maintenance-scheduler.ts +0 -271
  1032. package/src/learning/meta-learner.ts +0 -552
  1033. package/src/learning/playbook-extractor.ts +0 -702
  1034. package/src/learning/reflexion-generator.ts +0 -273
  1035. package/src/learning/team-ingester.ts +0 -499
  1036. package/src/learning/team-meta-learner.ts +0 -558
  1037. package/src/learning/team-pipeline.ts +0 -364
  1038. package/src/learning/trajectory-sources/dataclaw.ts +0 -403
  1039. package/src/learning/trajectory-sources/entire.ts +0 -251
  1040. package/src/learning/trajectory-sources/file.ts +0 -136
  1041. package/src/learning/trajectory-sources/huggingface.ts +0 -248
  1042. package/src/learning/trajectory-sources/in-memory.ts +0 -61
  1043. package/src/learning/trajectory-sources/index.ts +0 -15
  1044. package/src/learning/trajectory-sources/pipeline.ts +0 -69
  1045. package/src/learning/unified-pipeline.ts +0 -1191
  1046. package/src/learning/usage-inference.ts +0 -372
  1047. package/src/mcp/index.ts +0 -12
  1048. package/src/mcp/playbook-server.ts +0 -565
  1049. package/src/memory/candidate-retrieval.ts +0 -72
  1050. package/src/memory/causal-store.ts +0 -273
  1051. package/src/memory/coherence.ts +0 -252
  1052. package/src/memory/curated-loader.ts +0 -213
  1053. package/src/memory/experience.ts +0 -682
  1054. package/src/memory/graph-layers/base.ts +0 -184
  1055. package/src/memory/graph-layers/causal.ts +0 -16
  1056. package/src/memory/graph-layers/entity.ts +0 -16
  1057. package/src/memory/graph-layers/index.ts +0 -5
  1058. package/src/memory/graph-layers/semantic.ts +0 -16
  1059. package/src/memory/graph-layers/temporal.ts +0 -16
  1060. package/src/memory/index.ts +0 -131
  1061. package/src/memory/knowledge-bank.ts +0 -1317
  1062. package/src/memory/knowledge-defrag.ts +0 -329
  1063. package/src/memory/knowledge-graph.ts +0 -361
  1064. package/src/memory/meta.ts +0 -488
  1065. package/src/memory/playbook.ts +0 -676
  1066. package/src/memory/reasoning-bank.ts +0 -458
  1067. package/src/memory/reflexion.ts +0 -122
  1068. package/src/memory/search-provider.ts +0 -35
  1069. package/src/memory/search-providers/index.ts +0 -3
  1070. package/src/memory/search-providers/minimem.ts +0 -84
  1071. package/src/memory/search-providers/text-similarity.ts +0 -35
  1072. package/src/memory/skill-exporter.ts +0 -357
  1073. package/src/memory/source-resolver.ts +0 -422
  1074. package/src/memory/system.ts +0 -620
  1075. package/src/memory/team-experience.ts +0 -604
  1076. package/src/memory/temporal-compressor.ts +0 -409
  1077. package/src/persistence/index.ts +0 -37
  1078. package/src/persistence/migrator.ts +0 -298
  1079. package/src/persistence/serializers.ts +0 -79
  1080. package/src/persistence/sqlite-persistence.ts +0 -925
  1081. package/src/runtime/backends/acp-protocol.ts +0 -231
  1082. package/src/runtime/backends/acp.ts +0 -239
  1083. package/src/runtime/backends/index.ts +0 -38
  1084. package/src/runtime/backends/macro-agent.ts +0 -177
  1085. package/src/runtime/backends/mock.ts +0 -218
  1086. package/src/runtime/backends/subprocess.ts +0 -356
  1087. package/src/runtime/compute-provider.ts +0 -206
  1088. package/src/runtime/flows/learning.ts +0 -166
  1089. package/src/runtime/flows/validation.ts +0 -381
  1090. package/src/runtime/index.ts +0 -75
  1091. package/src/runtime/manager.ts +0 -685
  1092. package/src/runtime/types.ts +0 -198
  1093. package/src/search/evaluator.ts +0 -499
  1094. package/src/search/index.ts +0 -78
  1095. package/src/search/moe-gate.ts +0 -304
  1096. package/src/search/refinement-loop.ts +0 -457
  1097. package/src/search/refinement-types.ts +0 -159
  1098. package/src/search/router.ts +0 -368
  1099. package/src/search/solver.ts +0 -303
  1100. package/src/search/team-router.ts +0 -459
  1101. package/src/search/verification-runner.ts +0 -570
  1102. package/src/session-bank/git-reader.ts +0 -200
  1103. package/src/session-bank/index.ts +0 -26
  1104. package/src/session-bank/parser.ts +0 -548
  1105. package/src/session-bank/session-bank.ts +0 -485
  1106. package/src/session-bank/types.ts +0 -176
  1107. package/src/surfacing/index.ts +0 -29
  1108. package/src/surfacing/publisher.ts +0 -23
  1109. package/src/surfacing/skill-library.ts +0 -625
  1110. package/src/surfacing/skill-publisher.ts +0 -257
  1111. package/src/surfacing/sqlite-storage-adapter.ts +0 -285
  1112. package/src/surfacing/team-skill-library.ts +0 -610
  1113. package/src/types/config.ts +0 -661
  1114. package/src/types/dataclaw.ts +0 -99
  1115. package/src/types/huggingface-transformers.d.ts +0 -12
  1116. package/src/types/index.ts +0 -293
  1117. package/src/types/knowledge-graph.ts +0 -246
  1118. package/src/types/knowledge.ts +0 -388
  1119. package/src/types/memory.ts +0 -300
  1120. package/src/types/meta.ts +0 -218
  1121. package/src/types/outcome.ts +0 -66
  1122. package/src/types/playbook.ts +0 -215
  1123. package/src/types/step.ts +0 -40
  1124. package/src/types/task.ts +0 -52
  1125. package/src/types/team-meta.ts +0 -212
  1126. package/src/types/team-playbook.ts +0 -384
  1127. package/src/types/team-trajectory.ts +0 -673
  1128. package/src/types/trajectory-source.ts +0 -47
  1129. package/src/types/trajectory.ts +0 -80
  1130. package/src/utils/error-classifier.ts +0 -113
  1131. package/src/utils/frontmatter.ts +0 -118
  1132. package/src/utils/index.ts +0 -63
  1133. package/src/utils/partitioned-store.ts +0 -299
  1134. package/src/utils/similarity.ts +0 -139
  1135. package/src/utils/storage.ts +0 -249
  1136. package/src/utils/trajectory-helpers.ts +0 -79
  1137. package/src/utils/validation.ts +0 -286
  1138. package/src/workspace/efficacy-toolkit.ts +0 -496
  1139. package/src/workspace/index.ts +0 -77
  1140. package/src/workspace/runner.ts +0 -281
  1141. package/src/workspace/skill-converter.ts +0 -288
  1142. package/src/workspace/templates/index.ts +0 -95
  1143. package/src/workspace/templates/knowledge-defrag.ts +0 -223
  1144. package/src/workspace/templates/knowledge-extraction.ts +0 -337
  1145. package/src/workspace/templates/meta-reflection.ts +0 -208
  1146. package/src/workspace/templates/playbook-decay-detection.ts +0 -272
  1147. package/src/workspace/templates/playbook-efficacy-audit.ts +0 -246
  1148. package/src/workspace/templates/playbook-extraction.ts +0 -240
  1149. package/src/workspace/templates/playbook-lifecycle-review.ts +0 -274
  1150. package/src/workspace/templates/refinement-analysis.ts +0 -162
  1151. package/src/workspace/templates/skill-enrichment.ts +0 -275
  1152. package/src/workspace/templates/solution-evaluation.ts +0 -199
  1153. package/src/workspace/templates/team-playbook-extraction.ts +0 -631
  1154. package/src/workspace/templates/team-trajectory-analysis.ts +0 -564
  1155. package/src/workspace/templates/trajectory-analysis.ts +0 -234
  1156. package/src/workspace/templates/usage-inference.ts +0 -163
  1157. package/src/workspace/types.ts +0 -185
  1158. package/tests/atlas-knowledge.test.ts +0 -165
  1159. package/tests/embeddings/bm25.test.ts +0 -130
  1160. package/tests/embeddings/inverted-index.test.ts +0 -138
  1161. package/tests/embeddings/manager.test.ts +0 -205
  1162. package/tests/feature-toggles.test.ts +0 -275
  1163. package/tests/fixtures/behavioral-trajectories.ts +0 -210
  1164. package/tests/gap-fixes.test.ts +0 -1116
  1165. package/tests/integration/atlas.test.ts +0 -266
  1166. package/tests/integration/cli-e2e.test.ts +0 -621
  1167. package/tests/integration/curated-sources-e2e.test.ts +0 -502
  1168. package/tests/integration/dataclaw-e2e.test.ts +0 -559
  1169. package/tests/integration/e2e.test.ts +0 -1337
  1170. package/tests/integration/entire-e2e.test.ts +0 -376
  1171. package/tests/integration/huggingface-e2e.test.ts +0 -627
  1172. package/tests/integration/persistence-e2e.test.ts +0 -741
  1173. package/tests/integration/phase-e2e.test.ts +0 -1143
  1174. package/tests/integration/pipeline-data-correctness.test.ts +0 -794
  1175. package/tests/integration/session-bank.test.ts +0 -231
  1176. package/tests/integration/sessionlog-e2e.test.ts +0 -329
  1177. package/tests/integration/skill-tree-wiring.test.ts +0 -152
  1178. package/tests/integration/unified-pipeline-e2e.test.ts +0 -634
  1179. package/tests/learning/analyzer.test.ts +0 -426
  1180. package/tests/learning/dataclaw-trajectory-source.test.ts +0 -642
  1181. package/tests/learning/effectiveness.test.ts +0 -542
  1182. package/tests/learning/energy-evaluator.test.ts +0 -180
  1183. package/tests/learning/entire-trajectory-source.test.ts +0 -380
  1184. package/tests/learning/healing-orchestrator.test.ts +0 -269
  1185. package/tests/learning/huggingface-trajectory-source.test.ts +0 -817
  1186. package/tests/learning/instant-loop.test.ts +0 -243
  1187. package/tests/learning/knowledge-extractor.test.ts +0 -491
  1188. package/tests/learning/maintenance-scheduler.test.ts +0 -191
  1189. package/tests/learning/meta-learner.test.ts +0 -418
  1190. package/tests/learning/pipeline-memory-updates.test.ts +0 -721
  1191. package/tests/learning/playbook-extractor-provenance.test.ts +0 -114
  1192. package/tests/learning/reflexion-generator.test.ts +0 -411
  1193. package/tests/learning/team-ingester.test.ts +0 -349
  1194. package/tests/learning/team-meta-learner.test.ts +0 -618
  1195. package/tests/learning/team-pipeline.test.ts +0 -334
  1196. package/tests/learning/trajectory-sources.test.ts +0 -320
  1197. package/tests/learning/unified-pipeline-efficacy.test.ts +0 -232
  1198. package/tests/learning/unified-pipeline.test.ts +0 -322
  1199. package/tests/learning/usage-inference.test.ts +0 -254
  1200. package/tests/mcp/playbook-server.test.ts +0 -257
  1201. package/tests/memory/candidate-retrieval.test.ts +0 -167
  1202. package/tests/memory/causal-store.test.ts +0 -276
  1203. package/tests/memory/coherence.test.ts +0 -232
  1204. package/tests/memory/compound-engineering-seed.test.ts +0 -338
  1205. package/tests/memory/curated-loader-extended.test.ts +0 -225
  1206. package/tests/memory/experience.test.ts +0 -203
  1207. package/tests/memory/graph-layers/semantic.test.ts +0 -219
  1208. package/tests/memory/knowledge-bank-extraction.test.ts +0 -558
  1209. package/tests/memory/knowledge-bank.test.ts +0 -705
  1210. package/tests/memory/knowledge-defrag.test.ts +0 -366
  1211. package/tests/memory/knowledge-evolution.test.ts +0 -563
  1212. package/tests/memory/knowledge-graph.test.ts +0 -492
  1213. package/tests/memory/knowledge-inbox.test.ts +0 -258
  1214. package/tests/memory/knowledge-minimem.test.ts +0 -251
  1215. package/tests/memory/meta.test.ts +0 -399
  1216. package/tests/memory/playbook-quality-validation.test.ts +0 -430
  1217. package/tests/memory/playbook.test.ts +0 -644
  1218. package/tests/memory/provenance.test.ts +0 -648
  1219. package/tests/memory/reasoning-bank.test.ts +0 -239
  1220. package/tests/memory/reflexion.test.ts +0 -166
  1221. package/tests/memory/skill-exporter.test.ts +0 -475
  1222. package/tests/memory/source-resolver.test.ts +0 -700
  1223. package/tests/memory/system.test.ts +0 -330
  1224. package/tests/memory/team-experience.test.ts +0 -411
  1225. package/tests/memory/temporal-compressor.test.ts +0 -318
  1226. package/tests/persistence/migrator.test.ts +0 -1009
  1227. package/tests/persistence/sqlite-persistence.test.ts +0 -635
  1228. package/tests/runtime/agent-manager.test.ts +0 -517
  1229. package/tests/runtime/compute-provider.test.ts +0 -288
  1230. package/tests/runtime/delegate.test.ts +0 -354
  1231. package/tests/runtime/macro-agent-backend.test.ts +0 -266
  1232. package/tests/runtime/mock-backend.test.ts +0 -248
  1233. package/tests/search/evaluator.test.ts +0 -257
  1234. package/tests/search/moe-gate.test.ts +0 -250
  1235. package/tests/search/refinement-loop.test.ts +0 -477
  1236. package/tests/search/refinement.test.ts +0 -267
  1237. package/tests/search/router.test.ts +0 -506
  1238. package/tests/search/team-router.test.ts +0 -376
  1239. package/tests/search/verification-runner.test.ts +0 -357
  1240. package/tests/session-bank/fixtures/multi-tool-session/full.jsonl +0 -12
  1241. package/tests/session-bank/fixtures/multi-tool-session/metadata.json +0 -28
  1242. package/tests/session-bank/fixtures/root-metadata.json +0 -18
  1243. package/tests/session-bank/fixtures/sessionlog-root-metadata.json +0 -16
  1244. package/tests/session-bank/fixtures/sessionlog-session/full.jsonl +0 -6
  1245. package/tests/session-bank/fixtures/sessionlog-session/metadata.json +0 -55
  1246. package/tests/session-bank/fixtures/simple-session/full.jsonl +0 -6
  1247. package/tests/session-bank/fixtures/simple-session/metadata.json +0 -38
  1248. package/tests/session-bank/git-reader.test.ts +0 -232
  1249. package/tests/session-bank/parser.test.ts +0 -453
  1250. package/tests/session-bank/session-bank.test.ts +0 -546
  1251. package/tests/surfacing/skill-library.test.ts +0 -297
  1252. package/tests/surfacing/skill-publisher.test.ts +0 -437
  1253. package/tests/surfacing/sqlite-storage-adapter.test.ts +0 -206
  1254. package/tests/surfacing/team-skill-library.test.ts +0 -444
  1255. package/tests/types/outcome.test.ts +0 -147
  1256. package/tests/types/step.test.ts +0 -133
  1257. package/tests/types/task.test.ts +0 -158
  1258. package/tests/types/team-meta.test.ts +0 -147
  1259. package/tests/types/team-playbook.test.ts +0 -246
  1260. package/tests/types/team-trajectory.test.ts +0 -557
  1261. package/tests/types/trajectory.test.ts +0 -253
  1262. package/tests/utils/error-classifier.test.ts +0 -149
  1263. package/tests/utils/frontmatter.test.ts +0 -208
  1264. package/tests/utils/partitioned-store.test.ts +0 -230
  1265. package/tests/utils/similarity.test.ts +0 -188
  1266. package/tests/utils/trajectory-helpers.test.ts +0 -163
  1267. package/tests/utils/validation.test.ts +0 -252
  1268. package/tests/workspace/efficacy-toolkit.test.ts +0 -404
  1269. package/tests/workspace/full-flow.test.ts +0 -845
  1270. package/tests/workspace/manager.test.ts +0 -215
  1271. package/tests/workspace/runner.test.ts +0 -336
  1272. package/tests/workspace/skill-converter.test.ts +0 -205
  1273. package/tests/workspace/templates/knowledge-extraction.test.ts +0 -235
  1274. package/tests/workspace/templates/playbook-efficacy.test.ts +0 -377
  1275. package/tests/workspace/templates/team-playbook-extraction.test.ts +0 -341
  1276. package/tests/workspace/templates/team-trajectory-analysis.test.ts +0 -417
  1277. package/tsconfig.json +0 -25
  1278. package/vitest.config.ts +0 -22
@@ -11,37 +11,49 @@
11
11
  * Stores experience, bumps playbooks, extracts lightweight knowledge,
12
12
  * causal edges, and reflexion episodes.
13
13
  *
14
- * 2. **Batch** (cold pipeline): Triggered by energy-threshold evaluation
15
- * (not just count). Runs full analysis, playbook extraction, temporal
14
+ * 2. **Batch** (cold pipeline): Drained from the durable dream queue via
15
+ * `dream()`. Runs full analysis, playbook extraction, temporal
16
16
  * compression, and experience clustering.
17
17
  *
18
18
  * 3. **Maintenance** (circadian-gated): Runs periodically or after N batches.
19
- * Knowledge defrag, healing orchestrator, meta-strategy generation,
20
- * effectiveness reporting.
19
+ * Knowledge defrag, meta-strategy generation, effectiveness reporting.
21
20
  *
22
21
  * The pipeline owns all components and coordinates them. Atlas delegates
23
22
  * learning to this pipeline rather than managing components directly.
24
23
  */
24
+ import { randomUUID } from 'node:crypto';
25
+ import { logger } from '../utils/logger.js';
26
+ import { AgenticTaskOutputError, AgenticTaskRunError } from '../workspace/types.js';
25
27
  // Immediate-phase components
26
28
  import { InstantLoop } from './instant-loop.js';
27
29
  // Batch-phase components
28
- import { createAnalyzer, } from './analyzer.js';
30
+ import { createAnalyzer } from './analyzer.js';
29
31
  import { createPlaybookExtractor, } from './playbook-extractor.js';
30
32
  import { KnowledgeExtractor } from './knowledge-extractor.js';
33
+ import { taskSignature } from '../utils/task-signature.js';
34
+ import { deriveObjectives } from '../utils/objectives.js';
35
+ import { canonicalizeSolver } from '../utils/solver-canonicalizer.js';
36
+ import { MergeProposer } from './merge-proposer.js';
37
+ import { MutationGate } from './mutation-gate.js';
38
+ import { ReflectiveMutationProposer } from './reflective-proposer.js';
39
+ import { createMechanismTraceEvent, noopMechanismTraceCollector, } from './mechanism-trace.js';
40
+ import { createTrajectoryDistiller } from './distiller.js';
41
+ import { readOracleSignal, oracleVerifierText } from './oracle-signal.js';
31
42
  import { TemporalCompressor } from '../memory/temporal-compressor.js';
32
- import { ReasoningBank } from '../memory/reasoning-bank.js';
33
43
  import { trajectoryAnalysisTemplate } from '../workspace/templates/trajectory-analysis.js';
34
44
  import { playbookExtractionTemplate } from '../workspace/templates/playbook-extraction.js';
35
45
  // Efficacy templates (used in maintenance tasks)
36
- import { playbookDecayDetectionTemplate } from '../workspace/templates/playbook-decay-detection.js';
46
+ import { playbookDecayDetectionTemplate, } from '../workspace/templates/playbook-decay-detection.js';
37
47
  import { playbookEfficacyAuditTemplate } from '../workspace/templates/playbook-efficacy-audit.js';
38
48
  import { playbookLifecycleReviewTemplate } from '../workspace/templates/playbook-lifecycle-review.js';
39
- // Energy evaluator (batch trigger)
40
- import { EnergyEvaluator, } from './energy-evaluator.js';
41
49
  // Maintenance scheduler
42
50
  import { MaintenanceScheduler, } from './maintenance-scheduler.js';
43
- // Healing orchestrator
44
- import { HealingOrchestrator, PlaybookDriftDetector, MemoryBloatDetector, } from './healing-orchestrator.js';
51
+ const DEFAULT_PIPELINE_DREAM_CONFIG = {
52
+ maxRowsPerDream: 200,
53
+ maxBatchesPerDream: 50,
54
+ leaseTtlMs: 900_000,
55
+ maxAttempts: 3,
56
+ };
45
57
  const DEFAULT_EFFICACY_CONFIG = {
46
58
  lifecycleReviewFrequency: 3,
47
59
  minPlaybooks: 1,
@@ -51,14 +63,52 @@ const DEFAULT_UNIFIED_CONFIG = {
51
63
  instant: {},
52
64
  batch: {
53
65
  learning: {},
54
- energy: {},
55
66
  },
56
67
  maintenance: {},
57
68
  metaLearner: {},
58
69
  features: {},
59
70
  efficacy: DEFAULT_EFFICACY_CONFIG,
71
+ dream: {},
60
72
  maxInstantLatencyMs: 200,
73
+ validation: undefined,
61
74
  };
75
+ /** Compute the Tier-0 quality signal from a batch of emitted playbooks. Pure. */
76
+ export function computeExtractionTier0(playbooks, trajectoryCount) {
77
+ const n = playbooks.length;
78
+ const frac = (pred) => n > 0 ? playbooks.filter(pred).length / n : 0;
79
+ return {
80
+ yieldPerTrajectory: trajectoryCount > 0 ? n / trajectoryCount : 0,
81
+ unconditionedRate: frac((p) => p.applicability.antiPatterns.length === 0),
82
+ triggerCoverage: frac((p) => p.applicability.triggers.length > 0),
83
+ situationCoverage: frac((p) => p.applicability.situations.length > 0),
84
+ meanConfidence: n > 0 ? playbooks.reduce((s, p) => s + p.confidence, 0) / n : 0,
85
+ };
86
+ }
87
+ function emptyMutationTaskStats() {
88
+ return {
89
+ runs: 0,
90
+ skipped: 0,
91
+ proposalsConsidered: 0,
92
+ proposalsAccepted: 0,
93
+ proposalsRejected: 0,
94
+ reasonCounts: {},
95
+ };
96
+ }
97
+ /** Truncate `text` to `max` chars, appending an ellipsis when clipped. */
98
+ function truncate(text, max) {
99
+ return text.length > max ? text.slice(0, max) + '…' : text;
100
+ }
101
+ /**
102
+ * Compact one-line rendering of a playbook's guidance (strategy + tactics),
103
+ * truncated — used for the mutation trace's before/after diff and the journal
104
+ * entry. Returns undefined for a missing playbook.
105
+ */
106
+ function compactGuidanceText(pb, max = 400) {
107
+ if (!pb)
108
+ return undefined;
109
+ const parts = [pb.guidance.strategy, ...(pb.guidance.tactics ?? [])].filter((p) => typeof p === 'string' && p.trim().length > 0);
110
+ return truncate(parts.join(' | '), max);
111
+ }
62
112
  // =========================================================================
63
113
  // Unified Pipeline
64
114
  // =========================================================================
@@ -75,57 +125,102 @@ export class UnifiedLearningPipeline {
75
125
  // Batch-phase components
76
126
  analyzer;
77
127
  playbookExtractor;
128
+ /** PR-D1: LLM-backed distiller; null when no LLM provider is wired. */
129
+ distiller = null;
78
130
  knowledgeExtractor;
79
131
  temporalCompressor;
80
- reasoningBank;
81
132
  // Meta-learning and effectiveness
82
133
  metaLearner = null;
83
134
  effectivenessTracker = null;
84
135
  // Orchestration
85
- energyEvaluator;
86
136
  maintenanceScheduler;
87
- healingOrchestrator;
88
137
  // State
89
138
  memory;
139
+ persistence;
140
+ judge;
141
+ llm;
90
142
  taskRunner = null;
91
- accumulated = [];
92
- accumulatedAnalyses = [];
143
+ /**
144
+ * G2: tracks whether the "LLM extractor requested but no backend wired"
145
+ * warning has already fired this run, so we warn loudly but only once.
146
+ */
147
+ warnedHeuristicFallback = false;
93
148
  totalProcessed = 0;
94
149
  batchCyclesRun = 0;
95
150
  maintenanceCyclesRun = 0;
151
+ mutationActivity = {
152
+ maintenanceCyclesRun: 0,
153
+ reflective: emptyMutationTaskStats(),
154
+ merge: emptyMutationTaskStats(),
155
+ };
96
156
  _onLatencyWarning = null;
157
+ diagnosticsCollector = null;
158
+ /**
159
+ * Sink for per-mutation-decision mechanism traces. Defaults to a no-op;
160
+ * callers (e.g. the eval runner) inject one via
161
+ * {@link setMechanismTraceCollector} to make the GEPA-style mutation loop
162
+ * observable (every considered proposal → one `mutation` trace event).
163
+ */
164
+ mechanismTraceCollector = noopMechanismTraceCollector;
165
+ lastPlaybookExtractionDiagnostics = null;
97
166
  lastDecayResult = null;
98
- constructor(memory, config, persistence) {
167
+ dreamConfig;
168
+ /** In-process guard so two dreams can't run concurrently in one process. */
169
+ dreaming = false;
170
+ constructor(memory, config, persistence,
171
+ /**
172
+ * Optional replay judge. Required only when `features.mergeProposing`
173
+ * is enabled — otherwise the merge maintenance task no-ops with a
174
+ * `skipped` result.
175
+ */
176
+ judge,
177
+ /**
178
+ * Optional LLM provider. Required only when `features.reflectiveMutation`
179
+ * is enabled — the reflective proposer uses it to revise playbook
180
+ * guidance. The reflective maintenance task no-ops with a `skipped`
181
+ * result when it (or the judge) is absent.
182
+ */
183
+ llm) {
99
184
  this.config = {
100
185
  ...DEFAULT_UNIFIED_CONFIG,
101
186
  ...config,
102
187
  instant: { ...DEFAULT_UNIFIED_CONFIG.instant, ...config?.instant },
103
188
  batch: {
104
189
  learning: { ...DEFAULT_UNIFIED_CONFIG.batch.learning, ...config?.batch?.learning },
105
- energy: { ...DEFAULT_UNIFIED_CONFIG.batch.energy, ...config?.batch?.energy },
106
190
  },
107
191
  maintenance: { ...DEFAULT_UNIFIED_CONFIG.maintenance, ...config?.maintenance },
108
192
  metaLearner: { ...DEFAULT_UNIFIED_CONFIG.metaLearner, ...config?.metaLearner },
109
193
  features: { ...DEFAULT_UNIFIED_CONFIG.features, ...config?.features },
110
194
  efficacy: { ...DEFAULT_EFFICACY_CONFIG, ...config?.efficacy },
195
+ dream: { ...DEFAULT_UNIFIED_CONFIG.dream, ...config?.dream },
196
+ validation: config?.validation,
111
197
  };
112
198
  this.memory = memory;
199
+ this.persistence = persistence;
200
+ this.judge = judge;
201
+ this.llm = llm;
202
+ this.dreamConfig = { ...DEFAULT_PIPELINE_DREAM_CONFIG, ...this.config.dream };
113
203
  // Resolve learning config with defaults
114
204
  const lc = this.config.batch.learning;
115
205
  this.learningConfig = {
116
206
  creditStrategy: lc.creditStrategy ?? 'simple',
117
207
  patternExtractor: lc.patternExtractor ?? 'llm',
208
+ strictExtraction: lc.strictExtraction ?? false,
118
209
  minTrajectories: lc.minTrajectories ?? 10,
119
210
  minHoursSinceLast: lc.minHoursSinceLast,
120
211
  minSuccessRate: lc.minSuccessRate,
121
212
  deduplicationThreshold: lc.deduplicationThreshold ?? 0.9,
122
213
  maxExperiences: lc.maxExperiences ?? 1000,
214
+ additiveMergeThreshold: lc.additiveMergeThreshold ?? 0.55,
123
215
  };
124
216
  // Immediate phase
125
217
  this.instantLoop = new InstantLoop(memory, {
126
218
  ...this.config.instant,
127
219
  enableReflexion: this.config.features.reflexion ?? true,
128
- enableCausalExtraction: this.config.features.causalExtraction ?? true,
220
+ // Decoupled learning trims the hot path: knowledge and reflexion are
221
+ // replayed in the dream instead of on capture.
222
+ deferAnalytics: true,
223
+ validation: this.config.validation,
129
224
  });
130
225
  // Batch phase
131
226
  this.analyzer = createAnalyzer(this.learningConfig.creditStrategy);
@@ -134,27 +229,14 @@ export class UnifiedLearningPipeline {
134
229
  mergeThreshold: this.learningConfig.deduplicationThreshold,
135
230
  minSuccessRate: this.learningConfig.minSuccessRate ?? 0.6,
136
231
  });
137
- this.knowledgeExtractor = (this.config.features.knowledgeExtraction ?? true)
138
- ? new KnowledgeExtractor()
139
- : null;
140
- this.temporalCompressor = (this.config.features.temporalCompression ?? true)
141
- ? new TemporalCompressor(undefined, persistence)
142
- : null;
143
- this.reasoningBank = (this.config.features.reasoningBank ?? true)
144
- ? new ReasoningBank(undefined, persistence)
145
- : null;
232
+ this.knowledgeExtractor =
233
+ (this.config.features.knowledgeExtraction ?? true) ? new KnowledgeExtractor() : null;
234
+ this.temporalCompressor =
235
+ (this.config.features.temporalCompression ?? true)
236
+ ? new TemporalCompressor(undefined, persistence)
237
+ : null;
146
238
  // Orchestration
147
- this.energyEvaluator = new EnergyEvaluator({
148
- countThreshold: this.learningConfig.minTrajectories,
149
- ...this.config.batch.energy,
150
- });
151
239
  this.maintenanceScheduler = new MaintenanceScheduler(this.config.maintenance);
152
- this.healingOrchestrator = new HealingOrchestrator();
153
- // Register built-in healing detectors if healing feature is enabled
154
- if (this.config.features.healing ?? true) {
155
- this.healingOrchestrator.addDetector(new PlaybookDriftDetector());
156
- this.healingOrchestrator.addDetector(new MemoryBloatDetector(this.learningConfig.maxExperiences));
157
- }
158
240
  // Register built-in maintenance tasks
159
241
  this.registerBuiltInMaintenanceTasks();
160
242
  }
@@ -164,21 +246,11 @@ export class UnifiedLearningPipeline {
164
246
  */
165
247
  loadPersistedState() {
166
248
  this.temporalCompressor?.loadPersistedState();
167
- this.reasoningBank?.loadPersistedState();
168
249
  }
169
250
  /**
170
251
  * Initialize components that require async setup.
171
252
  */
172
253
  async init() {
173
- // Seed known domains from existing playbooks for energy evaluator
174
- const allPlaybooks = await this.memory.playbooks.getAll();
175
- const domains = new Set();
176
- for (const pb of allPlaybooks) {
177
- for (const d of pb.applicability.domains) {
178
- domains.add(d);
179
- }
180
- }
181
- this.energyEvaluator.seedKnownDomains([...domains]);
182
254
  // Initialize meta-learner if enabled and meta memory available
183
255
  if ((this.config.features.metaLearning ?? true) && this.memory.meta) {
184
256
  const { createMetaLearner: createML } = await import('./meta-learner.js');
@@ -197,19 +269,126 @@ export class UnifiedLearningPipeline {
197
269
  setTaskRunner(runner) {
198
270
  this.taskRunner = runner;
199
271
  }
272
+ setDiagnosticsCollector(collector) {
273
+ this.diagnosticsCollector = collector;
274
+ }
275
+ /**
276
+ * Inject a sink for per-mutation-decision mechanism traces. Pass `null`
277
+ * to reset to the no-op collector. Emitted for EVERY considered mutation
278
+ * proposal (accepted / rejected / regression / sparse- or empty-minibatch
279
+ * auto-accept), so a fired — or suppressed — mutation is recoverable.
280
+ */
281
+ setMechanismTraceCollector(collector) {
282
+ this.mechanismTraceCollector = collector ?? noopMechanismTraceCollector;
283
+ }
284
+ /**
285
+ * Late-bind the LLM provider used by LLM-backed maintenance tasks
286
+ * (reflective mutation) and, optionally, the ReplayJudge used to gate
287
+ * mutations and merges.
288
+ *
289
+ * The maintenance-task closures read `this.llm` / `this.judge` at
290
+ * execution time, so this can be called any time after construction —
291
+ * e.g. when Atlas receives a provider via `setLearningProvider`,
292
+ * which happens after the pipeline is built.
293
+ *
294
+ * Without a judge, the merge and reflective-mutation tasks no-op (they
295
+ * have no way to gate candidates); callers that enable those features
296
+ * should pass one.
297
+ */
298
+ setLearningLLM(llm, judge) {
299
+ this.llm = llm;
300
+ if (judge)
301
+ this.judge = judge;
302
+ // PR-D1: build/replace the distiller whenever the LLM provider is (re)wired.
303
+ this.distiller = createTrajectoryDistiller(llm, this.persistence);
304
+ }
305
+ /**
306
+ * Set (or replace) the ReplayJudge used to gate mutations and merges,
307
+ * without binding an LLM generator. Used to upgrade gating to a
308
+ * {@link LiveReplay} judge for high-stakes acceptance, or to enable merge
309
+ * proposing (which needs only a judge) on the agent-backend path where
310
+ * there's no standalone LLMProvider.
311
+ */
312
+ setJudge(judge) {
313
+ this.judge = judge;
314
+ }
315
+ /**
316
+ * Set the judge only if none is configured yet. Lets `setLearningProvider`
317
+ * install a default LLM judge without clobbering an explicitly-installed
318
+ * one (e.g. a LiveReplay judge from `enableLiveReplayGating`), regardless
319
+ * of call order.
320
+ */
321
+ setJudgeIfUnset(judge) {
322
+ if (!this.judge)
323
+ this.judge = judge;
324
+ }
325
+ validationAllowsStableMutation() {
326
+ const validation = this.config.validation;
327
+ return !validation?.enabled || validation.mutationMode === 'active';
328
+ }
329
+ validationCanWrite(channel) {
330
+ const validation = this.config.validation;
331
+ if (!validation?.enabled)
332
+ return true;
333
+ if (validation.mutationMode !== 'active')
334
+ return false;
335
+ return validation.channelMasks.write.includes(channel);
336
+ }
337
+ validationAllowsExtraction() {
338
+ const validation = this.config.validation;
339
+ if (!validation?.enabled)
340
+ return true;
341
+ if (!validation.channelMasks.maintenance.extraction)
342
+ return false;
343
+ return (this.validationCanWrite('playbook') ||
344
+ this.validationCanWrite('metaPlaybook') ||
345
+ this.validationCanWrite('knowledgeNote') ||
346
+ this.validationCanWrite('reflexion') ||
347
+ this.validationCanWrite('causal') ||
348
+ this.validationCanWrite('frontier'));
349
+ }
350
+ validationAllowsScheduling() {
351
+ const validation = this.config.validation;
352
+ return !validation?.enabled || validation.channelMasks.maintenance.scheduling;
353
+ }
354
+ noopInstantLoopResult() {
355
+ return {
356
+ experienceId: '',
357
+ matchedPlaybooks: [],
358
+ knowledgeNotesExtracted: 0,
359
+ durationMs: 0,
360
+ };
361
+ }
200
362
  // =========================================================================
201
363
  // IMMEDIATE PHASE
202
364
  // =========================================================================
203
365
  /**
204
- * Process a single trajectory through the full pipeline.
366
+ * Process a single trajectory through the immediate phase and durably enqueue
367
+ * it for offline consolidation.
205
368
  *
206
- * 1. Runs the instant loop (immediate phase)
207
- * 2. Evaluates energy to decide on batch trigger
208
- * 3. If batch triggered, runs batch + checks maintenance
369
+ * Learning is always decoupled: the instant loop runs on the hot path, then
370
+ * the trajectory is enqueued on the durable dream queue. Consolidation happens
371
+ * only via `dream()` — explicitly, on a schedule, or at close.
209
372
  *
210
373
  * This is the primary entry point for trajectory processing.
211
374
  */
212
- async processTrajectory(trajectory, signals) {
375
+ async processTrajectory(trajectory,
376
+ /**
377
+ * Optional serialized routing snapshot (a `DeferredRoutingSnapshot`). When
378
+ * present, the dream replays the deferred Phase-2 processing (meta-reflection
379
+ * + effectiveness) from it. Null/absent for external trajectories with no
380
+ * routing context.
381
+ */
382
+ routingJson) {
383
+ if (!this.validationAllowsStableMutation()) {
384
+ const instantResult = this.noopInstantLoopResult();
385
+ this.totalProcessed++;
386
+ return {
387
+ instantLoop: instantResult,
388
+ batchTriggered: false,
389
+ maintenanceTriggered: false,
390
+ };
391
+ }
213
392
  // 1. Immediate phase — InstantLoop
214
393
  const instantResult = await this.instantLoop.process(trajectory);
215
394
  this.totalProcessed++;
@@ -217,90 +396,150 @@ export class UnifiedLearningPipeline {
217
396
  if (instantResult.durationMs > this.config.maxInstantLatencyMs) {
218
397
  this._onLatencyWarning?.(instantResult.durationMs);
219
398
  }
220
- // 2. Accumulate for batch
221
- let analysis;
222
- if (this.taskRunner) {
223
- analysis = await this.analyzeWithTemplate(trajectory);
224
- }
225
- else {
226
- analysis = await this.analyzer.analyze(trajectory);
399
+ // 2. Durably enqueue the trajectory for offline consolidation — the dream is
400
+ // the consumer. Non-fatal: a queue-write failure must never break the
401
+ // learning hot path.
402
+ if ((this.config.features.dreamQueue ?? true) &&
403
+ this.validationAllowsScheduling() &&
404
+ this.validationAllowsExtraction() &&
405
+ this.persistence) {
406
+ try {
407
+ this.persistence.enqueueDreamRow({
408
+ trajectoryId: trajectory.id,
409
+ trajectoryJson: JSON.stringify(trajectory),
410
+ routingJson: routingJson ?? null,
411
+ source: 'pipeline',
412
+ });
413
+ }
414
+ catch {
415
+ // Non-fatal — consolidation is best-effort; a missed enqueue just means
416
+ // this trajectory isn't dreamed over.
417
+ }
227
418
  }
228
- this.accumulated.push(trajectory);
229
- this.accumulatedAnalyses.push(analysis);
230
- // 3. Energy evaluation
231
- const energyEval = this.energyEvaluator.evaluate(trajectory, instantResult, signals);
232
- const result = {
419
+ return {
233
420
  instantLoop: instantResult,
234
- energyEval,
235
421
  batchTriggered: false,
236
422
  maintenanceTriggered: false,
237
423
  };
238
- // 4. Batch trigger
239
- if (energyEval.shouldTriggerBatch) {
240
- const batchResult = await this.runBatch(energyEval.reasons);
241
- result.batchTriggered = true;
242
- result.batchResult = batchResult;
243
- // 5. Check maintenance after batch
244
- this.maintenanceScheduler.onBatchComplete();
245
- if (this.maintenanceScheduler.shouldRunMaintenance()) {
246
- const maintenanceResult = await this.runMaintenance();
247
- result.maintenanceTriggered = true;
248
- result.maintenanceResult = maintenanceResult;
249
- }
250
- }
251
- return result;
252
424
  }
253
425
  // =========================================================================
254
426
  // BATCH PHASE
255
427
  // =========================================================================
256
428
  /**
257
- * Run batch learning on accumulated trajectories.
258
- * Can be called manually or triggered by energy evaluation.
429
+ * Run a batch over an explicit set of trajectories + analyses. The caller
430
+ * supplies the working set the durable dream_queue (via `dream`) — and this
431
+ * method never reads or mutates shared accumulation state.
259
432
  */
260
- async runBatch(triggerReasons) {
261
- if (this.accumulated.length === 0) {
433
+ async runBatchOver(trajectories, analyses, triggerReasons) {
434
+ if (trajectories.length === 0) {
262
435
  return this.emptyBatchResult(triggerReasons ?? []);
263
436
  }
264
437
  this.maintenanceScheduler.onBatchStart();
265
438
  try {
266
439
  // Extract playbooks
267
440
  let playbooksAdded = 0;
268
- const existingPlaybooks = await this.memory.playbooks.getAll();
269
- const playbookExtraction = await this.extractPlaybooks(existingPlaybooks);
270
- for (const playbook of playbookExtraction.new) {
271
- const exists = await this.memory.playbooks.exists(playbook.name, this.learningConfig.deduplicationThreshold);
272
- if (!exists) {
273
- await this.memory.playbooks.add(playbook);
274
- playbooksAdded++;
275
- }
276
- }
277
- // Apply updates to existing playbooks
278
- for (const update of playbookExtraction.updates) {
279
- if (update.refinement) {
280
- await this.memory.playbooks.addRefinement(update.id, update.refinement.context, update.refinement.addition, update.refinement.source);
281
- }
282
- if (update.newTrigger) {
283
- const playbook = await this.memory.playbooks.get(update.id);
284
- if (playbook && !playbook.applicability.triggers.includes(update.newTrigger)) {
285
- playbook.applicability.triggers.push(update.newTrigger);
441
+ let playbooksSkippedDedup = 0;
442
+ let updatesApplied = 0;
443
+ const canWritePlaybooks = this.validationCanWrite('playbook');
444
+ const canWriteFrontier = this.validationCanWrite('frontier');
445
+ const canWriteKnowledge = this.validationCanWrite('knowledgeNote');
446
+ const canWriteExperiences = this.validationCanWrite('experience');
447
+ const canWriteMetaPlaybooks = this.validationCanWrite('metaPlaybook');
448
+ if (canWritePlaybooks) {
449
+ const existingPlaybooks = await this.memory.playbooks.getAll();
450
+ const playbookExtraction = await this.extractPlaybooks(existingPlaybooks, trajectories, analyses);
451
+ for (const playbook of playbookExtraction.new) {
452
+ // ADDITIVE LEARNING (PR-D2 hook, default OFF): before minting a new
453
+ // `distilled-<uuid>`, try to REFINE a sufficiently-similar existing
454
+ // playbook so evidence COMPOUNDS onto one record instead of
455
+ // proliferating 1:1 per trajectory. The scan is over the LIVE library
456
+ // which, mid-loop, already contains playbooks added earlier in THIS
457
+ // batch so both the already-distilled-this-batch set and the
458
+ // persisted library are covered. Similarity is embeddings-optional
459
+ // and domain-gated (see PlaybookLibrary.findRefineTarget), so it works
460
+ // under the eval default of embedProvider:'none'.
461
+ //
462
+ // Over-merge tradeoff: a too-low threshold conflates distinct lessons
463
+ // into one bloated playbook; the domain-overlap hard gate + the
464
+ // `additiveMergeThreshold` floor bound that risk. See
465
+ // LearningConfig.additiveMergeThreshold.
466
+ if (this.config.features.additiveConsolidation) {
467
+ const targetId = await this.memory.playbooks.findRefineTarget(playbook, this.learningConfig.additiveMergeThreshold);
468
+ if (targetId) {
469
+ await this.applyReflexionAntiPatterns(playbook);
470
+ const refined = await this.memory.playbooks.refineWithDistilled(targetId, playbook);
471
+ updatesApplied++;
472
+ // Seed the frontier from this trajectory's experiences onto the
473
+ // refined (reused) playbook so it accrues attested evidence.
474
+ if (refined && canWriteFrontier) {
475
+ await this.seedFrontierForNewPlaybook(refined, trajectories);
476
+ }
477
+ continue;
478
+ }
479
+ }
480
+ const exists = await this.memory.playbooks.exists(playbook.name, this.learningConfig.deduplicationThreshold);
481
+ if (!exists) {
482
+ // G3: durably apply reflexion `suggestedPlaybookUpdates` (esp.
483
+ // avoid/anti-pattern rules) from the source trajectories onto the
484
+ // playbook record before persisting, so reflexion is no longer
485
+ // write-only on the cross-run path (G1 only used it ephemerally).
486
+ await this.applyReflexionAntiPatterns(playbook);
286
487
  await this.memory.playbooks.add(playbook);
488
+ playbooksAdded++;
489
+ // Seed the Pareto frontier from the source trajectories so the
490
+ // newly minted playbook starts with attested wins — otherwise
491
+ // the frontier stays empty until the playbook gets matched at
492
+ // routing time, which can take many solves.
493
+ if (canWriteFrontier) {
494
+ await this.seedFrontierForNewPlaybook(playbook, trajectories);
495
+ }
496
+ }
497
+ else {
498
+ playbooksSkippedDedup++;
287
499
  }
288
500
  }
289
- if (update.newAntiPattern) {
290
- const playbook = await this.memory.playbooks.get(update.id);
291
- if (playbook && !playbook.applicability.antiPatterns.includes(update.newAntiPattern)) {
292
- playbook.applicability.antiPatterns.push(update.newAntiPattern);
293
- await this.memory.playbooks.add(playbook);
501
+ // Apply updates to existing playbooks
502
+ for (const update of playbookExtraction.updates) {
503
+ if (update.refinement) {
504
+ await this.memory.playbooks.addRefinement(update.id, update.refinement.context, update.refinement.addition, update.refinement.source);
505
+ updatesApplied++;
506
+ }
507
+ if (update.newTrigger) {
508
+ const playbook = await this.memory.playbooks.get(update.id);
509
+ if (playbook && !playbook.applicability.triggers.includes(update.newTrigger)) {
510
+ playbook.applicability.triggers.push(update.newTrigger);
511
+ await this.memory.playbooks.add(playbook);
512
+ updatesApplied++;
513
+ }
514
+ }
515
+ if (update.newAntiPattern) {
516
+ const playbook = await this.memory.playbooks.get(update.id);
517
+ if (playbook && !playbook.applicability.antiPatterns.includes(update.newAntiPattern)) {
518
+ playbook.applicability.antiPatterns.push(update.newAntiPattern);
519
+ await this.memory.playbooks.add(playbook);
520
+ updatesApplied++;
521
+ }
294
522
  }
295
523
  }
296
524
  }
525
+ if (this.lastPlaybookExtractionDiagnostics) {
526
+ this.emitDiagnostics({
527
+ ...this.lastPlaybookExtractionDiagnostics,
528
+ storage: {
529
+ added: playbooksAdded,
530
+ skippedDedup: playbooksSkippedDedup,
531
+ updatesApplied,
532
+ },
533
+ });
534
+ this.lastPlaybookExtractionDiagnostics = null;
535
+ }
297
536
  // Knowledge extraction (batch-level, richer than instant-loop)
298
537
  let knowledgeExtracted = 0;
299
- if (this.knowledgeExtractor && this.memory.knowledgeBank) {
538
+ if (canWriteKnowledge && this.knowledgeExtractor && this.memory.knowledgeBank) {
300
539
  const existingEntities = await this.memory.knowledgeBank.listEntities();
301
540
  const context = { existingEntities };
302
- for (let i = 0; i < this.accumulated.length; i++) {
303
- const extracted = this.knowledgeExtractor.extract(this.accumulated[i], this.accumulatedAnalyses[i], context);
541
+ for (let i = 0; i < trajectories.length; i++) {
542
+ const extracted = this.knowledgeExtractor.extract(trajectories[i], analyses[i], context);
304
543
  for (const obs of extracted.observations) {
305
544
  try {
306
545
  await this.memory.knowledgeBank.addObservation(obs);
@@ -316,7 +555,7 @@ export class UnifiedLearningPipeline {
316
555
  let compressionEvicted = 0;
317
556
  let compressionPromoted = 0;
318
557
  let compressionDemoted = 0;
319
- if (this.temporalCompressor) {
558
+ if (canWriteExperiences && this.temporalCompressor) {
320
559
  const allExperiences = await this.memory.experiences.getAll();
321
560
  const compressionResult = await this.temporalCompressor.compress(allExperiences);
322
561
  for (const [id, updates] of compressionResult.updates) {
@@ -329,20 +568,17 @@ export class UnifiedLearningPipeline {
329
568
  compressionPromoted = compressionResult.promoted.length;
330
569
  compressionDemoted = compressionResult.demoted.length;
331
570
  }
332
- // Re-cluster experiences
333
- const currentExperiences = await this.memory.experiences.getAll();
334
- if (this.reasoningBank) {
335
- this.reasoningBank.buildClusters(currentExperiences);
336
- }
337
571
  // Prune experiences
338
- const pruned = await this.memory.experiences.prune({
339
- maxCount: this.learningConfig.maxExperiences,
340
- });
572
+ const pruned = canWriteExperiences
573
+ ? await this.memory.experiences.prune({
574
+ maxCount: this.learningConfig.maxExperiences,
575
+ })
576
+ : { totalPruned: 0 };
341
577
  // Calculate success rate
342
- const successCount = this.accumulatedAnalyses.filter(a => a.success).length;
343
- const successRate = successCount / this.accumulated.length;
578
+ const successCount = analyses.filter((a) => a.success).length;
579
+ const successRate = successCount / trajectories.length;
344
580
  // Meta-learning: generate strategies periodically
345
- if (this.metaLearner) {
581
+ if (canWriteMetaPlaybooks && this.metaLearner) {
346
582
  try {
347
583
  await this.metaLearner.learn();
348
584
  }
@@ -350,11 +586,7 @@ export class UnifiedLearningPipeline {
350
586
  // Non-critical
351
587
  }
352
588
  }
353
- const trajectoriesProcessed = this.accumulated.length;
354
- // Clear accumulated and reset energy evaluator
355
- this.accumulated = [];
356
- this.accumulatedAnalyses = [];
357
- this.energyEvaluator.resetAfterBatch();
589
+ const trajectoriesProcessed = trajectories.length;
358
590
  this.batchCyclesRun++;
359
591
  return {
360
592
  trajectoriesProcessed,
@@ -365,7 +597,7 @@ export class UnifiedLearningPipeline {
365
597
  demoted: compressionDemoted,
366
598
  evicted: compressionEvicted,
367
599
  },
368
- experiencesClustered: currentExperiences.length,
600
+ experiencesClustered: 0,
369
601
  knowledgeExtracted,
370
602
  successRate,
371
603
  triggerReasons: triggerReasons ?? ['manual_override'],
@@ -380,33 +612,439 @@ export class UnifiedLearningPipeline {
380
612
  // =========================================================================
381
613
  /**
382
614
  * Run a maintenance cycle.
383
- * Executes registered maintenance tasks (defrag, healing, etc.).
615
+ * Executes registered maintenance tasks (defrag, meta-strategies, etc.).
384
616
  * Can be called manually regardless of mode.
385
617
  */
386
618
  async runMaintenance(options) {
619
+ if (!this.validationAllowsStableMutation() || !this.validationAllowsScheduling()) {
620
+ return {
621
+ ran: false,
622
+ skipReason: 'validation_disabled',
623
+ taskResults: [],
624
+ totalDurationMs: 0,
625
+ timestamp: new Date(),
626
+ };
627
+ }
387
628
  const result = await this.maintenanceScheduler.runMaintenance(options);
388
629
  if (result.ran) {
389
630
  this.maintenanceCyclesRun++;
631
+ this.recordMutationActivity(result);
390
632
  }
391
633
  return result;
392
634
  }
393
635
  /**
394
- * Register a custom maintenance task.
636
+ * Fold one maintenance cycle's mutation-task results into the accumulated
637
+ * activity counters. The task closures already report per-cycle counts in
638
+ * their `details`; this aggregates them so eval harnesses (and any caller
639
+ * of `getStats()` / `getMutationActivity()`) can prove whether the
640
+ * mutation path executed across a whole run without parsing cycle logs.
395
641
  */
396
- registerMaintenanceTask(task) {
397
- this.maintenanceScheduler.registerTask(task);
642
+ recordMutationActivity(result) {
643
+ this.mutationActivity.maintenanceCyclesRun++;
644
+ const tasks = [
645
+ ['reflective-mutation', this.mutationActivity.reflective],
646
+ ['pareto-merge-proposing', this.mutationActivity.merge],
647
+ ];
648
+ for (const [taskName, stats] of tasks) {
649
+ const taskResult = result.taskResults.find((t) => t.taskName === taskName);
650
+ if (!taskResult)
651
+ continue;
652
+ stats.runs++;
653
+ const details = taskResult.details ?? {};
654
+ if (details.skipped) {
655
+ stats.skipped++;
656
+ stats.lastSkipReason = typeof details.reason === 'string' ? details.reason : 'unknown';
657
+ continue;
658
+ }
659
+ const considered = typeof details.proposalsConsidered === 'number' ? details.proposalsConsidered : 0;
660
+ const accepted = typeof details.proposalsAccepted === 'number' ? details.proposalsAccepted : 0;
661
+ stats.proposalsConsidered += considered;
662
+ stats.proposalsAccepted += accepted;
663
+ stats.proposalsRejected += Math.max(0, considered - accepted);
664
+ // Fold in the per-GateReason breakdown so reports can tell genuine
665
+ // `improved` accepts apart from sparse/empty-minibatch auto-accepts.
666
+ const reasonCounts = details.reasonCounts;
667
+ if (reasonCounts && typeof reasonCounts === 'object') {
668
+ for (const [reason, count] of Object.entries(reasonCounts)) {
669
+ if (typeof count !== 'number')
670
+ continue;
671
+ const key = reason;
672
+ stats.reasonCounts[key] = (stats.reasonCounts[key] ?? 0) + count;
673
+ }
674
+ }
675
+ }
676
+ }
677
+ /**
678
+ * Accumulated mutation/merge proposing activity across all maintenance
679
+ * cycles this pipeline has run.
680
+ */
681
+ getMutationActivity() {
682
+ return this.mutationActivity;
683
+ }
684
+ /**
685
+ * Record one mutation gate decision to BOTH observability sinks:
686
+ * 1. the injected mechanism-trace collector (a `mutation` trace event
687
+ * for every considered proposal — accepted, rejected, or auto-accept),
688
+ * 2. the durable `mutation_journal` table (learning content fed back into
689
+ * the proposer's next prompt).
690
+ *
691
+ * Best-effort: a trace/journal write must never break the maintenance loop,
692
+ * so failures are swallowed. Returns nothing.
693
+ */
694
+ recordMutationDecision(args) {
695
+ const guidanceAfter = compactGuidanceText(args.candidate);
696
+ const scoreDelta = args.childSum - args.parentSum;
697
+ try {
698
+ this.mechanismTraceCollector(createMechanismTraceEvent({
699
+ family: 'mutation',
700
+ source: `UnifiedLearningPipeline.${args.mutationType}-mutation`,
701
+ mutationType: args.mutationType,
702
+ taskSignature: args.taskSignature,
703
+ parentId: args.parentId,
704
+ secondaryParentId: args.secondaryParentId,
705
+ candidateId: args.candidate.id,
706
+ candidateName: args.candidate.name,
707
+ reason: args.reason,
708
+ accepted: args.accepted,
709
+ parentSum: args.parentSum,
710
+ childSum: args.childSum,
711
+ scoreDelta,
712
+ judgeCalls: args.judgeCalls,
713
+ guidanceBefore: args.guidanceBefore,
714
+ guidanceAfter,
715
+ rationale: args.rationale ? truncate(args.rationale, 400) : undefined,
716
+ }));
717
+ }
718
+ catch {
719
+ // best-effort trace emission must not affect the maintenance loop
720
+ }
721
+ try {
722
+ this.persistence?.recordMutationJournalEntry({
723
+ parentId: args.parentId,
724
+ taskSignature: args.taskSignature,
725
+ mutationType: args.mutationType,
726
+ candidateId: args.candidate.id,
727
+ candidateName: args.candidate.name,
728
+ guidanceAfter,
729
+ reason: args.reason,
730
+ accepted: args.accepted,
731
+ parentSum: args.parentSum,
732
+ childSum: args.childSum,
733
+ scoreDelta,
734
+ rationale: args.rationale ? truncate(args.rationale, 400) : undefined,
735
+ });
736
+ }
737
+ catch {
738
+ // best-effort journal write must not affect the maintenance loop
739
+ }
740
+ }
741
+ // =========================================================================
742
+ // DREAM PHASE (queue-sourced consolidation)
743
+ // =========================================================================
744
+ /**
745
+ * Drain the durable dream_queue and consolidate offline. Reclaims rows
746
+ * orphaned by a crashed dreamer, then repeatedly claims a batch of pending
747
+ * rows, re-derives analyses, and runs a batch over them — followed by a
748
+ * maintenance check. This is the decoupled replacement for the inline batch
749
+ * trigger; being queue-sourced it survives process restarts (and, in a later
750
+ * phase, runs from a separate process).
751
+ *
752
+ * Single-flight within a process: a concurrent call returns an empty result.
753
+ * No-op (empty result) when there is no persistence handle.
754
+ */
755
+ async dream(opts) {
756
+ const start = Date.now();
757
+ const drainAll = opts?.drainAll ?? true;
758
+ if (!this.persistence ||
759
+ this.dreaming ||
760
+ !this.validationAllowsStableMutation() ||
761
+ !this.validationAllowsScheduling() ||
762
+ !this.validationAllowsExtraction()) {
763
+ return this.emptyDreamResult(start);
764
+ }
765
+ // Cross-process single-flight: bail if another process (e.g. a `dream` CLI
766
+ // or another server) currently holds the lock. The in-process `dreaming`
767
+ // flag guards within this process; the lock guards across processes.
768
+ const owner = randomUUID();
769
+ if (!this.persistence.acquireDreamLock(owner, this.dreamConfig.leaseTtlMs)) {
770
+ return this.emptyDreamResult(start);
771
+ }
772
+ this.dreaming = true;
773
+ let rowsClaimed = 0;
774
+ let rowsCompleted = 0;
775
+ let rowsFailed = 0;
776
+ const batches = [];
777
+ try {
778
+ const { reclaimed } = this.persistence.reclaimExpiredDreamRows(this.dreamConfig.maxAttempts);
779
+ for (let b = 0; b < this.dreamConfig.maxBatchesPerDream; b++) {
780
+ // Heartbeat the cross-process lock so a long multi-batch drain doesn't
781
+ // lose it mid-flight (which would let another process start a colliding
782
+ // dream and double-process). Same-owner re-acquire refreshes the lease;
783
+ // a false return means our lease expired and someone else took over —
784
+ // yield to them.
785
+ if (!this.persistence.acquireDreamLock(owner, this.dreamConfig.leaseTtlMs)) {
786
+ break;
787
+ }
788
+ const rows = this.persistence.claimDreamRows(this.dreamConfig.maxRowsPerDream, owner, this.dreamConfig.leaseTtlMs);
789
+ if (rows.length === 0)
790
+ break;
791
+ rowsClaimed += rows.length;
792
+ try {
793
+ // Keep (row, trajectory) pairs so the per-row routing snapshot is
794
+ // available for deferred Phase-2 replay.
795
+ const pairs = [];
796
+ const corruptIds = [];
797
+ for (const row of rows) {
798
+ const traj = parseQueuedTrajectory(row.trajectory_json);
799
+ if (traj)
800
+ pairs.push({ row, traj });
801
+ else
802
+ corruptIds.push(row.id);
803
+ }
804
+ const trajectories = pairs.map((p) => p.traj);
805
+ // Idempotency sentinel (B): a trajectory already consolidated by a
806
+ // prior (failed-then-retried) dream has a reflexion episode. Skip its
807
+ // per-trajectory replay so the one non-idempotent output (knowledge
808
+ // notes) isn't re-extracted. Reflexion + meta are also idempotent by
809
+ // construction (deterministic ids), so this is belt-and-suspenders;
810
+ // the skip mainly protects knowledge. NOTE: relies on reflexion being
811
+ // enabled (the default) as the sentinel.
812
+ const freshPairs = [];
813
+ for (const p of pairs) {
814
+ let alreadyConsolidated = false;
815
+ try {
816
+ alreadyConsolidated = !!(await this.memory.reflexion.getByTrajectory(p.traj.id));
817
+ }
818
+ catch {
819
+ // Treat a lookup failure as not-consolidated (safe: at worst re-runs).
820
+ }
821
+ if (!alreadyConsolidated)
822
+ freshPairs.push(p);
823
+ }
824
+ // Replay the deferred immediate-phase analytics (knowledge / causal /
825
+ // reflexion) the trimmed hot path skipped. Only when analytics were
826
+ // actually deferred (decoupled mode) — otherwise the capture already
827
+ // ran them inline and re-running would double-count.
828
+ if (this.instantLoop.deferAnalytics) {
829
+ for (const { traj } of freshPairs) {
830
+ try {
831
+ await this.instantLoop.runAnalytics(traj);
832
+ }
833
+ catch {
834
+ // Non-fatal — analytics are best-effort; the batch still runs.
835
+ }
836
+ }
837
+ }
838
+ // Replay the deferred Phase-2 processing (meta-reflection +
839
+ // effectiveness) from each row's routing snapshot. Skip
840
+ // already-consolidated trajectories (idempotent anyway, but avoids
841
+ // redundant work).
842
+ for (const { row, traj } of freshPairs) {
843
+ await this.runDeferredPhase2(traj, row.routing_json);
844
+ }
845
+ // Re-derive analyses from the drained trajectories — the in-memory
846
+ // analyses don't survive a separate process, so recomputing here
847
+ // makes the queue the single source of truth.
848
+ const analyses = [];
849
+ for (const traj of trajectories) {
850
+ analyses.push(this.taskRunner
851
+ ? await this.analyzeWithTemplate(traj)
852
+ : await this.analyzer.analyze(traj));
853
+ }
854
+ const batch = await this.runBatchOver(trajectories, analyses, ['manual_override']);
855
+ batches.push(batch);
856
+ // Complete only successfully-parsed rows. Unparseable rows are parked
857
+ // as `failed` directly (corrupt JSON won't fix itself on retry) —
858
+ // observable via getDreamQueueStats, not silently DELETEd, and not
859
+ // requeued into an infinite re-parse loop.
860
+ this.persistence.completeDreamRows(pairs.map((p) => p.row.id));
861
+ rowsCompleted += pairs.length;
862
+ if (corruptIds.length > 0) {
863
+ this.persistence.failDreamRows(corruptIds);
864
+ rowsFailed += corruptIds.length;
865
+ }
866
+ }
867
+ catch {
868
+ // Recoverable: return the rows to pending for a later dream. The
869
+ // attempts counter (bumped on claim) eventually parks poison rows.
870
+ this.persistence.releaseDreamRows(rows.map((r) => r.id));
871
+ rowsFailed += rows.length;
872
+ break;
873
+ }
874
+ if (!drainAll)
875
+ break;
876
+ }
877
+ // Maintenance check after draining (mirrors the inline path's ordering).
878
+ let maintenance;
879
+ if (rowsCompleted > 0 && this.validationAllowsScheduling()) {
880
+ this.maintenanceScheduler.onBatchComplete();
881
+ if (this.maintenanceScheduler.shouldRunMaintenance()) {
882
+ maintenance = await this.runMaintenance();
883
+ }
884
+ }
885
+ return {
886
+ dreamedAt: new Date(),
887
+ rowsClaimed,
888
+ rowsCompleted,
889
+ rowsFailed,
890
+ reclaimed,
891
+ batch: aggregateBatchResults(batches),
892
+ maintenance,
893
+ durationMs: Date.now() - start,
894
+ };
895
+ }
896
+ finally {
897
+ this.dreaming = false;
898
+ this.persistence.releaseDreamLock(owner);
899
+ }
900
+ }
901
+ emptyDreamResult(start) {
902
+ return {
903
+ dreamedAt: new Date(),
904
+ rowsClaimed: 0,
905
+ rowsCompleted: 0,
906
+ rowsFailed: 0,
907
+ reclaimed: 0,
908
+ batch: this.emptyBatchResult(['manual_override']),
909
+ durationMs: Date.now() - start,
910
+ };
911
+ }
912
+ /**
913
+ * Replay deferred Phase-2 processing (C2) for one trajectory from its routing
914
+ * snapshot: meta-reflection (heuristic) + effectiveness annotation. Playbook
915
+ * matches are rehydrated by id from memory (current state). Best-effort —
916
+ * never fails the dream. (Usage inference stays inline in `solve()`; it is
917
+ * SkillLibrary-coupled and produces the synchronous solve result.)
918
+ */
919
+ async runDeferredPhase2(trajectory, routingJson) {
920
+ if (!routingJson) {
921
+ // External trajectory (no routing happened). Meta-reflection and strategy
922
+ // credit are genuinely inapplicable — but effectiveness annotation is
923
+ // not: detect out-of-band exposure (declared metadata / explicit skill
924
+ // references in the transcript) so production learn/dream traffic feeds
925
+ // the guided-vs-unguided scorecard instead of being invisible to it.
926
+ await this.annotateExternalTrajectory(trajectory);
927
+ return;
928
+ }
929
+ let snap;
930
+ try {
931
+ snap = JSON.parse(routingJson);
932
+ }
933
+ catch {
934
+ return;
935
+ }
936
+ // Rehydrate playbook matches by id (skip any since-deleted playbooks).
937
+ const playbookMatches = [];
938
+ for (const ref of snap.playbookMatchRefs ?? []) {
939
+ try {
940
+ const pb = await this.memory.playbooks.get(ref.id);
941
+ if (pb) {
942
+ playbookMatches.push({
943
+ playbook: pb,
944
+ score: ref.score,
945
+ matchType: ref.matchType,
946
+ });
947
+ }
948
+ }
949
+ catch {
950
+ // Skip a bad ref.
951
+ }
952
+ }
953
+ if (this.validationCanWrite('metaPlaybook') && this.metaLearner) {
954
+ try {
955
+ await this.metaLearner.generateReflection(trajectory, snap.routingInfo, playbookMatches);
956
+ }
957
+ catch {
958
+ // Non-fatal.
959
+ }
960
+ }
961
+ if (this.validationCanWrite('diagnosticOnly') && this.effectivenessTracker) {
962
+ try {
963
+ await this.effectivenessTracker.annotate(trajectory, playbookMatches, snap.surfacedExperienceIds ?? [], snap.appliedPlaybookIds ?? [], snap.surfacedKnowledgeNoteIds ?? []);
964
+ // Guided = anything was surfaced (same definition the annotation's
965
+ // totalItems uses: playbooks + experiences + knowledge notes).
966
+ this.recordLiftCell(trajectory, playbookMatches.length +
967
+ (snap.surfacedExperienceIds?.length ?? 0) +
968
+ (snap.surfacedKnowledgeNoteIds?.length ?? 0) >
969
+ 0);
970
+ }
971
+ catch {
972
+ // Non-fatal.
973
+ }
974
+ }
398
975
  }
399
976
  /**
400
- * Register a custom anomaly detector for the healing orchestrator.
977
+ * Production lift rollup: fold one annotated trajectory into its
978
+ * per-(scope, family, solver) `lift_cells` row in the instance DB.
979
+ * scope='production' (never pooled with eval scopes), family=task.domain,
980
+ * solver canonicalized from trajectory metadata. Write-only and cheap —
981
+ * one upsert, dream-time only. Best-effort: never fails the dream.
401
982
  */
402
- addAnomalyDetector(detector) {
403
- this.healingOrchestrator.addDetector(detector);
983
+ recordLiftCell(trajectory, guided) {
984
+ if (!(this.config.features.liftTracking ?? true))
985
+ return;
986
+ if (!this.persistence)
987
+ return;
988
+ try {
989
+ const rawModel = trajectory.metadata?.model;
990
+ this.persistence.recordLiftOutcome({
991
+ scope: 'production',
992
+ family: trajectory.task.domain || 'unknown',
993
+ solver: canonicalizeSolver(typeof rawModel === 'string' ? rawModel : undefined),
994
+ guided,
995
+ success: trajectory.outcome.success,
996
+ });
997
+ }
998
+ catch {
999
+ // Non-fatal.
1000
+ }
404
1001
  }
405
1002
  /**
406
- * Register a custom repair strategy for the healing orchestrator.
1003
+ * Effectiveness annotation for an external trajectory (no routing snapshot).
1004
+ *
1005
+ * Exposure is inferred rather than known: playbooks declared in trajectory
1006
+ * metadata (`SURFACED_PLAYBOOKS_METADATA_KEY`, the serving-layer contract)
1007
+ * or explicitly referenced in the steps count as surfaced; explicit
1008
+ * references count as applied; declared-only playbooks go through the same
1009
+ * tactic-level usage inference `solve()` uses. Trajectories with no detected
1010
+ * exposure are annotated unguided — they form the lift baseline.
1011
+ * Best-effort — never fails the dream.
407
1012
  */
408
- addRepairStrategy(strategy) {
409
- this.healingOrchestrator.addRepairStrategy(strategy);
1013
+ async annotateExternalTrajectory(trajectory) {
1014
+ if (!this.validationCanWrite('diagnosticOnly') || !this.effectivenessTracker)
1015
+ return;
1016
+ try {
1017
+ const { detectExternalPlaybookExposure } = await import('./external-exposure.js');
1018
+ const exposure = detectExternalPlaybookExposure(trajectory, await this.memory.playbooks.getAll());
1019
+ const appliedIds = new Set(exposure.applied.map((p) => p.id));
1020
+ // Declared-but-not-referenced playbooks: fall back to tactic-level
1021
+ // usage inference to decide whether they were actually followed.
1022
+ const declaredOnly = exposure.surfaced.filter((p) => !appliedIds.has(p.id));
1023
+ if (declaredOnly.length > 0) {
1024
+ const { createUsageInference } = await import('./usage-inference.js');
1025
+ const usage = await createUsageInference().inferUsage(trajectory, declaredOnly);
1026
+ for (const u of usage) {
1027
+ if (u.wasUsed)
1028
+ appliedIds.add(u.playbookId);
1029
+ }
1030
+ }
1031
+ const surfacedMatches = exposure.surfaced.map((playbook) => ({
1032
+ playbook,
1033
+ score: 1,
1034
+ matchType: 'situation',
1035
+ }));
1036
+ await this.effectivenessTracker.annotate(trajectory, surfacedMatches, [], [...appliedIds]);
1037
+ this.recordLiftCell(trajectory, exposure.surfaced.length > 0);
1038
+ }
1039
+ catch {
1040
+ // Non-fatal.
1041
+ }
1042
+ }
1043
+ /**
1044
+ * Register a custom maintenance task.
1045
+ */
1046
+ registerMaintenanceTask(task) {
1047
+ this.maintenanceScheduler.registerTask(task);
410
1048
  }
411
1049
  // =========================================================================
412
1050
  // ACCESSORS
@@ -423,12 +1061,6 @@ export class UnifiedLearningPipeline {
423
1061
  getEffectivenessTracker() {
424
1062
  return this.effectivenessTracker;
425
1063
  }
426
- /**
427
- * Get the energy evaluator.
428
- */
429
- getEnergyEvaluator() {
430
- return this.energyEvaluator;
431
- }
432
1064
  /**
433
1065
  * Get the maintenance scheduler.
434
1066
  */
@@ -436,25 +1068,18 @@ export class UnifiedLearningPipeline {
436
1068
  return this.maintenanceScheduler;
437
1069
  }
438
1070
  /**
439
- * Get the healing orchestrator.
440
- */
441
- getHealingOrchestrator() {
442
- return this.healingOrchestrator;
443
- }
444
- /**
445
- * Get accumulated trajectory count.
1071
+ * Get accumulated trajectory count. Always 0 — learning is decoupled, so
1072
+ * trajectories are durably enqueued for `dream()` rather than held in memory.
446
1073
  */
447
1074
  getAccumulatedCount() {
448
- return this.accumulated.length;
1075
+ return 0;
449
1076
  }
450
1077
  /**
451
- * Get accumulated trajectories with analyses (read-only).
1078
+ * Get accumulated trajectories with analyses (read-only). Always empty —
1079
+ * learning is decoupled (see {@link getAccumulatedCount}).
452
1080
  */
453
1081
  getAccumulated() {
454
- return this.accumulated.map((trajectory, i) => ({
455
- trajectory,
456
- analysis: this.accumulatedAnalyses[i],
457
- }));
1082
+ return [];
458
1083
  }
459
1084
  /**
460
1085
  * Get pipeline statistics.
@@ -464,11 +1089,9 @@ export class UnifiedLearningPipeline {
464
1089
  totalProcessed: this.totalProcessed,
465
1090
  batchCyclesRun: this.batchCyclesRun,
466
1091
  maintenanceCyclesRun: this.maintenanceCyclesRun,
467
- pendingForBatch: this.energyEvaluator.getPendingCount(),
468
1092
  batchesSinceLastMaintenance: this.maintenanceScheduler.getBatchesSinceLastMaintenance(),
469
- maintenanceTasks: this.maintenanceScheduler.getRegisteredTasks().map(t => t.name),
470
- anomalyDetectors: this.healingOrchestrator.getDetectors().map(d => d.name),
471
- repairStrategies: this.healingOrchestrator.getRepairStrategies().map(s => s.name),
1093
+ maintenanceTasks: this.maintenanceScheduler.getRegisteredTasks().map((t) => t.name),
1094
+ mutation: this.mutationActivity,
472
1095
  };
473
1096
  }
474
1097
  /**
@@ -493,26 +1116,6 @@ export class UnifiedLearningPipeline {
493
1116
  * Register built-in maintenance tasks.
494
1117
  */
495
1118
  registerBuiltInMaintenanceTasks() {
496
- // Healing cycle
497
- this.maintenanceScheduler.registerTask({
498
- name: 'healing-cycle',
499
- priority: 100,
500
- execute: async () => {
501
- const start = Date.now();
502
- const context = await this.buildHealthContext();
503
- const result = await this.healingOrchestrator.runCycle(context);
504
- return {
505
- taskName: 'healing-cycle',
506
- success: true,
507
- durationMs: Date.now() - start,
508
- details: {
509
- anomaliesDetected: result.anomaliesDetected.length,
510
- repairsAttempted: result.repairs.length,
511
- repairsSucceeded: result.repairs.filter(r => r.success).length,
512
- },
513
- };
514
- },
515
- });
516
1119
  // Knowledge defrag (if knowledge bank is available)
517
1120
  if (this.memory.knowledgeBank) {
518
1121
  this.maintenanceScheduler.registerTask({
@@ -520,6 +1123,14 @@ export class UnifiedLearningPipeline {
520
1123
  priority: 80,
521
1124
  execute: async () => {
522
1125
  const start = Date.now();
1126
+ if (!this.validationCanWrite('knowledgeNote')) {
1127
+ return {
1128
+ taskName: 'knowledge-defrag',
1129
+ success: true,
1130
+ durationMs: Date.now() - start,
1131
+ details: { skipped: true, reason: 'validation write mask excludes knowledgeNote' },
1132
+ };
1133
+ }
523
1134
  const kb = this.memory.knowledgeBank;
524
1135
  const shouldDefrag = await kb.shouldDefragment();
525
1136
  if (!shouldDefrag) {
@@ -547,6 +1158,14 @@ export class UnifiedLearningPipeline {
547
1158
  priority: 60,
548
1159
  execute: async () => {
549
1160
  const start = Date.now();
1161
+ if (!this.validationCanWrite('metaPlaybook')) {
1162
+ return {
1163
+ taskName: 'meta-strategy-generation',
1164
+ success: true,
1165
+ durationMs: Date.now() - start,
1166
+ details: { skipped: true, reason: 'validation write mask excludes metaPlaybook' },
1167
+ };
1168
+ }
550
1169
  if (!this.metaLearner) {
551
1170
  return {
552
1171
  taskName: 'meta-strategy-generation',
@@ -567,6 +1186,302 @@ export class UnifiedLearningPipeline {
567
1186
  }
568
1187
  // Efficacy maintenance tasks
569
1188
  this.registerEfficacyMaintenanceTasks();
1189
+ // Pareto merge proposing
1190
+ this.registerMergeProposingTask();
1191
+ // Reflective single-parent mutation
1192
+ this.registerReflectiveMutationTask();
1193
+ // PR-D2: harmful-playbook prune pass
1194
+ this.registerCurationPruneTask();
1195
+ }
1196
+ /**
1197
+ * Register the curation prune maintenance task (PR-D2).
1198
+ *
1199
+ * Prunes playbooks where failureCount >= successCount + MIN_EVIDENCE so
1200
+ * net-harmful guidance is retired before it degrades future injection.
1201
+ * MIN_EVIDENCE (default 3) prevents premature pruning of zero/low-count
1202
+ * items. Gated on features.curation — setting it false disables the prune
1203
+ * entirely (append-only ablation).
1204
+ */
1205
+ registerCurationPruneTask() {
1206
+ this.maintenanceScheduler.registerTask({
1207
+ name: 'curation-prune',
1208
+ priority: 50,
1209
+ execute: async () => {
1210
+ const start = Date.now();
1211
+ if (!this.validationCanWrite('playbook')) {
1212
+ return {
1213
+ taskName: 'curation-prune',
1214
+ success: true,
1215
+ durationMs: Date.now() - start,
1216
+ details: { skipped: true, reason: 'validation write mask excludes playbook' },
1217
+ };
1218
+ }
1219
+ if (!this.config.features?.curation) {
1220
+ return {
1221
+ taskName: 'curation-prune',
1222
+ success: true,
1223
+ durationMs: Date.now() - start,
1224
+ details: { skipped: true, reason: 'features.curation disabled' },
1225
+ };
1226
+ }
1227
+ const pruned = await this.memory.playbooks.pruneHarmful();
1228
+ return {
1229
+ taskName: 'curation-prune',
1230
+ success: true,
1231
+ durationMs: Date.now() - start,
1232
+ details: { pruned: pruned.length, prunedIds: pruned },
1233
+ };
1234
+ },
1235
+ });
1236
+ }
1237
+ /**
1238
+ * Register the merge-proposing maintenance task. Scans active task
1239
+ * signatures, asks the MergeProposer for candidate pairs (Pareto
1240
+ * dominators with a common ancestor), then gates each proposal via
1241
+ * MutationGate. Skips if the feature is disabled, no judge was
1242
+ * provided, or there's no persistence handle to enumerate signatures.
1243
+ */
1244
+ registerMergeProposingTask() {
1245
+ this.maintenanceScheduler.registerTask({
1246
+ name: 'pareto-merge-proposing',
1247
+ priority: 50,
1248
+ execute: async () => {
1249
+ const start = Date.now();
1250
+ if (!(this.config.features.mergeProposing ?? false)) {
1251
+ return {
1252
+ taskName: 'pareto-merge-proposing',
1253
+ success: true,
1254
+ durationMs: Date.now() - start,
1255
+ details: { skipped: true, reason: 'feature disabled' },
1256
+ };
1257
+ }
1258
+ if (!this.validationCanWrite('playbook')) {
1259
+ return {
1260
+ taskName: 'pareto-merge-proposing',
1261
+ success: true,
1262
+ durationMs: Date.now() - start,
1263
+ details: { skipped: true, reason: 'validation write mask excludes playbook' },
1264
+ };
1265
+ }
1266
+ if (!this.persistence) {
1267
+ return {
1268
+ taskName: 'pareto-merge-proposing',
1269
+ success: true,
1270
+ durationMs: Date.now() - start,
1271
+ details: { skipped: true, reason: 'no persistence handle' },
1272
+ };
1273
+ }
1274
+ if (!this.judge) {
1275
+ return {
1276
+ taskName: 'pareto-merge-proposing',
1277
+ success: true,
1278
+ durationMs: Date.now() - start,
1279
+ details: { skipped: true, reason: 'no judge configured' },
1280
+ };
1281
+ }
1282
+ const proposer = new MergeProposer(this.memory.playbooks, this.persistence);
1283
+ const gate = new MutationGate(this.memory.playbooks, this.persistence, this.judge);
1284
+ // Bound judge/LLM spend per cycle, symmetric with reflective mutation.
1285
+ const maxProposalsPerCycle = 5;
1286
+ const signatures = this.persistence.getActiveSignatures(20);
1287
+ let proposalsConsidered = 0;
1288
+ let proposalsAccepted = 0;
1289
+ const acceptedIds = [];
1290
+ const reasonCounts = {};
1291
+ outer: for (const sig of signatures) {
1292
+ const proposals = await proposer.proposePairsForSignature(sig);
1293
+ for (const proposal of proposals) {
1294
+ if (proposalsConsidered >= maxProposalsPerCycle)
1295
+ break outer;
1296
+ proposalsConsidered++;
1297
+ try {
1298
+ const primaryBefore = await this.memory.playbooks.get(proposal.primaryParentId);
1299
+ // Use the two-parent merge gate: stratified minibatch across
1300
+ // (A-beats-B, B-beats-A, tied) buckets + acceptance on
1301
+ // child >= max(parents). Matches GEPA's engine.py:688.
1302
+ const decision = await gate.proposeFromMerge(proposal.primaryParentId, proposal.secondaryParentId, proposal.merged, sig);
1303
+ reasonCounts[decision.reason] = (reasonCounts[decision.reason] ?? 0) + 1;
1304
+ // Trace + journal the merge decision. The acceptance threshold is
1305
+ // max(parents), so record that as the parent sum for the delta.
1306
+ this.recordMutationDecision({
1307
+ mutationType: 'merge',
1308
+ taskSignature: sig,
1309
+ parentId: proposal.primaryParentId,
1310
+ secondaryParentId: proposal.secondaryParentId,
1311
+ candidate: proposal.merged,
1312
+ reason: decision.reason,
1313
+ accepted: decision.accepted,
1314
+ parentSum: Math.max(decision.parentASum, decision.parentBSum),
1315
+ childSum: decision.childSum,
1316
+ judgeCalls: decision.judgeCalls,
1317
+ guidanceBefore: compactGuidanceText(primaryBefore),
1318
+ });
1319
+ // Record only definitive outcomes so transient sparse-data
1320
+ // attempts get retried next cycle when more data exists.
1321
+ if (decision.reason === 'improved' || decision.reason === 'regression') {
1322
+ this.persistence.recordMergeAttempt(proposal.primaryParentId, proposal.secondaryParentId, proposal.commonAncestorId, decision.reason === 'improved' ? 'accepted' : 'regression');
1323
+ }
1324
+ if (decision.accepted) {
1325
+ proposalsAccepted++;
1326
+ acceptedIds.push(proposal.merged.id);
1327
+ }
1328
+ }
1329
+ catch {
1330
+ // Non-fatal — one bad proposal shouldn't kill the cycle.
1331
+ }
1332
+ }
1333
+ }
1334
+ return {
1335
+ taskName: 'pareto-merge-proposing',
1336
+ success: true,
1337
+ durationMs: Date.now() - start,
1338
+ details: {
1339
+ signaturesScanned: signatures.length,
1340
+ proposalsConsidered,
1341
+ proposalsAccepted,
1342
+ acceptedIds,
1343
+ reasonCounts,
1344
+ },
1345
+ };
1346
+ },
1347
+ });
1348
+ }
1349
+ /**
1350
+ * Register the reflective-mutation maintenance task. Scans active task
1351
+ * signatures, asks the ReflectiveMutationProposer to revise one
1352
+ * Pareto-frontier playbook per signature from its failure traces, then
1353
+ * gates each candidate via the single-parent MutationGate. Skips if the
1354
+ * feature is disabled, there's no persistence handle, no judge, or no
1355
+ * LLM provider.
1356
+ *
1357
+ * Mirrors `registerMergeProposingTask` — same scan/gate shape — but uses
1358
+ * the generative single-parent path (`MutationGate.propose`) instead of
1359
+ * the recombination path (`proposeFromMerge`). A per-cycle cap bounds LLM
1360
+ * spend regardless of how many signatures are active.
1361
+ */
1362
+ registerReflectiveMutationTask() {
1363
+ this.maintenanceScheduler.registerTask({
1364
+ name: 'reflective-mutation',
1365
+ priority: 50,
1366
+ execute: async () => {
1367
+ const start = Date.now();
1368
+ if (!(this.config.features.reflectiveMutation ?? false)) {
1369
+ return {
1370
+ taskName: 'reflective-mutation',
1371
+ success: true,
1372
+ durationMs: Date.now() - start,
1373
+ details: { skipped: true, reason: 'feature disabled' },
1374
+ };
1375
+ }
1376
+ if (!this.validationCanWrite('playbook')) {
1377
+ return {
1378
+ taskName: 'reflective-mutation',
1379
+ success: true,
1380
+ durationMs: Date.now() - start,
1381
+ details: { skipped: true, reason: 'validation write mask excludes playbook' },
1382
+ };
1383
+ }
1384
+ if (!this.persistence) {
1385
+ return {
1386
+ taskName: 'reflective-mutation',
1387
+ success: true,
1388
+ durationMs: Date.now() - start,
1389
+ details: { skipped: true, reason: 'no persistence handle' },
1390
+ };
1391
+ }
1392
+ if (!this.judge) {
1393
+ return {
1394
+ taskName: 'reflective-mutation',
1395
+ success: true,
1396
+ durationMs: Date.now() - start,
1397
+ details: { skipped: true, reason: 'no judge configured' },
1398
+ };
1399
+ }
1400
+ if (!this.llm) {
1401
+ return {
1402
+ taskName: 'reflective-mutation',
1403
+ success: true,
1404
+ durationMs: Date.now() - start,
1405
+ details: { skipped: true, reason: 'no llm provider configured' },
1406
+ };
1407
+ }
1408
+ const proposer = new ReflectiveMutationProposer(this.memory.playbooks, this.persistence, this.llm);
1409
+ const gate = new MutationGate(this.memory.playbooks, this.persistence, this.judge);
1410
+ // Bound LLM spend per cycle: one proposal per signature, capped.
1411
+ const maxProposalsPerCycle = 5;
1412
+ const signatures = this.persistence.getActiveSignatures(20);
1413
+ // Don't reflect the same parent on more than one signature this
1414
+ // cycle — a parent failing across signatures would otherwise spawn
1415
+ // several near-duplicate children at once.
1416
+ const proposedParents = new Set();
1417
+ let proposalsConsidered = 0;
1418
+ let proposalsAccepted = 0;
1419
+ const acceptedIds = [];
1420
+ const reasonCounts = {};
1421
+ for (const sig of signatures) {
1422
+ if (proposalsConsidered >= maxProposalsPerCycle)
1423
+ break;
1424
+ try {
1425
+ const proposal = await proposer.propose(sig, {
1426
+ excludeParents: proposedParents,
1427
+ });
1428
+ if (!proposal)
1429
+ continue;
1430
+ proposalsConsidered++;
1431
+ proposedParents.add(proposal.parentId);
1432
+ // Capture the parent's guidance BEFORE the gate commits/mutates so
1433
+ // the trace/journal record a faithful before→after diff.
1434
+ const parentBefore = await this.memory.playbooks.get(proposal.parentId);
1435
+ const decision = await gate.propose(proposal.parentId, proposal.candidate, sig);
1436
+ reasonCounts[decision.reason] = (reasonCounts[decision.reason] ?? 0) + 1;
1437
+ // Observability + statefulness: trace every considered proposal and
1438
+ // journal its learning content (candidate direction, reason, score
1439
+ // delta, rationale) for the proposer to reflect on next cycle.
1440
+ this.recordMutationDecision({
1441
+ mutationType: 'reflective',
1442
+ taskSignature: sig,
1443
+ parentId: proposal.parentId,
1444
+ candidate: proposal.candidate,
1445
+ rationale: proposal.rationale,
1446
+ reason: decision.reason,
1447
+ accepted: decision.accepted,
1448
+ parentSum: decision.parentSum,
1449
+ childSum: decision.childSum,
1450
+ judgeCalls: decision.judgeCalls,
1451
+ guidanceBefore: compactGuidanceText(parentBefore),
1452
+ });
1453
+ // Record any committed acceptance (incl. sparse/empty-minibatch
1454
+ // accepts) and definitive regressions, so the proposer doesn't
1455
+ // re-reflect the same parent on the same failures every cycle.
1456
+ // Non-definitive rejections (empty-minibatch policy reject,
1457
+ // no-mutation, parent-missing) are NOT recorded so they retry
1458
+ // once more data exists.
1459
+ if (decision.accepted || decision.reason === 'regression') {
1460
+ this.persistence.recordReflectionAttempt(proposal.parentId, proposal.failureFingerprint, decision.accepted ? 'accepted' : 'regression');
1461
+ }
1462
+ if (decision.accepted) {
1463
+ proposalsAccepted++;
1464
+ acceptedIds.push(proposal.candidate.id);
1465
+ }
1466
+ }
1467
+ catch {
1468
+ // Non-fatal — one bad proposal shouldn't kill the cycle.
1469
+ }
1470
+ }
1471
+ return {
1472
+ taskName: 'reflective-mutation',
1473
+ success: true,
1474
+ durationMs: Date.now() - start,
1475
+ details: {
1476
+ signaturesScanned: signatures.length,
1477
+ proposalsConsidered,
1478
+ proposalsAccepted,
1479
+ acceptedIds,
1480
+ reasonCounts,
1481
+ },
1482
+ };
1483
+ },
1484
+ });
570
1485
  }
571
1486
  /**
572
1487
  * Register efficacy maintenance tasks (decay detection, audit, lifecycle review).
@@ -584,7 +1499,8 @@ export class UnifiedLearningPipeline {
584
1499
  const start = Date.now();
585
1500
  this.lastDecayResult = null;
586
1501
  const { annotations, playbooks, playbookEffectiveness, unguidedSuccessRate } = await this.getEfficacyData();
587
- if (playbooks.length < efficacyCfg.minPlaybooks || annotations.length < efficacyCfg.minAnnotations) {
1502
+ if (playbooks.length < efficacyCfg.minPlaybooks ||
1503
+ annotations.length < efficacyCfg.minAnnotations) {
588
1504
  return {
589
1505
  taskName: 'playbook-decay-detection',
590
1506
  success: true,
@@ -628,10 +1544,7 @@ export class UnifiedLearningPipeline {
628
1544
  details: { skipped: true, reason: 'no decay detection results' },
629
1545
  };
630
1546
  }
631
- const flagged = [
632
- ...this.lastDecayResult.decaying,
633
- ...this.lastDecayResult.atRisk,
634
- ];
1547
+ const flagged = [...this.lastDecayResult.decaying, ...this.lastDecayResult.atRisk];
635
1548
  if (flagged.length === 0) {
636
1549
  return {
637
1550
  taskName: 'playbook-efficacy-audit',
@@ -641,8 +1554,8 @@ export class UnifiedLearningPipeline {
641
1554
  };
642
1555
  }
643
1556
  const { annotations, playbooks, playbookEffectiveness, unguidedSuccessRate } = await this.getEfficacyData();
644
- const playbookMap = new Map(playbooks.map(p => [p.id, p]));
645
- const effectivenessMap = new Map(playbookEffectiveness.map(e => [e.playbookId, e]));
1557
+ const playbookMap = new Map(playbooks.map((p) => [p.id, p]));
1558
+ const effectivenessMap = new Map(playbookEffectiveness.map((e) => [e.playbookId, e]));
646
1559
  const trajectoryDomainMap = this.buildTrajectoryDomainMap(annotations);
647
1560
  const audits = [];
648
1561
  for (const signal of flagged) {
@@ -693,7 +1606,8 @@ export class UnifiedLearningPipeline {
693
1606
  };
694
1607
  }
695
1608
  const { annotations, playbooks, playbookEffectiveness, unguidedSuccessRate } = await this.getEfficacyData();
696
- if (playbooks.length < efficacyCfg.minPlaybooks || annotations.length < efficacyCfg.minAnnotations) {
1609
+ if (playbooks.length < efficacyCfg.minPlaybooks ||
1610
+ annotations.length < efficacyCfg.minAnnotations) {
697
1611
  return {
698
1612
  taskName: 'playbook-lifecycle-review',
699
1613
  success: true,
@@ -749,41 +1663,13 @@ export class UnifiedLearningPipeline {
749
1663
  }
750
1664
  /**
751
1665
  * Build a trajectoryId→domain map from annotations.
752
- * Uses accumulated trajectories when available, otherwise infers from task annotations.
1666
+ *
1667
+ * Learning is decoupled, so there are no in-memory trajectories to map from
1668
+ * here. Annotations don't carry domain, so trajectories fall through to the
1669
+ * toolkit's 'unknown' default — acceptable for log-only mode.
753
1670
  */
754
1671
  buildTrajectoryDomainMap(_annotations) {
755
- const domainMap = new Map();
756
- // Map from accumulated trajectories (has task.domain directly).
757
- // Annotations don't carry domain, so historical trajectories will
758
- // fall through to the toolkit's 'unknown' default — acceptable for log-only mode.
759
- for (const t of this.accumulated) {
760
- domainMap.set(t.id, t.task.domain);
761
- }
762
- return domainMap;
763
- }
764
- /**
765
- * Build health context for the healing orchestrator.
766
- */
767
- async buildHealthContext() {
768
- const [experienceCount, playbookCount] = await Promise.all([
769
- this.memory.experiences.count(),
770
- this.memory.playbooks.count(),
771
- ]);
772
- // Compute recent success rate from accumulated analyses
773
- const recentAnalyses = this.accumulatedAnalyses.length > 0
774
- ? this.accumulatedAnalyses
775
- : [];
776
- const recentSuccessRate = recentAnalyses.length > 0
777
- ? recentAnalyses.filter(a => a.success).length / recentAnalyses.length
778
- : 1.0;
779
- return {
780
- trajectoriesProcessed: this.totalProcessed,
781
- experienceCount,
782
- playbookCount,
783
- recentSuccessRate,
784
- batchesSinceLastMaintenance: this.maintenanceScheduler.getBatchesSinceLastMaintenance(),
785
- metrics: {},
786
- };
1672
+ return new Map();
787
1673
  }
788
1674
  /**
789
1675
  * Analyze a trajectory via workspace template or heuristic fallback.
@@ -800,24 +1686,338 @@ export class UnifiedLearningPipeline {
800
1686
  return this.analyzer.analyze(trajectory);
801
1687
  }
802
1688
  }
1689
+ /**
1690
+ * Seed the Pareto frontier with rows attributing the source trajectories'
1691
+ * successful outcomes to the newly minted playbook. Walks
1692
+ * `playbook.evolution.createdFrom` (trajectory ids), looks up the
1693
+ * corresponding experience and trajectory, and writes a frontier row
1694
+ * (and live eval cache entry) per attested win.
1695
+ *
1696
+ * Without this, a freshly-extracted playbook starts with zero frontier
1697
+ * presence and only earns rows once the router happens to match it on
1698
+ * a live task — which can take weeks of solves before the frontier
1699
+ * starts being useful.
1700
+ */
1701
+ /**
1702
+ * G3(b): apply stored reflexion `suggestedPlaybookUpdates` to a playbook's
1703
+ * `applicability.antiPatterns`, durably (cross-run). Walks the playbook's
1704
+ * source trajectories (`evolution.createdFrom`), reads each one's reflexion
1705
+ * episode, and lifts avoid/anti-pattern-style suggestions onto the record.
1706
+ *
1707
+ * G1 already feeds the same suggestions into the per-attempt *retry prompt*
1708
+ * (ephemeral); this is the persist-to-playbook side and does not duplicate
1709
+ * that path. Mutates `playbook` in place; the caller persists it.
1710
+ */
1711
+ async applyReflexionAntiPatterns(playbook) {
1712
+ const trajectoryIds = playbook.evolution.createdFrom ?? [];
1713
+ if (trajectoryIds.length === 0)
1714
+ return;
1715
+ for (const trajId of trajectoryIds) {
1716
+ let episode;
1717
+ try {
1718
+ episode = await this.memory.reflexion.getByTrajectory(trajId);
1719
+ }
1720
+ catch {
1721
+ continue; // Reflexion lookup is best-effort.
1722
+ }
1723
+ if (!episode)
1724
+ continue;
1725
+ for (const suggestion of episode.suggestedPlaybookUpdates) {
1726
+ const antiPattern = reflexionSuggestionToAntiPattern(suggestion);
1727
+ if (antiPattern && !playbook.applicability.antiPatterns.includes(antiPattern)) {
1728
+ playbook.applicability.antiPatterns.push(antiPattern);
1729
+ }
1730
+ }
1731
+ }
1732
+ }
1733
+ async seedFrontierForNewPlaybook(playbook, batchTrajectories) {
1734
+ if (!this.validationCanWrite('frontier'))
1735
+ return;
1736
+ const trajectoryIds = playbook.evolution.createdFrom ?? [];
1737
+ if (trajectoryIds.length === 0)
1738
+ return;
1739
+ const trajById = new Map(batchTrajectories.map((t) => [t.id, t]));
1740
+ for (const trajId of trajectoryIds) {
1741
+ const traj = trajById.get(trajId);
1742
+ if (!traj)
1743
+ continue; // Trajectory not in current batch — skip.
1744
+ const experiences = this.persistence?.getExperiencesByTrajectory(trajId);
1745
+ if (!experiences || experiences.length === 0)
1746
+ continue;
1747
+ const sig = taskSignature(traj.task);
1748
+ const score = traj.outcome.success
1749
+ ? Math.max(traj.outcome.partialScore, 1.0)
1750
+ : traj.outcome.partialScore;
1751
+ // Derive multi-objective scores the same way the instant loop does
1752
+ // (cost from totalTokens, latency from wallTimeSeconds, etc.) so the
1753
+ // cartesian frontier is populated alongside the single-objective one.
1754
+ // Otherwise `prefer: 'cheap' | 'fast'` routing treats freshly-extracted
1755
+ // playbooks as invisible until live traffic accumulates.
1756
+ const objectives = deriveObjectives(traj);
1757
+ for (const expRow of experiences) {
1758
+ try {
1759
+ await this.memory.playbooks.recordLiveOutcome(playbook.id, sig, expRow.id, score, objectives);
1760
+ }
1761
+ catch {
1762
+ // Non-fatal — playbook is still added, just lacks the seed row.
1763
+ }
1764
+ }
1765
+ }
1766
+ }
803
1767
  /**
804
1768
  * Extract playbooks via workspace template or heuristic fallback.
805
1769
  */
806
- async extractPlaybooks(existingPlaybooks) {
1770
+ async extractPlaybooks(existingPlaybooks, trajectories, analyses) {
1771
+ const startTime = Date.now();
1772
+ // Routing domain(s) of this batch's trajectories — stamped onto every
1773
+ // extracted playbook so it is retrievable by the key future same-domain
1774
+ // tasks route with (see stampExtractionProvenance).
1775
+ const sourceDomains = [...new Set(trajectories.map((t) => t.task.domain).filter(Boolean))];
1776
+ const attemptedMethods = [];
1777
+ let workspaceFallbackReason;
1778
+ let workspaceDiag;
807
1779
  if (this.taskRunner) {
808
1780
  try {
1781
+ attemptedMethods.push('workspace-agent');
809
1782
  const result = await this.taskRunner.run(playbookExtractionTemplate, {
810
- trajectories: this.accumulated,
811
- analyses: this.accumulatedAnalyses,
1783
+ trajectories,
1784
+ analyses,
1785
+ existingPlaybooks,
1786
+ });
1787
+ const output = this.stampExtractionProvenance(result.output, result.method === 'agentic' ? 'workspace-agent' : 'heuristic', {
1788
+ fallbackReason: result.method === 'heuristic'
1789
+ ? 'template complexity assessed as heuristic'
1790
+ : undefined,
1791
+ template: playbookExtractionTemplate.taskType,
1792
+ templateVersion: playbookExtractionTemplate.templateVersion,
1793
+ sourceDomains,
1794
+ });
1795
+ this.recordPlaybookExtractionDiagnostics({
1796
+ trajectories,
1797
+ analyses,
1798
+ existingPlaybooks,
1799
+ attemptedMethods,
1800
+ selectedMethod: result.method === 'agentic' ? 'workspace-agent' : 'heuristic',
1801
+ extracted: output,
1802
+ durationMs: Date.now() - startTime,
1803
+ fallbackReason: result.method === 'heuristic' ? 'template complexity assessed as heuristic' : undefined,
1804
+ workspace: {
1805
+ id: result.workspaceId,
1806
+ path: result.workspacePath,
1807
+ complexity: result.complexity,
1808
+ },
1809
+ agent: {
1810
+ trajectoryId: result.agentTrajectoryId,
1811
+ totalTimeMs: result.metrics.totalTimeMs,
1812
+ tokensUsed: result.metrics.tokensUsed,
1813
+ toolCalls: result.metrics.toolCalls,
1814
+ },
1815
+ injectedMetaPlaybookIds: result.injectedMetaPlaybookIds,
1816
+ });
1817
+ return output;
1818
+ }
1819
+ catch (error) {
1820
+ if (error instanceof AgenticTaskRunError) {
1821
+ workspaceDiag = {
1822
+ id: error.workspaceId,
1823
+ path: error.workspacePath,
1824
+ complexity: error.complexity,
1825
+ elapsedMs: error.elapsedMs,
1826
+ error: error.cause.message,
1827
+ };
1828
+ }
1829
+ else if (error instanceof AgenticTaskOutputError) {
1830
+ workspaceDiag = {
1831
+ id: error.workspaceId,
1832
+ path: error.workspacePath,
1833
+ complexity: error.complexity,
1834
+ elapsedMs: error.elapsedMs,
1835
+ error: error.cause.message,
1836
+ agentState: error.agentState,
1837
+ agentResultPreview: error.agentResultPreview,
1838
+ agentMessageCount: error.agentMessageCount,
1839
+ };
1840
+ }
1841
+ workspaceFallbackReason = `workspace-agent failed: ${error instanceof Error ? error.message : String(error)}`;
1842
+ // Fall through to distiller or heuristic
1843
+ }
1844
+ }
1845
+ // PR-D1: LLM distillation path — when patternExtractor==='llm' and a
1846
+ // TrajectoryDistiller is wired, distill each trajectory individually and
1847
+ // return the results as new playbooks. Failures distill to anti-pattern-only
1848
+ // items. The heuristic PlaybookExtractor is the no-LLM fallback below.
1849
+ //
1850
+ // Design note: this runs in the batch/dream phase, never the <200ms hot
1851
+ // path. Cache in distillation_cache keyed by trajectory hash + prompt
1852
+ // version makes re-runs LLM-free.
1853
+ //
1854
+ // PR-D2 hook: near-dup check (embedding cosine > τ → merge instead of
1855
+ // append) will be added here before the return, replacing the simple
1856
+ // "add if not exists" check in runBatchOver. For now we return new items
1857
+ // as-is and let the existing deduplicationThreshold check in runBatchOver
1858
+ // handle coarse dedup by name similarity.
1859
+ const wantsDistiller = this.learningConfig.patternExtractor === 'llm' ||
1860
+ this.learningConfig.patternExtractor === 'both';
1861
+ if (wantsDistiller && this.distiller) {
1862
+ attemptedMethods.push('trajectory-distiller');
1863
+ const result = { new: [], updates: [] };
1864
+ for (let i = 0; i < trajectories.length; i++) {
1865
+ const traj = trajectories[i];
1866
+ try {
1867
+ // Thread the train-time oracle signal (verifier expected/diff/score)
1868
+ // so the distiller captures the output CONTRACT, not just process.
1869
+ // Legitimately available at dream time; never reaches the solver.
1870
+ // See docs/DESIGN-meta-learning-validation.md § "Train-time oracle
1871
+ // signal vs solve-time firewall".
1872
+ const verifierOutput = oracleVerifierText(readOracleSignal(traj.outcome.verificationDetails));
1873
+ const playbook = await this.distiller.distill(traj, traj.outcome, verifierOutput);
1874
+ if (playbook) {
1875
+ result.new.push(playbook);
1876
+ }
1877
+ }
1878
+ catch {
1879
+ // Non-fatal: skip this trajectory, heuristic fallback at the
1880
+ // trajectory level is omitted by design (distiller returns null on
1881
+ // failure; we just skip).
1882
+ }
1883
+ }
1884
+ // Return distilled results if we got any; otherwise fall through to
1885
+ // heuristic so a total LLM failure doesn't silently produce zero output.
1886
+ if (result.new.length > 0) {
1887
+ // eslint-disable-next-line no-console
1888
+ logger.error(`[distiller] distilled ${result.new.length}/${trajectories.length} trajectories into playbooks`);
1889
+ const output = this.stampExtractionProvenance(result, 'trajectory-distiller', {
1890
+ sourceDomains,
1891
+ });
1892
+ this.recordPlaybookExtractionDiagnostics({
1893
+ trajectories,
1894
+ analyses,
812
1895
  existingPlaybooks,
1896
+ attemptedMethods,
1897
+ selectedMethod: 'trajectory-distiller',
1898
+ extracted: output,
1899
+ durationMs: Date.now() - startTime,
1900
+ fallbackReason: workspaceFallbackReason,
1901
+ workspace: workspaceDiag,
813
1902
  });
814
- return result.output;
1903
+ return output;
815
1904
  }
816
- catch {
817
- // Fall through to heuristic
1905
+ // eslint-disable-next-line no-console
1906
+ logger.error(`[distiller] produced 0 playbooks from ${trajectories.length} trajectories (self-check/parse rejects or LLM unavailable) — falling back to heuristic`);
1907
+ }
1908
+ // G2 / heuristic fallback: warn when LLM was requested but unavailable or
1909
+ // produced no output, then run the low-fidelity heuristic extractor.
1910
+ if (!this.taskRunner) {
1911
+ // Only warn when an LLM-backed path was explicitly requested but not
1912
+ // available — either no distiller (no LLM provider wired) or the
1913
+ // distiller produced nothing.
1914
+ this.warnHeuristicFallback();
1915
+ }
1916
+ attemptedMethods.push('heuristic');
1917
+ const output = this.stampExtractionProvenance(await this.playbookExtractor.extract(trajectories, analyses, existingPlaybooks), 'heuristic', {
1918
+ fallbackReason: workspaceFallbackReason,
1919
+ sourceDomains,
1920
+ });
1921
+ this.recordPlaybookExtractionDiagnostics({
1922
+ trajectories,
1923
+ analyses,
1924
+ existingPlaybooks,
1925
+ attemptedMethods,
1926
+ selectedMethod: 'heuristic',
1927
+ extracted: output,
1928
+ durationMs: Date.now() - startTime,
1929
+ fallbackReason: workspaceFallbackReason,
1930
+ workspace: workspaceDiag,
1931
+ });
1932
+ return output;
1933
+ }
1934
+ recordPlaybookExtractionDiagnostics(input) {
1935
+ this.lastPlaybookExtractionDiagnostics = {
1936
+ event: 'playbook-extraction',
1937
+ injectedMetaPlaybookIds: input.injectedMetaPlaybookIds ?? [],
1938
+ tier0: computeExtractionTier0(input.extracted.new, input.trajectories.length),
1939
+ batchSize: input.trajectories.length,
1940
+ existingPlaybookCount: input.existingPlaybooks.length,
1941
+ trajectoryIds: input.trajectories.map((t) => t.id),
1942
+ taskIds: input.trajectories.map((t) => t.task.id),
1943
+ domains: [...new Set(input.trajectories.map((t) => t.task.domain))],
1944
+ abstractableCount: input.analyses.filter((a) => a.abstractable).length,
1945
+ attemptedMethods: input.attemptedMethods,
1946
+ selectedMethod: input.selectedMethod,
1947
+ durationMs: input.durationMs,
1948
+ newCount: input.extracted.new.length,
1949
+ updateCount: input.extracted.updates.length,
1950
+ newPlaybooks: input.extracted.new.map((playbook) => ({
1951
+ id: playbook.id,
1952
+ name: playbook.name,
1953
+ extractionMethod: playbook.provenance?.extractionMethod,
1954
+ confidence: playbook.confidence,
1955
+ triggers: playbook.applicability.triggers,
1956
+ domains: playbook.applicability.domains,
1957
+ })),
1958
+ fallbackReason: input.fallbackReason,
1959
+ workspace: input.workspace,
1960
+ agent: input.agent,
1961
+ };
1962
+ }
1963
+ emitDiagnostics(event) {
1964
+ try {
1965
+ this.diagnosticsCollector?.(event);
1966
+ }
1967
+ catch {
1968
+ // diagnostics must never break learning
1969
+ }
1970
+ }
1971
+ stampExtractionProvenance(extracted, method, options = {}) {
1972
+ for (const playbook of extracted.new) {
1973
+ playbook.provenance = {
1974
+ ...(playbook.provenance ?? { origin: 'extracted', recordedAt: new Date() }),
1975
+ origin: playbook.provenance?.origin ?? 'extracted',
1976
+ recordedAt: playbook.provenance?.recordedAt ?? new Date(),
1977
+ extractionMethod: method,
1978
+ fallbackReason: options.fallbackReason,
1979
+ template: options.template,
1980
+ templateVersion: options.templateVersion,
1981
+ };
1982
+ if (options.sourceDomains && options.sourceDomains.length > 0) {
1983
+ // PREPEND so the source routing domain becomes domains[0], which is what
1984
+ // persistence stores as `primary_domain` and `getPlaybooksByDomain` matches
1985
+ // on (sqlite-persistence.ts:791). Appending would leave the agent's invented
1986
+ // domain (e.g. "office-automation") as primary, so the playbook stays
1987
+ // unretrievable for its own family's tasks (e.g. domain "Office Operation").
1988
+ playbook.applicability.domains = [
1989
+ ...new Set([...options.sourceDomains, ...playbook.applicability.domains]),
1990
+ ];
818
1991
  }
819
1992
  }
820
- return this.playbookExtractor.extract(this.accumulated, this.accumulatedAnalyses, existingPlaybooks);
1993
+ return extracted;
1994
+ }
1995
+ /**
1996
+ * G2: warn (or throw, under `strictExtraction`) when an LLM-backed
1997
+ * extraction/credit path was requested but no agent backend is wired, so
1998
+ * the silent heuristic fallback is no longer silent. Autonomous,
1999
+ * high-fidelity extraction requires a backend (call `Atlas.setAgentManager`).
2000
+ * Headless ingest still functions on the heuristic path when not strict.
2001
+ */
2002
+ warnHeuristicFallback() {
2003
+ // Only relevant when an LLM-backed path was actually requested.
2004
+ const wantsLlm = this.learningConfig.patternExtractor === 'llm' ||
2005
+ this.learningConfig.patternExtractor === 'both' ||
2006
+ this.learningConfig.creditStrategy === 'llm';
2007
+ if (!wantsLlm)
2008
+ return;
2009
+ const msg = `[unified-pipeline] patternExtractor='${this.learningConfig.patternExtractor}'` +
2010
+ ` (creditStrategy='${this.learningConfig.creditStrategy}') but no agent backend wired` +
2011
+ ` (call Atlas.setAgentManager); using heuristic extractor — autonomous playbooks` +
2012
+ ` will be low-fidelity.`;
2013
+ if (this.learningConfig.strictExtraction) {
2014
+ throw new Error(msg + ' [strictExtraction is ON]');
2015
+ }
2016
+ // Loud, but once-per-run.
2017
+ if (!this.warnedHeuristicFallback) {
2018
+ this.warnedHeuristicFallback = true;
2019
+ logger.warn(msg);
2020
+ }
821
2021
  }
822
2022
  /**
823
2023
  * Empty batch result for when there's nothing to process.
@@ -835,10 +2035,79 @@ export class UnifiedLearningPipeline {
835
2035
  };
836
2036
  }
837
2037
  }
2038
+ /**
2039
+ * G3(b): convert a reflexion `suggestedPlaybookUpdates` entry into a playbook
2040
+ * anti-pattern, conservatively. Only suggestions phrased as avoid/don't/never
2041
+ * rules become anti-patterns (a generic "improve X" suggestion is not an
2042
+ * anti-pattern and is left for other channels). Returns undefined when the
2043
+ * suggestion is not avoid-shaped, so no spurious anti-patterns are emitted.
2044
+ */
2045
+ function reflexionSuggestionToAntiPattern(suggestion) {
2046
+ const trimmed = suggestion.trim();
2047
+ if (!trimmed)
2048
+ return undefined;
2049
+ // Match avoid-shaped guidance anywhere in the suggestion.
2050
+ const isAvoidShaped = /\b(avoid|don'?t|do not|never|stop|refrain from|should not|shouldn'?t)\b/i.test(trimmed);
2051
+ if (!isAvoidShaped)
2052
+ return undefined;
2053
+ // Already prefixed with an avoid verb — keep as-is; otherwise normalize.
2054
+ return /^(avoid|don'?t|do not|never)\b/i.test(trimmed) ? trimmed : `Avoid: ${trimmed}`;
2055
+ }
2056
+ /**
2057
+ * Deserialize a trajectory from a dream_queue row's JSON. `TrajectorySchema`
2058
+ * uses `z.date()` (no string coercion), so the top-level `timestamp` — turned
2059
+ * into an ISO string by JSON.stringify — is revived to a Date. The dream's
2060
+ * consumers (analyzer, extractors, frontier seeding) read fields/strings, not
2061
+ * nested dates, so a structural cast is sufficient. Returns undefined on a
2062
+ * parse failure so the dream can skip a corrupt row rather than abort.
2063
+ */
2064
+ function parseQueuedTrajectory(json) {
2065
+ try {
2066
+ const obj = JSON.parse(json);
2067
+ if (typeof obj.timestamp === 'string') {
2068
+ obj.timestamp = new Date(obj.timestamp);
2069
+ }
2070
+ return obj;
2071
+ }
2072
+ catch {
2073
+ return undefined;
2074
+ }
2075
+ }
2076
+ /**
2077
+ * Combine the per-internal-batch results of a dream into one summary. Counts
2078
+ * sum; `experiencesClustered` takes the last (it reflects the final store
2079
+ * size); `successRate` is trajectory-weighted across batches.
2080
+ */
2081
+ function aggregateBatchResults(batches) {
2082
+ const agg = {
2083
+ trajectoriesProcessed: 0,
2084
+ playbooksExtracted: 0,
2085
+ experiencesPruned: 0,
2086
+ experiencesCompressed: { promoted: 0, demoted: 0, evicted: 0 },
2087
+ experiencesClustered: 0,
2088
+ knowledgeExtracted: 0,
2089
+ successRate: 0,
2090
+ triggerReasons: ['manual_override'],
2091
+ };
2092
+ let weightedSuccess = 0;
2093
+ for (const b of batches) {
2094
+ agg.trajectoriesProcessed += b.trajectoriesProcessed;
2095
+ agg.playbooksExtracted += b.playbooksExtracted;
2096
+ agg.experiencesPruned += b.experiencesPruned;
2097
+ agg.experiencesCompressed.promoted += b.experiencesCompressed.promoted;
2098
+ agg.experiencesCompressed.demoted += b.experiencesCompressed.demoted;
2099
+ agg.experiencesCompressed.evicted += b.experiencesCompressed.evicted;
2100
+ agg.experiencesClustered = b.experiencesClustered;
2101
+ agg.knowledgeExtracted += b.knowledgeExtracted;
2102
+ weightedSuccess += b.successRate * b.trajectoriesProcessed;
2103
+ }
2104
+ agg.successRate = agg.trajectoriesProcessed > 0 ? weightedSuccess / agg.trajectoriesProcessed : 0;
2105
+ return agg;
2106
+ }
838
2107
  /**
839
2108
  * Create a UnifiedLearningPipeline.
840
2109
  */
841
- export function createUnifiedPipeline(memory, config, persistence) {
842
- return new UnifiedLearningPipeline(memory, config, persistence);
2110
+ export function createUnifiedPipeline(memory, config, persistence, judge, llm) {
2111
+ return new UnifiedLearningPipeline(memory, config, persistence, judge, llm);
843
2112
  }
844
2113
  //# sourceMappingURL=unified-pipeline.js.map