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,196 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::Archaeology::Helpers::Artifact do
4
+ let(:artifact) do
5
+ described_class.new(
6
+ type: :pattern, domain: :cognitive,
7
+ content: 'test content', depth_level: :surface
8
+ )
9
+ end
10
+
11
+ describe '#initialize' do
12
+ it 'assigns a UUID id' do
13
+ expect(artifact.id).to match(/\A[0-9a-f-]{36}\z/)
14
+ end
15
+
16
+ it 'sets artifact_type as symbol' do
17
+ expect(artifact.artifact_type).to eq :pattern
18
+ end
19
+
20
+ it 'sets domain' do
21
+ expect(artifact.domain).to eq :cognitive
22
+ end
23
+
24
+ it 'sets content as string' do
25
+ expect(artifact.content).to eq 'test content'
26
+ end
27
+
28
+ it 'sets depth_level' do
29
+ expect(artifact.depth_level).to eq :surface
30
+ end
31
+
32
+ it 'defaults preservation to DEFAULT_PRESERVATION' do
33
+ expect(artifact.preservation_quality).to be_within(0.01).of(0.5)
34
+ end
35
+
36
+ it 'allows custom preservation' do
37
+ a = described_class.new(type: :skill, domain: :emotional,
38
+ content: 'x', depth_level: :deep, preservation: 0.9)
39
+ expect(a.preservation_quality).to eq 0.9
40
+ end
41
+
42
+ it 'clamps preservation to 0.0..1.0' do
43
+ a = described_class.new(type: :skill, domain: :emotional,
44
+ content: 'x', depth_level: :surface, preservation: 1.5)
45
+ expect(a.preservation_quality).to eq 1.0
46
+ end
47
+
48
+ it 'sets discovered_at' do
49
+ expect(artifact.discovered_at).to be_a Time
50
+ end
51
+
52
+ it 'sets origin_epoch' do
53
+ expect(artifact.origin_epoch).to be_a Time
54
+ end
55
+
56
+ it 'initializes empty contextual_links' do
57
+ expect(artifact.contextual_links).to eq []
58
+ end
59
+
60
+ it 'raises on invalid type' do
61
+ expect do
62
+ described_class.new(type: :bogus, domain: :cognitive,
63
+ content: 'x', depth_level: :surface)
64
+ end.to raise_error(ArgumentError, /unknown artifact type/)
65
+ end
66
+
67
+ it 'raises on invalid domain' do
68
+ expect do
69
+ described_class.new(type: :pattern, domain: :bogus,
70
+ content: 'x', depth_level: :surface)
71
+ end.to raise_error(ArgumentError, /unknown domain/)
72
+ end
73
+
74
+ it 'raises on invalid depth_level' do
75
+ expect do
76
+ described_class.new(type: :pattern, domain: :cognitive,
77
+ content: 'x', depth_level: :bogus)
78
+ end.to raise_error(ArgumentError, /unknown depth level/)
79
+ end
80
+ end
81
+
82
+ describe '#preservation' do
83
+ it 'aliases preservation_quality' do
84
+ expect(artifact.preservation).to eq artifact.preservation_quality
85
+ end
86
+ end
87
+
88
+ describe '#decay!' do
89
+ it 'reduces preservation_quality' do
90
+ original = artifact.preservation_quality
91
+ artifact.decay!
92
+ expect(artifact.preservation_quality).to be < original
93
+ end
94
+
95
+ it 'reduces integrity' do
96
+ original = artifact.integrity
97
+ artifact.decay!
98
+ expect(artifact.integrity).to be < original
99
+ end
100
+
101
+ it 'clamps preservation at 0.0' do
102
+ 30.times { artifact.decay!(rate: 0.1) }
103
+ expect(artifact.preservation_quality).to eq 0.0
104
+ end
105
+
106
+ it 'returns self for chaining' do
107
+ expect(artifact.decay!).to eq artifact
108
+ end
109
+ end
110
+
111
+ describe '#restore!' do
112
+ before { artifact.decay!(rate: 0.2) }
113
+
114
+ it 'increases preservation_quality' do
115
+ original = artifact.preservation_quality
116
+ artifact.restore!(boost: 0.1)
117
+ expect(artifact.preservation_quality).to be > original
118
+ end
119
+
120
+ it 'clamps preservation at 1.0' do
121
+ artifact.restore!(boost: 5.0)
122
+ expect(artifact.preservation_quality).to eq 1.0
123
+ end
124
+
125
+ it 'returns self for chaining' do
126
+ expect(artifact.restore!).to eq artifact
127
+ end
128
+ end
129
+
130
+ describe '#fragment?' do
131
+ it 'returns true when preservation < 0.3' do
132
+ artifact.instance_variable_set(:@preservation_quality, 0.2)
133
+ expect(artifact.fragment?).to be true
134
+ end
135
+
136
+ it 'returns false when preservation >= 0.3' do
137
+ expect(artifact.fragment?).to be false
138
+ end
139
+ end
140
+
141
+ describe '#well_preserved?' do
142
+ it 'returns true when preservation > 0.7' do
143
+ artifact.instance_variable_set(:@preservation_quality, 0.8)
144
+ expect(artifact.well_preserved?).to be true
145
+ end
146
+
147
+ it 'returns false when preservation <= 0.7' do
148
+ expect(artifact.well_preserved?).to be false
149
+ end
150
+ end
151
+
152
+ describe '#preservation_label' do
153
+ it 'returns label based on preservation' do
154
+ artifact.instance_variable_set(:@preservation_quality, 0.1)
155
+ expect(artifact.preservation_label).to eq :dust
156
+
157
+ artifact.instance_variable_set(:@preservation_quality, 0.9)
158
+ expect(artifact.preservation_label).to eq :pristine
159
+ end
160
+ end
161
+
162
+ describe '#integrity_label' do
163
+ it 'returns label based on integrity' do
164
+ artifact.instance_variable_set(:@integrity, 0.1)
165
+ expect(artifact.integrity_label).to eq :corrupted
166
+
167
+ artifact.instance_variable_set(:@integrity, 0.9)
168
+ expect(artifact.integrity_label).to eq :complete
169
+ end
170
+ end
171
+
172
+ describe '#link_to' do
173
+ it 'adds a contextual link' do
174
+ artifact.link_to('other-id')
175
+ expect(artifact.contextual_links).to include('other-id')
176
+ end
177
+
178
+ it 'does not duplicate links' do
179
+ artifact.link_to('same-id')
180
+ artifact.link_to('same-id')
181
+ expect(artifact.contextual_links.count('same-id')).to eq 1
182
+ end
183
+ end
184
+
185
+ describe '#to_h' do
186
+ subject(:hash) { artifact.to_h }
187
+
188
+ it 'includes all fields' do
189
+ %i[id artifact_type domain content depth_level preservation_quality
190
+ preservation_label integrity integrity_label discovered_at
191
+ origin_epoch contextual_links fragment well_preserved ancient].each do |key|
192
+ expect(hash).to have_key(key)
193
+ end
194
+ end
195
+ end
196
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::Archaeology::Helpers::Constants do
4
+ let(:c) { described_class }
5
+
6
+ it 'defines MAX_ARTIFACTS' do
7
+ expect(c::MAX_ARTIFACTS).to eq 500
8
+ end
9
+
10
+ it 'defines MAX_SITES' do
11
+ expect(c::MAX_SITES).to eq 50
12
+ end
13
+
14
+ it 'has 8 artifact types' do
15
+ expect(c::ARTIFACT_TYPES.size).to eq 8
16
+ end
17
+
18
+ it 'has 8 domain types' do
19
+ expect(c::DOMAIN_TYPES.size).to eq 8
20
+ end
21
+
22
+ it 'has 5 depth levels' do
23
+ expect(c::EXCAVATION_DEPTH_LEVELS.size).to eq 5
24
+ end
25
+
26
+ it 'has depth rarity weights for each level' do
27
+ c::EXCAVATION_DEPTH_LEVELS.each do |level|
28
+ expect(c::DEPTH_RARITY_WEIGHTS).to have_key(level)
29
+ end
30
+ end
31
+
32
+ describe '.label_for' do
33
+ it 'returns matching label' do
34
+ expect(c.label_for(c::PRESERVATION_LABELS, 0.1)).to eq :dust
35
+ expect(c.label_for(c::PRESERVATION_LABELS, 0.9)).to eq :pristine
36
+ end
37
+
38
+ it 'returns last label for out-of-range' do
39
+ expect(c.label_for(c::PRESERVATION_LABELS, 999)).to eq :pristine
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,115 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::Archaeology::Helpers::ExcavationSite do
4
+ let(:constants) { Legion::Extensions::Agentic::Memory::Archaeology::Helpers::Constants }
5
+ let(:site) { described_class.new(domain: :cognitive) }
6
+
7
+ describe '#initialize' do
8
+ it 'assigns a UUID id' do
9
+ expect(site.id).to match(/\A[0-9a-f-]{36}\z/)
10
+ end
11
+
12
+ it 'sets domain' do
13
+ expect(site.domain).to eq :cognitive
14
+ end
15
+
16
+ it 'starts at surface depth' do
17
+ expect(site.current_depth).to eq :surface
18
+ end
19
+
20
+ it 'starts with no artifacts' do
21
+ expect(site.artifacts_found).to be_empty
22
+ end
23
+
24
+ it 'records started_at as Time' do
25
+ expect(site.started_at).to be_a Time
26
+ end
27
+
28
+ it 'raises on invalid domain' do
29
+ expect do
30
+ described_class.new(domain: :invalid_domain)
31
+ end.to raise_error(ArgumentError, /unknown domain/)
32
+ end
33
+ end
34
+
35
+ describe '#dig_deeper!' do
36
+ it 'advances depth from surface to shallow' do
37
+ site.dig_deeper!
38
+ expect(site.current_depth).to eq :shallow
39
+ end
40
+
41
+ it 'advances through all levels' do
42
+ (constants::EXCAVATION_DEPTH_LEVELS.size - 1).times { site.dig_deeper! }
43
+ expect(site.current_depth).to eq :bedrock
44
+ end
45
+
46
+ it 'returns true when advancing' do
47
+ expect(site.dig_deeper!).to be true
48
+ end
49
+
50
+ it 'returns false at bedrock' do
51
+ 4.times { site.dig_deeper! }
52
+ expect(site.dig_deeper!).to be false
53
+ end
54
+ end
55
+
56
+ describe '#excavate!' do
57
+ it 'returns an Artifact' do
58
+ expect(site.excavate!).to be_a(
59
+ Legion::Extensions::Agentic::Memory::Archaeology::Helpers::Artifact
60
+ )
61
+ end
62
+
63
+ it 'adds artifact to artifacts_found' do
64
+ site.excavate!
65
+ expect(site.artifacts_found.size).to eq 1
66
+ end
67
+
68
+ it 'creates artifact at current depth' do
69
+ site.dig_deeper!
70
+ expect(site.excavate!.depth_level).to eq :shallow
71
+ end
72
+
73
+ it 'creates artifact in site domain' do
74
+ expect(site.excavate!.domain).to eq :cognitive
75
+ end
76
+
77
+ it 'creates artifact with valid type' do
78
+ expect(constants::ARTIFACT_TYPES).to include(site.excavate!.artifact_type)
79
+ end
80
+ end
81
+
82
+ describe '#survey' do
83
+ it 'returns hash with expected keys' do
84
+ %i[id domain current_depth depth_label artifacts_count
85
+ complete started_at].each do |key|
86
+ expect(site.survey).to have_key(key)
87
+ end
88
+ end
89
+
90
+ it 'returns correct artifact count after excavation' do
91
+ site.excavate!
92
+ expect(site.survey[:artifacts_count]).to eq 1
93
+ end
94
+ end
95
+
96
+ describe '#complete?' do
97
+ it 'is false initially' do
98
+ expect(site).not_to be_complete
99
+ end
100
+
101
+ it 'is true at bedrock' do
102
+ 4.times { site.dig_deeper! }
103
+ expect(site).to be_complete
104
+ end
105
+ end
106
+
107
+ describe '#to_h' do
108
+ it 'includes artifacts array' do
109
+ site.excavate!
110
+ h = site.to_h
111
+ expect(h).to have_key(:artifacts)
112
+ expect(h[:artifacts].first).to have_key(:id)
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,96 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::Archaeology::Runners::CognitiveArchaeology do
4
+ let(:engine) { Legion::Extensions::Agentic::Memory::Archaeology::Helpers::ArchaeologyEngine.new }
5
+ let(:runner) { described_class }
6
+
7
+ describe '.create_site' do
8
+ it 'creates a site successfully' do
9
+ result = runner.create_site(domain: :cognitive, engine: engine)
10
+ expect(result[:success]).to be true
11
+ expect(result[:site][:domain]).to eq :cognitive
12
+ end
13
+
14
+ it 'returns failure for invalid domain' do
15
+ result = runner.create_site(domain: :invalid_domain_xyz, engine: engine)
16
+ expect(result[:success]).to be false
17
+ expect(result[:error]).to be_a String
18
+ end
19
+ end
20
+
21
+ describe '.dig' do
22
+ let(:site) { engine.create_site(domain: :cognitive) }
23
+
24
+ it 'digs successfully' do
25
+ result = runner.dig(site_id: site.id, engine: engine)
26
+ expect(result[:success]).to be true
27
+ expect(result[:dug]).to be true
28
+ end
29
+
30
+ it 'returns failure for unknown site' do
31
+ result = runner.dig(site_id: 'bad', engine: engine)
32
+ expect(result[:success]).to be false
33
+ end
34
+ end
35
+
36
+ describe '.excavate' do
37
+ let(:site) { engine.create_site(domain: :cognitive) }
38
+
39
+ it 'excavates successfully' do
40
+ result = runner.excavate(site_id: site.id, engine: engine)
41
+ expect(result[:success]).to be true
42
+ expect(result[:artifact]).to be_a Hash
43
+ end
44
+
45
+ it 'returns failure for unknown site' do
46
+ result = runner.excavate(site_id: 'bad', engine: engine)
47
+ expect(result[:success]).to be false
48
+ end
49
+ end
50
+
51
+ describe '.restore_artifact' do
52
+ it 'restores an artifact' do
53
+ site = engine.create_site(domain: :cognitive)
54
+ a = engine.excavate(site_id: site.id)
55
+ a.decay!(rate: 0.3)
56
+ result = runner.restore_artifact(artifact_id: a.id, boost: 0.2, engine: engine)
57
+ expect(result[:success]).to be true
58
+ end
59
+
60
+ it 'returns failure for unknown artifact' do
61
+ result = runner.restore_artifact(artifact_id: 'bad', boost: 0.1, engine: engine)
62
+ expect(result[:success]).to be false
63
+ end
64
+ end
65
+
66
+ describe '.list_artifacts' do
67
+ before do
68
+ site = engine.create_site(domain: :cognitive)
69
+ 3.times { engine.excavate(site_id: site.id) }
70
+ end
71
+
72
+ it 'lists all artifacts' do
73
+ result = runner.list_artifacts(engine: engine)
74
+ expect(result[:success]).to be true
75
+ expect(result[:count]).to eq 3
76
+ end
77
+
78
+ it 'filters by domain' do
79
+ result = runner.list_artifacts(engine: engine, domain: :cognitive)
80
+ expect(result[:count]).to eq 3
81
+ end
82
+
83
+ it 'filters by non-matching domain' do
84
+ result = runner.list_artifacts(engine: engine, domain: :emotional)
85
+ expect(result[:count]).to eq 0
86
+ end
87
+ end
88
+
89
+ describe '.archaeology_status' do
90
+ it 'returns status report' do
91
+ result = runner.archaeology_status(engine: engine)
92
+ expect(result[:success]).to be true
93
+ expect(result[:report]).to be_a Hash
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,138 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::Compression::Helpers::CompressionEngine do
4
+ subject(:engine) { described_class.new }
5
+
6
+ let(:chunk) { engine.store_chunk(label: 'test') }
7
+
8
+ describe '#store_chunk' do
9
+ it 'returns an InformationChunk' do
10
+ expect(chunk).to be_a(Legion::Extensions::Agentic::Memory::Compression::Helpers::InformationChunk)
11
+ end
12
+
13
+ it 'increases chunk count' do
14
+ chunk
15
+ expect(engine.to_h[:total_chunks]).to eq(1)
16
+ end
17
+
18
+ it 'accepts type and size' do
19
+ c = engine.store_chunk(label: 'big', chunk_type: :episodic, original_size: 5.0)
20
+ expect(c.chunk_type).to eq(:episodic)
21
+ expect(c.original_size).to eq(5.0)
22
+ end
23
+ end
24
+
25
+ describe '#compress_chunk' do
26
+ it 'reduces the chunk compressed_size' do
27
+ original = chunk.compressed_size
28
+ engine.compress_chunk(chunk_id: chunk.id)
29
+ expect(chunk.compressed_size).to be < original
30
+ end
31
+
32
+ it 'returns nil for unknown id' do
33
+ expect(engine.compress_chunk(chunk_id: 'fake')).to be_nil
34
+ end
35
+ end
36
+
37
+ describe '#decompress_chunk' do
38
+ it 'increases compressed_size after compression' do
39
+ engine.compress_chunk(chunk_id: chunk.id)
40
+ small = chunk.compressed_size
41
+ engine.decompress_chunk(chunk_id: chunk.id)
42
+ expect(chunk.compressed_size).to be > small
43
+ end
44
+ end
45
+
46
+ describe '#abstract_chunks' do
47
+ it 'creates an abstraction from multiple chunks' do
48
+ c1 = engine.store_chunk(label: 'a')
49
+ c2 = engine.store_chunk(label: 'b')
50
+ abstraction = engine.abstract_chunks(chunk_ids: [c1.id, c2.id],
51
+ abstraction_label: 'combined')
52
+ expect(abstraction).to be_a(Legion::Extensions::Agentic::Memory::Compression::Helpers::InformationChunk)
53
+ expect(abstraction.chunk_type).to eq(:abstract)
54
+ end
55
+
56
+ it 'returns nil for empty chunk_ids' do
57
+ expect(engine.abstract_chunks(chunk_ids: ['fake'], abstraction_label: 'x')).to be_nil
58
+ end
59
+ end
60
+
61
+ describe '#compress_all' do
62
+ it 'compresses every stored chunk' do
63
+ 3.times { |i| engine.store_chunk(label: "c#{i}") }
64
+ count = engine.compress_all
65
+ expect(count).to eq(3)
66
+ end
67
+ end
68
+
69
+ describe '#chunks_by_type' do
70
+ it 'filters by type' do
71
+ engine.store_chunk(label: 'epi', chunk_type: :episodic)
72
+ engine.store_chunk(label: 'sem', chunk_type: :semantic)
73
+ result = engine.chunks_by_type(chunk_type: :episodic)
74
+ expect(result.size).to eq(1)
75
+ end
76
+ end
77
+
78
+ describe '#average_compression_ratio' do
79
+ it 'returns 0.0 with no chunks' do
80
+ expect(engine.average_compression_ratio).to eq(0.0)
81
+ end
82
+
83
+ it 'increases after compression' do
84
+ engine.store_chunk(label: 'a')
85
+ engine.compress_all
86
+ expect(engine.average_compression_ratio).to be > 0.0
87
+ end
88
+ end
89
+
90
+ describe '#average_fidelity' do
91
+ it 'returns 1.0 with no chunks' do
92
+ expect(engine.average_fidelity).to eq(1.0)
93
+ end
94
+
95
+ it 'decreases after compression' do
96
+ engine.store_chunk(label: 'a')
97
+ engine.compress_all
98
+ expect(engine.average_fidelity).to be < 1.0
99
+ end
100
+ end
101
+
102
+ describe '#overall_compression_ratio' do
103
+ it 'returns 0.0 with no chunks' do
104
+ expect(engine.overall_compression_ratio).to eq(0.0)
105
+ end
106
+ end
107
+
108
+ describe '#compression_report' do
109
+ it 'includes all report fields' do
110
+ chunk
111
+ report = engine.compression_report
112
+ expect(report).to include(
113
+ :total_chunks, :total_abstractions, :average_compression_ratio,
114
+ :overall_compression_ratio, :average_fidelity,
115
+ :total_original_size, :total_compressed_size, :highly_compressed_count
116
+ )
117
+ end
118
+ end
119
+
120
+ describe '#to_h' do
121
+ it 'includes summary fields' do
122
+ hash = engine.to_h
123
+ expect(hash).to include(
124
+ :total_chunks, :total_abstractions,
125
+ :average_compression_ratio, :average_fidelity
126
+ )
127
+ end
128
+ end
129
+
130
+ describe 'pruning' do
131
+ it 'prunes oldest chunk when limit reached' do
132
+ stub_const('Legion::Extensions::Agentic::Memory::Compression::Helpers::Constants::MAX_CHUNKS', 3)
133
+ eng = described_class.new
134
+ 4.times { |i| eng.store_chunk(label: "c#{i}") }
135
+ expect(eng.to_h[:total_chunks]).to eq(3)
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Memory::Compression::Helpers::Constants do
4
+ let(:klass) { Class.new { include Legion::Extensions::Agentic::Memory::Compression::Helpers::Constants } }
5
+
6
+ describe 'COMPRESSION_LABELS' do
7
+ it 'is a frozen hash' do
8
+ expect(klass::COMPRESSION_LABELS).to be_a(Hash).and be_frozen
9
+ end
10
+
11
+ it 'covers the full 0..1 range' do
12
+ labels = klass::COMPRESSION_LABELS
13
+ [0.0, 0.3, 0.5, 0.7, 0.9].each do |val|
14
+ match = labels.find { |range, _| range.cover?(val) }
15
+ expect(match).not_to be_nil, "no label for #{val}"
16
+ end
17
+ end
18
+ end
19
+
20
+ describe 'FIDELITY_LABELS' do
21
+ it 'is a frozen hash' do
22
+ expect(klass::FIDELITY_LABELS).to be_a(Hash).and be_frozen
23
+ end
24
+ end
25
+
26
+ describe 'CHUNK_TYPES' do
27
+ it 'is a frozen array of symbols' do
28
+ expect(klass::CHUNK_TYPES).to be_a(Array).and be_frozen
29
+ expect(klass::CHUNK_TYPES).to all(be_a(Symbol))
30
+ end
31
+
32
+ it 'includes semantic and episodic' do
33
+ expect(klass::CHUNK_TYPES).to include(:semantic, :episodic)
34
+ end
35
+ end
36
+
37
+ describe 'numeric constants' do
38
+ it 'has positive MAX_CHUNKS' do
39
+ expect(klass::MAX_CHUNKS).to be > 0
40
+ end
41
+
42
+ it 'has COMPRESSION_RATE between 0 and 1' do
43
+ expect(klass::COMPRESSION_RATE).to be_between(0.0, 1.0)
44
+ end
45
+
46
+ it 'has MIN_FIDELITY between 0 and 1' do
47
+ expect(klass::MIN_FIDELITY).to be_between(0.0, 1.0)
48
+ end
49
+ end
50
+ end