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,203 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::ImmuneMemory::Helpers::ImmuneMemoryEngine do
4
+ subject(:engine) { described_class.new }
5
+
6
+ describe '#create_memory_cell' do
7
+ it 'creates and returns a cell' do
8
+ cell = engine.create_memory_cell(threat_type: :prompt_injection, signature: 'sig-001')
9
+ expect(cell.threat_type).to eq(:prompt_injection)
10
+ end
11
+ end
12
+
13
+ describe '#vaccinate' do
14
+ it 'creates a new cell for unknown signature' do
15
+ cell = engine.vaccinate(threat_type: :data_poisoning, signature: 'vax-001')
16
+ expect(cell.strength).to eq(0.5)
17
+ end
18
+
19
+ it 'activates existing cell for known signature' do
20
+ engine.vaccinate(threat_type: :data_poisoning, signature: 'vax-001')
21
+ cell = engine.vaccinate(threat_type: :data_poisoning, signature: 'vax-001')
22
+ expect(cell.encounter_count).to eq(1)
23
+ end
24
+ end
25
+
26
+ describe '#encounter_threat' do
27
+ it 'returns a primary encounter for new threat' do
28
+ record = engine.encounter_threat(threat_type: :prompt_injection, threat_signature: 'new-sig')
29
+ expect(record.response_type).to eq(:primary)
30
+ end
31
+
32
+ it 'returns a secondary encounter for known threat' do
33
+ engine.vaccinate(threat_type: :prompt_injection, signature: 'known-sig', strength: 0.7)
34
+ record = engine.encounter_threat(threat_type: :prompt_injection, threat_signature: 'known-sig')
35
+ expect(record.response_type).to eq(:secondary)
36
+ end
37
+
38
+ it 'creates a memory cell after first encounter' do
39
+ engine.encounter_threat(threat_type: :social_engineering, threat_signature: 'first-sig')
40
+ expect(engine.active_cells.size).to eq(1)
41
+ end
42
+
43
+ it 'neutralizes weak threats' do
44
+ record = engine.encounter_threat(threat_type: :logic_manipulation, threat_signature: 'weak', severity: 0.3)
45
+ expect(record.neutralized?).to be true
46
+ end
47
+
48
+ it 'may fail against strong threats without memory' do
49
+ record = engine.encounter_threat(threat_type: :privilege_escalation, threat_signature: 'strong', severity: 0.9)
50
+ expect(record.evaded?).to be true
51
+ end
52
+
53
+ it 'neutralizes strong threats with strong memory' do
54
+ cell = engine.vaccinate(threat_type: :privilege_escalation, signature: 'strong', strength: 0.95)
55
+ 3.times { cell.activate! }
56
+ record = engine.encounter_threat(threat_type: :privilege_escalation, threat_signature: 'strong', severity: 0.9)
57
+ expect(record.neutralized?).to be true
58
+ end
59
+ end
60
+
61
+ describe '#decay_all!' do
62
+ it 'decays all cells' do
63
+ engine.create_memory_cell(threat_type: :prompt_injection, signature: 's1')
64
+ result = engine.decay_all!
65
+ expect(result[:cells_remaining]).to be >= 0
66
+ end
67
+ end
68
+
69
+ describe '#find_by_signature' do
70
+ it 'finds matching cell' do
71
+ engine.create_memory_cell(threat_type: :prompt_injection, signature: 'find-me')
72
+ expect(engine.find_by_signature('find-me')).not_to be_nil
73
+ end
74
+
75
+ it 'returns nil for unknown signature' do
76
+ expect(engine.find_by_signature('nope')).to be_nil
77
+ end
78
+ end
79
+
80
+ describe '#cells_for_threat' do
81
+ it 'filters by threat type' do
82
+ engine.create_memory_cell(threat_type: :prompt_injection, signature: 's1')
83
+ engine.create_memory_cell(threat_type: :data_poisoning, signature: 's2')
84
+ expect(engine.cells_for_threat(threat_type: :prompt_injection).size).to eq(1)
85
+ end
86
+ end
87
+
88
+ describe '#immunity_for' do
89
+ it 'returns 0.0 for unknown threat type' do
90
+ expect(engine.immunity_for(threat_type: :unknown_threat)).to eq(0.0)
91
+ end
92
+
93
+ it 'returns max strength for known threat' do
94
+ engine.create_memory_cell(threat_type: :prompt_injection, signature: 's1', strength: 0.8)
95
+ expect(engine.immunity_for(threat_type: :prompt_injection)).to eq(0.8)
96
+ end
97
+ end
98
+
99
+ describe '#active_cells' do
100
+ it 'excludes expired cells' do
101
+ cell = engine.create_memory_cell(threat_type: :prompt_injection, signature: 's1', strength: 0.01)
102
+ 2.times { cell.decay! }
103
+ expect(engine.active_cells).to be_empty
104
+ end
105
+ end
106
+
107
+ describe '#t_cells' do
108
+ it 'returns only t-type cells' do
109
+ engine.create_memory_cell(threat_type: :prompt_injection, signature: 's1', cell_type: :t_killer)
110
+ engine.create_memory_cell(threat_type: :data_poisoning, signature: 's2', cell_type: :b_memory)
111
+ expect(engine.t_cells.size).to eq(1)
112
+ end
113
+ end
114
+
115
+ describe '#b_cells' do
116
+ it 'returns only b-type cells' do
117
+ engine.create_memory_cell(threat_type: :prompt_injection, signature: 's1', cell_type: :t_killer)
118
+ engine.create_memory_cell(threat_type: :data_poisoning, signature: 's2', cell_type: :b_plasma)
119
+ expect(engine.b_cells.size).to eq(1)
120
+ end
121
+ end
122
+
123
+ describe '#veteran_cells' do
124
+ it 'returns cells with 5+ encounters' do
125
+ cell = engine.create_memory_cell(threat_type: :prompt_injection, signature: 's1')
126
+ 5.times { cell.activate! }
127
+ expect(engine.veteran_cells.size).to eq(1)
128
+ end
129
+ end
130
+
131
+ describe '#naive_cells' do
132
+ it 'returns cells with 0 encounters' do
133
+ engine.create_memory_cell(threat_type: :prompt_injection, signature: 's1')
134
+ expect(engine.naive_cells.size).to eq(1)
135
+ end
136
+ end
137
+
138
+ describe '#secondary_response_rate' do
139
+ it 'returns 0.0 with no encounters' do
140
+ expect(engine.secondary_response_rate).to eq(0.0)
141
+ end
142
+
143
+ it 'calculates rate correctly' do
144
+ engine.vaccinate(threat_type: :prompt_injection, signature: 'known', strength: 0.7)
145
+ engine.encounter_threat(threat_type: :prompt_injection, threat_signature: 'known')
146
+ engine.encounter_threat(threat_type: :data_poisoning, threat_signature: 'new')
147
+ expect(engine.secondary_response_rate).to eq(0.5)
148
+ end
149
+ end
150
+
151
+ describe '#neutralization_rate' do
152
+ it 'returns 0.0 with no encounters' do
153
+ expect(engine.neutralization_rate).to eq(0.0)
154
+ end
155
+ end
156
+
157
+ describe '#average_response_speed' do
158
+ it 'returns primary speed with no encounters' do
159
+ expect(engine.average_response_speed).to eq(1.0)
160
+ end
161
+ end
162
+
163
+ describe '#threat_coverage' do
164
+ it 'returns 0.0 with no cells' do
165
+ expect(engine.threat_coverage).to eq(0.0)
166
+ end
167
+
168
+ it 'increases with known threat types' do
169
+ engine.create_memory_cell(threat_type: :prompt_injection, signature: 's1')
170
+ engine.create_memory_cell(threat_type: :data_poisoning, signature: 's2')
171
+ expect(engine.threat_coverage).to be > 0.0
172
+ end
173
+ end
174
+
175
+ describe '#overall_health' do
176
+ it 'returns 0.0 with no cells' do
177
+ expect(engine.overall_health).to eq(0.0)
178
+ end
179
+
180
+ it 'returns positive with cells' do
181
+ engine.create_memory_cell(threat_type: :prompt_injection, signature: 's1', strength: 0.8)
182
+ expect(engine.overall_health).to be > 0.0
183
+ end
184
+ end
185
+
186
+ describe '#immune_report' do
187
+ it 'includes all report fields' do
188
+ report = engine.immune_report
189
+ expect(report).to include(
190
+ :total_cells, :active_cells, :t_cells, :b_cells, :veteran_cells,
191
+ :total_encounters, :secondary_response_rate, :neutralization_rate,
192
+ :average_response_speed, :threat_coverage, :overall_health, :health_label
193
+ )
194
+ end
195
+ end
196
+
197
+ describe '#to_h' do
198
+ it 'includes summary fields' do
199
+ hash = engine.to_h
200
+ expect(hash).to include(:total_cells, :active, :encounters, :health, :threat_coverage)
201
+ end
202
+ end
203
+ end
@@ -0,0 +1,190 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::ImmuneMemory::Helpers::MemoryCell do
4
+ subject(:cell) { described_class.new(threat_type: :prompt_injection, signature: 'sig-001') }
5
+
6
+ describe '#initialize' do
7
+ it 'assigns a UUID id' do
8
+ expect(cell.id).to match(/\A[0-9a-f-]{36}\z/)
9
+ end
10
+
11
+ it 'stores threat_type' do
12
+ expect(cell.threat_type).to eq(:prompt_injection)
13
+ end
14
+
15
+ it 'stores signature' do
16
+ expect(cell.signature).to eq('sig-001')
17
+ end
18
+
19
+ it 'defaults cell_type to :b_memory' do
20
+ expect(cell.cell_type).to eq(:b_memory)
21
+ end
22
+
23
+ it 'defaults strength to VACCINATION_STRENGTH' do
24
+ expect(cell.strength).to eq(0.5)
25
+ end
26
+
27
+ it 'clamps strength' do
28
+ high = described_class.new(threat_type: :logic_manipulation, signature: 's', strength: 5.0)
29
+ expect(high.strength).to eq(1.0)
30
+ end
31
+
32
+ it 'validates cell_type' do
33
+ bad = described_class.new(threat_type: :logic_manipulation, signature: 's', cell_type: :invalid)
34
+ expect(bad.cell_type).to eq(:b_memory)
35
+ end
36
+
37
+ it 'starts with 0 encounters' do
38
+ expect(cell.encounter_count).to eq(0)
39
+ end
40
+ end
41
+
42
+ describe '#activate!' do
43
+ it 'increases strength' do
44
+ original = cell.strength
45
+ cell.activate!
46
+ expect(cell.strength).to be > original
47
+ end
48
+
49
+ it 'increments encounter_count' do
50
+ cell.activate!
51
+ expect(cell.encounter_count).to eq(1)
52
+ end
53
+
54
+ it 'resets decay_cycles' do
55
+ cell.decay!
56
+ cell.activate!
57
+ expect(cell.decay_cycles).to eq(0)
58
+ end
59
+ end
60
+
61
+ describe '#decay!' do
62
+ it 'decreases strength' do
63
+ original = cell.strength
64
+ cell.decay!
65
+ expect(cell.strength).to be < original
66
+ end
67
+
68
+ it 'increments decay_cycles' do
69
+ cell.decay!
70
+ expect(cell.decay_cycles).to eq(1)
71
+ end
72
+
73
+ it 'clamps at 0.0' do
74
+ 200.times { cell.decay! }
75
+ expect(cell.strength).to eq(0.0)
76
+ end
77
+ end
78
+
79
+ describe '#recognizes?' do
80
+ it 'recognizes matching signature when strong enough' do
81
+ cell.activate!
82
+ cell.activate!
83
+ expect(cell.recognizes?('sig-001')).to be true
84
+ end
85
+
86
+ it 'does not recognize different signature' do
87
+ cell.activate!
88
+ cell.activate!
89
+ expect(cell.recognizes?('sig-999')).to be false
90
+ end
91
+
92
+ it 'does not recognize when strength is too low' do
93
+ 80.times { cell.decay! }
94
+ expect(cell.recognizes?('sig-001')).to be false
95
+ end
96
+ end
97
+
98
+ describe '#t_cell?' do
99
+ it 'is true for t_helper' do
100
+ t = described_class.new(threat_type: :data_poisoning, signature: 's', cell_type: :t_helper)
101
+ expect(t.t_cell?).to be true
102
+ end
103
+
104
+ it 'is false for b_memory' do
105
+ expect(cell.t_cell?).to be false
106
+ end
107
+ end
108
+
109
+ describe '#b_cell?' do
110
+ it 'is true for b_memory' do
111
+ expect(cell.b_cell?).to be true
112
+ end
113
+
114
+ it 'is true for b_plasma' do
115
+ bp = described_class.new(threat_type: :data_poisoning, signature: 's', cell_type: :b_plasma)
116
+ expect(bp.b_cell?).to be true
117
+ end
118
+ end
119
+
120
+ describe '#expired?' do
121
+ it 'is false at default strength' do
122
+ expect(cell.expired?).to be false
123
+ end
124
+
125
+ it 'is true when fully decayed' do
126
+ 200.times { cell.decay! }
127
+ expect(cell.expired?).to be true
128
+ end
129
+ end
130
+
131
+ describe '#veteran?' do
132
+ it 'is false initially' do
133
+ expect(cell.veteran?).to be false
134
+ end
135
+
136
+ it 'is true after 5 encounters' do
137
+ 5.times { cell.activate! }
138
+ expect(cell.veteran?).to be true
139
+ end
140
+ end
141
+
142
+ describe '#naive?' do
143
+ it 'is true initially' do
144
+ expect(cell.naive?).to be true
145
+ end
146
+
147
+ it 'is false after activation' do
148
+ cell.activate!
149
+ expect(cell.naive?).to be false
150
+ end
151
+ end
152
+
153
+ describe '#response_speed' do
154
+ it 'returns primary speed when naive' do
155
+ expect(cell.response_speed).to eq(1.0)
156
+ end
157
+
158
+ it 'returns faster speed after encounters' do
159
+ 3.times { cell.activate! }
160
+ expect(cell.response_speed).to be > 1.0
161
+ end
162
+
163
+ it 'caps at secondary response speed' do
164
+ 10.times { cell.activate! }
165
+ expect(cell.response_speed).to eq(3.0)
166
+ end
167
+ end
168
+
169
+ describe '#maturity' do
170
+ it 'is 0.0 when naive' do
171
+ expect(cell.maturity).to eq(0.0)
172
+ end
173
+
174
+ it 'increases with encounters' do
175
+ 5.times { cell.activate! }
176
+ expect(cell.maturity).to eq(0.5)
177
+ end
178
+ end
179
+
180
+ describe '#to_h' do
181
+ it 'includes all fields' do
182
+ hash = cell.to_h
183
+ expect(hash).to include(
184
+ :id, :threat_type, :signature, :cell_type, :strength,
185
+ :encounter_count, :decay_cycles, :response_speed,
186
+ :immunity_label, :maturity_label, :t_cell, :b_cell, :expired, :created_at
187
+ )
188
+ end
189
+ end
190
+ end
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::ImmuneMemory::Runners::CognitiveImmuneMemory do
4
+ let(:engine) { Legion::Extensions::Agentic::Memory::ImmuneMemory::Helpers::ImmuneMemoryEngine.new }
5
+ let(:runner) do
6
+ obj = Object.new
7
+ obj.extend(described_class)
8
+ obj.instance_variable_set(:@default_engine, engine)
9
+ obj
10
+ end
11
+
12
+ describe '#create_memory_cell' do
13
+ it 'returns success with cell hash' do
14
+ result = runner.create_memory_cell(threat_type: :prompt_injection, signature: 'sig-001', engine: engine)
15
+ expect(result[:success]).to be true
16
+ expect(result[:cell][:threat_type]).to eq(:prompt_injection)
17
+ end
18
+ end
19
+
20
+ describe '#vaccinate' do
21
+ it 'returns success' do
22
+ result = runner.vaccinate(threat_type: :data_poisoning, signature: 'vax-001', engine: engine)
23
+ expect(result[:success]).to be true
24
+ end
25
+ end
26
+
27
+ describe '#encounter_threat' do
28
+ it 'returns success with encounter hash' do
29
+ result = runner.encounter_threat(threat_type: :prompt_injection, threat_signature: 'new', engine: engine)
30
+ expect(result[:success]).to be true
31
+ expect(result[:encounter][:response_type]).to eq(:primary)
32
+ end
33
+ end
34
+
35
+ describe '#decay_all' do
36
+ it 'returns success' do
37
+ result = runner.decay_all(engine: engine)
38
+ expect(result[:success]).to be true
39
+ end
40
+ end
41
+
42
+ describe '#immunity_for' do
43
+ it 'returns immunity level' do
44
+ engine.create_memory_cell(threat_type: :prompt_injection, signature: 's1', strength: 0.8)
45
+ result = runner.immunity_for(threat_type: :prompt_injection, engine: engine)
46
+ expect(result[:success]).to be true
47
+ expect(result[:immunity]).to eq(0.8)
48
+ end
49
+ end
50
+
51
+ describe '#active_cells' do
52
+ it 'returns cell list' do
53
+ engine.create_memory_cell(threat_type: :prompt_injection, signature: 's1')
54
+ result = runner.active_cells(engine: engine)
55
+ expect(result[:success]).to be true
56
+ expect(result[:count]).to eq(1)
57
+ end
58
+ end
59
+
60
+ describe '#veteran_cells' do
61
+ it 'returns veteran list' do
62
+ result = runner.veteran_cells(engine: engine)
63
+ expect(result[:success]).to be true
64
+ expect(result[:count]).to eq(0)
65
+ end
66
+ end
67
+
68
+ describe '#threat_coverage' do
69
+ it 'returns coverage' do
70
+ result = runner.threat_coverage(engine: engine)
71
+ expect(result[:success]).to be true
72
+ expect(result[:coverage]).to eq(0.0)
73
+ end
74
+ end
75
+
76
+ describe '#immune_status' do
77
+ it 'returns comprehensive status' do
78
+ result = runner.immune_status(engine: engine)
79
+ expect(result[:success]).to be true
80
+ expect(result).to include(:total_cells, :overall_health)
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::Nostalgia::Client do
4
+ subject(:client) { described_class.new }
5
+
6
+ describe '#initialize' do
7
+ it 'creates a client with a nostalgia engine' do
8
+ expect(client).to respond_to(:store_memory)
9
+ end
10
+
11
+ it 'accepts an injected engine' do
12
+ engine = Legion::Extensions::Agentic::Memory::Nostalgia::Helpers::NostalgiaEngine.new
13
+ c = described_class.new(engine: engine)
14
+ c.store_memory(content: 'shared memory')
15
+ expect(engine.memories.size).to eq(1)
16
+ end
17
+ end
18
+
19
+ describe 'runner methods' do
20
+ it 'responds to recall runner methods' do
21
+ expect(client).to respond_to(:store_memory)
22
+ expect(client).to respond_to(:trigger_nostalgia)
23
+ expect(client).to respond_to(:age_memories)
24
+ expect(client).to respond_to(:nostalgia_report)
25
+ end
26
+
27
+ it 'responds to analysis runner methods' do
28
+ expect(client).to respond_to(:warmth_by_domain)
29
+ expect(client).to respond_to(:rosy_retrospection_index)
30
+ expect(client).to respond_to(:nostalgia_proneness)
31
+ expect(client).to respond_to(:most_nostalgic_domains)
32
+ expect(client).to respond_to(:bittersweet_memories)
33
+ end
34
+ end
35
+
36
+ describe 'full cycle integration' do
37
+ it 'stores memories, triggers nostalgia, and produces a report' do
38
+ client.store_memory(content: 'first day of school', domain: :achievement, original_valence: 0.5)
39
+ client.store_memory(content: 'childhood friend', domain: :relationship, original_valence: 0.6)
40
+ client.store_memory(content: 'old neighborhood', domain: :place, original_valence: 0.3)
41
+
42
+ client.age_memories
43
+ result = client.trigger_nostalgia(trigger: 'childhood')
44
+ expect(result[:success]).to be true
45
+
46
+ report = client.nostalgia_report
47
+ expect(report[:total_memories]).to eq(3)
48
+ expect(report[:retrospection_label]).to be_a(Symbol)
49
+ expect(report[:nostalgia_label]).to be_a(Symbol)
50
+ end
51
+
52
+ it 'identifies rosy and bittersweet memories correctly' do
53
+ client.store_memory(content: 'rough but cherished time', domain: :challenge,
54
+ warmth: 0.75, original_valence: 0.2)
55
+
56
+ bs = client.bittersweet_memories
57
+ expect(bs[:memories].first[:content]).to eq('rough but cherished time')
58
+
59
+ ri = client.rosy_retrospection_index
60
+ expect(ri[:index]).to be > 0.0
61
+ end
62
+
63
+ it 'warmth grows over age cycles' do
64
+ client.store_memory(content: 'fading memory', domain: :routine, warmth: 0.3)
65
+ initial_report = client.nostalgia_report
66
+ 5.times { client.age_memories }
67
+ later_report = client.nostalgia_report
68
+ expect(later_report[:nostalgia_proneness]).to be >= initial_report[:nostalgia_proneness]
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::Nostalgia::Helpers::Constants do
4
+ describe 'constants' do
5
+ it 'defines MAX_MEMORIES' do
6
+ expect(described_class::MAX_MEMORIES).to eq(300)
7
+ end
8
+
9
+ it 'defines MAX_EVENTS' do
10
+ expect(described_class::MAX_EVENTS).to eq(500)
11
+ end
12
+
13
+ it 'defines DEFAULT_WARMTH' do
14
+ expect(described_class::DEFAULT_WARMTH).to eq(0.3)
15
+ end
16
+
17
+ it 'defines WARMTH_GROWTH' do
18
+ expect(described_class::WARMTH_GROWTH).to eq(0.02)
19
+ end
20
+
21
+ it 'defines WARMTH_CEILING' do
22
+ expect(described_class::WARMTH_CEILING).to eq(0.95)
23
+ end
24
+
25
+ it 'defines WARMTH_DECAY' do
26
+ expect(described_class::WARMTH_DECAY).to eq(0.01)
27
+ end
28
+
29
+ it 'defines TRIGGER_SENSITIVITY' do
30
+ expect(described_class::TRIGGER_SENSITIVITY).to eq(0.3)
31
+ end
32
+
33
+ it 'defines 8 MEMORY_DOMAINS' do
34
+ expect(described_class::MEMORY_DOMAINS.size).to eq(8)
35
+ expect(described_class::MEMORY_DOMAINS).to include(:relationship, :place, :achievement, :unknown)
36
+ end
37
+ end
38
+
39
+ describe '.label_for' do
40
+ it 'returns warmth label for low value' do
41
+ expect(described_class.label_for(described_class::WARMTH_LABELS, 0.1)).to eq(:faint)
42
+ end
43
+
44
+ it 'returns warmth label for mid value' do
45
+ expect(described_class.label_for(described_class::WARMTH_LABELS, 0.5)).to eq(:warm)
46
+ end
47
+
48
+ it 'returns warmth label for high value' do
49
+ expect(described_class.label_for(described_class::WARMTH_LABELS, 0.9)).to eq(:glowing)
50
+ end
51
+
52
+ it 'returns nostalgia label' do
53
+ expect(described_class.label_for(described_class::NOSTALGIA_LABELS, 0.7)).to eq(:vivid)
54
+ end
55
+
56
+ it 'returns retrospection label' do
57
+ expect(described_class.label_for(described_class::RETROSPECTION_LABELS, 0.0)).to eq(:accurate)
58
+ end
59
+
60
+ it 'clamps values outside [0, 1]' do
61
+ expect(described_class.label_for(described_class::WARMTH_LABELS, 1.5)).to eq(:glowing)
62
+ expect(described_class.label_for(described_class::WARMTH_LABELS, -0.5)).to eq(:faint)
63
+ end
64
+ end
65
+ end