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,794 @@
1
+ /**
2
+ * Pipeline Data-Correctness Integration Tests
3
+ *
4
+ * Validates that the learning pipeline properly:
5
+ * 1. Identifies improvement points from trajectories (analysis)
6
+ * 2. Writes through to memory stores (experience, playbook, causal, reflexion)
7
+ * 3. Makes stored data retrievable via the correct query paths
8
+ * 4. Handles batch extraction → playbook library indexing
9
+ * 5. Coordinates hot + cold paths correctly
10
+ */
11
+
12
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
13
+ import { InstantLoop } from '../../src/learning/instant-loop.js';
14
+ import { LearningPipeline, createLearningPipeline } from '../../src/learning/pipeline.js';
15
+ import { LoopCoordinator } from '../../src/learning/loop-coordinator.js';
16
+ import { MemorySystem } from '../../src/memory/system.js';
17
+ import { createPlaybook } from '../../src/types/playbook.js';
18
+ import { createTrajectory, type Trajectory } from '../../src/types/trajectory.js';
19
+ import { createTask } from '../../src/types/task.js';
20
+ import { createStep } from '../../src/types/step.js';
21
+ import { successOutcome, failureOutcome } from '../../src/types/outcome.js';
22
+ import { createSqlitePersistence, type SqlitePersistence } from '../../src/persistence/index.js';
23
+ import { mkdtemp, rm } from 'node:fs/promises';
24
+ import { join } from 'node:path';
25
+ import { tmpdir } from 'node:os';
26
+
27
+ // ---------------------------------------------------------------------------
28
+ // Helpers
29
+ // ---------------------------------------------------------------------------
30
+
31
+ function makeSuccessTrajectory(opts?: {
32
+ domain?: string;
33
+ description?: string;
34
+ id?: string;
35
+ }): Trajectory {
36
+ return createTrajectory({
37
+ id: opts?.id,
38
+ task: createTask({
39
+ description: opts?.description ?? 'Fix the broken authentication module',
40
+ domain: opts?.domain ?? 'typescript',
41
+ }),
42
+ steps: [
43
+ createStep({
44
+ thought: 'Need to read the auth module',
45
+ action: 'ReadFile src/auth.ts',
46
+ observation: 'File content: export function login() { /* ... */ }',
47
+ }),
48
+ createStep({
49
+ thought: 'Found the bug — missing null check',
50
+ action: 'EditFile src/auth.ts',
51
+ observation: 'File updated: added null check for user token',
52
+ metadata: { attributionScore: 0.9 },
53
+ }),
54
+ createStep({
55
+ action: 'RunTests npm test',
56
+ observation: 'All 42 tests passed',
57
+ }),
58
+ ],
59
+ outcome: successOutcome('Added null check in login() to prevent crash on undefined token'),
60
+ agentId: 'test-agent',
61
+ });
62
+ }
63
+
64
+ function makeFailureTrajectory(opts?: {
65
+ domain?: string;
66
+ description?: string;
67
+ errorInfo?: string;
68
+ }): Trajectory {
69
+ return createTrajectory({
70
+ task: createTask({
71
+ description: opts?.description ?? 'Fix the database connection timeout',
72
+ domain: opts?.domain ?? 'typescript',
73
+ }),
74
+ steps: [
75
+ createStep({
76
+ thought: 'Check db config',
77
+ action: 'ReadFile src/db.ts',
78
+ observation: 'File content: const pool = createPool({ timeout: 5000 })',
79
+ }),
80
+ createStep({
81
+ thought: 'Try increasing timeout',
82
+ action: 'EditFile src/db.ts',
83
+ observation: 'File updated: timeout: 30000',
84
+ }),
85
+ ],
86
+ outcome: failureOutcome(opts?.errorInfo ?? 'ECONNREFUSED 127.0.0.1:5432 - database server not running'),
87
+ agentId: 'test-agent',
88
+ });
89
+ }
90
+
91
+ // ---------------------------------------------------------------------------
92
+ // Test suite
93
+ // ---------------------------------------------------------------------------
94
+
95
+ describe('Pipeline Data Correctness', () => {
96
+ let tempDir: string;
97
+ let persistence: SqlitePersistence;
98
+ let memory: MemorySystem;
99
+
100
+ beforeEach(async () => {
101
+ tempDir = await mkdtemp(join(tmpdir(), 'atlas-data-correctness-'));
102
+ persistence = createSqlitePersistence({ baseDir: tempDir });
103
+ await persistence.init();
104
+ memory = new MemorySystem(persistence, tempDir);
105
+ await memory.init();
106
+ });
107
+
108
+ afterEach(async () => {
109
+ await memory.close();
110
+ persistence.close();
111
+ await rm(tempDir, { recursive: true, force: true });
112
+ });
113
+
114
+ // =========================================================================
115
+ // 1. InstantLoop → Memory store write-through
116
+ // =========================================================================
117
+ describe('InstantLoop write-through to memory stores', () => {
118
+ let loop: InstantLoop;
119
+
120
+ beforeEach(() => {
121
+ loop = new InstantLoop(memory);
122
+ });
123
+
124
+ it('should store experience that is retrievable by ID and by similarity', async () => {
125
+ const trajectory = makeSuccessTrajectory();
126
+ const result = await loop.process(trajectory);
127
+
128
+ // Verify retrievable by ID
129
+ const exp = await memory.experiences.get(result.experienceId);
130
+ expect(exp).toBeDefined();
131
+ expect(exp!.taskInput).toBe(trajectory.task.description);
132
+ expect(exp!.success).toBe(true);
133
+
134
+ // Verify retrievable by similarity search
135
+ const similar = await memory.experiences.findSimilar(
136
+ 'authentication module bug fix',
137
+ { k: 5 }
138
+ );
139
+ expect(similar.length).toBeGreaterThanOrEqual(1);
140
+ expect(similar.some(s => s.experience.id === result.experienceId)).toBe(true);
141
+ });
142
+
143
+ it('should store causal edge for failed trajectory that is queryable', async () => {
144
+ const trajectory = makeFailureTrajectory();
145
+ const result = await loop.process(trajectory);
146
+
147
+ expect(result.causalEdgesExtracted).toBeGreaterThanOrEqual(1);
148
+
149
+ // Verify edge stored in CausalStore and queryable
150
+ const edges = await memory.causal.getByDomain('typescript');
151
+ expect(edges.length).toBeGreaterThanOrEqual(1);
152
+
153
+ const failureEdge = edges.find(e => e.id === `ce-fail-${trajectory.id}`);
154
+ expect(failureEdge).toBeDefined();
155
+ expect(failureEdge!.cause).toContain('database connection timeout');
156
+ expect(failureEdge!.effect).toContain('ECONNREFUSED');
157
+ expect(failureEdge!.confidence).toBe(0.4);
158
+ });
159
+
160
+ it('should store causal edge for successful trajectory with approach→outcome', async () => {
161
+ const trajectory = makeSuccessTrajectory();
162
+ const result = await loop.process(trajectory);
163
+
164
+ expect(result.causalEdgesExtracted).toBeGreaterThanOrEqual(1);
165
+
166
+ const edges = await memory.causal.getByDomain('typescript');
167
+ const successEdge = edges.find(e => e.id === `ce-succ-${trajectory.id}`);
168
+ expect(successEdge).toBeDefined();
169
+ expect(successEdge!.cause).toContain('authentication');
170
+ expect(successEdge!.effect).toContain('null check');
171
+ expect(successEdge!.confidence).toBe(0.7);
172
+ });
173
+
174
+ it('should generate and store reflexion episode that is queryable by trajectory', async () => {
175
+ const trajectory = makeFailureTrajectory();
176
+ const result = await loop.process(trajectory);
177
+
178
+ expect(result.reflexionEpisodeId).toBeDefined();
179
+
180
+ // Verify reflexion stored and retrievable
181
+ const episode = await memory.reflexion.getByTrajectory(trajectory.id);
182
+ expect(episode).toBeDefined();
183
+ expect(episode!.id).toBe(result.reflexionEpisodeId);
184
+ expect(episode!.trajectoryId).toBe(trajectory.id);
185
+ expect(episode!.outcome).toBe('failure');
186
+ expect(episode!.selfCritique).toBeTruthy();
187
+ });
188
+
189
+ it('should generate reflexion episode for successful trajectory too', async () => {
190
+ const trajectory = makeSuccessTrajectory();
191
+ const result = await loop.process(trajectory);
192
+
193
+ expect(result.reflexionEpisodeId).toBeDefined();
194
+
195
+ const episode = await memory.reflexion.getByTrajectory(trajectory.id);
196
+ expect(episode).toBeDefined();
197
+ expect(episode!.outcome).toBe('success');
198
+ });
199
+
200
+ it('should bump playbook confidence on success and persist the change', async () => {
201
+ const playbook = createPlaybook({
202
+ name: 'fix-auth-bugs',
203
+ confidence: 0.5,
204
+ applicability: {
205
+ situations: ['authentication bug', 'auth module error'],
206
+ triggers: ['authentication', 'auth module'],
207
+ antiPatterns: [],
208
+ domains: ['typescript'],
209
+ },
210
+ guidance: {
211
+ strategy: 'Check null references in auth flow',
212
+ tactics: ['add null checks', 'verify token handling'],
213
+ steps: [],
214
+ },
215
+ });
216
+ await memory.playbooks.add(playbook);
217
+
218
+ const trajectory = makeSuccessTrajectory({
219
+ description: 'Fix the authentication module crash',
220
+ });
221
+ const result = await loop.process(trajectory);
222
+
223
+ // Verify confidence was bumped
224
+ const match = result.matchedPlaybooks.find(m => m.id === playbook.id);
225
+ expect(match).toBeDefined();
226
+ expect(match!.confidenceDelta).toBeGreaterThan(0);
227
+
228
+ // Verify persisted value reflects the bump
229
+ const updated = await memory.playbooks.get(playbook.id);
230
+ expect(updated).toBeDefined();
231
+ expect(updated!.confidence).toBeGreaterThan(0.5);
232
+ expect(updated!.evolution.successCount).toBeGreaterThan(0);
233
+ });
234
+
235
+ it('should decrease playbook confidence on failure and record failure context', async () => {
236
+ const playbook = createPlaybook({
237
+ name: 'fix-db-timeout',
238
+ confidence: 0.7,
239
+ applicability: {
240
+ situations: ['database connection timeout'],
241
+ triggers: ['database timeout', 'connection timeout'],
242
+ antiPatterns: [],
243
+ domains: ['typescript'],
244
+ },
245
+ guidance: {
246
+ strategy: 'Increase pool timeout',
247
+ tactics: [],
248
+ steps: [],
249
+ },
250
+ });
251
+ await memory.playbooks.add(playbook);
252
+
253
+ const trajectory = makeFailureTrajectory({
254
+ description: 'Fix the database connection timeout issue',
255
+ });
256
+ const result = await loop.process(trajectory);
257
+
258
+ const match = result.matchedPlaybooks.find(m => m.id === playbook.id);
259
+ if (match) {
260
+ expect(match.confidenceDelta).toBeLessThan(0);
261
+ }
262
+
263
+ // Verify failure recorded in evolution
264
+ const updated = await memory.playbooks.get(playbook.id);
265
+ expect(updated).toBeDefined();
266
+ expect(updated!.confidence).toBeLessThan(0.7);
267
+ expect(updated!.evolution.failureCount).toBeGreaterThan(0);
268
+ });
269
+
270
+ it('should process multiple trajectories and each writes independently', async () => {
271
+ const t1 = makeSuccessTrajectory({ description: 'Fix auth bug', domain: 'auth' });
272
+ const t2 = makeFailureTrajectory({ description: 'Fix DB issue', domain: 'database' });
273
+ const t3 = makeSuccessTrajectory({ description: 'Fix CSS layout', domain: 'frontend' });
274
+
275
+ const r1 = await loop.process(t1);
276
+ const r2 = await loop.process(t2);
277
+ const r3 = await loop.process(t3);
278
+
279
+ // All three experiences should exist
280
+ const e1 = await memory.experiences.get(r1.experienceId);
281
+ const e2 = await memory.experiences.get(r2.experienceId);
282
+ const e3 = await memory.experiences.get(r3.experienceId);
283
+ expect(e1).toBeDefined();
284
+ expect(e2).toBeDefined();
285
+ expect(e3).toBeDefined();
286
+
287
+ // Total experience count should be 3
288
+ const allExperiences = await memory.experiences.getAll();
289
+ expect(allExperiences.length).toBe(3);
290
+
291
+ // Causal edges should exist for all trajectories
292
+ const authEdges = await memory.causal.getByDomain('auth');
293
+ const dbEdges = await memory.causal.getByDomain('database');
294
+ const feEdges = await memory.causal.getByDomain('frontend');
295
+ expect(authEdges.length).toBeGreaterThanOrEqual(1);
296
+ expect(dbEdges.length).toBeGreaterThanOrEqual(1);
297
+ expect(feEdges.length).toBeGreaterThanOrEqual(1);
298
+ });
299
+ });
300
+
301
+ // =========================================================================
302
+ // 2. Batch pipeline → playbook extraction → library indexing
303
+ // =========================================================================
304
+ describe('Batch pipeline playbook extraction and indexing', () => {
305
+ let pipeline: LearningPipeline;
306
+
307
+ beforeEach(() => {
308
+ pipeline = createLearningPipeline(
309
+ memory,
310
+ {
311
+ minTrajectories: 2,
312
+ deduplicationThreshold: 0.95, // High threshold so similar tasks create new playbooks
313
+ minSuccessRate: 0.5,
314
+ maxExperiences: 1000,
315
+ },
316
+ { enableTemporalCompression: false, enableReasoningBank: false },
317
+ );
318
+ });
319
+
320
+ it('should extract playbooks from successful trajectories and make them findable', async () => {
321
+ // Feed enough similar successful trajectories to trigger extraction
322
+ for (let i = 0; i < 4; i++) {
323
+ const t = makeSuccessTrajectory({
324
+ description: `Fix authentication null pointer in module ${i}`,
325
+ domain: 'typescript',
326
+ });
327
+ await pipeline.processTrajectory(t);
328
+ }
329
+
330
+ const batchResult = await pipeline.runBatchLearning();
331
+ expect(batchResult.trajectoriesProcessed).toBe(4);
332
+
333
+ if (batchResult.playbooksExtracted > 0) {
334
+ // Verify extracted playbooks are findable via findMatching
335
+ const matches = await memory.playbooks.findMatching(
336
+ 'Fix authentication null pointer bug',
337
+ { k: 5, domains: ['typescript'] }
338
+ );
339
+ expect(matches.length).toBeGreaterThanOrEqual(1);
340
+ }
341
+
342
+ // Regardless of extraction, all 4 experiences should be stored
343
+ const allExperiences = await memory.experiences.getAll();
344
+ expect(allExperiences.length).toBe(4);
345
+ });
346
+
347
+ it('should accumulate analyses with correct credit assignment', async () => {
348
+ const trajectory = makeSuccessTrajectory();
349
+ const result = await pipeline.processTrajectory(trajectory);
350
+
351
+ expect(result.analysis).toBeDefined();
352
+ expect(result.analysis.success).toBe(true);
353
+ expect(result.analysis.stepAttribution.length).toBe(trajectory.steps.length);
354
+
355
+ // Key steps should be identified (steps with highest attribution)
356
+ expect(result.analysis.keySteps.length).toBeGreaterThanOrEqual(1);
357
+ });
358
+
359
+ it('should identify error patterns from failed trajectories', async () => {
360
+ const trajectory = makeFailureTrajectory({
361
+ errorInfo: 'TypeError: Cannot read properties of undefined (reading "token")',
362
+ });
363
+ const result = await pipeline.processTrajectory(trajectory);
364
+
365
+ expect(result.analysis.success).toBe(false);
366
+ expect(result.analysis.errorPatterns).toBeDefined();
367
+ expect(result.analysis.errorPatterns!.length).toBeGreaterThanOrEqual(1);
368
+ });
369
+
370
+ it('should run temporal compression on batch and update experiences', async () => {
371
+ const pipelineWithCompression = createLearningPipeline(
372
+ memory,
373
+ { minTrajectories: 2, maxExperiences: 1000 },
374
+ { enableTemporalCompression: true, enableReasoningBank: false },
375
+ );
376
+
377
+ // Process trajectories
378
+ for (let i = 0; i < 3; i++) {
379
+ await pipelineWithCompression.processTrajectory(
380
+ makeSuccessTrajectory({ description: `Task ${i}` })
381
+ );
382
+ }
383
+
384
+ const batchResult = await pipelineWithCompression.runBatchLearning();
385
+ expect(batchResult.trajectoriesProcessed).toBe(3);
386
+
387
+ // After compression, experiences should still be queryable
388
+ const all = await memory.experiences.getAll();
389
+ expect(all.length).toBeGreaterThan(0);
390
+ });
391
+
392
+ it('should build reasoning clusters in batch and persist them', async () => {
393
+ const pipelineWithClustering = createLearningPipeline(
394
+ memory,
395
+ { minTrajectories: 2, maxExperiences: 1000 },
396
+ { enableTemporalCompression: false, enableReasoningBank: true },
397
+ persistence,
398
+ );
399
+
400
+ // Process enough trajectories for clustering
401
+ for (let i = 0; i < 5; i++) {
402
+ await pipelineWithClustering.processTrajectory(
403
+ makeSuccessTrajectory({ description: `Fix module issue #${i}` })
404
+ );
405
+ }
406
+
407
+ const batchResult = await pipelineWithClustering.runBatchLearning();
408
+ expect(batchResult.experiencesClustered).toBeGreaterThanOrEqual(5);
409
+ });
410
+ });
411
+
412
+ // =========================================================================
413
+ // 3. LoopCoordinator → hot + cold path coordination
414
+ // =========================================================================
415
+ describe('LoopCoordinator hot+cold path coordination', () => {
416
+ let loop: InstantLoop;
417
+ let coordinator: LoopCoordinator;
418
+
419
+ beforeEach(() => {
420
+ loop = new InstantLoop(memory);
421
+ coordinator = new LoopCoordinator(loop, { batchThreshold: 3 }, persistence);
422
+ });
423
+
424
+ it('should process via instant loop and track pending count', async () => {
425
+ const t1 = makeSuccessTrajectory({ description: 'Task A' });
426
+ const t2 = makeFailureTrajectory({ description: 'Task B' });
427
+
428
+ await coordinator.onTrajectoryComplete(t1);
429
+ expect(coordinator.getPendingCount()).toBe(1);
430
+ expect(coordinator.shouldRunBatch()).toBe(false);
431
+
432
+ await coordinator.onTrajectoryComplete(t2);
433
+ expect(coordinator.getPendingCount()).toBe(2);
434
+ expect(coordinator.shouldRunBatch()).toBe(false);
435
+ });
436
+
437
+ it('should signal batch at threshold', async () => {
438
+ for (let i = 0; i < 3; i++) {
439
+ await coordinator.onTrajectoryComplete(
440
+ makeSuccessTrajectory({ description: `Task ${i}` })
441
+ );
442
+ }
443
+ expect(coordinator.shouldRunBatch()).toBe(true);
444
+ expect(coordinator.getPendingCount()).toBe(3);
445
+ });
446
+
447
+ it('should reset pending count after batch acknowledged', async () => {
448
+ for (let i = 0; i < 3; i++) {
449
+ await coordinator.onTrajectoryComplete(
450
+ makeSuccessTrajectory({ description: `Task ${i}` })
451
+ );
452
+ }
453
+ expect(coordinator.shouldRunBatch()).toBe(true);
454
+
455
+ coordinator.resetPendingCount();
456
+ expect(coordinator.getPendingCount()).toBe(0);
457
+ expect(coordinator.shouldRunBatch()).toBe(false);
458
+ });
459
+
460
+ it('should persist pending count and restore on new coordinator', async () => {
461
+ // Process 2 trajectories
462
+ await coordinator.onTrajectoryComplete(makeSuccessTrajectory({ description: 'T1' }));
463
+ await coordinator.onTrajectoryComplete(makeSuccessTrajectory({ description: 'T2' }));
464
+ expect(coordinator.getPendingCount()).toBe(2);
465
+
466
+ // Create a new coordinator with same persistence — should restore count
467
+ const loop2 = new InstantLoop(memory);
468
+ const coordinator2 = new LoopCoordinator(loop2, { batchThreshold: 3 }, persistence);
469
+ expect(coordinator2.getPendingCount()).toBe(2);
470
+ });
471
+
472
+ it('should persist reset and restore zero', async () => {
473
+ await coordinator.onTrajectoryComplete(makeSuccessTrajectory({ description: 'T1' }));
474
+ coordinator.resetPendingCount();
475
+
476
+ const loop2 = new InstantLoop(memory);
477
+ const coordinator2 = new LoopCoordinator(loop2, { batchThreshold: 3 }, persistence);
478
+ expect(coordinator2.getPendingCount()).toBe(0);
479
+ });
480
+
481
+ it('should store all experiences in memory during hot path', async () => {
482
+ const trajectories: Trajectory[] = [];
483
+ for (let i = 0; i < 4; i++) {
484
+ const t = makeSuccessTrajectory({ description: `Coordinator task ${i}` });
485
+ trajectories.push(t);
486
+ await coordinator.onTrajectoryComplete(t);
487
+ }
488
+
489
+ // All 4 should be in memory
490
+ const all = await memory.experiences.getAll();
491
+ expect(all.length).toBe(4);
492
+
493
+ // Each should have reflexion
494
+ for (const t of trajectories) {
495
+ const episode = await memory.reflexion.getByTrajectory(t.id);
496
+ expect(episode).toBeDefined();
497
+ }
498
+ });
499
+ });
500
+
501
+ // =========================================================================
502
+ // 4. End-to-end: hot path → batch → verify all stores
503
+ // =========================================================================
504
+ describe('End-to-end hot path → batch → store verification', () => {
505
+ it('should properly flow trajectory through instant loop then batch', async () => {
506
+ const loop = new InstantLoop(memory);
507
+ const coordinator = new LoopCoordinator(loop, { batchThreshold: 3 }, persistence);
508
+ const pipeline = createLearningPipeline(
509
+ memory,
510
+ { minTrajectories: 3, maxExperiences: 1000 },
511
+ { enableTemporalCompression: true, enableReasoningBank: true },
512
+ persistence,
513
+ );
514
+
515
+ // Hot path: process 4 trajectories
516
+ const trajectories: Trajectory[] = [];
517
+ for (let i = 0; i < 4; i++) {
518
+ const t = i < 3
519
+ ? makeSuccessTrajectory({ description: `Fix auth issue variant ${i}`, domain: 'auth' })
520
+ : makeFailureTrajectory({ description: 'Fix auth timeout', domain: 'auth' });
521
+ trajectories.push(t);
522
+ await coordinator.onTrajectoryComplete(t);
523
+ // Also feed into pipeline (skipStore since instant loop already stored)
524
+ await pipeline.processTrajectory(t, { skipStore: true });
525
+ }
526
+
527
+ // Verify hot-path wrote everything
528
+ expect(coordinator.shouldRunBatch()).toBe(true);
529
+ const allExperiences = await memory.experiences.getAll();
530
+ expect(allExperiences.length).toBe(4);
531
+
532
+ // Verify reflexion episodes exist for all
533
+ for (const t of trajectories) {
534
+ const episode = await memory.reflexion.getByTrajectory(t.id);
535
+ expect(episode).toBeDefined();
536
+ }
537
+
538
+ // Verify causal edges exist (similar edges may be merged by CausalStore)
539
+ const causalEdges = await memory.causal.getByDomain('auth');
540
+ expect(causalEdges.length).toBeGreaterThanOrEqual(2); // At least success + failure patterns
541
+
542
+ // Cold path: run batch
543
+ const batchResult = await pipeline.runBatchLearning();
544
+ expect(batchResult.trajectoriesProcessed).toBe(4);
545
+ expect(batchResult.successRate).toBeCloseTo(0.75, 2);
546
+
547
+ // After batch, experiences should still be queryable
548
+ const postBatchExperiences = await memory.experiences.getAll();
549
+ expect(postBatchExperiences.length).toBeGreaterThan(0);
550
+
551
+ // Reset coordinator
552
+ coordinator.resetPendingCount();
553
+ expect(coordinator.getPendingCount()).toBe(0);
554
+ });
555
+
556
+ it('should not double-store experiences when skipStore is used', async () => {
557
+ const loop = new InstantLoop(memory);
558
+ const pipeline = createLearningPipeline(memory, { minTrajectories: 1 });
559
+
560
+ const trajectory = makeSuccessTrajectory();
561
+
562
+ // Hot path stores it
563
+ await loop.process(trajectory);
564
+
565
+ // Cold path with skipStore
566
+ await pipeline.processTrajectory(trajectory, { skipStore: true });
567
+
568
+ // Should only have 1 experience, not 2
569
+ const byTrajectory = await memory.experiences.getByTrajectory(trajectory.id);
570
+ expect(byTrajectory.length).toBe(1);
571
+ });
572
+
573
+ it('should double-store when skipStore is not used (documents expected behavior)', async () => {
574
+ const loop = new InstantLoop(memory);
575
+ const pipeline = createLearningPipeline(memory, { minTrajectories: 1 });
576
+
577
+ const trajectory = makeSuccessTrajectory();
578
+
579
+ // Hot path stores it
580
+ await loop.process(trajectory);
581
+
582
+ // Cold path without skipStore — stores again
583
+ await pipeline.processTrajectory(trajectory);
584
+
585
+ // Two experiences from the same trajectory
586
+ const byTrajectory = await memory.experiences.getByTrajectory(trajectory.id);
587
+ expect(byTrajectory.length).toBe(2);
588
+ });
589
+ });
590
+
591
+ // =========================================================================
592
+ // 5. Analysis quality — credit assignment and error patterns
593
+ // =========================================================================
594
+ describe('Analysis quality and improvement identification', () => {
595
+ let pipeline: LearningPipeline;
596
+
597
+ beforeEach(() => {
598
+ pipeline = createLearningPipeline(memory, { minTrajectories: 1 });
599
+ });
600
+
601
+ it('should correctly identify key steps with high attribution', async () => {
602
+ const trajectory = createTrajectory({
603
+ task: createTask({
604
+ description: 'Fix the rendering bug',
605
+ domain: 'frontend',
606
+ }),
607
+ steps: [
608
+ createStep({ action: 'ReadFile src/component.tsx', observation: 'JSX code' }),
609
+ createStep({ action: 'ReadFile src/styles.css', observation: 'CSS code' }),
610
+ createStep({
611
+ thought: 'Found the bug — z-index conflict',
612
+ action: 'EditFile src/styles.css',
613
+ observation: 'Fixed z-index from 1 to 10',
614
+ }),
615
+ createStep({ action: 'RunTests npm test', observation: 'All tests pass' }),
616
+ ],
617
+ outcome: successOutcome('Fixed z-index conflict in styles.css'),
618
+ agentId: 'test-agent',
619
+ });
620
+
621
+ const result = await pipeline.processTrajectory(trajectory);
622
+
623
+ // The edit step (index 2) should have high attribution
624
+ expect(result.analysis.stepAttribution.length).toBe(4);
625
+ expect(result.analysis.keySteps.length).toBeGreaterThanOrEqual(1);
626
+ });
627
+
628
+ it('should mark trajectory with many steps as abstractable', async () => {
629
+ const trajectory = createTrajectory({
630
+ task: createTask({
631
+ description: 'Fix the flaky test',
632
+ domain: 'testing',
633
+ }),
634
+ steps: [
635
+ createStep({ action: 'RunTests npm test', observation: 'Test failed: timeout' }),
636
+ createStep({ action: 'EditFile src/test.ts', observation: 'Updated timeout' }),
637
+ createStep({ action: 'RunTests npm test', observation: 'Test failed: timeout' }),
638
+ createStep({ action: 'EditFile src/test.ts', observation: 'Increased timeout more' }),
639
+ createStep({ action: 'RunTests npm test', observation: 'Test passed' }),
640
+ ],
641
+ outcome: successOutcome('Increased test timeout'),
642
+ agentId: 'test-agent',
643
+ });
644
+
645
+ const result = await pipeline.processTrajectory(trajectory);
646
+
647
+ // A successful trajectory with multiple steps should be abstractable
648
+ expect(result.analysis.success).toBe(true);
649
+ expect(result.analysis.stepAttribution.length).toBe(5);
650
+ });
651
+
652
+ it('should classify error patterns in failed trajectories', async () => {
653
+ const trajectory = createTrajectory({
654
+ task: createTask({
655
+ description: 'Deploy the application',
656
+ domain: 'devops',
657
+ }),
658
+ steps: [
659
+ createStep({ action: 'RunCommand docker build .', observation: 'Build complete' }),
660
+ createStep({
661
+ action: 'RunCommand docker push registry/app:latest',
662
+ observation: 'Error: denied: access forbidden',
663
+ }),
664
+ ],
665
+ outcome: failureOutcome('Permission denied: docker push requires authentication'),
666
+ agentId: 'test-agent',
667
+ });
668
+
669
+ const result = await pipeline.processTrajectory(trajectory);
670
+
671
+ expect(result.analysis.success).toBe(false);
672
+ expect(result.analysis.errorPatterns).toBeDefined();
673
+ expect(result.analysis.errorPatterns!.length).toBeGreaterThanOrEqual(1);
674
+ // The error should be classified (from our error-classifier)
675
+ expect(result.analysis.errorPatterns![0].type).toBeDefined();
676
+ });
677
+ });
678
+
679
+ // =========================================================================
680
+ // 6. Playbook evolution — success/failure tracking updates playbook state
681
+ // =========================================================================
682
+ describe('Playbook evolution through learning', () => {
683
+ it('should track success count and version through multiple trajectories', async () => {
684
+ const playbook = createPlaybook({
685
+ name: 'fix-broken-authentication-module',
686
+ confidence: 0.5,
687
+ applicability: {
688
+ situations: ['Fix the broken authentication module', 'authentication module is broken'],
689
+ triggers: ['broken authentication module', 'authentication module'],
690
+ antiPatterns: [],
691
+ domains: ['typescript'],
692
+ },
693
+ guidance: {
694
+ strategy: 'Add null checks in authentication flow',
695
+ tactics: ['check token', 'verify user object'],
696
+ steps: [],
697
+ },
698
+ });
699
+ await memory.playbooks.add(playbook);
700
+
701
+ const loop = new InstantLoop(memory);
702
+
703
+ // Process 3 successful trajectories that match this playbook's triggers
704
+ for (let i = 0; i < 3; i++) {
705
+ await loop.process(
706
+ makeSuccessTrajectory({
707
+ description: 'Fix the broken authentication module',
708
+ domain: 'typescript',
709
+ })
710
+ );
711
+ }
712
+
713
+ const updated = await memory.playbooks.get(playbook.id);
714
+ expect(updated).toBeDefined();
715
+ expect(updated!.confidence).toBeGreaterThan(0.5);
716
+ expect(updated!.evolution.successCount).toBeGreaterThanOrEqual(3);
717
+ });
718
+
719
+ it('should track failure context for later analysis', async () => {
720
+ const playbook = createPlaybook({
721
+ name: 'increase-timeout',
722
+ confidence: 0.6,
723
+ applicability: {
724
+ situations: ['connection timeout', 'request timeout'],
725
+ triggers: ['timeout'],
726
+ antiPatterns: [],
727
+ domains: ['typescript'],
728
+ },
729
+ guidance: {
730
+ strategy: 'Increase timeout values',
731
+ tactics: [],
732
+ steps: [],
733
+ },
734
+ });
735
+ await memory.playbooks.add(playbook);
736
+
737
+ const loop = new InstantLoop(memory);
738
+
739
+ // Process 2 failures
740
+ for (let i = 0; i < 2; i++) {
741
+ await loop.process(
742
+ makeFailureTrajectory({
743
+ description: `Fix connection timeout in service ${i}`,
744
+ errorInfo: `ECONNREFUSED: service ${i} unreachable`,
745
+ })
746
+ );
747
+ }
748
+
749
+ const updated = await memory.playbooks.get(playbook.id);
750
+ expect(updated).toBeDefined();
751
+ expect(updated!.confidence).toBeLessThan(0.6);
752
+ expect(updated!.evolution.failureCount).toBeGreaterThanOrEqual(2);
753
+ expect(updated!.evolution.failures.length).toBeGreaterThanOrEqual(1);
754
+ });
755
+ });
756
+
757
+ // =========================================================================
758
+ // 7. Cross-store consistency — domain partitioning
759
+ // =========================================================================
760
+ describe('Cross-store domain consistency', () => {
761
+ it('should partition data by domain across all stores', async () => {
762
+ const loop = new InstantLoop(memory);
763
+
764
+ // Process trajectories from different domains
765
+ await loop.process(makeSuccessTrajectory({ description: 'Fix auth bug', domain: 'auth' }));
766
+ await loop.process(makeSuccessTrajectory({ description: 'Fix UI layout', domain: 'frontend' }));
767
+ await loop.process(makeFailureTrajectory({ description: 'Fix DB query', domain: 'database' }));
768
+
769
+ // Experiences should be queryable by domain
770
+ const authExperiences = await memory.experiences.findSimilar(
771
+ 'authentication',
772
+ { k: 10, domain: 'auth' }
773
+ );
774
+ const feExperiences = await memory.experiences.findSimilar(
775
+ 'UI layout',
776
+ { k: 10, domain: 'frontend' }
777
+ );
778
+
779
+ // Each domain query should return results from that domain
780
+ for (const { experience } of authExperiences) {
781
+ expect(experience.domain).toBe('auth');
782
+ }
783
+ for (const { experience } of feExperiences) {
784
+ expect(experience.domain).toBe('frontend');
785
+ }
786
+
787
+ // Causal edges should be domain-partitioned
788
+ const authEdges = await memory.causal.getByDomain('auth');
789
+ const dbEdges = await memory.causal.getByDomain('database');
790
+ expect(authEdges.every(e => e.domain === 'auth')).toBe(true);
791
+ expect(dbEdges.every(e => e.domain === 'database')).toBe(true);
792
+ });
793
+ });
794
+ });