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,196 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Spotlight::Helpers::Spotlight do
4
+ subject(:spotlight) { described_class.new }
5
+
6
+ describe '#initialize' do
7
+ it 'starts with nil center_target_id' do
8
+ expect(spotlight.center_target_id).to be_nil
9
+ end
10
+
11
+ it 'starts with default intensity' do
12
+ expect(spotlight.intensity).to eq(0.5)
13
+ end
14
+
15
+ it 'starts with default breadth' do
16
+ expect(spotlight.breadth).to eq(0.5)
17
+ end
18
+
19
+ it 'starts in idle mode' do
20
+ expect(spotlight.mode).to eq(:idle)
21
+ end
22
+ end
23
+
24
+ describe '#focus_on!' do
25
+ it 'sets center_target_id' do
26
+ spotlight.focus_on!('abc-123')
27
+ expect(spotlight.center_target_id).to eq('abc-123')
28
+ end
29
+
30
+ it 'sets mode to :focused' do
31
+ spotlight.focus_on!('abc-123')
32
+ expect(spotlight.mode).to eq(:focused)
33
+ end
34
+
35
+ it 'increases intensity by INTENSITY_GAIN' do
36
+ initial = spotlight.intensity
37
+ spotlight.focus_on!('abc-123')
38
+ expect(spotlight.intensity).to be > initial
39
+ end
40
+
41
+ it 'does not exceed 1.0 intensity when already high' do
42
+ spotlight.instance_variable_set(:@intensity, 0.95)
43
+ spotlight.focus_on!('abc-123')
44
+ expect(spotlight.intensity).to eq(1.0)
45
+ end
46
+ end
47
+
48
+ describe '#broaden!' do
49
+ it 'increases breadth by ZOOM_STEP' do
50
+ initial = spotlight.breadth
51
+ spotlight.broaden!
52
+ expect(spotlight.breadth).to be_within(0.001).of(initial + 0.1)
53
+ end
54
+
55
+ it 'decreases intensity by INTENSITY_LOSS' do
56
+ initial = spotlight.intensity
57
+ spotlight.broaden!
58
+ expect(spotlight.intensity).to be_within(0.001).of(initial - 0.1)
59
+ end
60
+
61
+ it 'does not exceed 1.0 breadth' do
62
+ spotlight.instance_variable_set(:@breadth, 0.95)
63
+ spotlight.broaden!
64
+ expect(spotlight.breadth).to eq(1.0)
65
+ end
66
+
67
+ it 'does not go below 0.0 intensity' do
68
+ spotlight.instance_variable_set(:@intensity, 0.05)
69
+ spotlight.broaden!
70
+ expect(spotlight.intensity).to eq(0.0)
71
+ end
72
+
73
+ it 'transitions focused mode to scanning' do
74
+ spotlight.focus_on!('abc-123')
75
+ spotlight.broaden!
76
+ expect(spotlight.mode).to eq(:scanning)
77
+ end
78
+ end
79
+
80
+ describe '#narrow!' do
81
+ it 'decreases breadth by ZOOM_STEP' do
82
+ spotlight.instance_variable_set(:@breadth, 0.5)
83
+ spotlight.narrow!
84
+ expect(spotlight.breadth).to be_within(0.001).of(0.4)
85
+ end
86
+
87
+ it 'increases intensity by INTENSITY_GAIN' do
88
+ initial = spotlight.intensity
89
+ spotlight.narrow!
90
+ expect(spotlight.intensity).to be > initial
91
+ end
92
+
93
+ it 'does not go below 0.0 breadth' do
94
+ spotlight.instance_variable_set(:@breadth, 0.05)
95
+ spotlight.narrow!
96
+ expect(spotlight.breadth).to eq(0.0)
97
+ end
98
+ end
99
+
100
+ describe '#capture!' do
101
+ it 'sets center_target_id to the captured target' do
102
+ spotlight.capture!('urgent-task')
103
+ expect(spotlight.center_target_id).to eq('urgent-task')
104
+ end
105
+
106
+ it 'sets mode to :captured' do
107
+ spotlight.capture!('urgent-task')
108
+ expect(spotlight.mode).to eq(:captured)
109
+ end
110
+
111
+ it 'sets intensity to 1.0' do
112
+ spotlight.capture!('urgent-task')
113
+ expect(spotlight.intensity).to eq(1.0)
114
+ end
115
+ end
116
+
117
+ describe '#release!' do
118
+ it 'clears center_target_id' do
119
+ spotlight.focus_on!('some-target')
120
+ spotlight.release!
121
+ expect(spotlight.center_target_id).to be_nil
122
+ end
123
+
124
+ it 'resets mode to :idle' do
125
+ spotlight.focus_on!('some-target')
126
+ spotlight.release!
127
+ expect(spotlight.mode).to eq(:idle)
128
+ end
129
+
130
+ it 'resets intensity to default' do
131
+ spotlight.focus_on!('some-target')
132
+ spotlight.release!
133
+ expect(spotlight.intensity).to eq(0.5)
134
+ end
135
+
136
+ it 'resets breadth to default' do
137
+ spotlight.broaden!
138
+ spotlight.release!
139
+ expect(spotlight.breadth).to eq(0.5)
140
+ end
141
+ end
142
+
143
+ describe '#zoom_level' do
144
+ it 'returns :laser for breadth 0.0' do
145
+ spotlight.instance_variable_set(:@breadth, 0.0)
146
+ expect(spotlight.zoom_level).to eq(:laser)
147
+ end
148
+
149
+ it 'returns :moderate for default breadth 0.5' do
150
+ expect(spotlight.zoom_level).to eq(:moderate)
151
+ end
152
+
153
+ it 'returns :diffuse for breadth 1.0' do
154
+ spotlight.instance_variable_set(:@breadth, 1.0)
155
+ expect(spotlight.zoom_level).to eq(:diffuse)
156
+ end
157
+
158
+ it 'returns :narrow for breadth 0.3' do
159
+ spotlight.instance_variable_set(:@breadth, 0.3)
160
+ expect(spotlight.zoom_level).to eq(:narrow)
161
+ end
162
+
163
+ it 'returns :wide for breadth 0.7' do
164
+ spotlight.instance_variable_set(:@breadth, 0.7)
165
+ expect(spotlight.zoom_level).to eq(:wide)
166
+ end
167
+ end
168
+
169
+ describe '#intensity_label' do
170
+ it 'returns :blazing for intensity 0.9' do
171
+ spotlight.instance_variable_set(:@intensity, 0.9)
172
+ expect(spotlight.intensity_label).to eq(:blazing)
173
+ end
174
+
175
+ it 'returns :dark for intensity 0.1' do
176
+ spotlight.instance_variable_set(:@intensity, 0.1)
177
+ expect(spotlight.intensity_label).to eq(:dark)
178
+ end
179
+
180
+ it 'returns :moderate for intensity 0.5' do
181
+ expect(spotlight.intensity_label).to eq(:moderate)
182
+ end
183
+ end
184
+
185
+ describe '#to_h' do
186
+ it 'returns all expected keys' do
187
+ h = spotlight.to_h
188
+ expect(h.keys).to include(:center_target_id, :intensity, :breadth, :mode, :zoom_level, :intensity_label)
189
+ end
190
+
191
+ it 'includes current mode' do
192
+ spotlight.focus_on!('x')
193
+ expect(spotlight.to_h[:mode]).to eq(:focused)
194
+ end
195
+ end
196
+ end
@@ -0,0 +1,251 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/agentic/attention/spotlight/client'
4
+
5
+ RSpec.describe Legion::Extensions::Agentic::Attention::Spotlight::Runners::AttentionSpotlight do
6
+ let(:client) { Legion::Extensions::Agentic::Attention::Spotlight::Client.new }
7
+
8
+ def reg(label: 'task', domain: :work, salience: 0.5, relevance: 0.5)
9
+ client.register_target(label: label, domain: domain, salience: salience, relevance: relevance)
10
+ end
11
+
12
+ describe '#register_target' do
13
+ it 'returns success true on valid registration' do
14
+ result = reg
15
+ expect(result[:success]).to be true
16
+ end
17
+
18
+ it 'returns a target_id uuid' do
19
+ result = reg
20
+ expect(result[:target_id]).to match(/\A[0-9a-f-]{36}\z/)
21
+ end
22
+
23
+ it 'includes label in result' do
24
+ result = reg(label: 'my task')
25
+ expect(result[:label]).to eq('my task')
26
+ end
27
+
28
+ it 'includes domain in result' do
29
+ result = reg(domain: :health)
30
+ expect(result[:domain]).to eq(:health)
31
+ end
32
+ end
33
+
34
+ describe '#focus_spotlight' do
35
+ it 'returns success true when focusing on a known target' do
36
+ id = reg[:target_id]
37
+ result = client.focus_spotlight(target_id: id)
38
+ expect(result[:success]).to be true
39
+ end
40
+
41
+ it 'returns focused true' do
42
+ id = reg[:target_id]
43
+ result = client.focus_spotlight(target_id: id)
44
+ expect(result[:focused]).to be true
45
+ end
46
+
47
+ it 'returns success false for unknown target' do
48
+ result = client.focus_spotlight(target_id: 'unknown-id')
49
+ expect(result[:success]).to be false
50
+ end
51
+
52
+ it 'returns not_found reason for unknown target' do
53
+ result = client.focus_spotlight(target_id: 'unknown-id')
54
+ expect(result[:reason]).to eq(:not_found)
55
+ end
56
+
57
+ it 'sets spotlight mode to focused' do
58
+ id = reg[:target_id]
59
+ client.focus_spotlight(target_id: id)
60
+ result = client.spotlight_state
61
+ expect(result[:spotlight][:mode]).to eq(:focused)
62
+ end
63
+ end
64
+
65
+ describe '#broaden_spotlight' do
66
+ it 'returns success true' do
67
+ result = client.broaden_spotlight
68
+ expect(result[:success]).to be true
69
+ end
70
+
71
+ it 'returns broadened true' do
72
+ result = client.broaden_spotlight
73
+ expect(result[:broadened]).to be true
74
+ end
75
+
76
+ it 'increases breadth' do
77
+ initial = client.spotlight_state[:spotlight][:breadth]
78
+ client.broaden_spotlight
79
+ after = client.spotlight_state[:spotlight][:breadth]
80
+ expect(after).to be > initial
81
+ end
82
+ end
83
+
84
+ describe '#narrow_spotlight' do
85
+ it 'returns success true' do
86
+ result = client.narrow_spotlight
87
+ expect(result[:success]).to be true
88
+ end
89
+
90
+ it 'returns narrowed true' do
91
+ result = client.narrow_spotlight
92
+ expect(result[:narrowed]).to be true
93
+ end
94
+
95
+ it 'decreases breadth when already broadened' do
96
+ client.broaden_spotlight
97
+ before = client.spotlight_state[:spotlight][:breadth]
98
+ client.narrow_spotlight
99
+ after = client.spotlight_state[:spotlight][:breadth]
100
+ expect(after).to be < before
101
+ end
102
+ end
103
+
104
+ describe '#scan_targets' do
105
+ it 'returns success true' do
106
+ expect(client.scan_targets[:success]).to be true
107
+ end
108
+
109
+ it 'returns scanning true' do
110
+ expect(client.scan_targets[:scanning]).to be true
111
+ end
112
+
113
+ it 'returns correct targets_swept count' do
114
+ 3.times { |i| reg(label: "t#{i}") }
115
+ result = client.scan_targets
116
+ expect(result[:targets_swept]).to eq(3)
117
+ end
118
+ end
119
+
120
+ describe '#check_peripheral' do
121
+ it 'returns success true' do
122
+ expect(client.check_peripheral[:success]).to be true
123
+ end
124
+
125
+ it 'returns detected count' do
126
+ reg(label: 'salient', salience: 0.7)
127
+ result = client.check_peripheral
128
+ expect(result[:detected]).to be >= 1
129
+ end
130
+
131
+ it 'detects no targets when salience is below threshold' do
132
+ reg(label: 'low', salience: 0.1)
133
+ result = client.check_peripheral
134
+ expect(result[:detected]).to eq(0)
135
+ end
136
+
137
+ it 'includes peripheral_ids array' do
138
+ result = client.check_peripheral
139
+ expect(result[:peripheral_ids]).to be_an(Array)
140
+ end
141
+ end
142
+
143
+ describe '#check_capture' do
144
+ it 'returns success true' do
145
+ expect(client.check_capture[:success]).to be true
146
+ end
147
+
148
+ it 'returns captured false when no compelling target' do
149
+ reg(label: 'low', salience: 0.3)
150
+ expect(client.check_capture[:captured]).to be false
151
+ end
152
+
153
+ it 'captures a compelling target' do
154
+ reg(label: 'urgent', salience: 0.9)
155
+ result = client.check_capture
156
+ expect(result[:captured]).to be true
157
+ end
158
+
159
+ it 'returns target_id of captured target' do
160
+ id = reg(label: 'urgent', salience: 0.9)[:target_id]
161
+ result = client.check_capture
162
+ expect(result[:target_id]).to eq(id)
163
+ end
164
+ end
165
+
166
+ describe '#release_focus' do
167
+ it 'returns success true' do
168
+ expect(client.release_focus[:success]).to be true
169
+ end
170
+
171
+ it 'returns released true' do
172
+ expect(client.release_focus[:released]).to be true
173
+ end
174
+
175
+ it 'sets mode back to idle' do
176
+ id = reg[:target_id]
177
+ client.focus_spotlight(target_id: id)
178
+ client.release_focus
179
+ expect(client.spotlight_state[:spotlight][:mode]).to eq(:idle)
180
+ end
181
+ end
182
+
183
+ describe '#spotlight_report' do
184
+ it 'returns success true' do
185
+ expect(client.spotlight_report[:success]).to be true
186
+ end
187
+
188
+ it 'includes total_targets count' do
189
+ 3.times { |i| reg(label: "t#{i}") }
190
+ expect(client.spotlight_report[:total_targets]).to eq(3)
191
+ end
192
+
193
+ it 'includes spotlight hash' do
194
+ expect(client.spotlight_report[:spotlight]).to be_a(Hash)
195
+ end
196
+
197
+ it 'includes in_spotlight array' do
198
+ expect(client.spotlight_report[:in_spotlight]).to be_an(Array)
199
+ end
200
+
201
+ it 'includes most_salient array' do
202
+ expect(client.spotlight_report[:most_salient]).to be_an(Array)
203
+ end
204
+ end
205
+
206
+ describe '#most_salient' do
207
+ it 'returns success true' do
208
+ expect(client.most_salient[:success]).to be true
209
+ end
210
+
211
+ it 'returns ordered targets by salience' do
212
+ reg(label: 'low', salience: 0.2)
213
+ reg(label: 'high', salience: 0.9)
214
+ result = client.most_salient(limit: 2)
215
+ saliences = result[:targets].map { |t| t[:salience] }
216
+ expect(saliences.first).to be > saliences.last
217
+ end
218
+
219
+ it 'respects limit parameter' do
220
+ 5.times { |i| reg(label: "t#{i}") }
221
+ expect(client.most_salient(limit: 3)[:count]).to eq(3)
222
+ end
223
+
224
+ it 'defaults to limit 5' do
225
+ 7.times { |i| reg(label: "t#{i}") }
226
+ expect(client.most_salient[:count]).to eq(5)
227
+ end
228
+ end
229
+
230
+ describe '#spotlight_state' do
231
+ it 'returns success true' do
232
+ expect(client.spotlight_state[:success]).to be true
233
+ end
234
+
235
+ it 'includes spotlight hash' do
236
+ expect(client.spotlight_state[:spotlight]).to be_a(Hash)
237
+ end
238
+
239
+ it 'includes target_count' do
240
+ 3.times { |i| reg(label: "t#{i}") }
241
+ expect(client.spotlight_state[:target_count]).to eq(3)
242
+ end
243
+
244
+ it 'reflects changes after focus' do
245
+ id = reg[:target_id]
246
+ client.focus_spotlight(target_id: id)
247
+ state = client.spotlight_state
248
+ expect(state[:spotlight][:center_target_id]).to eq(id)
249
+ end
250
+ end
251
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Subliminal::Client do
4
+ subject(:client) { described_class.new }
5
+
6
+ it 'responds to runner methods' do
7
+ expect(client).to respond_to(:create_subliminal_trace, :process_influences, :subliminal_status)
8
+ end
9
+
10
+ it 'runs a full subliminal lifecycle' do
11
+ result = client.create_subliminal_trace(content: 'danger signal', domain: :security)
12
+ trace_id = result[:trace][:id]
13
+
14
+ client.boost_trace(trace_id: trace_id)
15
+ client.process_influences
16
+ client.decay_all
17
+
18
+ status = client.subliminal_status
19
+ expect(status[:total_traces]).to be >= 1
20
+ end
21
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Subliminal::Helpers::InfluenceEvent do
4
+ subject(:event) do
5
+ described_class.new(trace_id: 'abc-123', target: :attention, magnitude: 0.08, domain: :security)
6
+ end
7
+
8
+ describe '#initialize' do
9
+ it 'assigns a UUID id' do
10
+ expect(event.id).to match(/\A[0-9a-f-]{36}\z/)
11
+ end
12
+
13
+ it 'stores trace_id' do
14
+ expect(event.trace_id).to eq('abc-123')
15
+ end
16
+
17
+ it 'stores target' do
18
+ expect(event.target).to eq(:attention)
19
+ end
20
+
21
+ it 'stores magnitude' do
22
+ expect(event.magnitude).to eq(0.08)
23
+ end
24
+
25
+ it 'stores domain' do
26
+ expect(event.domain).to eq(:security)
27
+ end
28
+ end
29
+
30
+ describe '#significant?' do
31
+ it 'is true for magnitude >= 0.05' do
32
+ expect(event.significant?).to be true
33
+ end
34
+
35
+ it 'is false for small magnitude' do
36
+ small = described_class.new(trace_id: 'x', target: :emotion, magnitude: 0.03)
37
+ expect(small.significant?).to be false
38
+ end
39
+ end
40
+
41
+ describe '#subtle?' do
42
+ it 'is true for small positive magnitude' do
43
+ small = described_class.new(trace_id: 'x', target: :emotion, magnitude: 0.03)
44
+ expect(small.subtle?).to be true
45
+ end
46
+
47
+ it 'is false for significant magnitude' do
48
+ expect(event.subtle?).to be false
49
+ end
50
+ end
51
+
52
+ describe '#to_h' do
53
+ it 'includes all fields' do
54
+ hash = event.to_h
55
+ expect(hash).to include(:id, :trace_id, :target, :magnitude, :domain, :created_at)
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,161 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Subliminal::Helpers::SubliminalEngine do
4
+ subject(:engine) { described_class.new }
5
+
6
+ describe '#create_trace' do
7
+ it 'creates and stores a trace' do
8
+ trace = engine.create_trace(content: 'faint memory')
9
+ expect(trace.content).to eq('faint memory')
10
+ end
11
+ end
12
+
13
+ describe '#boost_trace' do
14
+ it 'boosts activation' do
15
+ trace = engine.create_trace(content: 'test')
16
+ original = trace.activation
17
+ engine.boost_trace(trace_id: trace.id)
18
+ expect(trace.activation).to be > original
19
+ end
20
+
21
+ it 'returns nil for unknown trace' do
22
+ expect(engine.boost_trace(trace_id: 'bad')).to be_nil
23
+ end
24
+ end
25
+
26
+ describe '#process_influences!' do
27
+ it 'generates influence events from active traces' do
28
+ engine.create_trace(content: 'a', activation: 0.3)
29
+ result = engine.process_influences!
30
+ expect(result[:influences_generated]).to be >= 1
31
+ end
32
+
33
+ it 'returns empty when no active traces' do
34
+ result = engine.process_influences!
35
+ expect(result[:influences_generated]).to eq(0)
36
+ end
37
+ end
38
+
39
+ describe '#decay_all!' do
40
+ it 'decays all traces' do
41
+ trace = engine.create_trace(content: 'test')
42
+ original = trace.activation
43
+ engine.decay_all!
44
+ expect(trace.activation).to be < original
45
+ end
46
+ end
47
+
48
+ describe '#active_traces' do
49
+ it 'returns non-extinct traces' do
50
+ engine.create_trace(content: 'active', activation: 0.2)
51
+ expect(engine.active_traces.size).to eq(1)
52
+ end
53
+ end
54
+
55
+ describe '#near_threshold_traces' do
56
+ it 'returns traces near conscious threshold' do
57
+ engine.create_trace(content: 'near', activation: 0.35)
58
+ engine.create_trace(content: 'far', activation: 0.1)
59
+ expect(engine.near_threshold_traces.size).to eq(1)
60
+ end
61
+ end
62
+
63
+ describe '#potent_traces' do
64
+ it 'returns traces with activation >= 0.2' do
65
+ engine.create_trace(content: 'potent', activation: 0.25)
66
+ engine.create_trace(content: 'weak', activation: 0.05)
67
+ expect(engine.potent_traces.size).to eq(1)
68
+ end
69
+ end
70
+
71
+ describe '#traces_by_domain' do
72
+ it 'filters by domain' do
73
+ engine.create_trace(content: 'a', domain: :security)
74
+ engine.create_trace(content: 'b', domain: :memory)
75
+ expect(engine.traces_by_domain(domain: :security).size).to eq(1)
76
+ end
77
+ end
78
+
79
+ describe '#traces_by_type' do
80
+ it 'filters by trace type' do
81
+ engine.create_trace(content: 'a', trace_type: :emotional)
82
+ engine.create_trace(content: 'b', trace_type: :procedural)
83
+ expect(engine.traces_by_type(trace_type: :emotional).size).to eq(1)
84
+ end
85
+ end
86
+
87
+ describe '#traces_by_target' do
88
+ it 'filters by influence target' do
89
+ engine.create_trace(content: 'a', influence_target: :emotion)
90
+ engine.create_trace(content: 'b', influence_target: :decision)
91
+ expect(engine.traces_by_target(target: :emotion).size).to eq(1)
92
+ end
93
+ end
94
+
95
+ describe '#influence_on' do
96
+ it 'returns 0.0 with no influences' do
97
+ expect(engine.influence_on(target: :attention)).to eq(0.0)
98
+ end
99
+
100
+ it 'returns accumulated influence after processing' do
101
+ engine.create_trace(content: 'a', activation: 0.3, influence_target: :attention)
102
+ engine.process_influences!
103
+ expect(engine.influence_on(target: :attention)).to be > 0.0
104
+ end
105
+ end
106
+
107
+ describe '#domain_saturation' do
108
+ it 'returns 0.0 for empty domain' do
109
+ expect(engine.domain_saturation(domain: :security)).to eq(0.0)
110
+ end
111
+
112
+ it 'returns positive for populated domain' do
113
+ engine.create_trace(content: 'a', domain: :security, activation: 0.3)
114
+ expect(engine.domain_saturation(domain: :security)).to be > 0.0
115
+ end
116
+ end
117
+
118
+ describe '#overall_subliminal_load' do
119
+ it 'returns 0.0 with no traces' do
120
+ expect(engine.overall_subliminal_load).to eq(0.0)
121
+ end
122
+
123
+ it 'returns positive with active traces' do
124
+ engine.create_trace(content: 'a', activation: 0.3)
125
+ expect(engine.overall_subliminal_load).to be > 0.0
126
+ end
127
+ end
128
+
129
+ describe '#strongest_traces' do
130
+ it 'returns sorted by activation descending' do
131
+ engine.create_trace(content: 'weak', activation: 0.1)
132
+ strong = engine.create_trace(content: 'strong', activation: 0.35)
133
+ expect(engine.strongest_traces(limit: 1).first.id).to eq(strong.id)
134
+ end
135
+ end
136
+
137
+ describe '#breached_traces' do
138
+ it 'returns empty when all below threshold' do
139
+ engine.create_trace(content: 'below', activation: 0.3)
140
+ expect(engine.breached_traces).to be_empty
141
+ end
142
+ end
143
+
144
+ describe '#subliminal_report' do
145
+ it 'includes all report fields' do
146
+ report = engine.subliminal_report
147
+ expect(report).to include(
148
+ :total_traces, :active_count, :near_threshold, :potent_count,
149
+ :total_influences, :subliminal_load, :saturation_label,
150
+ :breached_count, :strongest
151
+ )
152
+ end
153
+ end
154
+
155
+ describe '#to_h' do
156
+ it 'includes summary fields' do
157
+ hash = engine.to_h
158
+ expect(hash).to include(:total_traces, :active, :subliminal_load, :total_influences)
159
+ end
160
+ end
161
+ end