lex-agentic-memory 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +12 -0
  3. data/Gemfile +5 -0
  4. data/LICENSE +21 -0
  5. data/README.md +13 -0
  6. data/lex-agentic-memory.gemspec +30 -0
  7. data/lib/legion/extensions/agentic/memory/archaeology/client.rb +19 -0
  8. data/lib/legion/extensions/agentic/memory/archaeology/helpers/archaeology_engine.rb +184 -0
  9. data/lib/legion/extensions/agentic/memory/archaeology/helpers/artifact.rb +146 -0
  10. data/lib/legion/extensions/agentic/memory/archaeology/helpers/constants.rb +95 -0
  11. data/lib/legion/extensions/agentic/memory/archaeology/helpers/excavation_site.rb +97 -0
  12. data/lib/legion/extensions/agentic/memory/archaeology/runners/cognitive_archaeology.rb +86 -0
  13. data/lib/legion/extensions/agentic/memory/archaeology/version.rb +13 -0
  14. data/lib/legion/extensions/agentic/memory/archaeology.rb +22 -0
  15. data/lib/legion/extensions/agentic/memory/compression/client.rb +15 -0
  16. data/lib/legion/extensions/agentic/memory/compression/helpers/compression_engine.rb +145 -0
  17. data/lib/legion/extensions/agentic/memory/compression/helpers/constants.rb +44 -0
  18. data/lib/legion/extensions/agentic/memory/compression/helpers/information_chunk.rb +81 -0
  19. data/lib/legion/extensions/agentic/memory/compression/runners/cognitive_compression.rb +76 -0
  20. data/lib/legion/extensions/agentic/memory/compression/version.rb +13 -0
  21. data/lib/legion/extensions/agentic/memory/compression.rb +19 -0
  22. data/lib/legion/extensions/agentic/memory/echo/client.rb +19 -0
  23. data/lib/legion/extensions/agentic/memory/echo/helpers/constants.rb +57 -0
  24. data/lib/legion/extensions/agentic/memory/echo/helpers/echo.rb +95 -0
  25. data/lib/legion/extensions/agentic/memory/echo/helpers/echo_engine.rb +136 -0
  26. data/lib/legion/extensions/agentic/memory/echo/runners/cognitive_echo.rb +81 -0
  27. data/lib/legion/extensions/agentic/memory/echo/version.rb +13 -0
  28. data/lib/legion/extensions/agentic/memory/echo.rb +19 -0
  29. data/lib/legion/extensions/agentic/memory/echo_chamber/client.rb +19 -0
  30. data/lib/legion/extensions/agentic/memory/echo_chamber/helpers/chamber.rb +134 -0
  31. data/lib/legion/extensions/agentic/memory/echo_chamber/helpers/chamber_engine.rb +156 -0
  32. data/lib/legion/extensions/agentic/memory/echo_chamber/helpers/constants.rb +60 -0
  33. data/lib/legion/extensions/agentic/memory/echo_chamber/helpers/echo.rb +96 -0
  34. data/lib/legion/extensions/agentic/memory/echo_chamber/runners/cognitive_echo_chamber.rb +84 -0
  35. data/lib/legion/extensions/agentic/memory/echo_chamber/version.rb +13 -0
  36. data/lib/legion/extensions/agentic/memory/echo_chamber.rb +21 -0
  37. data/lib/legion/extensions/agentic/memory/episodic/actors/decay.rb +45 -0
  38. data/lib/legion/extensions/agentic/memory/episodic/client.rb +25 -0
  39. data/lib/legion/extensions/agentic/memory/episodic/helpers/constants.rb +36 -0
  40. data/lib/legion/extensions/agentic/memory/episodic/helpers/episode.rb +104 -0
  41. data/lib/legion/extensions/agentic/memory/episodic/helpers/episodic_binding.rb +57 -0
  42. data/lib/legion/extensions/agentic/memory/episodic/helpers/episodic_store.rb +141 -0
  43. data/lib/legion/extensions/agentic/memory/episodic/runners/episodic_buffer.rb +108 -0
  44. data/lib/legion/extensions/agentic/memory/episodic/version.rb +13 -0
  45. data/lib/legion/extensions/agentic/memory/episodic.rb +20 -0
  46. data/lib/legion/extensions/agentic/memory/hologram/client.rb +23 -0
  47. data/lib/legion/extensions/agentic/memory/hologram/helpers/constants.rb +67 -0
  48. data/lib/legion/extensions/agentic/memory/hologram/helpers/hologram.rb +118 -0
  49. data/lib/legion/extensions/agentic/memory/hologram/helpers/hologram_engine.rb +117 -0
  50. data/lib/legion/extensions/agentic/memory/hologram/helpers/holographic_fragment.rb +70 -0
  51. data/lib/legion/extensions/agentic/memory/hologram/runners/cognitive_hologram.rb +110 -0
  52. data/lib/legion/extensions/agentic/memory/hologram/version.rb +13 -0
  53. data/lib/legion/extensions/agentic/memory/hologram.rb +22 -0
  54. data/lib/legion/extensions/agentic/memory/immune_memory/client.rb +19 -0
  55. data/lib/legion/extensions/agentic/memory/immune_memory/helpers/constants.rb +84 -0
  56. data/lib/legion/extensions/agentic/memory/immune_memory/helpers/encounter.rb +54 -0
  57. data/lib/legion/extensions/agentic/memory/immune_memory/helpers/immune_memory_engine.rb +171 -0
  58. data/lib/legion/extensions/agentic/memory/immune_memory/helpers/memory_cell.rb +97 -0
  59. data/lib/legion/extensions/agentic/memory/immune_memory/runners/cognitive_immune_memory.rb +76 -0
  60. data/lib/legion/extensions/agentic/memory/immune_memory/version.rb +13 -0
  61. data/lib/legion/extensions/agentic/memory/immune_memory.rb +20 -0
  62. data/lib/legion/extensions/agentic/memory/nostalgia/client.rb +31 -0
  63. data/lib/legion/extensions/agentic/memory/nostalgia/helpers/constants.rb +68 -0
  64. data/lib/legion/extensions/agentic/memory/nostalgia/helpers/nostalgia_engine.rb +148 -0
  65. data/lib/legion/extensions/agentic/memory/nostalgia/helpers/nostalgia_event.rb +44 -0
  66. data/lib/legion/extensions/agentic/memory/nostalgia/helpers/nostalgic_memory.rb +97 -0
  67. data/lib/legion/extensions/agentic/memory/nostalgia/runners/analysis.rb +61 -0
  68. data/lib/legion/extensions/agentic/memory/nostalgia/runners/recall.rb +60 -0
  69. data/lib/legion/extensions/agentic/memory/nostalgia/version.rb +13 -0
  70. data/lib/legion/extensions/agentic/memory/nostalgia.rb +21 -0
  71. data/lib/legion/extensions/agentic/memory/offloading/client.rb +29 -0
  72. data/lib/legion/extensions/agentic/memory/offloading/helpers/constants.rb +55 -0
  73. data/lib/legion/extensions/agentic/memory/offloading/helpers/external_store.rb +82 -0
  74. data/lib/legion/extensions/agentic/memory/offloading/helpers/offloaded_item.rb +65 -0
  75. data/lib/legion/extensions/agentic/memory/offloading/helpers/offloading_engine.rb +138 -0
  76. data/lib/legion/extensions/agentic/memory/offloading/runners/cognitive_offloading.rb +102 -0
  77. data/lib/legion/extensions/agentic/memory/offloading/version.rb +13 -0
  78. data/lib/legion/extensions/agentic/memory/offloading.rb +20 -0
  79. data/lib/legion/extensions/agentic/memory/paleontology/client.rb +19 -0
  80. data/lib/legion/extensions/agentic/memory/paleontology/helpers/constants.rb +69 -0
  81. data/lib/legion/extensions/agentic/memory/paleontology/helpers/excavation.rb +62 -0
  82. data/lib/legion/extensions/agentic/memory/paleontology/helpers/fossil.rb +125 -0
  83. data/lib/legion/extensions/agentic/memory/paleontology/helpers/paleontology_engine.rb +170 -0
  84. data/lib/legion/extensions/agentic/memory/paleontology/runners/cognitive_paleontology.rb +93 -0
  85. data/lib/legion/extensions/agentic/memory/paleontology/version.rb +13 -0
  86. data/lib/legion/extensions/agentic/memory/paleontology.rb +22 -0
  87. data/lib/legion/extensions/agentic/memory/palimpsest/client.rb +19 -0
  88. data/lib/legion/extensions/agentic/memory/palimpsest/helpers/belief_layer.rb +81 -0
  89. data/lib/legion/extensions/agentic/memory/palimpsest/helpers/constants.rb +56 -0
  90. data/lib/legion/extensions/agentic/memory/palimpsest/helpers/palimpsest.rb +124 -0
  91. data/lib/legion/extensions/agentic/memory/palimpsest/helpers/palimpsest_engine.rb +117 -0
  92. data/lib/legion/extensions/agentic/memory/palimpsest/runners/cognitive_palimpsest.rb +105 -0
  93. data/lib/legion/extensions/agentic/memory/palimpsest/version.rb +13 -0
  94. data/lib/legion/extensions/agentic/memory/palimpsest.rb +21 -0
  95. data/lib/legion/extensions/agentic/memory/reserve/client.rb +19 -0
  96. data/lib/legion/extensions/agentic/memory/reserve/helpers/constants.rb +58 -0
  97. data/lib/legion/extensions/agentic/memory/reserve/helpers/pathway.rb +112 -0
  98. data/lib/legion/extensions/agentic/memory/reserve/helpers/reserve_engine.rb +163 -0
  99. data/lib/legion/extensions/agentic/memory/reserve/runners/cognitive_reserve.rb +92 -0
  100. data/lib/legion/extensions/agentic/memory/reserve/version.rb +13 -0
  101. data/lib/legion/extensions/agentic/memory/reserve.rb +19 -0
  102. data/lib/legion/extensions/agentic/memory/semantic/actors/decay.rb +45 -0
  103. data/lib/legion/extensions/agentic/memory/semantic/client.rb +28 -0
  104. data/lib/legion/extensions/agentic/memory/semantic/helpers/concept.rb +101 -0
  105. data/lib/legion/extensions/agentic/memory/semantic/helpers/constants.rb +51 -0
  106. data/lib/legion/extensions/agentic/memory/semantic/helpers/knowledge_store.rb +145 -0
  107. data/lib/legion/extensions/agentic/memory/semantic/runners/semantic_memory.rb +94 -0
  108. data/lib/legion/extensions/agentic/memory/semantic/version.rb +13 -0
  109. data/lib/legion/extensions/agentic/memory/semantic.rb +20 -0
  110. data/lib/legion/extensions/agentic/memory/semantic_priming/client.rb +19 -0
  111. data/lib/legion/extensions/agentic/memory/semantic_priming/helpers/connection.rb +77 -0
  112. data/lib/legion/extensions/agentic/memory/semantic_priming/helpers/constants.rb +68 -0
  113. data/lib/legion/extensions/agentic/memory/semantic_priming/helpers/priming_network.rb +206 -0
  114. data/lib/legion/extensions/agentic/memory/semantic_priming/helpers/semantic_node.rb +81 -0
  115. data/lib/legion/extensions/agentic/memory/semantic_priming/runners/semantic_priming.rb +120 -0
  116. data/lib/legion/extensions/agentic/memory/semantic_priming/version.rb +13 -0
  117. data/lib/legion/extensions/agentic/memory/semantic_priming.rb +20 -0
  118. data/lib/legion/extensions/agentic/memory/semantic_satiation/client.rb +28 -0
  119. data/lib/legion/extensions/agentic/memory/semantic_satiation/helpers/concept.rb +82 -0
  120. data/lib/legion/extensions/agentic/memory/semantic_satiation/helpers/constants.rb +37 -0
  121. data/lib/legion/extensions/agentic/memory/semantic_satiation/helpers/satiation_engine.rb +103 -0
  122. data/lib/legion/extensions/agentic/memory/semantic_satiation/runners/semantic_satiation.rb +92 -0
  123. data/lib/legion/extensions/agentic/memory/semantic_satiation/version.rb +13 -0
  124. data/lib/legion/extensions/agentic/memory/semantic_satiation.rb +19 -0
  125. data/lib/legion/extensions/agentic/memory/source_monitoring/actors/decay.rb +31 -0
  126. data/lib/legion/extensions/agentic/memory/source_monitoring/client.rb +28 -0
  127. data/lib/legion/extensions/agentic/memory/source_monitoring/helpers/constants.rb +66 -0
  128. data/lib/legion/extensions/agentic/memory/source_monitoring/helpers/source_record.rb +94 -0
  129. data/lib/legion/extensions/agentic/memory/source_monitoring/helpers/source_tracker.rb +119 -0
  130. data/lib/legion/extensions/agentic/memory/source_monitoring/runners/source_monitoring.rb +95 -0
  131. data/lib/legion/extensions/agentic/memory/source_monitoring/version.rb +13 -0
  132. data/lib/legion/extensions/agentic/memory/source_monitoring.rb +19 -0
  133. data/lib/legion/extensions/agentic/memory/trace/actors/decay.rb +45 -0
  134. data/lib/legion/extensions/agentic/memory/trace/actors/tier_migration.rb +45 -0
  135. data/lib/legion/extensions/agentic/memory/trace/batch_decay.rb +44 -0
  136. data/lib/legion/extensions/agentic/memory/trace/client.rb +32 -0
  137. data/lib/legion/extensions/agentic/memory/trace/helpers/cache_store.rb +167 -0
  138. data/lib/legion/extensions/agentic/memory/trace/helpers/decay.rb +68 -0
  139. data/lib/legion/extensions/agentic/memory/trace/helpers/error_tracer.rb +94 -0
  140. data/lib/legion/extensions/agentic/memory/trace/helpers/store.rb +260 -0
  141. data/lib/legion/extensions/agentic/memory/trace/helpers/trace.rb +106 -0
  142. data/lib/legion/extensions/agentic/memory/trace/local_migrations/20260316000001_create_memory_traces.rb +31 -0
  143. data/lib/legion/extensions/agentic/memory/trace/local_migrations/20260316000002_create_memory_associations.rb +13 -0
  144. data/lib/legion/extensions/agentic/memory/trace/persistent_store.rb +94 -0
  145. data/lib/legion/extensions/agentic/memory/trace/quota.rb +55 -0
  146. data/lib/legion/extensions/agentic/memory/trace/runners/consolidation.rb +121 -0
  147. data/lib/legion/extensions/agentic/memory/trace/runners/traces.rb +105 -0
  148. data/lib/legion/extensions/agentic/memory/trace/version.rb +13 -0
  149. data/lib/legion/extensions/agentic/memory/trace.rb +54 -0
  150. data/lib/legion/extensions/agentic/memory/transfer/client.rb +28 -0
  151. data/lib/legion/extensions/agentic/memory/transfer/helpers/constants.rb +34 -0
  152. data/lib/legion/extensions/agentic/memory/transfer/helpers/domain_knowledge.rb +74 -0
  153. data/lib/legion/extensions/agentic/memory/transfer/helpers/transfer_engine.rb +188 -0
  154. data/lib/legion/extensions/agentic/memory/transfer/runners/transfer_learning.rb +77 -0
  155. data/lib/legion/extensions/agentic/memory/transfer/version.rb +13 -0
  156. data/lib/legion/extensions/agentic/memory/transfer.rb +19 -0
  157. data/lib/legion/extensions/agentic/memory/version.rb +11 -0
  158. data/lib/legion/extensions/agentic/memory.rb +35 -0
  159. data/spec/legion/extensions/agentic/memory/archaeology/client_spec.rb +38 -0
  160. data/spec/legion/extensions/agentic/memory/archaeology/cognitive_archaeology_spec.rb +7 -0
  161. data/spec/legion/extensions/agentic/memory/archaeology/helpers/archaeology_engine_spec.rb +165 -0
  162. data/spec/legion/extensions/agentic/memory/archaeology/helpers/artifact_spec.rb +196 -0
  163. data/spec/legion/extensions/agentic/memory/archaeology/helpers/constants_spec.rb +42 -0
  164. data/spec/legion/extensions/agentic/memory/archaeology/helpers/excavation_site_spec.rb +115 -0
  165. data/spec/legion/extensions/agentic/memory/archaeology/runners/cognitive_archaeology_spec.rb +96 -0
  166. data/spec/legion/extensions/agentic/memory/compression/helpers/compression_engine_spec.rb +138 -0
  167. data/spec/legion/extensions/agentic/memory/compression/helpers/constants_spec.rb +50 -0
  168. data/spec/legion/extensions/agentic/memory/compression/helpers/information_chunk_spec.rb +123 -0
  169. data/spec/legion/extensions/agentic/memory/compression/runners/cognitive_compression_spec.rb +80 -0
  170. data/spec/legion/extensions/agentic/memory/echo/client_spec.rb +20 -0
  171. data/spec/legion/extensions/agentic/memory/echo/cognitive_echo_spec.rb +7 -0
  172. data/spec/legion/extensions/agentic/memory/echo/helpers/echo_engine_spec.rb +152 -0
  173. data/spec/legion/extensions/agentic/memory/echo/helpers/echo_spec.rb +128 -0
  174. data/spec/legion/extensions/agentic/memory/echo/runners_spec.rb +80 -0
  175. data/spec/legion/extensions/agentic/memory/echo_chamber/client_spec.rb +84 -0
  176. data/spec/legion/extensions/agentic/memory/echo_chamber/helpers/chamber_engine_spec.rb +266 -0
  177. data/spec/legion/extensions/agentic/memory/echo_chamber/helpers/chamber_spec.rb +249 -0
  178. data/spec/legion/extensions/agentic/memory/echo_chamber/helpers/constants_spec.rb +130 -0
  179. data/spec/legion/extensions/agentic/memory/echo_chamber/helpers/echo_spec.rb +252 -0
  180. data/spec/legion/extensions/agentic/memory/echo_chamber/runners/cognitive_echo_chamber_spec.rb +185 -0
  181. data/spec/legion/extensions/agentic/memory/episodic/client_spec.rb +80 -0
  182. data/spec/legion/extensions/agentic/memory/episodic/episodic_buffer_spec.rb +15 -0
  183. data/spec/legion/extensions/agentic/memory/episodic/helpers/constants_spec.rb +86 -0
  184. data/spec/legion/extensions/agentic/memory/episodic/helpers/episode_spec.rb +188 -0
  185. data/spec/legion/extensions/agentic/memory/episodic/helpers/episodic_binding_spec.rb +114 -0
  186. data/spec/legion/extensions/agentic/memory/episodic/helpers/episodic_store_spec.rb +201 -0
  187. data/spec/legion/extensions/agentic/memory/episodic/runners/episodic_buffer_spec.rb +208 -0
  188. data/spec/legion/extensions/agentic/memory/hologram/client_spec.rb +89 -0
  189. data/spec/legion/extensions/agentic/memory/hologram/cognitive_hologram_spec.rb +39 -0
  190. data/spec/legion/extensions/agentic/memory/hologram/helpers/constants_spec.rb +143 -0
  191. data/spec/legion/extensions/agentic/memory/hologram/helpers/hologram_engine_spec.rb +268 -0
  192. data/spec/legion/extensions/agentic/memory/hologram/helpers/hologram_spec.rb +256 -0
  193. data/spec/legion/extensions/agentic/memory/hologram/helpers/holographic_fragment_spec.rb +213 -0
  194. data/spec/legion/extensions/agentic/memory/hologram/runners/cognitive_hologram_spec.rb +239 -0
  195. data/spec/legion/extensions/agentic/memory/immune_memory/client_spec.rb +18 -0
  196. data/spec/legion/extensions/agentic/memory/immune_memory/cognitive_immune_memory_spec.rb +7 -0
  197. data/spec/legion/extensions/agentic/memory/immune_memory/helpers/encounter_spec.rb +85 -0
  198. data/spec/legion/extensions/agentic/memory/immune_memory/helpers/immune_memory_engine_spec.rb +203 -0
  199. data/spec/legion/extensions/agentic/memory/immune_memory/helpers/memory_cell_spec.rb +190 -0
  200. data/spec/legion/extensions/agentic/memory/immune_memory/runners_spec.rb +83 -0
  201. data/spec/legion/extensions/agentic/memory/nostalgia/client_spec.rb +71 -0
  202. data/spec/legion/extensions/agentic/memory/nostalgia/helpers/constants_spec.rb +65 -0
  203. data/spec/legion/extensions/agentic/memory/nostalgia/helpers/nostalgia_engine_spec.rb +191 -0
  204. data/spec/legion/extensions/agentic/memory/nostalgia/helpers/nostalgia_event_spec.rb +59 -0
  205. data/spec/legion/extensions/agentic/memory/nostalgia/helpers/nostalgic_memory_spec.rb +134 -0
  206. data/spec/legion/extensions/agentic/memory/nostalgia/runners/analysis_spec.rb +97 -0
  207. data/spec/legion/extensions/agentic/memory/nostalgia/runners/recall_spec.rb +81 -0
  208. data/spec/legion/extensions/agentic/memory/offloading/client_spec.rb +30 -0
  209. data/spec/legion/extensions/agentic/memory/offloading/helpers/constants_spec.rb +71 -0
  210. data/spec/legion/extensions/agentic/memory/offloading/helpers/external_store_spec.rb +158 -0
  211. data/spec/legion/extensions/agentic/memory/offloading/helpers/offloaded_item_spec.rb +123 -0
  212. data/spec/legion/extensions/agentic/memory/offloading/helpers/offloading_engine_spec.rb +250 -0
  213. data/spec/legion/extensions/agentic/memory/offloading/runners/cognitive_offloading_spec.rb +194 -0
  214. data/spec/legion/extensions/agentic/memory/paleontology/client_spec.rb +27 -0
  215. data/spec/legion/extensions/agentic/memory/paleontology/cognitive_paleontology_spec.rb +7 -0
  216. data/spec/legion/extensions/agentic/memory/paleontology/helpers/constants_spec.rb +33 -0
  217. data/spec/legion/extensions/agentic/memory/paleontology/helpers/excavation_spec.rb +71 -0
  218. data/spec/legion/extensions/agentic/memory/paleontology/helpers/fossil_spec.rb +134 -0
  219. data/spec/legion/extensions/agentic/memory/paleontology/helpers/paleontology_engine_spec.rb +148 -0
  220. data/spec/legion/extensions/agentic/memory/paleontology/runners/cognitive_paleontology_spec.rb +89 -0
  221. data/spec/legion/extensions/agentic/memory/palimpsest/client_spec.rb +58 -0
  222. data/spec/legion/extensions/agentic/memory/palimpsest/helpers/belief_layer_spec.rb +150 -0
  223. data/spec/legion/extensions/agentic/memory/palimpsest/helpers/constants_spec.rb +63 -0
  224. data/spec/legion/extensions/agentic/memory/palimpsest/helpers/palimpsest_engine_spec.rb +164 -0
  225. data/spec/legion/extensions/agentic/memory/palimpsest/helpers/palimpsest_spec.rb +172 -0
  226. data/spec/legion/extensions/agentic/memory/palimpsest/runners/cognitive_palimpsest_spec.rb +165 -0
  227. data/spec/legion/extensions/agentic/memory/reserve/client_spec.rb +37 -0
  228. data/spec/legion/extensions/agentic/memory/reserve/helpers/pathway_spec.rb +165 -0
  229. data/spec/legion/extensions/agentic/memory/reserve/helpers/reserve_engine_spec.rb +196 -0
  230. data/spec/legion/extensions/agentic/memory/reserve/runners/cognitive_reserve_spec.rb +96 -0
  231. data/spec/legion/extensions/agentic/memory/semantic/client_spec.rb +35 -0
  232. data/spec/legion/extensions/agentic/memory/semantic/helpers/concept_spec.rb +119 -0
  233. data/spec/legion/extensions/agentic/memory/semantic/helpers/knowledge_store_spec.rb +140 -0
  234. data/spec/legion/extensions/agentic/memory/semantic/runners/semantic_memory_spec.rb +103 -0
  235. data/spec/legion/extensions/agentic/memory/semantic_priming/helpers/connection_spec.rb +98 -0
  236. data/spec/legion/extensions/agentic/memory/semantic_priming/helpers/priming_network_spec.rb +208 -0
  237. data/spec/legion/extensions/agentic/memory/semantic_priming/helpers/semantic_node_spec.rb +125 -0
  238. data/spec/legion/extensions/agentic/memory/semantic_priming/semantic_priming_spec.rb +7 -0
  239. data/spec/legion/extensions/agentic/memory/semantic_satiation/client_spec.rb +19 -0
  240. data/spec/legion/extensions/agentic/memory/semantic_satiation/helpers/concept_spec.rb +167 -0
  241. data/spec/legion/extensions/agentic/memory/semantic_satiation/helpers/constants_spec.rb +81 -0
  242. data/spec/legion/extensions/agentic/memory/semantic_satiation/helpers/satiation_engine_spec.rb +189 -0
  243. data/spec/legion/extensions/agentic/memory/semantic_satiation/runners/semantic_satiation_spec.rb +176 -0
  244. data/spec/legion/extensions/agentic/memory/source_monitoring/client_spec.rb +25 -0
  245. data/spec/legion/extensions/agentic/memory/source_monitoring/helpers/source_record_spec.rb +152 -0
  246. data/spec/legion/extensions/agentic/memory/source_monitoring/helpers/source_tracker_spec.rb +139 -0
  247. data/spec/legion/extensions/agentic/memory/source_monitoring/runners/source_monitoring_spec.rb +102 -0
  248. data/spec/legion/extensions/agentic/memory/trace/actors/decay_spec.rb +62 -0
  249. data/spec/legion/extensions/agentic/memory/trace/actors/tier_migration_spec.rb +62 -0
  250. data/spec/legion/extensions/agentic/memory/trace/batch_decay_spec.rb +26 -0
  251. data/spec/legion/extensions/agentic/memory/trace/client_spec.rb +62 -0
  252. data/spec/legion/extensions/agentic/memory/trace/helpers/decay_spec.rb +134 -0
  253. data/spec/legion/extensions/agentic/memory/trace/helpers/store_spec.rb +217 -0
  254. data/spec/legion/extensions/agentic/memory/trace/helpers/trace_spec.rb +120 -0
  255. data/spec/legion/extensions/agentic/memory/trace/local_persistence_spec.rb +255 -0
  256. data/spec/legion/extensions/agentic/memory/trace/memory_spec.rb +11 -0
  257. data/spec/legion/extensions/agentic/memory/trace/persistent_store_spec.rb +50 -0
  258. data/spec/legion/extensions/agentic/memory/trace/quota_spec.rb +56 -0
  259. data/spec/legion/extensions/agentic/memory/trace/runners/consolidation_spec.rb +118 -0
  260. data/spec/legion/extensions/agentic/memory/trace/runners/traces_spec.rb +69 -0
  261. data/spec/legion/extensions/agentic/memory/transfer/client_spec.rb +18 -0
  262. data/spec/legion/extensions/agentic/memory/transfer/helpers/constants_spec.rb +41 -0
  263. data/spec/legion/extensions/agentic/memory/transfer/helpers/domain_knowledge_spec.rb +134 -0
  264. data/spec/legion/extensions/agentic/memory/transfer/helpers/transfer_engine_spec.rb +299 -0
  265. data/spec/legion/extensions/agentic/memory/transfer/runners/transfer_learning_spec.rb +144 -0
  266. data/spec/spec_helper.rb +46 -0
  267. metadata +351 -0
@@ -0,0 +1,134 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::Transfer::Helpers::DomainKnowledge do
4
+ subject(:dk) { described_class.new(domain: :ruby) }
5
+
6
+ describe '#initialize' do
7
+ it 'assigns a uuid id' do
8
+ expect(dk.id).to match(/\A[0-9a-f-]{36}\z/)
9
+ end
10
+
11
+ it 'sets domain' do
12
+ expect(dk.domain).to eq(:ruby)
13
+ end
14
+
15
+ it 'starts proficiency at 0.0' do
16
+ expect(dk.proficiency).to eq(0.0)
17
+ end
18
+
19
+ it 'starts learn_count at 0' do
20
+ expect(dk.learn_count).to eq(0)
21
+ end
22
+
23
+ it 'starts transfer_count at 0' do
24
+ expect(dk.transfer_count).to eq(0)
25
+ end
26
+ end
27
+
28
+ describe '#learn!' do
29
+ it 'increases proficiency by amount' do
30
+ dk.learn!(amount: 0.3)
31
+ expect(dk.proficiency).to eq(0.3)
32
+ end
33
+
34
+ it 'increments learn_count' do
35
+ dk.learn!(amount: 0.1)
36
+ expect(dk.learn_count).to eq(1)
37
+ end
38
+
39
+ it 'clamps proficiency at 1.0' do
40
+ dk.learn!(amount: 1.5)
41
+ expect(dk.proficiency).to eq(1.0)
42
+ end
43
+
44
+ it 'clamps proficiency at 0.0 for negative amount' do
45
+ dk.learn!(amount: -0.5)
46
+ expect(dk.proficiency).to eq(0.0)
47
+ end
48
+
49
+ it 'returns self for chaining' do
50
+ expect(dk.learn!(amount: 0.1)).to be(dk)
51
+ end
52
+ end
53
+
54
+ describe '#record_transfer!' do
55
+ it 'increments transfer_count' do
56
+ dk.record_transfer!
57
+ expect(dk.transfer_count).to eq(1)
58
+ end
59
+
60
+ it 'returns self' do
61
+ expect(dk.record_transfer!).to be(dk)
62
+ end
63
+ end
64
+
65
+ describe '#apply_boost!' do
66
+ it 'increases proficiency' do
67
+ dk.learn!(amount: 0.5)
68
+ dk.apply_boost!(0.2)
69
+ expect(dk.proficiency).to be_within(0.0001).of(0.7)
70
+ end
71
+
72
+ it 'clamps at 1.0' do
73
+ dk.learn!(amount: 0.9)
74
+ dk.apply_boost!(0.5)
75
+ expect(dk.proficiency).to eq(1.0)
76
+ end
77
+ end
78
+
79
+ describe '#apply_penalty!' do
80
+ it 'decreases proficiency' do
81
+ dk.learn!(amount: 0.5)
82
+ dk.apply_penalty!(0.2)
83
+ expect(dk.proficiency).to be_within(0.0001).of(0.3)
84
+ end
85
+
86
+ it 'clamps at 0.0' do
87
+ dk.apply_penalty!(0.5)
88
+ expect(dk.proficiency).to eq(0.0)
89
+ end
90
+ end
91
+
92
+ describe '#proficiency_label' do
93
+ it 'returns novice for 0.0' do
94
+ expect(dk.proficiency_label).to eq('novice')
95
+ end
96
+
97
+ it 'returns beginner for 0.3' do
98
+ dk.learn!(amount: 0.3)
99
+ expect(dk.proficiency_label).to eq('beginner')
100
+ end
101
+
102
+ it 'returns intermediate for 0.5' do
103
+ dk.learn!(amount: 0.5)
104
+ expect(dk.proficiency_label).to eq('intermediate')
105
+ end
106
+
107
+ it 'returns advanced for 0.7' do
108
+ dk.learn!(amount: 0.7)
109
+ expect(dk.proficiency_label).to eq('advanced')
110
+ end
111
+
112
+ it 'returns expert for 0.9' do
113
+ dk.learn!(amount: 0.9)
114
+ expect(dk.proficiency_label).to eq('expert')
115
+ end
116
+ end
117
+
118
+ describe '#to_h' do
119
+ it 'returns a hash with expected keys' do
120
+ hash = dk.to_h
121
+ expect(hash.keys).to contain_exactly(:id, :domain, :proficiency, :proficiency_label, :learn_count, :transfer_count)
122
+ end
123
+
124
+ it 'reflects current proficiency' do
125
+ dk.learn!(amount: 0.4)
126
+ expect(dk.to_h[:proficiency]).to eq(0.4)
127
+ end
128
+
129
+ it 'includes proficiency_label' do
130
+ dk.learn!(amount: 0.4)
131
+ expect(dk.to_h[:proficiency_label]).to eq('intermediate')
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,299 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::Transfer::Helpers::TransferEngine do
4
+ subject(:engine) { described_class.new }
5
+
6
+ describe '#initialize' do
7
+ it 'starts with empty domains' do
8
+ expect(engine.domains).to be_empty
9
+ end
10
+
11
+ it 'starts with empty similarities' do
12
+ expect(engine.similarities).to be_empty
13
+ end
14
+
15
+ it 'starts with empty transfer_history' do
16
+ expect(engine.transfer_history).to be_empty
17
+ end
18
+ end
19
+
20
+ describe '#set_similarity' do
21
+ it 'stores similarity between two domains' do
22
+ engine.set_similarity(domain_a: :ruby, domain_b: :python, similarity: 0.7)
23
+ expect(engine.similarities['python:ruby']).to eq(0.7)
24
+ end
25
+
26
+ it 'is commutative (same key regardless of order)' do
27
+ engine.set_similarity(domain_a: :ruby, domain_b: :python, similarity: 0.7)
28
+ engine.set_similarity(domain_a: :python, domain_b: :ruby, similarity: 0.8)
29
+ key = 'python:ruby'
30
+ expect(engine.similarities[key]).to eq(0.8)
31
+ end
32
+
33
+ it 'clamps similarity to 0.0..1.0' do
34
+ engine.set_similarity(domain_a: :a, domain_b: :b, similarity: 1.5)
35
+ expect(engine.similarities['a:b']).to eq(1.0)
36
+ end
37
+
38
+ it 'clamps negative similarity to 0.0' do
39
+ engine.set_similarity(domain_a: :a, domain_b: :b, similarity: -0.3)
40
+ expect(engine.similarities['a:b']).to eq(0.0)
41
+ end
42
+
43
+ it 'returns the clamped similarity' do
44
+ result = engine.set_similarity(domain_a: :a, domain_b: :b, similarity: 0.5)
45
+ expect(result).to eq(0.5)
46
+ end
47
+ end
48
+
49
+ describe '#learn_domain' do
50
+ it 'creates and returns domain knowledge' do
51
+ result = engine.learn_domain(domain: :ruby, amount: 0.4)
52
+ expect(result[:domain]).to eq(:ruby)
53
+ expect(result[:proficiency]).to eq(0.4)
54
+ end
55
+
56
+ it 'accumulates proficiency on repeated calls' do
57
+ engine.learn_domain(domain: :ruby, amount: 0.3)
58
+ result = engine.learn_domain(domain: :ruby, amount: 0.3)
59
+ expect(result[:proficiency]).to be_within(0.0001).of(0.6)
60
+ end
61
+
62
+ it 'increments learn_count' do
63
+ engine.learn_domain(domain: :ruby, amount: 0.1)
64
+ result = engine.learn_domain(domain: :ruby, amount: 0.1)
65
+ expect(result[:learn_count]).to eq(2)
66
+ end
67
+
68
+ it 'clamps amount before applying' do
69
+ result = engine.learn_domain(domain: :ruby, amount: 5.0)
70
+ expect(result[:proficiency]).to eq(1.0)
71
+ end
72
+ end
73
+
74
+ describe '#attempt_transfer' do
75
+ before do
76
+ engine.learn_domain(domain: :ruby, amount: 0.8)
77
+ end
78
+
79
+ it 'returns source_not_found when source domain does not exist' do
80
+ result = engine.attempt_transfer(from_domain: :unknown, to_domain: :python)
81
+ expect(result[:status]).to eq(:source_not_found)
82
+ end
83
+
84
+ context 'with positive similarity' do
85
+ before { engine.set_similarity(domain_a: :ruby, domain_b: :python, similarity: 0.8) }
86
+
87
+ it 'returns status :ok' do
88
+ result = engine.attempt_transfer(from_domain: :ruby, to_domain: :python)
89
+ expect(result[:status]).to eq(:ok)
90
+ end
91
+
92
+ it 'classifies as positive transfer' do
93
+ result = engine.attempt_transfer(from_domain: :ruby, to_domain: :python)
94
+ expect(result[:type]).to eq(:positive)
95
+ end
96
+
97
+ it 'classifies distance as near' do
98
+ result = engine.attempt_transfer(from_domain: :ruby, to_domain: :python)
99
+ expect(result[:distance]).to eq(:near)
100
+ end
101
+
102
+ it 'boosts target proficiency' do
103
+ result = engine.attempt_transfer(from_domain: :ruby, to_domain: :python)
104
+ expect(result[:effect]).to be > 0
105
+ expect(result[:proficiency]).to be > 0
106
+ end
107
+
108
+ it 'increments source transfer_count' do
109
+ engine.attempt_transfer(from_domain: :ruby, to_domain: :python)
110
+ expect(engine.domains[:ruby].transfer_count).to eq(1)
111
+ end
112
+
113
+ it 'records transfer in history' do
114
+ engine.attempt_transfer(from_domain: :ruby, to_domain: :python)
115
+ expect(engine.transfer_history.size).to eq(1)
116
+ expect(engine.transfer_history.first[:type]).to eq(:positive)
117
+ end
118
+ end
119
+
120
+ context 'with interference similarity (0.3..0.6)' do
121
+ before { engine.set_similarity(domain_a: :ruby, domain_b: :cobol, similarity: 0.4) }
122
+
123
+ it 'classifies as interference' do
124
+ result = engine.attempt_transfer(from_domain: :ruby, to_domain: :cobol)
125
+ expect(result[:type]).to eq(:interference)
126
+ end
127
+
128
+ it 'applies penalty to target' do
129
+ engine.learn_domain(domain: :cobol, amount: 0.5)
130
+ result = engine.attempt_transfer(from_domain: :ruby, to_domain: :cobol)
131
+ expect(result[:effect]).to be < 0
132
+ end
133
+
134
+ it 'classifies distance as moderate' do
135
+ result = engine.attempt_transfer(from_domain: :ruby, to_domain: :cobol)
136
+ expect(result[:distance]).to eq(:moderate)
137
+ end
138
+ end
139
+
140
+ context 'with low similarity (0.0..0.3)' do
141
+ before { engine.set_similarity(domain_a: :ruby, domain_b: :sql, similarity: 0.1) }
142
+
143
+ it 'classifies as negative transfer' do
144
+ result = engine.attempt_transfer(from_domain: :ruby, to_domain: :sql)
145
+ expect(result[:type]).to eq(:negative)
146
+ end
147
+
148
+ it 'applies zero effect (negative = no net change)' do
149
+ result = engine.attempt_transfer(from_domain: :ruby, to_domain: :sql)
150
+ expect(result[:effect]).to eq(0.0)
151
+ end
152
+
153
+ it 'classifies distance as far' do
154
+ result = engine.attempt_transfer(from_domain: :ruby, to_domain: :sql)
155
+ expect(result[:distance]).to eq(:far)
156
+ end
157
+ end
158
+
159
+ context 'with zero similarity (unknown domains)' do
160
+ it 'classifies as neutral transfer' do
161
+ result = engine.attempt_transfer(from_domain: :ruby, to_domain: :haskell)
162
+ expect(result[:type]).to eq(:neutral)
163
+ end
164
+ end
165
+ end
166
+
167
+ describe '#transfer_effectiveness' do
168
+ before do
169
+ engine.learn_domain(domain: :ruby, amount: 0.7)
170
+ engine.learn_domain(domain: :python, amount: 0.3)
171
+ engine.set_similarity(domain_a: :ruby, domain_b: :python, similarity: 0.75)
172
+ end
173
+
174
+ it 'returns effectiveness hash' do
175
+ result = engine.transfer_effectiveness(from_domain: :ruby, to_domain: :python)
176
+ expect(result[:type]).to eq(:positive)
177
+ expect(result[:type_label]).to eq('positive')
178
+ expect(result[:distance]).to eq(:near)
179
+ expect(result[:similarity]).to eq(0.75)
180
+ end
181
+
182
+ it 'returns source and target proficiency' do
183
+ result = engine.transfer_effectiveness(from_domain: :ruby, to_domain: :python)
184
+ expect(result[:source_proficiency]).to eq(0.7)
185
+ expect(result[:target_proficiency]).to eq(0.3)
186
+ end
187
+
188
+ it 'handles unknown domains gracefully' do
189
+ result = engine.transfer_effectiveness(from_domain: :unknown_a, to_domain: :unknown_b)
190
+ expect(result[:source_proficiency]).to eq(0.0)
191
+ expect(result[:target_proficiency]).to eq(0.0)
192
+ end
193
+ end
194
+
195
+ describe '#most_transferable' do
196
+ before do
197
+ engine.learn_domain(domain: :target, amount: 0.2)
198
+ engine.learn_domain(domain: :high_sim, amount: 0.8)
199
+ engine.learn_domain(domain: :low_sim, amount: 0.8)
200
+ engine.learn_domain(domain: :no_sim, amount: 0.8)
201
+ engine.set_similarity(domain_a: :high_sim, domain_b: :target, similarity: 0.9)
202
+ engine.set_similarity(domain_a: :low_sim, domain_b: :target, similarity: 0.1)
203
+ end
204
+
205
+ it 'returns only positively transferable domains' do
206
+ result = engine.most_transferable(target_domain: :target)
207
+ expect(result.map { |r| r[:domain] }).to include(:high_sim)
208
+ expect(result.map { |r| r[:domain] }).not_to include(:low_sim)
209
+ expect(result.map { |r| r[:domain] }).not_to include(:no_sim)
210
+ end
211
+
212
+ it 'sorts by similarity descending' do
213
+ engine.learn_domain(domain: :mid_sim, amount: 0.8)
214
+ engine.set_similarity(domain_a: :mid_sim, domain_b: :target, similarity: 0.7)
215
+ result = engine.most_transferable(target_domain: :target)
216
+ sims = result.map { |r| r[:similarity] }
217
+ expect(sims).to eq(sims.sort.reverse)
218
+ end
219
+
220
+ it 'respects the limit parameter' do
221
+ 5.times do |i|
222
+ name = :"domain_#{i}"
223
+ engine.learn_domain(domain: name, amount: 0.5)
224
+ engine.set_similarity(domain_a: name, domain_b: :target, similarity: 0.7 + (i * 0.01))
225
+ end
226
+ result = engine.most_transferable(target_domain: :target, limit: 3)
227
+ expect(result.size).to be <= 3
228
+ end
229
+ end
230
+
231
+ describe '#interference_risks' do
232
+ before do
233
+ engine.learn_domain(domain: :target, amount: 0.3)
234
+ engine.learn_domain(domain: :risky, amount: 0.8)
235
+ engine.learn_domain(domain: :safe, amount: 0.8)
236
+ engine.set_similarity(domain_a: :risky, domain_b: :target, similarity: 0.45)
237
+ engine.set_similarity(domain_a: :safe, domain_b: :target, similarity: 0.8)
238
+ end
239
+
240
+ it 'returns only interference-type domains' do
241
+ result = engine.interference_risks(target_domain: :target)
242
+ domains = result.map { |r| r[:domain] }
243
+ expect(domains).to include(:risky)
244
+ expect(domains).not_to include(:safe)
245
+ end
246
+
247
+ it 'sorts by similarity descending' do
248
+ engine.learn_domain(domain: :also_risky, amount: 0.5)
249
+ engine.set_similarity(domain_a: :also_risky, domain_b: :target, similarity: 0.35)
250
+ result = engine.interference_risks(target_domain: :target)
251
+ sims = result.map { |r| r[:similarity] }
252
+ expect(sims).to eq(sims.sort.reverse)
253
+ end
254
+
255
+ it 'returns empty array when no interference risks' do
256
+ engine2 = described_class.new
257
+ engine2.learn_domain(domain: :t, amount: 0.3)
258
+ expect(engine2.interference_risks(target_domain: :t)).to be_empty
259
+ end
260
+ end
261
+
262
+ describe '#transfer_report' do
263
+ it 'returns zero counts for empty engine' do
264
+ report = engine.transfer_report
265
+ expect(report[:total_transfers]).to eq(0)
266
+ expect(report[:domain_count]).to eq(0)
267
+ end
268
+
269
+ it 'counts transfers correctly' do
270
+ engine.learn_domain(domain: :a, amount: 0.8)
271
+ engine.set_similarity(domain_a: :a, domain_b: :b, similarity: 0.7)
272
+ engine.attempt_transfer(from_domain: :a, to_domain: :b)
273
+ engine.attempt_transfer(from_domain: :a, to_domain: :b)
274
+ report = engine.transfer_report
275
+ expect(report[:total_transfers]).to eq(2)
276
+ expect(report[:positive_transfers]).to eq(2)
277
+ end
278
+
279
+ it 'counts interference events' do
280
+ engine.learn_domain(domain: :a, amount: 0.8)
281
+ engine.set_similarity(domain_a: :a, domain_b: :b, similarity: 0.4)
282
+ engine.attempt_transfer(from_domain: :a, to_domain: :b)
283
+ report = engine.transfer_report
284
+ expect(report[:interference_events]).to eq(1)
285
+ end
286
+ end
287
+
288
+ describe '#to_h' do
289
+ it 'returns a hash with expected keys' do
290
+ keys = engine.to_h.keys
291
+ expect(keys).to contain_exactly(:domains, :similarities, :transfer_history, :report)
292
+ end
293
+
294
+ it 'reflects current state' do
295
+ engine.learn_domain(domain: :ruby, amount: 0.5)
296
+ expect(engine.to_h[:domains].keys).to include(:ruby)
297
+ end
298
+ end
299
+ end
@@ -0,0 +1,144 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/memory/transfer/client'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Memory::Transfer::Runners::TransferLearning do
6
+ let(:client) { Legion::Extensions::Agentic::Memory::Transfer::Client.new }
7
+
8
+ describe '#learn_domain' do
9
+ it 'returns domain knowledge hash' do
10
+ result = client.learn_domain(domain: :ruby, amount: 0.5)
11
+ expect(result[:domain]).to eq(:ruby)
12
+ expect(result[:proficiency]).to eq(0.5)
13
+ end
14
+
15
+ it 'accumulates proficiency across calls' do
16
+ client.learn_domain(domain: :ruby, amount: 0.3)
17
+ result = client.learn_domain(domain: :ruby, amount: 0.3)
18
+ expect(result[:proficiency]).to be_within(0.0001).of(0.6)
19
+ end
20
+ end
21
+
22
+ describe '#set_similarity' do
23
+ it 'returns similarity hash' do
24
+ result = client.set_similarity(domain_a: :ruby, domain_b: :python, similarity: 0.7)
25
+ expect(result[:domain_a]).to eq(:ruby)
26
+ expect(result[:domain_b]).to eq(:python)
27
+ expect(result[:similarity]).to eq(0.7)
28
+ end
29
+ end
30
+
31
+ describe '#attempt_transfer' do
32
+ before do
33
+ client.learn_domain(domain: :ruby, amount: 0.8)
34
+ client.set_similarity(domain_a: :ruby, domain_b: :python, similarity: 0.8)
35
+ end
36
+
37
+ it 'returns ok status for known source' do
38
+ result = client.attempt_transfer(from_domain: :ruby, to_domain: :python)
39
+ expect(result[:status]).to eq(:ok)
40
+ end
41
+
42
+ it 'returns positive type for high similarity' do
43
+ result = client.attempt_transfer(from_domain: :ruby, to_domain: :python)
44
+ expect(result[:type]).to eq(:positive)
45
+ end
46
+
47
+ it 'returns source_not_found for unknown source' do
48
+ result = client.attempt_transfer(from_domain: :unknown, to_domain: :python)
49
+ expect(result[:status]).to eq(:source_not_found)
50
+ end
51
+
52
+ it 'includes proficiency in response' do
53
+ result = client.attempt_transfer(from_domain: :ruby, to_domain: :python)
54
+ expect(result).to have_key(:proficiency)
55
+ end
56
+ end
57
+
58
+ describe '#transfer_effectiveness' do
59
+ before do
60
+ client.learn_domain(domain: :a, amount: 0.6)
61
+ client.learn_domain(domain: :b, amount: 0.4)
62
+ client.set_similarity(domain_a: :a, domain_b: :b, similarity: 0.7)
63
+ end
64
+
65
+ it 'returns effectiveness details' do
66
+ result = client.transfer_effectiveness(from_domain: :a, to_domain: :b)
67
+ expect(result[:type]).to eq(:positive)
68
+ expect(result[:type_label]).to eq('positive')
69
+ expect(result[:distance_label]).to eq('near')
70
+ end
71
+ end
72
+
73
+ describe '#most_transferable' do
74
+ before do
75
+ client.learn_domain(domain: :target, amount: 0.2)
76
+ client.learn_domain(domain: :good_source, amount: 0.8)
77
+ client.set_similarity(domain_a: :good_source, domain_b: :target, similarity: 0.9)
78
+ end
79
+
80
+ it 'returns candidates hash' do
81
+ result = client.most_transferable(target_domain: :target)
82
+ expect(result[:target_domain]).to eq(:target)
83
+ expect(result[:candidates]).to be_an(Array)
84
+ expect(result[:count]).to eq(result[:candidates].size)
85
+ end
86
+
87
+ it 'includes positive transfer candidates' do
88
+ result = client.most_transferable(target_domain: :target)
89
+ expect(result[:candidates].map { |c| c[:domain] }).to include(:good_source)
90
+ end
91
+ end
92
+
93
+ describe '#interference_risks' do
94
+ before do
95
+ client.learn_domain(domain: :target, amount: 0.3)
96
+ client.learn_domain(domain: :risky_source, amount: 0.8)
97
+ client.set_similarity(domain_a: :risky_source, domain_b: :target, similarity: 0.4)
98
+ end
99
+
100
+ it 'returns risks hash' do
101
+ result = client.interference_risks(target_domain: :target)
102
+ expect(result[:target_domain]).to eq(:target)
103
+ expect(result[:risks]).to be_an(Array)
104
+ expect(result[:count]).to eq(result[:risks].size)
105
+ end
106
+
107
+ it 'identifies interference risks' do
108
+ result = client.interference_risks(target_domain: :target)
109
+ expect(result[:risks].map { |r| r[:domain] }).to include(:risky_source)
110
+ end
111
+ end
112
+
113
+ describe '#transfer_report' do
114
+ it 'returns a report hash' do
115
+ result = client.transfer_report
116
+ expect(result).to have_key(:total_transfers)
117
+ expect(result).to have_key(:domain_count)
118
+ end
119
+
120
+ it 'counts transfers after attempts' do
121
+ client.learn_domain(domain: :a, amount: 0.8)
122
+ client.set_similarity(domain_a: :a, domain_b: :b, similarity: 0.7)
123
+ client.attempt_transfer(from_domain: :a, to_domain: :b)
124
+ result = client.transfer_report
125
+ expect(result[:total_transfers]).to eq(1)
126
+ expect(result[:positive_transfers]).to eq(1)
127
+ end
128
+ end
129
+
130
+ describe '#get_domain' do
131
+ it 'returns found: false for unknown domain' do
132
+ result = client.get_domain(domain: :unknown)
133
+ expect(result[:found]).to be false
134
+ expect(result[:domain]).to eq(:unknown)
135
+ end
136
+
137
+ it 'returns found: true for known domain' do
138
+ client.learn_domain(domain: :ruby, amount: 0.5)
139
+ result = client.get_domain(domain: :ruby)
140
+ expect(result[:found]).to be true
141
+ expect(result[:domain][:domain]).to eq(:ruby)
142
+ end
143
+ end
144
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/setup'
4
+
5
+ module Legion
6
+ module Logging
7
+ def self.debug(_msg); end
8
+ def self.info(_msg); end
9
+ def self.warn(_msg); end
10
+ def self.error(_msg); end
11
+ def self.fatal(_msg); end
12
+ end
13
+
14
+ module Extensions
15
+ module Core
16
+ def self.extended(_base); end
17
+ end
18
+
19
+ module Helpers
20
+ module Lex
21
+ def self.included(_base); end
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ # rubocop:disable Lint/EmptyClass, Style/OneClassPerFile
28
+ module Legion
29
+ module Extensions
30
+ module Actors
31
+ class Every; end
32
+ class Once; end
33
+ end
34
+ end
35
+ end
36
+ $LOADED_FEATURES << 'legion/extensions/actors/every'
37
+ $LOADED_FEATURES << 'legion/extensions/actors/once'
38
+ # rubocop:enable Lint/EmptyClass, Style/OneClassPerFile
39
+
40
+ require 'legion/extensions/agentic/memory'
41
+
42
+ RSpec.configure do |config|
43
+ config.example_status_persistence_file_path = '.rspec_status'
44
+ config.disable_monkey_patching!
45
+ config.expect_with(:rspec) { |c| c.syntax = :expect }
46
+ end