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,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Lighthouse::Helpers::Constants do
4
+ describe 'BEACON_TYPES' do
5
+ it 'contains expected types' do
6
+ expect(described_class::BEACON_TYPES).to include(:truth, :clarity, :warning, :guidance, :hope)
7
+ end
8
+
9
+ it 'is frozen' do
10
+ expect(described_class::BEACON_TYPES).to be_frozen
11
+ end
12
+ end
13
+
14
+ describe 'FOG_TYPES' do
15
+ it 'contains expected types' do
16
+ expect(described_class::FOG_TYPES).to include(:confusion, :uncertainty, :ambiguity, :doubt, :overwhelm)
17
+ end
18
+
19
+ it 'is frozen' do
20
+ expect(described_class::FOG_TYPES).to be_frozen
21
+ end
22
+ end
23
+
24
+ describe 'capacity constants' do
25
+ it 'MAX_BEACONS is positive' do
26
+ expect(described_class::MAX_BEACONS).to be > 0
27
+ end
28
+
29
+ it 'MAX_FOG_BANKS is positive' do
30
+ expect(described_class::MAX_FOG_BANKS).to be > 0
31
+ end
32
+ end
33
+
34
+ describe 'rate constants' do
35
+ it 'LUMINOSITY_RATE is between 0 and 1' do
36
+ expect(described_class::LUMINOSITY_RATE).to be > 0
37
+ expect(described_class::LUMINOSITY_RATE).to be < 1
38
+ end
39
+
40
+ it 'FOG_DENSITY_RATE is between 0 and 1' do
41
+ expect(described_class::FOG_DENSITY_RATE).to be > 0
42
+ expect(described_class::FOG_DENSITY_RATE).to be < 1
43
+ end
44
+ end
45
+
46
+ describe 'VISIBILITY_LABELS' do
47
+ it 'covers full [0, 1] range' do
48
+ expect(described_class::VISIBILITY_LABELS).not_to be_empty
49
+ end
50
+
51
+ it 'includes :crystal_clear and :blind' do
52
+ labels = described_class::VISIBILITY_LABELS.map(&:last)
53
+ expect(labels).to include(:crystal_clear, :blind)
54
+ end
55
+ end
56
+
57
+ describe 'LUMINOSITY_LABELS' do
58
+ it 'includes :blazing and :dark' do
59
+ labels = described_class::LUMINOSITY_LABELS.map(&:last)
60
+ expect(labels).to include(:blazing, :dark)
61
+ end
62
+ end
63
+
64
+ describe '.label_for' do
65
+ it 'returns crystal_clear for density 0.0' do
66
+ expect(described_class.label_for(described_class::VISIBILITY_LABELS, 0.0)).to eq(:crystal_clear)
67
+ end
68
+
69
+ it 'returns blind for density 1.0' do
70
+ expect(described_class.label_for(described_class::VISIBILITY_LABELS, 1.0)).to eq(:blind)
71
+ end
72
+
73
+ it 'returns blazing for luminosity 1.0' do
74
+ expect(described_class.label_for(described_class::LUMINOSITY_LABELS, 1.0)).to eq(:blazing)
75
+ end
76
+
77
+ it 'returns dark for luminosity 0.0' do
78
+ expect(described_class.label_for(described_class::LUMINOSITY_LABELS, 0.0)).to eq(:dark)
79
+ end
80
+
81
+ it 'returns steady for mid-range luminosity' do
82
+ expect(described_class.label_for(described_class::LUMINOSITY_LABELS, 0.6)).to eq(:steady)
83
+ end
84
+
85
+ it 'returns foggy for mid-range density' do
86
+ expect(described_class.label_for(described_class::VISIBILITY_LABELS, 0.6)).to eq(:foggy)
87
+ end
88
+
89
+ it 'falls back to last label for out-of-range values' do
90
+ result = described_class.label_for(described_class::LUMINOSITY_LABELS, 2.0)
91
+ expect(result).to be_a(Symbol)
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,166 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Lighthouse::Helpers::Fog do
4
+ subject(:fog) { described_class.new(fog_type: :confusion, domain: 'decision', density: 0.5) }
5
+
6
+ describe '#initialize' do
7
+ it 'sets fog_type as symbol' do
8
+ expect(fog.fog_type).to eq(:confusion)
9
+ end
10
+
11
+ it 'sets domain as string' do
12
+ expect(fog.domain).to eq('decision')
13
+ end
14
+
15
+ it 'sets density' do
16
+ expect(fog.density).to be_within(0.001).of(0.5)
17
+ end
18
+
19
+ it 'defaults density to 0.5' do
20
+ f = described_class.new(fog_type: :doubt, domain: 'x')
21
+ expect(f.density).to be_within(0.001).of(0.5)
22
+ end
23
+
24
+ it 'defaults extent to 1.0' do
25
+ f = described_class.new(fog_type: :doubt, domain: 'x')
26
+ expect(f.extent).to be_within(0.001).of(1.0)
27
+ end
28
+
29
+ it 'assigns a UUID id' do
30
+ expect(fog.id).to match(/\A[0-9a-f-]{36}\z/)
31
+ end
32
+
33
+ it 'sets formed_at timestamp' do
34
+ expect(fog.formed_at).to be_a(Time)
35
+ end
36
+
37
+ it 'clamps density to [0, 1]' do
38
+ f = described_class.new(fog_type: :doubt, domain: 'x', density: 1.5)
39
+ expect(f.density).to eq(1.0)
40
+ end
41
+
42
+ it 'raises for unknown fog_type' do
43
+ expect do
44
+ described_class.new(fog_type: :sunshine, domain: 'x')
45
+ end.to raise_error(ArgumentError, /unknown fog_type/)
46
+ end
47
+
48
+ it 'accepts all valid fog types' do
49
+ Legion::Extensions::Agentic::Attention::Lighthouse::Helpers::Constants::FOG_TYPES.each do |type|
50
+ expect do
51
+ described_class.new(fog_type: type, domain: 'test')
52
+ end.not_to raise_error
53
+ end
54
+ end
55
+ end
56
+
57
+ describe '#thicken!' do
58
+ it 'increases density by default rate' do
59
+ fog.density = 0.5
60
+ fog.thicken!
61
+ expect(fog.density).to be_within(0.001).of(0.55)
62
+ end
63
+
64
+ it 'accepts custom rate' do
65
+ fog.density = 0.5
66
+ fog.thicken!(rate: 0.2)
67
+ expect(fog.density).to be_within(0.001).of(0.7)
68
+ end
69
+
70
+ it 'clamps at 1.0' do
71
+ fog.density = 0.98
72
+ fog.thicken!(rate: 0.05)
73
+ expect(fog.density).to eq(1.0)
74
+ end
75
+
76
+ it 'returns self for chaining' do
77
+ expect(fog.thicken!).to eq(fog)
78
+ end
79
+ end
80
+
81
+ describe '#disperse!' do
82
+ it 'decreases density by default rate' do
83
+ fog.density = 0.5
84
+ fog.disperse!
85
+ expect(fog.density).to be_within(0.001).of(0.45)
86
+ end
87
+
88
+ it 'accepts custom rate' do
89
+ fog.density = 0.5
90
+ fog.disperse!(rate: 0.3)
91
+ expect(fog.density).to be_within(0.001).of(0.2)
92
+ end
93
+
94
+ it 'clamps at 0.0' do
95
+ fog.density = 0.03
96
+ fog.disperse!(rate: 0.05)
97
+ expect(fog.density).to eq(0.0)
98
+ end
99
+
100
+ it 'returns self for chaining' do
101
+ expect(fog.disperse!).to eq(fog)
102
+ end
103
+ end
104
+
105
+ describe '#impenetrable?' do
106
+ it 'returns false when density < 1.0' do
107
+ fog.density = 0.9
108
+ expect(fog.impenetrable?).to be false
109
+ end
110
+
111
+ it 'returns true when density is 1.0' do
112
+ fog.density = 1.0
113
+ expect(fog.impenetrable?).to be true
114
+ end
115
+ end
116
+
117
+ describe '#clearing?' do
118
+ it 'returns false when density >= 0.2' do
119
+ fog.density = 0.5
120
+ expect(fog.clearing?).to be false
121
+ end
122
+
123
+ it 'returns true when density < 0.2' do
124
+ fog.density = 0.1
125
+ expect(fog.clearing?).to be true
126
+ end
127
+ end
128
+
129
+ describe '#visibility_label' do
130
+ it 'returns a symbol' do
131
+ expect(fog.visibility_label).to be_a(Symbol)
132
+ end
133
+
134
+ it 'returns :blind for max density' do
135
+ fog.density = 1.0
136
+ expect(fog.visibility_label).to eq(:blind)
137
+ end
138
+
139
+ it 'returns :crystal_clear for zero density' do
140
+ fog.density = 0.0
141
+ expect(fog.visibility_label).to eq(:crystal_clear)
142
+ end
143
+
144
+ it 'returns :foggy for mid-range density' do
145
+ fog.density = 0.6
146
+ expect(fog.visibility_label).to eq(:foggy)
147
+ end
148
+ end
149
+
150
+ describe '#to_h' do
151
+ it 'includes expected keys' do
152
+ h = fog.to_h
153
+ %i[id fog_type domain density extent visibility_label impenetrable clearing formed_at].each do |k|
154
+ expect(h).to have_key(k)
155
+ end
156
+ end
157
+
158
+ it 'fog_type matches' do
159
+ expect(fog.to_h[:fog_type]).to eq(:confusion)
160
+ end
161
+
162
+ it 'clearing is boolean' do
163
+ expect(fog.to_h[:clearing]).to be(false).or be(true)
164
+ end
165
+ end
166
+ end
@@ -0,0 +1,238 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Lighthouse::Helpers::LighthouseEngine do
4
+ subject(:engine) { described_class.new }
5
+
6
+ let(:mod) { Legion::Extensions::Agentic::Attention::Lighthouse }
7
+
8
+ describe '#light_beacon' do
9
+ it 'creates and returns a beacon' do
10
+ b = engine.light_beacon(beacon_type: :truth, domain: 'logic', content: 'clarity first')
11
+ expect(b).to be_a(mod::Helpers::Beacon)
12
+ end
13
+
14
+ it 'stores the beacon internally' do
15
+ engine.light_beacon(beacon_type: :hope, domain: 'x', content: 'y')
16
+ expect(engine.all_beacons.size).to eq(1)
17
+ end
18
+
19
+ it 'accepts luminosity override' do
20
+ b = engine.light_beacon(beacon_type: :truth, domain: 'x', content: 'y', luminosity: 0.9)
21
+ expect(b.luminosity).to be_within(0.001).of(0.9)
22
+ end
23
+
24
+ it 'accepts sweep_angle override' do
25
+ b = engine.light_beacon(beacon_type: :clarity, domain: 'x', content: 'y', sweep_angle: 180.0)
26
+ expect(b.sweep_angle).to be_within(0.001).of(180.0)
27
+ end
28
+
29
+ it 'raises when too many beacons' do
30
+ stub_const('Legion::Extensions::Agentic::Attention::Lighthouse::Helpers::Constants::MAX_BEACONS', 1)
31
+ engine.light_beacon(beacon_type: :truth, domain: 'a', content: 'first')
32
+ expect do
33
+ engine.light_beacon(beacon_type: :hope, domain: 'b', content: 'second')
34
+ end.to raise_error(ArgumentError, /too many beacons/)
35
+ end
36
+
37
+ it 'raises for invalid beacon_type' do
38
+ expect do
39
+ engine.light_beacon(beacon_type: :mirage, domain: 'x', content: 'y')
40
+ end.to raise_error(ArgumentError)
41
+ end
42
+ end
43
+
44
+ describe '#create_fog' do
45
+ it 'creates and returns a fog bank' do
46
+ f = engine.create_fog(fog_type: :confusion, domain: 'planning')
47
+ expect(f).to be_a(mod::Helpers::Fog)
48
+ end
49
+
50
+ it 'stores the fog bank internally' do
51
+ engine.create_fog(fog_type: :doubt, domain: 'x')
52
+ expect(engine.all_fog_banks.size).to eq(1)
53
+ end
54
+
55
+ it 'accepts density override' do
56
+ f = engine.create_fog(fog_type: :ambiguity, domain: 'x', density: 0.8)
57
+ expect(f.density).to be_within(0.001).of(0.8)
58
+ end
59
+
60
+ it 'raises when too many fog banks' do
61
+ stub_const('Legion::Extensions::Agentic::Attention::Lighthouse::Helpers::Constants::MAX_FOG_BANKS', 1)
62
+ engine.create_fog(fog_type: :confusion, domain: 'a')
63
+ expect do
64
+ engine.create_fog(fog_type: :doubt, domain: 'b')
65
+ end.to raise_error(ArgumentError, /too many fog banks/)
66
+ end
67
+
68
+ it 'raises for invalid fog_type' do
69
+ expect do
70
+ engine.create_fog(fog_type: :sunshine, domain: 'x')
71
+ end.to raise_error(ArgumentError)
72
+ end
73
+ end
74
+
75
+ describe '#sweep' do
76
+ let(:beacon) { engine.light_beacon(beacon_type: :truth, domain: 'x', content: 'y', luminosity: 0.8) }
77
+ let(:fog) { engine.create_fog(fog_type: :confusion, domain: 'x', density: 0.8) }
78
+
79
+ it 'reduces fog density' do
80
+ old_density = fog.density
81
+ engine.sweep(beacon_id: beacon.id, fog_id: fog.id)
82
+ expect(fog.density).to be < old_density
83
+ end
84
+
85
+ it 'returns reduction amount' do
86
+ result = engine.sweep(beacon_id: beacon.id, fog_id: fog.id)
87
+ expect(result[:reduction]).to be > 0
88
+ end
89
+
90
+ it 'returns beacon and fog hashes' do
91
+ result = engine.sweep(beacon_id: beacon.id, fog_id: fog.id)
92
+ expect(result[:beacon]).to have_key(:id)
93
+ expect(result[:fog]).to have_key(:id)
94
+ end
95
+
96
+ it 'raises for unknown beacon' do
97
+ engine.create_fog(fog_type: :doubt, domain: 'x')
98
+ expect { engine.sweep(beacon_id: 'nope', fog_id: fog.id) }
99
+ .to raise_error(ArgumentError, /beacon not found/)
100
+ end
101
+
102
+ it 'raises for unknown fog' do
103
+ expect { engine.sweep(beacon_id: beacon.id, fog_id: 'nope') }
104
+ .to raise_error(ArgumentError, /fog bank not found/)
105
+ end
106
+
107
+ it 'brighter beacons cause larger reductions' do
108
+ bright = engine.light_beacon(beacon_type: :truth, domain: 'x', content: 'y', luminosity: 1.0)
109
+ dim = engine.light_beacon(beacon_type: :truth, domain: 'x', content: 'y', luminosity: 0.2)
110
+ fog1 = engine.create_fog(fog_type: :confusion, domain: 'a', density: 0.8)
111
+ fog2 = engine.create_fog(fog_type: :confusion, domain: 'b', density: 0.8)
112
+
113
+ result_bright = engine.sweep(beacon_id: bright.id, fog_id: fog1.id)
114
+ result_dim = engine.sweep(beacon_id: dim.id, fog_id: fog2.id)
115
+ expect(result_bright[:reduction]).to be > result_dim[:reduction]
116
+ end
117
+ end
118
+
119
+ describe '#dim_all!' do
120
+ it 'dims all beacons' do
121
+ b = engine.light_beacon(beacon_type: :truth, domain: 'x', content: 'y', luminosity: 0.5)
122
+ old_lum = b.luminosity
123
+ engine.dim_all!
124
+ expect(b.luminosity).to be < old_lum
125
+ end
126
+
127
+ it 'prunes extinguished beacons' do
128
+ engine.light_beacon(beacon_type: :truth, domain: 'x', content: 'y', luminosity: 0.05)
129
+ result = engine.dim_all!(rate: 0.1)
130
+ expect(result[:pruned]).to be >= 1
131
+ end
132
+
133
+ it 'returns remaining and pruned counts' do
134
+ engine.light_beacon(beacon_type: :hope, domain: 'x', content: 'y', luminosity: 0.8)
135
+ result = engine.dim_all!
136
+ expect(result).to have_key(:remaining)
137
+ expect(result).to have_key(:pruned)
138
+ end
139
+ end
140
+
141
+ describe '#thicken_all!' do
142
+ it 'thickens all fog banks' do
143
+ f = engine.create_fog(fog_type: :doubt, domain: 'x', density: 0.3)
144
+ old_density = f.density
145
+ engine.thicken_all!
146
+ expect(f.density).to be > old_density
147
+ end
148
+
149
+ it 'returns fog bank count' do
150
+ engine.create_fog(fog_type: :confusion, domain: 'x')
151
+ result = engine.thicken_all!
152
+ expect(result[:fog_banks]).to eq(1)
153
+ end
154
+ end
155
+
156
+ describe '#brightest_beacons' do
157
+ it 'returns sorted by luminosity descending' do
158
+ engine.light_beacon(beacon_type: :truth, domain: 'x', content: 'a', luminosity: 0.3)
159
+ engine.light_beacon(beacon_type: :hope, domain: 'y', content: 'b', luminosity: 0.9)
160
+ engine.light_beacon(beacon_type: :clarity, domain: 'z', content: 'c', luminosity: 0.6)
161
+ result = engine.brightest_beacons
162
+ expect(result.first.luminosity).to be >= result.last.luminosity
163
+ end
164
+
165
+ it 'respects limit' do
166
+ 3.times { |i| engine.light_beacon(beacon_type: :truth, domain: "d#{i}", content: "c#{i}") }
167
+ expect(engine.brightest_beacons(limit: 2).size).to eq(2)
168
+ end
169
+
170
+ it 'excludes extinguished beacons' do
171
+ b = engine.light_beacon(beacon_type: :truth, domain: 'x', content: 'y', luminosity: 0.0)
172
+ results = engine.brightest_beacons
173
+ expect(results).not_to include(b)
174
+ end
175
+ end
176
+
177
+ describe '#densest_fogs' do
178
+ it 'returns sorted by density descending' do
179
+ engine.create_fog(fog_type: :confusion, domain: 'a', density: 0.2)
180
+ engine.create_fog(fog_type: :doubt, domain: 'b', density: 0.9)
181
+ result = engine.densest_fogs
182
+ expect(result.first.density).to be >= result.last.density
183
+ end
184
+
185
+ it 'respects limit' do
186
+ 3.times { |i| engine.create_fog(fog_type: :ambiguity, domain: "d#{i}") }
187
+ expect(engine.densest_fogs(limit: 2).size).to eq(2)
188
+ end
189
+ end
190
+
191
+ describe '#visibility_report' do
192
+ it 'returns comprehensive report hash' do
193
+ engine.light_beacon(beacon_type: :truth, domain: 'x', content: 'y')
194
+ engine.create_fog(fog_type: :confusion, domain: 'x')
195
+ report = engine.visibility_report
196
+ %i[total_beacons total_fog_banks avg_luminosity avg_density
197
+ net_visibility blazing_beacons extinguished impenetrable_fog clearing_fog].each do |k|
198
+ expect(report).to have_key(k)
199
+ end
200
+ end
201
+
202
+ it 'returns zeros with empty engine' do
203
+ report = engine.visibility_report
204
+ expect(report[:total_beacons]).to eq(0)
205
+ expect(report[:total_fog_banks]).to eq(0)
206
+ expect(report[:avg_luminosity]).to eq(0.0)
207
+ expect(report[:avg_density]).to eq(0.0)
208
+ end
209
+
210
+ it 'net_visibility is clamped to [0, 1]' do
211
+ engine.light_beacon(beacon_type: :hope, domain: 'x', content: 'y', luminosity: 1.0)
212
+ report = engine.visibility_report
213
+ expect(report[:net_visibility]).to be >= 0.0
214
+ expect(report[:net_visibility]).to be <= 1.0
215
+ end
216
+
217
+ it 'counts blazing beacons' do
218
+ engine.light_beacon(beacon_type: :truth, domain: 'x', content: 'y', luminosity: 0.95)
219
+ expect(engine.visibility_report[:blazing_beacons]).to eq(1)
220
+ end
221
+ end
222
+
223
+ describe '#all_beacons' do
224
+ it 'returns all beacon objects' do
225
+ engine.light_beacon(beacon_type: :truth, domain: 'a', content: 'x')
226
+ engine.light_beacon(beacon_type: :hope, domain: 'b', content: 'y')
227
+ expect(engine.all_beacons.size).to eq(2)
228
+ end
229
+ end
230
+
231
+ describe '#all_fog_banks' do
232
+ it 'returns all fog bank objects' do
233
+ engine.create_fog(fog_type: :confusion, domain: 'a')
234
+ engine.create_fog(fog_type: :doubt, domain: 'b')
235
+ expect(engine.all_fog_banks.size).to eq(2)
236
+ end
237
+ end
238
+ end
@@ -0,0 +1,182 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Legion::Extensions::Agentic::Attention::Lighthouse::Runners::CognitiveLighthouse do
4
+ let(:engine) { Legion::Extensions::Agentic::Attention::Lighthouse::Helpers::LighthouseEngine.new }
5
+
6
+ describe '.light_beacon' do
7
+ it 'returns success with beacon hash' do
8
+ result = described_class.light_beacon(
9
+ beacon_type: :truth, domain: 'logic', content: 'north star', engine: engine
10
+ )
11
+ expect(result[:success]).to be true
12
+ expect(result[:beacon][:beacon_type]).to eq(:truth)
13
+ end
14
+
15
+ it 'returns failure for invalid beacon_type' do
16
+ result = described_class.light_beacon(
17
+ beacon_type: :mirage, domain: 'x', content: 'y', engine: engine
18
+ )
19
+ expect(result[:success]).to be false
20
+ expect(result[:error]).to be_a(String)
21
+ end
22
+
23
+ it 'passes luminosity to engine' do
24
+ result = described_class.light_beacon(
25
+ beacon_type: :hope, domain: 'x', content: 'y', luminosity: 0.9, engine: engine
26
+ )
27
+ expect(result[:beacon][:luminosity]).to be_within(0.001).of(0.9)
28
+ end
29
+
30
+ it 'passes sweep_angle to engine' do
31
+ result = described_class.light_beacon(
32
+ beacon_type: :clarity, domain: 'x', content: 'y', sweep_angle: 90.0, engine: engine
33
+ )
34
+ expect(result[:beacon][:sweep_angle]).to be_within(0.001).of(90.0)
35
+ end
36
+
37
+ it 'ignores extra kwargs via ** splat' do
38
+ expect do
39
+ described_class.light_beacon(
40
+ beacon_type: :truth, domain: 'x', content: 'y',
41
+ engine: engine, extra_key: 'ignored'
42
+ )
43
+ end.not_to raise_error
44
+ end
45
+ end
46
+
47
+ describe '.create_fog' do
48
+ it 'returns success with fog hash' do
49
+ result = described_class.create_fog(
50
+ fog_type: :confusion, domain: 'decision', engine: engine
51
+ )
52
+ expect(result[:success]).to be true
53
+ expect(result[:fog][:fog_type]).to eq(:confusion)
54
+ end
55
+
56
+ it 'returns failure for invalid fog_type' do
57
+ result = described_class.create_fog(
58
+ fog_type: :sunshine, domain: 'x', engine: engine
59
+ )
60
+ expect(result[:success]).to be false
61
+ end
62
+
63
+ it 'passes density to engine' do
64
+ result = described_class.create_fog(
65
+ fog_type: :doubt, domain: 'x', density: 0.3, engine: engine
66
+ )
67
+ expect(result[:fog][:density]).to be_within(0.001).of(0.3)
68
+ end
69
+
70
+ it 'passes extent to engine' do
71
+ result = described_class.create_fog(
72
+ fog_type: :ambiguity, domain: 'x', extent: 0.7, engine: engine
73
+ )
74
+ expect(result[:fog][:extent]).to be_within(0.001).of(0.7)
75
+ end
76
+
77
+ it 'ignores extra kwargs via ** splat' do
78
+ expect do
79
+ described_class.create_fog(
80
+ fog_type: :confusion, domain: 'x', engine: engine, unexpected: true
81
+ )
82
+ end.not_to raise_error
83
+ end
84
+ end
85
+
86
+ describe '.sweep' do
87
+ let(:beacon) do
88
+ engine.light_beacon(beacon_type: :truth, domain: 'x', content: 'y', luminosity: 0.8)
89
+ end
90
+ let(:fog) { engine.create_fog(fog_type: :confusion, domain: 'x', density: 0.8) }
91
+
92
+ it 'returns success with beacon, fog, and reduction' do
93
+ result = described_class.sweep(beacon_id: beacon.id, fog_id: fog.id, engine: engine)
94
+ expect(result[:success]).to be true
95
+ expect(result[:beacon]).to have_key(:id)
96
+ expect(result[:fog]).to have_key(:id)
97
+ expect(result[:reduction]).to be > 0
98
+ end
99
+
100
+ it 'returns failure for unknown beacon' do
101
+ result = described_class.sweep(beacon_id: 'nope', fog_id: fog.id, engine: engine)
102
+ expect(result[:success]).to be false
103
+ end
104
+
105
+ it 'returns failure for unknown fog' do
106
+ result = described_class.sweep(beacon_id: beacon.id, fog_id: 'nope', engine: engine)
107
+ expect(result[:success]).to be false
108
+ end
109
+
110
+ it 'ignores extra kwargs' do
111
+ expect do
112
+ described_class.sweep(beacon_id: beacon.id, fog_id: fog.id,
113
+ engine: engine, extra: true)
114
+ end.not_to raise_error
115
+ end
116
+ end
117
+
118
+ describe '.list_beacons' do
119
+ before do
120
+ engine.light_beacon(beacon_type: :truth, domain: 'alpha', content: 'a')
121
+ engine.light_beacon(beacon_type: :hope, domain: 'beta', content: 'b')
122
+ engine.light_beacon(beacon_type: :truth, domain: 'gamma', content: 'c')
123
+ end
124
+
125
+ it 'returns all beacons when no filters' do
126
+ result = described_class.list_beacons(engine: engine)
127
+ expect(result[:count]).to eq(3)
128
+ end
129
+
130
+ it 'filters by domain' do
131
+ result = described_class.list_beacons(engine: engine, domain: 'alpha')
132
+ expect(result[:count]).to eq(1)
133
+ expect(result[:beacons].first[:domain]).to eq('alpha')
134
+ end
135
+
136
+ it 'filters by beacon_type' do
137
+ result = described_class.list_beacons(engine: engine, beacon_type: :truth)
138
+ expect(result[:count]).to eq(2)
139
+ end
140
+
141
+ it 'returns success' do
142
+ result = described_class.list_beacons(engine: engine)
143
+ expect(result[:success]).to be true
144
+ end
145
+
146
+ it 'returns beacons as array of hashes' do
147
+ result = described_class.list_beacons(engine: engine)
148
+ expect(result[:beacons]).to be_an(Array)
149
+ expect(result[:beacons].first).to have_key(:id)
150
+ end
151
+ end
152
+
153
+ describe '.navigation_status' do
154
+ it 'returns success with report' do
155
+ result = described_class.navigation_status(engine: engine)
156
+ expect(result[:success]).to be true
157
+ expect(result[:report]).to have_key(:net_visibility)
158
+ end
159
+
160
+ it 'includes all report keys' do
161
+ engine.light_beacon(beacon_type: :truth, domain: 'x', content: 'y')
162
+ engine.create_fog(fog_type: :confusion, domain: 'x')
163
+ result = described_class.navigation_status(engine: engine)
164
+ %i[total_beacons total_fog_banks avg_luminosity avg_density net_visibility].each do |k|
165
+ expect(result[:report]).to have_key(k)
166
+ end
167
+ end
168
+
169
+ it 'ignores extra kwargs' do
170
+ expect do
171
+ described_class.navigation_status(engine: engine, extra_param: 'x')
172
+ end.not_to raise_error
173
+ end
174
+ end
175
+
176
+ describe 'default engine (module-level state)' do
177
+ it 'uses a default engine when none provided' do
178
+ result = described_class.navigation_status
179
+ expect(result[:success]).to be true
180
+ end
181
+ end
182
+ end