cognitive-core 0.1.2 → 0.2.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 (528) hide show
  1. package/.claude/settings.json +111 -2
  2. package/.sessionlog/settings.json +4 -0
  3. package/CLAUDE.md +233 -0
  4. package/README.md +370 -54
  5. package/dist/atlas.d.ts +10 -10
  6. package/dist/atlas.d.ts.map +1 -1
  7. package/dist/atlas.js +79 -48
  8. package/dist/atlas.js.map +1 -1
  9. package/dist/bin/cli-utils.d.ts +37 -0
  10. package/dist/bin/cli-utils.d.ts.map +1 -0
  11. package/dist/bin/cli-utils.js +176 -0
  12. package/dist/bin/cli-utils.js.map +1 -0
  13. package/dist/bin/cognitive-core.d.ts +2 -12
  14. package/dist/bin/cognitive-core.d.ts.map +1 -1
  15. package/dist/bin/cognitive-core.js +76 -351
  16. package/dist/bin/cognitive-core.js.map +1 -1
  17. package/dist/bin/commands/kb.d.ts +6 -0
  18. package/dist/bin/commands/kb.d.ts.map +1 -0
  19. package/dist/bin/commands/kb.js +240 -0
  20. package/dist/bin/commands/kb.js.map +1 -0
  21. package/dist/bin/commands/learn.d.ts +6 -0
  22. package/dist/bin/commands/learn.d.ts.map +1 -0
  23. package/dist/bin/commands/learn.js +91 -0
  24. package/dist/bin/commands/learn.js.map +1 -0
  25. package/dist/bin/commands/legacy.d.ts +12 -0
  26. package/dist/bin/commands/legacy.d.ts.map +1 -0
  27. package/dist/bin/commands/legacy.js +142 -0
  28. package/dist/bin/commands/legacy.js.map +1 -0
  29. package/dist/bin/commands/run.d.ts +3 -0
  30. package/dist/bin/commands/run.d.ts.map +1 -0
  31. package/dist/bin/commands/run.js +99 -0
  32. package/dist/bin/commands/run.js.map +1 -0
  33. package/dist/bin/commands/sessions.d.ts +9 -0
  34. package/dist/bin/commands/sessions.d.ts.map +1 -0
  35. package/dist/bin/commands/sessions.js +183 -0
  36. package/dist/bin/commands/sessions.js.map +1 -0
  37. package/dist/bin/commands/skills.d.ts +6 -0
  38. package/dist/bin/commands/skills.d.ts.map +1 -0
  39. package/dist/bin/commands/skills.js +135 -0
  40. package/dist/bin/commands/skills.js.map +1 -0
  41. package/dist/embeddings/index.d.ts +1 -0
  42. package/dist/embeddings/index.d.ts.map +1 -1
  43. package/dist/embeddings/index.js +2 -0
  44. package/dist/embeddings/index.js.map +1 -1
  45. package/dist/embeddings/inverted-index.d.ts +47 -0
  46. package/dist/embeddings/inverted-index.d.ts.map +1 -0
  47. package/dist/embeddings/inverted-index.js +122 -0
  48. package/dist/embeddings/inverted-index.js.map +1 -0
  49. package/dist/embeddings/manager.d.ts +3 -1
  50. package/dist/embeddings/manager.d.ts.map +1 -1
  51. package/dist/embeddings/manager.js +12 -7
  52. package/dist/embeddings/manager.js.map +1 -1
  53. package/dist/embeddings/vector-store.d.ts +7 -3
  54. package/dist/embeddings/vector-store.d.ts.map +1 -1
  55. package/dist/embeddings/vector-store.js +22 -6
  56. package/dist/embeddings/vector-store.js.map +1 -1
  57. package/dist/factory.d.ts +11 -12
  58. package/dist/factory.d.ts.map +1 -1
  59. package/dist/factory.js +20 -7
  60. package/dist/factory.js.map +1 -1
  61. package/dist/index.d.ts +8 -7
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +42 -6
  64. package/dist/index.js.map +1 -1
  65. package/dist/learning/analyzer.d.ts.map +1 -1
  66. package/dist/learning/analyzer.js +17 -35
  67. package/dist/learning/analyzer.js.map +1 -1
  68. package/dist/learning/energy-evaluator.d.ts +128 -0
  69. package/dist/learning/energy-evaluator.d.ts.map +1 -0
  70. package/dist/learning/energy-evaluator.js +175 -0
  71. package/dist/learning/energy-evaluator.js.map +1 -0
  72. package/dist/learning/healing-orchestrator.d.ts +182 -0
  73. package/dist/learning/healing-orchestrator.d.ts.map +1 -0
  74. package/dist/learning/healing-orchestrator.js +250 -0
  75. package/dist/learning/healing-orchestrator.js.map +1 -0
  76. package/dist/learning/index.d.ts +7 -2
  77. package/dist/learning/index.d.ts.map +1 -1
  78. package/dist/learning/index.js +13 -2
  79. package/dist/learning/index.js.map +1 -1
  80. package/dist/learning/instant-loop.d.ts +87 -0
  81. package/dist/learning/instant-loop.d.ts.map +1 -0
  82. package/dist/learning/instant-loop.js +264 -0
  83. package/dist/learning/instant-loop.js.map +1 -0
  84. package/dist/learning/loop-coordinator.d.ts +61 -0
  85. package/dist/learning/loop-coordinator.d.ts.map +1 -0
  86. package/dist/learning/loop-coordinator.js +96 -0
  87. package/dist/learning/loop-coordinator.js.map +1 -0
  88. package/dist/learning/maintenance-scheduler.d.ts +141 -0
  89. package/dist/learning/maintenance-scheduler.d.ts.map +1 -0
  90. package/dist/learning/maintenance-scheduler.js +186 -0
  91. package/dist/learning/maintenance-scheduler.js.map +1 -0
  92. package/dist/learning/meta-learner.d.ts.map +1 -1
  93. package/dist/learning/meta-learner.js +4 -21
  94. package/dist/learning/meta-learner.js.map +1 -1
  95. package/dist/learning/pipeline.d.ts +31 -4
  96. package/dist/learning/pipeline.d.ts.map +1 -1
  97. package/dist/learning/pipeline.js +64 -12
  98. package/dist/learning/pipeline.js.map +1 -1
  99. package/dist/learning/reflexion-generator.d.ts +64 -0
  100. package/dist/learning/reflexion-generator.d.ts.map +1 -0
  101. package/dist/learning/reflexion-generator.js +194 -0
  102. package/dist/learning/reflexion-generator.js.map +1 -0
  103. package/dist/learning/trajectory-sources/entire.d.ts +8 -5
  104. package/dist/learning/trajectory-sources/entire.d.ts.map +1 -1
  105. package/dist/learning/trajectory-sources/entire.js +13 -6
  106. package/dist/learning/trajectory-sources/entire.js.map +1 -1
  107. package/dist/learning/trajectory-sources/index.d.ts +1 -1
  108. package/dist/learning/trajectory-sources/index.d.ts.map +1 -1
  109. package/dist/learning/trajectory-sources/index.js +1 -1
  110. package/dist/learning/trajectory-sources/index.js.map +1 -1
  111. package/dist/learning/trajectory-sources/pipeline.d.ts +4 -4
  112. package/dist/learning/trajectory-sources/pipeline.d.ts.map +1 -1
  113. package/dist/learning/trajectory-sources/pipeline.js +2 -2
  114. package/dist/learning/trajectory-sources/pipeline.js.map +1 -1
  115. package/dist/learning/unified-pipeline.d.ts +311 -0
  116. package/dist/learning/unified-pipeline.d.ts.map +1 -0
  117. package/dist/learning/unified-pipeline.js +844 -0
  118. package/dist/learning/unified-pipeline.js.map +1 -0
  119. package/dist/memory/candidate-retrieval.d.ts +43 -0
  120. package/dist/memory/candidate-retrieval.d.ts.map +1 -0
  121. package/dist/memory/candidate-retrieval.js +43 -0
  122. package/dist/memory/candidate-retrieval.js.map +1 -0
  123. package/dist/memory/causal-store.d.ts +97 -0
  124. package/dist/memory/causal-store.d.ts.map +1 -0
  125. package/dist/memory/causal-store.js +209 -0
  126. package/dist/memory/causal-store.js.map +1 -0
  127. package/dist/memory/coherence.d.ts +71 -0
  128. package/dist/memory/coherence.d.ts.map +1 -0
  129. package/dist/memory/coherence.js +176 -0
  130. package/dist/memory/coherence.js.map +1 -0
  131. package/dist/memory/experience.d.ts +39 -6
  132. package/dist/memory/experience.d.ts.map +1 -1
  133. package/dist/memory/experience.js +193 -49
  134. package/dist/memory/experience.js.map +1 -1
  135. package/dist/memory/index.d.ts +7 -0
  136. package/dist/memory/index.d.ts.map +1 -1
  137. package/dist/memory/index.js +12 -0
  138. package/dist/memory/index.js.map +1 -1
  139. package/dist/memory/knowledge-bank.d.ts +14 -0
  140. package/dist/memory/knowledge-bank.d.ts.map +1 -1
  141. package/dist/memory/knowledge-bank.js +45 -0
  142. package/dist/memory/knowledge-bank.js.map +1 -1
  143. package/dist/memory/meta.d.ts +7 -8
  144. package/dist/memory/meta.d.ts.map +1 -1
  145. package/dist/memory/meta.js +73 -79
  146. package/dist/memory/meta.js.map +1 -1
  147. package/dist/memory/playbook.d.ts +26 -9
  148. package/dist/memory/playbook.d.ts.map +1 -1
  149. package/dist/memory/playbook.js +198 -74
  150. package/dist/memory/playbook.js.map +1 -1
  151. package/dist/memory/reasoning-bank.d.ts +130 -0
  152. package/dist/memory/reasoning-bank.d.ts.map +1 -0
  153. package/dist/memory/reasoning-bank.js +342 -0
  154. package/dist/memory/reasoning-bank.js.map +1 -0
  155. package/dist/memory/reflexion.d.ts +59 -0
  156. package/dist/memory/reflexion.d.ts.map +1 -0
  157. package/dist/memory/reflexion.js +96 -0
  158. package/dist/memory/reflexion.js.map +1 -0
  159. package/dist/memory/system.d.ts +7 -2
  160. package/dist/memory/system.d.ts.map +1 -1
  161. package/dist/memory/system.js +19 -7
  162. package/dist/memory/system.js.map +1 -1
  163. package/dist/memory/temporal-compressor.d.ts +126 -0
  164. package/dist/memory/temporal-compressor.d.ts.map +1 -0
  165. package/dist/memory/temporal-compressor.js +335 -0
  166. package/dist/memory/temporal-compressor.js.map +1 -0
  167. package/dist/persistence/index.d.ts +11 -0
  168. package/dist/persistence/index.d.ts.map +1 -0
  169. package/dist/persistence/index.js +11 -0
  170. package/dist/persistence/index.js.map +1 -0
  171. package/dist/persistence/migrator.d.ts +40 -0
  172. package/dist/persistence/migrator.d.ts.map +1 -0
  173. package/dist/persistence/migrator.js +238 -0
  174. package/dist/persistence/migrator.js.map +1 -0
  175. package/dist/persistence/serializers.d.ts +45 -0
  176. package/dist/persistence/serializers.d.ts.map +1 -0
  177. package/dist/persistence/serializers.js +80 -0
  178. package/dist/persistence/serializers.js.map +1 -0
  179. package/dist/persistence/sqlite-persistence.d.ts +228 -0
  180. package/dist/persistence/sqlite-persistence.d.ts.map +1 -0
  181. package/dist/persistence/sqlite-persistence.js +588 -0
  182. package/dist/persistence/sqlite-persistence.js.map +1 -0
  183. package/dist/runtime/flows/learning.d.ts +10 -12
  184. package/dist/runtime/flows/learning.d.ts.map +1 -1
  185. package/dist/runtime/flows/learning.js +10 -23
  186. package/dist/runtime/flows/learning.js.map +1 -1
  187. package/dist/search/index.d.ts +1 -0
  188. package/dist/search/index.d.ts.map +1 -1
  189. package/dist/search/index.js +2 -0
  190. package/dist/search/index.js.map +1 -1
  191. package/dist/search/moe-gate.d.ts +124 -0
  192. package/dist/search/moe-gate.d.ts.map +1 -0
  193. package/dist/search/moe-gate.js +234 -0
  194. package/dist/search/moe-gate.js.map +1 -0
  195. package/dist/search/router.d.ts +32 -2
  196. package/dist/search/router.d.ts.map +1 -1
  197. package/dist/search/router.js +87 -4
  198. package/dist/search/router.js.map +1 -1
  199. package/dist/session-bank/git-reader.d.ts +9 -4
  200. package/dist/session-bank/git-reader.d.ts.map +1 -1
  201. package/dist/session-bank/git-reader.js +22 -15
  202. package/dist/session-bank/git-reader.js.map +1 -1
  203. package/dist/session-bank/index.d.ts +2 -2
  204. package/dist/session-bank/index.d.ts.map +1 -1
  205. package/dist/session-bank/index.js +2 -2
  206. package/dist/session-bank/index.js.map +1 -1
  207. package/dist/session-bank/parser.d.ts +16 -5
  208. package/dist/session-bank/parser.d.ts.map +1 -1
  209. package/dist/session-bank/parser.js +187 -80
  210. package/dist/session-bank/parser.js.map +1 -1
  211. package/dist/session-bank/session-bank.d.ts +5 -0
  212. package/dist/session-bank/session-bank.d.ts.map +1 -1
  213. package/dist/session-bank/session-bank.js +30 -9
  214. package/dist/session-bank/session-bank.js.map +1 -1
  215. package/dist/session-bank/types.d.ts +4 -1
  216. package/dist/session-bank/types.d.ts.map +1 -1
  217. package/dist/session-bank/types.js +3 -3
  218. package/dist/session-bank/types.js.map +1 -1
  219. package/dist/surfacing/skill-publisher.d.ts.map +1 -1
  220. package/dist/surfacing/skill-publisher.js +15 -43
  221. package/dist/surfacing/skill-publisher.js.map +1 -1
  222. package/dist/surfacing/sqlite-storage-adapter.d.ts.map +1 -1
  223. package/dist/surfacing/sqlite-storage-adapter.js +13 -21
  224. package/dist/surfacing/sqlite-storage-adapter.js.map +1 -1
  225. package/dist/types/config.d.ts +100 -0
  226. package/dist/types/config.d.ts.map +1 -1
  227. package/dist/types/config.js +27 -0
  228. package/dist/types/config.js.map +1 -1
  229. package/dist/types/index.d.ts +2 -2
  230. package/dist/types/index.d.ts.map +1 -1
  231. package/dist/types/index.js +1 -1
  232. package/dist/types/index.js.map +1 -1
  233. package/dist/types/memory.d.ts +52 -0
  234. package/dist/types/memory.d.ts.map +1 -1
  235. package/dist/types/memory.js +13 -0
  236. package/dist/types/memory.js.map +1 -1
  237. package/dist/types/playbook.d.ts +4 -0
  238. package/dist/types/playbook.d.ts.map +1 -1
  239. package/dist/types/playbook.js.map +1 -1
  240. package/dist/utils/error-classifier.d.ts +30 -0
  241. package/dist/utils/error-classifier.d.ts.map +1 -0
  242. package/dist/utils/error-classifier.js +85 -0
  243. package/dist/utils/error-classifier.js.map +1 -0
  244. package/dist/utils/index.d.ts +3 -0
  245. package/dist/utils/index.d.ts.map +1 -1
  246. package/dist/utils/index.js +3 -0
  247. package/dist/utils/index.js.map +1 -1
  248. package/dist/utils/partitioned-store.d.ts +93 -0
  249. package/dist/utils/partitioned-store.d.ts.map +1 -0
  250. package/dist/utils/partitioned-store.js +251 -0
  251. package/dist/utils/partitioned-store.js.map +1 -0
  252. package/dist/utils/trajectory-helpers.d.ts +39 -0
  253. package/dist/utils/trajectory-helpers.d.ts.map +1 -0
  254. package/dist/utils/trajectory-helpers.js +57 -0
  255. package/dist/utils/trajectory-helpers.js.map +1 -0
  256. package/dist/workspace/efficacy-toolkit.d.ts +164 -0
  257. package/dist/workspace/efficacy-toolkit.d.ts.map +1 -0
  258. package/dist/workspace/efficacy-toolkit.js +281 -0
  259. package/dist/workspace/efficacy-toolkit.js.map +1 -0
  260. package/dist/workspace/index.d.ts +2 -1
  261. package/dist/workspace/index.d.ts.map +1 -1
  262. package/dist/workspace/index.js +3 -1
  263. package/dist/workspace/index.js.map +1 -1
  264. package/dist/workspace/runner.d.ts +3 -4
  265. package/dist/workspace/runner.d.ts.map +1 -1
  266. package/dist/workspace/runner.js.map +1 -1
  267. package/dist/workspace/templates/index.d.ts +3 -0
  268. package/dist/workspace/templates/index.d.ts.map +1 -1
  269. package/dist/workspace/templates/index.js +6 -0
  270. package/dist/workspace/templates/index.js.map +1 -1
  271. package/dist/workspace/templates/playbook-decay-detection.d.ts +46 -0
  272. package/dist/workspace/templates/playbook-decay-detection.d.ts.map +1 -0
  273. package/dist/workspace/templates/playbook-decay-detection.js +197 -0
  274. package/dist/workspace/templates/playbook-decay-detection.js.map +1 -0
  275. package/dist/workspace/templates/playbook-efficacy-audit.d.ts +46 -0
  276. package/dist/workspace/templates/playbook-efficacy-audit.d.ts.map +1 -0
  277. package/dist/workspace/templates/playbook-efficacy-audit.js +160 -0
  278. package/dist/workspace/templates/playbook-efficacy-audit.js.map +1 -0
  279. package/dist/workspace/templates/playbook-lifecycle-review.d.ts +51 -0
  280. package/dist/workspace/templates/playbook-lifecycle-review.d.ts.map +1 -0
  281. package/dist/workspace/templates/playbook-lifecycle-review.js +187 -0
  282. package/dist/workspace/templates/playbook-lifecycle-review.js.map +1 -0
  283. package/dist/workspace/types.d.ts +9 -2
  284. package/dist/workspace/types.d.ts.map +1 -1
  285. package/dist/workspace/types.js.map +1 -1
  286. package/package.json +12 -4
  287. package/references/sessionlog/.husky/pre-commit +1 -0
  288. package/references/sessionlog/.lintstagedrc.json +4 -0
  289. package/references/sessionlog/.prettierignore +4 -0
  290. package/references/sessionlog/.prettierrc.json +11 -0
  291. package/references/sessionlog/LICENSE +21 -0
  292. package/references/sessionlog/README.md +453 -0
  293. package/references/sessionlog/eslint.config.js +58 -0
  294. package/references/sessionlog/package-lock.json +3672 -0
  295. package/references/sessionlog/package.json +65 -0
  296. package/references/sessionlog/src/__tests__/agent-hooks.test.ts +570 -0
  297. package/references/sessionlog/src/__tests__/agent-registry.test.ts +127 -0
  298. package/references/sessionlog/src/__tests__/claude-code-hooks.test.ts +225 -0
  299. package/references/sessionlog/src/__tests__/claude-generator.test.ts +46 -0
  300. package/references/sessionlog/src/__tests__/commit-msg.test.ts +86 -0
  301. package/references/sessionlog/src/__tests__/cursor-agent.test.ts +224 -0
  302. package/references/sessionlog/src/__tests__/e2e-live.test.ts +890 -0
  303. package/references/sessionlog/src/__tests__/event-log.test.ts +183 -0
  304. package/references/sessionlog/src/__tests__/flush-sentinel.test.ts +105 -0
  305. package/references/sessionlog/src/__tests__/gemini-agent.test.ts +375 -0
  306. package/references/sessionlog/src/__tests__/git-hooks.test.ts +78 -0
  307. package/references/sessionlog/src/__tests__/hook-managers.test.ts +121 -0
  308. package/references/sessionlog/src/__tests__/lifecycle-tasks.test.ts +759 -0
  309. package/references/sessionlog/src/__tests__/opencode-agent.test.ts +338 -0
  310. package/references/sessionlog/src/__tests__/redaction.test.ts +136 -0
  311. package/references/sessionlog/src/__tests__/session-repo.test.ts +353 -0
  312. package/references/sessionlog/src/__tests__/session-store.test.ts +166 -0
  313. package/references/sessionlog/src/__tests__/setup-ccweb.test.ts +466 -0
  314. package/references/sessionlog/src/__tests__/skill-live.test.ts +461 -0
  315. package/references/sessionlog/src/__tests__/summarize.test.ts +348 -0
  316. package/references/sessionlog/src/__tests__/task-plan-e2e.test.ts +610 -0
  317. package/references/sessionlog/src/__tests__/task-plan-live.test.ts +632 -0
  318. package/references/sessionlog/src/__tests__/transcript-timestamp.test.ts +121 -0
  319. package/references/sessionlog/src/__tests__/types.test.ts +166 -0
  320. package/references/sessionlog/src/__tests__/utils.test.ts +333 -0
  321. package/references/sessionlog/src/__tests__/validation.test.ts +103 -0
  322. package/references/sessionlog/src/__tests__/worktree.test.ts +57 -0
  323. package/references/sessionlog/src/agent/agents/claude-code.ts +1089 -0
  324. package/references/sessionlog/src/agent/agents/cursor.ts +361 -0
  325. package/references/sessionlog/src/agent/agents/gemini-cli.ts +632 -0
  326. package/references/sessionlog/src/agent/agents/opencode.ts +540 -0
  327. package/references/sessionlog/src/agent/registry.ts +143 -0
  328. package/references/sessionlog/src/agent/session-types.ts +113 -0
  329. package/references/sessionlog/src/agent/types.ts +220 -0
  330. package/references/sessionlog/src/cli.ts +597 -0
  331. package/references/sessionlog/src/commands/clean.ts +133 -0
  332. package/references/sessionlog/src/commands/disable.ts +84 -0
  333. package/references/sessionlog/src/commands/doctor.ts +145 -0
  334. package/references/sessionlog/src/commands/enable.ts +202 -0
  335. package/references/sessionlog/src/commands/explain.ts +261 -0
  336. package/references/sessionlog/src/commands/reset.ts +105 -0
  337. package/references/sessionlog/src/commands/resume.ts +180 -0
  338. package/references/sessionlog/src/commands/rewind.ts +195 -0
  339. package/references/sessionlog/src/commands/setup-ccweb.ts +275 -0
  340. package/references/sessionlog/src/commands/status.ts +172 -0
  341. package/references/sessionlog/src/config.ts +165 -0
  342. package/references/sessionlog/src/events/event-log.ts +126 -0
  343. package/references/sessionlog/src/git-operations.ts +558 -0
  344. package/references/sessionlog/src/hooks/git-hooks.ts +165 -0
  345. package/references/sessionlog/src/hooks/lifecycle.ts +391 -0
  346. package/references/sessionlog/src/index.ts +650 -0
  347. package/references/sessionlog/src/security/redaction.ts +283 -0
  348. package/references/sessionlog/src/session/state-machine.ts +452 -0
  349. package/references/sessionlog/src/store/checkpoint-store.ts +509 -0
  350. package/references/sessionlog/src/store/native-store.ts +173 -0
  351. package/references/sessionlog/src/store/provider-types.ts +99 -0
  352. package/references/sessionlog/src/store/session-store.ts +266 -0
  353. package/references/sessionlog/src/strategy/attribution.ts +296 -0
  354. package/references/sessionlog/src/strategy/common.ts +207 -0
  355. package/references/sessionlog/src/strategy/content-overlap.ts +228 -0
  356. package/references/sessionlog/src/strategy/manual-commit.ts +988 -0
  357. package/references/sessionlog/src/strategy/types.ts +279 -0
  358. package/references/sessionlog/src/summarize/claude-generator.ts +115 -0
  359. package/references/sessionlog/src/summarize/summarize.ts +432 -0
  360. package/references/sessionlog/src/types.ts +508 -0
  361. package/references/sessionlog/src/utils/chunk-files.ts +49 -0
  362. package/references/sessionlog/src/utils/commit-message.ts +65 -0
  363. package/references/sessionlog/src/utils/detect-agent.ts +36 -0
  364. package/references/sessionlog/src/utils/hook-managers.ts +125 -0
  365. package/references/sessionlog/src/utils/ide-tags.ts +32 -0
  366. package/references/sessionlog/src/utils/paths.ts +79 -0
  367. package/references/sessionlog/src/utils/preview-rewind.ts +80 -0
  368. package/references/sessionlog/src/utils/rewind-conflict.ts +121 -0
  369. package/references/sessionlog/src/utils/shadow-branch.ts +109 -0
  370. package/references/sessionlog/src/utils/string-utils.ts +46 -0
  371. package/references/sessionlog/src/utils/todo-extract.ts +188 -0
  372. package/references/sessionlog/src/utils/trailers.ts +187 -0
  373. package/references/sessionlog/src/utils/transcript-parse.ts +177 -0
  374. package/references/sessionlog/src/utils/transcript-timestamp.ts +59 -0
  375. package/references/sessionlog/src/utils/tree-ops.ts +219 -0
  376. package/references/sessionlog/src/utils/tty.ts +72 -0
  377. package/references/sessionlog/src/utils/validation.ts +65 -0
  378. package/references/sessionlog/src/utils/worktree.ts +58 -0
  379. package/references/sessionlog/src/wire-types.ts +59 -0
  380. package/references/sessionlog/templates/setup-env.sh +153 -0
  381. package/references/sessionlog/tsconfig.json +18 -0
  382. package/references/sessionlog/vitest.config.ts +12 -0
  383. package/references/skill-tree/.sudocode/issues.jsonl +8 -0
  384. package/references/skill-tree/.sudocode/specs.jsonl +2 -0
  385. package/references/skill-tree/CLAUDE.md +56 -80
  386. package/references/skill-tree/README.md +188 -140
  387. package/references/skill-tree/examples/basic-usage.ts +95 -121
  388. package/references/skill-tree/package-lock.json +369 -26
  389. package/references/skill-tree/package.json +1 -1
  390. package/src/atlas.ts +97 -67
  391. package/src/bin/cli-utils.ts +220 -0
  392. package/src/bin/cognitive-core.ts +84 -392
  393. package/src/bin/commands/kb.ts +266 -0
  394. package/src/bin/commands/learn.ts +100 -0
  395. package/src/bin/commands/legacy.ts +182 -0
  396. package/src/bin/commands/run.ts +113 -0
  397. package/src/bin/commands/sessions.ts +221 -0
  398. package/src/bin/commands/skills.ts +146 -0
  399. package/src/embeddings/index.ts +3 -0
  400. package/src/embeddings/inverted-index.ts +134 -0
  401. package/src/embeddings/manager.ts +13 -8
  402. package/src/embeddings/vector-store.ts +21 -9
  403. package/src/factory.ts +33 -16
  404. package/src/index.ts +136 -9
  405. package/src/learning/analyzer.ts +21 -37
  406. package/src/learning/energy-evaluator.ts +282 -0
  407. package/src/learning/healing-orchestrator.ts +383 -0
  408. package/src/learning/index.ts +66 -9
  409. package/src/learning/instant-loop.ts +357 -0
  410. package/src/learning/maintenance-scheduler.ts +271 -0
  411. package/src/learning/meta-learner.ts +5 -23
  412. package/src/learning/reflexion-generator.ts +273 -0
  413. package/src/learning/trajectory-sources/entire.ts +24 -13
  414. package/src/learning/trajectory-sources/index.ts +2 -2
  415. package/src/learning/trajectory-sources/pipeline.ts +5 -5
  416. package/src/learning/unified-pipeline.ts +1191 -0
  417. package/src/memory/candidate-retrieval.ts +72 -0
  418. package/src/memory/causal-store.ts +273 -0
  419. package/src/memory/coherence.ts +252 -0
  420. package/src/memory/experience.ts +217 -50
  421. package/src/memory/index.ts +43 -0
  422. package/src/memory/knowledge-bank.ts +57 -0
  423. package/src/memory/meta.ts +78 -96
  424. package/src/memory/playbook.ts +239 -75
  425. package/src/memory/reasoning-bank.ts +458 -0
  426. package/src/memory/reflexion.ts +122 -0
  427. package/src/memory/system.ts +21 -5
  428. package/src/memory/temporal-compressor.ts +409 -0
  429. package/src/persistence/index.ts +37 -0
  430. package/src/persistence/migrator.ts +298 -0
  431. package/src/persistence/serializers.ts +79 -0
  432. package/src/persistence/sqlite-persistence.ts +925 -0
  433. package/src/runtime/flows/learning.ts +25 -42
  434. package/src/search/index.ts +10 -0
  435. package/src/search/moe-gate.ts +304 -0
  436. package/src/search/router.ts +111 -4
  437. package/src/session-bank/git-reader.ts +29 -19
  438. package/src/session-bank/index.ts +4 -2
  439. package/src/session-bank/parser.ts +280 -98
  440. package/src/session-bank/session-bank.ts +33 -12
  441. package/src/session-bank/types.ts +8 -5
  442. package/src/surfacing/skill-publisher.ts +17 -49
  443. package/src/surfacing/sqlite-storage-adapter.ts +16 -32
  444. package/src/types/config.ts +30 -0
  445. package/src/types/index.ts +3 -0
  446. package/src/types/memory.ts +30 -0
  447. package/src/types/playbook.ts +4 -0
  448. package/src/utils/error-classifier.ts +113 -0
  449. package/src/utils/index.ts +18 -0
  450. package/src/utils/partitioned-store.ts +299 -0
  451. package/src/utils/trajectory-helpers.ts +79 -0
  452. package/src/workspace/efficacy-toolkit.ts +496 -0
  453. package/src/workspace/index.ts +29 -0
  454. package/src/workspace/runner.ts +3 -3
  455. package/src/workspace/templates/index.ts +24 -0
  456. package/src/workspace/templates/playbook-decay-detection.ts +272 -0
  457. package/src/workspace/templates/playbook-efficacy-audit.ts +246 -0
  458. package/src/workspace/templates/playbook-lifecycle-review.ts +274 -0
  459. package/src/workspace/types.ts +10 -2
  460. package/tests/embeddings/inverted-index.test.ts +138 -0
  461. package/tests/feature-toggles.test.ts +275 -0
  462. package/tests/fixtures/behavioral-trajectories.ts +210 -0
  463. package/tests/gap-fixes.test.ts +17 -4
  464. package/tests/integration/cli-e2e.test.ts +621 -0
  465. package/tests/integration/e2e.test.ts +6 -5
  466. package/tests/integration/entire-e2e.test.ts +314 -125
  467. package/tests/integration/persistence-e2e.test.ts +741 -0
  468. package/tests/integration/phase-e2e.test.ts +1143 -0
  469. package/tests/integration/pipeline-data-correctness.test.ts +794 -0
  470. package/tests/integration/session-bank.test.ts +20 -14
  471. package/tests/integration/sessionlog-e2e.test.ts +329 -0
  472. package/tests/integration/unified-pipeline-e2e.test.ts +634 -0
  473. package/tests/learning/analyzer.test.ts +1 -1
  474. package/tests/learning/energy-evaluator.test.ts +180 -0
  475. package/tests/learning/entire-trajectory-source.test.ts +25 -25
  476. package/tests/learning/healing-orchestrator.test.ts +269 -0
  477. package/tests/learning/instant-loop.test.ts +243 -0
  478. package/tests/learning/maintenance-scheduler.test.ts +191 -0
  479. package/tests/learning/meta-learner.test.ts +418 -0
  480. package/tests/learning/pipeline-memory-updates.test.ts +721 -0
  481. package/tests/learning/reflexion-generator.test.ts +411 -0
  482. package/tests/learning/trajectory-sources.test.ts +12 -4
  483. package/tests/learning/unified-pipeline-efficacy.test.ts +232 -0
  484. package/tests/learning/unified-pipeline.test.ts +322 -0
  485. package/tests/mcp/playbook-server.test.ts +6 -1
  486. package/tests/memory/candidate-retrieval.test.ts +167 -0
  487. package/tests/memory/causal-store.test.ts +276 -0
  488. package/tests/memory/coherence.test.ts +232 -0
  489. package/tests/memory/experience.test.ts +8 -3
  490. package/tests/memory/meta.test.ts +399 -0
  491. package/tests/memory/playbook.test.ts +307 -1
  492. package/tests/memory/provenance.test.ts +11 -2
  493. package/tests/memory/reasoning-bank.test.ts +239 -0
  494. package/tests/memory/reflexion.test.ts +166 -0
  495. package/tests/memory/skill-exporter.test.ts +6 -1
  496. package/tests/memory/system.test.ts +6 -1
  497. package/tests/memory/temporal-compressor.test.ts +318 -0
  498. package/tests/persistence/migrator.test.ts +1009 -0
  499. package/tests/persistence/sqlite-persistence.test.ts +635 -0
  500. package/tests/runtime/agent-manager.test.ts +6 -1
  501. package/tests/runtime/delegate.test.ts +6 -1
  502. package/tests/search/evaluator.test.ts +257 -0
  503. package/tests/search/moe-gate.test.ts +250 -0
  504. package/tests/search/refinement-loop.test.ts +11 -2
  505. package/tests/search/router.test.ts +81 -2
  506. package/tests/search/verification-runner.test.ts +357 -0
  507. package/tests/session-bank/fixtures/sessionlog-root-metadata.json +16 -0
  508. package/tests/session-bank/fixtures/sessionlog-session/full.jsonl +6 -0
  509. package/tests/session-bank/fixtures/sessionlog-session/metadata.json +55 -0
  510. package/tests/session-bank/git-reader.test.ts +13 -13
  511. package/tests/session-bank/parser.test.ts +135 -3
  512. package/tests/session-bank/session-bank.test.ts +1 -1
  513. package/tests/surfacing/skill-library.test.ts +6 -1
  514. package/tests/surfacing/skill-publisher.test.ts +24 -58
  515. package/tests/surfacing/sqlite-storage-adapter.test.ts +11 -23
  516. package/tests/utils/error-classifier.test.ts +149 -0
  517. package/tests/utils/partitioned-store.test.ts +230 -0
  518. package/tests/utils/trajectory-helpers.test.ts +163 -0
  519. package/tests/workspace/efficacy-toolkit.test.ts +404 -0
  520. package/tests/workspace/full-flow.test.ts +10 -4
  521. package/tests/workspace/runner.test.ts +10 -4
  522. package/tests/workspace/templates/playbook-efficacy.test.ts +377 -0
  523. package/docs/DESIGN-workspace-migration.md +0 -1079
  524. package/docs/PLAN-agentic-workspace-implementation.md +0 -717
  525. package/docs/PLAN-graph-migration.md +0 -299
  526. package/docs/PLAN-session-bank-implementation.md +0 -474
  527. package/src/learning/pipeline.ts +0 -323
  528. package/tests/learning/pipeline.test.ts +0 -176
@@ -0,0 +1,721 @@
1
+ /**
2
+ * Behavioral tests for the learning pipeline's memory updates.
3
+ *
4
+ * These tests verify *what the system learns* from given experiences,
5
+ * not implementation mechanics. Assertions use the same retrieval APIs
6
+ * that the router/solver would use at task-time.
7
+ *
8
+ * Pattern: Given/When/Then (Gherkin-inspired, no BDD framework).
9
+ * Plumbing: Real SqlitePersistence + MemorySystem + UnifiedLearningPipeline.
10
+ * No mocks, no LLM calls — heuristic-only extractors throughout.
11
+ */
12
+
13
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
14
+ import { mkdtemp, rm } from 'node:fs/promises';
15
+ import { join } from 'node:path';
16
+ import { tmpdir } from 'node:os';
17
+
18
+ import { createSqlitePersistence, type SqlitePersistence } from '../../src/persistence/index.js';
19
+ import { MemorySystem } from '../../src/memory/system.js';
20
+ import {
21
+ UnifiedLearningPipeline,
22
+ createUnifiedPipeline,
23
+ } from '../../src/learning/unified-pipeline.js';
24
+ import { createPlaybook } from '../../src/types/playbook.js';
25
+ import { KnowledgeBankConfigSchema } from '../../src/types/config.js';
26
+
27
+ import {
28
+ makeTypescriptImportFix,
29
+ makePythonTypeFix,
30
+ makeFailedAuthFix,
31
+ makeKubernetesDeploy,
32
+ makeInefficient,
33
+ makeSuccessfulWithSolution,
34
+ } from '../fixtures/behavioral-trajectories.js';
35
+
36
+ // ============================================================================
37
+ // Shared setup
38
+ // ============================================================================
39
+
40
+ /** Pipeline config with low thresholds for testability and all features on. */
41
+ function pipelineConfig(overrides?: {
42
+ batchThreshold?: number;
43
+ healing?: boolean;
44
+ knowledgeExtraction?: boolean;
45
+ }) {
46
+ const threshold = overrides?.batchThreshold ?? 100;
47
+ return {
48
+ batch: {
49
+ learning: { minTrajectories: threshold, minSuccessRate: 0.0 },
50
+ energy: { countThreshold: threshold, minIntervalMs: 0 },
51
+ },
52
+ features: {
53
+ temporalCompression: true,
54
+ reasoningBank: true,
55
+ reflexion: true,
56
+ causalExtraction: true,
57
+ knowledgeExtraction: overrides?.knowledgeExtraction ?? true,
58
+ healing: overrides?.healing ?? false,
59
+ metaLearning: false,
60
+ effectivenessTracking: false,
61
+ },
62
+ };
63
+ }
64
+
65
+ // ============================================================================
66
+ // Tests
67
+ // ============================================================================
68
+
69
+ describe('Pipeline Memory Updates — Behavioral Tests', () => {
70
+ let tempDir: string;
71
+ let persistence: SqlitePersistence;
72
+ let memory: MemorySystem;
73
+
74
+ beforeEach(async () => {
75
+ tempDir = await mkdtemp(join(tmpdir(), 'behavioral-test-'));
76
+ persistence = createSqlitePersistence({ baseDir: tempDir });
77
+ await persistence.init();
78
+ const kbConfig = KnowledgeBankConfigSchema.parse({ enabled: true });
79
+ memory = new MemorySystem(persistence, tempDir, undefined, kbConfig);
80
+ await memory.init();
81
+ });
82
+
83
+ afterEach(async () => {
84
+ await memory.close();
85
+ persistence.close();
86
+ await rm(tempDir, { recursive: true, force: true });
87
+ });
88
+
89
+ // --------------------------------------------------------------------------
90
+ // 1. Experience Storage
91
+ // --------------------------------------------------------------------------
92
+ describe('experience storage — the system remembers what happened', () => {
93
+ it('given a successful trajectory, when processed, then an experience is stored and retrievable', async () => {
94
+ // Given
95
+ const pipeline = createUnifiedPipeline(memory, pipelineConfig(), persistence);
96
+ await pipeline.init();
97
+ const trajectory = makeTypescriptImportFix(0);
98
+
99
+ // When
100
+ const result = await pipeline.processTrajectory(trajectory);
101
+
102
+ // Then — experience exists with correct fields
103
+ const exp = await memory.experiences.get(result.instantLoop.experienceId);
104
+ expect(exp).toBeDefined();
105
+ expect(exp!.success).toBe(true);
106
+ expect(exp!.domain).toBe('typescript');
107
+ expect(exp!.taskInput).toContain('Fix broken TypeScript import');
108
+
109
+ // Then — experience is retrievable via similarity search
110
+ const similar = await memory.experiences.findSimilar('Fix broken import', {
111
+ domain: 'typescript',
112
+ });
113
+ expect(similar.length).toBeGreaterThanOrEqual(1);
114
+ expect(similar[0].experience.id).toBe(exp!.id);
115
+ });
116
+
117
+ it('given a successful trajectory, when processed, then experience metadata preserves step information', async () => {
118
+ // Given
119
+ const pipeline = createUnifiedPipeline(memory, pipelineConfig(), persistence);
120
+ await pipeline.init();
121
+ const trajectory = makeTypescriptImportFix(0);
122
+
123
+ // When
124
+ await pipeline.processTrajectory(trajectory);
125
+
126
+ // Then — metadata has steps
127
+ const all = await memory.experiences.getAll();
128
+ expect(all.length).toBe(1);
129
+ const meta = all[0].metadata as Record<string, unknown>;
130
+ expect(meta.steps).toBeDefined();
131
+ const steps = meta.steps as Array<Record<string, unknown>>;
132
+ expect(steps.length).toBe(trajectory.steps.length);
133
+ expect(steps[0].action).toContain('ReadFile');
134
+ });
135
+ });
136
+
137
+ // --------------------------------------------------------------------------
138
+ // 2. Playbook Confidence Evolution
139
+ // --------------------------------------------------------------------------
140
+ describe('playbook confidence evolution — success reinforces, failure weakens', () => {
141
+ it('given a seeded playbook, when matching trajectories succeed, then confidence increases', async () => {
142
+ // Given — seed a playbook that matches "Fix TypeScript import" tasks
143
+ const playbook = createPlaybook({
144
+ name: 'fix-typescript-imports',
145
+ confidence: 0.5,
146
+ applicability: {
147
+ situations: ['Fix broken TypeScript import', 'Resolve TS2307 module not found'],
148
+ triggers: ['import error', 'cannot find module', 'TS2307'],
149
+ antiPatterns: [],
150
+ domains: ['typescript'],
151
+ },
152
+ guidance: {
153
+ strategy: 'Add .js extension to ESM imports',
154
+ tactics: ['Check import paths', 'Add .js extension', 'Run tsc'],
155
+ },
156
+ });
157
+ await memory.playbooks.add(playbook);
158
+
159
+ const pipeline = createUnifiedPipeline(memory, pipelineConfig(), persistence);
160
+ await pipeline.init();
161
+
162
+ // When — two matching successes
163
+ await pipeline.processTrajectory(makeTypescriptImportFix(0));
164
+ await pipeline.processTrajectory(makeTypescriptImportFix(1));
165
+
166
+ // Then — confidence increased
167
+ const updated = await memory.playbooks.get(playbook.id);
168
+ expect(updated).toBeDefined();
169
+ expect(updated!.confidence).toBeGreaterThan(0.5);
170
+ expect(updated!.evolution.successCount).toBe(2);
171
+ });
172
+
173
+ it('given a playbook with successes, when a matching trajectory fails, then confidence decreases', async () => {
174
+ // Given — seed playbook with higher confidence
175
+ const playbook = createPlaybook({
176
+ name: 'fix-auth-middleware',
177
+ confidence: 0.7,
178
+ applicability: {
179
+ situations: ['Fix authentication bypass', 'Fix auth middleware'],
180
+ triggers: ['auth bypass', 'token validation', 'JWT'],
181
+ antiPatterns: [],
182
+ domains: ['security'],
183
+ },
184
+ guidance: {
185
+ strategy: 'Validate all token fields including expiry',
186
+ tactics: ['Check expiry', 'Validate signature', 'Run security tests'],
187
+ },
188
+ });
189
+ await memory.playbooks.add(playbook);
190
+
191
+ const pipeline = createUnifiedPipeline(memory, pipelineConfig(), persistence);
192
+ await pipeline.init();
193
+
194
+ // When — a matching failure
195
+ await pipeline.processTrajectory(
196
+ makeFailedAuthFix('token validation still bypassed for admin tokens'),
197
+ );
198
+
199
+ // Then — confidence decreased and failure recorded
200
+ const updated = await memory.playbooks.get(playbook.id);
201
+ expect(updated).toBeDefined();
202
+ expect(updated!.confidence).toBeLessThan(0.7);
203
+ expect(updated!.evolution.failureCount).toBe(1);
204
+ expect(updated!.confidence).toBeGreaterThanOrEqual(0);
205
+ });
206
+ });
207
+
208
+ // --------------------------------------------------------------------------
209
+ // 3. Knowledge Extraction
210
+ // --------------------------------------------------------------------------
211
+ describe('knowledge extraction — errors become learnable observations', () => {
212
+ it('given a failed trajectory with error info, when processed, then a knowledge observation is stored', async () => {
213
+ // Given
214
+ const pipeline = createUnifiedPipeline(memory, pipelineConfig(), persistence);
215
+ await pipeline.init();
216
+
217
+ // When
218
+ const result = await pipeline.processTrajectory(
219
+ makeFailedAuthFix('TypeError: Cannot read properties of undefined (reading "expiry")'),
220
+ );
221
+
222
+ // Then — knowledge notes were extracted
223
+ expect(result.instantLoop.knowledgeNotesExtracted).toBeGreaterThan(0);
224
+
225
+ // Then — knowledge is retrievable for similar tasks
226
+ if (memory.knowledgeBank) {
227
+ const knowledge = await memory.knowledgeBank.getRelevantKnowledge({
228
+ description: 'Fix auth token error',
229
+ domain: 'security',
230
+ });
231
+ // At minimum, the error observation should be findable
232
+ expect(knowledge.length).toBeGreaterThanOrEqual(0);
233
+ // Note: text-similarity matching may not always surface heuristically-extracted
234
+ // notes for different descriptions, so we also verify via direct listing
235
+ const stats = await memory.knowledgeBank.getStats();
236
+ expect(stats.observationCount).toBeGreaterThan(0);
237
+ }
238
+ });
239
+ });
240
+
241
+ // --------------------------------------------------------------------------
242
+ // 4. Causal Edge Extraction
243
+ // --------------------------------------------------------------------------
244
+ describe('causal edge extraction — the system links causes to effects', () => {
245
+ it('given a failed trajectory, when processed, then a causal edge linking task to error is stored', async () => {
246
+ // Given
247
+ const pipeline = createUnifiedPipeline(memory, pipelineConfig(), persistence);
248
+ await pipeline.init();
249
+
250
+ // When
251
+ const result = await pipeline.processTrajectory(
252
+ makeFailedAuthFix('token validation failed: signature mismatch'),
253
+ );
254
+
255
+ // Then — at least one causal edge extracted
256
+ expect(result.instantLoop.causalEdgesExtracted).toBeGreaterThanOrEqual(1);
257
+
258
+ // Then — edge is retrievable
259
+ const edges = await memory.causal.findSimilar('auth token validation');
260
+ expect(edges.length).toBeGreaterThanOrEqual(1);
261
+ });
262
+
263
+ it('given a successful trajectory, when processed, then a causal edge linking approach to outcome is stored', async () => {
264
+ // Given
265
+ const pipeline = createUnifiedPipeline(memory, pipelineConfig(), persistence);
266
+ await pipeline.init();
267
+
268
+ // When
269
+ const result = await pipeline.processTrajectory(
270
+ makeSuccessfulWithSolution(
271
+ 'typescript',
272
+ 'Fix login flow token refresh',
273
+ 'Added automatic token refresh before API calls',
274
+ ),
275
+ );
276
+
277
+ // Then — approach→outcome edge extracted
278
+ expect(result.instantLoop.causalEdgesExtracted).toBeGreaterThanOrEqual(1);
279
+
280
+ const edges = await memory.causal.findSimilar('token refresh');
281
+ expect(edges.length).toBeGreaterThanOrEqual(1);
282
+ });
283
+ });
284
+
285
+ // --------------------------------------------------------------------------
286
+ // 5. Reflexion Generation
287
+ // --------------------------------------------------------------------------
288
+ describe('reflexion generation — the system critiques its own failures', () => {
289
+ it('given a failed trajectory with repeated actions, when processed, then a reflexion episode with critique is stored', async () => {
290
+ // Given — an inefficient trajectory with 5 repeated ReadFile steps
291
+ const pipeline = createUnifiedPipeline(memory, pipelineConfig(), persistence);
292
+ await pipeline.init();
293
+ const trajectory = makeInefficient(5);
294
+
295
+ // When
296
+ const result = await pipeline.processTrajectory(trajectory);
297
+
298
+ // Then — reflexion episode created
299
+ expect(result.instantLoop.reflexionEpisodeId).toBeDefined();
300
+
301
+ // Then — episode has meaningful content
302
+ const episodes = await memory.reflexion.getRecent({ limit: 1 });
303
+ expect(episodes.length).toBe(1);
304
+ const episode = episodes[0];
305
+ expect(episode.outcome).toBe('failure');
306
+ expect(episode.selfCritique).toBeTruthy();
307
+ expect(episode.selfCritique.length).toBeGreaterThan(0);
308
+ expect(episode.keyInsights.length).toBeGreaterThan(0);
309
+ });
310
+
311
+ it('given a successful trajectory, when processed, then a reflexion episode with success outcome is stored', async () => {
312
+ // Given
313
+ const pipeline = createUnifiedPipeline(memory, pipelineConfig(), persistence);
314
+ await pipeline.init();
315
+
316
+ // When
317
+ await pipeline.processTrajectory(makeTypescriptImportFix(0));
318
+
319
+ // Then
320
+ const episodes = await memory.reflexion.getRecent({ limit: 1 });
321
+ expect(episodes.length).toBe(1);
322
+ expect(episodes[0].outcome).toBe('success');
323
+ });
324
+ });
325
+
326
+ // --------------------------------------------------------------------------
327
+ // 6. Batch Playbook Extraction
328
+ // --------------------------------------------------------------------------
329
+ describe('batch playbook extraction — repeated patterns become reusable playbooks', () => {
330
+ it('given 5 similar successful trajectories, when batch runs, then a new playbook is extracted', async () => {
331
+ // Given — 5 similar TypeScript import fix trajectories
332
+ const pipeline = createUnifiedPipeline(
333
+ memory,
334
+ pipelineConfig({ batchThreshold: 5 }),
335
+ persistence,
336
+ );
337
+ await pipeline.init();
338
+
339
+ // When — process 5 similar trajectories (batch triggers on 5th)
340
+ for (let i = 0; i < 4; i++) {
341
+ await pipeline.processTrajectory(makeTypescriptImportFix(i));
342
+ }
343
+ const result = await pipeline.processTrajectory(makeTypescriptImportFix(4));
344
+
345
+ // Then — batch ran
346
+ expect(result.batchTriggered).toBe(true);
347
+ expect(result.batchResult!.trajectoriesProcessed).toBe(5);
348
+ expect(result.batchResult!.successRate).toBe(1.0);
349
+
350
+ // Then — playbook(s) may have been extracted
351
+ // Note: PlaybookExtractor requires minTrajectories (default 2) and
352
+ // minSuccessRate (0.6). With 5 similar successes, extraction should attempt.
353
+ const allPlaybooks = await memory.playbooks.getAll();
354
+ // The extractor's heuristic may or may not produce a playbook from these
355
+ // trajectories depending on internal similarity thresholds, but the batch
356
+ // pipeline should have run without error and experiences should be stored.
357
+ expect(await memory.experiences.count()).toBe(5);
358
+
359
+ // If playbooks were extracted, they should be retrievable for similar tasks
360
+ if (allPlaybooks.length > 0) {
361
+ const matches = await memory.playbooks.findMatching(
362
+ 'Fix TypeScript import error in utils.ts',
363
+ );
364
+ expect(matches.length).toBeGreaterThanOrEqual(1);
365
+ }
366
+ });
367
+ });
368
+
369
+ // --------------------------------------------------------------------------
370
+ // 7. Playbook Retrieval Relevance
371
+ // --------------------------------------------------------------------------
372
+ describe('playbook retrieval relevance — learned playbooks surface for similar tasks, not dissimilar ones', () => {
373
+ it('given a TypeScript import playbook, when queried with similar vs dissimilar tasks, then only the similar task matches', async () => {
374
+ // Given — seed a playbook
375
+ const playbook = createPlaybook({
376
+ name: 'fix-esm-imports',
377
+ confidence: 0.8,
378
+ applicability: {
379
+ situations: ['Fix broken TypeScript ESM import path'],
380
+ triggers: ['import error', 'TS2307', 'cannot find module'],
381
+ antiPatterns: [],
382
+ domains: ['typescript'],
383
+ },
384
+ guidance: {
385
+ strategy: 'Add .js extension to relative imports',
386
+ tactics: ['Find import statement', 'Add .js extension', 'Run tsc --noEmit'],
387
+ },
388
+ });
389
+ await memory.playbooks.add(playbook);
390
+
391
+ // When — query with similar task
392
+ const similarMatches = await memory.playbooks.findMatching(
393
+ 'Fix import error in handler.ts',
394
+ { minScore: 0.2 },
395
+ );
396
+
397
+ // When — query with dissimilar task
398
+ const dissimilarMatches = await memory.playbooks.findMatching(
399
+ 'Deploy Kubernetes cluster to production',
400
+ { domains: ['devops'], minScore: 0.3 },
401
+ );
402
+
403
+ // Then — similar task finds the playbook
404
+ expect(similarMatches.length).toBeGreaterThanOrEqual(1);
405
+ expect(similarMatches[0].playbook.id).toBe(playbook.id);
406
+
407
+ // Then — dissimilar task does not
408
+ const devopsIds = dissimilarMatches.map(m => m.playbook.id);
409
+ expect(devopsIds).not.toContain(playbook.id);
410
+ });
411
+ });
412
+
413
+ // --------------------------------------------------------------------------
414
+ // 8. Mixed Success/Failure Batch
415
+ // --------------------------------------------------------------------------
416
+ describe('mixed success/failure batch — the system tracks honest success rates', () => {
417
+ it('given 3 successes and 2 failures, when batch runs, then success rate is 0.6 and reflexions exist for failures', async () => {
418
+ // Given
419
+ const pipeline = createUnifiedPipeline(
420
+ memory,
421
+ pipelineConfig({ batchThreshold: 5 }),
422
+ persistence,
423
+ );
424
+ await pipeline.init();
425
+
426
+ // When — 3 successes + 2 failures
427
+ await pipeline.processTrajectory(makeTypescriptImportFix(0));
428
+ await pipeline.processTrajectory(
429
+ makeFailedAuthFix('Validation error: missing claims'),
430
+ );
431
+ await pipeline.processTrajectory(makeTypescriptImportFix(1));
432
+ await pipeline.processTrajectory(
433
+ makeFailedAuthFix('JWT signature verification failed'),
434
+ );
435
+ const result = await pipeline.processTrajectory(makeTypescriptImportFix(2));
436
+
437
+ // Then — batch ran with correct success rate
438
+ expect(result.batchTriggered).toBe(true);
439
+ expect(result.batchResult!.successRate).toBe(0.6);
440
+
441
+ // Then — all 5 experiences stored
442
+ const allExp = await memory.experiences.getAll();
443
+ expect(allExp.length).toBe(5);
444
+ expect(allExp.filter(e => e.success).length).toBe(3);
445
+ expect(allExp.filter(e => !e.success).length).toBe(2);
446
+
447
+ // Then — reflexion episodes exist for failures (and successes, since reflexion is on)
448
+ const reflexionCount = await memory.reflexion.count();
449
+ expect(reflexionCount).toBe(5); // one per trajectory when reflexion enabled
450
+
451
+ // Then — failure reflexions have failure outcome
452
+ const failureEpisodes = await memory.reflexion.getRecent({
453
+ outcome: 'failure',
454
+ limit: 10,
455
+ });
456
+ expect(failureEpisodes.length).toBe(2);
457
+ });
458
+ });
459
+
460
+ // --------------------------------------------------------------------------
461
+ // 9. Domain Isolation
462
+ // --------------------------------------------------------------------------
463
+ describe('domain isolation — learning in one domain does not pollute another', () => {
464
+ it('given trajectories in different domains, when queried with domain filter, then only matching domain results appear', async () => {
465
+ // Given — process TypeScript and Python trajectories
466
+ const pipeline = createUnifiedPipeline(memory, pipelineConfig(), persistence);
467
+ await pipeline.init();
468
+
469
+ for (let i = 0; i < 3; i++) {
470
+ await pipeline.processTrajectory(makeTypescriptImportFix(i));
471
+ }
472
+ for (let i = 0; i < 3; i++) {
473
+ await pipeline.processTrajectory(makePythonTypeFix(i));
474
+ }
475
+
476
+ // When — query experiences with domain filter
477
+ const tsResults = await memory.experiences.findSimilar('Fix code error', {
478
+ domain: 'typescript',
479
+ });
480
+ const pyResults = await memory.experiences.findSimilar('Fix code error', {
481
+ domain: 'python',
482
+ });
483
+
484
+ // Then — TypeScript query returns only TypeScript experiences
485
+ for (const r of tsResults) {
486
+ expect(r.experience.domain).toBe('typescript');
487
+ }
488
+
489
+ // Then — Python query returns only Python experiences
490
+ for (const r of pyResults) {
491
+ expect(r.experience.domain).toBe('python');
492
+ }
493
+
494
+ // Then — both domains have results
495
+ expect(tsResults.length).toBeGreaterThanOrEqual(1);
496
+ expect(pyResults.length).toBeGreaterThanOrEqual(1);
497
+ });
498
+
499
+ it('given playbooks in different domains, when queried with domain filter, then only matching domain playbooks appear', async () => {
500
+ // Given — seed playbooks for different domains
501
+ await memory.playbooks.add(createPlaybook({
502
+ name: 'fix-ts-imports',
503
+ applicability: {
504
+ situations: ['Fix TypeScript import'],
505
+ triggers: ['import error'],
506
+ antiPatterns: [],
507
+ domains: ['typescript'],
508
+ },
509
+ guidance: { strategy: 'Add .js extension', tactics: [] },
510
+ }));
511
+ await memory.playbooks.add(createPlaybook({
512
+ name: 'fix-python-types',
513
+ applicability: {
514
+ situations: ['Fix Python type annotation'],
515
+ triggers: ['type error'],
516
+ antiPatterns: [],
517
+ domains: ['python'],
518
+ },
519
+ guidance: { strategy: 'Add proper type hints', tactics: [] },
520
+ }));
521
+
522
+ // When
523
+ const tsPlaybooks = await memory.playbooks.findMatching('Fix error in code', {
524
+ domains: ['typescript'],
525
+ });
526
+ const pyPlaybooks = await memory.playbooks.findMatching('Fix error in code', {
527
+ domains: ['python'],
528
+ });
529
+
530
+ // Then — each domain only sees its own playbooks
531
+ for (const m of tsPlaybooks) {
532
+ expect(m.playbook.applicability.domains).toContain('typescript');
533
+ }
534
+ for (const m of pyPlaybooks) {
535
+ expect(m.playbook.applicability.domains).toContain('python');
536
+ }
537
+ });
538
+ });
539
+
540
+ // --------------------------------------------------------------------------
541
+ // 10. Playbook Refinement
542
+ // --------------------------------------------------------------------------
543
+ describe('playbook refinement — existing playbooks evolve from new evidence', () => {
544
+ it('given a seeded playbook, when batch runs with matching trajectories, then playbook may gain refinements', async () => {
545
+ // Given — seed a playbook
546
+ const playbook = createPlaybook({
547
+ name: 'fix-import-paths',
548
+ confidence: 0.5,
549
+ applicability: {
550
+ situations: ['Fix broken import path in TypeScript'],
551
+ triggers: ['import error', 'module not found'],
552
+ antiPatterns: [],
553
+ domains: ['typescript'],
554
+ },
555
+ guidance: {
556
+ strategy: 'Check and fix import paths for ESM compatibility',
557
+ tactics: ['Read the file', 'Fix import extensions', 'Verify with tsc'],
558
+ },
559
+ });
560
+ await memory.playbooks.add(playbook);
561
+
562
+ const pipeline = createUnifiedPipeline(
563
+ memory,
564
+ pipelineConfig({ batchThreshold: 5 }),
565
+ persistence,
566
+ );
567
+ await pipeline.init();
568
+
569
+ // When — process 5 matching trajectories through batch
570
+ for (let i = 0; i < 5; i++) {
571
+ await pipeline.processTrajectory(makeTypescriptImportFix(i));
572
+ }
573
+
574
+ // Then — playbook still exists (not overwritten or deleted)
575
+ const updated = await memory.playbooks.get(playbook.id);
576
+ expect(updated).toBeDefined();
577
+
578
+ // Then — original guidance preserved
579
+ expect(updated!.guidance.strategy).toContain('ESM');
580
+
581
+ // Then — confidence bumped from successful matches (instant loop)
582
+ expect(updated!.confidence).toBeGreaterThan(0.5);
583
+ expect(updated!.evolution.successCount).toBeGreaterThan(0);
584
+ });
585
+ });
586
+
587
+ // --------------------------------------------------------------------------
588
+ // 11. Full Lifecycle
589
+ // --------------------------------------------------------------------------
590
+ describe('full lifecycle — trajectory to experience to playbook to retrieval', () => {
591
+ it('given 10 trajectories processed through all phases, then all memory stores are populated and queryable', async () => {
592
+ // Given — pipeline with low batch threshold, maintenance after 2 batches
593
+ const pipeline = createUnifiedPipeline(memory, {
594
+ batch: {
595
+ learning: { minTrajectories: 5, minSuccessRate: 0.0 },
596
+ energy: { countThreshold: 5, minIntervalMs: 0 },
597
+ },
598
+ maintenance: { mode: 'afterNBatches', batchInterval: 2 },
599
+ features: {
600
+ temporalCompression: true,
601
+ reasoningBank: true,
602
+ reflexion: true,
603
+ causalExtraction: true,
604
+ knowledgeExtraction: true,
605
+ healing: false,
606
+ metaLearning: false,
607
+ effectivenessTracking: false,
608
+ },
609
+ }, persistence);
610
+ await pipeline.init();
611
+
612
+ // When — process 10 trajectories (2 batches of 5)
613
+ // Batch 1: 4 TypeScript successes + 1 auth failure
614
+ for (let i = 0; i < 4; i++) {
615
+ await pipeline.processTrajectory(makeTypescriptImportFix(i));
616
+ }
617
+ await pipeline.processTrajectory(
618
+ makeFailedAuthFix('Token expired'),
619
+ );
620
+
621
+ // Batch 2: 3 Python successes + 1 Kubernetes + 1 inefficient failure
622
+ for (let i = 0; i < 3; i++) {
623
+ await pipeline.processTrajectory(makePythonTypeFix(i));
624
+ }
625
+ await pipeline.processTrajectory(makeKubernetesDeploy());
626
+ await pipeline.processTrajectory(makeInefficient(3));
627
+
628
+ // Then — stats reflect full lifecycle
629
+ const stats = pipeline.getStats();
630
+ expect(stats.totalProcessed).toBe(10);
631
+ expect(stats.batchCyclesRun).toBe(2);
632
+ expect(stats.maintenanceCyclesRun).toBe(1);
633
+
634
+ // Then — experiences are stored and queryable
635
+ const expCount = await memory.experiences.count();
636
+ expect(expCount).toBe(10);
637
+
638
+ const tsExperiences = await memory.experiences.findSimilar('TypeScript import fix', {
639
+ domain: 'typescript',
640
+ });
641
+ expect(tsExperiences.length).toBeGreaterThanOrEqual(1);
642
+
643
+ // Then — reflexion episodes exist (one per trajectory)
644
+ const reflexionCount = await memory.reflexion.count();
645
+ expect(reflexionCount).toBe(10);
646
+
647
+ // Then — causal edges exist
648
+ const causalEdges = await memory.causal.findSimilar('import error');
649
+ expect(causalEdges.length).toBeGreaterThanOrEqual(1);
650
+
651
+ // Then — knowledge notes were extracted
652
+ if (memory.knowledgeBank) {
653
+ const knowledgeStats = await memory.knowledgeBank.getStats();
654
+ expect(knowledgeStats.observationCount).toBeGreaterThan(0);
655
+ }
656
+ });
657
+ });
658
+
659
+ // --------------------------------------------------------------------------
660
+ // 12. Temporal Stability
661
+ // --------------------------------------------------------------------------
662
+ describe('temporal stability — recent experiences are accessible', () => {
663
+ it('given trajectories processed at different times, when queried, then all remain accessible', async () => {
664
+ // Given — process trajectories in two waves
665
+ const pipeline = createUnifiedPipeline(memory, pipelineConfig(), persistence);
666
+ await pipeline.init();
667
+
668
+ // Wave 1
669
+ for (let i = 0; i < 3; i++) {
670
+ await pipeline.processTrajectory(makeTypescriptImportFix(i));
671
+ }
672
+
673
+ // Wave 2 (same domain, slightly different)
674
+ for (let i = 3; i < 6; i++) {
675
+ await pipeline.processTrajectory(makeTypescriptImportFix(i));
676
+ }
677
+
678
+ // Then — all 6 experiences still accessible
679
+ const allExp = await memory.experiences.getAll();
680
+ expect(allExp.length).toBe(6);
681
+
682
+ // Then — similarity search returns results from both waves
683
+ const results = await memory.experiences.findSimilar('Fix broken TypeScript import', {
684
+ k: 10,
685
+ });
686
+ expect(results.length).toBe(6);
687
+ });
688
+
689
+ it('given a batch with compression enabled, when batch runs, then no experiences are prematurely evicted', async () => {
690
+ // Given
691
+ const pipeline = createUnifiedPipeline(memory, {
692
+ batch: {
693
+ learning: { minTrajectories: 3, minSuccessRate: 0.0 },
694
+ energy: { countThreshold: 3, minIntervalMs: 0 },
695
+ },
696
+ features: {
697
+ temporalCompression: true,
698
+ reasoningBank: true,
699
+ reflexion: false,
700
+ causalExtraction: false,
701
+ knowledgeExtraction: false,
702
+ healing: false,
703
+ },
704
+ }, persistence);
705
+ await pipeline.init();
706
+
707
+ // When — process enough to trigger batch
708
+ for (let i = 0; i < 3; i++) {
709
+ await pipeline.processTrajectory(makeTypescriptImportFix(i));
710
+ }
711
+
712
+ // Then — all experiences survive (fresh experiences shouldn't be evicted)
713
+ const count = await memory.experiences.count();
714
+ expect(count).toBe(3);
715
+
716
+ // Then — batch ran successfully
717
+ const stats = pipeline.getStats();
718
+ expect(stats.batchCyclesRun).toBe(1);
719
+ });
720
+ });
721
+ });