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,165 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::Palimpsest::Runners::CognitivePalimpsest do
4
+ let(:engine) { Legion::Extensions::Agentic::Memory::Palimpsest::Helpers::PalimpsestEngine.new }
5
+ let(:runner) do
6
+ obj = Object.new
7
+ obj.extend(described_class)
8
+ obj
9
+ end
10
+
11
+ describe '#create_palimpsest' do
12
+ it 'creates a palimpsest' do
13
+ result = runner.create_palimpsest(topic: 'memory', domain: :factual)
14
+ expect(result[:success]).to be true
15
+ expect(result[:topic]).to eq('memory')
16
+ end
17
+
18
+ it 'returns failure for duplicate topic' do
19
+ runner.create_palimpsest(topic: 'dupe')
20
+ result = runner.create_palimpsest(topic: 'dupe')
21
+ expect(result[:success]).to be false
22
+ expect(result[:reason]).to eq(:limit_or_duplicate)
23
+ end
24
+ end
25
+
26
+ describe '#overwrite_belief' do
27
+ it 'overwrites a belief' do
28
+ result = runner.overwrite_belief(topic: 'sky', content: 'blue', confidence: 0.8)
29
+ expect(result[:success]).to be true
30
+ expect(result[:version]).to eq(1)
31
+ expect(result[:confidence]).to eq(0.8)
32
+ end
33
+
34
+ it 'increments version on subsequent writes' do
35
+ runner.overwrite_belief(topic: 'sky', content: 'v1')
36
+ result = runner.overwrite_belief(topic: 'sky', content: 'v2')
37
+ expect(result[:version]).to eq(2)
38
+ end
39
+
40
+ it 'accepts custom engine' do
41
+ result = runner.overwrite_belief(topic: 'x', content: 'y', engine: engine)
42
+ expect(result[:success]).to be true
43
+ expect(engine.palimpsests).to have_key('x')
44
+ end
45
+ end
46
+
47
+ describe '#peek_through_belief' do
48
+ it 'returns previous layers' do
49
+ runner.overwrite_belief(topic: 'p', content: 'v1')
50
+ runner.overwrite_belief(topic: 'p', content: 'v2')
51
+ result = runner.peek_through_belief(topic: 'p', depth: 1)
52
+ expect(result[:success]).to be true
53
+ expect(result[:count]).to eq(1)
54
+ expect(result[:layers].first[:content]).to eq('v1')
55
+ end
56
+
57
+ it 'returns empty for topic with no history' do
58
+ runner.overwrite_belief(topic: 'fresh', content: 'v1')
59
+ result = runner.peek_through_belief(topic: 'fresh')
60
+ expect(result[:count]).to eq(0)
61
+ end
62
+ end
63
+
64
+ describe '#erode_belief' do
65
+ it 'erodes current layer confidence' do
66
+ runner.overwrite_belief(topic: 'e', content: 'x', confidence: 0.8)
67
+ result = runner.erode_belief(topic: 'e')
68
+ expect(result[:success]).to be true
69
+ expect(result[:confidence]).to be < 0.8
70
+ end
71
+
72
+ it 'returns failure for unknown topic' do
73
+ result = runner.erode_belief(topic: 'missing')
74
+ expect(result[:success]).to be false
75
+ expect(result[:reason]).to eq(:not_found)
76
+ end
77
+ end
78
+
79
+ describe '#ghost_layers' do
80
+ it 'returns ghost layers for topic' do
81
+ runner.overwrite_belief(topic: 'g', content: 'v1', confidence: 0.8)
82
+ runner.overwrite_belief(topic: 'g', content: 'v2')
83
+ result = runner.ghost_layers(topic: 'g')
84
+ expect(result[:success]).to be true
85
+ expect(result[:count]).to eq(1)
86
+ end
87
+ end
88
+
89
+ describe '#all_ghost_layers' do
90
+ it 'aggregates ghosts from all palimpsests' do
91
+ runner.overwrite_belief(topic: 'a', content: 'v1', confidence: 0.8)
92
+ runner.overwrite_belief(topic: 'a', content: 'v2')
93
+ result = runner.all_ghost_layers
94
+ expect(result[:success]).to be true
95
+ expect(result[:count]).to be >= 1
96
+ end
97
+ end
98
+
99
+ describe '#domain_archaeology' do
100
+ it 'returns all layers for domain' do
101
+ runner.create_palimpsest(topic: 'arch', domain: :procedural)
102
+ runner.overwrite_belief(topic: 'arch', content: 'v1')
103
+ runner.overwrite_belief(topic: 'arch', content: 'v2')
104
+ result = runner.domain_archaeology(domain: :procedural)
105
+ expect(result[:success]).to be true
106
+ expect(result[:count]).to eq(2)
107
+ end
108
+ end
109
+
110
+ describe '#belief_drift' do
111
+ it 'returns drift info' do
112
+ runner.overwrite_belief(topic: 'd', content: 'v1', confidence: 0.2)
113
+ runner.overwrite_belief(topic: 'd', content: 'v2', confidence: 0.9)
114
+ result = runner.belief_drift(topic: 'd')
115
+ expect(result[:success]).to be true
116
+ expect(result[:drift]).to be > 0
117
+ end
118
+
119
+ it 'returns failure for unknown topic' do
120
+ result = runner.belief_drift(topic: 'ghost_topic')
121
+ expect(result[:success]).to be false
122
+ end
123
+ end
124
+
125
+ describe '#overwrite_frequency' do
126
+ it 'returns overwrite count' do
127
+ 3.times { |i| runner.overwrite_belief(topic: 'freq', content: "v#{i}") }
128
+ result = runner.overwrite_frequency(topic: 'freq')
129
+ expect(result[:success]).to be true
130
+ expect(result[:overwrite_count]).to eq(3)
131
+ end
132
+
133
+ it 'returns failure for unknown topic' do
134
+ result = runner.overwrite_frequency(topic: 'missing')
135
+ expect(result[:success]).to be false
136
+ end
137
+ end
138
+
139
+ describe '#most_rewritten' do
140
+ it 'returns sorted list' do
141
+ 3.times { runner.overwrite_belief(topic: 'hot', content: "v#{it}") }
142
+ runner.overwrite_belief(topic: 'cold', content: 'v1')
143
+ result = runner.most_rewritten(limit: 2)
144
+ expect(result[:success]).to be true
145
+ expect(result[:palimpsests].first[:topic]).to eq('hot')
146
+ end
147
+ end
148
+
149
+ describe '#decay_all_ghosts' do
150
+ it 'returns success' do
151
+ result = runner.decay_all_ghosts
152
+ expect(result[:success]).to be true
153
+ end
154
+ end
155
+
156
+ describe '#palimpsest_report' do
157
+ it 'returns report with expected keys' do
158
+ runner.overwrite_belief(topic: 'rep', content: 'v1', confidence: 0.8)
159
+ runner.overwrite_belief(topic: 'rep', content: 'v2')
160
+ result = runner.palimpsest_report
161
+ expect(result[:success]).to be true
162
+ expect(result).to include(:palimpsest_count, :total_ghosts, :average_drift)
163
+ end
164
+ end
165
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::Reserve::Client do
4
+ subject(:client) { described_class.new }
5
+
6
+ describe '#add_cognitive_pathway' do
7
+ it 'delegates to runner' do
8
+ result = client.add_cognitive_pathway(function: :reasoning)
9
+ expect(result[:success]).to be true
10
+ end
11
+ end
12
+
13
+ describe '#damage_cognitive_pathway' do
14
+ it 'damages and reports state' do
15
+ pathway = client.add_cognitive_pathway(function: :test)
16
+ result = client.damage_cognitive_pathway(pathway_id: pathway[:pathway_id], amount: 0.3)
17
+ expect(result[:state]).to eq(:healthy)
18
+ end
19
+ end
20
+
21
+ describe '#cognitive_reserve_stats' do
22
+ it 'returns stats' do
23
+ result = client.cognitive_reserve_stats
24
+ expect(result[:success]).to be true
25
+ expect(result[:pathway_count]).to eq(0)
26
+ end
27
+ end
28
+
29
+ describe 'with injected engine' do
30
+ it 'uses the provided engine' do
31
+ engine = Legion::Extensions::Agentic::Memory::Reserve::Helpers::ReserveEngine.new
32
+ engine.add_pathway(function: :preloaded)
33
+ custom_client = described_class.new(engine: engine)
34
+ expect(custom_client.cognitive_reserve_stats[:pathway_count]).to eq(1)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,165 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::Reserve::Helpers::Pathway do
4
+ subject(:pathway) do
5
+ described_class.new(id: :path_one, function: :reasoning, domain: :cognition)
6
+ end
7
+
8
+ let(:constants) { Legion::Extensions::Agentic::Memory::Reserve::Helpers::Constants }
9
+
10
+ describe '#initialize' do
11
+ it 'sets id' do
12
+ expect(pathway.id).to eq(:path_one)
13
+ end
14
+
15
+ it 'sets function' do
16
+ expect(pathway.function).to eq(:reasoning)
17
+ end
18
+
19
+ it 'sets domain' do
20
+ expect(pathway.domain).to eq(:cognition)
21
+ end
22
+
23
+ it 'starts at full capacity' do
24
+ expect(pathway.capacity).to eq(1.0)
25
+ end
26
+
27
+ it 'starts healthy' do
28
+ expect(pathway.state).to eq(:healthy)
29
+ end
30
+
31
+ it 'starts with empty backups' do
32
+ expect(pathway.backup_ids).to be_empty
33
+ end
34
+
35
+ it 'clamps capacity above ceiling' do
36
+ p = described_class.new(id: :x, function: :test, capacity: 1.5)
37
+ expect(p.capacity).to eq(constants::CAPACITY_CEILING)
38
+ end
39
+
40
+ it 'clamps capacity below floor' do
41
+ p = described_class.new(id: :x, function: :test, capacity: -0.5)
42
+ expect(p.capacity).to eq(constants::CAPACITY_FLOOR)
43
+ end
44
+ end
45
+
46
+ describe '#damage' do
47
+ it 'reduces capacity' do
48
+ pathway.damage(amount: 0.3)
49
+ expect(pathway.capacity).to eq(0.7)
50
+ end
51
+
52
+ it 'increments damage count' do
53
+ pathway.damage(amount: 0.1)
54
+ expect(pathway.damage_count).to eq(1)
55
+ end
56
+
57
+ it 'clamps at floor' do
58
+ pathway.damage(amount: 2.0)
59
+ expect(pathway.capacity).to eq(0.0)
60
+ end
61
+
62
+ it 'returns self for chaining' do
63
+ expect(pathway.damage(amount: 0.1)).to be(pathway)
64
+ end
65
+ end
66
+
67
+ describe '#recover' do
68
+ before { pathway.damage(amount: 0.5) }
69
+
70
+ it 'increases capacity' do
71
+ original = pathway.capacity
72
+ pathway.recover(amount: 0.1)
73
+ expect(pathway.capacity).to be > original
74
+ end
75
+
76
+ it 'clamps at ceiling' do
77
+ pathway.recover(amount: 2.0)
78
+ expect(pathway.capacity).to eq(1.0)
79
+ end
80
+ end
81
+
82
+ describe '#add_backup' do
83
+ it 'adds a backup pathway ID' do
84
+ pathway.add_backup(pathway_id: :backup_one)
85
+ expect(pathway.backup_ids).to include(:backup_one)
86
+ end
87
+
88
+ it 'ignores duplicates' do
89
+ pathway.add_backup(pathway_id: :backup_one)
90
+ pathway.add_backup(pathway_id: :backup_one)
91
+ expect(pathway.backup_ids.size).to eq(1)
92
+ end
93
+ end
94
+
95
+ describe '#remove_backup' do
96
+ it 'removes a backup' do
97
+ pathway.add_backup(pathway_id: :backup_one)
98
+ pathway.remove_backup(pathway_id: :backup_one)
99
+ expect(pathway.backup_ids).to be_empty
100
+ end
101
+ end
102
+
103
+ describe '#state' do
104
+ it 'is :healthy at full capacity' do
105
+ expect(pathway.state).to eq(:healthy)
106
+ end
107
+
108
+ it 'is :degraded below threshold without backups' do
109
+ pathway.damage(amount: 0.6)
110
+ expect(pathway.state).to eq(:degraded)
111
+ end
112
+
113
+ it 'is :compensating below threshold with backups' do
114
+ pathway.add_backup(pathway_id: :backup_one)
115
+ pathway.damage(amount: 0.6)
116
+ expect(pathway.state).to eq(:compensating)
117
+ end
118
+
119
+ it 'is :failed at very low capacity' do
120
+ pathway.damage(amount: 0.95)
121
+ expect(pathway.state).to eq(:failed)
122
+ end
123
+ end
124
+
125
+ describe '#effective_capacity' do
126
+ it 'returns raw capacity when healthy' do
127
+ expect(pathway.effective_capacity).to eq(1.0)
128
+ end
129
+
130
+ it 'compensates when degraded with backup capacities' do
131
+ pathway.damage(amount: 0.7)
132
+ effective = pathway.effective_capacity(backup_capacities: [0.8])
133
+ expect(effective).to be > pathway.capacity
134
+ end
135
+
136
+ it 'does not exceed threshold with compensation' do
137
+ pathway.damage(amount: 0.6)
138
+ effective = pathway.effective_capacity(backup_capacities: [1.0, 1.0])
139
+ expect(effective).to be <= constants::CAPACITY_CEILING
140
+ end
141
+ end
142
+
143
+ describe '#redundancy' do
144
+ it 'returns zero with no backups' do
145
+ expect(pathway.redundancy).to eq(0)
146
+ end
147
+
148
+ it 'returns backup count' do
149
+ pathway.add_backup(pathway_id: :a)
150
+ pathway.add_backup(pathway_id: :b)
151
+ expect(pathway.redundancy).to eq(2)
152
+ end
153
+ end
154
+
155
+ describe '#to_h' do
156
+ it 'returns expected keys' do
157
+ h = pathway.to_h
158
+ expect(h).to include(
159
+ :id, :function, :domain, :capacity, :state,
160
+ :backup_count, :backup_ids, :damage_count,
161
+ :compensation_count, :created_at, :updated_at
162
+ )
163
+ end
164
+ end
165
+ end
@@ -0,0 +1,196 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::Reserve::Helpers::ReserveEngine do
4
+ subject(:engine) { described_class.new }
5
+
6
+ let(:constants) { Legion::Extensions::Agentic::Memory::Reserve::Helpers::Constants }
7
+
8
+ describe '#initialize' do
9
+ it 'starts with empty pathways' do
10
+ expect(engine.pathways).to be_empty
11
+ end
12
+
13
+ it 'starts with empty history' do
14
+ expect(engine.history).to be_empty
15
+ end
16
+ end
17
+
18
+ describe '#add_pathway' do
19
+ it 'creates a pathway' do
20
+ pathway = engine.add_pathway(function: :reasoning)
21
+ expect(pathway).to be_a(Legion::Extensions::Agentic::Memory::Reserve::Helpers::Pathway)
22
+ end
23
+
24
+ it 'stores the pathway' do
25
+ pathway = engine.add_pathway(function: :memory)
26
+ expect(engine.pathways[pathway.id]).to be(pathway)
27
+ end
28
+
29
+ it 'respects limit' do
30
+ constants::MAX_PATHWAYS.times { |i| engine.add_pathway(function: :"fn_#{i}") }
31
+ expect(engine.add_pathway(function: :overflow)).to be_nil
32
+ end
33
+ end
34
+
35
+ describe '#link_backup' do
36
+ let!(:primary) { engine.add_pathway(function: :reasoning) }
37
+ let!(:backup) { engine.add_pathway(function: :reasoning_backup) }
38
+
39
+ it 'links backup to primary' do
40
+ engine.link_backup(primary_id: primary.id, backup_id: backup.id)
41
+ expect(primary.backup_ids).to include(backup.id)
42
+ end
43
+
44
+ it 'returns nil for unknown IDs' do
45
+ expect(engine.link_backup(primary_id: :nonexistent, backup_id: backup.id)).to be_nil
46
+ end
47
+ end
48
+
49
+ describe '#damage_pathway' do
50
+ let!(:pathway) { engine.add_pathway(function: :reasoning) }
51
+
52
+ it 'reduces capacity' do
53
+ engine.damage_pathway(pathway_id: pathway.id, amount: 0.3)
54
+ expect(pathway.capacity).to eq(0.7)
55
+ end
56
+
57
+ it 'returns nil for unknown ID' do
58
+ expect(engine.damage_pathway(pathway_id: :nonexistent, amount: 0.1)).to be_nil
59
+ end
60
+
61
+ it 'triggers compensation when degraded with backup' do
62
+ backup = engine.add_pathway(function: :backup)
63
+ engine.link_backup(primary_id: pathway.id, backup_id: backup.id)
64
+ engine.damage_pathway(pathway_id: pathway.id, amount: 0.7)
65
+ expect(pathway.compensation_count).to be >= 1
66
+ end
67
+ end
68
+
69
+ describe '#recover_pathway' do
70
+ let!(:pathway) { engine.add_pathway(function: :reasoning) }
71
+
72
+ it 'increases capacity' do
73
+ engine.damage_pathway(pathway_id: pathway.id, amount: 0.5)
74
+ original = pathway.capacity
75
+ engine.recover_pathway(pathway_id: pathway.id, amount: 0.1)
76
+ expect(pathway.capacity).to be > original
77
+ end
78
+ end
79
+
80
+ describe '#effective_capacity' do
81
+ it 'returns capacity with compensation' do
82
+ primary = engine.add_pathway(function: :reasoning)
83
+ backup = engine.add_pathway(function: :backup)
84
+ engine.link_backup(primary_id: primary.id, backup_id: backup.id)
85
+ engine.damage_pathway(pathway_id: primary.id, amount: 0.7)
86
+ expect(engine.effective_capacity(pathway_id: primary.id)).to be > primary.capacity
87
+ end
88
+
89
+ it 'returns nil for unknown ID' do
90
+ expect(engine.effective_capacity(pathway_id: :nonexistent)).to be_nil
91
+ end
92
+ end
93
+
94
+ describe '#overall_reserve' do
95
+ it 'returns 1.0 when empty' do
96
+ expect(engine.overall_reserve).to eq(1.0)
97
+ end
98
+
99
+ it 'decreases when pathways are damaged' do
100
+ p = engine.add_pathway(function: :test)
101
+ engine.damage_pathway(pathway_id: p.id, amount: 0.5)
102
+ expect(engine.overall_reserve).to be < 1.0
103
+ end
104
+ end
105
+
106
+ describe '#reserve_label' do
107
+ it 'returns :robust when healthy' do
108
+ engine.add_pathway(function: :test)
109
+ expect(engine.reserve_label).to eq(:robust)
110
+ end
111
+
112
+ it 'returns worse labels when damaged' do
113
+ p = engine.add_pathway(function: :test)
114
+ engine.damage_pathway(pathway_id: p.id, amount: 0.8)
115
+ expect(%i[vulnerable critical reduced]).to include(engine.reserve_label)
116
+ end
117
+ end
118
+
119
+ describe '#degraded_pathways' do
120
+ it 'returns empty when all healthy' do
121
+ engine.add_pathway(function: :test)
122
+ expect(engine.degraded_pathways).to be_empty
123
+ end
124
+
125
+ it 'returns degraded pathways' do
126
+ p = engine.add_pathway(function: :test)
127
+ engine.damage_pathway(pathway_id: p.id, amount: 0.6)
128
+ expect(engine.degraded_pathways.size).to eq(1)
129
+ end
130
+ end
131
+
132
+ describe '#domain_reserve' do
133
+ it 'computes reserve for specific domain' do
134
+ engine.add_pathway(function: :reasoning, domain: :cognition)
135
+ engine.add_pathway(function: :emotion, domain: :affect)
136
+ expect(engine.domain_reserve(domain: :cognition)).to eq(1.0)
137
+ end
138
+
139
+ it 'returns default for unknown domain' do
140
+ expect(engine.domain_reserve(domain: :nonexistent)).to eq(1.0)
141
+ end
142
+ end
143
+
144
+ describe '#most_vulnerable' do
145
+ it 'returns pathways sorted by capacity ascending' do
146
+ healthy = engine.add_pathway(function: :healthy)
147
+ weak = engine.add_pathway(function: :weak)
148
+ engine.damage_pathway(pathway_id: weak.id, amount: 0.7)
149
+ result = engine.most_vulnerable(limit: 2)
150
+ expect(result.first[:capacity]).to be <= result.last[:capacity]
151
+ expect(result.first[:function]).to eq(weak.function)
152
+ expect(result.last[:function]).to eq(healthy.function)
153
+ end
154
+ end
155
+
156
+ describe '#most_redundant' do
157
+ it 'returns pathways sorted by backup count descending' do
158
+ redundant = engine.add_pathway(function: :main)
159
+ simple = engine.add_pathway(function: :simple)
160
+ backup = engine.add_pathway(function: :backup)
161
+ engine.link_backup(primary_id: redundant.id, backup_id: backup.id)
162
+ result = engine.most_redundant(limit: 3)
163
+ expect(result.first[:backup_count]).to be >= result.last[:backup_count]
164
+ expect(result.first[:function]).to eq(redundant.function)
165
+ expect(result.last[:function]).to eq(simple.function).or eq(backup.function)
166
+ end
167
+ end
168
+
169
+ describe '#recover_all' do
170
+ it 'recovers non-failed pathways' do
171
+ p = engine.add_pathway(function: :test)
172
+ engine.damage_pathway(pathway_id: p.id, amount: 0.3)
173
+ original = p.capacity
174
+ engine.recover_all
175
+ expect(p.capacity).to be > original
176
+ end
177
+
178
+ it 'does not recover failed pathways' do
179
+ p = engine.add_pathway(function: :test)
180
+ engine.damage_pathway(pathway_id: p.id, amount: 0.95)
181
+ original = p.capacity
182
+ engine.recover_all
183
+ expect(p.capacity).to eq(original)
184
+ end
185
+ end
186
+
187
+ describe '#to_h' do
188
+ it 'returns stats hash' do
189
+ h = engine.to_h
190
+ expect(h).to include(
191
+ :pathway_count, :overall_reserve, :reserve_label,
192
+ :healthy_count, :degraded_count, :failed_count, :history_size
193
+ )
194
+ end
195
+ end
196
+ end
@@ -0,0 +1,96 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::Reserve::Runners::CognitiveReserve do
4
+ let(:runner_host) do
5
+ Object.new.tap { |o| o.extend(described_class) }
6
+ end
7
+
8
+ describe '#add_cognitive_pathway' do
9
+ it 'creates a pathway' do
10
+ result = runner_host.add_cognitive_pathway(function: :reasoning)
11
+ expect(result[:success]).to be true
12
+ expect(result[:pathway_id]).to be_a(Symbol)
13
+ end
14
+ end
15
+
16
+ describe '#link_backup_pathway' do
17
+ it 'links a backup' do
18
+ primary = runner_host.add_cognitive_pathway(function: :main)
19
+ backup = runner_host.add_cognitive_pathway(function: :backup)
20
+ result = runner_host.link_backup_pathway(
21
+ primary_id: primary[:pathway_id],
22
+ backup_id: backup[:pathway_id]
23
+ )
24
+ expect(result[:success]).to be true
25
+ expect(result[:backup_count]).to eq(1)
26
+ end
27
+
28
+ it 'returns failure for unknown IDs' do
29
+ result = runner_host.link_backup_pathway(primary_id: :fake, backup_id: :fake)
30
+ expect(result[:success]).to be false
31
+ end
32
+ end
33
+
34
+ describe '#damage_cognitive_pathway' do
35
+ it 'damages and returns state' do
36
+ pathway = runner_host.add_cognitive_pathway(function: :test)
37
+ result = runner_host.damage_cognitive_pathway(pathway_id: pathway[:pathway_id], amount: 0.3)
38
+ expect(result[:success]).to be true
39
+ expect(result[:capacity]).to eq(0.7)
40
+ end
41
+
42
+ it 'returns failure for unknown ID' do
43
+ result = runner_host.damage_cognitive_pathway(pathway_id: :fake, amount: 0.1)
44
+ expect(result[:success]).to be false
45
+ end
46
+ end
47
+
48
+ describe '#recover_cognitive_pathway' do
49
+ it 'recovers capacity' do
50
+ pathway = runner_host.add_cognitive_pathway(function: :test)
51
+ runner_host.damage_cognitive_pathway(pathway_id: pathway[:pathway_id], amount: 0.5)
52
+ result = runner_host.recover_cognitive_pathway(pathway_id: pathway[:pathway_id], amount: 0.1)
53
+ expect(result[:success]).to be true
54
+ expect(result[:capacity]).to eq(0.6)
55
+ end
56
+ end
57
+
58
+ describe '#cognitive_reserve_assessment' do
59
+ it 'returns assessment with expected keys' do
60
+ result = runner_host.cognitive_reserve_assessment
61
+ expect(result[:success]).to be true
62
+ expect(result).to include(:overall_reserve, :reserve_label, :most_vulnerable, :degraded, :failed)
63
+ end
64
+ end
65
+
66
+ describe '#domain_cognitive_reserve' do
67
+ it 'returns domain-specific reserve' do
68
+ runner_host.add_cognitive_pathway(function: :reasoning, domain: :cognition)
69
+ result = runner_host.domain_cognitive_reserve(domain: :cognition)
70
+ expect(result[:success]).to be true
71
+ expect(result[:domain]).to eq(:cognition)
72
+ end
73
+ end
74
+
75
+ describe '#most_redundant_pathways' do
76
+ it 'returns pathways sorted by redundancy' do
77
+ result = runner_host.most_redundant_pathways
78
+ expect(result[:success]).to be true
79
+ end
80
+ end
81
+
82
+ describe '#update_cognitive_reserve' do
83
+ it 'runs recovery and returns stats' do
84
+ result = runner_host.update_cognitive_reserve
85
+ expect(result[:success]).to be true
86
+ expect(result).to include(:pathway_count, :overall_reserve)
87
+ end
88
+ end
89
+
90
+ describe '#cognitive_reserve_stats' do
91
+ it 'returns stats' do
92
+ result = runner_host.cognitive_reserve_stats
93
+ expect(result[:success]).to be true
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::Semantic::Client do
4
+ subject(:client) { described_class.new }
5
+
6
+ it 'includes Runners::SemanticMemory' do
7
+ expect(described_class.ancestors).to include(Legion::Extensions::Agentic::Memory::Semantic::Runners::SemanticMemory)
8
+ end
9
+
10
+ it 'supports full knowledge lifecycle' do
11
+ # Build a taxonomy
12
+ client.store_concept(name: :animal, domain: :biology, properties: { kingdom: :animalia })
13
+ client.relate_concepts(source: :mammal, target: :animal, type: :is_a)
14
+ client.relate_concepts(source: :dog, target: :mammal, type: :is_a)
15
+ client.relate_concepts(source: :cat, target: :mammal, type: :is_a)
16
+ client.relate_concepts(source: :dog, target: :tail, type: :has_a)
17
+
18
+ # Query taxonomy
19
+ expect(client.check_category(concept: :dog, category: :mammal)[:is_member]).to be true
20
+ expect(client.find_instances(category: :mammal)[:count]).to eq(2)
21
+
22
+ # Spreading activation
23
+ activated = client.activate_spread(seed: :dog)
24
+ expect(activated[:activated]).to have_key(:dog)
25
+
26
+ # Retrieve
27
+ concept = client.retrieve_concept(name: :dog)
28
+ expect(concept[:found]).to be true
29
+
30
+ # Tick
31
+ client.update_semantic_memory
32
+ stats = client.semantic_memory_stats
33
+ expect(stats[:stats][:concepts]).to be >= 3
34
+ end
35
+ end