lex-agentic-attention 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 (315) 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-attention.gemspec +30 -0
  7. data/lib/legion/extensions/agentic/attention/arousal/client.rb +27 -0
  8. data/lib/legion/extensions/agentic/attention/arousal/helpers/arousal_model.rb +84 -0
  9. data/lib/legion/extensions/agentic/attention/arousal/helpers/constants.rb +44 -0
  10. data/lib/legion/extensions/agentic/attention/arousal/runners/arousal.rb +119 -0
  11. data/lib/legion/extensions/agentic/attention/arousal/version.rb +13 -0
  12. data/lib/legion/extensions/agentic/attention/arousal.rb +18 -0
  13. data/lib/legion/extensions/agentic/attention/blindspot/client.rb +19 -0
  14. data/lib/legion/extensions/agentic/attention/blindspot/helpers/blindspot.rb +98 -0
  15. data/lib/legion/extensions/agentic/attention/blindspot/helpers/blindspot_engine.rb +174 -0
  16. data/lib/legion/extensions/agentic/attention/blindspot/helpers/constants.rb +63 -0
  17. data/lib/legion/extensions/agentic/attention/blindspot/helpers/knowledge_boundary.rb +62 -0
  18. data/lib/legion/extensions/agentic/attention/blindspot/runners/cognitive_blindspot.rb +103 -0
  19. data/lib/legion/extensions/agentic/attention/blindspot/version.rb +13 -0
  20. data/lib/legion/extensions/agentic/attention/blindspot.rb +20 -0
  21. data/lib/legion/extensions/agentic/attention/blink/client.rb +19 -0
  22. data/lib/legion/extensions/agentic/attention/blink/helpers/blink_engine.rb +171 -0
  23. data/lib/legion/extensions/agentic/attention/blink/helpers/constants.rb +46 -0
  24. data/lib/legion/extensions/agentic/attention/blink/helpers/stimulus.rb +68 -0
  25. data/lib/legion/extensions/agentic/attention/blink/runners/attentional_blink.rb +75 -0
  26. data/lib/legion/extensions/agentic/attention/blink/version.rb +13 -0
  27. data/lib/legion/extensions/agentic/attention/blink.rb +19 -0
  28. data/lib/legion/extensions/agentic/attention/economy/client.rb +28 -0
  29. data/lib/legion/extensions/agentic/attention/economy/helpers/attention_budget.rb +143 -0
  30. data/lib/legion/extensions/agentic/attention/economy/helpers/constants.rb +38 -0
  31. data/lib/legion/extensions/agentic/attention/economy/helpers/demand.rb +72 -0
  32. data/lib/legion/extensions/agentic/attention/economy/runners/attention_economy.rb +90 -0
  33. data/lib/legion/extensions/agentic/attention/economy/version.rb +13 -0
  34. data/lib/legion/extensions/agentic/attention/economy.rb +19 -0
  35. data/lib/legion/extensions/agentic/attention/feature_binding/actors/decay.rb +45 -0
  36. data/lib/legion/extensions/agentic/attention/feature_binding/client.rb +29 -0
  37. data/lib/legion/extensions/agentic/attention/feature_binding/helpers/binding_field.rb +124 -0
  38. data/lib/legion/extensions/agentic/attention/feature_binding/helpers/bound_object.rb +89 -0
  39. data/lib/legion/extensions/agentic/attention/feature_binding/helpers/constants.rb +52 -0
  40. data/lib/legion/extensions/agentic/attention/feature_binding/helpers/feature.rb +52 -0
  41. data/lib/legion/extensions/agentic/attention/feature_binding/runners/feature_binding.rb +102 -0
  42. data/lib/legion/extensions/agentic/attention/feature_binding/version.rb +13 -0
  43. data/lib/legion/extensions/agentic/attention/feature_binding.rb +20 -0
  44. data/lib/legion/extensions/agentic/attention/focus/client.rb +30 -0
  45. data/lib/legion/extensions/agentic/attention/focus/helpers/constants.rb +38 -0
  46. data/lib/legion/extensions/agentic/attention/focus/helpers/focus.rb +78 -0
  47. data/lib/legion/extensions/agentic/attention/focus/helpers/focus_manager.rb +67 -0
  48. data/lib/legion/extensions/agentic/attention/focus/helpers/habituation.rb +61 -0
  49. data/lib/legion/extensions/agentic/attention/focus/runners/attention.rb +121 -0
  50. data/lib/legion/extensions/agentic/attention/focus/version.rb +13 -0
  51. data/lib/legion/extensions/agentic/attention/focus.rb +20 -0
  52. data/lib/legion/extensions/agentic/attention/kaleidoscope/client.rb +15 -0
  53. data/lib/legion/extensions/agentic/attention/kaleidoscope/helpers/constants.rb +48 -0
  54. data/lib/legion/extensions/agentic/attention/kaleidoscope/helpers/facet.rb +90 -0
  55. data/lib/legion/extensions/agentic/attention/kaleidoscope/helpers/kaleidoscope_engine.rb +142 -0
  56. data/lib/legion/extensions/agentic/attention/kaleidoscope/helpers/pattern.rb +110 -0
  57. data/lib/legion/extensions/agentic/attention/kaleidoscope/runners/cognitive_kaleidoscope.rb +91 -0
  58. data/lib/legion/extensions/agentic/attention/kaleidoscope/version.rb +13 -0
  59. data/lib/legion/extensions/agentic/attention/kaleidoscope.rb +22 -0
  60. data/lib/legion/extensions/agentic/attention/latent_inhibition/client.rb +28 -0
  61. data/lib/legion/extensions/agentic/attention/latent_inhibition/helpers/constants.rb +33 -0
  62. data/lib/legion/extensions/agentic/attention/latent_inhibition/helpers/inhibition_engine.rb +118 -0
  63. data/lib/legion/extensions/agentic/attention/latent_inhibition/helpers/stimulus_record.rb +70 -0
  64. data/lib/legion/extensions/agentic/attention/latent_inhibition/runners/latent_inhibition.rb +78 -0
  65. data/lib/legion/extensions/agentic/attention/latent_inhibition/version.rb +13 -0
  66. data/lib/legion/extensions/agentic/attention/latent_inhibition.rb +19 -0
  67. data/lib/legion/extensions/agentic/attention/lens/client.rb +29 -0
  68. data/lib/legion/extensions/agentic/attention/lens/helpers/constants.rb +58 -0
  69. data/lib/legion/extensions/agentic/attention/lens/helpers/lens.rb +99 -0
  70. data/lib/legion/extensions/agentic/attention/lens/helpers/lens_engine.rb +101 -0
  71. data/lib/legion/extensions/agentic/attention/lens/helpers/lens_stack.rb +134 -0
  72. data/lib/legion/extensions/agentic/attention/lens/runners/cognitive_lens.rb +90 -0
  73. data/lib/legion/extensions/agentic/attention/lens/version.rb +13 -0
  74. data/lib/legion/extensions/agentic/attention/lens.rb +22 -0
  75. data/lib/legion/extensions/agentic/attention/lighthouse/client.rb +25 -0
  76. data/lib/legion/extensions/agentic/attention/lighthouse/helpers/beacon.rb +76 -0
  77. data/lib/legion/extensions/agentic/attention/lighthouse/helpers/constants.rb +49 -0
  78. data/lib/legion/extensions/agentic/attention/lighthouse/helpers/fog.rb +74 -0
  79. data/lib/legion/extensions/agentic/attention/lighthouse/helpers/lighthouse_engine.rb +127 -0
  80. data/lib/legion/extensions/agentic/attention/lighthouse/runners/cognitive_lighthouse.rb +80 -0
  81. data/lib/legion/extensions/agentic/attention/lighthouse/version.rb +13 -0
  82. data/lib/legion/extensions/agentic/attention/lighthouse.rb +22 -0
  83. data/lib/legion/extensions/agentic/attention/priming/client.rb +21 -0
  84. data/lib/legion/extensions/agentic/attention/priming/helpers/activation_network.rb +130 -0
  85. data/lib/legion/extensions/agentic/attention/priming/helpers/concept_node.rb +92 -0
  86. data/lib/legion/extensions/agentic/attention/priming/helpers/constants.rb +54 -0
  87. data/lib/legion/extensions/agentic/attention/priming/runners/priming.rb +94 -0
  88. data/lib/legion/extensions/agentic/attention/priming/version.rb +13 -0
  89. data/lib/legion/extensions/agentic/attention/priming.rb +19 -0
  90. data/lib/legion/extensions/agentic/attention/prism/client.rb +26 -0
  91. data/lib/legion/extensions/agentic/attention/prism/helpers/beam.rb +169 -0
  92. data/lib/legion/extensions/agentic/attention/prism/helpers/constants.rb +46 -0
  93. data/lib/legion/extensions/agentic/attention/prism/helpers/prism_engine.rb +136 -0
  94. data/lib/legion/extensions/agentic/attention/prism/helpers/spectral_component.rb +72 -0
  95. data/lib/legion/extensions/agentic/attention/prism/runners/cognitive_prism.rb +79 -0
  96. data/lib/legion/extensions/agentic/attention/prism/version.rb +13 -0
  97. data/lib/legion/extensions/agentic/attention/prism.rb +22 -0
  98. data/lib/legion/extensions/agentic/attention/regulation/client.rb +19 -0
  99. data/lib/legion/extensions/agentic/attention/regulation/helpers/attention_controller.rb +157 -0
  100. data/lib/legion/extensions/agentic/attention/regulation/helpers/attention_target.rb +64 -0
  101. data/lib/legion/extensions/agentic/attention/regulation/helpers/constants.rb +41 -0
  102. data/lib/legion/extensions/agentic/attention/regulation/runners/attention_regulation.rb +88 -0
  103. data/lib/legion/extensions/agentic/attention/regulation/version.rb +13 -0
  104. data/lib/legion/extensions/agentic/attention/regulation.rb +20 -0
  105. data/lib/legion/extensions/agentic/attention/relevance_theory/helpers/client.rb +17 -0
  106. data/lib/legion/extensions/agentic/attention/relevance_theory/helpers/cognitive_input.rb +88 -0
  107. data/lib/legion/extensions/agentic/attention/relevance_theory/helpers/constants.rb +50 -0
  108. data/lib/legion/extensions/agentic/attention/relevance_theory/helpers/relevance_engine.rb +152 -0
  109. data/lib/legion/extensions/agentic/attention/relevance_theory/runners/relevance_theory.rb +98 -0
  110. data/lib/legion/extensions/agentic/attention/relevance_theory/version.rb +13 -0
  111. data/lib/legion/extensions/agentic/attention/relevance_theory.rb +19 -0
  112. data/lib/legion/extensions/agentic/attention/salience/client.rb +21 -0
  113. data/lib/legion/extensions/agentic/attention/salience/helpers/constants.rb +44 -0
  114. data/lib/legion/extensions/agentic/attention/salience/helpers/salience_map.rb +122 -0
  115. data/lib/legion/extensions/agentic/attention/salience/helpers/signal_integrator.rb +97 -0
  116. data/lib/legion/extensions/agentic/attention/salience/runners/salience.rb +70 -0
  117. data/lib/legion/extensions/agentic/attention/salience/version.rb +13 -0
  118. data/lib/legion/extensions/agentic/attention/salience.rb +19 -0
  119. data/lib/legion/extensions/agentic/attention/schema/actors/decay.rb +45 -0
  120. data/lib/legion/extensions/agentic/attention/schema/client.rb +28 -0
  121. data/lib/legion/extensions/agentic/attention/schema/helpers/attention_schema_model.rb +226 -0
  122. data/lib/legion/extensions/agentic/attention/schema/helpers/constants.rb +66 -0
  123. data/lib/legion/extensions/agentic/attention/schema/helpers/schema_item.rb +68 -0
  124. data/lib/legion/extensions/agentic/attention/schema/runners/attention_schema.rb +117 -0
  125. data/lib/legion/extensions/agentic/attention/schema/version.rb +13 -0
  126. data/lib/legion/extensions/agentic/attention/schema.rb +19 -0
  127. data/lib/legion/extensions/agentic/attention/sensory_gating/client.rb +15 -0
  128. data/lib/legion/extensions/agentic/attention/sensory_gating/helpers/constants.rb +44 -0
  129. data/lib/legion/extensions/agentic/attention/sensory_gating/helpers/gating_engine.rb +109 -0
  130. data/lib/legion/extensions/agentic/attention/sensory_gating/helpers/sensory_filter.rb +100 -0
  131. data/lib/legion/extensions/agentic/attention/sensory_gating/runners/sensory_gating.rb +73 -0
  132. data/lib/legion/extensions/agentic/attention/sensory_gating/version.rb +13 -0
  133. data/lib/legion/extensions/agentic/attention/sensory_gating.rb +19 -0
  134. data/lib/legion/extensions/agentic/attention/signal_detection/client.rb +28 -0
  135. data/lib/legion/extensions/agentic/attention/signal_detection/helpers/constants.rb +66 -0
  136. data/lib/legion/extensions/agentic/attention/signal_detection/helpers/detection_engine.rb +129 -0
  137. data/lib/legion/extensions/agentic/attention/signal_detection/helpers/detector.rb +136 -0
  138. data/lib/legion/extensions/agentic/attention/signal_detection/runners/signal_detection.rb +113 -0
  139. data/lib/legion/extensions/agentic/attention/signal_detection/version.rb +13 -0
  140. data/lib/legion/extensions/agentic/attention/signal_detection.rb +19 -0
  141. data/lib/legion/extensions/agentic/attention/spotlight/client.rb +29 -0
  142. data/lib/legion/extensions/agentic/attention/spotlight/helpers/attention_target.rb +61 -0
  143. data/lib/legion/extensions/agentic/attention/spotlight/helpers/constants.rb +44 -0
  144. data/lib/legion/extensions/agentic/attention/spotlight/helpers/spotlight.rb +78 -0
  145. data/lib/legion/extensions/agentic/attention/spotlight/helpers/spotlight_engine.rb +163 -0
  146. data/lib/legion/extensions/agentic/attention/spotlight/runners/attention_spotlight.rb +122 -0
  147. data/lib/legion/extensions/agentic/attention/spotlight/version.rb +13 -0
  148. data/lib/legion/extensions/agentic/attention/spotlight.rb +20 -0
  149. data/lib/legion/extensions/agentic/attention/subliminal/client.rb +19 -0
  150. data/lib/legion/extensions/agentic/attention/subliminal/helpers/constants.rb +74 -0
  151. data/lib/legion/extensions/agentic/attention/subliminal/helpers/influence_event.rb +44 -0
  152. data/lib/legion/extensions/agentic/attention/subliminal/helpers/subliminal_engine.rb +149 -0
  153. data/lib/legion/extensions/agentic/attention/subliminal/helpers/subliminal_trace.rb +101 -0
  154. data/lib/legion/extensions/agentic/attention/subliminal/runners/subliminal.rb +71 -0
  155. data/lib/legion/extensions/agentic/attention/subliminal/version.rb +13 -0
  156. data/lib/legion/extensions/agentic/attention/subliminal.rb +20 -0
  157. data/lib/legion/extensions/agentic/attention/surprise/client.rb +22 -0
  158. data/lib/legion/extensions/agentic/attention/surprise/helpers/constants.rb +35 -0
  159. data/lib/legion/extensions/agentic/attention/surprise/helpers/habituation_model.rb +62 -0
  160. data/lib/legion/extensions/agentic/attention/surprise/helpers/surprise_event.rb +43 -0
  161. data/lib/legion/extensions/agentic/attention/surprise/helpers/surprise_store.rb +74 -0
  162. data/lib/legion/extensions/agentic/attention/surprise/runners/surprise.rb +174 -0
  163. data/lib/legion/extensions/agentic/attention/surprise/version.rb +13 -0
  164. data/lib/legion/extensions/agentic/attention/surprise.rb +20 -0
  165. data/lib/legion/extensions/agentic/attention/switching/client.rb +19 -0
  166. data/lib/legion/extensions/agentic/attention/switching/helpers/constants.rb +64 -0
  167. data/lib/legion/extensions/agentic/attention/switching/helpers/switch_event.rb +60 -0
  168. data/lib/legion/extensions/agentic/attention/switching/helpers/switching_engine.rb +172 -0
  169. data/lib/legion/extensions/agentic/attention/switching/helpers/task_set.rb +91 -0
  170. data/lib/legion/extensions/agentic/attention/switching/runners/attention_switching.rb +92 -0
  171. data/lib/legion/extensions/agentic/attention/switching/version.rb +13 -0
  172. data/lib/legion/extensions/agentic/attention/switching.rb +20 -0
  173. data/lib/legion/extensions/agentic/attention/synesthesia/client.rb +29 -0
  174. data/lib/legion/extensions/agentic/attention/synesthesia/helpers/constants.rb +52 -0
  175. data/lib/legion/extensions/agentic/attention/synesthesia/helpers/sensory_mapping.rb +70 -0
  176. data/lib/legion/extensions/agentic/attention/synesthesia/helpers/synesthesia_engine.rb +177 -0
  177. data/lib/legion/extensions/agentic/attention/synesthesia/helpers/synesthetic_event.rb +49 -0
  178. data/lib/legion/extensions/agentic/attention/synesthesia/runners/cognitive_synesthesia.rb +83 -0
  179. data/lib/legion/extensions/agentic/attention/synesthesia/version.rb +13 -0
  180. data/lib/legion/extensions/agentic/attention/synesthesia.rb +20 -0
  181. data/lib/legion/extensions/agentic/attention/telescope/client.rb +15 -0
  182. data/lib/legion/extensions/agentic/attention/telescope/helpers/constants.rb +60 -0
  183. data/lib/legion/extensions/agentic/attention/telescope/helpers/observation.rb +68 -0
  184. data/lib/legion/extensions/agentic/attention/telescope/helpers/observatory_engine.rb +126 -0
  185. data/lib/legion/extensions/agentic/attention/telescope/helpers/telescope.rb +129 -0
  186. data/lib/legion/extensions/agentic/attention/telescope/runners/cognitive_telescope.rb +103 -0
  187. data/lib/legion/extensions/agentic/attention/telescope/version.rb +13 -0
  188. data/lib/legion/extensions/agentic/attention/telescope.rb +22 -0
  189. data/lib/legion/extensions/agentic/attention/version.rb +11 -0
  190. data/lib/legion/extensions/agentic/attention.rb +41 -0
  191. data/spec/legion/extensions/agentic/attention/arousal/client_spec.rb +42 -0
  192. data/spec/legion/extensions/agentic/attention/arousal/helpers/arousal_model_spec.rb +160 -0
  193. data/spec/legion/extensions/agentic/attention/arousal/helpers/constants_spec.rb +61 -0
  194. data/spec/legion/extensions/agentic/attention/arousal/runners/arousal_spec.rb +137 -0
  195. data/spec/legion/extensions/agentic/attention/blindspot/client_spec.rb +41 -0
  196. data/spec/legion/extensions/agentic/attention/blindspot/helpers/blindspot_engine_spec.rb +246 -0
  197. data/spec/legion/extensions/agentic/attention/blindspot/helpers/blindspot_spec.rb +204 -0
  198. data/spec/legion/extensions/agentic/attention/blindspot/helpers/constants_spec.rb +82 -0
  199. data/spec/legion/extensions/agentic/attention/blindspot/helpers/knowledge_boundary_spec.rb +104 -0
  200. data/spec/legion/extensions/agentic/attention/blindspot/runners/cognitive_blindspot_spec.rb +179 -0
  201. data/spec/legion/extensions/agentic/attention/blink/client_spec.rb +18 -0
  202. data/spec/legion/extensions/agentic/attention/blink/helpers/blink_engine_spec.rb +147 -0
  203. data/spec/legion/extensions/agentic/attention/blink/helpers/constants_spec.rb +27 -0
  204. data/spec/legion/extensions/agentic/attention/blink/helpers/stimulus_spec.rb +77 -0
  205. data/spec/legion/extensions/agentic/attention/blink/runners/attentional_blink_spec.rb +77 -0
  206. data/spec/legion/extensions/agentic/attention/economy/client_spec.rb +30 -0
  207. data/spec/legion/extensions/agentic/attention/economy/helpers/attention_budget_spec.rb +222 -0
  208. data/spec/legion/extensions/agentic/attention/economy/helpers/constants_spec.rb +112 -0
  209. data/spec/legion/extensions/agentic/attention/economy/helpers/demand_spec.rb +128 -0
  210. data/spec/legion/extensions/agentic/attention/economy/runners/attention_economy_spec.rb +163 -0
  211. data/spec/legion/extensions/agentic/attention/feature_binding/client_spec.rb +20 -0
  212. data/spec/legion/extensions/agentic/attention/feature_binding/helpers/binding_field_spec.rb +207 -0
  213. data/spec/legion/extensions/agentic/attention/feature_binding/helpers/bound_object_spec.rb +149 -0
  214. data/spec/legion/extensions/agentic/attention/feature_binding/helpers/feature_spec.rb +86 -0
  215. data/spec/legion/extensions/agentic/attention/feature_binding/runners/feature_binding_spec.rb +106 -0
  216. data/spec/legion/extensions/agentic/attention/focus/client_spec.rb +19 -0
  217. data/spec/legion/extensions/agentic/attention/focus/helpers/focus_manager_spec.rb +105 -0
  218. data/spec/legion/extensions/agentic/attention/focus/helpers/focus_spec.rb +148 -0
  219. data/spec/legion/extensions/agentic/attention/focus/helpers/habituation_spec.rb +97 -0
  220. data/spec/legion/extensions/agentic/attention/focus/runners/attention_spec.rb +134 -0
  221. data/spec/legion/extensions/agentic/attention/kaleidoscope/client_spec.rb +38 -0
  222. data/spec/legion/extensions/agentic/attention/kaleidoscope/helpers/constants_spec.rb +79 -0
  223. data/spec/legion/extensions/agentic/attention/kaleidoscope/helpers/facet_spec.rb +155 -0
  224. data/spec/legion/extensions/agentic/attention/kaleidoscope/helpers/kaleidoscope_engine_spec.rb +164 -0
  225. data/spec/legion/extensions/agentic/attention/kaleidoscope/helpers/pattern_spec.rb +157 -0
  226. data/spec/legion/extensions/agentic/attention/kaleidoscope/runners/cognitive_kaleidoscope_spec.rb +112 -0
  227. data/spec/legion/extensions/agentic/attention/latent_inhibition/client_spec.rb +49 -0
  228. data/spec/legion/extensions/agentic/attention/latent_inhibition/helpers/constants_spec.rb +57 -0
  229. data/spec/legion/extensions/agentic/attention/latent_inhibition/helpers/inhibition_engine_spec.rb +207 -0
  230. data/spec/legion/extensions/agentic/attention/latent_inhibition/helpers/stimulus_record_spec.rb +175 -0
  231. data/spec/legion/extensions/agentic/attention/latent_inhibition/runners/latent_inhibition_spec.rb +148 -0
  232. data/spec/legion/extensions/agentic/attention/lens/client_spec.rb +64 -0
  233. data/spec/legion/extensions/agentic/attention/lens/helpers/constants_spec.rb +91 -0
  234. data/spec/legion/extensions/agentic/attention/lens/helpers/lens_engine_spec.rb +158 -0
  235. data/spec/legion/extensions/agentic/attention/lens/helpers/lens_spec.rb +222 -0
  236. data/spec/legion/extensions/agentic/attention/lens/helpers/lens_stack_spec.rb +179 -0
  237. data/spec/legion/extensions/agentic/attention/lens/runners/cognitive_lens_spec.rb +182 -0
  238. data/spec/legion/extensions/agentic/attention/lighthouse/client_spec.rb +103 -0
  239. data/spec/legion/extensions/agentic/attention/lighthouse/helpers/beacon_spec.rb +170 -0
  240. data/spec/legion/extensions/agentic/attention/lighthouse/helpers/constants_spec.rb +94 -0
  241. data/spec/legion/extensions/agentic/attention/lighthouse/helpers/fog_spec.rb +166 -0
  242. data/spec/legion/extensions/agentic/attention/lighthouse/helpers/lighthouse_engine_spec.rb +238 -0
  243. data/spec/legion/extensions/agentic/attention/lighthouse/runners/cognitive_lighthouse_spec.rb +182 -0
  244. data/spec/legion/extensions/agentic/attention/priming/client_spec.rb +80 -0
  245. data/spec/legion/extensions/agentic/attention/priming/helpers/activation_network_spec.rb +176 -0
  246. data/spec/legion/extensions/agentic/attention/priming/helpers/concept_node_spec.rb +165 -0
  247. data/spec/legion/extensions/agentic/attention/priming/helpers/constants_spec.rb +51 -0
  248. data/spec/legion/extensions/agentic/attention/priming/runners/priming_spec.rb +141 -0
  249. data/spec/legion/extensions/agentic/attention/prism/client_spec.rb +86 -0
  250. data/spec/legion/extensions/agentic/attention/prism/helpers/beam_spec.rb +182 -0
  251. data/spec/legion/extensions/agentic/attention/prism/helpers/constants_spec.rb +93 -0
  252. data/spec/legion/extensions/agentic/attention/prism/helpers/prism_engine_spec.rb +253 -0
  253. data/spec/legion/extensions/agentic/attention/prism/helpers/spectral_component_spec.rb +171 -0
  254. data/spec/legion/extensions/agentic/attention/prism/runners/cognitive_prism_spec.rb +132 -0
  255. data/spec/legion/extensions/agentic/attention/regulation/client_spec.rb +58 -0
  256. data/spec/legion/extensions/agentic/attention/regulation/helpers/attention_controller_spec.rb +295 -0
  257. data/spec/legion/extensions/agentic/attention/regulation/helpers/attention_target_spec.rb +122 -0
  258. data/spec/legion/extensions/agentic/attention/regulation/runners/attention_regulation_spec.rb +147 -0
  259. data/spec/legion/extensions/agentic/attention/relevance_theory/helpers/cognitive_input_spec.rb +121 -0
  260. data/spec/legion/extensions/agentic/attention/relevance_theory/helpers/relevance_engine_spec.rb +149 -0
  261. data/spec/legion/extensions/agentic/attention/relevance_theory/relevance_theory_spec.rb +11 -0
  262. data/spec/legion/extensions/agentic/attention/relevance_theory/runners/relevance_theory_spec.rb +86 -0
  263. data/spec/legion/extensions/agentic/attention/salience/client_spec.rb +60 -0
  264. data/spec/legion/extensions/agentic/attention/salience/helpers/constants_spec.rb +100 -0
  265. data/spec/legion/extensions/agentic/attention/salience/helpers/salience_map_spec.rb +189 -0
  266. data/spec/legion/extensions/agentic/attention/salience/helpers/signal_integrator_spec.rb +149 -0
  267. data/spec/legion/extensions/agentic/attention/salience/runners/salience_spec.rb +143 -0
  268. data/spec/legion/extensions/agentic/attention/schema/client_spec.rb +47 -0
  269. data/spec/legion/extensions/agentic/attention/schema/helpers/attention_schema_model_spec.rb +219 -0
  270. data/spec/legion/extensions/agentic/attention/schema/helpers/schema_item_spec.rb +114 -0
  271. data/spec/legion/extensions/agentic/attention/schema/runners/attention_schema_spec.rb +185 -0
  272. data/spec/legion/extensions/agentic/attention/sensory_gating/helpers/gating_engine_spec.rb +112 -0
  273. data/spec/legion/extensions/agentic/attention/sensory_gating/helpers/sensory_filter_spec.rb +121 -0
  274. data/spec/legion/extensions/agentic/attention/sensory_gating/runners/sensory_gating_spec.rb +61 -0
  275. data/spec/legion/extensions/agentic/attention/signal_detection/client_spec.rb +20 -0
  276. data/spec/legion/extensions/agentic/attention/signal_detection/helpers/constants_spec.rb +85 -0
  277. data/spec/legion/extensions/agentic/attention/signal_detection/helpers/detection_engine_spec.rb +143 -0
  278. data/spec/legion/extensions/agentic/attention/signal_detection/helpers/detector_spec.rb +179 -0
  279. data/spec/legion/extensions/agentic/attention/signal_detection/runners/signal_detection_spec.rb +151 -0
  280. data/spec/legion/extensions/agentic/attention/spotlight/client_spec.rb +31 -0
  281. data/spec/legion/extensions/agentic/attention/spotlight/helpers/attention_target_spec.rb +121 -0
  282. data/spec/legion/extensions/agentic/attention/spotlight/helpers/constants_spec.rb +82 -0
  283. data/spec/legion/extensions/agentic/attention/spotlight/helpers/spotlight_engine_spec.rb +275 -0
  284. data/spec/legion/extensions/agentic/attention/spotlight/helpers/spotlight_spec.rb +196 -0
  285. data/spec/legion/extensions/agentic/attention/spotlight/runners/attention_spotlight_spec.rb +251 -0
  286. data/spec/legion/extensions/agentic/attention/subliminal/client_spec.rb +21 -0
  287. data/spec/legion/extensions/agentic/attention/subliminal/helpers/influence_event_spec.rb +58 -0
  288. data/spec/legion/extensions/agentic/attention/subliminal/helpers/subliminal_engine_spec.rb +161 -0
  289. data/spec/legion/extensions/agentic/attention/subliminal/helpers/subliminal_trace_spec.rb +168 -0
  290. data/spec/legion/extensions/agentic/attention/subliminal/runners_spec.rb +78 -0
  291. data/spec/legion/extensions/agentic/attention/subliminal/subliminal_spec.rb +7 -0
  292. data/spec/legion/extensions/agentic/attention/surprise/client_spec.rb +122 -0
  293. data/spec/legion/extensions/agentic/attention/surprise/helpers/constants_spec.rb +112 -0
  294. data/spec/legion/extensions/agentic/attention/surprise/helpers/habituation_model_spec.rb +127 -0
  295. data/spec/legion/extensions/agentic/attention/surprise/helpers/surprise_event_spec.rb +102 -0
  296. data/spec/legion/extensions/agentic/attention/surprise/helpers/surprise_store_spec.rb +171 -0
  297. data/spec/legion/extensions/agentic/attention/surprise/runners/surprise_spec.rb +266 -0
  298. data/spec/legion/extensions/agentic/attention/switching/attention_switching_spec.rb +7 -0
  299. data/spec/legion/extensions/agentic/attention/switching/helpers/switch_event_spec.rb +74 -0
  300. data/spec/legion/extensions/agentic/attention/switching/helpers/switching_engine_spec.rb +164 -0
  301. data/spec/legion/extensions/agentic/attention/switching/helpers/task_set_spec.rb +134 -0
  302. data/spec/legion/extensions/agentic/attention/synesthesia/client_spec.rb +57 -0
  303. data/spec/legion/extensions/agentic/attention/synesthesia/helpers/constants_spec.rb +89 -0
  304. data/spec/legion/extensions/agentic/attention/synesthesia/helpers/sensory_mapping_spec.rb +135 -0
  305. data/spec/legion/extensions/agentic/attention/synesthesia/helpers/synesthesia_engine_spec.rb +260 -0
  306. data/spec/legion/extensions/agentic/attention/synesthesia/helpers/synesthetic_event_spec.rb +83 -0
  307. data/spec/legion/extensions/agentic/attention/synesthesia/runners/cognitive_synesthesia_spec.rb +192 -0
  308. data/spec/legion/extensions/agentic/attention/telescope/client_spec.rb +30 -0
  309. data/spec/legion/extensions/agentic/attention/telescope/helpers/constants_spec.rb +108 -0
  310. data/spec/legion/extensions/agentic/attention/telescope/helpers/observation_spec.rb +138 -0
  311. data/spec/legion/extensions/agentic/attention/telescope/helpers/observatory_engine_spec.rb +197 -0
  312. data/spec/legion/extensions/agentic/attention/telescope/helpers/telescope_spec.rb +251 -0
  313. data/spec/legion/extensions/agentic/attention/telescope/runners/cognitive_telescope_spec.rb +191 -0
  314. data/spec/spec_helper.rb +46 -0
  315. metadata +399 -0
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Attention::Priming::Client do
6
+ subject(:client) { described_class.new }
7
+
8
+ describe '#initialize' do
9
+ it 'creates a default network' do
10
+ expect(client.network).to be_a(Legion::Extensions::Agentic::Attention::Priming::Helpers::ActivationNetwork)
11
+ end
12
+
13
+ it 'accepts an injected network' do
14
+ custom = Legion::Extensions::Agentic::Attention::Priming::Helpers::ActivationNetwork.new
15
+ injected = described_class.new(network: custom)
16
+ expect(injected.network).to equal(custom)
17
+ end
18
+ end
19
+
20
+ describe 'spreading activation lifecycle' do
21
+ it 'models semantic priming: dog -> bone -> fetch -> park' do
22
+ # Build a semantic network
23
+ client.add_concept(name: :dog, domain: :animals)
24
+ client.add_concept(name: :bone, domain: :objects)
25
+ client.add_concept(name: :fetch, domain: :activities)
26
+ client.add_concept(name: :park, domain: :places)
27
+
28
+ client.link_concepts(name_a: :dog, name_b: :bone, strength: 0.9)
29
+ client.link_concepts(name_a: :dog, name_b: :fetch, strength: 0.7)
30
+ client.link_concepts(name_a: :fetch, name_b: :park, strength: 0.6)
31
+
32
+ # Prime "dog" — should spread to bone, fetch, and park
33
+ client.prime_concept(name: :dog)
34
+
35
+ bone_check = client.check_primed(name: :bone)
36
+ fetch_check = client.check_primed(name: :fetch)
37
+ park_check = client.check_primed(name: :park)
38
+
39
+ expect(bone_check[:primed]).to be true
40
+ expect(fetch_check[:primed]).to be true
41
+ # Park is 2 hops away — may or may not be primed depending on spread
42
+ expect(park_check[:activation]).to be >= 0.0
43
+
44
+ # Dog should be most strongly primed
45
+ strongest = client.strongest_primes(count: 1)
46
+ expect(strongest[:primes].first[:name]).to eq(:dog)
47
+
48
+ # Decay over time
49
+ 5.times { client.update_priming }
50
+ after_decay = client.check_primed(name: :bone)
51
+ expect(after_decay[:activation]).to be < bone_check[:activation]
52
+
53
+ # Eventually all priming fades
54
+ 20.times { client.update_priming }
55
+ stats = client.priming_stats
56
+ expect(stats[:stats][:active_primes]).to eq(0)
57
+ end
58
+
59
+ it 'demonstrates domain-specific priming' do
60
+ # Animal domain
61
+ client.add_concept(name: :dog, domain: :animals)
62
+ client.add_concept(name: :cat, domain: :animals)
63
+ client.link_concepts(name_a: :dog, name_b: :cat, strength: 0.8)
64
+
65
+ # Vehicle domain
66
+ client.add_concept(name: :car, domain: :vehicles)
67
+ client.add_concept(name: :truck, domain: :vehicles)
68
+ client.link_concepts(name_a: :car, name_b: :truck, strength: 0.8)
69
+
70
+ # Prime one domain
71
+ client.prime_concept(name: :dog)
72
+
73
+ # Only animal domain should be primed
74
+ animals = client.primed_concepts(domain: :animals)
75
+ vehicles = client.primed_concepts(domain: :vehicles)
76
+ expect(animals[:count]).to be >= 1
77
+ expect(vehicles[:count]).to eq(0)
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,176 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Attention::Priming::Helpers::ActivationNetwork do
6
+ subject(:network) { described_class.new }
7
+
8
+ let(:constants) { Legion::Extensions::Agentic::Attention::Priming::Helpers::Constants }
9
+
10
+ describe '#initialize' do
11
+ it 'starts empty' do
12
+ expect(network.concepts).to eq({})
13
+ expect(network.concept_count).to eq(0)
14
+ end
15
+ end
16
+
17
+ describe '#add_concept' do
18
+ it 'adds a concept node' do
19
+ concept = network.add_concept(name: :dog)
20
+ expect(concept.name).to eq(:dog)
21
+ expect(network.concept_count).to eq(1)
22
+ end
23
+
24
+ it 'returns existing concept if already present' do
25
+ first = network.add_concept(name: :dog)
26
+ second = network.add_concept(name: :dog)
27
+ expect(first).to equal(second)
28
+ end
29
+
30
+ it 'accepts domain' do
31
+ concept = network.add_concept(name: :dog, domain: :animals)
32
+ expect(concept.domain).to eq(:animals)
33
+ end
34
+ end
35
+
36
+ describe '#link' do
37
+ it 'creates bidirectional associations' do
38
+ network.link(:dog, :cat)
39
+ expect(network.concepts[:dog].association_strength(:cat)).to be > 0
40
+ expect(network.concepts[:cat].association_strength(:dog)).to be > 0
41
+ end
42
+
43
+ it 'auto-creates concepts if missing' do
44
+ network.link(:apple, :banana)
45
+ expect(network.concept_count).to eq(2)
46
+ end
47
+
48
+ it 'accepts custom strength' do
49
+ network.link(:dog, :cat, strength: 0.9)
50
+ expect(network.concepts[:dog].association_strength(:cat)).to eq(0.9)
51
+ end
52
+ end
53
+
54
+ describe '#prime' do
55
+ before do
56
+ network.link(:dog, :cat, strength: 0.8)
57
+ network.link(:cat, :mouse, strength: 0.6)
58
+ network.link(:mouse, :cheese, strength: 0.7)
59
+ end
60
+
61
+ it 'activates the target concept' do
62
+ network.prime(:dog)
63
+ expect(network.activation_for(:dog)).to be > 0
64
+ end
65
+
66
+ it 'spreads activation to neighbors' do
67
+ network.prime(:dog)
68
+ expect(network.activation_for(:cat)).to be > 0
69
+ end
70
+
71
+ it 'spreads with diminishing strength' do
72
+ network.prime(:dog)
73
+ expect(network.activation_for(:dog)).to be > network.activation_for(:cat)
74
+ expect(network.activation_for(:cat)).to be > network.activation_for(:mouse)
75
+ end
76
+
77
+ it 'respects max spread hops' do
78
+ network.link(:cheese, :crackers, strength: 0.5)
79
+ # Use a strong boost to ensure spread reaches far enough to test limits
80
+ network.prime(:dog, boost: 0.8)
81
+ # dog->cat->mouse->cheese = 3 hops (within limit), cheese->crackers = 4th hop (beyond limit)
82
+ cheese_activation = network.activation_for(:cheese)
83
+ crackers_activation = network.activation_for(:crackers)
84
+ # Crackers should have less activation than cheese (spread attenuates or stops at max hops)
85
+ expect(crackers_activation).to be <= cheese_activation
86
+ end
87
+
88
+ it 'can prime without spreading' do
89
+ network.prime(:dog, spread: false)
90
+ expect(network.activation_for(:dog)).to be > 0
91
+ expect(network.activation_for(:cat)).to eq(0.0)
92
+ end
93
+
94
+ it 'returns nil for unknown concept' do
95
+ expect(network.prime(:unknown)).to be_nil
96
+ end
97
+ end
98
+
99
+ describe '#activation_for' do
100
+ it 'returns 0 for unknown concepts' do
101
+ expect(network.activation_for(:unknown)).to eq(0.0)
102
+ end
103
+ end
104
+
105
+ describe '#primed_concepts' do
106
+ it 'returns only activated concepts' do
107
+ network.link(:dog, :cat)
108
+ network.prime(:dog, spread: false)
109
+ primed = network.primed_concepts
110
+ expect(primed.size).to eq(1)
111
+ expect(primed.first.name).to eq(:dog)
112
+ end
113
+ end
114
+
115
+ describe '#primed_in_domain' do
116
+ it 'filters by domain' do
117
+ network.add_concept(name: :dog, domain: :animals)
118
+ network.add_concept(name: :car, domain: :vehicles)
119
+ network.prime(:dog, spread: false)
120
+ network.prime(:car, spread: false)
121
+ animals = network.primed_in_domain(:animals)
122
+ expect(animals.size).to eq(1)
123
+ expect(animals.first.name).to eq(:dog)
124
+ end
125
+ end
126
+
127
+ describe '#decay_all' do
128
+ it 'reduces activation of all concepts' do
129
+ network.add_concept(name: :dog)
130
+ network.prime(:dog, spread: false)
131
+ initial = network.activation_for(:dog)
132
+ network.decay_all
133
+ expect(network.activation_for(:dog)).to be < initial
134
+ end
135
+
136
+ it 'eventually removes all priming' do
137
+ network.add_concept(name: :dog)
138
+ network.prime(:dog, spread: false)
139
+ 20.times { network.decay_all }
140
+ expect(network.primed_concepts).to be_empty
141
+ end
142
+ end
143
+
144
+ describe '#neighbors' do
145
+ it 'returns associated concepts' do
146
+ network.link(:dog, :cat)
147
+ network.link(:dog, :bone)
148
+ nbrs = network.neighbors(:dog)
149
+ expect(nbrs.map(&:name)).to contain_exactly(:cat, :bone)
150
+ end
151
+
152
+ it 'returns empty for unknown concepts' do
153
+ expect(network.neighbors(:unknown)).to eq([])
154
+ end
155
+ end
156
+
157
+ describe '#strongest_primes' do
158
+ it 'returns top N primed concepts' do
159
+ network.add_concept(name: :a)
160
+ network.add_concept(name: :b)
161
+ network.add_concept(name: :c)
162
+ network.prime(:a, boost: 0.9, spread: false)
163
+ network.prime(:b, boost: 0.5, spread: false)
164
+ network.prime(:c, boost: 0.7, spread: false)
165
+ top = network.strongest_primes(2)
166
+ expect(top.map(&:name)).to eq(%i[a c])
167
+ end
168
+ end
169
+
170
+ describe '#to_h' do
171
+ it 'returns network stats' do
172
+ h = network.to_h
173
+ expect(h).to include(:concept_count, :active_primes, :primed_concepts, :domains)
174
+ end
175
+ end
176
+ end
@@ -0,0 +1,165 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Attention::Priming::Helpers::ConceptNode do
6
+ subject(:node) { described_class.new(name: :dog, domain: :animals) }
7
+
8
+ let(:constants) { Legion::Extensions::Agentic::Attention::Priming::Helpers::Constants }
9
+
10
+ describe '#initialize' do
11
+ it 'stores name and domain' do
12
+ expect(node.name).to eq(:dog)
13
+ expect(node.domain).to eq(:animals)
14
+ end
15
+
16
+ it 'starts with zero activation' do
17
+ expect(node.activation).to eq(0.0)
18
+ end
19
+
20
+ it 'starts with no prime source' do
21
+ expect(node.prime_source).to be_nil
22
+ end
23
+
24
+ it 'starts with empty associations' do
25
+ expect(node.associations).to eq({})
26
+ end
27
+
28
+ it 'defaults domain to general' do
29
+ general = described_class.new(name: :thing)
30
+ expect(general.domain).to eq(:general)
31
+ end
32
+ end
33
+
34
+ describe '#primed?' do
35
+ it 'is false when activation is zero' do
36
+ expect(node.primed?).to be false
37
+ end
38
+
39
+ it 'is true when activation exceeds threshold' do
40
+ node.prime
41
+ expect(node.primed?).to be true
42
+ end
43
+ end
44
+
45
+ describe '#associate' do
46
+ it 'adds an association' do
47
+ node.associate(:cat)
48
+ expect(node.associations).to have_key(:cat)
49
+ end
50
+
51
+ it 'uses default strength' do
52
+ node.associate(:cat)
53
+ expect(node.association_strength(:cat)).to eq(constants::DEFAULT_ASSOCIATION_STRENGTH)
54
+ end
55
+
56
+ it 'accepts custom strength' do
57
+ node.associate(:cat, strength: 0.8)
58
+ expect(node.association_strength(:cat)).to eq(0.8)
59
+ end
60
+
61
+ it 'clamps strength within bounds' do
62
+ node.associate(:cat, strength: 5.0)
63
+ expect(node.association_strength(:cat)).to eq(constants::ASSOCIATION_CEILING)
64
+ end
65
+
66
+ it 'trims excess associations' do
67
+ (constants::MAX_ASSOCIATIONS + 5).times { |i| node.associate(:"concept_#{i}") }
68
+ expect(node.associations.size).to be <= constants::MAX_ASSOCIATIONS
69
+ end
70
+ end
71
+
72
+ describe '#strengthen_association' do
73
+ it 'increases association strength' do
74
+ node.associate(:cat)
75
+ initial = node.association_strength(:cat)
76
+ node.strengthen_association(:cat)
77
+ expect(node.association_strength(:cat)).to be > initial
78
+ end
79
+
80
+ it 'caps at ceiling' do
81
+ node.associate(:cat, strength: constants::ASSOCIATION_CEILING)
82
+ node.strengthen_association(:cat)
83
+ expect(node.association_strength(:cat)).to eq(constants::ASSOCIATION_CEILING)
84
+ end
85
+
86
+ it 'does nothing for unknown associations' do
87
+ node.strengthen_association(:unknown)
88
+ expect(node.associations).to be_empty
89
+ end
90
+ end
91
+
92
+ describe '#decay_associations' do
93
+ it 'reduces association strengths' do
94
+ node.associate(:cat)
95
+ initial = node.association_strength(:cat)
96
+ node.decay_associations
97
+ expect(node.association_strength(:cat)).to be < initial
98
+ end
99
+
100
+ it 'floors at minimum' do
101
+ node.associate(:cat, strength: constants::ASSOCIATION_FLOOR)
102
+ node.decay_associations
103
+ expect(node.association_strength(:cat)).to eq(constants::ASSOCIATION_FLOOR)
104
+ end
105
+ end
106
+
107
+ describe '#decay_activation' do
108
+ it 'reduces activation' do
109
+ node.prime
110
+ initial = node.activation
111
+ node.decay_activation
112
+ expect(node.activation).to be < initial
113
+ end
114
+
115
+ it 'floors at zero' do
116
+ node.activation = 0.01
117
+ node.decay_activation
118
+ expect(node.activation).to eq(0.0)
119
+ end
120
+
121
+ it 'clears prime source when not primed' do
122
+ node.prime(source: :test)
123
+ 10.times { node.decay_activation }
124
+ expect(node.prime_source).to be_nil
125
+ end
126
+ end
127
+
128
+ describe '#prime' do
129
+ it 'increases activation' do
130
+ node.prime
131
+ expect(node.activation).to eq(constants::PRIME_BOOST)
132
+ end
133
+
134
+ it 'accepts custom boost' do
135
+ node.prime(boost: 0.5)
136
+ expect(node.activation).to eq(0.5)
137
+ end
138
+
139
+ it 'records source' do
140
+ node.prime(source: :visual)
141
+ expect(node.prime_source).to eq(:visual)
142
+ end
143
+
144
+ it 'caps activation at 1.0' do
145
+ node.prime(boost: 0.8)
146
+ node.prime(boost: 0.8)
147
+ expect(node.activation).to eq(1.0)
148
+ end
149
+ end
150
+
151
+ describe '#associated_names' do
152
+ it 'returns list of associated concept names' do
153
+ node.associate(:cat)
154
+ node.associate(:bone)
155
+ expect(node.associated_names).to contain_exactly(:cat, :bone)
156
+ end
157
+ end
158
+
159
+ describe '#to_h' do
160
+ it 'returns all fields' do
161
+ h = node.to_h
162
+ expect(h).to include(:name, :domain, :activation, :primed, :prime_source, :associations)
163
+ end
164
+ end
165
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Attention::Priming::Helpers::Constants do
6
+ describe 'PRIME_BOOST' do
7
+ it 'is a positive float' do
8
+ expect(described_class::PRIME_BOOST).to be > 0.0
9
+ expect(described_class::PRIME_BOOST).to be <= 1.0
10
+ end
11
+ end
12
+
13
+ describe 'PRIME_DECAY' do
14
+ it 'is a positive float less than boost' do
15
+ expect(described_class::PRIME_DECAY).to be > 0.0
16
+ expect(described_class::PRIME_DECAY).to be < described_class::PRIME_BOOST
17
+ end
18
+ end
19
+
20
+ describe 'SPREAD_FACTOR' do
21
+ it 'is between 0 and 1' do
22
+ expect(described_class::SPREAD_FACTOR).to be_between(0.0, 1.0).exclusive
23
+ end
24
+ end
25
+
26
+ describe 'MAX_SPREAD_HOPS' do
27
+ it 'is a positive integer' do
28
+ expect(described_class::MAX_SPREAD_HOPS).to be_a(Integer)
29
+ expect(described_class::MAX_SPREAD_HOPS).to be > 0
30
+ end
31
+ end
32
+
33
+ describe 'PRIME_THRESHOLD' do
34
+ it 'is a small positive float' do
35
+ expect(described_class::PRIME_THRESHOLD).to be > 0.0
36
+ expect(described_class::PRIME_THRESHOLD).to be < described_class::PRIME_BOOST
37
+ end
38
+ end
39
+
40
+ describe 'association constants' do
41
+ it 'has floor less than ceiling' do
42
+ expect(described_class::ASSOCIATION_FLOOR).to be < described_class::ASSOCIATION_CEILING
43
+ end
44
+
45
+ it 'has default between floor and ceiling' do
46
+ expect(described_class::DEFAULT_ASSOCIATION_STRENGTH).to be_between(
47
+ described_class::ASSOCIATION_FLOOR, described_class::ASSOCIATION_CEILING
48
+ )
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,141 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Attention::Priming::Runners::Priming do
6
+ let(:runner) do
7
+ obj = Object.new
8
+ obj.extend(described_class)
9
+ obj
10
+ end
11
+
12
+ before do
13
+ runner.add_concept(name: :dog, domain: :animals)
14
+ runner.add_concept(name: :cat, domain: :animals)
15
+ runner.add_concept(name: :car, domain: :vehicles)
16
+ runner.link_concepts(name_a: :dog, name_b: :cat, strength: 0.8)
17
+ end
18
+
19
+ describe '#prime_concept' do
20
+ it 'primes a concept and returns its state' do
21
+ result = runner.prime_concept(name: :dog)
22
+ expect(result[:success]).to be true
23
+ expect(result[:concept][:activation]).to be > 0
24
+ expect(result[:concept][:primed]).to be true
25
+ end
26
+
27
+ it 'spreads activation to linked concepts' do
28
+ runner.prime_concept(name: :dog)
29
+ cat_check = runner.check_primed(name: :cat)
30
+ expect(cat_check[:primed]).to be true
31
+ end
32
+
33
+ it 'does not spread to unlinked concepts' do
34
+ runner.prime_concept(name: :dog)
35
+ car_check = runner.check_primed(name: :car)
36
+ expect(car_check[:primed]).to be false
37
+ end
38
+
39
+ it 'accepts custom boost' do
40
+ result = runner.prime_concept(name: :dog, boost: 0.1, spread: false)
41
+ expect(result[:concept][:activation]).to eq(0.1)
42
+ end
43
+
44
+ it 'auto-creates concepts if needed' do
45
+ result = runner.prime_concept(name: :fish)
46
+ expect(result[:success]).to be true
47
+ end
48
+ end
49
+
50
+ describe '#add_concept' do
51
+ it 'adds a new concept' do
52
+ result = runner.add_concept(name: :bird, domain: :animals)
53
+ expect(result[:success]).to be true
54
+ expect(result[:concept][:name]).to eq(:bird)
55
+ end
56
+ end
57
+
58
+ describe '#link_concepts' do
59
+ it 'links two concepts' do
60
+ result = runner.link_concepts(name_a: :dog, name_b: :car)
61
+ expect(result[:success]).to be true
62
+ expect(result[:strength]).to be > 0
63
+ end
64
+ end
65
+
66
+ describe '#update_priming' do
67
+ it 'decays all activations' do
68
+ runner.prime_concept(name: :dog)
69
+ initial = runner.check_primed(name: :dog)[:activation]
70
+ runner.update_priming
71
+ after = runner.check_primed(name: :dog)[:activation]
72
+ expect(after).to be < initial
73
+ end
74
+
75
+ it 'returns active prime count' do
76
+ runner.prime_concept(name: :dog)
77
+ result = runner.update_priming
78
+ expect(result[:success]).to be true
79
+ expect(result).to include(:active_primes, :concept_count)
80
+ end
81
+ end
82
+
83
+ describe '#check_primed' do
84
+ it 'returns priming status' do
85
+ result = runner.check_primed(name: :dog)
86
+ expect(result[:success]).to be true
87
+ expect(result[:primed]).to be false
88
+ expect(result[:activation]).to eq(0.0)
89
+ end
90
+
91
+ it 'shows primed after priming' do
92
+ runner.prime_concept(name: :dog)
93
+ result = runner.check_primed(name: :dog)
94
+ expect(result[:primed]).to be true
95
+ end
96
+ end
97
+
98
+ describe '#primed_concepts' do
99
+ it 'returns all primed concepts' do
100
+ runner.prime_concept(name: :dog)
101
+ result = runner.primed_concepts
102
+ expect(result[:success]).to be true
103
+ expect(result[:count]).to be >= 1
104
+ end
105
+
106
+ it 'filters by domain' do
107
+ runner.prime_concept(name: :dog)
108
+ runner.prime_concept(name: :car, spread: false)
109
+ animals = runner.primed_concepts(domain: :animals)
110
+ vehicles = runner.primed_concepts(domain: :vehicles)
111
+ expect(animals[:count]).to be >= 1
112
+ expect(vehicles[:count]).to eq(1)
113
+ end
114
+ end
115
+
116
+ describe '#strongest_primes' do
117
+ it 'returns top primed concepts' do
118
+ runner.prime_concept(name: :dog, boost: 0.9, spread: false)
119
+ runner.prime_concept(name: :cat, boost: 0.3, spread: false)
120
+ result = runner.strongest_primes(count: 1)
121
+ expect(result[:primes].first[:name]).to eq(:dog)
122
+ end
123
+ end
124
+
125
+ describe '#neighbors_for' do
126
+ it 'returns linked concepts' do
127
+ result = runner.neighbors_for(name: :dog)
128
+ expect(result[:success]).to be true
129
+ expect(result[:count]).to eq(1)
130
+ expect(result[:neighbors].first[:name]).to eq(:cat)
131
+ end
132
+ end
133
+
134
+ describe '#priming_stats' do
135
+ it 'returns network summary' do
136
+ result = runner.priming_stats
137
+ expect(result[:success]).to be true
138
+ expect(result[:stats]).to include(:concept_count, :active_primes)
139
+ end
140
+ end
141
+ end
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Prism::Client do
4
+ subject(:client) { described_class.new }
5
+
6
+ describe '#initialize' do
7
+ it 'creates a client with a default engine' do
8
+ expect(client.engine).to be_a(Legion::Extensions::Agentic::Attention::Prism::Helpers::PrismEngine)
9
+ end
10
+
11
+ it 'accepts an injected engine' do
12
+ custom = Legion::Extensions::Agentic::Attention::Prism::Helpers::PrismEngine.new
13
+ c = described_class.new(engine: custom)
14
+ expect(c.engine).to be(custom)
15
+ end
16
+
17
+ it 'accepts extra kwargs via ** splat' do
18
+ expect { described_class.new(extra: :param) }.not_to raise_error
19
+ end
20
+ end
21
+
22
+ describe 'runner delegation' do
23
+ let(:engine) { Legion::Extensions::Agentic::Attention::Prism::Helpers::PrismEngine.new }
24
+ subject(:client) { described_class.new(engine: engine) }
25
+
26
+ it 'delegates create_beam to the runner' do
27
+ result = client.create_beam(domain: :test, content: 'client test idea')
28
+ expect(result[:success]).to be true
29
+ end
30
+
31
+ it 'delegates decompose to the runner' do
32
+ id = client.create_beam(domain: :test, content: 'decompose me')[:beam_id]
33
+ result = client.decompose(beam_id: id)
34
+ expect(result[:success]).to be true
35
+ expect(result[:component_count]).to eq(8)
36
+ end
37
+
38
+ it 'delegates recompose to the runner' do
39
+ result = client.recompose(component_ids: [])
40
+ expect(result[:success]).to be true
41
+ end
42
+
43
+ it 'delegates attenuate_all to the runner' do
44
+ id = client.create_beam(domain: :d, content: 'attenuate me')[:beam_id]
45
+ client.decompose(beam_id: id)
46
+ result = client.attenuate_all
47
+ expect(result[:success]).to be true
48
+ end
49
+
50
+ it 'delegates dominant_bands to the runner' do
51
+ result = client.dominant_bands
52
+ expect(result[:success]).to be true
53
+ end
54
+
55
+ it 'delegates most_intense to the runner' do
56
+ result = client.most_intense
57
+ expect(result[:success]).to be true
58
+ expect(result[:components]).to be_an(Array)
59
+ end
60
+
61
+ it 'delegates spectral_report to the runner' do
62
+ result = client.spectral_report
63
+ expect(result[:success]).to be true
64
+ end
65
+ end
66
+
67
+ describe 'full decompose-recompose cycle' do
68
+ let(:engine) { Legion::Extensions::Agentic::Attention::Prism::Helpers::PrismEngine.new }
69
+ subject(:client) { described_class.new(engine: engine) }
70
+
71
+ it 'completes a full white-light-in rainbow-out-recombine cycle' do
72
+ idea = 'The mind arises from complexity through emergent self-organization of neural substrates'
73
+ cr = client.create_beam(domain: :philosophy, content: idea)
74
+ expect(cr[:success]).to be true
75
+
76
+ dr = client.decompose(beam_id: cr[:beam_id])
77
+ expect(dr[:success]).to be true
78
+ expect(dr[:component_count]).to eq(8)
79
+
80
+ beam = engine.get_beam(cr[:beam_id])
81
+ ids = beam.components.reject(&:faded?).map { |c| "#{cr[:beam_id]}:#{c.band}" }
82
+ rr = client.recompose(component_ids: ids)
83
+ expect(rr[:success]).to be true
84
+ end
85
+ end
86
+ end