cognitive-core 0.2.0 → 0.2.2

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 (397) hide show
  1. package/.claude/settings.json +111 -2
  2. package/.sessionlog/settings.json +4 -0
  3. package/dist/atlas.d.ts +10 -0
  4. package/dist/atlas.d.ts.map +1 -1
  5. package/dist/atlas.js +65 -0
  6. package/dist/atlas.js.map +1 -1
  7. package/dist/index.d.ts +1 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +5 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/learning/index.d.ts +1 -1
  12. package/dist/learning/index.d.ts.map +1 -1
  13. package/dist/learning/index.js.map +1 -1
  14. package/dist/learning/pipeline.d.ts +4 -31
  15. package/dist/learning/pipeline.d.ts.map +1 -1
  16. package/dist/learning/pipeline.js +12 -64
  17. package/dist/learning/pipeline.js.map +1 -1
  18. package/dist/learning/unified-pipeline.d.ts +30 -0
  19. package/dist/learning/unified-pipeline.d.ts.map +1 -1
  20. package/dist/learning/unified-pipeline.js +207 -0
  21. package/dist/learning/unified-pipeline.js.map +1 -1
  22. package/dist/memory/candidate-retrieval.d.ts.map +1 -1
  23. package/dist/memory/candidate-retrieval.js +3 -1
  24. package/dist/memory/candidate-retrieval.js.map +1 -1
  25. package/dist/memory/curated-loader.d.ts +21 -4
  26. package/dist/memory/curated-loader.d.ts.map +1 -1
  27. package/dist/memory/curated-loader.js +53 -16
  28. package/dist/memory/curated-loader.js.map +1 -1
  29. package/dist/memory/index.d.ts +2 -1
  30. package/dist/memory/index.d.ts.map +1 -1
  31. package/dist/memory/index.js +3 -1
  32. package/dist/memory/index.js.map +1 -1
  33. package/dist/memory/playbook.d.ts +6 -0
  34. package/dist/memory/playbook.d.ts.map +1 -1
  35. package/dist/memory/playbook.js +15 -0
  36. package/dist/memory/playbook.js.map +1 -1
  37. package/dist/memory/source-resolver.d.ts +120 -0
  38. package/dist/memory/source-resolver.d.ts.map +1 -0
  39. package/dist/memory/source-resolver.js +300 -0
  40. package/dist/memory/source-resolver.js.map +1 -0
  41. package/dist/types/config.d.ts +141 -0
  42. package/dist/types/config.d.ts.map +1 -1
  43. package/dist/types/config.js +40 -0
  44. package/dist/types/config.js.map +1 -1
  45. package/dist/types/index.d.ts +1 -1
  46. package/dist/types/index.d.ts.map +1 -1
  47. package/dist/types/index.js +1 -1
  48. package/dist/types/index.js.map +1 -1
  49. package/dist/utils/error-classifier.js +8 -8
  50. package/dist/utils/error-classifier.js.map +1 -1
  51. package/dist/workspace/efficacy-toolkit.d.ts +164 -0
  52. package/dist/workspace/efficacy-toolkit.d.ts.map +1 -0
  53. package/dist/workspace/efficacy-toolkit.js +281 -0
  54. package/dist/workspace/efficacy-toolkit.js.map +1 -0
  55. package/dist/workspace/index.d.ts +2 -1
  56. package/dist/workspace/index.d.ts.map +1 -1
  57. package/dist/workspace/index.js +3 -1
  58. package/dist/workspace/index.js.map +1 -1
  59. package/dist/workspace/templates/index.d.ts +3 -0
  60. package/dist/workspace/templates/index.d.ts.map +1 -1
  61. package/dist/workspace/templates/index.js +6 -0
  62. package/dist/workspace/templates/index.js.map +1 -1
  63. package/dist/workspace/templates/playbook-decay-detection.d.ts +46 -0
  64. package/dist/workspace/templates/playbook-decay-detection.d.ts.map +1 -0
  65. package/dist/workspace/templates/playbook-decay-detection.js +197 -0
  66. package/dist/workspace/templates/playbook-decay-detection.js.map +1 -0
  67. package/dist/workspace/templates/playbook-efficacy-audit.d.ts +46 -0
  68. package/dist/workspace/templates/playbook-efficacy-audit.d.ts.map +1 -0
  69. package/dist/workspace/templates/playbook-efficacy-audit.js +160 -0
  70. package/dist/workspace/templates/playbook-efficacy-audit.js.map +1 -0
  71. package/dist/workspace/templates/playbook-lifecycle-review.d.ts +51 -0
  72. package/dist/workspace/templates/playbook-lifecycle-review.d.ts.map +1 -0
  73. package/dist/workspace/templates/playbook-lifecycle-review.js +187 -0
  74. package/dist/workspace/templates/playbook-lifecycle-review.js.map +1 -0
  75. package/dist/workspace/types.d.ts +12 -54
  76. package/dist/workspace/types.d.ts.map +1 -1
  77. package/dist/workspace/types.js.map +1 -1
  78. package/package.json +8 -2
  79. package/playbooks/compound-engineering/adversarial-review.json +51 -0
  80. package/playbooks/compound-engineering/agent-native-architecture.json +59 -0
  81. package/playbooks/compound-engineering/agent-native-review.json +54 -0
  82. package/playbooks/compound-engineering/api-contract-review.json +52 -0
  83. package/playbooks/compound-engineering/brainstorm-requirements.json +55 -0
  84. package/playbooks/compound-engineering/bug-reproduction.json +62 -0
  85. package/playbooks/compound-engineering/confidence-calibration.json +49 -0
  86. package/playbooks/compound-engineering/correctness-review.json +49 -0
  87. package/playbooks/compound-engineering/data-migration-safety.json +59 -0
  88. package/playbooks/compound-engineering/deployment-verification.json +63 -0
  89. package/playbooks/compound-engineering/error-recovery-patterns.json +53 -0
  90. package/playbooks/compound-engineering/implementation-planning.json +64 -0
  91. package/playbooks/compound-engineering/issue-pattern-analysis.json +53 -0
  92. package/playbooks/compound-engineering/knowledge-compounding.json +63 -0
  93. package/playbooks/compound-engineering/learnings-research.json +54 -0
  94. package/playbooks/compound-engineering/maintainability-review.json +49 -0
  95. package/playbooks/compound-engineering/performance-review.json +54 -0
  96. package/playbooks/compound-engineering/plan-adversarial-review.json +56 -0
  97. package/playbooks/compound-engineering/plan-feasibility-review.json +56 -0
  98. package/playbooks/compound-engineering/project-standards-review.json +52 -0
  99. package/playbooks/compound-engineering/reliability-review.json +53 -0
  100. package/playbooks/compound-engineering/review-orchestration.json +64 -0
  101. package/playbooks/compound-engineering/security-review.json +54 -0
  102. package/playbooks/compound-engineering/systematic-execution.json +64 -0
  103. package/playbooks/compound-engineering/testing-review.json +50 -0
  104. package/src/atlas.ts +96 -0
  105. package/src/index.ts +27 -0
  106. package/src/learning/index.ts +1 -0
  107. package/src/learning/unified-pipeline.ts +271 -1
  108. package/src/memory/candidate-retrieval.ts +2 -1
  109. package/src/memory/curated-loader.ts +69 -16
  110. package/src/memory/index.ts +16 -0
  111. package/src/memory/playbook.ts +19 -0
  112. package/src/memory/source-resolver.ts +422 -0
  113. package/src/types/config.ts +46 -0
  114. package/src/types/index.ts +4 -0
  115. package/src/utils/error-classifier.ts +8 -8
  116. package/src/workspace/efficacy-toolkit.ts +496 -0
  117. package/src/workspace/index.ts +29 -0
  118. package/src/workspace/templates/index.ts +24 -0
  119. package/src/workspace/templates/playbook-decay-detection.ts +272 -0
  120. package/src/workspace/templates/playbook-efficacy-audit.ts +246 -0
  121. package/src/workspace/templates/playbook-lifecycle-review.ts +274 -0
  122. package/src/workspace/types.ts +22 -78
  123. package/tests/fixtures/behavioral-trajectories.ts +210 -0
  124. package/tests/integration/curated-sources-e2e.test.ts +502 -0
  125. package/tests/integration/pipeline-data-correctness.test.ts +794 -0
  126. package/tests/learning/meta-learner.test.ts +418 -0
  127. package/tests/learning/pipeline-memory-updates.test.ts +721 -0
  128. package/tests/learning/unified-pipeline-efficacy.test.ts +232 -0
  129. package/tests/memory/candidate-retrieval.test.ts +167 -0
  130. package/tests/memory/compound-engineering-seed.test.ts +338 -0
  131. package/tests/memory/curated-loader-extended.test.ts +225 -0
  132. package/tests/memory/meta.test.ts +399 -0
  133. package/tests/memory/playbook-quality-validation.test.ts +430 -0
  134. package/tests/memory/source-resolver.test.ts +700 -0
  135. package/tests/search/evaluator.test.ts +257 -0
  136. package/tests/search/verification-runner.test.ts +357 -0
  137. package/tests/utils/error-classifier.test.ts +149 -0
  138. package/tests/utils/trajectory-helpers.test.ts +163 -0
  139. package/tests/workspace/efficacy-toolkit.test.ts +404 -0
  140. package/tests/workspace/templates/playbook-efficacy.test.ts +377 -0
  141. package/.claude/settings.local.json +0 -11
  142. package/dist/learning/llm-extractor.d.ts +0 -88
  143. package/dist/learning/llm-extractor.d.ts.map +0 -1
  144. package/dist/learning/llm-extractor.js +0 -372
  145. package/dist/learning/llm-extractor.js.map +0 -1
  146. package/dist/learning/loop-coordinator.d.ts +0 -61
  147. package/dist/learning/loop-coordinator.d.ts.map +0 -1
  148. package/dist/learning/loop-coordinator.js +0 -96
  149. package/dist/learning/loop-coordinator.js.map +0 -1
  150. package/references/agent-workspace/CLAUDE.md +0 -74
  151. package/references/agent-workspace/README.md +0 -587
  152. package/references/agent-workspace/media/banner.png +0 -0
  153. package/references/agent-workspace/package-lock.json +0 -2061
  154. package/references/agent-workspace/package.json +0 -54
  155. package/references/agent-workspace/src/handle.ts +0 -122
  156. package/references/agent-workspace/src/index.ts +0 -32
  157. package/references/agent-workspace/src/manager.ts +0 -102
  158. package/references/agent-workspace/src/readers/json.ts +0 -71
  159. package/references/agent-workspace/src/readers/markdown.ts +0 -37
  160. package/references/agent-workspace/src/readers/raw.ts +0 -27
  161. package/references/agent-workspace/src/types.ts +0 -68
  162. package/references/agent-workspace/src/validation.ts +0 -93
  163. package/references/agent-workspace/src/writers/json.ts +0 -17
  164. package/references/agent-workspace/src/writers/markdown.ts +0 -27
  165. package/references/agent-workspace/src/writers/raw.ts +0 -22
  166. package/references/agent-workspace/tests/errors.test.ts +0 -652
  167. package/references/agent-workspace/tests/handle.test.ts +0 -144
  168. package/references/agent-workspace/tests/manager.test.ts +0 -124
  169. package/references/agent-workspace/tests/readers.test.ts +0 -205
  170. package/references/agent-workspace/tests/validation.test.ts +0 -196
  171. package/references/agent-workspace/tests/writers.test.ts +0 -108
  172. package/references/agent-workspace/tsconfig.json +0 -20
  173. package/references/agent-workspace/tsup.config.ts +0 -9
  174. package/references/minimem/.claude/settings.json +0 -7
  175. package/references/minimem/.sudocode/issues.jsonl +0 -18
  176. package/references/minimem/.sudocode/specs.jsonl +0 -1
  177. package/references/minimem/CLAUDE.md +0 -310
  178. package/references/minimem/README.md +0 -556
  179. package/references/minimem/claude-plugin/.claude-plugin/plugin.json +0 -10
  180. package/references/minimem/claude-plugin/.mcp.json +0 -7
  181. package/references/minimem/claude-plugin/README.md +0 -158
  182. package/references/minimem/claude-plugin/commands/recall.md +0 -47
  183. package/references/minimem/claude-plugin/commands/remember.md +0 -41
  184. package/references/minimem/claude-plugin/hooks/__tests__/hooks.test.ts +0 -272
  185. package/references/minimem/claude-plugin/hooks/hooks.json +0 -27
  186. package/references/minimem/claude-plugin/hooks/session-end.sh +0 -86
  187. package/references/minimem/claude-plugin/hooks/session-start.sh +0 -85
  188. package/references/minimem/claude-plugin/skills/memory/SKILL.md +0 -108
  189. package/references/minimem/package-lock.json +0 -5373
  190. package/references/minimem/package.json +0 -60
  191. package/references/minimem/scripts/postbuild.js +0 -35
  192. package/references/minimem/src/__tests__/edge-cases.test.ts +0 -371
  193. package/references/minimem/src/__tests__/errors.test.ts +0 -265
  194. package/references/minimem/src/__tests__/helpers.ts +0 -199
  195. package/references/minimem/src/__tests__/internal.test.ts +0 -407
  196. package/references/minimem/src/__tests__/knowledge.test.ts +0 -287
  197. package/references/minimem/src/__tests__/minimem.integration.test.ts +0 -1127
  198. package/references/minimem/src/__tests__/session.test.ts +0 -190
  199. package/references/minimem/src/cli/__tests__/commands.test.ts +0 -759
  200. package/references/minimem/src/cli/commands/__tests__/conflicts.test.ts +0 -141
  201. package/references/minimem/src/cli/commands/append.ts +0 -76
  202. package/references/minimem/src/cli/commands/config.ts +0 -262
  203. package/references/minimem/src/cli/commands/conflicts.ts +0 -413
  204. package/references/minimem/src/cli/commands/daemon.ts +0 -169
  205. package/references/minimem/src/cli/commands/index.ts +0 -12
  206. package/references/minimem/src/cli/commands/init.ts +0 -88
  207. package/references/minimem/src/cli/commands/mcp.ts +0 -177
  208. package/references/minimem/src/cli/commands/push-pull.ts +0 -213
  209. package/references/minimem/src/cli/commands/search.ts +0 -158
  210. package/references/minimem/src/cli/commands/status.ts +0 -84
  211. package/references/minimem/src/cli/commands/sync-init.ts +0 -290
  212. package/references/minimem/src/cli/commands/sync.ts +0 -70
  213. package/references/minimem/src/cli/commands/upsert.ts +0 -197
  214. package/references/minimem/src/cli/config.ts +0 -584
  215. package/references/minimem/src/cli/index.ts +0 -264
  216. package/references/minimem/src/cli/shared.ts +0 -161
  217. package/references/minimem/src/cli/sync/__tests__/central.test.ts +0 -152
  218. package/references/minimem/src/cli/sync/__tests__/conflicts.test.ts +0 -209
  219. package/references/minimem/src/cli/sync/__tests__/daemon.test.ts +0 -118
  220. package/references/minimem/src/cli/sync/__tests__/detection.test.ts +0 -207
  221. package/references/minimem/src/cli/sync/__tests__/integration.test.ts +0 -476
  222. package/references/minimem/src/cli/sync/__tests__/registry.test.ts +0 -363
  223. package/references/minimem/src/cli/sync/__tests__/state.test.ts +0 -255
  224. package/references/minimem/src/cli/sync/__tests__/validation.test.ts +0 -193
  225. package/references/minimem/src/cli/sync/__tests__/watcher.test.ts +0 -178
  226. package/references/minimem/src/cli/sync/central.ts +0 -292
  227. package/references/minimem/src/cli/sync/conflicts.ts +0 -204
  228. package/references/minimem/src/cli/sync/daemon.ts +0 -407
  229. package/references/minimem/src/cli/sync/detection.ts +0 -138
  230. package/references/minimem/src/cli/sync/index.ts +0 -107
  231. package/references/minimem/src/cli/sync/operations.ts +0 -373
  232. package/references/minimem/src/cli/sync/registry.ts +0 -279
  233. package/references/minimem/src/cli/sync/state.ts +0 -355
  234. package/references/minimem/src/cli/sync/validation.ts +0 -206
  235. package/references/minimem/src/cli/sync/watcher.ts +0 -234
  236. package/references/minimem/src/cli/version.ts +0 -34
  237. package/references/minimem/src/core/index.ts +0 -9
  238. package/references/minimem/src/core/indexer.ts +0 -628
  239. package/references/minimem/src/core/searcher.ts +0 -221
  240. package/references/minimem/src/db/schema.ts +0 -183
  241. package/references/minimem/src/db/sqlite-vec.ts +0 -24
  242. package/references/minimem/src/embeddings/__tests__/embeddings.test.ts +0 -431
  243. package/references/minimem/src/embeddings/batch-gemini.ts +0 -392
  244. package/references/minimem/src/embeddings/batch-openai.ts +0 -409
  245. package/references/minimem/src/embeddings/embeddings.ts +0 -434
  246. package/references/minimem/src/index.ts +0 -109
  247. package/references/minimem/src/internal.ts +0 -299
  248. package/references/minimem/src/minimem.ts +0 -1276
  249. package/references/minimem/src/search/__tests__/hybrid.test.ts +0 -247
  250. package/references/minimem/src/search/graph.ts +0 -234
  251. package/references/minimem/src/search/hybrid.ts +0 -151
  252. package/references/minimem/src/search/search.ts +0 -256
  253. package/references/minimem/src/server/__tests__/mcp.test.ts +0 -341
  254. package/references/minimem/src/server/__tests__/tools.test.ts +0 -364
  255. package/references/minimem/src/server/mcp.ts +0 -326
  256. package/references/minimem/src/server/tools.ts +0 -720
  257. package/references/minimem/src/session.ts +0 -460
  258. package/references/minimem/tsconfig.json +0 -19
  259. package/references/minimem/tsup.config.ts +0 -26
  260. package/references/minimem/vitest.config.ts +0 -24
  261. package/references/sessionlog/.husky/pre-commit +0 -1
  262. package/references/sessionlog/.lintstagedrc.json +0 -4
  263. package/references/sessionlog/.prettierignore +0 -4
  264. package/references/sessionlog/.prettierrc.json +0 -11
  265. package/references/sessionlog/LICENSE +0 -21
  266. package/references/sessionlog/README.md +0 -453
  267. package/references/sessionlog/eslint.config.js +0 -58
  268. package/references/sessionlog/package-lock.json +0 -3672
  269. package/references/sessionlog/package.json +0 -65
  270. package/references/sessionlog/src/__tests__/agent-hooks.test.ts +0 -570
  271. package/references/sessionlog/src/__tests__/agent-registry.test.ts +0 -127
  272. package/references/sessionlog/src/__tests__/claude-code-hooks.test.ts +0 -225
  273. package/references/sessionlog/src/__tests__/claude-generator.test.ts +0 -46
  274. package/references/sessionlog/src/__tests__/commit-msg.test.ts +0 -86
  275. package/references/sessionlog/src/__tests__/cursor-agent.test.ts +0 -224
  276. package/references/sessionlog/src/__tests__/e2e-live.test.ts +0 -890
  277. package/references/sessionlog/src/__tests__/event-log.test.ts +0 -183
  278. package/references/sessionlog/src/__tests__/flush-sentinel.test.ts +0 -105
  279. package/references/sessionlog/src/__tests__/gemini-agent.test.ts +0 -375
  280. package/references/sessionlog/src/__tests__/git-hooks.test.ts +0 -78
  281. package/references/sessionlog/src/__tests__/hook-managers.test.ts +0 -121
  282. package/references/sessionlog/src/__tests__/lifecycle-tasks.test.ts +0 -759
  283. package/references/sessionlog/src/__tests__/opencode-agent.test.ts +0 -338
  284. package/references/sessionlog/src/__tests__/redaction.test.ts +0 -136
  285. package/references/sessionlog/src/__tests__/session-repo.test.ts +0 -353
  286. package/references/sessionlog/src/__tests__/session-store.test.ts +0 -166
  287. package/references/sessionlog/src/__tests__/setup-ccweb.test.ts +0 -466
  288. package/references/sessionlog/src/__tests__/skill-live.test.ts +0 -461
  289. package/references/sessionlog/src/__tests__/summarize.test.ts +0 -348
  290. package/references/sessionlog/src/__tests__/task-plan-e2e.test.ts +0 -610
  291. package/references/sessionlog/src/__tests__/task-plan-live.test.ts +0 -632
  292. package/references/sessionlog/src/__tests__/transcript-timestamp.test.ts +0 -121
  293. package/references/sessionlog/src/__tests__/types.test.ts +0 -166
  294. package/references/sessionlog/src/__tests__/utils.test.ts +0 -333
  295. package/references/sessionlog/src/__tests__/validation.test.ts +0 -103
  296. package/references/sessionlog/src/__tests__/worktree.test.ts +0 -57
  297. package/references/sessionlog/src/agent/agents/claude-code.ts +0 -1089
  298. package/references/sessionlog/src/agent/agents/cursor.ts +0 -361
  299. package/references/sessionlog/src/agent/agents/gemini-cli.ts +0 -632
  300. package/references/sessionlog/src/agent/agents/opencode.ts +0 -540
  301. package/references/sessionlog/src/agent/registry.ts +0 -143
  302. package/references/sessionlog/src/agent/session-types.ts +0 -113
  303. package/references/sessionlog/src/agent/types.ts +0 -220
  304. package/references/sessionlog/src/cli.ts +0 -597
  305. package/references/sessionlog/src/commands/clean.ts +0 -133
  306. package/references/sessionlog/src/commands/disable.ts +0 -84
  307. package/references/sessionlog/src/commands/doctor.ts +0 -145
  308. package/references/sessionlog/src/commands/enable.ts +0 -202
  309. package/references/sessionlog/src/commands/explain.ts +0 -261
  310. package/references/sessionlog/src/commands/reset.ts +0 -105
  311. package/references/sessionlog/src/commands/resume.ts +0 -180
  312. package/references/sessionlog/src/commands/rewind.ts +0 -195
  313. package/references/sessionlog/src/commands/setup-ccweb.ts +0 -275
  314. package/references/sessionlog/src/commands/status.ts +0 -172
  315. package/references/sessionlog/src/config.ts +0 -165
  316. package/references/sessionlog/src/events/event-log.ts +0 -126
  317. package/references/sessionlog/src/git-operations.ts +0 -558
  318. package/references/sessionlog/src/hooks/git-hooks.ts +0 -165
  319. package/references/sessionlog/src/hooks/lifecycle.ts +0 -391
  320. package/references/sessionlog/src/index.ts +0 -650
  321. package/references/sessionlog/src/security/redaction.ts +0 -283
  322. package/references/sessionlog/src/session/state-machine.ts +0 -452
  323. package/references/sessionlog/src/store/checkpoint-store.ts +0 -509
  324. package/references/sessionlog/src/store/native-store.ts +0 -173
  325. package/references/sessionlog/src/store/provider-types.ts +0 -99
  326. package/references/sessionlog/src/store/session-store.ts +0 -266
  327. package/references/sessionlog/src/strategy/attribution.ts +0 -296
  328. package/references/sessionlog/src/strategy/common.ts +0 -207
  329. package/references/sessionlog/src/strategy/content-overlap.ts +0 -228
  330. package/references/sessionlog/src/strategy/manual-commit.ts +0 -988
  331. package/references/sessionlog/src/strategy/types.ts +0 -279
  332. package/references/sessionlog/src/summarize/claude-generator.ts +0 -115
  333. package/references/sessionlog/src/summarize/summarize.ts +0 -432
  334. package/references/sessionlog/src/types.ts +0 -508
  335. package/references/sessionlog/src/utils/chunk-files.ts +0 -49
  336. package/references/sessionlog/src/utils/commit-message.ts +0 -65
  337. package/references/sessionlog/src/utils/detect-agent.ts +0 -36
  338. package/references/sessionlog/src/utils/hook-managers.ts +0 -125
  339. package/references/sessionlog/src/utils/ide-tags.ts +0 -32
  340. package/references/sessionlog/src/utils/paths.ts +0 -79
  341. package/references/sessionlog/src/utils/preview-rewind.ts +0 -80
  342. package/references/sessionlog/src/utils/rewind-conflict.ts +0 -121
  343. package/references/sessionlog/src/utils/shadow-branch.ts +0 -109
  344. package/references/sessionlog/src/utils/string-utils.ts +0 -46
  345. package/references/sessionlog/src/utils/todo-extract.ts +0 -188
  346. package/references/sessionlog/src/utils/trailers.ts +0 -187
  347. package/references/sessionlog/src/utils/transcript-parse.ts +0 -177
  348. package/references/sessionlog/src/utils/transcript-timestamp.ts +0 -59
  349. package/references/sessionlog/src/utils/tree-ops.ts +0 -219
  350. package/references/sessionlog/src/utils/tty.ts +0 -72
  351. package/references/sessionlog/src/utils/validation.ts +0 -65
  352. package/references/sessionlog/src/utils/worktree.ts +0 -58
  353. package/references/sessionlog/src/wire-types.ts +0 -59
  354. package/references/sessionlog/templates/setup-env.sh +0 -153
  355. package/references/sessionlog/tsconfig.json +0 -18
  356. package/references/sessionlog/vitest.config.ts +0 -12
  357. package/references/skill-tree/.claude/settings.json +0 -6
  358. package/references/skill-tree/.sudocode/issues.jsonl +0 -19
  359. package/references/skill-tree/.sudocode/specs.jsonl +0 -3
  360. package/references/skill-tree/CLAUDE.md +0 -126
  361. package/references/skill-tree/README.md +0 -372
  362. package/references/skill-tree/docs/GAPS_v1.md +0 -221
  363. package/references/skill-tree/docs/INTEGRATION_PLAN.md +0 -467
  364. package/references/skill-tree/docs/TODOS.md +0 -91
  365. package/references/skill-tree/docs/anthropic_skill_guide.md +0 -1364
  366. package/references/skill-tree/docs/design/federated-skill-trees.md +0 -524
  367. package/references/skill-tree/docs/design/multi-agent-sync.md +0 -759
  368. package/references/skill-tree/docs/scraper/BRAINSTORM.md +0 -583
  369. package/references/skill-tree/docs/scraper/POC_PLAN.md +0 -420
  370. package/references/skill-tree/docs/scraper/README.md +0 -170
  371. package/references/skill-tree/examples/basic-usage.ts +0 -164
  372. package/references/skill-tree/package-lock.json +0 -1852
  373. package/references/skill-tree/package.json +0 -66
  374. package/references/skill-tree/scraper/README.md +0 -123
  375. package/references/skill-tree/scraper/docs/DESIGN.md +0 -683
  376. package/references/skill-tree/scraper/docs/PLAN.md +0 -336
  377. package/references/skill-tree/scraper/drizzle.config.ts +0 -10
  378. package/references/skill-tree/scraper/package-lock.json +0 -6329
  379. package/references/skill-tree/scraper/package.json +0 -68
  380. package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-description.md +0 -7
  381. package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-name.md +0 -7
  382. package/references/skill-tree/scraper/test/fixtures/minimal-skill/SKILL.md +0 -27
  383. package/references/skill-tree/scraper/test/fixtures/skill-json/SKILL.json +0 -21
  384. package/references/skill-tree/scraper/test/fixtures/skill-with-meta/SKILL.md +0 -54
  385. package/references/skill-tree/scraper/test/fixtures/skill-with-meta/_meta.json +0 -24
  386. package/references/skill-tree/scraper/test/fixtures/valid-skill/SKILL.md +0 -93
  387. package/references/skill-tree/scraper/test/fixtures/valid-skill/_meta.json +0 -22
  388. package/references/skill-tree/scraper/tsup.config.ts +0 -14
  389. package/references/skill-tree/scraper/vitest.config.ts +0 -17
  390. package/references/skill-tree/scripts/convert-to-vitest.ts +0 -166
  391. package/references/skill-tree/skills/skill-writer/SKILL.md +0 -339
  392. package/references/skill-tree/skills/skill-writer/references/examples.md +0 -326
  393. package/references/skill-tree/skills/skill-writer/references/patterns.md +0 -210
  394. package/references/skill-tree/skills/skill-writer/references/quality-checklist.md +0 -123
  395. package/references/skill-tree/test/run-all.ts +0 -106
  396. package/references/skill-tree/test/utils.ts +0 -128
  397. package/references/skill-tree/vitest.config.ts +0 -16
@@ -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
+ });